From 0dd5bf9585ba0e575bdac7b01a2c77b0b67eafa7 Mon Sep 17 00:00:00 2001 From: Petteri <26197131+PetteriM1@users.noreply.github.com> Date: Wed, 22 Jun 2022 13:45:57 +0300 Subject: [PATCH] Download the latest version from releases --- .circleci/config.yml | 27 - .gitattributes | 2 - .gitignore | 41 - Jenkinsfile | 40 - README.md | 5 +- pom.xml | 343 - src/main/java/cn/nukkit/Achievement.java | 74 - .../java/cn/nukkit/AdventureSettings.java | 127 - src/main/java/cn/nukkit/IPlayer.java | 126 - .../java/cn/nukkit/InterruptibleThread.java | 15 - src/main/java/cn/nukkit/Nukkit.java | 158 - src/main/java/cn/nukkit/OfflinePlayer.java | 191 - src/main/java/cn/nukkit/Player.java | 5951 ----------------- src/main/java/cn/nukkit/PlayerFood.java | 191 - src/main/java/cn/nukkit/Server.java | 3084 --------- src/main/java/cn/nukkit/api/API.java | 130 - src/main/java/cn/nukkit/block/Block.java | 1000 --- src/main/java/cn/nukkit/block/BlockAir.java | 77 - src/main/java/cn/nukkit/block/BlockAnvil.java | 152 - .../java/cn/nukkit/block/BlockBanner.java | 154 - .../java/cn/nukkit/block/BlockBeacon.java | 97 - src/main/java/cn/nukkit/block/BlockBed.java | 263 - .../java/cn/nukkit/block/BlockBedrock.java | 45 - .../nukkit/block/BlockBedrockInvisible.java | 51 - .../java/cn/nukkit/block/BlockBeetroot.java | 47 - src/main/java/cn/nukkit/block/BlockBone.java | 75 - .../java/cn/nukkit/block/BlockBookshelf.java | 64 - .../cn/nukkit/block/BlockBrewingStand.java | 163 - .../java/cn/nukkit/block/BlockBricks.java | 57 - .../cn/nukkit/block/BlockBricksEndStone.java | 49 - .../cn/nukkit/block/BlockBricksNether.java | 53 - .../cn/nukkit/block/BlockBricksRedNether.java | 33 - .../cn/nukkit/block/BlockBricksStone.java | 72 - .../java/cn/nukkit/block/BlockButton.java | 132 - .../cn/nukkit/block/BlockButtonStone.java | 32 - .../cn/nukkit/block/BlockButtonWooden.java | 32 - .../java/cn/nukkit/block/BlockCactus.java | 144 - src/main/java/cn/nukkit/block/BlockCake.java | 122 - .../java/cn/nukkit/block/BlockCarpet.java | 103 - .../java/cn/nukkit/block/BlockCarrot.java | 46 - .../java/cn/nukkit/block/BlockCauldron.java | 392 -- .../cn/nukkit/block/BlockChemicalHeat.java | 40 - .../cn/nukkit/block/BlockChemistryTable.java | 65 - src/main/java/cn/nukkit/block/BlockChest.java | 225 - .../cn/nukkit/block/BlockChorusFlower.java | 21 - .../cn/nukkit/block/BlockChorusPlant.java | 86 - src/main/java/cn/nukkit/block/BlockClay.java | 58 - src/main/java/cn/nukkit/block/BlockCoal.java | 68 - .../cn/nukkit/block/BlockCobblestone.java | 52 - .../java/cn/nukkit/block/BlockCobweb.java | 77 - src/main/java/cn/nukkit/block/BlockCocoa.java | 212 - .../cn/nukkit/block/BlockColoredTorchBP.java | 25 - .../cn/nukkit/block/BlockColoredTorchRG.java | 25 - .../cn/nukkit/block/BlockCommandBlock.java | 41 - .../nukkit/block/BlockCommandBlockChain.java | 41 - .../block/BlockCommandBlockRepeating.java | 41 - .../java/cn/nukkit/block/BlockConcrete.java | 59 - .../cn/nukkit/block/BlockConcretePowder.java | 89 - .../cn/nukkit/block/BlockCraftingTable.java | 73 - src/main/java/cn/nukkit/block/BlockCrops.java | 102 - .../java/cn/nukkit/block/BlockDandelion.java | 31 - .../nukkit/block/BlockDaylightDetector.java | 78 - .../block/BlockDaylightDetectorInverted.java | 44 - .../java/cn/nukkit/block/BlockDeadBush.java | 79 - .../java/cn/nukkit/block/BlockDiamond.java | 57 - src/main/java/cn/nukkit/block/BlockDirt.java | 91 - .../java/cn/nukkit/block/BlockDispenser.java | 213 - src/main/java/cn/nukkit/block/BlockDoor.java | 353 - .../java/cn/nukkit/block/BlockDoorAcacia.java | 36 - .../java/cn/nukkit/block/BlockDoorBirch.java | 36 - .../cn/nukkit/block/BlockDoorDarkOak.java | 36 - .../java/cn/nukkit/block/BlockDoorIron.java | 78 - .../java/cn/nukkit/block/BlockDoorJungle.java | 36 - .../java/cn/nukkit/block/BlockDoorSpruce.java | 36 - .../java/cn/nukkit/block/BlockDoorWood.java | 56 - .../cn/nukkit/block/BlockDoublePlant.java | 174 - .../java/cn/nukkit/block/BlockDoubleSlab.java | 92 - .../block/BlockDoubleSlabRedSandstone.java | 89 - .../cn/nukkit/block/BlockDoubleSlabStone.java | 106 - .../cn/nukkit/block/BlockDoubleSlabWood.java | 86 - .../java/cn/nukkit/block/BlockDragonEgg.java | 79 - .../java/cn/nukkit/block/BlockDropper.java | 224 - .../java/cn/nukkit/block/BlockEmerald.java | 58 - .../cn/nukkit/block/BlockEnchantingTable.java | 134 - .../java/cn/nukkit/block/BlockEndGateway.java | 61 - .../java/cn/nukkit/block/BlockEndPortal.java | 89 - .../cn/nukkit/block/BlockEndPortalFrame.java | 150 - .../java/cn/nukkit/block/BlockEndRod.java | 86 - .../java/cn/nukkit/block/BlockEndStone.java | 58 - .../java/cn/nukkit/block/BlockEnderChest.java | 198 - .../java/cn/nukkit/block/BlockFallable.java | 54 - .../cn/nukkit/block/BlockFallableMeta.java | 55 - .../java/cn/nukkit/block/BlockFarmland.java | 137 - src/main/java/cn/nukkit/block/BlockFence.java | 121 - .../java/cn/nukkit/block/BlockFenceGate.java | 195 - .../cn/nukkit/block/BlockFenceGateAcacia.java | 39 - .../cn/nukkit/block/BlockFenceGateBirch.java | 39 - .../nukkit/block/BlockFenceGateDarkOak.java | 39 - .../cn/nukkit/block/BlockFenceGateJungle.java | 39 - .../cn/nukkit/block/BlockFenceGateSpruce.java | 39 - .../nukkit/block/BlockFenceNetherBrick.java | 76 - src/main/java/cn/nukkit/block/BlockFire.java | 304 - .../java/cn/nukkit/block/BlockFlowable.java | 44 - .../java/cn/nukkit/block/BlockFlower.java | 134 - .../java/cn/nukkit/block/BlockFlowerPot.java | 185 - .../java/cn/nukkit/block/BlockFurnace.java | 39 - .../cn/nukkit/block/BlockFurnaceBurning.java | 165 - src/main/java/cn/nukkit/block/BlockGlass.java | 46 - .../java/cn/nukkit/block/BlockGlassPane.java | 46 - .../nukkit/block/BlockGlassPaneStained.java | 54 - .../cn/nukkit/block/BlockGlassStained.java | 54 - .../java/cn/nukkit/block/BlockGlowStick.java | 32 - .../java/cn/nukkit/block/BlockGlowstone.java | 68 - src/main/java/cn/nukkit/block/BlockGold.java | 58 - src/main/java/cn/nukkit/block/BlockGrass.java | 142 - .../java/cn/nukkit/block/BlockGrassPath.java | 68 - .../java/cn/nukkit/block/BlockGravel.java | 63 - .../java/cn/nukkit/block/BlockHardGlass.java | 39 - .../cn/nukkit/block/BlockHardGlassPane.java | 45 - .../block/BlockHardGlassPaneStained.java | 54 - .../nukkit/block/BlockHardGlassStained.java | 46 - .../java/cn/nukkit/block/BlockHayBale.java | 85 - .../java/cn/nukkit/block/BlockHopper.java | 167 - .../nukkit/block/BlockHugeMushroomBrown.java | 60 - .../cn/nukkit/block/BlockHugeMushroomRed.java | 60 - src/main/java/cn/nukkit/block/BlockID.java | 326 - src/main/java/cn/nukkit/block/BlockIce.java | 86 - .../java/cn/nukkit/block/BlockIceFrosted.java | 126 - .../java/cn/nukkit/block/BlockIcePacked.java | 51 - .../java/cn/nukkit/block/BlockInfoUpdate.java | 17 - .../cn/nukkit/block/BlockInfoUpdate2.java | 17 - src/main/java/cn/nukkit/block/BlockIron.java | 58 - .../java/cn/nukkit/block/BlockIronBars.java | 64 - .../java/cn/nukkit/block/BlockItemFrame.java | 180 - .../java/cn/nukkit/block/BlockJukebox.java | 113 - .../java/cn/nukkit/block/BlockLadder.java | 165 - src/main/java/cn/nukkit/block/BlockLapis.java | 58 - src/main/java/cn/nukkit/block/BlockLava.java | 249 - .../java/cn/nukkit/block/BlockLavaStill.java | 41 - .../java/cn/nukkit/block/BlockLeaves.java | 237 - .../java/cn/nukkit/block/BlockLeaves2.java | 45 - src/main/java/cn/nukkit/block/BlockLever.java | 235 - .../java/cn/nukkit/block/BlockLiquid.java | 441 -- src/main/java/cn/nukkit/block/BlockMagma.java | 89 - src/main/java/cn/nukkit/block/BlockMelon.java | 72 - src/main/java/cn/nukkit/block/BlockMeta.java | 25 - .../java/cn/nukkit/block/BlockMobSpawner.java | 65 - .../java/cn/nukkit/block/BlockMonsterEgg.java | 76 - .../java/cn/nukkit/block/BlockMossStone.java | 52 - .../java/cn/nukkit/block/BlockMushroom.java | 97 - .../cn/nukkit/block/BlockMushroomBrown.java | 35 - .../cn/nukkit/block/BlockMushroomRed.java | 30 - .../java/cn/nukkit/block/BlockMycelium.java | 102 - .../cn/nukkit/block/BlockNetherBrick.java | 58 - .../cn/nukkit/block/BlockNetherPortal.java | 372 -- .../cn/nukkit/block/BlockNetherReactor.java | 46 - .../java/cn/nukkit/block/BlockNetherWart.java | 97 - .../cn/nukkit/block/BlockNetherWartBlock.java | 45 - .../java/cn/nukkit/block/BlockNetherrack.java | 58 - .../java/cn/nukkit/block/BlockNoteblock.java | 296 - .../java/cn/nukkit/block/BlockObserver.java | 78 - .../java/cn/nukkit/block/BlockObsidian.java | 79 - .../cn/nukkit/block/BlockObsidianGlowing.java | 36 - .../java/cn/nukkit/block/BlockOreCoal.java | 81 - .../java/cn/nukkit/block/BlockOreDiamond.java | 81 - .../java/cn/nukkit/block/BlockOreEmerald.java | 81 - .../java/cn/nukkit/block/BlockOreGold.java | 52 - .../java/cn/nukkit/block/BlockOreIron.java | 52 - .../java/cn/nukkit/block/BlockOreLapis.java | 81 - .../java/cn/nukkit/block/BlockOreQuartz.java | 81 - .../cn/nukkit/block/BlockOreRedstone.java | 89 - .../nukkit/block/BlockOreRedstoneGlowing.java | 48 - .../java/cn/nukkit/block/BlockPiston.java | 25 - .../java/cn/nukkit/block/BlockPistonBase.java | 417 -- .../cn/nukkit/block/BlockPistonExtension.java | 36 - .../java/cn/nukkit/block/BlockPistonHead.java | 69 - .../cn/nukkit/block/BlockPistonSticky.java | 26 - .../java/cn/nukkit/block/BlockPlanks.java | 89 - .../java/cn/nukkit/block/BlockPodzol.java | 60 - .../java/cn/nukkit/block/BlockPotato.java | 47 - .../nukkit/block/BlockPressurePlateBase.java | 180 - .../nukkit/block/BlockPressurePlateStone.java | 78 - .../nukkit/block/BlockPressurePlateWood.java | 73 - .../java/cn/nukkit/block/BlockPrismarine.java | 81 - .../java/cn/nukkit/block/BlockPumpkin.java | 76 - .../java/cn/nukkit/block/BlockPumpkinLit.java | 31 - .../java/cn/nukkit/block/BlockPurpur.java | 94 - .../java/cn/nukkit/block/BlockQuartz.java | 105 - src/main/java/cn/nukkit/block/BlockRail.java | 278 - .../cn/nukkit/block/BlockRailActivator.java | 183 - .../cn/nukkit/block/BlockRailDetector.java | 122 - .../cn/nukkit/block/BlockRailPowered.java | 192 - .../cn/nukkit/block/BlockRedSandstone.java | 57 - .../java/cn/nukkit/block/BlockRedstone.java | 74 - .../nukkit/block/BlockRedstoneComparator.java | 204 - .../block/BlockRedstoneComparatorPowered.java | 31 - .../BlockRedstoneComparatorUnpowered.java | 30 - .../cn/nukkit/block/BlockRedstoneDiode.java | 213 - .../cn/nukkit/block/BlockRedstoneLamp.java | 81 - .../cn/nukkit/block/BlockRedstoneLampLit.java | 50 - .../block/BlockRedstoneRepeaterPowered.java | 80 - .../block/BlockRedstoneRepeaterUnpowered.java | 75 - .../cn/nukkit/block/BlockRedstoneTorch.java | 141 - .../nukkit/block/BlockRedstoneTorchUnlit.java | 88 - .../cn/nukkit/block/BlockRedstoneWire.java | 325 - .../java/cn/nukkit/block/BlockReserved6.java | 17 - src/main/java/cn/nukkit/block/BlockSand.java | 60 - .../java/cn/nukkit/block/BlockSandstone.java | 83 - .../java/cn/nukkit/block/BlockSapling.java | 232 - .../java/cn/nukkit/block/BlockSeaLantern.java | 55 - .../java/cn/nukkit/block/BlockShulkerBox.java | 155 - .../java/cn/nukkit/block/BlockSignPost.java | 129 - src/main/java/cn/nukkit/block/BlockSkull.java | 125 - src/main/java/cn/nukkit/block/BlockSlab.java | 110 - .../nukkit/block/BlockSlabRedSandstone.java | 69 - .../java/cn/nukkit/block/BlockSlabStone.java | 96 - .../java/cn/nukkit/block/BlockSlabWood.java | 87 - src/main/java/cn/nukkit/block/BlockSlime.java | 34 - src/main/java/cn/nukkit/block/BlockSnow.java | 77 - .../java/cn/nukkit/block/BlockSnowLayer.java | 185 - src/main/java/cn/nukkit/block/BlockSolid.java | 18 - .../java/cn/nukkit/block/BlockSolidMeta.java | 15 - .../java/cn/nukkit/block/BlockSoulSand.java | 65 - .../java/cn/nukkit/block/BlockSponge.java | 132 - .../java/cn/nukkit/block/BlockStairs.java | 145 - .../cn/nukkit/block/BlockStairsAcacia.java | 33 - .../cn/nukkit/block/BlockStairsBirch.java | 33 - .../cn/nukkit/block/BlockStairsBrick.java | 54 - .../nukkit/block/BlockStairsCobblestone.java | 48 - .../cn/nukkit/block/BlockStairsDarkOak.java | 33 - .../cn/nukkit/block/BlockStairsJungle.java | 33 - .../nukkit/block/BlockStairsNetherBrick.java | 54 - .../cn/nukkit/block/BlockStairsPurpur.java | 45 - .../cn/nukkit/block/BlockStairsQuartz.java | 54 - .../nukkit/block/BlockStairsRedSandstone.java | 71 - .../cn/nukkit/block/BlockStairsSandstone.java | 54 - .../cn/nukkit/block/BlockStairsSpruce.java | 33 - .../nukkit/block/BlockStairsStoneBrick.java | 43 - .../java/cn/nukkit/block/BlockStairsWood.java | 73 - .../java/cn/nukkit/block/BlockStemMelon.java | 88 - .../cn/nukkit/block/BlockStemPumpkin.java | 88 - src/main/java/cn/nukkit/block/BlockStone.java | 87 - .../cn/nukkit/block/BlockStonecutter.java | 48 - .../cn/nukkit/block/BlockStructureBlock.java | 44 - .../java/cn/nukkit/block/BlockSugarcane.java | 153 - src/main/java/cn/nukkit/block/BlockTNT.java | 139 - .../java/cn/nukkit/block/BlockTallGrass.java | 158 - .../java/cn/nukkit/block/BlockTerracotta.java | 75 - .../nukkit/block/BlockTerracottaGlazed.java | 53 - .../block/BlockTerracottaGlazedBlack.java | 31 - .../block/BlockTerracottaGlazedBlue.java | 31 - .../block/BlockTerracottaGlazedBrown.java | 31 - .../block/BlockTerracottaGlazedCyan.java | 31 - .../block/BlockTerracottaGlazedGray.java | 31 - .../block/BlockTerracottaGlazedGreen.java | 31 - .../block/BlockTerracottaGlazedLightBlue.java | 31 - .../block/BlockTerracottaGlazedLime.java | 31 - .../block/BlockTerracottaGlazedMagenta.java | 31 - .../block/BlockTerracottaGlazedOrange.java | 31 - .../block/BlockTerracottaGlazedPink.java | 31 - .../block/BlockTerracottaGlazedPurple.java | 31 - .../block/BlockTerracottaGlazedRed.java | 31 - .../block/BlockTerracottaGlazedSilver.java | 31 - .../block/BlockTerracottaGlazedWhite.java | 31 - .../block/BlockTerracottaGlazedYellow.java | 31 - .../nukkit/block/BlockTerracottaStained.java | 68 - src/main/java/cn/nukkit/block/BlockThin.java | 64 - src/main/java/cn/nukkit/block/BlockTorch.java | 124 - .../cn/nukkit/block/BlockTransparent.java | 20 - .../cn/nukkit/block/BlockTransparentMeta.java | 28 - .../java/cn/nukkit/block/BlockTrapdoor.java | 219 - .../cn/nukkit/block/BlockTrapdoorIron.java | 60 - .../cn/nukkit/block/BlockTrappedChest.java | 109 - .../java/cn/nukkit/block/BlockTripWire.java | 174 - .../cn/nukkit/block/BlockTripWireHook.java | 237 - .../cn/nukkit/block/BlockUnderwaterTorch.java | 35 - .../nukkit/block/BlockUndyedShulkerBox.java | 54 - .../java/cn/nukkit/block/BlockUnknown.java | 29 - src/main/java/cn/nukkit/block/BlockVine.java | 321 - src/main/java/cn/nukkit/block/BlockWall.java | 97 - .../java/cn/nukkit/block/BlockWallBanner.java | 41 - .../java/cn/nukkit/block/BlockWallSign.java | 49 - src/main/java/cn/nukkit/block/BlockWater.java | 95 - .../java/cn/nukkit/block/BlockWaterLily.java | 78 - .../java/cn/nukkit/block/BlockWaterStill.java | 31 - .../BlockWeightedPressurePlateHeavy.java | 85 - .../BlockWeightedPressurePlateLight.java | 85 - src/main/java/cn/nukkit/block/BlockWheat.java | 50 - src/main/java/cn/nukkit/block/BlockWood.java | 107 - src/main/java/cn/nukkit/block/BlockWood2.java | 49 - src/main/java/cn/nukkit/block/BlockWool.java | 68 - .../cn/nukkit/blockentity/BlockEntity.java | 212 - .../nukkit/blockentity/BlockEntityBanner.java | 96 - .../nukkit/blockentity/BlockEntityBeacon.java | 250 - .../cn/nukkit/blockentity/BlockEntityBed.java | 54 - .../blockentity/BlockEntityBrewingStand.java | 391 -- .../blockentity/BlockEntityCauldron.java | 147 - .../nukkit/blockentity/BlockEntityChest.java | 285 - .../blockentity/BlockEntityComparator.java | 42 - .../blockentity/BlockEntityContainer.java | 51 - .../blockentity/BlockEntityDispenser.java | 146 - .../blockentity/BlockEntityDropper.java | 141 - .../blockentity/BlockEntityEnchantTable.java | 56 - .../blockentity/BlockEntityEnderChest.java | 31 - .../blockentity/BlockEntityFlowerPot.java | 55 - .../blockentity/BlockEntityFurnace.java | 355 - .../nukkit/blockentity/BlockEntityHopper.java | 459 -- .../blockentity/BlockEntityItemFrame.java | 147 - .../blockentity/BlockEntityJukebox.java | 123 - .../blockentity/BlockEntityMovingBlock.java | 57 - .../nukkit/blockentity/BlockEntityMusic.java | 46 - .../blockentity/BlockEntityNameable.java | 39 - .../blockentity/BlockEntityPistonArm.java | 94 - .../blockentity/BlockEntityShulkerBox.java | 156 - .../nukkit/blockentity/BlockEntitySign.java | 147 - .../nukkit/blockentity/BlockEntitySkull.java | 49 - .../blockentity/BlockEntitySpawnable.java | 70 - .../blockentity/BlockEntitySpawner.java | 239 - src/main/java/cn/nukkit/command/Command.java | 312 - .../cn/nukkit/command/CommandExecutor.java | 49 - .../java/cn/nukkit/command/CommandMap.java | 24 - .../java/cn/nukkit/command/CommandSender.java | 70 - .../nukkit/command/ConsoleCommandSender.java | 111 - .../nukkit/command/FormattedCommandAlias.java | 137 - .../java/cn/nukkit/command/PluginCommand.java | 54 - .../command/PluginIdentifiableCommand.java | 12 - .../command/RemoteConsoleCommandSender.java | 36 - .../cn/nukkit/command/SimpleCommandMap.java | 296 - .../cn/nukkit/command/data/CommandArgs.java | 8 - .../cn/nukkit/command/data/CommandData.java | 23 - .../command/data/CommandDataVersions.java | 9 - .../cn/nukkit/command/data/CommandEnum.java | 55 - .../cn/nukkit/command/data/CommandInput.java | 6 - .../cn/nukkit/command/data/CommandOutput.java | 6 - .../nukkit/command/data/CommandOverload.java | 7 - .../nukkit/command/data/CommandParamType.java | 36 - .../nukkit/command/data/CommandParameter.java | 139 - .../nukkit/command/data/args/CommandArg.java | 15 - .../data/args/CommandArgBlockVector.java | 35 - .../command/data/args/CommandArgRules.java | 20 - .../nukkit/command/defaults/BanCommand.java | 61 - .../nukkit/command/defaults/BanIpCommand.java | 109 - .../command/defaults/BanListCommand.java | 68 - .../command/defaults/DebugPasteCommand.java | 104 - .../defaults/DefaultGamemodeCommand.java | 46 - .../nukkit/command/defaults/DeopCommand.java | 51 - .../command/defaults/DifficultyCommand.java | 63 - .../command/defaults/EffectCommand.java | 116 - .../command/defaults/EnchantCommand.java | 156 - .../command/defaults/GamemodeCommand.java | 89 - .../command/defaults/GameruleCommand.java | 73 - .../defaults/GarbageCollectorCommand.java | 53 - .../defaults/GenerateWorldCommand.java | 53 - .../nukkit/command/defaults/GiveCommand.java | 94 - .../nukkit/command/defaults/HelpCommand.java | 120 - .../nukkit/command/defaults/KickCommand.java | 64 - .../nukkit/command/defaults/KillCommand.java | 150 - .../nukkit/command/defaults/ListCommand.java | 41 - .../cn/nukkit/command/defaults/MeCommand.java | 57 - .../cn/nukkit/command/defaults/OpCommand.java | 56 - .../command/defaults/PardonCommand.java | 43 - .../command/defaults/PardonIpCommand.java | 60 - .../command/defaults/ParticleCommand.java | 251 - .../command/defaults/PlaySoundCommand.java | 81 - .../command/defaults/PluginsCommand.java | 46 - .../command/defaults/ReloadCommand.java | 34 - .../nukkit/command/defaults/SaveCommand.java | 40 - .../command/defaults/SaveOffCommand.java | 28 - .../command/defaults/SaveOnCommand.java | 28 - .../nukkit/command/defaults/SayCommand.java | 59 - .../nukkit/command/defaults/SeedCommand.java | 36 - .../defaults/SetWorldSpawnCommand.java | 61 - .../nukkit/command/defaults/SpawnCommand.java | 30 - .../command/defaults/SpawnpointCommand.java | 91 - .../command/defaults/StatusCommand.java | 116 - .../nukkit/command/defaults/StopCommand.java | 38 - .../command/defaults/SummonCommand.java | 66 - .../command/defaults/TeleportCommand.java | 125 - .../nukkit/command/defaults/TellCommand.java | 73 - .../nukkit/command/defaults/TimeCommand.java | 154 - .../command/defaults/TimingsCommand.java | 74 - .../nukkit/command/defaults/TitleCommand.java | 124 - .../defaults/TransferServerCommand.java | 45 - .../command/defaults/VanillaCommand.java | 26 - .../command/defaults/VersionCommand.java | 112 - .../command/defaults/WeatherCommand.java | 84 - .../command/defaults/WhitelistCommand.java | 117 - .../nukkit/command/defaults/WorldCommand.java | 71 - .../cn/nukkit/command/defaults/XpCommand.java | 104 - .../cn/nukkit/command/simple/Arguments.java | 17 - .../cn/nukkit/command/simple/Command.java | 21 - .../command/simple/CommandParameters.java | 15 - .../command/simple/CommandPermission.java | 15 - .../nukkit/command/simple/ForbidConsole.java | 14 - .../cn/nukkit/command/simple/Parameter.java | 21 - .../cn/nukkit/command/simple/Parameters.java | 16 - .../nukkit/command/simple/SimpleCommand.java | 78 - .../java/cn/nukkit/console/NukkitConsole.java | 76 - .../console/NukkitConsoleCompleter.java | 55 - .../dispenser/BoatDispenseBehavior.java | 38 - .../dispenser/BucketDispenseBehavior.java | 37 - .../dispenser/DefaultDispenseBehavior.java | 46 - .../cn/nukkit/dispenser/DispenseBehavior.java | 13 - .../dispenser/DispenseBehaviorRegister.java | 94 - .../nukkit/dispenser/DyeDispenseBehavior.java | 28 - .../dispenser/FireChargeDispenseBehavior.java | 29 - .../dispenser/FireworksDispenseBehavior.java | 23 - .../FlintAndSteelDispenseBehavior.java | 25 - .../dispenser/ProjectileDispenseBehavior.java | 63 - .../dispenser/ShulkerBoxDispenseBehavior.java | 44 - .../dispenser/SpawnEggDispenseBehavior.java | 32 - .../nukkit/dispenser/TNTDispenseBehavior.java | 22 - src/main/java/cn/nukkit/entity/Attribute.java | 182 - .../java/cn/nukkit/entity/BaseEntity.java | 541 -- src/main/java/cn/nukkit/entity/Entity.java | 2691 -------- .../java/cn/nukkit/entity/EntityAgeable.java | 12 - .../cn/nukkit/entity/EntityArthropod.java | 8 - .../java/cn/nukkit/entity/EntityBoss.java | 4 - .../cn/nukkit/entity/EntityControllable.java | 8 - .../java/cn/nukkit/entity/EntityCreature.java | 15 - .../cn/nukkit/entity/EntityDamageable.java | 8 - .../cn/nukkit/entity/EntityExplosive.java | 9 - .../java/cn/nukkit/entity/EntityFlying.java | 161 - .../java/cn/nukkit/entity/EntityHanging.java | 86 - .../java/cn/nukkit/entity/EntityHuman.java | 366 - .../cn/nukkit/entity/EntityHumanType.java | 260 - .../cn/nukkit/entity/EntityInteractable.java | 11 - .../java/cn/nukkit/entity/EntityJumping.java | 195 - .../java/cn/nukkit/entity/EntityLiving.java | 554 -- .../java/cn/nukkit/entity/EntityOwnable.java | 16 - .../java/cn/nukkit/entity/EntityRideable.java | 18 - .../java/cn/nukkit/entity/EntitySmite.java | 8 - .../java/cn/nukkit/entity/EntitySwimming.java | 148 - .../java/cn/nukkit/entity/EntityTameable.java | 26 - .../java/cn/nukkit/entity/EntityWalking.java | 228 - .../cn/nukkit/entity/data/ByteEntityData.java | 34 - .../cn/nukkit/entity/data/EntityData.java | 36 - .../cn/nukkit/entity/data/EntityMetadata.java | 131 - .../nukkit/entity/data/FloatEntityData.java | 34 - .../cn/nukkit/entity/data/IntEntityData.java | 34 - .../entity/data/IntPositionEntityData.java | 46 - .../cn/nukkit/entity/data/LongEntityData.java | 30 - .../cn/nukkit/entity/data/NBTEntityData.java | 41 - .../nukkit/entity/data/ShortEntityData.java | 34 - src/main/java/cn/nukkit/entity/data/Skin.java | 328 - .../nukkit/entity/data/StringEntityData.java | 35 - .../entity/data/Vector3fEntityData.java | 45 - .../nukkit/entity/item/EntityArmorStand.java | 378 -- .../cn/nukkit/entity/item/EntityBoat.java | 475 -- .../nukkit/entity/item/EntityEndCrystal.java | 109 - .../nukkit/entity/item/EntityExpBottle.java | 91 - .../entity/item/EntityFallingBlock.java | 252 - .../cn/nukkit/entity/item/EntityFirework.java | 132 - .../nukkit/entity/item/EntityFishingHook.java | 325 - .../cn/nukkit/entity/item/EntityItem.java | 375 -- .../entity/item/EntityMinecartAbstract.java | 824 --- .../entity/item/EntityMinecartChest.java | 107 - .../entity/item/EntityMinecartEmpty.java | 66 - .../entity/item/EntityMinecartHopper.java | 103 - .../nukkit/entity/item/EntityMinecartTNT.java | 151 - .../cn/nukkit/entity/item/EntityPainting.java | 138 - .../cn/nukkit/entity/item/EntityPotion.java | 163 - .../entity/item/EntityPotionLingering.java | 23 - .../nukkit/entity/item/EntityPrimedTNT.java | 179 - .../cn/nukkit/entity/item/EntityVehicle.java | 123 - .../cn/nukkit/entity/item/EntityXPOrb.java | 263 - .../cn/nukkit/entity/mob/EntityBlaze.java | 92 - .../nukkit/entity/mob/EntityCaveSpider.java | 103 - .../cn/nukkit/entity/mob/EntityCreeper.java | 259 - .../cn/nukkit/entity/mob/EntityDrowned.java | 218 - .../entity/mob/EntityElderGuardian.java | 83 - .../nukkit/entity/mob/EntityEnderDragon.java | 139 - .../cn/nukkit/entity/mob/EntityEnderman.java | 186 - .../cn/nukkit/entity/mob/EntityEndermite.java | 76 - .../cn/nukkit/entity/mob/EntityEvoker.java | 86 - .../cn/nukkit/entity/mob/EntityFlyingMob.java | 161 - .../cn/nukkit/entity/mob/EntityGhast.java | 120 - .../cn/nukkit/entity/mob/EntityGuardian.java | 113 - .../cn/nukkit/entity/mob/EntityHoglin.java | 91 - .../java/cn/nukkit/entity/mob/EntityHusk.java | 89 - .../nukkit/entity/mob/EntityJumpingMob.java | 161 - .../cn/nukkit/entity/mob/EntityMagmaCube.java | 157 - .../java/cn/nukkit/entity/mob/EntityMob.java | 66 - .../cn/nukkit/entity/mob/EntityPhantom.java | 114 - .../cn/nukkit/entity/mob/EntityPiglin.java | 110 - .../nukkit/entity/mob/EntityPiglinBrute.java | 71 - .../cn/nukkit/entity/mob/EntityPillager.java | 126 - .../cn/nukkit/entity/mob/EntityRavager.java | 70 - .../cn/nukkit/entity/mob/EntityShulker.java | 118 - .../nukkit/entity/mob/EntitySilverfish.java | 76 - .../cn/nukkit/entity/mob/EntitySkeleton.java | 156 - .../cn/nukkit/entity/mob/EntitySlime.java | 164 - .../cn/nukkit/entity/mob/EntitySpider.java | 171 - .../cn/nukkit/entity/mob/EntityStray.java | 147 - .../nukkit/entity/mob/EntitySwimmingMob.java | 165 - .../nukkit/entity/mob/EntityTameableMob.java | 127 - .../java/cn/nukkit/entity/mob/EntityVex.java | 83 - .../nukkit/entity/mob/EntityVindicator.java | 124 - .../nukkit/entity/mob/EntityWalkingMob.java | 169 - .../cn/nukkit/entity/mob/EntityWitch.java | 148 - .../cn/nukkit/entity/mob/EntityWither.java | 228 - .../entity/mob/EntityWitherSkeleton.java | 115 - .../java/cn/nukkit/entity/mob/EntityWolf.java | 411 -- .../cn/nukkit/entity/mob/EntityZoglin.java | 73 - .../cn/nukkit/entity/mob/EntityZombie.java | 231 - .../nukkit/entity/mob/EntityZombiePigman.java | 170 - .../entity/mob/EntityZombieVillager.java | 23 - .../entity/mob/EntityZombieVillagerV2.java | 19 - .../nukkit/entity/passive/EntityAnimal.java | 4 - .../nukkit/entity/passive/EntityAxolotl.java | 40 - .../cn/nukkit/entity/passive/EntityBat.java | 45 - .../cn/nukkit/entity/passive/EntityBee.java | 122 - .../cn/nukkit/entity/passive/EntityCat.java | 76 - .../nukkit/entity/passive/EntityChicken.java | 186 - .../cn/nukkit/entity/passive/EntityCod.java | 47 - .../cn/nukkit/entity/passive/EntityCow.java | 113 - .../nukkit/entity/passive/EntityDolphin.java | 79 - .../nukkit/entity/passive/EntityDonkey.java | 111 - .../cn/nukkit/entity/passive/EntityFish.java | 43 - .../entity/passive/EntityFlyingAnimal.java | 44 - .../cn/nukkit/entity/passive/EntityFox.java | 68 - .../entity/passive/EntityGlowSquid.java | 18 - .../cn/nukkit/entity/passive/EntityGoat.java | 52 - .../cn/nukkit/entity/passive/EntityHorse.java | 98 - .../entity/passive/EntityHorseBase.java | 207 - .../entity/passive/EntityIronGolem.java | 136 - .../entity/passive/EntityJumpingAnimal.java | 41 - .../cn/nukkit/entity/passive/EntityLlama.java | 159 - .../entity/passive/EntityMooshroom.java | 145 - .../cn/nukkit/entity/passive/EntityMule.java | 73 - .../cn/nukkit/entity/passive/EntityNPC.java | 7 - .../nukkit/entity/passive/EntityOcelot.java | 64 - .../cn/nukkit/entity/passive/EntityPanda.java | 46 - .../nukkit/entity/passive/EntityParrot.java | 87 - .../cn/nukkit/entity/passive/EntityPig.java | 287 - .../entity/passive/EntityPolarBear.java | 150 - .../entity/passive/EntityPufferfish.java | 87 - .../nukkit/entity/passive/EntityRabbit.java | 84 - .../nukkit/entity/passive/EntitySalmon.java | 47 - .../cn/nukkit/entity/passive/EntitySheep.java | 185 - .../entity/passive/EntitySkeletonHorse.java | 78 - .../entity/passive/EntitySnowGolem.java | 169 - .../cn/nukkit/entity/passive/EntitySquid.java | 65 - .../nukkit/entity/passive/EntityStrider.java | 234 - .../nukkit/entity/passive/EntityTameable.java | 28 - .../entity/passive/EntityTameableAnimal.java | 126 - .../entity/passive/EntityTropicalFish.java | 52 - .../nukkit/entity/passive/EntityTurtle.java | 41 - .../nukkit/entity/passive/EntityVillager.java | 198 - .../entity/passive/EntityVillagerV2.java | 23 - .../entity/passive/EntityWalkingAnimal.java | 82 - .../entity/passive/EntityWanderingTrader.java | 45 - .../entity/passive/EntityWaterAnimal.java | 48 - .../entity/passive/EntityZombieHorse.java | 74 - .../nukkit/entity/projectile/EntityArrow.java | 157 - .../projectile/EntityBlazeFireBall.java | 68 - .../projectile/EntityBlueWitherSkull.java | 85 - .../nukkit/entity/projectile/EntityEgg.java | 96 - .../entity/projectile/EntityEnderCharge.java | 66 - .../entity/projectile/EntityEnderPearl.java | 137 - .../projectile/EntityEvocationFangs.java | 61 - .../projectile/EntityGhastFireBall.java | 113 - .../entity/projectile/EntityLlamaSpit.java | 65 - .../entity/projectile/EntityProjectile.java | 225 - .../projectile/EntityShulkerBullet.java | 83 - .../entity/projectile/EntitySnowball.java | 73 - .../projectile/EntityThrownTrident.java | 165 - .../entity/projectile/EntityWitherSkull.java | 85 - .../entity/weather/EntityLightning.java | 142 - .../entity/weather/EntityLightningStrike.java | 11 - .../nukkit/entity/weather/EntityWeather.java | 7 - .../java/cn/nukkit/event/Cancellable.java | 13 - src/main/java/cn/nukkit/event/Event.java | 50 - .../java/cn/nukkit/event/EventHandler.java | 62 - .../java/cn/nukkit/event/EventPriority.java | 48 - .../java/cn/nukkit/event/HandlerList.java | 152 - src/main/java/cn/nukkit/event/Listener.java | 46 - .../nukkit/event/block/AnvilDamageEvent.java | 61 - .../nukkit/event/block/BlockBreakEvent.java | 102 - .../cn/nukkit/event/block/BlockBurnEvent.java | 26 - .../cn/nukkit/event/block/BlockEvent.java | 26 - .../cn/nukkit/event/block/BlockFadeEvent.java | 36 - .../cn/nukkit/event/block/BlockFallEvent.java | 25 - .../cn/nukkit/event/block/BlockFormEvent.java | 27 - .../nukkit/event/block/BlockFromToEvent.java | 41 - .../cn/nukkit/event/block/BlockGrowEvent.java | 34 - .../nukkit/event/block/BlockIgniteEvent.java | 57 - .../event/block/BlockPistonChangeEvent.java | 40 - .../nukkit/event/block/BlockPlaceEvent.java | 59 - .../event/block/BlockRedstoneEvent.java | 40 - .../nukkit/event/block/BlockSpreadEvent.java | 35 - .../nukkit/event/block/BlockUpdateEvent.java | 26 - .../nukkit/event/block/DoorToggleEvent.java | 39 - .../event/block/ItemFrameDropItemEvent.java | 50 - .../nukkit/event/block/LeavesDecayEvent.java | 26 - .../nukkit/event/block/LiquidFlowEvent.java | 46 - .../nukkit/event/block/SignChangeEvent.java | 50 - .../nukkit/event/block/WaterFrostEvent.java | 25 - .../event/entity/CreatureSpawnEvent.java | 174 - .../event/entity/CreeperPowerEvent.java | 79 - .../event/entity/EntityArmorChangeEvent.java | 45 - .../event/entity/EntityBlockChangeEvent.java | 31 - .../entity/EntityCombustByBlockEvent.java | 22 - .../entity/EntityCombustByEntityEvent.java | 21 - .../event/entity/EntityCombustEvent.java | 32 - .../entity/EntityDamageBlockedEvent.java | 45 - .../entity/EntityDamageByBlockEvent.java | 22 - .../EntityDamageByChildEntityEvent.java | 21 - .../entity/EntityDamageByEntityEvent.java | 73 - .../event/entity/EntityDamageEvent.java | 242 - .../nukkit/event/entity/EntityDeathEvent.java | 40 - .../event/entity/EntityDespawnEvent.java | 57 - .../cn/nukkit/event/entity/EntityEvent.java | 17 - .../event/entity/EntityExplodeEvent.java | 53 - .../entity/EntityExplosionPrimeEvent.java | 39 - .../event/entity/EntityInteractEvent.java | 29 - .../entity/EntityInventoryChangeEvent.java | 45 - .../event/entity/EntityLevelChangeEvent.java | 35 - .../event/entity/EntityMotionEvent.java | 33 - .../event/entity/EntityPortalEnterEvent.java | 29 - .../event/entity/EntityRegainHealthEvent.java | 43 - .../event/entity/EntityShootBowEvent.java | 66 - .../nukkit/event/entity/EntitySpawnEvent.java | 57 - .../event/entity/EntityTeleportEvent.java | 43 - .../event/entity/EntityVehicleEnterEvent.java | 26 - .../event/entity/EntityVehicleExitEvent.java | 26 - .../event/entity/ExplosionPrimeEvent.java | 45 - .../nukkit/event/entity/ItemDespawnEvent.java | 26 - .../nukkit/event/entity/ItemSpawnEvent.java | 25 - .../event/entity/ProjectileHitEvent.java | 37 - .../event/entity/ProjectileLaunchEvent.java | 22 - .../cn/nukkit/event/inventory/BrewEvent.java | 60 - .../event/inventory/CraftItemEvent.java | 59 - .../event/inventory/EnchantItemEvent.java | 33 - .../event/inventory/FurnaceBurnEvent.java | 56 - .../event/inventory/FurnaceSmeltEvent.java | 48 - .../event/inventory/InventoryClickEvent.java | 49 - .../event/inventory/InventoryCloseEvent.java | 29 - .../event/inventory/InventoryEvent.java | 26 - .../inventory/InventoryMoveItemEvent.java | 63 - .../event/inventory/InventoryOpenEvent.java | 30 - .../inventory/InventoryPickupArrowEvent.java | 30 - .../inventory/InventoryPickupItemEvent.java | 30 - .../InventoryPickupTridentEvent.java | 26 - .../inventory/InventoryTransactionEvent.java | 29 - .../event/inventory/StartBrewEvent.java | 54 - .../cn/nukkit/event/level/ChunkEvent.java | 21 - .../cn/nukkit/event/level/ChunkLoadEvent.java | 28 - .../event/level/ChunkPopulateEvent.java | 21 - .../nukkit/event/level/ChunkUnloadEvent.java | 22 - .../cn/nukkit/event/level/LevelEvent.java | 21 - .../cn/nukkit/event/level/LevelInitEvent.java | 21 - .../cn/nukkit/event/level/LevelLoadEvent.java | 21 - .../cn/nukkit/event/level/LevelSaveEvent.java | 21 - .../nukkit/event/level/LevelUnloadEvent.java | 22 - .../nukkit/event/level/SpawnChangeEvent.java | 29 - .../event/level/StructureGrowEvent.java | 44 - .../event/level/ThunderChangeEvent.java | 34 - .../event/level/WeatherChangeEvent.java | 34 - .../cn/nukkit/event/level/WeatherEvent.java | 21 - .../event/player/CraftingTableOpenEvent.java | 26 - .../player/PlayerAchievementAwardedEvent.java | 24 - .../event/player/PlayerAnimationEvent.java | 29 - .../player/PlayerAsyncPreLoginEvent.java | 116 - .../event/player/PlayerBedEnterEvent.java | 25 - .../event/player/PlayerBedLeaveEvent.java | 24 - .../event/player/PlayerBlockPickEvent.java | 40 - .../event/player/PlayerBucketEmptyEvent.java | 19 - .../event/player/PlayerBucketEvent.java | 55 - .../event/player/PlayerBucketFillEvent.java | 19 - .../event/player/PlayerChangeSkinEvent.java | 30 - .../nukkit/event/player/PlayerChatEvent.java | 69 - .../event/player/PlayerChunkRequestEvent.java | 30 - .../player/PlayerCommandPreprocessEvent.java | 22 - .../event/player/PlayerCreationEvent.java | 76 - .../nukkit/event/player/PlayerDeathEvent.java | 72 - .../event/player/PlayerDropItemEvent.java | 25 - .../event/player/PlayerEatFoodEvent.java | 32 - .../event/player/PlayerEditBookEvent.java | 43 - .../cn/nukkit/event/player/PlayerEvent.java | 17 - .../nukkit/event/player/PlayerFishEvent.java | 63 - .../player/PlayerFoodLevelChangeEvent.java | 38 - .../player/PlayerFormRespondedEvent.java | 50 - .../player/PlayerGameModeChangeEvent.java | 36 - .../player/PlayerGlassBottleFillEvent.java | 26 - .../event/player/PlayerInitializedEvent.java | 17 - .../player/PlayerInteractEntityEvent.java | 44 - .../event/player/PlayerInteractEvent.java | 80 - .../event/player/PlayerInvalidMoveEvent.java | 35 - .../event/player/PlayerItemConsumeEvent.java | 28 - .../event/player/PlayerItemHeldEvent.java | 40 - .../nukkit/event/player/PlayerJoinEvent.java | 37 - .../nukkit/event/player/PlayerJumpEvent.java | 17 - .../nukkit/event/player/PlayerKickEvent.java | 93 - .../player/PlayerLocallyInitializedEvent.java | 21 - .../nukkit/event/player/PlayerLoginEvent.java | 29 - .../player/PlayerMapInfoRequestEvent.java | 29 - .../event/player/PlayerMessageEvent.java | 18 - .../player/PlayerMouseOverEntityEvent.java | 24 - .../nukkit/event/player/PlayerMoveEvent.java | 54 - .../event/player/PlayerPreLoginEvent.java | 31 - .../nukkit/event/player/PlayerQuitEvent.java | 80 - .../event/player/PlayerRespawnEvent.java | 40 - .../PlayerServerSettingsRequestEvent.java | 39 - .../player/PlayerSettingsRespondedEvent.java | 47 - .../event/player/PlayerTeleportEvent.java | 68 - .../event/player/PlayerToggleFlightEvent.java | 24 - .../event/player/PlayerToggleGlideEvent.java | 24 - .../event/player/PlayerToggleSneakEvent.java | 24 - .../event/player/PlayerToggleSprintEvent.java | 24 - .../event/player/PlayerToggleSwimEvent.java | 28 - .../nukkit/event/player/RepairItemEvent.java | 55 - .../event/plugin/PluginDisableEvent.java | 14 - .../event/plugin/PluginEnableEvent.java | 14 - .../cn/nukkit/event/plugin/PluginEvent.java | 28 - .../nukkit/event/potion/PotionApplyEvent.java | 42 - .../event/potion/PotionCollideEvent.java | 30 - .../cn/nukkit/event/potion/PotionEvent.java | 25 - .../event/redstone/RedstoneUpdateEvent.java | 22 - .../event/server/BatchPacketsEvent.java | 38 - .../event/server/DataPacketReceiveEvent.java | 35 - .../event/server/DataPacketSendEvent.java | 35 - .../server/PlayerDataSerializeEvent.java | 49 - .../event/server/QueryRegenerateEvent.java | 191 - .../server/RemoteServerCommandEvent.java | 22 - .../event/server/ServerCommandEvent.java | 39 - .../cn/nukkit/event/server/ServerEvent.java | 10 - .../nukkit/event/server/ServerStopEvent.java | 16 - .../vehicle/EntityEnterVehicleEvent.java | 31 - .../event/vehicle/EntityExitVehicleEvent.java | 31 - .../event/vehicle/VehicleCreateEvent.java | 18 - .../event/vehicle/VehicleDamageEvent.java | 36 - .../event/vehicle/VehicleDestroyEvent.java | 26 - .../cn/nukkit/event/vehicle/VehicleEvent.java | 22 - .../event/vehicle/VehicleMoveEvent.java | 31 - .../event/vehicle/VehicleUpdateEvent.java | 17 - .../event/weather/LightningStrikeEvent.java | 34 - .../java/cn/nukkit/form/element/Element.java | 4 - .../cn/nukkit/form/element/ElementButton.java | 32 - .../form/element/ElementButtonImageData.java | 32 - .../nukkit/form/element/ElementDropdown.java | 60 - .../cn/nukkit/form/element/ElementInput.java | 51 - .../cn/nukkit/form/element/ElementLabel.java | 20 - .../cn/nukkit/form/element/ElementSlider.java | 71 - .../form/element/ElementStepSlider.java | 60 - .../cn/nukkit/form/element/ElementToggle.java | 37 - .../cn/nukkit/form/response/FormResponse.java | 4 - .../form/response/FormResponseCustom.java | 60 - .../form/response/FormResponseData.java | 20 - .../form/response/FormResponseModal.java | 20 - .../form/response/FormResponseSimple.java | 22 - .../cn/nukkit/form/window/FormWindow.java | 23 - .../nukkit/form/window/FormWindowCustom.java | 154 - .../nukkit/form/window/FormWindowModal.java | 67 - .../nukkit/form/window/FormWindowSimple.java | 74 - .../cn/nukkit/inventory/AnvilInventory.java | 64 - .../cn/nukkit/inventory/BaseInventory.java | 591 -- .../cn/nukkit/inventory/BeaconInventory.java | 25 - .../cn/nukkit/inventory/BigCraftingGrid.java | 11 - .../cn/nukkit/inventory/BrewingInventory.java | 44 - .../cn/nukkit/inventory/BrewingRecipe.java | 21 - .../cn/nukkit/inventory/ChestInventory.java | 82 - .../nukkit/inventory/ContainerInventory.java | 87 - .../cn/nukkit/inventory/ContainerRecipe.java | 20 - .../cn/nukkit/inventory/CraftingGrid.java | 16 - .../cn/nukkit/inventory/CraftingManager.java | 675 -- .../cn/nukkit/inventory/CraftingRecipe.java | 40 - .../cn/nukkit/inventory/CustomInventory.java | 28 - .../nukkit/inventory/DispenserInventory.java | 18 - .../inventory/DoubleChestInventory.java | 194 - .../cn/nukkit/inventory/DropperInventory.java | 18 - .../cn/nukkit/inventory/EnchantInventory.java | 50 - .../inventory/EntityArmorInventory.java | 137 - .../inventory/EntityEquipmentInventory.java | 99 - .../cn/nukkit/inventory/FakeBlockMenu.java | 22 - .../inventory/FakeBlockUIComponent.java | 74 - src/main/java/cn/nukkit/inventory/Fuel.java | 75 - .../cn/nukkit/inventory/FurnaceInventory.java | 51 - .../cn/nukkit/inventory/FurnaceRecipe.java | 42 - .../cn/nukkit/inventory/HopperInventory.java | 18 - .../java/cn/nukkit/inventory/Inventory.java | 103 - .../cn/nukkit/inventory/InventoryHolder.java | 10 - .../cn/nukkit/inventory/InventoryType.java | 53 - .../inventory/MinecartChestInventory.java | 15 - .../inventory/MinecartHopperInventory.java | 15 - .../java/cn/nukkit/inventory/MixRecipe.java | 31 - .../java/cn/nukkit/inventory/MultiRecipe.java | 40 - .../inventory/PlayerCursorInventory.java | 26 - .../inventory/PlayerEnderChestInventory.java | 90 - .../cn/nukkit/inventory/PlayerInventory.java | 560 -- .../inventory/PlayerOffhandInventory.java | 92 - .../nukkit/inventory/PlayerUIComponent.java | 108 - .../nukkit/inventory/PlayerUIInventory.java | 120 - src/main/java/cn/nukkit/inventory/Recipe.java | 16 - .../java/cn/nukkit/inventory/RecipeType.java | 14 - .../cn/nukkit/inventory/ShapedRecipe.java | 340 - .../cn/nukkit/inventory/ShapelessRecipe.java | 231 - .../nukkit/inventory/ShulkerBoxInventory.java | 72 - .../cn/nukkit/inventory/TradeInventory.java | 53 - .../inventory/TradeInventoryRecipe.java | 114 - .../transaction/CraftingTransaction.java | 191 - .../transaction/EnchantTransaction.java | 107 - .../transaction/InventoryTransaction.java | 278 - .../transaction/RepairItemTransaction.java | 396 -- .../action/CraftingTakeResultAction.java | 42 - .../CraftingTransferMaterialAction.java | 53 - .../action/CreativeInventoryAction.java | 60 - .../transaction/action/DropItemAction.java | 43 - .../transaction/action/EnchantingAction.java | 35 - .../transaction/action/InventoryAction.java | 97 - .../transaction/action/RepairItemAction.java | 38 - .../transaction/action/SlotChangeAction.java | 90 - .../transaction/data/ReleaseItemData.java | 15 - .../transaction/data/TransactionData.java | 7 - .../transaction/data/UseItemData.java | 22 - .../transaction/data/UseItemOnEntityData.java | 17 - src/main/java/cn/nukkit/item/Item.java | 1358 ---- src/main/java/cn/nukkit/item/ItemApple.java | 20 - .../java/cn/nukkit/item/ItemAppleGold.java | 28 - .../nukkit/item/ItemAppleGoldEnchanted.java | 28 - src/main/java/cn/nukkit/item/ItemArmor.java | 134 - .../java/cn/nukkit/item/ItemArmorStand.java | 84 - src/main/java/cn/nukkit/item/ItemArrow.java | 20 - .../java/cn/nukkit/item/ItemAxeDiamond.java | 40 - src/main/java/cn/nukkit/item/ItemAxeGold.java | 40 - src/main/java/cn/nukkit/item/ItemAxeIron.java | 40 - .../java/cn/nukkit/item/ItemAxeNetherite.java | 36 - .../java/cn/nukkit/item/ItemAxeStone.java | 40 - src/main/java/cn/nukkit/item/ItemAxeWood.java | 40 - src/main/java/cn/nukkit/item/ItemBanner.java | 81 - .../cn/nukkit/item/ItemBannerPattern.java | 24 - src/main/java/cn/nukkit/item/ItemBed.java | 29 - src/main/java/cn/nukkit/item/ItemBeefRaw.java | 20 - .../java/cn/nukkit/item/ItemBeetroot.java | 20 - .../java/cn/nukkit/item/ItemBeetrootSoup.java | 20 - .../java/cn/nukkit/item/ItemBlazePowder.java | 16 - .../java/cn/nukkit/item/ItemBlazeRod.java | 19 - src/main/java/cn/nukkit/item/ItemBlock.java | 52 - src/main/java/cn/nukkit/item/ItemBoat.java | 67 - src/main/java/cn/nukkit/item/ItemBone.java | 20 - src/main/java/cn/nukkit/item/ItemBook.java | 25 - .../java/cn/nukkit/item/ItemBookAndQuill.java | 21 - .../cn/nukkit/item/ItemBookEnchanted.java | 25 - .../java/cn/nukkit/item/ItemBookWritable.java | 214 - .../java/cn/nukkit/item/ItemBookWritten.java | 119 - .../java/cn/nukkit/item/ItemBootsChain.java | 40 - .../java/cn/nukkit/item/ItemBootsDiamond.java | 45 - .../java/cn/nukkit/item/ItemBootsGold.java | 40 - .../java/cn/nukkit/item/ItemBootsIron.java | 40 - .../java/cn/nukkit/item/ItemBootsLeather.java | 40 - .../cn/nukkit/item/ItemBootsNetherite.java | 41 - src/main/java/cn/nukkit/item/ItemBow.java | 146 - src/main/java/cn/nukkit/item/ItemBowl.java | 20 - src/main/java/cn/nukkit/item/ItemBread.java | 20 - .../java/cn/nukkit/item/ItemBrewingStand.java | 19 - src/main/java/cn/nukkit/item/ItemBrick.java | 20 - src/main/java/cn/nukkit/item/ItemBucket.java | 238 - src/main/java/cn/nukkit/item/ItemCactus.java | 20 - src/main/java/cn/nukkit/item/ItemCake.java | 28 - src/main/java/cn/nukkit/item/ItemCarrot.java | 23 - .../java/cn/nukkit/item/ItemCarrotGolden.java | 16 - .../cn/nukkit/item/ItemCarrotOnAStick.java | 34 - .../java/cn/nukkit/item/ItemCauldron.java | 23 - .../cn/nukkit/item/ItemChestplateChain.java | 40 - .../cn/nukkit/item/ItemChestplateDiamond.java | 45 - .../cn/nukkit/item/ItemChestplateGold.java | 40 - .../cn/nukkit/item/ItemChestplateIron.java | 40 - .../cn/nukkit/item/ItemChestplateLeather.java | 40 - .../nukkit/item/ItemChestplateNetherite.java | 41 - .../cn/nukkit/item/ItemChickenCooked.java | 20 - .../java/cn/nukkit/item/ItemChickenRaw.java | 20 - .../java/cn/nukkit/item/ItemChorusFruit.java | 34 - .../cn/nukkit/item/ItemChorusFruitPopped.java | 16 - src/main/java/cn/nukkit/item/ItemClay.java | 20 - src/main/java/cn/nukkit/item/ItemClock.java | 20 - .../java/cn/nukkit/item/ItemClownfish.java | 20 - src/main/java/cn/nukkit/item/ItemCoal.java | 23 - .../java/cn/nukkit/item/ItemColorArmor.java | 88 - src/main/java/cn/nukkit/item/ItemCompass.java | 20 - src/main/java/cn/nukkit/item/ItemCookie.java | 20 - .../java/cn/nukkit/item/ItemCrossbow.java | 169 - src/main/java/cn/nukkit/item/ItemDiamond.java | 20 - .../java/cn/nukkit/item/ItemDoorAcacia.java | 19 - .../java/cn/nukkit/item/ItemDoorBirch.java | 19 - .../java/cn/nukkit/item/ItemDoorDarkOak.java | 19 - .../java/cn/nukkit/item/ItemDoorIron.java | 23 - .../java/cn/nukkit/item/ItemDoorJungle.java | 19 - .../java/cn/nukkit/item/ItemDoorSpruce.java | 19 - .../java/cn/nukkit/item/ItemDoorWood.java | 23 - .../java/cn/nukkit/item/ItemDragonBreath.java | 16 - .../java/cn/nukkit/item/ItemDriedKelp.java | 19 - src/main/java/cn/nukkit/item/ItemDurable.java | 7 - src/main/java/cn/nukkit/item/ItemDye.java | 66 - src/main/java/cn/nukkit/item/ItemEdible.java | 63 - src/main/java/cn/nukkit/item/ItemEgg.java | 35 - src/main/java/cn/nukkit/item/ItemElytra.java | 30 - src/main/java/cn/nukkit/item/ItemEmerald.java | 20 - .../java/cn/nukkit/item/ItemEmptyMap.java | 45 - .../java/cn/nukkit/item/ItemEndCrystal.java | 86 - .../java/cn/nukkit/item/ItemEnderEye.java | 16 - .../java/cn/nukkit/item/ItemEnderPearl.java | 31 - .../java/cn/nukkit/item/ItemExpBottle.java | 30 - src/main/java/cn/nukkit/item/ItemFeather.java | 20 - .../java/cn/nukkit/item/ItemFireCharge.java | 67 - .../java/cn/nukkit/item/ItemFirework.java | 210 - .../java/cn/nukkit/item/ItemFireworkStar.java | 19 - src/main/java/cn/nukkit/item/ItemFish.java | 24 - .../java/cn/nukkit/item/ItemFishCooked.java | 20 - .../java/cn/nukkit/item/ItemFishingRod.java | 50 - src/main/java/cn/nukkit/item/ItemFlint.java | 20 - .../java/cn/nukkit/item/ItemFlintSteel.java | 81 - .../java/cn/nukkit/item/ItemFlowerPot.java | 23 - .../java/cn/nukkit/item/ItemGhastTear.java | 16 - .../java/cn/nukkit/item/ItemGlassBottle.java | 47 - .../cn/nukkit/item/ItemGlowstoneDust.java | 20 - .../java/cn/nukkit/item/ItemGunpowder.java | 20 - .../cn/nukkit/item/ItemHeartOfTheSea.java | 19 - .../java/cn/nukkit/item/ItemHelmetChain.java | 40 - .../cn/nukkit/item/ItemHelmetDiamond.java | 45 - .../java/cn/nukkit/item/ItemHelmetGold.java | 40 - .../java/cn/nukkit/item/ItemHelmetIron.java | 40 - .../cn/nukkit/item/ItemHelmetLeather.java | 40 - .../cn/nukkit/item/ItemHelmetNetherite.java | 41 - .../java/cn/nukkit/item/ItemHoeDiamond.java | 35 - src/main/java/cn/nukkit/item/ItemHoeGold.java | 35 - src/main/java/cn/nukkit/item/ItemHoeIron.java | 35 - .../java/cn/nukkit/item/ItemHoeNetherite.java | 31 - .../java/cn/nukkit/item/ItemHoeStone.java | 35 - src/main/java/cn/nukkit/item/ItemHoeWood.java | 35 - .../java/cn/nukkit/item/ItemHoneyBottle.java | 47 - .../java/cn/nukkit/item/ItemHoneycomb.java | 19 - src/main/java/cn/nukkit/item/ItemHopper.java | 22 - .../cn/nukkit/item/ItemHorseArmorDiamond.java | 21 - .../cn/nukkit/item/ItemHorseArmorGold.java | 21 - .../cn/nukkit/item/ItemHorseArmorIron.java | 21 - .../cn/nukkit/item/ItemHorseArmorLeather.java | 21 - src/main/java/cn/nukkit/item/ItemID.java | 304 - .../java/cn/nukkit/item/ItemIngotGold.java | 20 - .../java/cn/nukkit/item/ItemIngotIron.java | 20 - .../cn/nukkit/item/ItemIngotNetherite.java | 16 - .../java/cn/nukkit/item/ItemItemFrame.java | 22 - src/main/java/cn/nukkit/item/ItemLadder.java | 20 - src/main/java/cn/nukkit/item/ItemLead.java | 16 - src/main/java/cn/nukkit/item/ItemLeather.java | 20 - .../cn/nukkit/item/ItemLeggingsChain.java | 40 - .../cn/nukkit/item/ItemLeggingsDiamond.java | 45 - .../java/cn/nukkit/item/ItemLeggingsGold.java | 40 - .../java/cn/nukkit/item/ItemLeggingsIron.java | 40 - .../cn/nukkit/item/ItemLeggingsLeather.java | 40 - .../cn/nukkit/item/ItemLeggingsNetherite.java | 41 - .../java/cn/nukkit/item/ItemMagmaCream.java | 16 - src/main/java/cn/nukkit/item/ItemMap.java | 126 - src/main/java/cn/nukkit/item/ItemMelon.java | 20 - .../cn/nukkit/item/ItemMelonGlistering.java | 16 - .../java/cn/nukkit/item/ItemMinecart.java | 71 - .../cn/nukkit/item/ItemMinecartChest.java | 67 - .../cn/nukkit/item/ItemMinecartHopper.java | 67 - .../java/cn/nukkit/item/ItemMinecartTNT.java | 67 - .../java/cn/nukkit/item/ItemMushroomStew.java | 25 - .../java/cn/nukkit/item/ItemMuttonCooked.java | 16 - .../java/cn/nukkit/item/ItemMuttonRaw.java | 16 - src/main/java/cn/nukkit/item/ItemNameTag.java | 16 - .../cn/nukkit/item/ItemNautilusShell.java | 19 - .../java/cn/nukkit/item/ItemNetherBrick.java | 20 - .../java/cn/nukkit/item/ItemNetherStar.java | 16 - .../java/cn/nukkit/item/ItemNetherWart.java | 22 - .../java/cn/nukkit/item/ItemNuggetGold.java | 20 - .../java/cn/nukkit/item/ItemNuggetIron.java | 19 - .../java/cn/nukkit/item/ItemPainting.java | 129 - src/main/java/cn/nukkit/item/ItemPaper.java | 20 - .../cn/nukkit/item/ItemPhantomMembrane.java | 19 - .../cn/nukkit/item/ItemPickaxeDiamond.java | 40 - .../java/cn/nukkit/item/ItemPickaxeGold.java | 40 - .../java/cn/nukkit/item/ItemPickaxeIron.java | 40 - .../cn/nukkit/item/ItemPickaxeNetherite.java | 36 - .../java/cn/nukkit/item/ItemPickaxeStone.java | 40 - .../java/cn/nukkit/item/ItemPickaxeWood.java | 40 - .../cn/nukkit/item/ItemPorkchopCooked.java | 20 - .../java/cn/nukkit/item/ItemPorkchopRaw.java | 20 - src/main/java/cn/nukkit/item/ItemPotato.java | 27 - .../java/cn/nukkit/item/ItemPotatoBaked.java | 20 - .../cn/nukkit/item/ItemPotatoPoisonous.java | 20 - src/main/java/cn/nukkit/item/ItemPotion.java | 92 - .../cn/nukkit/item/ItemPotionLingering.java | 43 - .../java/cn/nukkit/item/ItemPotionSplash.java | 43 - .../nukkit/item/ItemPrismarineCrystals.java | 16 - .../cn/nukkit/item/ItemPrismarineShard.java | 16 - .../java/cn/nukkit/item/ItemPufferfish.java | 20 - .../java/cn/nukkit/item/ItemPumpkinPie.java | 20 - src/main/java/cn/nukkit/item/ItemQuartz.java | 20 - .../java/cn/nukkit/item/ItemRabbitCooked.java | 20 - .../java/cn/nukkit/item/ItemRabbitFoot.java | 20 - .../java/cn/nukkit/item/ItemRabbitHide.java | 16 - .../java/cn/nukkit/item/ItemRabbitRaw.java | 20 - .../java/cn/nukkit/item/ItemRabbitStew.java | 25 - src/main/java/cn/nukkit/item/ItemRail.java | 20 - src/main/java/cn/nukkit/item/ItemRecord.java | 18 - .../java/cn/nukkit/item/ItemRecord11.java | 24 - .../java/cn/nukkit/item/ItemRecord13.java | 24 - .../java/cn/nukkit/item/ItemRecordBlocks.java | 24 - .../java/cn/nukkit/item/ItemRecordCat.java | 24 - .../java/cn/nukkit/item/ItemRecordChirp.java | 24 - .../java/cn/nukkit/item/ItemRecordFar.java | 24 - .../java/cn/nukkit/item/ItemRecordMall.java | 24 - .../cn/nukkit/item/ItemRecordMellohi.java | 24 - .../cn/nukkit/item/ItemRecordPigstep.java | 24 - .../java/cn/nukkit/item/ItemRecordStal.java | 24 - .../java/cn/nukkit/item/ItemRecordStrad.java | 24 - .../java/cn/nukkit/item/ItemRecordWait.java | 24 - .../java/cn/nukkit/item/ItemRecordWard.java | 24 - .../java/cn/nukkit/item/ItemRedstone.java | 23 - .../nukkit/item/ItemRedstoneComparator.java | 22 - .../cn/nukkit/item/ItemRedstoneRepeater.java | 22 - .../java/cn/nukkit/item/ItemRottenFlesh.java | 20 - src/main/java/cn/nukkit/item/ItemSaddle.java | 21 - src/main/java/cn/nukkit/item/ItemSalmon.java | 20 - .../java/cn/nukkit/item/ItemSalmonCooked.java | 20 - .../cn/nukkit/item/ItemScrapNetherite.java | 16 - src/main/java/cn/nukkit/item/ItemScute.java | 19 - .../cn/nukkit/item/ItemSeedsBeetroot.java | 23 - .../java/cn/nukkit/item/ItemSeedsMelon.java | 23 - .../java/cn/nukkit/item/ItemSeedsPumpkin.java | 23 - .../java/cn/nukkit/item/ItemSeedsWheat.java | 23 - src/main/java/cn/nukkit/item/ItemShears.java | 30 - src/main/java/cn/nukkit/item/ItemShield.java | 21 - .../cn/nukkit/item/ItemShovelDiamond.java | 40 - .../java/cn/nukkit/item/ItemShovelGold.java | 35 - .../java/cn/nukkit/item/ItemShovelIron.java | 40 - .../cn/nukkit/item/ItemShovelNetherite.java | 36 - .../java/cn/nukkit/item/ItemShovelStone.java | 40 - .../java/cn/nukkit/item/ItemShovelWood.java | 35 - .../java/cn/nukkit/item/ItemShulkerShell.java | 16 - src/main/java/cn/nukkit/item/ItemSign.java | 28 - src/main/java/cn/nukkit/item/ItemSkull.java | 63 - .../java/cn/nukkit/item/ItemSlimeball.java | 20 - .../java/cn/nukkit/item/ItemSnowball.java | 35 - .../java/cn/nukkit/item/ItemSpawnEgg.java | 146 - .../java/cn/nukkit/item/ItemSpiderEye.java | 20 - .../nukkit/item/ItemSpiderEyeFermented.java | 16 - .../java/cn/nukkit/item/ItemSpyglass.java | 24 - src/main/java/cn/nukkit/item/ItemSteak.java | 20 - src/main/java/cn/nukkit/item/ItemStick.java | 20 - src/main/java/cn/nukkit/item/ItemString.java | 23 - src/main/java/cn/nukkit/item/ItemSugar.java | 20 - .../java/cn/nukkit/item/ItemSugarcane.java | 23 - .../cn/nukkit/item/ItemSuspiciousStew.java | 21 - .../java/cn/nukkit/item/ItemSweetBerries.java | 16 - .../java/cn/nukkit/item/ItemSwordDiamond.java | 40 - .../java/cn/nukkit/item/ItemSwordGold.java | 40 - .../java/cn/nukkit/item/ItemSwordIron.java | 40 - .../cn/nukkit/item/ItemSwordNetherite.java | 36 - .../java/cn/nukkit/item/ItemSwordStone.java | 40 - .../java/cn/nukkit/item/ItemSwordWood.java | 40 - src/main/java/cn/nukkit/item/ItemTool.java | 163 - src/main/java/cn/nukkit/item/ItemTotem.java | 17 - src/main/java/cn/nukkit/item/ItemTrident.java | 107 - .../java/cn/nukkit/item/ItemTurtleShell.java | 44 - .../nukkit/item/ItemWarpedFungusOnAStick.java | 29 - src/main/java/cn/nukkit/item/ItemWheat.java | 20 - .../java/cn/nukkit/item/ProjectileItem.java | 85 - .../cn/nukkit/item/RuntimeItemMapping.java | 213 - .../java/cn/nukkit/item/RuntimeItems.java | 118 - .../nukkit/item/enchantment/Enchantment.java | 313 - .../enchantment/EnchantmentBindingCurse.java | 23 - .../enchantment/EnchantmentDurability.java | 45 - .../enchantment/EnchantmentEfficiency.java | 34 - .../item/enchantment/EnchantmentEntry.java | 29 - .../enchantment/EnchantmentFireAspect.java | 46 - .../enchantment/EnchantmentFrostWalker.java | 28 - .../enchantment/EnchantmentKnockback.java | 27 - .../item/enchantment/EnchantmentList.java | 26 - .../item/enchantment/EnchantmentLure.java | 22 - .../item/enchantment/EnchantmentMending.java | 31 - .../enchantment/EnchantmentSilkTouch.java | 34 - .../enchantment/EnchantmentSoulSpeed.java | 18 - .../item/enchantment/EnchantmentThorns.java | 67 - .../item/enchantment/EnchantmentType.java | 73 - .../EnchantmentVanishingCurse.java | 19 - .../enchantment/EnchantmentWaterBreath.java | 27 - .../enchantment/EnchantmentWaterWalker.java | 27 - .../enchantment/EnchantmentWaterWorker.java | 22 - .../item/enchantment/bow/EnchantmentBow.java | 15 - .../enchantment/bow/EnchantmentBowFlame.java | 23 - .../bow/EnchantmentBowInfinity.java | 24 - .../bow/EnchantmentBowKnockback.java | 28 - .../enchantment/bow/EnchantmentBowPower.java | 29 - .../crossbow/EnchantmentCrossbow.java | 11 - .../EnchantmentCrossbowMultishot.java | 30 - .../crossbow/EnchantmentCrossbowPiercing.java | 30 - .../EnchantmentCrossbowQuickCharge.java | 25 - .../enchantment/damage/EnchantmentDamage.java | 47 - .../damage/EnchantmentDamageAll.java | 34 - .../damage/EnchantmentDamageArthropods.java | 43 - .../damage/EnchantmentDamageSmite.java | 34 - .../enchantment/loot/EnchantmentLoot.java | 35 - .../loot/EnchantmentLootDigging.java | 15 - .../loot/EnchantmentLootFishing.java | 15 - .../loot/EnchantmentLootWeapon.java | 15 - .../protection/EnchantmentProtection.java | 59 - .../protection/EnchantmentProtectionAll.java | 42 - .../EnchantmentProtectionExplosion.java | 41 - .../protection/EnchantmentProtectionFall.java | 41 - .../protection/EnchantmentProtectionFire.java | 41 - .../EnchantmentProtectionProjectile.java | 41 - .../trident/EnchantmentTrident.java | 11 - .../trident/EnchantmentTridentChanneling.java | 10 - .../trident/EnchantmentTridentImpaling.java | 35 - .../trident/EnchantmentTridentLoyalty.java | 20 - .../trident/EnchantmentTridentRiptide.java | 20 - src/main/java/cn/nukkit/item/food/Food.java | 204 - .../cn/nukkit/item/food/FoodChorusFruit.java | 62 - .../cn/nukkit/item/food/FoodEffective.java | 45 - .../nukkit/item/food/FoodEffectiveInBow.java | 18 - .../java/cn/nukkit/item/food/FoodHoney.java | 21 - .../java/cn/nukkit/item/food/FoodInBowl.java | 23 - .../java/cn/nukkit/item/food/FoodMilk.java | 19 - .../java/cn/nukkit/item/food/FoodNormal.java | 13 - .../item/randomitem/ConstantItemSelector.java | 37 - .../cn/nukkit/item/randomitem/Fishing.java | 72 - .../cn/nukkit/item/randomitem/RandomItem.java | 36 - .../cn/nukkit/item/randomitem/Selector.java | 46 - src/main/java/cn/nukkit/lang/BaseLang.java | 246 - .../java/cn/nukkit/lang/TextContainer.java | 39 - .../cn/nukkit/lang/TranslationContainer.java | 47 - .../java/cn/nukkit/level/ChunkLoader.java | 33 - .../java/cn/nukkit/level/ChunkManager.java | 34 - .../java/cn/nukkit/level/ChunkPosition.java | 42 - src/main/java/cn/nukkit/level/EnumLevel.java | 62 - src/main/java/cn/nukkit/level/Explosion.java | 224 - src/main/java/cn/nukkit/level/GameRule.java | 70 - src/main/java/cn/nukkit/level/GameRules.java | 272 - .../cn/nukkit/level/GlobalBlockPalette.java | 616 -- src/main/java/cn/nukkit/level/Level.java | 4339 ------------ src/main/java/cn/nukkit/level/Location.java | 208 - .../cn/nukkit/level/MovingObjectPosition.java | 48 - .../java/cn/nukkit/level/ParticleEffect.java | 146 - src/main/java/cn/nukkit/level/Position.java | 186 - .../cn/nukkit/level/SimpleChunkManager.java | 107 - src/main/java/cn/nukkit/level/Sound.java | 997 --- .../java/cn/nukkit/level/StrongExplosion.java | 210 - .../java/cn/nukkit/level/WeakExplosion.java | 190 - .../java/cn/nukkit/level/biome/Biome.java | 141 - .../cn/nukkit/level/biome/BiomeSelector.java | 191 - .../java/cn/nukkit/level/biome/EnumBiome.java | 136 - .../cn/nukkit/level/biome/impl/EndBiome.java | 11 - .../cn/nukkit/level/biome/impl/HellBiome.java | 16 - .../level/biome/impl/beach/BeachBiome.java | 36 - .../biome/impl/beach/ColdBeachBiome.java | 33 - .../level/biome/impl/desert/DesertBiome.java | 37 - .../biome/impl/desert/DesertHillsBiome.java | 18 - .../level/biome/impl/desert/DesertMBiome.java | 19 - .../impl/extremehills/ExtremeHillsBiome.java | 51 - .../extremehills/ExtremeHillsEdgeBiome.java | 20 - .../impl/extremehills/ExtremeHillsMBiome.java | 52 - .../extremehills/ExtremeHillsPlusBiome.java | 28 - .../extremehills/ExtremeHillsPlusMBiome.java | 24 - .../impl/extremehills/StoneBeachBiome.java | 43 - .../biome/impl/forest/FlowerForestBiome.java | 45 - .../level/biome/impl/forest/ForestBiome.java | 55 - .../biome/impl/forest/ForestHillsBiome.java | 30 - .../biome/impl/iceplains/IcePlainsBiome.java | 28 - .../impl/iceplains/IcePlainsSpikesBiome.java | 102 - .../level/biome/impl/jungle/JungleBiome.java | 32 - .../biome/impl/jungle/JungleEdgeBiome.java | 12 - .../biome/impl/jungle/JungleEdgeMBiome.java | 12 - .../biome/impl/jungle/JungleHillsBiome.java | 18 - .../level/biome/impl/jungle/JungleMBiome.java | 25 - .../level/biome/impl/mesa/MesaBiome.java | 124 - .../level/biome/impl/mesa/MesaBryceBiome.java | 22 - .../biome/impl/mesa/MesaPlateauBiome.java | 20 - .../biome/impl/mesa/MesaPlateauFBiome.java | 28 - .../biome/impl/mesa/MesaPlateauFMBiome.java | 12 - .../biome/impl/mesa/MesaPlateauMBiome.java | 29 - .../impl/mushroom/MushroomIslandBiome.java | 25 - .../mushroom/MushroomIslandShoreBiome.java | 18 - .../biome/impl/ocean/DeepOceanBiome.java | 21 - .../biome/impl/ocean/FrozenOceanBiome.java | 33 - .../level/biome/impl/ocean/OceanBiome.java | 25 - .../level/biome/impl/plains/PlainsBiome.java | 31 - .../impl/plains/SunflowerPlainsBiome.java | 35 - .../biome/impl/river/FrozenRiverBiome.java | 31 - .../level/biome/impl/river/RiverBiome.java | 41 - .../impl/roofedforest/RoofedForestBiome.java | 35 - .../impl/roofedforest/RoofedForestMBiome.java | 16 - .../biome/impl/savanna/SavannaBiome.java | 37 - .../biome/impl/savanna/SavannaMBiome.java | 38 - .../impl/savanna/SavannaPlateauBiome.java | 19 - .../impl/savanna/SavannaPlateauMBiome.java | 24 - .../level/biome/impl/swamp/SwampBiome.java | 53 - .../biome/impl/swamp/SwamplandMBiome.java | 13 - .../biome/impl/taiga/ColdTaigaBiome.java | 39 - .../biome/impl/taiga/ColdTaigaHillsBiome.java | 19 - .../biome/impl/taiga/ColdTaigaMBiome.java | 18 - .../impl/taiga/MegaSpruceTaigaBiome.java | 22 - .../biome/impl/taiga/MegaTaigaBiome.java | 25 - .../biome/impl/taiga/MegaTaigaHillsBiome.java | 19 - .../level/biome/impl/taiga/TaigaBiome.java | 27 - .../biome/impl/taiga/TaigaHillsBiome.java | 20 - .../level/biome/impl/taiga/TaigaMBiome.java | 19 - .../nukkit/level/biome/type/CoveredBiome.java | 75 - .../nukkit/level/biome/type/GrassyBiome.java | 32 - .../nukkit/level/biome/type/SandyBiome.java | 27 - .../nukkit/level/biome/type/SnowyBiome.java | 30 - .../nukkit/level/biome/type/WateryBiome.java | 29 - .../java/cn/nukkit/level/format/Chunk.java | 28 - .../cn/nukkit/level/format/ChunkSection.java | 57 - .../cn/nukkit/level/format/FullChunk.java | 168 - .../cn/nukkit/level/format/LevelProvider.java | 117 - .../level/format/LevelProviderManager.java | 40 - .../cn/nukkit/level/format/anvil/Anvil.java | 280 - .../cn/nukkit/level/format/anvil/Chunk.java | 515 -- .../level/format/anvil/ChunkSection.java | 383 -- .../level/format/anvil/RegionLoader.java | 323 - .../format/anvil/palette/BiomePalette.java | 120 - .../level/format/anvil/palette/BitArray.java | 156 - .../format/anvil/palette/BitArray256.java | 90 - .../format/anvil/palette/BitArray4096.java | 160 - .../anvil/palette/BlockDataPalette.java | 220 - .../format/anvil/palette/BytePalette.java | 94 - .../format/anvil/palette/CharPalette.java | 94 - .../format/anvil/palette/DataPalette.java | 209 - .../format/anvil/palette/IntPalette.java | 105 - .../level/format/anvil/util/BlockStorage.java | 113 - .../level/format/anvil/util/NibbleArray.java | 84 - .../level/format/generic/BaseChunk.java | 292 - .../level/format/generic/BaseFullChunk.java | 622 -- .../format/generic/BaseLevelProvider.java | 456 -- .../format/generic/BaseRegionLoader.java | 98 - .../format/generic/EmptyChunkSection.java | 161 - .../java/cn/nukkit/level/generator/End.java | 160 - .../java/cn/nukkit/level/generator/Flat.java | 191 - .../cn/nukkit/level/generator/Generator.java | 98 - .../cn/nukkit/level/generator/Nether.java | 162 - .../cn/nukkit/level/generator/Normal.java | 317 - .../level/generator/PopChunkManager.java | 94 - .../level/generator/SimpleChunkManager.java | 86 - .../java/cn/nukkit/level/generator/Void.java | 58 - .../nukkit/level/generator/noise/Noise.java | 137 - .../nukkit/level/generator/noise/Perlin.java | 98 - .../nukkit/level/generator/noise/Simplex.java | 285 - .../generator/noise/nukkit/d/NoiseD.java | 137 - .../generator/noise/nukkit/d/PerlinD.java | 92 - .../generator/noise/nukkit/d/SimplexD.java | 273 - .../generator/noise/nukkit/f/NoiseF.java | 137 - .../generator/noise/nukkit/f/PerlinF.java | 92 - .../generator/noise/nukkit/f/SimplexF.java | 273 - .../vanilla/d/NoiseGeneratorImprovedD.java | 177 - .../vanilla/d/NoiseGeneratorOctavesD.java | 62 - .../vanilla/d/NoiseGeneratorPerlinD.java | 54 - .../vanilla/d/NoiseGeneratorSimplexD.java | 182 - .../vanilla/f/NoiseGeneratorImprovedF.java | 177 - .../vanilla/f/NoiseGeneratorOctavesF.java | 62 - .../vanilla/f/NoiseGeneratorPerlinF.java | 54 - .../vanilla/f/NoiseGeneratorSimplexF.java | 182 - .../generator/object/BasicGenerator.java | 24 - .../generator/object/ObjectTallGrass.java | 52 - .../object/mushroom/BigMushroom.java | 202 - .../level/generator/object/ore/OreType.java | 85 - .../object/structure/ObjectFallenTree.java | 64 - .../object/structure/ObjectWell.java | 84 - .../object/tree/HugeTreesGenerator.java | 147 - .../generator/object/tree/NewJungleTree.java | 233 - .../object/tree/ObjectBigSpruceTree.java | 57 - .../object/tree/ObjectBirchTree.java | 30 - .../object/tree/ObjectDarkOakTree.java | 176 - .../object/tree/ObjectJungleBigTree.java | 105 - .../object/tree/ObjectJungleTree.java | 29 - .../generator/object/tree/ObjectOakTree.java | 30 - .../object/tree/ObjectSavannaTree.java | 173 - .../object/tree/ObjectSpruceTree.java | 71 - .../object/tree/ObjectSwampTree.java | 156 - .../object/tree/ObjectTallBirchTree.java | 17 - .../generator/object/tree/ObjectTree.java | 128 - .../generator/object/tree/TreeGenerator.java | 38 - .../populator/helper/EnsureBelow.java | 13 - .../populator/helper/EnsureCover.java | 17 - .../populator/helper/EnsureGrassBelow.java | 15 - .../populator/helper/PopulatorHelpers.java | 32 - .../populator/impl/MushroomPopulator.java | 52 - .../populator/impl/PopulatorBedrock.java | 28 - .../populator/impl/PopulatorCactus.java | 23 - .../populator/impl/PopulatorCaves.java | 267 - .../populator/impl/PopulatorDeadBush.java | 23 - .../populator/impl/PopulatorDoublePlant.java | 36 - .../populator/impl/PopulatorDungeon.java | 246 - .../populator/impl/PopulatorFallenTree.java | 72 - .../populator/impl/PopulatorFlower.java | 54 - .../populator/impl/PopulatorGlowStone.java | 36 - .../populator/impl/PopulatorGrass.java | 23 - .../populator/impl/PopulatorGroundCover.java | 28 - .../populator/impl/PopulatorGroundFire.java | 43 - .../populator/impl/PopulatorLava.java | 227 - .../populator/impl/PopulatorLilyPad.java | 23 - .../populator/impl/PopulatorMelon.java | 23 - .../populator/impl/PopulatorNetherWart.java | 53 - .../populator/impl/PopulatorOre.java | 45 - .../populator/impl/PopulatorPumpkin.java | 42 - .../impl/PopulatorSmallMushroom.java | 23 - .../populator/impl/PopulatorSugarcane.java | 49 - .../impl/PopulatorTallSugarcane.java | 22 - .../populator/impl/PopulatorTree.java | 54 - .../populator/impl/PopulatorWell.java | 40 - .../populator/impl/WaterIcePopulator.java | 26 - .../impl/tree/DarkOakTreePopulator.java | 63 - .../impl/tree/JungleBigTreePopulator.java | 65 - .../impl/tree/JungleFloorPopulator.java | 67 - .../impl/tree/JungleTreePopulator.java | 62 - .../impl/tree/SavannaTreePopulator.java | 63 - .../impl/tree/SpruceBigTreePopulator.java | 59 - .../impl/tree/SpruceMegaTreePopulator.java | 61 - .../impl/tree/SwampTreePopulator.java | 62 - .../populator/tree/DarkOakTreePopulator.java | 64 - .../tree/JungleBigTreePopulator.java | 62 - .../populator/tree/JungleTreePopulator.java | 63 - .../populator/tree/SavannaTreePopulator.java | 63 - .../populator/tree/SwampTreePopulator.java | 63 - .../generator/populator/type/Populator.java | 19 - .../populator/type/PopulatorCount.java | 35 - .../populator/type/PopulatorSurfaceBlock.java | 45 - .../level/generator/task/GenerationTask.java | 83 - .../generator/task/LightPopulationTask.java | 49 - .../level/generator/task/PopulationTask.java | 166 - .../level/particle/AngryVillagerParticle.java | 14 - .../particle/BlockForceFieldParticle.java | 14 - .../level/particle/BoneMealParticle.java | 28 - .../nukkit/level/particle/BubbleParticle.java | 14 - .../level/particle/CriticalParticle.java | 18 - .../level/particle/DestroyBlockParticle.java | 35 - .../nukkit/level/particle/DustParticle.java | 23 - .../level/particle/EnchantParticle.java | 14 - .../particle/EnchantmentTableParticle.java | 14 - .../level/particle/EntityFlameParticle.java | 14 - .../level/particle/ExplodeParticle.java | 14 - .../nukkit/level/particle/FlameParticle.java | 14 - .../level/particle/FloatingTextParticle.java | 173 - .../level/particle/GenericParticle.java | 39 - .../level/particle/HappyVillagerParticle.java | 14 - .../nukkit/level/particle/HeartParticle.java | 18 - .../level/particle/HugeExplodeParticle.java | 14 - .../particle/HugeExplodeSeedParticle.java | 14 - .../cn/nukkit/level/particle/InkParticle.java | 18 - .../particle/InstantEnchantParticle.java | 14 - .../level/particle/InstantSpellParticle.java | 29 - .../level/particle/ItemBreakParticle.java | 39 - .../level/particle/LavaDripParticle.java | 14 - .../nukkit/level/particle/LavaParticle.java | 14 - .../level/particle/MobSpawnParticle.java | 34 - .../cn/nukkit/level/particle/Particle.java | 158 - .../nukkit/level/particle/PortalParticle.java | 14 - .../level/particle/PunchBlockParticle.java | 42 - .../level/particle/RainSplashParticle.java | 14 - .../level/particle/RedstoneParticle.java | 18 - .../nukkit/level/particle/SmokeParticle.java | 18 - .../nukkit/level/particle/SpellParticle.java | 51 - .../nukkit/level/particle/SplashParticle.java | 14 - .../nukkit/level/particle/SporeParticle.java | 14 - .../level/particle/TerrainParticle.java | 17 - .../level/particle/WaterDripParticle.java | 14 - .../nukkit/level/particle/WaterParticle.java | 14 - .../cn/nukkit/level/sound/AnvilFallSound.java | 19 - .../nukkit/level/sound/ButtonClickSound.java | 19 - .../cn/nukkit/level/sound/ClickSound.java | 19 - .../java/cn/nukkit/level/sound/DoorSound.java | 19 - .../level/sound/EndermanTeleportSound.java | 19 - .../level/sound/ExperienceOrbSound.java | 18 - .../java/cn/nukkit/level/sound/FizzSound.java | 19 - .../level/sound/ItemFrameItemAddedSound.java | 18 - .../level/sound/ItemFrameItemRotated.java | 18 - .../level/sound/ItemFramePlacedSound.java | 18 - .../level/sound/ItemFrameRemovedSound.java | 18 - .../nukkit/level/sound/LevelEventSound.java | 44 - .../cn/nukkit/level/sound/LeverSound.java | 15 - .../java/cn/nukkit/level/sound/Sound.java | 34 - .../cn/nukkit/level/sound/TNTPrimeSound.java | 18 - .../java/cn/nukkit/level/util/BitArray.java | 16 - .../cn/nukkit/level/util/BitArrayVersion.java | 69 - .../cn/nukkit/level/util/PaddedBitArray.java | 75 - .../level/util/PalettedBlockStorage.java | 113 - .../cn/nukkit/level/util/Pow2BitArray.java | 85 - src/main/java/cn/nukkit/math/Angle.java | 147 - .../java/cn/nukkit/math/AxisAlignedBB.java | 396 -- src/main/java/cn/nukkit/math/BlockFace.java | 363 - .../java/cn/nukkit/math/BlockVector3.java | 243 - src/main/java/cn/nukkit/math/MathHelper.java | 108 - src/main/java/cn/nukkit/math/NukkitMath.java | 63 - .../java/cn/nukkit/math/NukkitRandom.java | 79 - src/main/java/cn/nukkit/math/Vector2.java | 137 - src/main/java/cn/nukkit/math/Vector2f.java | 137 - src/main/java/cn/nukkit/math/Vector3.java | 415 -- src/main/java/cn/nukkit/math/Vector3f.java | 390 -- src/main/java/cn/nukkit/math/VectorMath.java | 13 - .../nukkit/metadata/BlockMetadataStore.java | 76 - .../nukkit/metadata/EntityMetadataStore.java | 18 - .../nukkit/metadata/LevelMetadataStore.java | 18 - .../cn/nukkit/metadata/MetadataStore.java | 70 - .../cn/nukkit/metadata/MetadataValue.java | 26 - .../java/cn/nukkit/metadata/Metadatable.java | 20 - .../nukkit/metadata/PlayerMetadataStore.java | 18 - src/main/java/cn/nukkit/metrics/Metrics.java | 522 -- .../java/cn/nukkit/metrics/NukkitMetrics.java | 89 - src/main/java/cn/nukkit/nbt/NBTIO.java | 281 - .../nbt/stream/FastByteArrayOutputStream.java | 140 - .../cn/nukkit/nbt/stream/NBTInputStream.java | 165 - .../cn/nukkit/nbt/stream/NBTOutputStream.java | 152 - .../java/cn/nukkit/nbt/stream/PGZIPBlock.java | 35 - .../nukkit/nbt/stream/PGZIPOutputStream.java | 229 - .../java/cn/nukkit/nbt/stream/PGZIPState.java | 18 - .../nukkit/nbt/stream/PGZIPThreadLocal.java | 15 - .../java/cn/nukkit/nbt/tag/ByteArrayTag.java | 74 - src/main/java/cn/nukkit/nbt/tag/ByteTag.java | 73 - .../java/cn/nukkit/nbt/tag/CompoundTag.java | 280 - .../java/cn/nukkit/nbt/tag/DoubleTag.java | 69 - src/main/java/cn/nukkit/nbt/tag/EndTag.java | 41 - src/main/java/cn/nukkit/nbt/tag/FloatTag.java | 69 - .../java/cn/nukkit/nbt/tag/IntArrayTag.java | 73 - src/main/java/cn/nukkit/nbt/tag/IntTag.java | 69 - src/main/java/cn/nukkit/nbt/tag/ListTag.java | 155 - src/main/java/cn/nukkit/nbt/tag/LongTag.java | 69 - .../java/cn/nukkit/nbt/tag/NumberTag.java | 16 - src/main/java/cn/nukkit/nbt/tag/ShortTag.java | 69 - .../java/cn/nukkit/nbt/tag/StringTag.java | 60 - src/main/java/cn/nukkit/nbt/tag/Tag.java | 168 - .../network/AdvancedSourceInterface.java | 23 - .../cn/nukkit/network/BatchingHelper.java | 105 - .../LittleEndianByteBufInputStream.java | 51 - .../LittleEndianByteBufOutputStream.java | 54 - src/main/java/cn/nukkit/network/Network.java | 382 -- .../cn/nukkit/network/RakNetInterface.java | 273 - .../cn/nukkit/network/SourceInterface.java | 32 - .../protocol/AddBehaviorTreePacket.java | 27 - .../network/protocol/AddEntityPacket.java | 220 - .../network/protocol/AddItemEntityPacket.java | 51 - .../network/protocol/AddPaintingPacket.java | 43 - .../network/protocol/AddPlayerPacket.java | 81 - .../protocol/AdventureSettingsPacket.java | 103 - .../network/protocol/AnimatePacket.java | 74 - .../network/protocol/AnvilDamagePacket.java | 34 - .../protocol/AvailableCommandsPacket.java | 364 - .../AvailableEntityIdentifiersPacket.java | 49 - .../nukkit/network/protocol/BatchPacket.java | 30 - .../protocol/BiomeDefinitionListPacket.java | 37 - .../protocol/BlockEntityDataPacket.java | 40 - .../network/protocol/BlockEventPacket.java | 36 - .../protocol/BlockPickRequestPacket.java | 35 - .../network/protocol/BookEditPacket.java | 66 - .../network/protocol/BossEventPacket.java | 100 - .../nukkit/network/protocol/CameraPacket.java | 30 - .../protocol/ChangeDimensionPacket.java | 43 - .../protocol/ChunkRadiusUpdatedPacket.java | 31 - .../protocol/ClientCacheStatusPacket.java | 24 - .../ClientToServerHandshakePacket.java | 22 - .../ClientboundMapItemDataPacket.java | 151 - .../network/protocol/CodeBuilderPacket.java | 27 - .../protocol/CommandBlockUpdatePacket.java | 66 - .../protocol/CommandRequestPacket.java | 54 - .../protocol/CompletedUsingItemPacket.java | 45 - .../protocol/ContainerClosePacket.java | 38 - .../network/protocol/ContainerOpenPacket.java | 46 - .../protocol/ContainerSetDataPacket.java | 44 - .../network/protocol/CraftingDataPacket.java | 256 - .../network/protocol/CraftingEventPacket.java | 58 - .../protocol/CreativeContentPacket.java | 30 - .../nukkit/network/protocol/DataPacket.java | 94 - .../network/protocol/DebugInfoPacket.java | 27 - .../network/protocol/DisconnectPacket.java | 32 - .../network/protocol/EmoteListPacket.java | 42 - .../nukkit/network/protocol/EmotePacket.java | 30 - .../network/protocol/EntityEventPacket.java | 93 - .../network/protocol/EntityFallPacket.java | 29 - .../protocol/EntityPickRequestPacket.java | 22 - .../nukkit/network/protocol/EventPacket.java | 49 - .../network/protocol/FilterTextPacket.java | 30 - .../protocol/GUIDataPickItemPacket.java | 27 - .../protocol/GameRulesChangedPacket.java | 39 - .../network/protocol/HurtArmorPacket.java | 37 - .../InitiateWebSocketConnectionPacket.java | 22 - .../network/protocol/InteractPacket.java | 35 - .../protocol/InventoryContentPacket.java | 67 - .../network/protocol/InventorySlotPacket.java | 42 - .../protocol/InventoryTransactionPacket.java | 190 - .../network/protocol/ItemComponentPacket.java | 21 - .../protocol/ItemFrameDropItemPacket.java | 34 - .../network/protocol/LecternUpdatePacket.java | 38 - .../network/protocol/LevelChunkPacket.java | 47 - .../protocol/LevelEventGenericPacket.java | 35 - .../network/protocol/LevelEventPacket.java | 131 - .../protocol/LevelSoundEventPacket.java | 325 - .../protocol/LevelSoundEventPacketV1.java | 49 - .../protocol/LevelSoundEventPacketV2.java | 48 - .../nukkit/network/protocol/LoginPacket.java | 229 - .../protocol/MapCreateLockedCopyPacket.java | 27 - .../protocol/MapInfoRequestPacket.java | 28 - .../protocol/MobArmorEquipmentPacket.java | 42 - .../network/protocol/MobEffectPacket.java | 44 - .../network/protocol/MobEquipmentPacket.java | 44 - .../protocol/ModalFormRequestPacket.java | 28 - .../protocol/ModalFormResponsePacket.java | 27 - .../protocol/MoveEntityAbsolutePacket.java | 75 - .../protocol/MoveEntityDeltaPacket.java | 88 - .../network/protocol/MovePlayerPacket.java | 76 - .../network/protocol/NPCRequestPacket.java | 51 - .../NetworkChunkPublisherUpdatePacket.java | 31 - .../protocol/NetworkStackLatencyPacket.java | 31 - .../OnScreenTextureAnimationPacket.java | 24 - .../PacketViolationWarningPacket.java | 48 - .../network/protocol/PlaySoundPacket.java | 34 - .../network/protocol/PlayStatusPacket.java | 35 - .../network/protocol/PlayerActionPacket.java | 71 - .../protocol/PlayerArmorDamagePacket.java | 49 - .../protocol/PlayerEnchantOptionsPacket.java | 110 - .../network/protocol/PlayerHotbarPacket.java | 37 - .../network/protocol/PlayerInputPacket.java | 35 - .../network/protocol/PlayerListPacket.java | 109 - .../network/protocol/PlayerSkinPacket.java | 73 - .../nukkit/network/protocol/ProtocolInfo.java | 228 - .../network/protocol/RemoveEntityPacket.java | 30 - .../protocol/RequestChunkRadiusPacket.java | 29 - .../protocol/ResourcePackChunkDataPacket.java | 47 - .../ResourcePackChunkRequestPacket.java | 32 - .../ResourcePackClientResponsePacket.java | 56 - .../protocol/ResourcePackDataInfoPacket.java | 62 - .../protocol/ResourcePackStackPacket.java | 80 - .../protocol/ResourcePacksInfoPacket.java | 60 - .../network/protocol/RespawnPacket.java | 50 - .../network/protocol/RiderJumpPacket.java | 27 - .../protocol/ScriptCustomEventPacket.java | 30 - .../protocol/ServerSettingsRequestPacket.java | 22 - .../ServerSettingsResponsePacket.java | 28 - .../ServerToClientHandshakePacket.java | 26 - .../protocol/SetCommandsEnabledPacket.java | 26 - .../network/protocol/SetDifficultyPacket.java | 30 - .../network/protocol/SetEntityDataPacket.java | 38 - .../network/protocol/SetEntityLinkPacket.java | 40 - .../protocol/SetEntityMotionPacket.java | 34 - .../network/protocol/SetHealthPacket.java | 26 - .../network/protocol/SetLastHurtByPacket.java | 22 - .../SetLocalPlayerAsInitializedPacket.java | 26 - .../protocol/SetPlayerGameTypePacket.java | 31 - .../protocol/SetSpawnPositionPacket.java | 43 - .../network/protocol/SetTimePacket.java | 30 - .../network/protocol/SetTitlePacket.java | 59 - .../network/protocol/ShowCreditsPacket.java | 33 - .../network/protocol/ShowProfilePacket.java | 31 - .../network/protocol/SimpleEventPacket.java | 29 - .../protocol/SpawnExperienceOrbPacket.java | 30 - .../protocol/SpawnParticleEffectPacket.java | 35 - .../network/protocol/StartGamePacket.java | 232 - .../network/protocol/StopSoundPacket.java | 28 - .../protocol/StructureBlockUpdatePacket.java | 22 - .../protocol/SubClientLoginPacket.java | 22 - .../protocol/TakeItemEntityPacket.java | 30 - .../nukkit/network/protocol/TextPacket.java | 108 - .../network/protocol/TransferPacket.java | 30 - .../protocol/UpdateAttributesPacket.java | 48 - .../network/protocol/UpdateBlockPacket.java | 74 - .../protocol/UpdateEquipmentPacket.java | 34 - .../protocol/UpdatePlayerGameTypePacket.java | 43 - .../protocol/UpdateSoftEnumPacket.java | 40 - .../network/protocol/UpdateTradePacket.java | 56 - .../protocol/VideoStreamConnectPacket.java | 33 - .../protocol/types/CommandOriginData.java | 48 - .../network/protocol/types/ContainerIds.java | 18 - .../network/protocol/types/EntityLink.java | 22 - .../types/NetworkInventoryAction.java | 370 - .../cn/nukkit/network/query/QueryHandler.java | 113 - .../java/cn/nukkit/network/rcon/RCON.java | 69 - .../cn/nukkit/network/rcon/RCONCommand.java | 33 - .../cn/nukkit/network/rcon/RCONPacket.java | 67 - .../cn/nukkit/network/rcon/RCONServer.java | 219 - .../java/cn/nukkit/permission/BanEntry.java | 115 - .../java/cn/nukkit/permission/BanList.java | 141 - .../nukkit/permission/DefaultPermissions.java | 133 - .../cn/nukkit/permission/Permissible.java | 32 - .../cn/nukkit/permission/PermissibleBase.java | 170 - .../java/cn/nukkit/permission/Permission.java | 191 - .../permission/PermissionAttachment.java | 98 - .../permission/PermissionAttachmentInfo.java | 43 - .../permission/PermissionRemovedExecutor.java | 10 - .../cn/nukkit/permission/ServerOperator.java | 32 - .../java/cn/nukkit/plugin/EventExecutor.java | 14 - .../cn/nukkit/plugin/JavaPluginLoader.java | 163 - src/main/java/cn/nukkit/plugin/Library.java | 10 - .../nukkit/plugin/LibraryLoadException.java | 9 - .../java/cn/nukkit/plugin/LibraryLoader.java | 84 - .../cn/nukkit/plugin/MethodEventExecutor.java | 45 - src/main/java/cn/nukkit/plugin/Plugin.java | 279 - .../java/cn/nukkit/plugin/PluginBase.java | 294 - .../cn/nukkit/plugin/PluginClassLoader.java | 55 - .../cn/nukkit/plugin/PluginDescription.java | 388 -- .../cn/nukkit/plugin/PluginLoadOrder.java | 34 - .../java/cn/nukkit/plugin/PluginLoader.java | 135 - .../java/cn/nukkit/plugin/PluginLogger.java | 109 - .../java/cn/nukkit/plugin/PluginManager.java | 608 -- .../cn/nukkit/plugin/RegisteredListener.java | 63 - .../plugin/service/NKServiceManager.java | 140 - .../service/RegisteredServiceProvider.java | 69 - .../nukkit/plugin/service/ServiceManager.java | 62 - .../plugin/service/ServicePriority.java | 6 - src/main/java/cn/nukkit/potion/Effect.java | 321 - .../java/cn/nukkit/potion/InstantEffect.java | 16 - src/main/java/cn/nukkit/potion/Potion.java | 532 -- .../resourcepacks/AbstractResourcePack.java | 49 - .../resourcepacks/ChemistryResourcePack.java | 36 - .../cn/nukkit/resourcepacks/ResourcePack.java | 18 - .../resourcepacks/ResourcePackManager.java | 68 - .../resourcepacks/ZippedResourcePack.java | 95 - .../java/cn/nukkit/scheduler/AsyncPool.java | 35 - .../java/cn/nukkit/scheduler/AsyncTask.java | 92 - .../java/cn/nukkit/scheduler/AsyncWorker.java | 51 - .../scheduler/BlockUpdateScheduler.java | 138 - .../cn/nukkit/scheduler/FileWriteTask.java | 57 - .../cn/nukkit/scheduler/NukkitRunnable.java | 76 - .../java/cn/nukkit/scheduler/PluginTask.java | 61 - .../cn/nukkit/scheduler/ServerScheduler.java | 272 - src/main/java/cn/nukkit/scheduler/Task.java | 66 - .../java/cn/nukkit/scheduler/TaskHandler.java | 116 - .../nukkit/utils/AbstractEntitySpawner.java | 81 - .../java/cn/nukkit/utils/BannerPattern.java | 114 - src/main/java/cn/nukkit/utils/Binary.java | 559 -- .../java/cn/nukkit/utils/BinaryStream.java | 1255 ---- src/main/java/cn/nukkit/utils/BlockColor.java | 149 - .../java/cn/nukkit/utils/BlockIterator.java | 274 - .../cn/nukkit/utils/BlockUpdateEntry.java | 60 - .../java/cn/nukkit/utils/ChunkException.java | 22 - .../java/cn/nukkit/utils/ClientChainData.java | 311 - src/main/java/cn/nukkit/utils/Config.java | 645 -- .../java/cn/nukkit/utils/ConfigSection.java | 733 -- .../utils/DefaultPlayerDataSerializer.java | 43 - .../java/cn/nukkit/utils/DummyBossBar.java | 289 - src/main/java/cn/nukkit/utils/DyeColor.java | 120 - .../java/cn/nukkit/utils/EntitySpawner.java | 32 - .../java/cn/nukkit/utils/EventException.java | 59 - src/main/java/cn/nukkit/utils/Faceable.java | 16 - src/main/java/cn/nukkit/utils/Hash.java | 23 - .../java/cn/nukkit/utils/HastebinUtility.java | 80 - .../cn/nukkit/utils/IterableThreadLocal.java | 120 - src/main/java/cn/nukkit/utils/JsonUtil.java | 76 - .../java/cn/nukkit/utils/LevelException.java | 14 - .../java/cn/nukkit/utils/LevelTimings.java | 50 - src/main/java/cn/nukkit/utils/LogLevel.java | 54 - src/main/java/cn/nukkit/utils/Logger.java | 46 - .../java/cn/nukkit/utils/LoginChainData.java | 49 - src/main/java/cn/nukkit/utils/MainLogger.java | 116 - .../java/cn/nukkit/utils/MinecartType.java | 100 - .../java/cn/nukkit/utils/PersonaPiece.java | 24 - .../cn/nukkit/utils/PersonaPieceTint.java | 21 - .../cn/nukkit/utils/PlayerDataSerializer.java | 33 - .../java/cn/nukkit/utils/PluginException.java | 18 - src/main/java/cn/nukkit/utils/Rail.java | 177 - .../java/cn/nukkit/utils/SerializedImage.java | 50 - .../java/cn/nukkit/utils/ServerException.java | 18 - .../java/cn/nukkit/utils/ServerKiller.java | 31 - .../java/cn/nukkit/utils/SimpleConfig.java | 156 - .../java/cn/nukkit/utils/SkinAnimation.java | 22 - .../java/cn/nukkit/utils/SpawnerTask.java | 373 -- .../java/cn/nukkit/utils/TerracottaColor.java | 120 - src/main/java/cn/nukkit/utils/TextFormat.java | 286 - .../java/cn/nukkit/utils/ThreadCache.java | 92 - .../java/cn/nukkit/utils/ThreadStore.java | 15 - src/main/java/cn/nukkit/utils/Utils.java | 456 -- src/main/java/cn/nukkit/utils/VarInt.java | 233 - src/main/java/cn/nukkit/utils/Watchdog.java | 121 - src/main/java/cn/nukkit/utils/Zlib.java | 75 - .../java/cn/nukkit/utils/ZlibOriginal.java | 152 - .../java/cn/nukkit/utils/ZlibProvider.java | 23 - .../nukkit/utils/ZlibSingleThreadLowMem.java | 144 - .../java/cn/nukkit/utils/ZlibThreadLocal.java | 158 - .../utils/bugreport/BugReportGenerator.java | 129 - .../utils/bugreport/BugReportPlugin.java | 12 - .../utils/bugreport/ExceptionHandler.java | 34 - .../nukkit/utils/spawners/BlazeSpawner.java | 32 - .../nukkit/utils/spawners/ChickenSpawner.java | 35 - .../cn/nukkit/utils/spawners/CodSpawner.java | 36 - .../cn/nukkit/utils/spawners/CowSpawner.java | 35 - .../nukkit/utils/spawners/CreeperSpawner.java | 32 - .../nukkit/utils/spawners/DolphinSpawner.java | 36 - .../nukkit/utils/spawners/DonkeySpawner.java | 39 - .../nukkit/utils/spawners/DrownedSpawner.java | 37 - .../utils/spawners/EndermanSpawner.java | 39 - .../cn/nukkit/utils/spawners/FoxSpawner.java | 46 - .../nukkit/utils/spawners/GhastSpawner.java | 27 - .../nukkit/utils/spawners/HoglinSpawner.java | 35 - .../nukkit/utils/spawners/HorseSpawner.java | 39 - .../cn/nukkit/utils/spawners/HuskSpawner.java | 40 - .../utils/spawners/MagmaCubeSpawner.java | 30 - .../utils/spawners/MooshroomSpawner.java | 41 - .../nukkit/utils/spawners/OcelotSpawner.java | 43 - .../nukkit/utils/spawners/PandaSpawner.java | 41 - .../nukkit/utils/spawners/ParrotSpawner.java | 38 - .../nukkit/utils/spawners/PhantomSpawner.java | 33 - .../cn/nukkit/utils/spawners/PigSpawner.java | 35 - .../nukkit/utils/spawners/PiglinSpawner.java | 36 - .../utils/spawners/PolarBearSpawner.java | 37 - .../utils/spawners/PufferfishSpawner.java | 41 - .../nukkit/utils/spawners/RabbitSpawner.java | 38 - .../nukkit/utils/spawners/SalmonSpawner.java | 36 - .../nukkit/utils/spawners/SheepSpawner.java | 35 - .../utils/spawners/SkeletonSpawner.java | 33 - .../nukkit/utils/spawners/SlimeSpawner.java | 34 - .../nukkit/utils/spawners/SpiderSpawner.java | 32 - .../nukkit/utils/spawners/SquidSpawner.java | 35 - .../nukkit/utils/spawners/StraySpawner.java | 34 - .../utils/spawners/TropicalFishSpawner.java | 36 - .../nukkit/utils/spawners/TurtleSpawner.java | 40 - .../nukkit/utils/spawners/WitchSpawner.java | 38 - .../utils/spawners/WitherSkeletonSpawner.java | 35 - .../cn/nukkit/utils/spawners/WolfSpawner.java | 30 - .../utils/spawners/ZombiePigmanSpawner.java | 36 - .../nukkit/utils/spawners/ZombieSpawner.java | 47 - .../aikar/timings/FullServerTickTiming.java | 108 - src/main/java/co/aikar/timings/Timing.java | 169 - .../java/co/aikar/timings/TimingData.java | 92 - .../co/aikar/timings/TimingIdentifier.java | 81 - src/main/java/co/aikar/timings/Timings.java | 258 - .../java/co/aikar/timings/TimingsExport.java | 261 - .../java/co/aikar/timings/TimingsHistory.java | 217 - .../co/aikar/timings/TimingsHistoryEntry.java | 50 - .../java/co/aikar/timings/TimingsManager.java | 135 - .../com/nukkitx/network/NetworkUtils.java | 63 - .../nukkitx/network/SessionConnection.java | 26 - .../network/raknet/EncapsulatedPacket.java | 139 - .../com/nukkitx/network/raknet/RakNet.java | 90 - .../network/raknet/RakNetConstants.java | 108 - .../network/raknet/RakNetDatagram.java | 98 - .../network/raknet/RakNetPriority.java | 9 - .../network/raknet/RakNetReliability.java | 52 - .../nukkitx/network/raknet/RakNetServer.java | 228 - .../network/raknet/RakNetServerListener.java | 57 - .../network/raknet/RakNetServerSession.java | 153 - .../nukkitx/network/raknet/RakNetSession.java | 909 --- .../network/raknet/RakNetSessionListener.java | 18 - .../network/raknet/RakNetSlidingWindow.java | 125 - .../nukkitx/network/raknet/RakNetState.java | 10 - .../nukkitx/network/raknet/RakNetUtils.java | 81 - .../raknet/pipeline/RakExceptionHandler.java | 17 - .../raknet/pipeline/RakOutboundHandler.java | 15 - .../pipeline/ServerDatagramHandler.java | 86 - .../raknet/pipeline/ServerMessageHandler.java | 34 - .../nukkitx/network/raknet/util/BitQueue.java | 135 - .../raknet/util/FastBinaryMinHeap.java | 172 - .../nukkitx/network/raknet/util/IntRange.java | 19 - .../network/raknet/util/RoundRobinArray.java | 42 - .../raknet/util/RoundRobinIterator.java | 29 - .../raknet/util/SplitPacketHelper.java | 68 - .../com/nukkitx/network/util/Bootstraps.java | 121 - .../network/util/DisconnectReason.java | 15 - .../com/nukkitx/network/util/EventLoops.java | 78 - .../network/util/NetworkThreadFactory.java | 43 - .../nukkitx/network/util/Preconditions.java | 1422 ---- src/main/resources/biome_definitions_361.dat | Bin 3413 -> 0 bytes src/main/resources/creativeitems137.json | 1 - src/main/resources/creativeitems274.json | 1 - src/main/resources/creativeitems291.json | 1 - src/main/resources/creativeitems313.json | 1 - src/main/resources/creativeitems332.json | 1 - src/main/resources/creativeitems340.json | 1 - src/main/resources/creativeitems354.json | 1 - src/main/resources/creativeitems389.json | 1 - src/main/resources/creativeitems407.json | 1 - src/main/resources/creativeitems440.json | 1 - src/main/resources/creativeitems448.json | 1 - src/main/resources/creativeitems465.json | 1 - src/main/resources/creativeitems471.json | 1 - src/main/resources/entity_identifiers_419.dat | Bin 7193 -> 0 bytes src/main/resources/extras_407.json | 1 - src/main/resources/item_mappings.json | 127 - src/main/resources/lang/eng/lang.ini | 356 - src/main/resources/legacy_item_ids.json | 810 --- src/main/resources/log4j2.xml | 21 - src/main/resources/recipes313.json | 1 - src/main/resources/recipes332.json | 1 - src/main/resources/recipes388.json | 1 - .../resources/runtime_block_states_388.dat | Bin 318311 -> 0 bytes .../resources/runtime_block_states_389.dat | Bin 379861 -> 0 bytes .../resources/runtime_block_states_407.dat | Bin 405618 -> 0 bytes .../resources/runtime_block_states_419.dat | Bin 431009 -> 0 bytes .../resources/runtime_block_states_428.dat | Bin 430907 -> 0 bytes .../resources/runtime_block_states_440.dat | Bin 430907 -> 0 bytes .../resources/runtime_block_states_448.dat | Bin 430907 -> 0 bytes .../resources/runtime_block_states_465.dat | Bin 431099 -> 0 bytes .../resources/runtime_block_states_471.dat | Bin 431099 -> 0 bytes .../resources/runtime_item_states_361.json | 1 - .../resources/runtime_item_states_419.json | 1 - .../resources/runtime_item_states_440.json | 1 - .../resources/runtime_item_states_448.json | 1 - src/main/resources/runtimeid_table_223.json | 1 - src/main/resources/runtimeid_table_261.json | 1 - src/main/resources/runtimeid_table_274.json | 1 - src/main/resources/runtimeid_table_282.json | 1 - src/main/resources/runtimeid_table_291.json | 1 - src/main/resources/runtimeid_table_313.json | 1 - src/main/resources/runtimeid_table_332.json | 1 - src/main/resources/runtimeid_table_340.json | 1 - src/main/resources/runtimeid_table_354.json | 1 - src/main/resources/runtimeid_table_361.json | 1 - 1795 files changed, 3 insertions(+), 158568 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 Jenkinsfile delete mode 100644 pom.xml delete mode 100644 src/main/java/cn/nukkit/Achievement.java delete mode 100644 src/main/java/cn/nukkit/AdventureSettings.java delete mode 100644 src/main/java/cn/nukkit/IPlayer.java delete mode 100644 src/main/java/cn/nukkit/InterruptibleThread.java delete mode 100644 src/main/java/cn/nukkit/Nukkit.java delete mode 100644 src/main/java/cn/nukkit/OfflinePlayer.java delete mode 100644 src/main/java/cn/nukkit/Player.java delete mode 100644 src/main/java/cn/nukkit/PlayerFood.java delete mode 100644 src/main/java/cn/nukkit/Server.java delete mode 100644 src/main/java/cn/nukkit/api/API.java delete mode 100644 src/main/java/cn/nukkit/block/Block.java delete mode 100644 src/main/java/cn/nukkit/block/BlockAir.java delete mode 100644 src/main/java/cn/nukkit/block/BlockAnvil.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBanner.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBeacon.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBed.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBedrock.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBedrockInvisible.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBeetroot.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBookshelf.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBrewingStand.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBricks.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBricksEndStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBricksNether.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBricksRedNether.java delete mode 100644 src/main/java/cn/nukkit/block/BlockBricksStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockButton.java delete mode 100644 src/main/java/cn/nukkit/block/BlockButtonStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockButtonWooden.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCactus.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCake.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCarpet.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCarrot.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCauldron.java delete mode 100644 src/main/java/cn/nukkit/block/BlockChemicalHeat.java delete mode 100644 src/main/java/cn/nukkit/block/BlockChemistryTable.java delete mode 100644 src/main/java/cn/nukkit/block/BlockChest.java delete mode 100644 src/main/java/cn/nukkit/block/BlockChorusFlower.java delete mode 100644 src/main/java/cn/nukkit/block/BlockChorusPlant.java delete mode 100644 src/main/java/cn/nukkit/block/BlockClay.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCoal.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCobblestone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCobweb.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCocoa.java delete mode 100644 src/main/java/cn/nukkit/block/BlockColoredTorchBP.java delete mode 100644 src/main/java/cn/nukkit/block/BlockColoredTorchRG.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCommandBlock.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCommandBlockChain.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCommandBlockRepeating.java delete mode 100644 src/main/java/cn/nukkit/block/BlockConcrete.java delete mode 100644 src/main/java/cn/nukkit/block/BlockConcretePowder.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCraftingTable.java delete mode 100644 src/main/java/cn/nukkit/block/BlockCrops.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDandelion.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDaylightDetector.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDaylightDetectorInverted.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDeadBush.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDiamond.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDirt.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDispenser.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoor.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoorAcacia.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoorBirch.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoorDarkOak.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoorIron.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoorJungle.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoorSpruce.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoorWood.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoublePlant.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoubleSlab.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoubleSlabRedSandstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoubleSlabStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDoubleSlabWood.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDragonEgg.java delete mode 100644 src/main/java/cn/nukkit/block/BlockDropper.java delete mode 100644 src/main/java/cn/nukkit/block/BlockEmerald.java delete mode 100644 src/main/java/cn/nukkit/block/BlockEnchantingTable.java delete mode 100644 src/main/java/cn/nukkit/block/BlockEndGateway.java delete mode 100644 src/main/java/cn/nukkit/block/BlockEndPortal.java delete mode 100644 src/main/java/cn/nukkit/block/BlockEndPortalFrame.java delete mode 100644 src/main/java/cn/nukkit/block/BlockEndRod.java delete mode 100644 src/main/java/cn/nukkit/block/BlockEndStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockEnderChest.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFallable.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFallableMeta.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFarmland.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFence.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFenceGate.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFenceGateAcacia.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFenceGateBirch.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFenceGateDarkOak.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFenceGateJungle.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFenceGateSpruce.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFenceNetherBrick.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFire.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFlowable.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFlower.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFlowerPot.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFurnace.java delete mode 100644 src/main/java/cn/nukkit/block/BlockFurnaceBurning.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGlass.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGlassPane.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGlassPaneStained.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGlassStained.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGlowStick.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGlowstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGold.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGrass.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGrassPath.java delete mode 100644 src/main/java/cn/nukkit/block/BlockGravel.java delete mode 100644 src/main/java/cn/nukkit/block/BlockHardGlass.java delete mode 100644 src/main/java/cn/nukkit/block/BlockHardGlassPane.java delete mode 100644 src/main/java/cn/nukkit/block/BlockHardGlassPaneStained.java delete mode 100644 src/main/java/cn/nukkit/block/BlockHardGlassStained.java delete mode 100644 src/main/java/cn/nukkit/block/BlockHayBale.java delete mode 100644 src/main/java/cn/nukkit/block/BlockHopper.java delete mode 100644 src/main/java/cn/nukkit/block/BlockHugeMushroomBrown.java delete mode 100644 src/main/java/cn/nukkit/block/BlockHugeMushroomRed.java delete mode 100644 src/main/java/cn/nukkit/block/BlockID.java delete mode 100644 src/main/java/cn/nukkit/block/BlockIce.java delete mode 100644 src/main/java/cn/nukkit/block/BlockIceFrosted.java delete mode 100644 src/main/java/cn/nukkit/block/BlockIcePacked.java delete mode 100644 src/main/java/cn/nukkit/block/BlockInfoUpdate.java delete mode 100644 src/main/java/cn/nukkit/block/BlockInfoUpdate2.java delete mode 100644 src/main/java/cn/nukkit/block/BlockIron.java delete mode 100644 src/main/java/cn/nukkit/block/BlockIronBars.java delete mode 100644 src/main/java/cn/nukkit/block/BlockItemFrame.java delete mode 100644 src/main/java/cn/nukkit/block/BlockJukebox.java delete mode 100644 src/main/java/cn/nukkit/block/BlockLadder.java delete mode 100644 src/main/java/cn/nukkit/block/BlockLapis.java delete mode 100644 src/main/java/cn/nukkit/block/BlockLava.java delete mode 100644 src/main/java/cn/nukkit/block/BlockLavaStill.java delete mode 100644 src/main/java/cn/nukkit/block/BlockLeaves.java delete mode 100644 src/main/java/cn/nukkit/block/BlockLeaves2.java delete mode 100644 src/main/java/cn/nukkit/block/BlockLever.java delete mode 100644 src/main/java/cn/nukkit/block/BlockLiquid.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMagma.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMelon.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMeta.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMobSpawner.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMonsterEgg.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMossStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMushroom.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMushroomBrown.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMushroomRed.java delete mode 100644 src/main/java/cn/nukkit/block/BlockMycelium.java delete mode 100644 src/main/java/cn/nukkit/block/BlockNetherBrick.java delete mode 100644 src/main/java/cn/nukkit/block/BlockNetherPortal.java delete mode 100644 src/main/java/cn/nukkit/block/BlockNetherReactor.java delete mode 100644 src/main/java/cn/nukkit/block/BlockNetherWart.java delete mode 100644 src/main/java/cn/nukkit/block/BlockNetherWartBlock.java delete mode 100644 src/main/java/cn/nukkit/block/BlockNetherrack.java delete mode 100644 src/main/java/cn/nukkit/block/BlockNoteblock.java delete mode 100644 src/main/java/cn/nukkit/block/BlockObserver.java delete mode 100644 src/main/java/cn/nukkit/block/BlockObsidian.java delete mode 100644 src/main/java/cn/nukkit/block/BlockObsidianGlowing.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreCoal.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreDiamond.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreEmerald.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreGold.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreIron.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreLapis.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreQuartz.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreRedstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockOreRedstoneGlowing.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPiston.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPistonBase.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPistonExtension.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPistonHead.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPistonSticky.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPlanks.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPodzol.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPotato.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPressurePlateBase.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPressurePlateStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPressurePlateWood.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPrismarine.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPumpkin.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPumpkinLit.java delete mode 100644 src/main/java/cn/nukkit/block/BlockPurpur.java delete mode 100644 src/main/java/cn/nukkit/block/BlockQuartz.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRail.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRailActivator.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRailDetector.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRailPowered.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedSandstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneComparator.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneComparatorPowered.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneComparatorUnpowered.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneDiode.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneLamp.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneLampLit.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneRepeaterPowered.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneRepeaterUnpowered.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneTorch.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneTorchUnlit.java delete mode 100644 src/main/java/cn/nukkit/block/BlockRedstoneWire.java delete mode 100644 src/main/java/cn/nukkit/block/BlockReserved6.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSand.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSandstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSapling.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSeaLantern.java delete mode 100644 src/main/java/cn/nukkit/block/BlockShulkerBox.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSignPost.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSkull.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSlab.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSlabRedSandstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSlabStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSlabWood.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSlime.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSnow.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSnowLayer.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSolid.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSolidMeta.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSoulSand.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSponge.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairs.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsAcacia.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsBirch.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsBrick.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsCobblestone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsDarkOak.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsJungle.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsNetherBrick.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsPurpur.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsQuartz.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsRedSandstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsSandstone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsSpruce.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsStoneBrick.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStairsWood.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStemMelon.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStemPumpkin.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStone.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStonecutter.java delete mode 100644 src/main/java/cn/nukkit/block/BlockStructureBlock.java delete mode 100644 src/main/java/cn/nukkit/block/BlockSugarcane.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTNT.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTallGrass.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracotta.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazed.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedBlack.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedBlue.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedBrown.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedCyan.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedGray.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedGreen.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedLightBlue.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedLime.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedMagenta.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedOrange.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedPink.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedPurple.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedRed.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedSilver.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedWhite.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaGlazedYellow.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTerracottaStained.java delete mode 100644 src/main/java/cn/nukkit/block/BlockThin.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTorch.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTransparent.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTransparentMeta.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTrapdoor.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTrapdoorIron.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTrappedChest.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTripWire.java delete mode 100644 src/main/java/cn/nukkit/block/BlockTripWireHook.java delete mode 100644 src/main/java/cn/nukkit/block/BlockUnderwaterTorch.java delete mode 100644 src/main/java/cn/nukkit/block/BlockUndyedShulkerBox.java delete mode 100644 src/main/java/cn/nukkit/block/BlockUnknown.java delete mode 100644 src/main/java/cn/nukkit/block/BlockVine.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWall.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWallBanner.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWallSign.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWater.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWaterLily.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWaterStill.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWeightedPressurePlateHeavy.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWeightedPressurePlateLight.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWheat.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWood.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWood2.java delete mode 100644 src/main/java/cn/nukkit/block/BlockWool.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntity.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityBanner.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityBeacon.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityBed.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityBrewingStand.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityCauldron.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityChest.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityComparator.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityContainer.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityDispenser.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityDropper.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityEnchantTable.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityEnderChest.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityFlowerPot.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityFurnace.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityHopper.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityItemFrame.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityJukebox.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityMusic.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityNameable.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntityShulkerBox.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntitySign.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntitySkull.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntitySpawnable.java delete mode 100644 src/main/java/cn/nukkit/blockentity/BlockEntitySpawner.java delete mode 100644 src/main/java/cn/nukkit/command/Command.java delete mode 100644 src/main/java/cn/nukkit/command/CommandExecutor.java delete mode 100644 src/main/java/cn/nukkit/command/CommandMap.java delete mode 100644 src/main/java/cn/nukkit/command/CommandSender.java delete mode 100644 src/main/java/cn/nukkit/command/ConsoleCommandSender.java delete mode 100644 src/main/java/cn/nukkit/command/FormattedCommandAlias.java delete mode 100644 src/main/java/cn/nukkit/command/PluginCommand.java delete mode 100644 src/main/java/cn/nukkit/command/PluginIdentifiableCommand.java delete mode 100644 src/main/java/cn/nukkit/command/RemoteConsoleCommandSender.java delete mode 100644 src/main/java/cn/nukkit/command/SimpleCommandMap.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandArgs.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandData.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandDataVersions.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandEnum.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandInput.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandOutput.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandOverload.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandParamType.java delete mode 100644 src/main/java/cn/nukkit/command/data/CommandParameter.java delete mode 100644 src/main/java/cn/nukkit/command/data/args/CommandArg.java delete mode 100644 src/main/java/cn/nukkit/command/data/args/CommandArgBlockVector.java delete mode 100644 src/main/java/cn/nukkit/command/data/args/CommandArgRules.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/BanCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/BanIpCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/BanListCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/DebugPasteCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/DefaultGamemodeCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/DeopCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/DifficultyCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/EffectCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/EnchantCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/GamemodeCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/GameruleCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/GarbageCollectorCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/GenerateWorldCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/GiveCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/HelpCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/KickCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/KillCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/ListCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/MeCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/OpCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/PardonCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/PardonIpCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/ParticleCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/PlaySoundCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/PluginsCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/ReloadCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SaveCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SaveOffCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SaveOnCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SayCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SeedCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SetWorldSpawnCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SpawnCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SpawnpointCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/StatusCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/StopCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/SummonCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/TeleportCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/TellCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/TimeCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/TimingsCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/TitleCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/TransferServerCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/VanillaCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/VersionCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/WeatherCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/WhitelistCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/WorldCommand.java delete mode 100644 src/main/java/cn/nukkit/command/defaults/XpCommand.java delete mode 100644 src/main/java/cn/nukkit/command/simple/Arguments.java delete mode 100644 src/main/java/cn/nukkit/command/simple/Command.java delete mode 100644 src/main/java/cn/nukkit/command/simple/CommandParameters.java delete mode 100644 src/main/java/cn/nukkit/command/simple/CommandPermission.java delete mode 100644 src/main/java/cn/nukkit/command/simple/ForbidConsole.java delete mode 100644 src/main/java/cn/nukkit/command/simple/Parameter.java delete mode 100644 src/main/java/cn/nukkit/command/simple/Parameters.java delete mode 100644 src/main/java/cn/nukkit/command/simple/SimpleCommand.java delete mode 100644 src/main/java/cn/nukkit/console/NukkitConsole.java delete mode 100644 src/main/java/cn/nukkit/console/NukkitConsoleCompleter.java delete mode 100644 src/main/java/cn/nukkit/dispenser/BoatDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/BucketDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/DefaultDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/DispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/DispenseBehaviorRegister.java delete mode 100644 src/main/java/cn/nukkit/dispenser/DyeDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/FireChargeDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/FireworksDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/FlintAndSteelDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/ProjectileDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/ShulkerBoxDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/SpawnEggDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/dispenser/TNTDispenseBehavior.java delete mode 100644 src/main/java/cn/nukkit/entity/Attribute.java delete mode 100644 src/main/java/cn/nukkit/entity/BaseEntity.java delete mode 100644 src/main/java/cn/nukkit/entity/Entity.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityAgeable.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityArthropod.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityBoss.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityControllable.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityCreature.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityDamageable.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityExplosive.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityFlying.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityHanging.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityHuman.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityHumanType.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityInteractable.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityJumping.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityLiving.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityOwnable.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityRideable.java delete mode 100644 src/main/java/cn/nukkit/entity/EntitySmite.java delete mode 100644 src/main/java/cn/nukkit/entity/EntitySwimming.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityTameable.java delete mode 100644 src/main/java/cn/nukkit/entity/EntityWalking.java delete mode 100644 src/main/java/cn/nukkit/entity/data/ByteEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/EntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/EntityMetadata.java delete mode 100644 src/main/java/cn/nukkit/entity/data/FloatEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/IntEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/IntPositionEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/LongEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/NBTEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/ShortEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/Skin.java delete mode 100644 src/main/java/cn/nukkit/entity/data/StringEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/data/Vector3fEntityData.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityArmorStand.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityBoat.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityEndCrystal.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityExpBottle.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityFallingBlock.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityFirework.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityFishingHook.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityItem.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityMinecartAbstract.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityMinecartChest.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityMinecartEmpty.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityMinecartHopper.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityMinecartTNT.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityPainting.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityPotion.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityPotionLingering.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityPrimedTNT.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityVehicle.java delete mode 100644 src/main/java/cn/nukkit/entity/item/EntityXPOrb.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityBlaze.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityCaveSpider.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityCreeper.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityDrowned.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityElderGuardian.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityEnderDragon.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityEnderman.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityEndermite.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityEvoker.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityFlyingMob.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityGhast.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityGuardian.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityHoglin.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityHusk.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityJumpingMob.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityMagmaCube.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityMob.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityPhantom.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityPiglin.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityPiglinBrute.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityPillager.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityRavager.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityShulker.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntitySilverfish.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntitySkeleton.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntitySlime.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntitySpider.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityStray.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntitySwimmingMob.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityTameableMob.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityVex.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityVindicator.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityWalkingMob.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityWitch.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityWither.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityWitherSkeleton.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityWolf.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityZoglin.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityZombie.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityZombiePigman.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityZombieVillager.java delete mode 100644 src/main/java/cn/nukkit/entity/mob/EntityZombieVillagerV2.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityAnimal.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityAxolotl.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityBat.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityBee.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityCat.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityChicken.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityCod.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityCow.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityDolphin.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityDonkey.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityFish.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityFlyingAnimal.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityFox.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityGlowSquid.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityGoat.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityHorse.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityHorseBase.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityIronGolem.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityJumpingAnimal.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityLlama.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityMooshroom.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityMule.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityNPC.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityOcelot.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityPanda.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityParrot.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityPig.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityPolarBear.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityPufferfish.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityRabbit.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntitySalmon.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntitySheep.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntitySkeletonHorse.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntitySnowGolem.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntitySquid.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityStrider.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityTameable.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityTameableAnimal.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityTropicalFish.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityTurtle.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityVillager.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityVillagerV2.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityWalkingAnimal.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityWanderingTrader.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityWaterAnimal.java delete mode 100644 src/main/java/cn/nukkit/entity/passive/EntityZombieHorse.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityArrow.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityBlazeFireBall.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityBlueWitherSkull.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityEgg.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityEnderCharge.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityEnderPearl.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityEvocationFangs.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityGhastFireBall.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityLlamaSpit.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityProjectile.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityShulkerBullet.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntitySnowball.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityThrownTrident.java delete mode 100644 src/main/java/cn/nukkit/entity/projectile/EntityWitherSkull.java delete mode 100644 src/main/java/cn/nukkit/entity/weather/EntityLightning.java delete mode 100644 src/main/java/cn/nukkit/entity/weather/EntityLightningStrike.java delete mode 100644 src/main/java/cn/nukkit/entity/weather/EntityWeather.java delete mode 100644 src/main/java/cn/nukkit/event/Cancellable.java delete mode 100644 src/main/java/cn/nukkit/event/Event.java delete mode 100644 src/main/java/cn/nukkit/event/EventHandler.java delete mode 100644 src/main/java/cn/nukkit/event/EventPriority.java delete mode 100644 src/main/java/cn/nukkit/event/HandlerList.java delete mode 100644 src/main/java/cn/nukkit/event/Listener.java delete mode 100644 src/main/java/cn/nukkit/event/block/AnvilDamageEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockBreakEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockBurnEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockFadeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockFallEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockFormEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockFromToEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockGrowEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockIgniteEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockPistonChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockPlaceEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockRedstoneEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockSpreadEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/BlockUpdateEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/DoorToggleEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/ItemFrameDropItemEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/LeavesDecayEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/LiquidFlowEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/SignChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/block/WaterFrostEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/CreatureSpawnEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/CreeperPowerEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityArmorChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityBlockChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityCombustByBlockEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityCombustByEntityEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityCombustEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityDamageBlockedEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityDamageByBlockEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityDamageByChildEntityEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityDamageByEntityEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityDeathEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityDespawnEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityExplodeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityExplosionPrimeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityInteractEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityInventoryChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityLevelChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityMotionEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityPortalEnterEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityRegainHealthEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityShootBowEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntitySpawnEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityTeleportEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityVehicleEnterEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/EntityVehicleExitEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/ExplosionPrimeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/ItemDespawnEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/ItemSpawnEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/ProjectileHitEvent.java delete mode 100644 src/main/java/cn/nukkit/event/entity/ProjectileLaunchEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/BrewEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/CraftItemEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/EnchantItemEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/FurnaceBurnEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/FurnaceSmeltEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryClickEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryCloseEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryMoveItemEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryOpenEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryPickupArrowEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryPickupItemEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryPickupTridentEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/InventoryTransactionEvent.java delete mode 100644 src/main/java/cn/nukkit/event/inventory/StartBrewEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/ChunkEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/ChunkLoadEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/ChunkPopulateEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/ChunkUnloadEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/LevelEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/LevelInitEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/LevelLoadEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/LevelSaveEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/LevelUnloadEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/SpawnChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/StructureGrowEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/ThunderChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/WeatherChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/level/WeatherEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/CraftingTableOpenEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerAchievementAwardedEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerAnimationEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerAsyncPreLoginEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerBedEnterEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerBedLeaveEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerBlockPickEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerBucketEmptyEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerBucketEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerBucketFillEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerChangeSkinEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerChatEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerChunkRequestEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerCommandPreprocessEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerCreationEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerDeathEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerDropItemEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerEatFoodEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerEditBookEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerFishEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerFoodLevelChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerFormRespondedEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerGameModeChangeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerGlassBottleFillEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerInitializedEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerInteractEntityEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerInteractEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerInvalidMoveEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerItemConsumeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerItemHeldEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerJoinEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerJumpEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerKickEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerLocallyInitializedEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerLoginEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerMapInfoRequestEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerMessageEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerMouseOverEntityEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerMoveEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerPreLoginEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerQuitEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerRespawnEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerServerSettingsRequestEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerSettingsRespondedEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerTeleportEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerToggleFlightEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerToggleGlideEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerToggleSneakEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerToggleSprintEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/PlayerToggleSwimEvent.java delete mode 100644 src/main/java/cn/nukkit/event/player/RepairItemEvent.java delete mode 100644 src/main/java/cn/nukkit/event/plugin/PluginDisableEvent.java delete mode 100644 src/main/java/cn/nukkit/event/plugin/PluginEnableEvent.java delete mode 100644 src/main/java/cn/nukkit/event/plugin/PluginEvent.java delete mode 100644 src/main/java/cn/nukkit/event/potion/PotionApplyEvent.java delete mode 100644 src/main/java/cn/nukkit/event/potion/PotionCollideEvent.java delete mode 100644 src/main/java/cn/nukkit/event/potion/PotionEvent.java delete mode 100644 src/main/java/cn/nukkit/event/redstone/RedstoneUpdateEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/BatchPacketsEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/DataPacketReceiveEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/DataPacketSendEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/PlayerDataSerializeEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/QueryRegenerateEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/RemoteServerCommandEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/ServerCommandEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/ServerEvent.java delete mode 100644 src/main/java/cn/nukkit/event/server/ServerStopEvent.java delete mode 100644 src/main/java/cn/nukkit/event/vehicle/EntityEnterVehicleEvent.java delete mode 100644 src/main/java/cn/nukkit/event/vehicle/EntityExitVehicleEvent.java delete mode 100644 src/main/java/cn/nukkit/event/vehicle/VehicleCreateEvent.java delete mode 100644 src/main/java/cn/nukkit/event/vehicle/VehicleDamageEvent.java delete mode 100644 src/main/java/cn/nukkit/event/vehicle/VehicleDestroyEvent.java delete mode 100644 src/main/java/cn/nukkit/event/vehicle/VehicleEvent.java delete mode 100644 src/main/java/cn/nukkit/event/vehicle/VehicleMoveEvent.java delete mode 100644 src/main/java/cn/nukkit/event/vehicle/VehicleUpdateEvent.java delete mode 100644 src/main/java/cn/nukkit/event/weather/LightningStrikeEvent.java delete mode 100644 src/main/java/cn/nukkit/form/element/Element.java delete mode 100644 src/main/java/cn/nukkit/form/element/ElementButton.java delete mode 100644 src/main/java/cn/nukkit/form/element/ElementButtonImageData.java delete mode 100644 src/main/java/cn/nukkit/form/element/ElementDropdown.java delete mode 100644 src/main/java/cn/nukkit/form/element/ElementInput.java delete mode 100644 src/main/java/cn/nukkit/form/element/ElementLabel.java delete mode 100644 src/main/java/cn/nukkit/form/element/ElementSlider.java delete mode 100644 src/main/java/cn/nukkit/form/element/ElementStepSlider.java delete mode 100644 src/main/java/cn/nukkit/form/element/ElementToggle.java delete mode 100644 src/main/java/cn/nukkit/form/response/FormResponse.java delete mode 100644 src/main/java/cn/nukkit/form/response/FormResponseCustom.java delete mode 100644 src/main/java/cn/nukkit/form/response/FormResponseData.java delete mode 100644 src/main/java/cn/nukkit/form/response/FormResponseModal.java delete mode 100644 src/main/java/cn/nukkit/form/response/FormResponseSimple.java delete mode 100644 src/main/java/cn/nukkit/form/window/FormWindow.java delete mode 100644 src/main/java/cn/nukkit/form/window/FormWindowCustom.java delete mode 100644 src/main/java/cn/nukkit/form/window/FormWindowModal.java delete mode 100644 src/main/java/cn/nukkit/form/window/FormWindowSimple.java delete mode 100644 src/main/java/cn/nukkit/inventory/AnvilInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/BaseInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/BeaconInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/BigCraftingGrid.java delete mode 100644 src/main/java/cn/nukkit/inventory/BrewingInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/BrewingRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/ChestInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/ContainerInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/ContainerRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/CraftingGrid.java delete mode 100644 src/main/java/cn/nukkit/inventory/CraftingManager.java delete mode 100644 src/main/java/cn/nukkit/inventory/CraftingRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/CustomInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/DispenserInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/DoubleChestInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/DropperInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/EnchantInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/EntityArmorInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/EntityEquipmentInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/FakeBlockMenu.java delete mode 100644 src/main/java/cn/nukkit/inventory/FakeBlockUIComponent.java delete mode 100644 src/main/java/cn/nukkit/inventory/Fuel.java delete mode 100644 src/main/java/cn/nukkit/inventory/FurnaceInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/FurnaceRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/HopperInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/Inventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/InventoryHolder.java delete mode 100644 src/main/java/cn/nukkit/inventory/InventoryType.java delete mode 100644 src/main/java/cn/nukkit/inventory/MinecartChestInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/MinecartHopperInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/MixRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/MultiRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/PlayerCursorInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/PlayerEnderChestInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/PlayerInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/PlayerOffhandInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/PlayerUIComponent.java delete mode 100644 src/main/java/cn/nukkit/inventory/PlayerUIInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/Recipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/RecipeType.java delete mode 100644 src/main/java/cn/nukkit/inventory/ShapedRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/ShapelessRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/ShulkerBoxInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/TradeInventory.java delete mode 100644 src/main/java/cn/nukkit/inventory/TradeInventoryRecipe.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/CraftingTransaction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/EnchantTransaction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/InventoryTransaction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/RepairItemTransaction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/action/CraftingTakeResultAction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/action/CraftingTransferMaterialAction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/action/CreativeInventoryAction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/action/DropItemAction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/action/EnchantingAction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/action/InventoryAction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/action/RepairItemAction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/action/SlotChangeAction.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/data/ReleaseItemData.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/data/TransactionData.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/data/UseItemData.java delete mode 100644 src/main/java/cn/nukkit/inventory/transaction/data/UseItemOnEntityData.java delete mode 100644 src/main/java/cn/nukkit/item/Item.java delete mode 100644 src/main/java/cn/nukkit/item/ItemApple.java delete mode 100644 src/main/java/cn/nukkit/item/ItemAppleGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemAppleGoldEnchanted.java delete mode 100644 src/main/java/cn/nukkit/item/ItemArmor.java delete mode 100644 src/main/java/cn/nukkit/item/ItemArmorStand.java delete mode 100644 src/main/java/cn/nukkit/item/ItemArrow.java delete mode 100644 src/main/java/cn/nukkit/item/ItemAxeDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemAxeGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemAxeIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemAxeNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemAxeStone.java delete mode 100644 src/main/java/cn/nukkit/item/ItemAxeWood.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBanner.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBannerPattern.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBed.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBeefRaw.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBeetroot.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBeetrootSoup.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBlazePowder.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBlazeRod.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBlock.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBoat.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBone.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBook.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBookAndQuill.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBookEnchanted.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBookWritable.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBookWritten.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBootsChain.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBootsDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBootsGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBootsIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBootsLeather.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBootsNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBow.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBowl.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBread.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBrewingStand.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBrick.java delete mode 100644 src/main/java/cn/nukkit/item/ItemBucket.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCactus.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCake.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCarrot.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCarrotGolden.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCarrotOnAStick.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCauldron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChestplateChain.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChestplateDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChestplateGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChestplateIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChestplateLeather.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChestplateNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChickenCooked.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChickenRaw.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChorusFruit.java delete mode 100644 src/main/java/cn/nukkit/item/ItemChorusFruitPopped.java delete mode 100644 src/main/java/cn/nukkit/item/ItemClay.java delete mode 100644 src/main/java/cn/nukkit/item/ItemClock.java delete mode 100644 src/main/java/cn/nukkit/item/ItemClownfish.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCoal.java delete mode 100644 src/main/java/cn/nukkit/item/ItemColorArmor.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCompass.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCookie.java delete mode 100644 src/main/java/cn/nukkit/item/ItemCrossbow.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDoorAcacia.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDoorBirch.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDoorDarkOak.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDoorIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDoorJungle.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDoorSpruce.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDoorWood.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDragonBreath.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDriedKelp.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDurable.java delete mode 100644 src/main/java/cn/nukkit/item/ItemDye.java delete mode 100644 src/main/java/cn/nukkit/item/ItemEdible.java delete mode 100644 src/main/java/cn/nukkit/item/ItemEgg.java delete mode 100644 src/main/java/cn/nukkit/item/ItemElytra.java delete mode 100644 src/main/java/cn/nukkit/item/ItemEmerald.java delete mode 100644 src/main/java/cn/nukkit/item/ItemEmptyMap.java delete mode 100644 src/main/java/cn/nukkit/item/ItemEndCrystal.java delete mode 100644 src/main/java/cn/nukkit/item/ItemEnderEye.java delete mode 100644 src/main/java/cn/nukkit/item/ItemEnderPearl.java delete mode 100644 src/main/java/cn/nukkit/item/ItemExpBottle.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFeather.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFireCharge.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFirework.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFireworkStar.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFish.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFishCooked.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFishingRod.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFlint.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFlintSteel.java delete mode 100644 src/main/java/cn/nukkit/item/ItemFlowerPot.java delete mode 100644 src/main/java/cn/nukkit/item/ItemGhastTear.java delete mode 100644 src/main/java/cn/nukkit/item/ItemGlassBottle.java delete mode 100644 src/main/java/cn/nukkit/item/ItemGlowstoneDust.java delete mode 100644 src/main/java/cn/nukkit/item/ItemGunpowder.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHeartOfTheSea.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHelmetChain.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHelmetDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHelmetGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHelmetIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHelmetLeather.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHelmetNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHoeDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHoeGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHoeIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHoeNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHoeStone.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHoeWood.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHoneyBottle.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHoneycomb.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHopper.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHorseArmorDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHorseArmorGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHorseArmorIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemHorseArmorLeather.java delete mode 100644 src/main/java/cn/nukkit/item/ItemID.java delete mode 100644 src/main/java/cn/nukkit/item/ItemIngotGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemIngotIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemIngotNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemItemFrame.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLadder.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLead.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLeather.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLeggingsChain.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLeggingsDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLeggingsGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLeggingsIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLeggingsLeather.java delete mode 100644 src/main/java/cn/nukkit/item/ItemLeggingsNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMagmaCream.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMap.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMelon.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMelonGlistering.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMinecart.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMinecartChest.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMinecartHopper.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMinecartTNT.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMushroomStew.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMuttonCooked.java delete mode 100644 src/main/java/cn/nukkit/item/ItemMuttonRaw.java delete mode 100644 src/main/java/cn/nukkit/item/ItemNameTag.java delete mode 100644 src/main/java/cn/nukkit/item/ItemNautilusShell.java delete mode 100644 src/main/java/cn/nukkit/item/ItemNetherBrick.java delete mode 100644 src/main/java/cn/nukkit/item/ItemNetherStar.java delete mode 100644 src/main/java/cn/nukkit/item/ItemNetherWart.java delete mode 100644 src/main/java/cn/nukkit/item/ItemNuggetGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemNuggetIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPainting.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPaper.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPhantomMembrane.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPickaxeDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPickaxeGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPickaxeIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPickaxeNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPickaxeStone.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPickaxeWood.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPorkchopCooked.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPorkchopRaw.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPotato.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPotatoBaked.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPotatoPoisonous.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPotion.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPotionLingering.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPotionSplash.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPrismarineCrystals.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPrismarineShard.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPufferfish.java delete mode 100644 src/main/java/cn/nukkit/item/ItemPumpkinPie.java delete mode 100644 src/main/java/cn/nukkit/item/ItemQuartz.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRabbitCooked.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRabbitFoot.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRabbitHide.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRabbitRaw.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRabbitStew.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRail.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecord.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecord11.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecord13.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordBlocks.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordCat.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordChirp.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordFar.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordMall.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordMellohi.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordPigstep.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordStal.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordStrad.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordWait.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRecordWard.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRedstone.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRedstoneComparator.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRedstoneRepeater.java delete mode 100644 src/main/java/cn/nukkit/item/ItemRottenFlesh.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSaddle.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSalmon.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSalmonCooked.java delete mode 100644 src/main/java/cn/nukkit/item/ItemScrapNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemScute.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSeedsBeetroot.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSeedsMelon.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSeedsPumpkin.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSeedsWheat.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShears.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShield.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShovelDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShovelGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShovelIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShovelNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShovelStone.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShovelWood.java delete mode 100644 src/main/java/cn/nukkit/item/ItemShulkerShell.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSign.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSkull.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSlimeball.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSnowball.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSpawnEgg.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSpiderEye.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSpiderEyeFermented.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSpyglass.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSteak.java delete mode 100644 src/main/java/cn/nukkit/item/ItemStick.java delete mode 100644 src/main/java/cn/nukkit/item/ItemString.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSugar.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSugarcane.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSuspiciousStew.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSweetBerries.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSwordDiamond.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSwordGold.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSwordIron.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSwordNetherite.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSwordStone.java delete mode 100644 src/main/java/cn/nukkit/item/ItemSwordWood.java delete mode 100644 src/main/java/cn/nukkit/item/ItemTool.java delete mode 100644 src/main/java/cn/nukkit/item/ItemTotem.java delete mode 100644 src/main/java/cn/nukkit/item/ItemTrident.java delete mode 100644 src/main/java/cn/nukkit/item/ItemTurtleShell.java delete mode 100644 src/main/java/cn/nukkit/item/ItemWarpedFungusOnAStick.java delete mode 100644 src/main/java/cn/nukkit/item/ItemWheat.java delete mode 100644 src/main/java/cn/nukkit/item/ProjectileItem.java delete mode 100644 src/main/java/cn/nukkit/item/RuntimeItemMapping.java delete mode 100644 src/main/java/cn/nukkit/item/RuntimeItems.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/Enchantment.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentBindingCurse.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentDurability.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentEfficiency.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentEntry.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentFireAspect.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentFrostWalker.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentKnockback.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentList.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentLure.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentMending.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentSilkTouch.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentSoulSpeed.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentThorns.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentType.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentVanishingCurse.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterBreath.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterWalker.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterWorker.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBow.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowFlame.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowInfinity.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowKnockback.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowPower.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbow.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowMultishot.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowPiercing.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowQuickCharge.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamage.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageAll.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageArthropods.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageSmite.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLoot.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootDigging.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootFishing.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootWeapon.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtection.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionAll.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionExplosion.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionFall.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionFire.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionProjectile.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTrident.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentChanneling.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentImpaling.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentLoyalty.java delete mode 100644 src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentRiptide.java delete mode 100644 src/main/java/cn/nukkit/item/food/Food.java delete mode 100644 src/main/java/cn/nukkit/item/food/FoodChorusFruit.java delete mode 100644 src/main/java/cn/nukkit/item/food/FoodEffective.java delete mode 100644 src/main/java/cn/nukkit/item/food/FoodEffectiveInBow.java delete mode 100644 src/main/java/cn/nukkit/item/food/FoodHoney.java delete mode 100644 src/main/java/cn/nukkit/item/food/FoodInBowl.java delete mode 100644 src/main/java/cn/nukkit/item/food/FoodMilk.java delete mode 100644 src/main/java/cn/nukkit/item/food/FoodNormal.java delete mode 100644 src/main/java/cn/nukkit/item/randomitem/ConstantItemSelector.java delete mode 100644 src/main/java/cn/nukkit/item/randomitem/Fishing.java delete mode 100644 src/main/java/cn/nukkit/item/randomitem/RandomItem.java delete mode 100644 src/main/java/cn/nukkit/item/randomitem/Selector.java delete mode 100644 src/main/java/cn/nukkit/lang/BaseLang.java delete mode 100644 src/main/java/cn/nukkit/lang/TextContainer.java delete mode 100644 src/main/java/cn/nukkit/lang/TranslationContainer.java delete mode 100644 src/main/java/cn/nukkit/level/ChunkLoader.java delete mode 100644 src/main/java/cn/nukkit/level/ChunkManager.java delete mode 100644 src/main/java/cn/nukkit/level/ChunkPosition.java delete mode 100644 src/main/java/cn/nukkit/level/EnumLevel.java delete mode 100644 src/main/java/cn/nukkit/level/Explosion.java delete mode 100644 src/main/java/cn/nukkit/level/GameRule.java delete mode 100644 src/main/java/cn/nukkit/level/GameRules.java delete mode 100644 src/main/java/cn/nukkit/level/GlobalBlockPalette.java delete mode 100644 src/main/java/cn/nukkit/level/Level.java delete mode 100644 src/main/java/cn/nukkit/level/Location.java delete mode 100644 src/main/java/cn/nukkit/level/MovingObjectPosition.java delete mode 100644 src/main/java/cn/nukkit/level/ParticleEffect.java delete mode 100644 src/main/java/cn/nukkit/level/Position.java delete mode 100644 src/main/java/cn/nukkit/level/SimpleChunkManager.java delete mode 100644 src/main/java/cn/nukkit/level/Sound.java delete mode 100644 src/main/java/cn/nukkit/level/StrongExplosion.java delete mode 100644 src/main/java/cn/nukkit/level/WeakExplosion.java delete mode 100644 src/main/java/cn/nukkit/level/biome/Biome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/BiomeSelector.java delete mode 100644 src/main/java/cn/nukkit/level/biome/EnumBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/EndBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/HellBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/beach/BeachBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/beach/ColdBeachBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/desert/DesertBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/desert/DesertHillsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/desert/DesertMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsEdgeBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsPlusBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsPlusMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/extremehills/StoneBeachBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/forest/FlowerForestBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/forest/ForestBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/forest/ForestHillsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/iceplains/IcePlainsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/iceplains/IcePlainsSpikesBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/jungle/JungleBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/jungle/JungleEdgeBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/jungle/JungleEdgeMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/jungle/JungleHillsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/jungle/JungleMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/mesa/MesaBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/mesa/MesaBryceBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauFBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauFMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/mushroom/MushroomIslandBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/mushroom/MushroomIslandShoreBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/ocean/DeepOceanBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/ocean/FrozenOceanBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/ocean/OceanBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/plains/PlainsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/plains/SunflowerPlainsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/river/FrozenRiverBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/river/RiverBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/roofedforest/RoofedForestBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/roofedforest/RoofedForestMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaPlateauBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaPlateauMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/swamp/SwampBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/swamp/SwamplandMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaHillsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/MegaSpruceTaigaBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/MegaTaigaBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/MegaTaigaHillsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaHillsBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaMBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/type/CoveredBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/type/GrassyBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/type/SandyBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/type/SnowyBiome.java delete mode 100644 src/main/java/cn/nukkit/level/biome/type/WateryBiome.java delete mode 100644 src/main/java/cn/nukkit/level/format/Chunk.java delete mode 100644 src/main/java/cn/nukkit/level/format/ChunkSection.java delete mode 100644 src/main/java/cn/nukkit/level/format/FullChunk.java delete mode 100644 src/main/java/cn/nukkit/level/format/LevelProvider.java delete mode 100644 src/main/java/cn/nukkit/level/format/LevelProviderManager.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/Anvil.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/Chunk.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/ChunkSection.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/RegionLoader.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/BiomePalette.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/BitArray.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/BitArray256.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/BitArray4096.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/BlockDataPalette.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/BytePalette.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/CharPalette.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/DataPalette.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/palette/IntPalette.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/util/BlockStorage.java delete mode 100644 src/main/java/cn/nukkit/level/format/anvil/util/NibbleArray.java delete mode 100644 src/main/java/cn/nukkit/level/format/generic/BaseChunk.java delete mode 100644 src/main/java/cn/nukkit/level/format/generic/BaseFullChunk.java delete mode 100644 src/main/java/cn/nukkit/level/format/generic/BaseLevelProvider.java delete mode 100644 src/main/java/cn/nukkit/level/format/generic/BaseRegionLoader.java delete mode 100644 src/main/java/cn/nukkit/level/format/generic/EmptyChunkSection.java delete mode 100644 src/main/java/cn/nukkit/level/generator/End.java delete mode 100644 src/main/java/cn/nukkit/level/generator/Flat.java delete mode 100644 src/main/java/cn/nukkit/level/generator/Generator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/Nether.java delete mode 100644 src/main/java/cn/nukkit/level/generator/Normal.java delete mode 100644 src/main/java/cn/nukkit/level/generator/PopChunkManager.java delete mode 100644 src/main/java/cn/nukkit/level/generator/SimpleChunkManager.java delete mode 100644 src/main/java/cn/nukkit/level/generator/Void.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/Noise.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/Perlin.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/Simplex.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/nukkit/d/NoiseD.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/nukkit/d/PerlinD.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/nukkit/d/SimplexD.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/nukkit/f/NoiseF.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/nukkit/f/PerlinF.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/nukkit/f/SimplexF.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorImprovedD.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorOctavesD.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorPerlinD.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorSimplexD.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorImprovedF.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorOctavesF.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorPerlinF.java delete mode 100644 src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorSimplexF.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/BasicGenerator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/ObjectTallGrass.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/mushroom/BigMushroom.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/ore/OreType.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/structure/ObjectFallenTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/structure/ObjectWell.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/HugeTreesGenerator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/NewJungleTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectBigSpruceTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectBirchTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectDarkOakTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectJungleBigTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectJungleTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectOakTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectSavannaTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectSpruceTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectSwampTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectTallBirchTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/ObjectTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/object/tree/TreeGenerator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/helper/EnsureBelow.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/helper/EnsureCover.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/helper/EnsureGrassBelow.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/helper/PopulatorHelpers.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/MushroomPopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorBedrock.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorCactus.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorCaves.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDeadBush.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDoublePlant.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDungeon.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorFallenTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorFlower.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGlowStone.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGrass.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGroundCover.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGroundFire.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorLava.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorLilyPad.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorMelon.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorNetherWart.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorOre.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorPumpkin.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorSmallMushroom.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorSugarcane.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorTallSugarcane.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorTree.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorWell.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/WaterIcePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/tree/DarkOakTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleBigTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleFloorPopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/tree/SavannaTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/tree/SpruceBigTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/tree/SpruceMegaTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/impl/tree/SwampTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/tree/DarkOakTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/tree/JungleBigTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/tree/JungleTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/tree/SavannaTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/tree/SwampTreePopulator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/type/Populator.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/type/PopulatorCount.java delete mode 100644 src/main/java/cn/nukkit/level/generator/populator/type/PopulatorSurfaceBlock.java delete mode 100644 src/main/java/cn/nukkit/level/generator/task/GenerationTask.java delete mode 100644 src/main/java/cn/nukkit/level/generator/task/LightPopulationTask.java delete mode 100644 src/main/java/cn/nukkit/level/generator/task/PopulationTask.java delete mode 100644 src/main/java/cn/nukkit/level/particle/AngryVillagerParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/BlockForceFieldParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/BoneMealParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/BubbleParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/CriticalParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/DestroyBlockParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/DustParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/EnchantParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/EnchantmentTableParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/EntityFlameParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/ExplodeParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/FlameParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/FloatingTextParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/GenericParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/HappyVillagerParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/HeartParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/HugeExplodeParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/HugeExplodeSeedParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/InkParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/InstantEnchantParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/InstantSpellParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/ItemBreakParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/LavaDripParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/LavaParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/MobSpawnParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/Particle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/PortalParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/PunchBlockParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/RainSplashParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/RedstoneParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/SmokeParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/SpellParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/SplashParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/SporeParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/TerrainParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/WaterDripParticle.java delete mode 100644 src/main/java/cn/nukkit/level/particle/WaterParticle.java delete mode 100644 src/main/java/cn/nukkit/level/sound/AnvilFallSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/ButtonClickSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/ClickSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/DoorSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/EndermanTeleportSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/ExperienceOrbSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/FizzSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/ItemFrameItemAddedSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/ItemFrameItemRotated.java delete mode 100644 src/main/java/cn/nukkit/level/sound/ItemFramePlacedSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/ItemFrameRemovedSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/LevelEventSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/LeverSound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/Sound.java delete mode 100644 src/main/java/cn/nukkit/level/sound/TNTPrimeSound.java delete mode 100644 src/main/java/cn/nukkit/level/util/BitArray.java delete mode 100644 src/main/java/cn/nukkit/level/util/BitArrayVersion.java delete mode 100644 src/main/java/cn/nukkit/level/util/PaddedBitArray.java delete mode 100644 src/main/java/cn/nukkit/level/util/PalettedBlockStorage.java delete mode 100644 src/main/java/cn/nukkit/level/util/Pow2BitArray.java delete mode 100644 src/main/java/cn/nukkit/math/Angle.java delete mode 100644 src/main/java/cn/nukkit/math/AxisAlignedBB.java delete mode 100644 src/main/java/cn/nukkit/math/BlockFace.java delete mode 100644 src/main/java/cn/nukkit/math/BlockVector3.java delete mode 100644 src/main/java/cn/nukkit/math/MathHelper.java delete mode 100644 src/main/java/cn/nukkit/math/NukkitMath.java delete mode 100644 src/main/java/cn/nukkit/math/NukkitRandom.java delete mode 100644 src/main/java/cn/nukkit/math/Vector2.java delete mode 100644 src/main/java/cn/nukkit/math/Vector2f.java delete mode 100644 src/main/java/cn/nukkit/math/Vector3.java delete mode 100644 src/main/java/cn/nukkit/math/Vector3f.java delete mode 100644 src/main/java/cn/nukkit/math/VectorMath.java delete mode 100644 src/main/java/cn/nukkit/metadata/BlockMetadataStore.java delete mode 100644 src/main/java/cn/nukkit/metadata/EntityMetadataStore.java delete mode 100644 src/main/java/cn/nukkit/metadata/LevelMetadataStore.java delete mode 100644 src/main/java/cn/nukkit/metadata/MetadataStore.java delete mode 100644 src/main/java/cn/nukkit/metadata/MetadataValue.java delete mode 100644 src/main/java/cn/nukkit/metadata/Metadatable.java delete mode 100644 src/main/java/cn/nukkit/metadata/PlayerMetadataStore.java delete mode 100644 src/main/java/cn/nukkit/metrics/Metrics.java delete mode 100644 src/main/java/cn/nukkit/metrics/NukkitMetrics.java delete mode 100644 src/main/java/cn/nukkit/nbt/NBTIO.java delete mode 100644 src/main/java/cn/nukkit/nbt/stream/FastByteArrayOutputStream.java delete mode 100644 src/main/java/cn/nukkit/nbt/stream/NBTInputStream.java delete mode 100644 src/main/java/cn/nukkit/nbt/stream/NBTOutputStream.java delete mode 100644 src/main/java/cn/nukkit/nbt/stream/PGZIPBlock.java delete mode 100644 src/main/java/cn/nukkit/nbt/stream/PGZIPOutputStream.java delete mode 100644 src/main/java/cn/nukkit/nbt/stream/PGZIPState.java delete mode 100644 src/main/java/cn/nukkit/nbt/stream/PGZIPThreadLocal.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/ByteArrayTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/ByteTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/CompoundTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/DoubleTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/EndTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/FloatTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/IntArrayTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/IntTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/ListTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/LongTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/NumberTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/ShortTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/StringTag.java delete mode 100644 src/main/java/cn/nukkit/nbt/tag/Tag.java delete mode 100644 src/main/java/cn/nukkit/network/AdvancedSourceInterface.java delete mode 100644 src/main/java/cn/nukkit/network/BatchingHelper.java delete mode 100644 src/main/java/cn/nukkit/network/LittleEndianByteBufInputStream.java delete mode 100644 src/main/java/cn/nukkit/network/LittleEndianByteBufOutputStream.java delete mode 100644 src/main/java/cn/nukkit/network/Network.java delete mode 100644 src/main/java/cn/nukkit/network/RakNetInterface.java delete mode 100644 src/main/java/cn/nukkit/network/SourceInterface.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AddBehaviorTreePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AddEntityPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AddItemEntityPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AddPaintingPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AddPlayerPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AdventureSettingsPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AnimatePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AnvilDamagePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AvailableCommandsPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/AvailableEntityIdentifiersPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/BatchPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/BiomeDefinitionListPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/BlockEntityDataPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/BlockEventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/BlockPickRequestPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/BookEditPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/BossEventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/CameraPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ChangeDimensionPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ChunkRadiusUpdatedPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ClientCacheStatusPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ClientToServerHandshakePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ClientboundMapItemDataPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/CodeBuilderPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/CommandBlockUpdatePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/CommandRequestPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/CompletedUsingItemPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ContainerClosePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ContainerOpenPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ContainerSetDataPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/CraftingDataPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/CraftingEventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/CreativeContentPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/DataPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/DebugInfoPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/DisconnectPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/EmoteListPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/EmotePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/EntityEventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/EntityFallPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/EntityPickRequestPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/EventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/FilterTextPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/GUIDataPickItemPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/GameRulesChangedPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/HurtArmorPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/InitiateWebSocketConnectionPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/InteractPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/InventoryContentPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/InventorySlotPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/InventoryTransactionPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ItemComponentPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ItemFrameDropItemPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/LecternUpdatePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/LevelChunkPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/LevelEventGenericPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/LevelEventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacketV1.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacketV2.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/LoginPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/MapCreateLockedCopyPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/MapInfoRequestPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/MobArmorEquipmentPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/MobEffectPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/MobEquipmentPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ModalFormRequestPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ModalFormResponsePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/MoveEntityAbsolutePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/MoveEntityDeltaPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/MovePlayerPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/NPCRequestPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/NetworkChunkPublisherUpdatePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/NetworkStackLatencyPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/OnScreenTextureAnimationPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PacketViolationWarningPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlaySoundPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlayStatusPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlayerActionPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlayerArmorDamagePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlayerEnchantOptionsPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlayerHotbarPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlayerInputPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlayerListPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/PlayerSkinPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ProtocolInfo.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/RemoveEntityPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/RequestChunkRadiusPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ResourcePackChunkDataPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ResourcePackChunkRequestPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ResourcePackClientResponsePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ResourcePackDataInfoPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ResourcePackStackPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ResourcePacksInfoPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/RespawnPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/RiderJumpPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ScriptCustomEventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ServerSettingsRequestPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ServerSettingsResponsePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ServerToClientHandshakePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetCommandsEnabledPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetDifficultyPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetEntityDataPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetEntityLinkPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetEntityMotionPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetHealthPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetLastHurtByPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetLocalPlayerAsInitializedPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetPlayerGameTypePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetSpawnPositionPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetTimePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SetTitlePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ShowCreditsPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/ShowProfilePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SimpleEventPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SpawnExperienceOrbPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SpawnParticleEffectPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/StartGamePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/StopSoundPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/StructureBlockUpdatePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/SubClientLoginPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/TakeItemEntityPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/TextPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/TransferPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/UpdateAttributesPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/UpdateBlockPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/UpdateEquipmentPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/UpdatePlayerGameTypePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/UpdateSoftEnumPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/UpdateTradePacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/VideoStreamConnectPacket.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/types/CommandOriginData.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/types/ContainerIds.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/types/EntityLink.java delete mode 100644 src/main/java/cn/nukkit/network/protocol/types/NetworkInventoryAction.java delete mode 100644 src/main/java/cn/nukkit/network/query/QueryHandler.java delete mode 100644 src/main/java/cn/nukkit/network/rcon/RCON.java delete mode 100644 src/main/java/cn/nukkit/network/rcon/RCONCommand.java delete mode 100644 src/main/java/cn/nukkit/network/rcon/RCONPacket.java delete mode 100644 src/main/java/cn/nukkit/network/rcon/RCONServer.java delete mode 100644 src/main/java/cn/nukkit/permission/BanEntry.java delete mode 100644 src/main/java/cn/nukkit/permission/BanList.java delete mode 100644 src/main/java/cn/nukkit/permission/DefaultPermissions.java delete mode 100644 src/main/java/cn/nukkit/permission/Permissible.java delete mode 100644 src/main/java/cn/nukkit/permission/PermissibleBase.java delete mode 100644 src/main/java/cn/nukkit/permission/Permission.java delete mode 100644 src/main/java/cn/nukkit/permission/PermissionAttachment.java delete mode 100644 src/main/java/cn/nukkit/permission/PermissionAttachmentInfo.java delete mode 100644 src/main/java/cn/nukkit/permission/PermissionRemovedExecutor.java delete mode 100644 src/main/java/cn/nukkit/permission/ServerOperator.java delete mode 100644 src/main/java/cn/nukkit/plugin/EventExecutor.java delete mode 100644 src/main/java/cn/nukkit/plugin/JavaPluginLoader.java delete mode 100644 src/main/java/cn/nukkit/plugin/Library.java delete mode 100644 src/main/java/cn/nukkit/plugin/LibraryLoadException.java delete mode 100644 src/main/java/cn/nukkit/plugin/LibraryLoader.java delete mode 100644 src/main/java/cn/nukkit/plugin/MethodEventExecutor.java delete mode 100644 src/main/java/cn/nukkit/plugin/Plugin.java delete mode 100644 src/main/java/cn/nukkit/plugin/PluginBase.java delete mode 100644 src/main/java/cn/nukkit/plugin/PluginClassLoader.java delete mode 100644 src/main/java/cn/nukkit/plugin/PluginDescription.java delete mode 100644 src/main/java/cn/nukkit/plugin/PluginLoadOrder.java delete mode 100644 src/main/java/cn/nukkit/plugin/PluginLoader.java delete mode 100644 src/main/java/cn/nukkit/plugin/PluginLogger.java delete mode 100644 src/main/java/cn/nukkit/plugin/PluginManager.java delete mode 100644 src/main/java/cn/nukkit/plugin/RegisteredListener.java delete mode 100644 src/main/java/cn/nukkit/plugin/service/NKServiceManager.java delete mode 100644 src/main/java/cn/nukkit/plugin/service/RegisteredServiceProvider.java delete mode 100644 src/main/java/cn/nukkit/plugin/service/ServiceManager.java delete mode 100644 src/main/java/cn/nukkit/plugin/service/ServicePriority.java delete mode 100644 src/main/java/cn/nukkit/potion/Effect.java delete mode 100644 src/main/java/cn/nukkit/potion/InstantEffect.java delete mode 100644 src/main/java/cn/nukkit/potion/Potion.java delete mode 100644 src/main/java/cn/nukkit/resourcepacks/AbstractResourcePack.java delete mode 100644 src/main/java/cn/nukkit/resourcepacks/ChemistryResourcePack.java delete mode 100644 src/main/java/cn/nukkit/resourcepacks/ResourcePack.java delete mode 100644 src/main/java/cn/nukkit/resourcepacks/ResourcePackManager.java delete mode 100644 src/main/java/cn/nukkit/resourcepacks/ZippedResourcePack.java delete mode 100644 src/main/java/cn/nukkit/scheduler/AsyncPool.java delete mode 100644 src/main/java/cn/nukkit/scheduler/AsyncTask.java delete mode 100644 src/main/java/cn/nukkit/scheduler/AsyncWorker.java delete mode 100644 src/main/java/cn/nukkit/scheduler/BlockUpdateScheduler.java delete mode 100644 src/main/java/cn/nukkit/scheduler/FileWriteTask.java delete mode 100644 src/main/java/cn/nukkit/scheduler/NukkitRunnable.java delete mode 100644 src/main/java/cn/nukkit/scheduler/PluginTask.java delete mode 100644 src/main/java/cn/nukkit/scheduler/ServerScheduler.java delete mode 100644 src/main/java/cn/nukkit/scheduler/Task.java delete mode 100644 src/main/java/cn/nukkit/scheduler/TaskHandler.java delete mode 100644 src/main/java/cn/nukkit/utils/AbstractEntitySpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/BannerPattern.java delete mode 100644 src/main/java/cn/nukkit/utils/Binary.java delete mode 100644 src/main/java/cn/nukkit/utils/BinaryStream.java delete mode 100644 src/main/java/cn/nukkit/utils/BlockColor.java delete mode 100644 src/main/java/cn/nukkit/utils/BlockIterator.java delete mode 100644 src/main/java/cn/nukkit/utils/BlockUpdateEntry.java delete mode 100644 src/main/java/cn/nukkit/utils/ChunkException.java delete mode 100644 src/main/java/cn/nukkit/utils/ClientChainData.java delete mode 100644 src/main/java/cn/nukkit/utils/Config.java delete mode 100644 src/main/java/cn/nukkit/utils/ConfigSection.java delete mode 100644 src/main/java/cn/nukkit/utils/DefaultPlayerDataSerializer.java delete mode 100644 src/main/java/cn/nukkit/utils/DummyBossBar.java delete mode 100644 src/main/java/cn/nukkit/utils/DyeColor.java delete mode 100644 src/main/java/cn/nukkit/utils/EntitySpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/EventException.java delete mode 100644 src/main/java/cn/nukkit/utils/Faceable.java delete mode 100644 src/main/java/cn/nukkit/utils/Hash.java delete mode 100644 src/main/java/cn/nukkit/utils/HastebinUtility.java delete mode 100644 src/main/java/cn/nukkit/utils/IterableThreadLocal.java delete mode 100644 src/main/java/cn/nukkit/utils/JsonUtil.java delete mode 100644 src/main/java/cn/nukkit/utils/LevelException.java delete mode 100644 src/main/java/cn/nukkit/utils/LevelTimings.java delete mode 100644 src/main/java/cn/nukkit/utils/LogLevel.java delete mode 100644 src/main/java/cn/nukkit/utils/Logger.java delete mode 100644 src/main/java/cn/nukkit/utils/LoginChainData.java delete mode 100644 src/main/java/cn/nukkit/utils/MainLogger.java delete mode 100644 src/main/java/cn/nukkit/utils/MinecartType.java delete mode 100644 src/main/java/cn/nukkit/utils/PersonaPiece.java delete mode 100644 src/main/java/cn/nukkit/utils/PersonaPieceTint.java delete mode 100644 src/main/java/cn/nukkit/utils/PlayerDataSerializer.java delete mode 100644 src/main/java/cn/nukkit/utils/PluginException.java delete mode 100644 src/main/java/cn/nukkit/utils/Rail.java delete mode 100644 src/main/java/cn/nukkit/utils/SerializedImage.java delete mode 100644 src/main/java/cn/nukkit/utils/ServerException.java delete mode 100644 src/main/java/cn/nukkit/utils/ServerKiller.java delete mode 100644 src/main/java/cn/nukkit/utils/SimpleConfig.java delete mode 100644 src/main/java/cn/nukkit/utils/SkinAnimation.java delete mode 100644 src/main/java/cn/nukkit/utils/SpawnerTask.java delete mode 100644 src/main/java/cn/nukkit/utils/TerracottaColor.java delete mode 100644 src/main/java/cn/nukkit/utils/TextFormat.java delete mode 100644 src/main/java/cn/nukkit/utils/ThreadCache.java delete mode 100644 src/main/java/cn/nukkit/utils/ThreadStore.java delete mode 100644 src/main/java/cn/nukkit/utils/Utils.java delete mode 100644 src/main/java/cn/nukkit/utils/VarInt.java delete mode 100644 src/main/java/cn/nukkit/utils/Watchdog.java delete mode 100644 src/main/java/cn/nukkit/utils/Zlib.java delete mode 100644 src/main/java/cn/nukkit/utils/ZlibOriginal.java delete mode 100644 src/main/java/cn/nukkit/utils/ZlibProvider.java delete mode 100644 src/main/java/cn/nukkit/utils/ZlibSingleThreadLowMem.java delete mode 100644 src/main/java/cn/nukkit/utils/ZlibThreadLocal.java delete mode 100644 src/main/java/cn/nukkit/utils/bugreport/BugReportGenerator.java delete mode 100644 src/main/java/cn/nukkit/utils/bugreport/BugReportPlugin.java delete mode 100644 src/main/java/cn/nukkit/utils/bugreport/ExceptionHandler.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/BlazeSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/ChickenSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/CodSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/CowSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/CreeperSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/DolphinSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/DonkeySpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/DrownedSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/EndermanSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/FoxSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/GhastSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/HoglinSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/HorseSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/HuskSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/MagmaCubeSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/MooshroomSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/OcelotSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/PandaSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/ParrotSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/PhantomSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/PigSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/PiglinSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/PolarBearSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/PufferfishSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/RabbitSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/SalmonSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/SheepSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/SkeletonSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/SlimeSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/SpiderSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/SquidSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/StraySpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/TropicalFishSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/TurtleSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/WitchSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/WitherSkeletonSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/WolfSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/ZombiePigmanSpawner.java delete mode 100644 src/main/java/cn/nukkit/utils/spawners/ZombieSpawner.java delete mode 100644 src/main/java/co/aikar/timings/FullServerTickTiming.java delete mode 100644 src/main/java/co/aikar/timings/Timing.java delete mode 100644 src/main/java/co/aikar/timings/TimingData.java delete mode 100644 src/main/java/co/aikar/timings/TimingIdentifier.java delete mode 100644 src/main/java/co/aikar/timings/Timings.java delete mode 100644 src/main/java/co/aikar/timings/TimingsExport.java delete mode 100644 src/main/java/co/aikar/timings/TimingsHistory.java delete mode 100644 src/main/java/co/aikar/timings/TimingsHistoryEntry.java delete mode 100644 src/main/java/co/aikar/timings/TimingsManager.java delete mode 100644 src/main/java/com/nukkitx/network/NetworkUtils.java delete mode 100644 src/main/java/com/nukkitx/network/SessionConnection.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/EncapsulatedPacket.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNet.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetConstants.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetDatagram.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetPriority.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetReliability.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetServer.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetServerListener.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetServerSession.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetSession.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetSessionListener.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetSlidingWindow.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetState.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/RakNetUtils.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/pipeline/RakExceptionHandler.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/pipeline/RakOutboundHandler.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/pipeline/ServerDatagramHandler.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/pipeline/ServerMessageHandler.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/util/BitQueue.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/util/FastBinaryMinHeap.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/util/IntRange.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/util/RoundRobinArray.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/util/RoundRobinIterator.java delete mode 100644 src/main/java/com/nukkitx/network/raknet/util/SplitPacketHelper.java delete mode 100644 src/main/java/com/nukkitx/network/util/Bootstraps.java delete mode 100644 src/main/java/com/nukkitx/network/util/DisconnectReason.java delete mode 100644 src/main/java/com/nukkitx/network/util/EventLoops.java delete mode 100644 src/main/java/com/nukkitx/network/util/NetworkThreadFactory.java delete mode 100644 src/main/java/com/nukkitx/network/util/Preconditions.java delete mode 100644 src/main/resources/biome_definitions_361.dat delete mode 100644 src/main/resources/creativeitems137.json delete mode 100644 src/main/resources/creativeitems274.json delete mode 100644 src/main/resources/creativeitems291.json delete mode 100644 src/main/resources/creativeitems313.json delete mode 100644 src/main/resources/creativeitems332.json delete mode 100644 src/main/resources/creativeitems340.json delete mode 100644 src/main/resources/creativeitems354.json delete mode 100644 src/main/resources/creativeitems389.json delete mode 100644 src/main/resources/creativeitems407.json delete mode 100644 src/main/resources/creativeitems440.json delete mode 100644 src/main/resources/creativeitems448.json delete mode 100644 src/main/resources/creativeitems465.json delete mode 100644 src/main/resources/creativeitems471.json delete mode 100644 src/main/resources/entity_identifiers_419.dat delete mode 100644 src/main/resources/extras_407.json delete mode 100644 src/main/resources/item_mappings.json delete mode 100644 src/main/resources/lang/eng/lang.ini delete mode 100644 src/main/resources/legacy_item_ids.json delete mode 100644 src/main/resources/log4j2.xml delete mode 100644 src/main/resources/recipes313.json delete mode 100644 src/main/resources/recipes332.json delete mode 100644 src/main/resources/recipes388.json delete mode 100644 src/main/resources/runtime_block_states_388.dat delete mode 100644 src/main/resources/runtime_block_states_389.dat delete mode 100644 src/main/resources/runtime_block_states_407.dat delete mode 100644 src/main/resources/runtime_block_states_419.dat delete mode 100644 src/main/resources/runtime_block_states_428.dat delete mode 100644 src/main/resources/runtime_block_states_440.dat delete mode 100644 src/main/resources/runtime_block_states_448.dat delete mode 100644 src/main/resources/runtime_block_states_465.dat delete mode 100644 src/main/resources/runtime_block_states_471.dat delete mode 100644 src/main/resources/runtime_item_states_361.json delete mode 100644 src/main/resources/runtime_item_states_419.json delete mode 100644 src/main/resources/runtime_item_states_440.json delete mode 100644 src/main/resources/runtime_item_states_448.json delete mode 100644 src/main/resources/runtimeid_table_223.json delete mode 100644 src/main/resources/runtimeid_table_261.json delete mode 100644 src/main/resources/runtimeid_table_274.json delete mode 100644 src/main/resources/runtimeid_table_282.json delete mode 100644 src/main/resources/runtimeid_table_291.json delete mode 100644 src/main/resources/runtimeid_table_313.json delete mode 100644 src/main/resources/runtimeid_table_332.json delete mode 100644 src/main/resources/runtimeid_table_340.json delete mode 100644 src/main/resources/runtimeid_table_354.json delete mode 100644 src/main/resources/runtimeid_table_361.json diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 46de36a29..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: 2 -jobs: - build: - - working_directory: ~/NukkitPetteriM1Edition - - docker: - - image: circleci/openjdk:8-jdk-browsers - - steps: - - - checkout - - - restore_cache: - key: NukkitPetteriM1Edition-{{ checksum "pom.xml" }} - - - run: mvn dependency:go-offline - - - save_cache: - paths: - - ~/.m2 - key: NukkitPetteriM1Edition-{{ checksum "pom.xml" }} - - - run: mvn clean package - - - store_artifacts: - path: target/Nukkit-PM1E.jar \ No newline at end of file diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 8147bf8dd..000000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -*.java text=auto eol=lf diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 2369becca..000000000 --- a/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -*.class -target -target/* -build -build/* -nukkit-core/build -nukkit-core/build/* -nukkit-loader/build -nukkit-loader/build/* -.mtj.tmp/ -*.war -*.ear -hs_err_pid* -*.MF -*.iml -.idea -.idea/* -.classpath -.project -.settings -.settings/* -banned-ips.json -banned-players.json -ops.txt -server.log -server.properties -white-list.txt -worlds -worlds/* -plugins -plugins/* -players -players/* -resource_packs -resource_packs/* -*.md -.DS_Store -.factorypath -dependency-reduced-pom.xml -*.log -/logs diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 23ab9ba50..000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,40 +0,0 @@ -pipeline { - agent any - tools { - maven 'Maven 3' - jdk 'Java 8' - } - options { - buildDiscarder(logRotator(artifactNumToKeepStr: '5')) - } - stages { - stage ('Build') { - steps { - sh 'mvn clean package' - } - post { - success { - archiveArtifacts artifacts: 'target/Nukkit-PM1E.jar', fingerprint: true - } - } - } - - stage ('Deploy') { - when { - branch "master" - } - steps { - sh 'mvn javadoc:javadoc javadoc:jar source:jar deploy -DskipTests' - step([$class: 'JavadocArchiver', - javadocDir: 'target/site/apidocs', - keepAll: false]) - } - } - } - - post { - always { - deleteDir() - } - } -} diff --git a/README.md b/README.md index a85680a22..bccd78100 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # Nukkit PetteriM1 Edition -This is a special version of [Nukkit](https://github.com/CloudburstMC/Nukkit) Minecraft Bedrock Edition server software made for my server [SuomiCraft PE](https://suomicraft-pe.tk/). +This is a custom version of [Nukkit](https://github.com/CloudburstMC/Nukkit) Minecraft Bedrock Edition server software made for my server [SuomiCraft PE](https://suomicraft-pe.tk/). See the [wiki](https://github.com/PetteriM1/NukkitPetteriM1Edition/wiki) for more details. - + + >[Download](https://github.com/PetteriM1/NukkitPetteriM1Edition/releases) diff --git a/pom.xml b/pom.xml deleted file mode 100644 index ec8ffe763..000000000 --- a/pom.xml +++ /dev/null @@ -1,343 +0,0 @@ - - 4.0.0 - - Nukkit PetteriM1 Edition - cn.nukkit - Nukkit - PM1E - - - 1.8 - 1.8 - 1.0.0-M4 - 2.13.3 - UTF-8 - 3.12.1 - [4.1.47.Final,4.1.999.Final] - - - - - gdrive - Google Drive - gdrive:/Public/build/Nukkit_PetteriM1_Edition - - - - - - opencollab-repo-release - https://repo.opencollab.dev/maven-releases/ - - true - - - false - - - - opencollab-repo-snapshot - https://repo.opencollab.dev/maven-snapshots/ - - false - - - true - - - - - - - com.nukkitx - fastutil-lite - 8.1.1 - - - com.google.guava - guava - 29.0-jre - - - com.google.code.gson - gson - 2.8.6 - - - org.yaml - snakeyaml - 1.17 - - - com.nimbusds - nimbus-jose-jwt - 9.13 - compile - - - org.apache.logging.log4j - log4j-api - ${log4j2.version} - compile - - - org.apache.logging.log4j - log4j-core - ${log4j2.version} - compile - - - org.projectlombok - lombok - 1.18.8 - provided - - - net.minecrell - terminalconsoleappender - 1.1.1 - compile - - - org.apache.logging.log4j - log4j-core - - - org.jline - jline-reader - - - org.jline - jline-terminal-jna - - - org.jline - jline-terminal - - - - - org.jline - jline-terminal-jna - ${jline.version} - compile - - - org.jline - jline-reader - ${jline.version} - compile - - - io.netty - netty-handler - ${netty.version} - compile - - - io.netty - netty-buffer - ${netty.version} - compile - - - io.netty - netty-transport-native-epoll - ${netty.version} - compile - linux-x86_64 - - - com.google.code.findbugs - jsr305 - 3.0.2 - provided - - - io.netty - netty-transport-native-kqueue - ${netty.version} - compile - osx-x86_64 - - - org.iq80.leveldb - leveldb - 0.11-SNAPSHOT - compile - - - com.google.guava - guava - - - - - io.sentry - sentry - 1.7.30 - - - org.apache.commons - commons-math3 - 3.6.1 - compile - - - - - - - org.rogueware.mojo - gdrive-release-maven-plugin - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - - true - lib/ - cn.nukkit.Nukkit - - - - - - maven-compiler-plugin - 3.8.1 - - ${maven.compiler.source} - ${maven.compiler.target} - - - - maven-surefire-plugin - 2.22.0 - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - - - - - org.apache.maven.plugins - maven-enforcer-plugin - 3.0.0 - - - enforce - - - - - - - enforce - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - - com.github.edwgiz - maven-shade-plugin.log4j2-cachefile-transformer - 2.8.1 - - - - - package - - shade - - - - - - - *:* - - META-INF/versions/ - - - - - - - - false - - - - pl.project13.maven - git-commit-id-plugin - 2.2.6 - - - get-the-git-infos - - revision - - - - - - ${project.basedir}/.git - git - dd.MM.yyyy '@' HH:mm:ss z - ${user.timezone} - true - true - ${project.build.outputDirectory}/git.properties - - properties - true - false - false - false - false - true - - git.user.* - - - - false - 7 - flat - - false - false - 7 - -dirty - * - false - false - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.3.1 - - all,-missing - - - - - diff --git a/src/main/java/cn/nukkit/Achievement.java b/src/main/java/cn/nukkit/Achievement.java deleted file mode 100644 index f9ef9f838..000000000 --- a/src/main/java/cn/nukkit/Achievement.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit; - -import cn.nukkit.utils.TextFormat; - -import java.util.HashMap; - -/** - * Achievement list and functions - * - * @author CreeperFace - */ -public class Achievement { - - public static final HashMap achievements = new HashMap() { - { - put("mineWood", new Achievement("Getting Wood")); - put("buildWorkBench", new Achievement("Benchmarking", "mineWood")); - put("buildPickaxe", new Achievement("Time to Mine!", "buildWorkBench")); - put("buildFurnace", new Achievement("Hot Topic", "buildPickaxe")); - put("acquireIron", new Achievement("Acquire hardware", "buildFurnace")); - put("buildHoe", new Achievement("Time to Farm!", "buildWorkBench")); - put("makeBread", new Achievement("Bake Bread", "buildHoe")); - put("bakeCake", new Achievement("The Lie", "buildHoe")); - put("buildBetterPickaxe", new Achievement("Getting an Upgrade", "buildPickaxe")); - put("buildSword", new Achievement("Time to Strike!", "buildWorkBench")); - put("diamonds", new Achievement("DIAMONDS!", "acquireIron")); - } - }; - - public static boolean broadcast(Player player, String achievementId) { - if (!achievements.containsKey(achievementId)) { - return false; - } - String translation = Server.getInstance().getLanguage().translateString("chat.type.achievement", player.getDisplayName(), TextFormat.GREEN + achievements.get(achievementId).message) + TextFormat.RESET; - - if (Server.getInstance().announceAchievements) { - Server.getInstance().broadcastMessage(translation); - } else { - player.sendMessage(translation); - } - return true; - } - - public static boolean add(String name, Achievement achievement) { - if (achievements.containsKey(name)) { - return false; - } - - achievements.put(name, achievement); - return true; - } - - public final String message; - public final String[] requires; - - public Achievement(String message, String... requires) { - this.message = message; - this.requires = requires; - } - - public String getMessage() { - return message; - } - - public void broadcast(Player player) { - String translation = Server.getInstance().getLanguage().translateString("chat.type.achievement", player.getDisplayName(), TextFormat.GREEN + this.message, null); - - if (Server.getInstance().announceAchievements) { - Server.getInstance().broadcastMessage(translation); - } else { - player.sendMessage(translation); - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/AdventureSettings.java b/src/main/java/cn/nukkit/AdventureSettings.java deleted file mode 100644 index fb961a2d0..000000000 --- a/src/main/java/cn/nukkit/AdventureSettings.java +++ /dev/null @@ -1,127 +0,0 @@ -package cn.nukkit; - -import cn.nukkit.network.protocol.AdventureSettingsPacket; - -import java.util.EnumMap; -import java.util.Map; - -/** - * Adventure settings - * - * @author MagicDroidX - * Nukkit Project - */ -public class AdventureSettings implements Cloneable { - - public static final int PERMISSION_NORMAL = 0; - public static final int PERMISSION_OPERATOR = 1; - public static final int PERMISSION_HOST = 2; - public static final int PERMISSION_AUTOMATION = 3; - public static final int PERMISSION_ADMIN = 4; - - private final Map values = new EnumMap<>(Type.class); - - private Player player; - - public AdventureSettings(Player player) { - this.player = player; - } - - public AdventureSettings clone(Player newPlayer) { - try { - AdventureSettings settings = (AdventureSettings) super.clone(); - settings.player = newPlayer; - return settings; - } catch (CloneNotSupportedException e) { - return null; - } - } - - /** - * Set an adventure setting value - * - * @param type adventure setting - * @param value new value - * @return AdventureSettings - */ - public AdventureSettings set(Type type, boolean value) { - this.values.put(type, value); - return this; - } - - /** - * Get an adventure setting value - * - * @param type adventure setting - * @return value - */ - public boolean get(Type type) { - Boolean value = this.values.get(type); - return value == null ? type.getDefaultValue() : value; - } - - /** - * Send adventure settings values to the player - */ - public void update() { - AdventureSettingsPacket pk = new AdventureSettingsPacket(); - for (Type t : Type.values()) { - pk.setFlag(t.getId(), get(t)); - } - - pk.commandPermission = (player.isOp() && player.showAdmin() ? AdventureSettingsPacket.PERMISSION_OPERATOR : AdventureSettingsPacket.PERMISSION_NORMAL); - pk.playerPermission = (player.isOp() && player.showAdmin() && !player.isSpectator() ? Player.PERMISSION_OPERATOR : Player.PERMISSION_MEMBER); - pk.entityUniqueId = player.getId(); - - //Server.broadcastPacket(player.getViewers().values(), pk); - player.dataPacket(pk); - - player.resetInAirTicks(); - } - - /** - * List of adventure settings - */ - public enum Type { - WORLD_IMMUTABLE(AdventureSettingsPacket.WORLD_IMMUTABLE, false), - AUTO_JUMP(AdventureSettingsPacket.AUTO_JUMP, true), - ALLOW_FLIGHT(AdventureSettingsPacket.ALLOW_FLIGHT, false), - NO_CLIP(AdventureSettingsPacket.NO_CLIP, false), - WORLD_BUILDER(AdventureSettingsPacket.WORLD_BUILDER, true), - FLYING(AdventureSettingsPacket.FLYING, false), - MUTED(AdventureSettingsPacket.MUTED, false), - BUILD_AND_MINE(AdventureSettingsPacket.BUILD_AND_MINE, true), - DOORS_AND_SWITCHED(AdventureSettingsPacket.DOORS_AND_SWITCHES, true), - OPEN_CONTAINERS(AdventureSettingsPacket.OPEN_CONTAINERS, true), - ATTACK_PLAYERS(AdventureSettingsPacket.ATTACK_PLAYERS, true), - ATTACK_MOBS(AdventureSettingsPacket.ATTACK_MOBS, true), - OPERATOR(AdventureSettingsPacket.OPERATOR, false), - TELEPORT(AdventureSettingsPacket.TELEPORT, false); - - private final int id; - private final boolean defaultValue; - - Type(int id, boolean defaultValue) { - this.id = id; - this.defaultValue = defaultValue; - } - - /** - * Get ID - * - * @return ID - */ - public int getId() { - return id; - } - - /** - * Get default value - * - * @return default value - */ - public boolean getDefaultValue() { - return this.defaultValue; - } - } -} diff --git a/src/main/java/cn/nukkit/IPlayer.java b/src/main/java/cn/nukkit/IPlayer.java deleted file mode 100644 index 8e9bb2908..000000000 --- a/src/main/java/cn/nukkit/IPlayer.java +++ /dev/null @@ -1,126 +0,0 @@ -package cn.nukkit; - -import cn.nukkit.metadata.Metadatable; -import cn.nukkit.permission.ServerOperator; - -import java.util.UUID; - -/** - * An interface to describe a player and get its information. - * - * This player can be online or offline. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.Player - * @see cn.nukkit.OfflinePlayer - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface IPlayer extends ServerOperator, Metadatable { - - /** - * Returns if this player is online. - * - * @return 这个玩家是否在线。
If this player is online. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean isOnline(); - - /** - * Returns the name of this player. - * - * 如果是在线的玩家,这个函数只会返回登录名字。如果要返回显示的名字,参见{@link cn.nukkit.Player#getDisplayName}
- * Notice that this will only return its login name. If you need its display name, turn to - * {@link cn.nukkit.Player#getDisplayName} - * - * @return 这个玩家的名称。
The name of this player. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - String getName(); - - UUID getUniqueId(); - - /** - * Returns if this player is banned. - * - * @return 这个玩家的名称。
The name of this player. - * @see #setBanned - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean isBanned(); - - /** - * Sets this player to be banned or to be pardoned. - * - * @param value 如果为{@code true},封禁这个玩家。如果为{@code false},解封这个玩家。
- * {@code true} for ban and {@code false} for pardon. - * @see #isBanned - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void setBanned(boolean value); - - /** - * Returns if this player is pardoned by whitelist. - * - * @return 这个玩家是否已加入白名单。
If this player is pardoned by whitelist. - * @see cn.nukkit.Server#isWhitelisted - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean isWhitelisted(); - - /** - * Adds this player to the white list, or removes it from the whitelist. - * - * @param value 如果为{@code true},把玩家加入白名单。如果为{@code false},取消这个玩家的白名单。
- * {@code true} for add and {@code false} for remove. - * @see #isWhitelisted - * @see cn.nukkit.Server#addWhitelist - * @see cn.nukkit.Server#removeWhitelist - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void setWhitelisted(boolean value); - - /** - * Returns a {@code Player} object for this interface. - * - * @return 这个接口的 {@code Player}对象。
a {@code Player} object for this interface. - * @see cn.nukkit.Server#getPlayerExact - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Player getPlayer(); - - /** - * Returns the server carrying this player. - * - * @return 玩家所在的服务器。
the server carrying this player. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Server getServer(); - - /** - * Returns the time this player first played in this server. - * - * @return Unix时间(以秒为单位。
Unix time in seconds. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Long getFirstPlayed(); - - /** - * Returns the time this player last joined in this server. - * - * @return Unix时间(以秒为单位。
Unix time in seconds. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Long getLastPlayed(); - - /** - * Returns if this player has played in this server before. - * - * If you want to know if this player is the first time playing in this server, you can use:
- *
if (!player.hasPlayerBefore()) {...}
- * - * @return 这个玩家以前是不是玩过游戏。
If this player has played in this server before. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean hasPlayedBefore(); -} diff --git a/src/main/java/cn/nukkit/InterruptibleThread.java b/src/main/java/cn/nukkit/InterruptibleThread.java deleted file mode 100644 index 6f583f6f2..000000000 --- a/src/main/java/cn/nukkit/InterruptibleThread.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit; - -/** - * An interface to describe a thread that can be interrupted. - * - * When a Nukkit server is stopping, Nukkit finds all threads implements {@code InterruptibleThread}, - * and interrupt them one by one. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.scheduler.AsyncWorker - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface InterruptibleThread { -} diff --git a/src/main/java/cn/nukkit/Nukkit.java b/src/main/java/cn/nukkit/Nukkit.java deleted file mode 100644 index f3ebaa03e..000000000 --- a/src/main/java/cn/nukkit/Nukkit.java +++ /dev/null @@ -1,158 +0,0 @@ -package cn.nukkit; - -import cn.nukkit.utils.ServerKiller; -import com.google.common.base.Preconditions; -import io.netty.util.internal.logging.InternalLoggerFactory; -import io.netty.util.internal.logging.Log4J2LoggerFactory; -import lombok.extern.log4j.Log4j2; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.LoggerConfig; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; -import java.util.Scanner; - -/* - * `_ _ _ _ _ _ - * | \ | | | | | | (_) | - * | \| |_ _| | _| | ___| |_ - * | . ` | | | | |/ / |/ / | __| - * | |\ | |_| | <| <| | |_ - * |_| \_|\__,_|_|\_\_|\_\_|\__| - */ - -/** - * The launcher class of Nukkit, including the {@code main} function - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -@Log4j2 -public class Nukkit { - - public static final String NUKKIT = "Nukkit PetteriM1 Edition"; - public static final String BRANCH = "https://api.github.com/repos/PetteriM1/NukkitPetteriM1Edition/commits/master"; - public final static Properties GIT_INFO = getGitInfo(); - public final static String VERSION = getVersion(); - public final static String PATH = System.getProperty("user.dir") + '/'; - public final static String DATA_PATH = System.getProperty("user.dir") + '/'; - public final static String PLUGIN_PATH = DATA_PATH + "plugins"; - /** - * Server start time - */ - public final static long START_TIME = System.currentTimeMillis(); - /** - * Console title enabled - */ - public static boolean TITLE = true; - /** - * Debug logging level - */ - public static int DEBUG = 1; - - public static void main(String[] args) { - - System.setProperty("java.net.preferIPv4Stack" , "true"); - System.setProperty("log4j.skipJansi", "false"); - System.getProperties().putIfAbsent("io.netty.allocator.type", "unpooled"); // Disable memory pooling unless specified - - // Force Mapped ByteBuffers for LevelDB till fixed - System.setProperty("leveldb.mmap", "true"); - - boolean loadPlugins = true; - boolean debug = false; - - if (args.length > 0 && args[0].equalsIgnoreCase("-debug")) { - debug = true; - InternalLoggerFactory.setDefaultFactory(Log4J2LoggerFactory.INSTANCE); - //ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.PARANOID); - System.out.print("Debug stuff enabled!\n"); - System.out.print("Do you want to skip loading plugins? (yes/no) "); - loadPlugins = !new Scanner(System.in).nextLine().toLowerCase().startsWith("y"); - } - - try { - if (TITLE) { - System.out.print("\u001B]0;Nukkit PetteriM1 Edition\u0007"); - } - new Server(PATH, DATA_PATH, PLUGIN_PATH, loadPlugins, debug); - } catch (Throwable t) { - log.throwing(t); - } - - if (TITLE) { - System.out.print("\u001B]0;Server shutting down...\u0007"); - } - - log.debug("Stopping other threads..."); - - for (Thread thread : java.lang.Thread.getAllStackTraces().keySet()) { - if (!(thread instanceof InterruptibleThread)) { - continue; - } - log.debug("Stopping {} thread", thread.getClass().getSimpleName()); - if (thread.isAlive()) { - thread.interrupt(); - } - } - - ServerKiller killer = new ServerKiller(8); - killer.start(); - - if (TITLE) { - System.out.print("\u001B]0;Server Stopped\u0007"); - } - - System.exit(0); - } - - private static Properties getGitInfo() { - InputStream gitFileStream = Nukkit.class.getClassLoader().getResourceAsStream("git.properties"); - if (gitFileStream == null) { - log.debug("Unable to find git.properties"); - return null; - } - Properties properties = new Properties(); - try { - properties.load(gitFileStream); - } catch (IOException e) { - log.debug("Unable to load git.properties", e); - return null; - } - return properties; - } - - private static String getVersion() { - StringBuilder version = new StringBuilder(); - version.append("git-"); - String commitId; - if (GIT_INFO == null || (commitId = GIT_INFO.getProperty("git.commit.id.abbrev")) == null) { - return version.append("null").toString(); - } - return version.append(commitId).toString(); - } - - public static void setLogLevel(Level level) { - Preconditions.checkNotNull(level, "level"); - LoggerContext ctx = (LoggerContext) LogManager.getContext(false); - LoggerConfig loggerConfig = ctx.getConfiguration().getLoggerConfig(org.apache.logging.log4j.LogManager.ROOT_LOGGER_NAME); - loggerConfig.setLevel(level); - ctx.updateLoggers(); - } - - public static Level getLogLevel() { - return ((LoggerContext) LogManager.getContext(false)).getConfiguration().getLoggerConfig(org.apache.logging.log4j.LogManager.ROOT_LOGGER_NAME).getLevel(); - } - - public static String getBranch() { - String branch; - if (GIT_INFO == null || (branch = GIT_INFO.getProperty("git.branch")) == null) { - return "null"; - } - return branch; - } -} diff --git a/src/main/java/cn/nukkit/OfflinePlayer.java b/src/main/java/cn/nukkit/OfflinePlayer.java deleted file mode 100644 index a4b068c93..000000000 --- a/src/main/java/cn/nukkit/OfflinePlayer.java +++ /dev/null @@ -1,191 +0,0 @@ -package cn.nukkit; - -import cn.nukkit.metadata.MetadataValue; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.plugin.Plugin; - -import java.util.List; -import java.util.UUID; - -/** - * Describes an offline player - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.Player - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public class OfflinePlayer implements IPlayer { - - private final Server server; - private final CompoundTag namedTag; - - /** - * Initializes the object {@code OfflinePlayer}. - * - * @param server 这个玩家所在服务器的{@code Server}对象。
- * The server this player is in, as a {@code Server} object. - * @param uuid 这个玩家的UUID。
- * UUID of this player. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public OfflinePlayer(Server server, UUID uuid) { - this(server, uuid, null); - } - - public OfflinePlayer(Server server, String name) { - this(server, null, name); - } - - public OfflinePlayer(Server server, UUID uuid, String name) { - this.server = server; - - CompoundTag nbt; - if (server.savePlayerDataByUuid) { - if (uuid != null) { - nbt = this.server.getOfflinePlayerData(uuid, false); - } else if (name != null) { - nbt = this.server.getOfflinePlayerData(name, false); - } else { - throw new IllegalArgumentException("Name and UUID cannot both be null"); - } - } else { // When not using UUIDs check for the data saved by name first - if (name != null) { - nbt = this.server.getOfflinePlayerData(name, false); - } else if (uuid != null) { - nbt = this.server.getOfflinePlayerData(uuid, false); - } else { - throw new IllegalArgumentException("Name and UUID cannot both be null"); - } - } - - if (nbt == null) { - nbt = new CompoundTag(); - } - this.namedTag = nbt; - - if (uuid != null) { - this.namedTag.putLong("UUIDMost", uuid.getMostSignificantBits()); - this.namedTag.putLong("UUIDLeast", uuid.getLeastSignificantBits()); - } else { - this.namedTag.putString("NameTag", name); - } - } - - @Override - public boolean isOnline() { - return this.getPlayer() != null; - } - - @Override - public String getName() { - if (namedTag != null && namedTag.contains("NameTag")) { - return namedTag.getString("NameTag"); - } - return null; - } - - @Override - public UUID getUniqueId() { - if (namedTag != null) { - long least = namedTag.getLong("UUIDLeast"); - long most = namedTag.getLong("UUIDMost"); - - if (least != 0 && most != 0) { - return new UUID(most, least); - } - } - return null; - } - - public Server getServer() { - return server; - } - - @Override - public boolean isOp() { - return this.server.isOp(this.getName().toLowerCase()); - } - - @Override - public void setOp(boolean value) { - if (this.getName() == null) { - Server.getInstance().getLogger().warning("Tried to OP invalid OfflinePlayer"); - return; - } - - if (value == this.isOp()) { - return; - } - - if (value) { - this.server.addOp(this.getName().toLowerCase()); - } else { - this.server.removeOp(this.getName().toLowerCase()); - } - } - - @Override - public boolean isBanned() { - return this.server.getNameBans().isBanned(this.getName()); - } - - @Override - public void setBanned(boolean value) { - if (value) { - this.server.getNameBans().addBan(this.getName(), null, null, null); - } else { - this.server.getNameBans().remove(this.getName()); - } - } - - @Override - public boolean isWhitelisted() { - return this.server.isWhitelisted(this.getName().toLowerCase()); - } - - @Override - public void setWhitelisted(boolean value) { - if (value) { - this.server.addWhitelist(this.getName().toLowerCase()); - } else { - this.server.removeWhitelist(this.getName().toLowerCase()); - } - } - - @Override - public Player getPlayer() { - return this.server.getPlayerExact(this.getName()); - } - - @Override - public Long getFirstPlayed() { - return this.namedTag != null ? this.namedTag.getLong("firstPlayed") : null; - } - - @Override - public Long getLastPlayed() { - return this.namedTag != null ? this.namedTag.getLong("lastPlayed") : null; - } - - @Override - public boolean hasPlayedBefore() { - return this.namedTag != null; - } - - public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { - this.server.getPlayerMetadata().setMetadata(this, metadataKey, newMetadataValue); - } - - public List getMetadata(String metadataKey) { - return this.server.getPlayerMetadata().getMetadata(this, metadataKey); - } - - public boolean hasMetadata(String metadataKey) { - return this.server.getPlayerMetadata().hasMetadata(this, metadataKey); - } - - public void removeMetadata(String metadataKey, Plugin owningPlugin) { - this.server.getPlayerMetadata().removeMetadata(this, metadataKey, owningPlugin); - } -} diff --git a/src/main/java/cn/nukkit/Player.java b/src/main/java/cn/nukkit/Player.java deleted file mode 100644 index d222fd42d..000000000 --- a/src/main/java/cn/nukkit/Player.java +++ /dev/null @@ -1,5951 +0,0 @@ -package cn.nukkit; - -import cn.nukkit.AdventureSettings.Type; -import cn.nukkit.block.*; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityItemFrame; -import cn.nukkit.blockentity.BlockEntitySpawnable; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandDataVersions; -import cn.nukkit.entity.*; -import cn.nukkit.entity.data.*; -import cn.nukkit.entity.item.EntityBoat; -import cn.nukkit.entity.item.EntityFishingHook; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.entity.item.EntityXPOrb; -import cn.nukkit.entity.mob.EntityEnderman; -import cn.nukkit.entity.mob.EntityWalkingMob; -import cn.nukkit.entity.mob.EntityWolf; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.entity.projectile.EntityThrownTrident; -import cn.nukkit.event.block.WaterFrostEvent; -import cn.nukkit.event.entity.*; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.EntityDamageEvent.DamageModifier; -import cn.nukkit.event.inventory.InventoryCloseEvent; -import cn.nukkit.event.inventory.InventoryPickupArrowEvent; -import cn.nukkit.event.inventory.InventoryPickupItemEvent; -import cn.nukkit.event.inventory.InventoryPickupTridentEvent; -import cn.nukkit.event.player.*; -import cn.nukkit.event.player.PlayerAsyncPreLoginEvent.LoginResult; -import cn.nukkit.event.player.PlayerInteractEvent.Action; -import cn.nukkit.event.player.PlayerTeleportEvent.TeleportCause; -import cn.nukkit.event.server.DataPacketReceiveEvent; -import cn.nukkit.event.server.DataPacketSendEvent; -import cn.nukkit.form.window.FormWindow; -import cn.nukkit.form.window.FormWindowCustom; -import cn.nukkit.inventory.*; -import cn.nukkit.inventory.transaction.CraftingTransaction; -import cn.nukkit.inventory.transaction.EnchantTransaction; -import cn.nukkit.inventory.transaction.InventoryTransaction; -import cn.nukkit.inventory.transaction.RepairItemTransaction; -import cn.nukkit.inventory.transaction.action.InventoryAction; -import cn.nukkit.inventory.transaction.data.ReleaseItemData; -import cn.nukkit.inventory.transaction.data.UseItemData; -import cn.nukkit.inventory.transaction.data.UseItemOnEntityData; -import cn.nukkit.item.*; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.food.Food; -import cn.nukkit.lang.TextContainer; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.*; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.level.particle.PunchBlockParticle; -import cn.nukkit.level.sound.ExperienceOrbSound; -import cn.nukkit.math.*; -import cn.nukkit.metadata.MetadataValue; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.*; -import cn.nukkit.network.SourceInterface; -import cn.nukkit.network.protocol.*; -import cn.nukkit.network.protocol.types.ContainerIds; -import cn.nukkit.network.protocol.types.NetworkInventoryAction; -import cn.nukkit.permission.PermissibleBase; -import cn.nukkit.permission.Permission; -import cn.nukkit.permission.PermissionAttachment; -import cn.nukkit.permission.PermissionAttachmentInfo; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.potion.Effect; -import cn.nukkit.potion.Potion; -import cn.nukkit.resourcepacks.ResourcePack; -import cn.nukkit.scheduler.AsyncTask; -import cn.nukkit.utils.*; -import co.aikar.timings.Timing; -import co.aikar.timings.Timings; -import com.google.common.base.Strings; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.google.gson.JsonParser; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.longs.LongIterator; -import it.unimi.dsi.fastutil.objects.ObjectIterator; -import lombok.extern.log4j.Log4j2; -import org.apache.commons.math3.util.FastMath; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.Field; -import java.net.InetSocketAddress; -import java.net.URL; -import java.net.URLConnection; -import java.nio.ByteOrder; -import java.util.List; -import java.util.*; -import java.util.Queue; -import java.util.Map.Entry; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentLinkedDeque; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; -import java.util.stream.Stream; - -/** - * The Player class - * - * @author MagicDroidX & Box - * Nukkit Project - */ -@Log4j2 -public class Player extends EntityHuman implements CommandSender, InventoryHolder, ChunkLoader, IPlayer { - - public static final int SURVIVAL = 0; - public static final int CREATIVE = 1; - public static final int ADVENTURE = 2; - public static final int SPECTATOR = 3; - public static final int VIEW = SPECTATOR; - - public static final int CRAFTING_SMALL = 0; - public static final int CRAFTING_BIG = 1; - public static final int CRAFTING_ANVIL = 2; - public static final int CRAFTING_ENCHANT = 3; - public static final int CRAFTING_BEACON = 4; - - public static final float DEFAULT_SPEED = 0.1f; - public static final float MAXIMUM_SPEED = 0.5f; - - public static final int PERMISSION_CUSTOM = 3; - public static final int PERMISSION_OPERATOR = 2; - public static final int PERMISSION_MEMBER = 1; - public static final int PERMISSION_VISITOR = 0; - - public static final int ANVIL_WINDOW_ID = 2; - public static final int ENCHANT_WINDOW_ID = 3; - public static final int BEACON_WINDOW_ID = 4; - - protected final SourceInterface interfaz; - - public boolean playedBefore; - public boolean spawned = false; - public boolean loggedIn = false; - private boolean verified = false; - private int unverifiedPackets; - public int gamemode; - public long lastBreak = -1; - private BlockVector3 lastBreakPosition = new BlockVector3(); - - protected int windowCnt = 4; - - protected final BiMap windows = HashBiMap.create(); - protected final BiMap windowIndex = windows.inverse(); - protected final Set permanentWindows = new IntOpenHashSet(); - private boolean inventoryOpen; - protected int closingWindowId = Integer.MIN_VALUE; - - public Vector3 speed = null; - - public final HashSet achievements = new HashSet<>(); - - public int craftingType = CRAFTING_SMALL; - - protected PlayerUIInventory playerUIInventory; - protected CraftingGrid craftingGrid; - protected CraftingTransaction craftingTransaction; - protected EnchantTransaction enchantTransaction; - protected RepairItemTransaction repairItemTransaction; - - protected long randomClientId; - - protected Vector3 forceMovement = null; - - protected Vector3 teleportPosition = null; - - protected boolean connected = true; - protected final InetSocketAddress socketAddress; - protected boolean removeFormat = true; - - protected String username; - protected String iusername; - protected String displayName; - - /** - * Client protocol version - */ - public int protocol = 999; - /** - * Client RakNet protocol version - */ - public int raknetProtocol; - /** - * Client version string - */ - protected String version; - - protected int startAction = -1; - - protected Vector3 sleeping = null; - - private final int loaderId; - - public final Map usedChunks = new Long2ObjectOpenHashMap<>(); - - private int chunksSent = 0; - private boolean hasSpawnChunks; - protected final Long2ObjectLinkedOpenHashMap loadQueue = new Long2ObjectLinkedOpenHashMap<>(); - protected int nextChunkOrderRun = 1; - - protected final Map hiddenPlayers = new HashMap<>(); - - protected Vector3 newPosition = null; - - protected int chunkRadius; - protected int viewDistance; - - protected Position spawnPosition; - - protected int inAirTicks = 0; - protected int startAirTicks = 10; - - protected AdventureSettings adventureSettings; - - protected boolean checkMovement = true; - - private final Queue packetQueue = new ConcurrentLinkedDeque<>(); - - private PermissibleBase perm; - /** - * Option to hide admin permissions from player list tab in client. - * Admin player shown in server list will look same as normal player. - */ - private boolean showAdmin = true; - /** - * Option not to spawn the player for others. - */ - public boolean showToOthers = true; - - private int exp = 0; - private int expLevel = 0; - - protected PlayerFood foodData = null; - - private Entity killer = null; - - private final AtomicReference locale = new AtomicReference<>(null); - - private int hash; - - private String buttonText = "Button"; - - protected boolean enableClientCommand = true; - - private BlockEnderChest viewingEnderChest = null; - - private LoginChainData loginChainData; - - public Block breakingBlock = null; - - public int pickedXPOrb = 0; - private boolean canPickupXP = true; - - protected int formWindowCount = 0; - public Map formWindows = new Int2ObjectOpenHashMap<>(); - protected Map serverSettings = new Int2ObjectOpenHashMap<>(); - - protected Map dummyBossBars = new Long2ObjectLinkedOpenHashMap<>(); - - private AsyncTask preLoginEventTask = null; - protected boolean shouldLogin = false; - - private static Stream pkIDs; - - private int lastEmote; - private int lastEnderPearl = 20; - private int lastChorusFruitTeleport = 20; - public long lastSkinChange = -1; - private double lastRightClickTime = 0.0; - private Vector3 lastRightClickPos = null; - public EntityFishingHook fishing = null; - public boolean formOpen; - public boolean locallyInitialized; - private boolean foodEnabled = true; - private int failedTransactions; - private int timeSinceRest; - private boolean inSoulSand; - private boolean dimensionChangeInProgress; - - /** - * Packets that can be received before the player has logged in - */ - private static final List PRE_LOGIN_PACKETS = Arrays.asList(ProtocolInfo.BATCH_PACKET, ProtocolInfo.LOGIN_PACKET, ProtocolInfo.REQUEST_CHUNK_RADIUS_PACKET, ProtocolInfo.SET_LOCAL_PLAYER_AS_INITIALIZED_PACKET, ProtocolInfo.RESOURCE_PACK_CHUNK_REQUEST_PACKET, ProtocolInfo.RESOURCE_PACK_CLIENT_RESPONSE_PACKET, ProtocolInfo.CLIENT_CACHE_STATUS_PACKET, ProtocolInfo.PACKET_VIOLATION_WARNING_PACKET); - - public int getStartActionTick() { - return startAction; - } - - public void startAction() { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ACTION, true); - this.startAction = this.server.getTick(); - } - - public void stopAction() { - this.setDataFlag(Player.DATA_FLAGS, Player.DATA_FLAG_ACTION, false); - this.startAction = -1; - } - - public int getLastEnderPearlThrowingTick() { - return lastEnderPearl; - } - - public void onThrowEnderPearl() { - this.lastEnderPearl = this.server.getTick(); - } - - public int getLastChorusFruitTeleport() { - return lastChorusFruitTeleport; - } - - public void onChorusFruitTeleport() { - this.lastChorusFruitTeleport = this.server.getTick(); - } - - public BlockEnderChest getViewingEnderChest() { - return viewingEnderChest; - } - - public void setViewingEnderChest(BlockEnderChest chest) { - if (chest == null && this.viewingEnderChest != null) { - this.viewingEnderChest.getViewers().remove(this); - } else if (chest != null) { - chest.getViewers().add(this); - } - this.viewingEnderChest = chest; - } - - public TranslationContainer getLeaveMessage() { - return new TranslationContainer(TextFormat.YELLOW + "%multiplayer.player.left", this.displayName); - } - - /** - * This might disappear in the future. - * Please use getUniqueId() instead (IP + clientId + name combo, in the future it'll change to real UUID for online auth) - * @return random client id - */ - public Long getClientId() { - return randomClientId; - } - - @Override - public boolean isBanned() { - return this.server.getNameBans().isBanned(this.username); - } - - @Override - public void setBanned(boolean value) { - if (value) { - this.server.getNameBans().addBan(this.username, null, null, null); - this.kick(PlayerKickEvent.Reason.NAME_BANNED, "You are banned!"); - } else { - this.server.getNameBans().remove(this.username); - } - } - - @Override - public boolean isWhitelisted() { - return this.server.isWhitelisted(this.username.toLowerCase()); - } - - @Override - public void setWhitelisted(boolean value) { - if (value) { - this.server.addWhitelist(this.username.toLowerCase()); - } else { - this.server.removeWhitelist(this.username.toLowerCase()); - } - } - - @Override - public Player getPlayer() { - return this; - } - - @Override - public Long getFirstPlayed() { - return this.namedTag != null ? this.namedTag.getLong("firstPlayed") : null; - } - - @Override - public Long getLastPlayed() { - return this.namedTag != null ? this.namedTag.getLong("lastPlayed") : null; - } - - @Override - public boolean hasPlayedBefore() { - return this.playedBefore; - } - - public AdventureSettings getAdventureSettings() { - return adventureSettings; - } - - public void setAdventureSettings(AdventureSettings adventureSettings) { - this.adventureSettings = adventureSettings.clone(this); - this.adventureSettings.update(); - } - - public void resetInAirTicks() { - this.inAirTicks = 0; - } - - public void setAllowFlight(boolean value) { - this.adventureSettings.set(Type.ALLOW_FLIGHT, value); - this.adventureSettings.update(); - } - - public boolean getAllowFlight() { - return this.adventureSettings.get(Type.ALLOW_FLIGHT); - } - - public void setAllowModifyWorld(boolean value) { - this.adventureSettings.set(Type.WORLD_IMMUTABLE, !value); - this.adventureSettings.set(Type.BUILD_AND_MINE, value); - this.adventureSettings.set(Type.WORLD_BUILDER, value); - this.adventureSettings.update(); - } - - public void setAllowInteract(boolean value) { - setAllowInteract(value, value); - } - - public void setAllowInteract(boolean value, boolean containers) { - this.adventureSettings.set(Type.WORLD_IMMUTABLE, !value); - this.adventureSettings.set(Type.DOORS_AND_SWITCHED, value); - this.adventureSettings.set(Type.OPEN_CONTAINERS, containers); - this.adventureSettings.update(); - } - - public void setAutoJump(boolean value) { - this.adventureSettings.set(Type.AUTO_JUMP, value); - this.adventureSettings.update(); - } - - public boolean hasAutoJump() { - return this.adventureSettings.get(Type.AUTO_JUMP); - } - - @Override - public void spawnTo(Player player) { - if (this.spawned && player.spawned && this.isAlive() && player.isAlive() && player.getLevel() == this.level && player.canSee(this) && !this.isSpectator() && this.showToOthers) { - super.spawnTo(player); - } - } - - public boolean getRemoveFormat() { - return removeFormat; - } - - public void setRemoveFormat() { - this.setRemoveFormat(true); - } - - public void setRemoveFormat(boolean remove) { - this.removeFormat = remove; - } - - public boolean canSee(Player player) { - return !this.hiddenPlayers.containsKey(player.getUniqueId()); - } - - public void hidePlayer(Player player) { - if (this == player) { - return; - } - this.hiddenPlayers.put(player.getUniqueId(), player); - player.despawnFrom(this); - } - - public void showPlayer(Player player) { - if (this == player) { - return; - } - this.hiddenPlayers.remove(player.getUniqueId()); - if (player.isOnline()) { - player.spawnTo(this); - } - } - - @Override - public boolean canCollideWith(Entity entity) { - return false; - } - - public boolean canPickupXP() { - return this.canPickupXP; - } - - public void setCanPickupXP(boolean canPickupXP) { - this.canPickupXP = canPickupXP; - } - - @Override - public void resetFallDistance() { - super.resetFallDistance(); - if (this.inAirTicks != 0) { - this.startAirTicks = 10; - } - this.inAirTicks = 0; - } - - @Override - public boolean isOnline() { - return this.connected && this.loggedIn; - } - - @Override - public boolean isOp() { - return this.server.isOp(this.username); - } - - @Override - public void setOp(boolean value) { - if (value == this.isOp()) { - return; - } - - if (value) { - this.server.addOp(this.username); - } else { - this.server.removeOp(this.username); - } - - this.recalculatePermissions(); - this.adventureSettings.update(); - this.sendCommandData(); - } - - /** - * Set visibility of player's admin status on the player list - */ - public void setShowAdmin(boolean showAdmin) { - this.showAdmin = showAdmin; - } - - /** - * Get visibility of player's admin status on the player list - */ - public boolean showAdmin() { - return this.showAdmin; - } - - @Override - public boolean isPermissionSet(String name) { - return this.perm.isPermissionSet(name); - } - - @Override - public boolean isPermissionSet(Permission permission) { - return this.perm.isPermissionSet(permission); - } - - @Override - public boolean hasPermission(String name) { - return this.perm != null && this.perm.hasPermission(name); - } - - @Override - public boolean hasPermission(Permission permission) { - return this.perm.hasPermission(permission); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin) { - return this.addAttachment(plugin, null); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, String name) { - return this.addAttachment(plugin, name, null); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, String name, Boolean value) { - return this.perm.addAttachment(plugin, name, value); - } - - @Override - public void removeAttachment(PermissionAttachment attachment) { - this.perm.removeAttachment(attachment); - } - - @Override - public void recalculatePermissions() { - this.server.getPluginManager().unsubscribeFromPermission(Server.BROADCAST_CHANNEL_USERS, this); - this.server.getPluginManager().unsubscribeFromPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE, this); - - if (this.perm == null) { - return; - } - - this.perm.recalculatePermissions(); - - if (this.hasPermission(Server.BROADCAST_CHANNEL_USERS)) { - this.server.getPluginManager().subscribeToPermission(Server.BROADCAST_CHANNEL_USERS, this); - } - - if (this.hasPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE)) { - this.server.getPluginManager().subscribeToPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE, this); - } - - if (this.enableClientCommand && spawned) this.sendCommandData(); - } - - /** - * Are commands enabled for this player on the client side - * @return commands enabled - */ - public boolean isEnableClientCommand() { - return this.enableClientCommand; - } - - public void setEnableClientCommand(boolean enable) { - this.enableClientCommand = enable; - SetCommandsEnabledPacket pk = new SetCommandsEnabledPacket(); - pk.enabled = enable; - this.dataPacket(pk); - if (enable) this.sendCommandData(); - } - - public void sendCommandData() { - AvailableCommandsPacket pk = new AvailableCommandsPacket(); - Map data = new HashMap<>(); - - for (Command command : this.server.getCommandMap().getCommands().values()) { - if (!command.testPermissionSilent(this) || !command.isRegistered()) { - continue; - } - - data.put(command.getName(), command.generateCustomCommandData(this)); - } - - if (data.size() != 0) { - pk.commands = data; - this.dataPacket(pk); - } - } - - @Override - public Map getEffectivePermissions() { - return this.perm.getEffectivePermissions(); - } - - public Player(SourceInterface interfaz, Long clientID, InetSocketAddress socketAddress) { - super(null, new CompoundTag()); - this.interfaz = interfaz; - this.perm = new PermissibleBase(this); - this.server = Server.getInstance(); - this.socketAddress = socketAddress; - this.loaderId = Level.generateChunkLoaderId(this); - this.gamemode = this.server.getGamemode(); - this.setLevel(this.server.getDefaultLevel()); - this.viewDistance = this.server.getViewDistance(); - this.chunkRadius = viewDistance; - this.boundingBox = new AxisAlignedBB(0, 0, 0, 0, 0, 0); - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.addDefaultWindows(); - } - - public boolean isPlayer() { - return true; - } - - public void removeAchievement(String achievementId) { - achievements.remove(achievementId); - } - - public boolean hasAchievement(String achievementId) { - return achievements.contains(achievementId); - } - - public boolean isConnected() { - return connected; - } - - public String getDisplayName() { - return this.displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - if (this.spawned) { - this.server.updatePlayerListData(this.getUniqueId(), this.getId(), this.displayName, this.getSkin(), this.loginChainData.getXUID()); - } - } - - @Override - public void setSkin(Skin skin) { - super.setSkin(skin); - if (this.spawned) { - this.server.updatePlayerListData(this.getUniqueId(), this.getId(), this.displayName, skin, this.loginChainData.getXUID()); - } - } - - public String getAddress() { - return this.socketAddress.getAddress().getHostAddress(); - } - - public int getPort() { - return this.socketAddress.getPort(); - } - - public InetSocketAddress getSocketAddress() { - return this.socketAddress; - } - - public Position getNextPosition() { - return this.newPosition != null ? new Position(this.newPosition.x, this.newPosition.y, this.newPosition.z, this.level) : this.getPosition(); - } - - public boolean isSleeping() { - return this.sleeping != null; - } - - public int getInAirTicks() { - return this.inAirTicks; - } - - /** - * Returns whether the player is currently using an item (right-click and hold). - * - * @return whether the player is currently using an item - */ - public boolean isUsingItem() { - return this.getDataFlag(DATA_FLAGS, DATA_FLAG_ACTION) && this.startAction > -1; - } - - public void setUsingItem(boolean value) { - this.startAction = value ? this.server.getTick() : -1; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ACTION, value); - } - - public String getButtonText() { - return this.buttonText; - } - - public void setButtonText(String text) { - if (!text.equals(buttonText)) { - this.buttonText = text; - this.setDataPropertyAndSendOnlyToSelf(new StringEntityData(Entity.DATA_INTERACTIVE_TAG, this.buttonText)); - } - } - - public void unloadChunk(int x, int z) { - this.unloadChunk(x, z, null); - } - - public void unloadChunk(int x, int z, Level level) { - level = level == null ? this.level : level; - long index = Level.chunkHash(x, z); - if (this.usedChunks.containsKey(index)) { - for (Entity entity : level.getChunkEntities(x, z).values()) { - if (entity != this) { - entity.despawnFrom(this); - } - } - - this.usedChunks.remove(index); - } - level.unregisterChunkLoader(this, x, z); - this.loadQueue.remove(index); - } - - private void unloadChunks(boolean online) { - for (long index : this.usedChunks.keySet()) { - int chunkX = Level.getHashX(index); - int chunkZ = Level.getHashZ(index); - this.level.unregisterChunkLoader(this, chunkX, chunkZ); - - for (Entity entity : level.getChunkEntities(chunkX, chunkZ).values()) { - if (entity != this) { - if (online) { - entity.despawnFrom(this); - } else { - entity.hasSpawned.remove(loaderId); - } - } - } - } - - this.usedChunks.clear(); - this.loadQueue.clear(); - } - - public Position getSpawn() { - if (this.spawnPosition != null && this.spawnPosition.getLevel() != null) { - return this.spawnPosition; - } else { - return this.server.getDefaultLevel().getSafeSpawn(); - } - } - - public void sendChunk(int x, int z, DataPacket packet) { - if (!this.connected) { - return; - } - - this.usedChunks.put(Level.chunkHash(x, z), Boolean.TRUE); - - this.dataPacket(packet); - - this.chunksSent++; - - if (this.spawned) { - for (Entity entity : this.level.getChunkEntities(x, z).values()) { - if (this != entity && !entity.closed && entity.isAlive()) { - entity.spawnTo(this); - } - } - } - } - - public void sendChunk(int x, int z, int subChunkCount, byte[] payload) { - if (!this.connected) { - return; - } - - this.usedChunks.put(Level.chunkHash(x, z), true); - - LevelChunkPacket pk = new LevelChunkPacket(); - pk.chunkX = x; - pk.chunkZ = z; - pk.subChunkCount = subChunkCount; - pk.data = payload; - - this.batchDataPacket(pk); - /*if (this.protocol < ProtocolInfo.v1_12_0) { - this.dataPacket(pk); // Multiversion for batchPackets is broken? - } else { - this.server.batchPackets(new Player[]{this}, new DataPacket[]{pk}, true); - }*/ - - this.chunksSent++; - - if (this.spawned) { - for (Entity entity : this.level.getChunkEntities(x, z).values()) { - if (this != entity && !entity.closed && entity.isAlive()) { - entity.spawnTo(this); - } - } - } - } - - protected void sendNextChunk() { - if (!this.connected) { - return; - } - - if (Timings.playerChunkSendTimer != null) Timings.playerChunkSendTimer.startTiming(); - - if (!loadQueue.isEmpty()) { - int count = 0; - ObjectIterator> iter = loadQueue.long2ObjectEntrySet().fastIterator(); - while (iter.hasNext()) { - if (count >= server.chunksPerTick) { - break; - } - - Long2ObjectMap.Entry entry = iter.next(); - long index = entry.getLongKey(); - int chunkX = Level.getHashX(index); - int chunkZ = Level.getHashZ(index); - - ++count; - - try { - this.usedChunks.put(index, false); - this.level.registerChunkLoader(this, chunkX, chunkZ, false); - - if (!this.level.populateChunk(chunkX, chunkZ)) { - if (this.spawned && this.teleportPosition == null) { - continue; - } else { - break; - } - } - - iter.remove(); - } catch (Exception ex) { - server.getLogger().logException(ex); - return; - } - - PlayerChunkRequestEvent ev = new PlayerChunkRequestEvent(this, chunkX, chunkZ); - this.server.getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.level.requestChunk(chunkX, chunkZ, this); - } - } - } - - if (!this.hasSpawnChunks && this.chunksSent >= server.spawnThreshold) { - this.hasSpawnChunks = true; - - if (this.protocol <= 274) { - this.doFirstSpawn(); - } - - this.sendPlayStatus(PlayStatusPacket.PLAYER_SPAWN); - - // Not really needed on Nukkit PM1E, but it's here for plugin compatibility - this.server.getPluginManager().callEvent(new PlayerLocallyInitializedEvent(this)); - } - - if (Timings.playerChunkSendTimer != null) Timings.playerChunkSendTimer.stopTiming(); - } - - protected void doFirstSpawn() { - this.locallyInitialized = true; - - if (this.spawned) { - return; - } - - this.noDamageTicks = 60; - this.setAirTicks(400); - - if (this.hasPermission(Server.BROADCAST_CHANNEL_USERS)) { - this.server.getPluginManager().subscribeToPermission(Server.BROADCAST_CHANNEL_USERS, this); - } - - if (this.hasPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE)) { - this.server.getPluginManager().subscribeToPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE, this); - } - - boolean dead = this.getHealth() < 1; - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this, this.level.getSafeSpawn(dead ? this.getSpawn() : this), true); - this.server.getPluginManager().callEvent(respawnEvent); - - if (dead) { - if (this.server.isHardcore()) { - this.setBanned(true); - return; - } - - this.teleport(respawnEvent.getRespawnPosition(), null); - - if (this.protocol < ProtocolInfo.v1_13_0) { - RespawnPacket respawnPacket = new RespawnPacket(); - respawnPacket.x = (float) respawnEvent.getRespawnPosition().x; - respawnPacket.y = (float) respawnEvent.getRespawnPosition().y; - respawnPacket.z = (float) respawnEvent.getRespawnPosition().z; - this.dataPacket(respawnPacket); - } - - this.setHealth(this.getMaxHealth()); - this.foodData.setLevel(20, 20); - this.sendData(this); - } else { - this.setPosition(respawnEvent.getRespawnPosition()); - this.sendPosition(respawnEvent.getRespawnPosition(), yaw, pitch, MovePlayerPacket.MODE_RESET); - - if (this.protocol < ProtocolInfo.v1_5_0) { - RespawnPacket respawnPacket = new RespawnPacket(); - respawnPacket.x = (float) respawnEvent.getRespawnPosition().x; - respawnPacket.y = (float) respawnEvent.getRespawnPosition().y; - respawnPacket.z = (float) respawnEvent.getRespawnPosition().z; - this.dataPacket(respawnPacket); - } - - this.getLevel().sendTime(this); - this.getLevel().sendWeather(this); - } - - this.spawned = true; - - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(this, - new TranslationContainer(TextFormat.YELLOW + "%multiplayer.player.joined", new String[]{this.displayName}) - ); - - this.server.getPluginManager().callEvent(playerJoinEvent); - - if (playerJoinEvent.getJoinMessage().toString().trim().length() > 0) { - this.server.broadcastMessage(playerJoinEvent.getJoinMessage()); - } - - for (long index : this.usedChunks.keySet()) { - int chunkX = Level.getHashX(index); - int chunkZ = Level.getHashZ(index); - for (Entity entity : this.level.getChunkEntities(chunkX, chunkZ).values()) { - if (this != entity && !entity.closed && entity.isAlive()) { - entity.spawnTo(this); - } - } - } - - // Prevent PlayerTeleportEvent during player spawn - //this.teleport(pos, null); - - if (!this.isSpectator()) { - this.spawnToAll(); - } - - if (server.updateChecks && this.isOp()) { - CompletableFuture.runAsync(() -> { - try { - URLConnection request = new URL(Nukkit.BRANCH).openConnection(); - request.connect(); - InputStreamReader content = new InputStreamReader((InputStream) request.getContent()); - String latest = "git-" + new JsonParser().parse(content).getAsJsonObject().get("sha").getAsString().substring(0, 7); - content.close(); - - if (Nukkit.getBranch().equals("master")) { - if (!server.getNukkitVersion().equals(latest) && !server.getNukkitVersion().equals("git-null")) { - this.sendMessage("\u00A7c[Update] \u00A7eThere is a new build of Nukkit PetteriM1 Edition available! Current: " + server.getNukkitVersion() + " Latest: " + latest); - } - } - } catch (Exception ignore) {} - }); - } - } - - protected boolean orderChunks() { - if (!this.connected) { - return false; - } - - if (Timings.playerChunkOrderTimer != null) Timings.playerChunkOrderTimer.startTiming(); - - this.nextChunkOrderRun = 200; - - loadQueue.clear(); - Long2ObjectOpenHashMap lastChunk = new Long2ObjectOpenHashMap<>(this.usedChunks); - - int centerX = (int) this.x >> 4; - int centerZ = (int) this.z >> 4; - - int radius = spawned ? this.chunkRadius : server.c_s_spawnThreshold; - int radiusSqr = radius * radius; - - long index; - for (int x = 0; x <= radius; x++) { - int xx = x * x; - for (int z = 0; z <= x; z++) { - int distanceSqr = xx + z * z; - if (distanceSqr > radiusSqr) continue; - - /* Top right quadrant */ - if (this.usedChunks.get(index = Level.chunkHash(centerX + x, centerZ + z)) != Boolean.TRUE) { - this.loadQueue.put(index, Boolean.TRUE); - } - lastChunk.remove(index); - /* Top left quadrant */ - if (this.usedChunks.get(index = Level.chunkHash(centerX - x - 1, centerZ + z)) != Boolean.TRUE) { - this.loadQueue.put(index, Boolean.TRUE); - } - lastChunk.remove(index); - /* Bottom right quadrant */ - if (this.usedChunks.get(index = Level.chunkHash(centerX + x, centerZ - z - 1)) != Boolean.TRUE) { - this.loadQueue.put(index, Boolean.TRUE); - } - lastChunk.remove(index); - /* Bottom left quadrant */ - if (this.usedChunks.get(index = Level.chunkHash(centerX - x - 1, centerZ - z - 1)) != Boolean.TRUE) { - this.loadQueue.put(index, Boolean.TRUE); - } - lastChunk.remove(index); - if (x != z) { - /* Top right quadrant mirror */ - if (this.usedChunks.get(index = Level.chunkHash(centerX + z, centerZ + x)) != Boolean.TRUE) { - this.loadQueue.put(index, Boolean.TRUE); - } - lastChunk.remove(index); - /* Top left quadrant mirror */ - if (this.usedChunks.get(index = Level.chunkHash(centerX - z - 1, centerZ + x)) != Boolean.TRUE) { - this.loadQueue.put(index, Boolean.TRUE); - } - lastChunk.remove(index); - /* Bottom right quadrant mirror */ - if (this.usedChunks.get(index = Level.chunkHash(centerX + z, centerZ - x - 1)) != Boolean.TRUE) { - this.loadQueue.put(index, Boolean.TRUE); - } - lastChunk.remove(index); - /* Bottom left quadrant mirror */ - if (this.usedChunks.get(index = Level.chunkHash(centerX - z - 1, centerZ - x - 1)) != Boolean.TRUE) { - this.loadQueue.put(index, Boolean.TRUE); - } - lastChunk.remove(index); - } - } - } - - LongIterator keys = lastChunk.keySet().iterator(); - while (keys.hasNext()) { - index = keys.nextLong(); - this.unloadChunk(Level.getHashX(index), Level.getHashZ(index)); - } - - if (this.protocol >= 313) { - if (!loadQueue.isEmpty()) { - NetworkChunkPublisherUpdatePacket packet = new NetworkChunkPublisherUpdatePacket(); - packet.position = this.asBlockVector3(); - packet.radius = this.chunkRadius << 4; - this.dataPacket(packet); - } - } - - if (Timings.playerChunkOrderTimer != null) Timings.playerChunkOrderTimer.stopTiming(); - return true; - } - - public boolean batchDataPacket(DataPacket packet) { - if (packet.pid() == ProtocolInfo.BATCH_PACKET) { - return this.directDataPacket(packet); // We don't want to batch a batched packet - } - - if (!this.connected) { - return false; - } - - packet.protocol = this.protocol; - - try (Timing ignore = Timings.getSendDataPacketTiming(packet)) { - if (server.callDataPkSendEv) { - DataPacketSendEvent event = new DataPacketSendEvent(this, packet); - this.server.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return false; - } - } - - if (Nukkit.DEBUG > 2 /*&& !server.isIgnoredPacket(packet.getClass())*/) { - log.trace("Outbound {}: {}", this.getName(), packet); - } - - this.packetQueue.offer(packet); - } - return true; - } - - /** - * 0 is true - * -1 is false - * other is identifer - * @param packet packet to send - * @return packet successfully sent - */ - public boolean dataPacket(DataPacket packet) { - if (this.protocol >= ProtocolInfo.v1_16_100) { - return batchDataPacket(packet); - } - - if (packet.pid() == ProtocolInfo.BATCH_PACKET) { - return this.directDataPacket(packet); // We don't want to batch a batched packet - } - - if (!this.connected) { - return false; - } - - packet.protocol = this.protocol; - - try (Timing ignore = Timings.getSendDataPacketTiming(packet)) { - if (server.callDataPkSendEv) { - DataPacketSendEvent ev = new DataPacketSendEvent(this, packet); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - } - - if (Nukkit.DEBUG > 2 /*&& !server.isIgnoredPacket(packet.getClass())*/) { - log.trace("Outbound {}: {}", this.getName(), packet); - } - - this.interfaz.putPacket(this, packet, false, false); - } - return true; - } - - public int dataPacket(DataPacket packet, boolean needACK) { - return this.dataPacket(packet) ? 0 : -1; - } - - /** - * 0 is true - * -1 is false - * other is identifer - * @param packet packet to send - * @return packet successfully sent - */ - public boolean directDataPacket(DataPacket packet) { - if (!this.connected) { - return false; - } - - if (!loggedIn && packet.pid() == ProtocolInfo.SET_ENTITY_DATA_PACKET) { - return false; //HACK - } - - packet.protocol = this.protocol; - - try (Timing ignore = Timings.getSendDataPacketTiming(packet)) { - if (server.callDataPkSendEv && packet.pid() != ProtocolInfo.BATCH_PACKET) { - DataPacketSendEvent ev = new DataPacketSendEvent(this, packet); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - } - - if (Nukkit.DEBUG > 2 /*&& !server.isIgnoredPacket(packet.getClass())*/ && packet.pid() != ProtocolInfo.BATCH_PACKET) { - log.trace("Outbound {}: {}", this.getName(), packet); - } - - this.interfaz.putPacket(this, packet, false, true); - } - - return true; - } - - public int directDataPacket(DataPacket packet, boolean needACK) { - return this.directDataPacket(packet) ? 0 : -1; - } - - /** - * Get network latency - * @return network latency in milliseconds - */ - public int getPing() { - return this.interfaz.getNetworkLatency(this); - } - - public boolean sleepOn(Vector3 pos) { - if (!this.isOnline()) { - return false; - } - - Entity[] e = this.level.getNearbyEntities(this.boundingBox.grow(2, 1, 2), this); - for (Entity p : e) { - if (p instanceof Player) { - if (((Player) p).sleeping != null && pos.distance(((Player) p).sleeping) <= 0.1) { - return false; - } - } - } - - PlayerBedEnterEvent ev; - this.server.getPluginManager().callEvent(ev = new PlayerBedEnterEvent(this, this.level.getBlock(pos))); - if (ev.isCancelled()) { - return false; - } - - this.sleeping = pos.clone(); - this.teleport(new Location(pos.x + 0.5, pos.y + 0.5, pos.z + 0.5, this.yaw, this.pitch, this.level), null); - - this.setDataProperty(new IntPositionEntityData(DATA_PLAYER_BED_POSITION, (int) pos.x, (int) pos.y, (int) pos.z)); - this.setDataFlag(DATA_PLAYER_FLAGS, DATA_PLAYER_FLAG_SLEEP, true); - - if (this.getServer().bedSpawnpoints) { - if (!this.getSpawn().equals(pos)) { - this.setSpawn(pos); - this.sendTranslation("§7%tile.bed.respawnSet"); - } - } - - this.level.sleepTicks = 60; - this.timeSinceRest = 0; - - return true; - } - - public void setSpawn(Vector3 pos) { - Level level; - if (!(pos instanceof Position)) { - level = this.level; - } else { - level = ((Position) pos).getLevel(); - } - this.spawnPosition = new Position(pos.x, pos.y, pos.z, level); - this.sendSpawnPos((int) pos.x, (int) pos.y, (int) pos.z, level.getDimension()); - } - - /** - * Internal: Send player spawn position - */ - private void sendSpawnPos(int x, int y, int z, int dimension) { - SetSpawnPositionPacket pk = new SetSpawnPositionPacket(); - pk.spawnType = SetSpawnPositionPacket.TYPE_PLAYER_SPAWN; - pk.x = x; - pk.y = y; - pk.z = z; - pk.dimension = dimension; - this.dataPacket(pk); - } - - public void stopSleep() { - if (this.sleeping != null) { - this.server.getPluginManager().callEvent(new PlayerBedLeaveEvent(this, this.level.getBlock(this.sleeping))); - - this.sleeping = null; - this.setDataProperty(new IntPositionEntityData(DATA_PLAYER_BED_POSITION, 0, 0, 0)); - this.setDataFlag(DATA_PLAYER_FLAGS, DATA_PLAYER_FLAG_SLEEP, false); - - this.level.sleepTicks = 0; - - AnimatePacket pk = new AnimatePacket(); - pk.eid = this.id; - pk.action = AnimatePacket.Action.WAKE_UP; - this.dataPacket(pk); - } - } - - public Vector3 getSleepingPos() { - return this.sleeping; - } - - public boolean awardAchievement(String achievementId) { - if (!Server.getInstance().achievementsEnabled) { - return false; - } - - Achievement achievement = Achievement.achievements.get(achievementId); - - if (achievement == null || hasAchievement(achievementId)) { - return false; - } - - for (String id : achievement.requires) { - if (!this.hasAchievement(id)) { - return false; - } - } - PlayerAchievementAwardedEvent event = new PlayerAchievementAwardedEvent(this, achievementId); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - this.achievements.add(achievementId); - achievement.broadcast(this); - return true; - } - - /** - * Get player's gamemode - * - * 0 = survival - * 1 = creative - * 2 = adventure - * 3 = spectator - * - * @return gamemode (number) - */ - public int getGamemode() { - return gamemode; - } - - /** - * Returns a client-friendly gamemode of the specified real gamemode - * This function takes care of handling gamemodes known to MCPE (as of 1.1.0.3, that includes Survival, Creative and Adventure) - */ - private static int getClientFriendlyGamemode(int gamemode) { - gamemode &= 0x03; - if (gamemode == Player.SPECTATOR) { - return Player.CREATIVE; - } - return gamemode; - } - - /** - * Set player's gamemode - * @param gamemode new gamemode - * @return gamemode changed - */ - public boolean setGamemode(int gamemode) { - return this.setGamemode(gamemode, false, null); - } - - public boolean setGamemode(int gamemode, boolean clientSide) { - return this.setGamemode(gamemode, clientSide, null); - } - - public boolean setGamemode(int gamemode, boolean clientSide, AdventureSettings newSettings) { - if (gamemode < 0 || gamemode > 3 || this.gamemode == gamemode) { - return false; - } - - if (newSettings == null) { - newSettings = this.adventureSettings.clone(this); - newSettings.set(Type.WORLD_IMMUTABLE, (gamemode & 0x02) > 0); - newSettings.set(Type.BUILD_AND_MINE, (gamemode & 0x02) <= 0); - newSettings.set(Type.WORLD_BUILDER, (gamemode & 0x02) <= 0); - newSettings.set(Type.ALLOW_FLIGHT, (gamemode & 0x01) > 0); - newSettings.set(Type.NO_CLIP, gamemode == 0x03); - newSettings.set(Type.FLYING, gamemode == 0x03); - } - - PlayerGameModeChangeEvent ev; - this.server.getPluginManager().callEvent(ev = new PlayerGameModeChangeEvent(this, gamemode, newSettings)); - - if (ev.isCancelled()) { - return false; - } - - this.gamemode = gamemode; - - if (this.isSpectator()) { - this.keepMovement = true; - this.despawnFromAll(); - } else { - this.keepMovement = false; - this.spawnToAll(); - } - - this.namedTag.putInt("playerGameType", this.gamemode); - - if (!clientSide) { - SetPlayerGameTypePacket pk = new SetPlayerGameTypePacket(); - pk.gamemode = getClientFriendlyGamemode(gamemode); - this.dataPacket(pk); - } - - this.setAdventureSettings(ev.getNewAdventureSettings()); - - if (this.isSpectator()) { - this.teleport(this.temporalVector.setComponents(this.x, this.y + 0.1, this.z)); - - if (this.protocol < 407) { - InventoryContentPacket inventoryContentPacket = new InventoryContentPacket(); - inventoryContentPacket.inventoryId = InventoryContentPacket.SPECIAL_CREATIVE; - this.dataPacket(inventoryContentPacket); - } - } else if (this.protocol < 407) { - InventoryContentPacket inventoryContentPacket = new InventoryContentPacket(); - inventoryContentPacket.inventoryId = InventoryContentPacket.SPECIAL_CREATIVE; - inventoryContentPacket.slots = Item.getCreativeItems(this.protocol).toArray(new Item[0]); - this.dataPacket(inventoryContentPacket); - } - - this.resetFallDistance(); - - this.inventory.sendContents(this); - this.inventory.sendHeldItem(this.hasSpawned.values()); - this.offhandInventory.sendContents(this); - this.offhandInventory.sendContents(this.getViewers().values()); - - this.inventory.sendCreativeContents(); - return true; - } - - /** - * Send adventure settings - */ - public void sendSettings() { - this.adventureSettings.update(); - } - - /** - * Check player game mode - * @return whether player is in survival mode - */ - public boolean isSurvival() { - return this.gamemode == SURVIVAL; - } - - /** - * Check player game mode - * @return whether player is in creative mode - */ - public boolean isCreative() { - return this.gamemode == CREATIVE; - } - - /** - * Check player game mode - * @return whether player is in spectator mode - */ - public boolean isSpectator() { - return this.gamemode == SPECTATOR; - } - - /** - * Check player game mode - * @return whether player is in adventure mode - */ - public boolean isAdventure() { - return this.gamemode == ADVENTURE; - } - - @Override - public Item[] getDrops() { - if (!this.isCreative() && !this.isSpectator()) { - if (this.inventory != null) { - List drops = new ArrayList<>(this.inventory.getContents().values()); - drops.addAll(this.offhandInventory.getContents().values()); - drops.addAll(this.playerUIInventory.getContents().values()); - return drops.toArray(new Item[0]); - } - return new Item[0]; - } - - return new Item[0]; - } - - @Override - protected void checkGroundState(double movX, double movY, double movZ, double dx, double dy, double dz) { - if (!this.onGround || movX != 0 || movY != 0 || movZ != 0) { - boolean onGround = false; - - AxisAlignedBB bb = this.boundingBox.clone(); - bb.maxY = bb.minY + 0.5; - bb.minY -= 1; - - AxisAlignedBB realBB = this.boundingBox.clone(); - realBB.maxY = realBB.minY + 0.1; - realBB.minY -= 0.2; - - int minX = NukkitMath.floorDouble(bb.minX); - int minY = NukkitMath.floorDouble(bb.minY); - int minZ = NukkitMath.floorDouble(bb.minZ); - int maxX = NukkitMath.ceilDouble(bb.maxX); - int maxY = NukkitMath.ceilDouble(bb.maxY); - int maxZ = NukkitMath.ceilDouble(bb.maxZ); - - for (int z = minZ; z <= maxZ; ++z) { - for (int x = minX; x <= maxX; ++x) { - for (int y = minY; y <= maxY; ++y) { - Block block = this.level.getBlock(x, y, z, false); - - if (!block.canPassThrough() && block.collidesWithBB(realBB)) { - onGround = true; - break; - } - } - } - } - - this.onGround = onGround; - } - - this.isCollided = this.onGround; - } - - @Override - protected void checkBlockCollision() { - boolean portal = false; - boolean endPortal = false; - - for (Block block : this.getCollisionBlocks()) { - if (block.getId() == Block.NETHER_PORTAL) { - portal = true; - continue; - } else if (block.getId() == Block.END_PORTAL) { - endPortal = true; - continue; - } - - block.onEntityCollide(this); - } - - if (endPortal) { - inEndPortalTicks++; - } else { - this.inEndPortalTicks = 0; - } - - if (server.endEnabled && inEndPortalTicks == 1) { - EntityPortalEnterEvent ev = new EntityPortalEnterEvent(this, EntityPortalEnterEvent.PortalType.END); - this.getServer().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - if (this.getLevel().isEnd) { - if (server.vanillaPortals && this.getSpawn().getLevel().getDimension() == Level.DIMENSION_OVERWORLD) { - this.teleport(this.getSpawn(), TeleportCause.END_PORTAL); - } else { - this.teleport(this.getServer().getDefaultLevel().getSafeSpawn(), TeleportCause.END_PORTAL); - } - } else { - Level end = this.getServer().getLevelByName("the_end"); - if (end != null) { - this.teleport(end.getSafeSpawn(), TeleportCause.END_PORTAL); - } - } - } - } - - if (portal) { - this.inPortalTicks++; - } else { - this.inPortalTicks = 0; - this.portalPos = null; - } - - if (this.server.isNetherAllowed()) { - if (this.server.vanillaPortals && (this.inPortalTicks == 40 || this.inPortalTicks == 10 && this.gamemode == CREATIVE) && this.portalPos == null) { - Position portalPos = this.level.calculatePortalMirror(this); - if (portalPos == null) { - return; - } - - for (int x = -1; x < 2; x++) { - for (int z = -1; z < 2; z++) { - int chunkX = (portalPos.getFloorX() >> 4) + x, chunkZ = (portalPos.getFloorZ() >> 4) + z; - FullChunk chunk = portalPos.level.getChunk(chunkX, chunkZ, false); - if (chunk == null || !(chunk.isGenerated() || chunk.isPopulated())) { - portalPos.level.generateChunk(chunkX, chunkZ, true); - } - } - } - this.portalPos = portalPos; - } - - if (this.inPortalTicks == 80 || (this.server.vanillaPortals && this.inPortalTicks == 25 && this.gamemode == CREATIVE)) { - EntityPortalEnterEvent ev = new EntityPortalEnterEvent(this, EntityPortalEnterEvent.PortalType.NETHER); - this.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - this.portalPos = null; - return; - } - - if (server.vanillaPortals) { - Position foundPortal = BlockNetherPortal.findNearestPortal(this.portalPos); - if (foundPortal == null) { - BlockNetherPortal.spawnPortal(this.portalPos); - this.teleport(this.portalPos.add(1.5, 1, 0.5)); - } else { - this.teleport(BlockNetherPortal.getSafePortal(foundPortal)); - } - this.portalPos = null; - } else { - if (this.getLevel().getDimension() == Level.DIMENSION_NETHER) { - this.teleport(this.getServer().getDefaultLevel().getSafeSpawn(), TeleportCause.NETHER_PORTAL); - } else { - Level nether = this.getServer().getNetherWorld(this.level.getName()); - if (nether != null) { - this.teleport(nether.getSafeSpawn(), TeleportCause.NETHER_PORTAL); - } - } - } - } - } - } - - /** - * Internal: Check nearby entities and try to pick them up - */ - protected void checkNearEntities() { - Entity[] e = this.level.getNearbyEntities(this.boundingBox.grow(1, 0.5, 1), this); - for (Entity entity : e) { - //entity.scheduleUpdate(); - - if (!entity.isAlive()) { - continue; - } - - this.pickupEntity(entity, true); - } - } - - /** - * Internal: Process player movement - * - * @param tickDiff tick diff - */ - protected void processMovement(int tickDiff) { - if (!this.isAlive() || !this.spawned || this.newPosition == null || this.teleportPosition != null || this.isSleeping()) { - return; - } - Vector3 newPos = this.newPosition; - double distanceSquared = newPos.distanceSquared(this); - boolean revert = false; - if ((distanceSquared / ((double) (tickDiff * tickDiff))) > 100 && (newPos.y - this.y) > -5) { - revert = true; - } else if (this.chunk == null || !this.chunk.isGenerated()) { - BaseFullChunk chunk = this.level.getChunk((int) newPos.x >> 4, (int) newPos.z >> 4, false); - if (chunk == null || !chunk.isGenerated()) { - revert = true; - this.nextChunkOrderRun = 0; - } else { - if (this.chunk != null) { - this.chunk.removeEntity(this); - } - this.chunk = chunk; - } - } - - double tdx = newPos.x - this.x; - double tdz = newPos.z - this.z; - double distance = Math.sqrt(tdx * tdx + tdz * tdz); - - if (!revert && distanceSquared != 0) { - double dx = newPos.x - this.x; - double dy = newPos.y - this.y; - double dz = newPos.z - this.z; - - //the client likes to clip into blocks like stairs, but we do full server-side prediction of that without - //help from the client's position changes, so we deduct the expected clip height from the moved distance. - double expectedClipDistance = this.ySize * (1 - STEP_CLIP_MULTIPLIER); - dy -= expectedClipDistance; - - this.fastMove(dx, dy, dz); - if (this.newPosition == null) { - return; - } - - double diffX = this.x - newPos.x; - double diffY = this.y - newPos.y; - double diffZ = this.z - newPos.z; - - double yS = 0.5 + this.ySize; - if (diffY >= -yS || diffY <= yS) { - diffY = 0; - } - - if (diffX != 0 || diffY != 0 || diffZ != 0) { - if (this.checkMovement && !server.getAllowFlight() && (this.isSurvival() || this.isAdventure())) { - if (!this.isSleeping() && this.riding == null && !this.hasEffect(Effect.LEVITATION) && !this.hasEffect(Effect.SLOW_FALLING)) { - if ((diffX * diffX + diffZ * diffZ) / ((double) (tickDiff * tickDiff)) > 0.5 ) { - PlayerInvalidMoveEvent ev; - this.getServer().getPluginManager().callEvent(ev = new PlayerInvalidMoveEvent(this, true)); - if (!ev.isCancelled()) { - revert = ev.isRevert(); - } - } - } - } - - if (!revert) { - this.x = newPos.x; - this.y = newPos.y; - this.z = newPos.z; - double radius = this.getWidth() / 2; - this.boundingBox.setBounds(this.x - radius, this.y, this.z - radius, this.x + radius, this.y + this.getHeight(), this.z + radius); - } - } - } - - Location from = new Location( - this.lastX, - this.lastY, - this.lastZ, - this.lastYaw, - this.lastPitch, - this.level); - Location to = this.getLocation(); - - double delta = Math.pow(this.lastX - to.x, 2) + Math.pow(this.lastY - to.y, 2) + Math.pow(this.z - to.z, 2); - double deltaAngle = Math.abs(this.lastYaw - to.yaw) + Math.abs(this.lastPitch - to.pitch); - - if (!revert && (delta > 0.0001d || deltaAngle > 1d)) { - boolean isFirst = this.firstMove; - - this.firstMove = false; - this.lastX = to.x; - this.lastY = to.y; - this.lastZ = to.z; - - this.lastYaw = to.yaw; - this.lastPitch = to.pitch; - - if (!isFirst) { - List blocksAround = null; - List collisionBlocks = null; - if (!this.server.suomiCraftPEMode()) { - blocksAround = new ArrayList<>(this.blocksAround); - collisionBlocks = new ArrayList<>(this.collisionBlocks); - this.blocksAround = null; - this.collisionBlocks = null; - } - - PlayerMoveEvent ev = new PlayerMoveEvent(this, from, to); - this.server.getPluginManager().callEvent(ev); - - if (!(revert = ev.isCancelled())) { - if (this.server.suomiCraftPEMode()) { - this.blocksAround = null; - this.collisionBlocks = null; - } - if (this.server.getMobAiEnabled() && this.age % 20 == 0) { - AxisAlignedBB aab = new AxisAlignedBB( - this.getX() - 0.6f, - this.getY() + 1.45f, - this.getZ() - 0.6f, - this.getX() + 0.6f, - this.getY() + 2.9f, - this.getZ() + 0.6f - ); - for (int i = 0; i < 8; i++) { - Entity[] entities = this.level.getCollidingEntities(aab.offset(-Math.sin(this.getYaw() * Math.PI / 180) * i, i * (Math.tan(this.getPitch() * -1 * Math.PI / 180)), Math.cos(this.getYaw() * Math.PI / 180) * i)); - if (entities.length > 0) { - for (Entity e : entities) { - if (e instanceof EntityEnderman) { - ((EntityEnderman) e).stareToAngry(); - } - } - } - } - } - - if (!to.equals(ev.getTo())) { - this.teleport(ev.getTo(), null); - } else { - this.addMovement(this.x, this.y + this.getEyeHeight(), this.z, this.yaw, this.pitch, this.yaw); - } - } else if (!this.server.suomiCraftPEMode()) { - this.blocksAround = blocksAround; - this.collisionBlocks = collisionBlocks; - } - } - - if (this.speed == null) speed = new Vector3(from.x - to.x, from.y - to.y, from.z - to.z); - else this.speed.setComponents(from.x - to.x, from.y - to.y, from.z - to.z); - } else { - if (this.speed == null) speed = new Vector3(0, 0, 0); - else this.speed.setComponents(0, 0, 0); - } - - if (!revert && this.isFoodEnabled() && this.getServer().getDifficulty() > 0) { - if (distance >= 0.05) { - double jump = 0; - double swimming = this.isInsideOfWater() ? 0.015 * distance : 0; - if (swimming != 0) distance = 0; - if (this.isSprinting()) { - if (this.inAirTicks == 3 && swimming == 0) { - jump = 0.7; - } - this.foodData.updateFoodExpLevel(0.06 * distance + jump + swimming); - } else { - if (this.inAirTicks == 3 && swimming == 0) { - jump = 0.2; - } - this.foodData.updateFoodExpLevel(0.01 * distance + jump + swimming); - } - } - } - - // Frost Walker - if (!revert && delta > 0.0001d) { - Item boots = inventory.getBootsFast(); - - Enchantment frostWalker = boots.getEnchantment(Enchantment.ID_FROST_WALKER); - if (frostWalker != null && frostWalker.getLevel() > 0 && !this.isSpectator() && this.y >= 1 && this.y <= 255) { - int radius = 2 + frostWalker.getLevel(); - for (int coordX = this.getFloorX() - radius; coordX < this.getFloorX() + radius + 1; coordX++) { - for (int coordZ = this.getFloorZ() - radius; coordZ < this.getFloorZ() + radius + 1; coordZ++) { - Block block = level.getBlock(coordX, this.getFloorY() - 1, coordZ); - if ((block.getId() == Block.STILL_WATER || block.getId() == Block.WATER && block.getDamage() == 0) && block.up().getId() == Block.AIR) { - WaterFrostEvent ev = new WaterFrostEvent(block); - server.getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - level.setBlock(block, Block.get(Block.ICE_FROSTED), true, false); - level.scheduleUpdate(level.getBlock(block), Utils.random.nextInt(20, 40)); - } - } - } - } - } - - Enchantment soulSpeedEnchantment = boots.getEnchantment(Enchantment.ID_SOUL_SPEED); - if (soulSpeedEnchantment != null && soulSpeedEnchantment.getLevel() > 0) { - int down = this.getLevel().getBlockIdAt(chunk, getFloorX(), getFloorY() - 1, getFloorZ()); - if (this.inSoulSand && down != BlockID.SOUL_SAND) { - this.inSoulSand = false; - this.setMovementSpeed(DEFAULT_SPEED, true); - } else if (!this.inSoulSand && down == BlockID.SOUL_SAND) { - this.inSoulSand = true; - float soulSpeed = (soulSpeedEnchantment.getLevel() * 0.105f) + 1.3f; - this.setMovementSpeed(DEFAULT_SPEED * soulSpeed, true); - } - } - } - - if (revert) { - this.lastX = from.x; - this.lastY = from.y; - this.lastZ = from.z; - - this.lastYaw = from.yaw; - this.lastPitch = from.pitch; - - // We have to send slightly above otherwise the player will fall into the ground - Vector3 vec = new Vector3(from.x, from.y + 0.00001, from.z); - this.sendPosition(vec, from.yaw, from.pitch, MovePlayerPacket.MODE_RESET); - this.forceMovement = vec; - } else { - this.forceMovement = null; - if (distanceSquared != 0 && this.nextChunkOrderRun > 20) { - this.nextChunkOrderRun = 20; - } - } - - this.newPosition = null; - } - - @Override - public void addMovement(double x, double y, double z, double yaw, double pitch, double headYaw) { - this.sendPosition(x, y, z, yaw, pitch, MovePlayerPacket.MODE_NORMAL, this.getViewers().values()); - } - - @Override - public boolean setMotion(Vector3 motion) { - if (super.setMotion(motion)) { - if (this.chunk != null && this.spawned) { - this.addMotion(this.motionX, this.motionY, this.motionZ); // Send to others - SetEntityMotionPacket pk = new SetEntityMotionPacket(); - pk.eid = this.id; - pk.motionX = (float) motion.x; - pk.motionY = (float) motion.y; - pk.motionZ = (float) motion.z; - this.dataPacket(pk); - } - - if (this.motionY > 0) { - this.startAirTicks = (int) ((-(Math.log(this.getGravity() / (this.getGravity() + this.getDrag() * this.motionY))) / this.getDrag()) * 2 + 5); - } - - return true; - } - - return false; - } - - /** - * Send all default attributes - */ - public void sendAttributes() { - UpdateAttributesPacket pk = new UpdateAttributesPacket(); - pk.entityId = this.getId(); - pk.entries = new Attribute[]{ - Attribute.getAttribute(Attribute.MAX_HEALTH).setMaxValue(this.getMaxHealth()).setValue(health > 0 ? (health < getMaxHealth() ? health : getMaxHealth()) : 0), - Attribute.getAttribute(Attribute.MAX_HUNGER).setValue(this.foodData.getLevel()).setDefaultValue(this.foodData.getMaxLevel()), - Attribute.getAttribute(Attribute.MOVEMENT_SPEED).setValue(this.getMovementSpeed()).setDefaultValue(this.getMovementSpeed()), - Attribute.getAttribute(Attribute.EXPERIENCE_LEVEL).setValue(this.expLevel), - Attribute.getAttribute(Attribute.EXPERIENCE).setValue(((float) this.exp) / calculateRequireExperience(this.expLevel)) - }; - this.dataPacket(pk); - } - - @Override - public boolean onUpdate(int currentTick) { - if (!this.loggedIn) { - return false; - } - - int tickDiff = currentTick - this.lastUpdate; - - if (tickDiff <= 0) { - return true; - } - - this.lastUpdate = currentTick; - - this.failedTransactions = 0; - - if (this.fishing != null && this.age % 20 == 0) { - if (this.distanceSquared(fishing) > 1089) { // 33 blocks - this.stopFishing(false); - } - } - - if (!this.isAlive() && this.spawned) { - //++this.deadTicks; - //if (this.deadTicks >= 10) { - this.despawnFromAll(); // HACK: fix "dead" players - //} - return true; - } - - if (this.spawned) { - this.processMovement(tickDiff); - this.motionX = this.motionY = this.motionZ = 0; // HACK: fix player knockback being messed up - - if (!this.isSpectator() && this.isAlive()) { - this.checkNearEntities(); - } - - this.entityBaseTick(tickDiff); - - if (this.getServer().getDifficulty() == 0 && this.level.getGameRules().getBoolean(GameRule.NATURAL_REGENERATION)) { - if (this.getHealth() < this.getMaxHealth() && this.age % 20 == 0) { - this.heal(1); - } - - if (this.foodData.getLevel() < 20 && this.age % 10 == 0) { - this.foodData.addFoodLevel(1, 0); - } - } - - if (this.isOnFire() && this.lastUpdate % 10 == 0) { - if (this.isCreative() && !this.isInsideOfFire()) { - this.extinguish(); - } else if (this.getLevel().isRaining() && this.canSeeSky()) { - this.extinguish(); - } - } - - if (!this.isSpectator() && this.speed != null) { - if (this.onGround) { - if (this.inAirTicks != 0) { - this.startAirTicks = 10; - } - this.inAirTicks = 0; - this.highestPosition = this.y; - } else { - if (this.checkMovement && !this.isGliding() && !server.getAllowFlight() && this.inAirTicks > 20 && !this.getAllowFlight() && !this.isSleeping() && !this.isImmobile() && !this.isSwimming() && this.riding == null && !this.hasEffect(Effect.LEVITATION) && !this.hasEffect(Effect.SLOW_FALLING)) { - double expectedVelocity = (-this.getGravity()) / ((double) this.getDrag()) - ((-this.getGravity()) / ((double) this.getDrag())) * FastMath.exp(-((double) this.getDrag()) * ((double) (this.inAirTicks - this.startAirTicks))); - double diff = (this.speed.y - expectedVelocity) * (this.speed.y - expectedVelocity); - - if (this.isOnLadder()) { - this.resetFallDistance(); - } else { - if (diff > 2 && expectedVelocity < this.speed.y && this.speed.y != 0) { - if (this.inAirTicks < 150) { - PlayerInvalidMoveEvent ev = new PlayerInvalidMoveEvent(this, true); - this.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.setMotion(new Vector3(0, expectedVelocity, 0)); - } - } else if (this.kick(PlayerKickEvent.Reason.FLYING_DISABLED, "Flying is not enabled on this server", true, "type=MOVE, expectedVelocity=" + expectedVelocity + ", diff=" + diff + ", speed.y=" + speed.y)) { - return false; - } - } - } - } - - if (this.y > highestPosition) { - this.highestPosition = this.y; - } - - if (this.isGliding() || this.isSwimming()) { - this.resetFallDistance(); - } else { - ++this.inAirTicks; - } - } - - if (this.foodData != null) { - this.foodData.update(tickDiff); - } - } - } - - this.checkTeleportPosition(); - - /*if (currentTick % 20 == 0) { - this.checkInteractNearby(); - }*/ - - if (this.spawned && !this.dummyBossBars.isEmpty() && currentTick % 100 == 0) { - this.dummyBossBars.values().forEach(DummyBossBar::updateBossEntityPosition); - } - - // Shields were added in 1.10 - // Change this if you map shields to some other item for old versions - if (this.protocol >= ProtocolInfo.v1_10_0) { - updateBlockingFlag(); - } - - if (!this.isSleeping()) { - this.timeSinceRest++; - } - - return true; - } - - private void updateBlockingFlag() { - boolean shieldInHand = this.getInventory().getItemInHandFast().getId() == ItemID.SHIELD; - boolean shieldInOffhand = this.getOffhandInventory().getItemFast(0).getId() == ItemID.SHIELD; - if (isBlocking()) { - if (!isSneaking() || (!shieldInHand && !shieldInOffhand)) { - this.setBlocking(false); - } - } else if (isSneaking() && (shieldInHand || shieldInOffhand)) { - this.setBlocking(true); - } - } - - public void checkInteractNearby() { - int interactDistance = isCreative() ? 5 : 3; - if (canInteract(this, interactDistance)) { - EntityInteractable e = getEntityPlayerLookingAt(interactDistance); - if (e != null) { - setButtonText(e.getInteractButtonText()); - } else { - setButtonText(""); - } - } else { - setButtonText(""); - } - } - - /** - * Returns the Entity the player is looking at currently - * - * @param maxDistance the maximum distance to check for entities - * @return Entity|null either NULL if no entity is found or an instance of the entity - */ - public EntityInteractable getEntityPlayerLookingAt(int maxDistance) { - if (timing != null) timing.startTiming(); - - EntityInteractable entity = null; - - if (temporalVector != null) { - Entity[] nearbyEntities = level.getNearbyEntities(boundingBox.grow(maxDistance, maxDistance, maxDistance), this); - - try { - BlockIterator itr = new BlockIterator(level, getPosition(), getDirectionVector(), getEyeHeight(), maxDistance); - if (itr.hasNext()) { - Block block; - while (itr.hasNext()) { - block = itr.next(); - entity = getEntityAtPosition(nearbyEntities, block.getFloorX(), block.getFloorY(), block.getFloorZ()); - if (entity != null) { - break; - } - } - } - } catch (Exception ignored) {} - } - - if (timing != null) timing.stopTiming(); - - return entity; - } - - private static EntityInteractable getEntityAtPosition(Entity[] nearbyEntities, int x, int y, int z) { - for (Entity nearestEntity : nearbyEntities) { - if (nearestEntity.getFloorX() == x && nearestEntity.getFloorY() == y && nearestEntity.getFloorZ() == z - && nearestEntity instanceof EntityInteractable - && ((EntityInteractable) nearestEntity).canDoInteraction()) { - return (EntityInteractable) nearestEntity; - } - } - return null; - } - - public void checkNetwork() { - if (this.protocol < ProtocolInfo.v1_16_100 && !this.isOnline()) { - return; - } - - this.processBatchPackets(); - - if (!this.isOnline()) { - return; - } - - if (this.nextChunkOrderRun-- <= 0 || this.chunk == null) { - this.orderChunks(); - } - - if (!this.loadQueue.isEmpty() || !this.spawned) { - this.sendNextChunk(); - } - } - - private void processBatchPackets() { - if (!this.packetQueue.isEmpty()) { - List toBatch = new ArrayList<>(); - DataPacket packet; - while ((packet = this.packetQueue.poll()) != null) { - toBatch.add(packet); - } - DataPacket[] arr = toBatch.toArray(new DataPacket[0]); - this.server.batchPackets(new Player[]{this}, arr, false); - } - } - - public boolean canInteract(Vector3 pos, double maxDistance) { - return this.canInteract(pos, maxDistance, 6.0); - } - - public boolean canInteract(Vector3 pos, double maxDistance, double maxDiff) { - if (this.distanceSquared(pos) > maxDistance * maxDistance) { - return false; - } - - Vector2 dV = this.getDirectionPlane(); - return (dV.dot(new Vector2(pos.x, pos.z)) - dV.dot(new Vector2(this.x, this.z))) >= -maxDiff; - } - - private boolean canInteractEntity(Vector3 pos, double maxDistance) { - if (this.distanceSquared(pos) > Math.pow(maxDistance, 2)) { - return false; - } - - Vector2 dV = this.getDirectionPlane(); - return (dV.dot(new Vector2(pos.x, pos.z)) - dV.dot(new Vector2(this.x, this.z))) >= -0.87; - } - - protected void processLogin() { - String lowerName = this.username.toLowerCase(); - if (!this.server.isWhitelisted(lowerName)) { - this.kick(PlayerKickEvent.Reason.NOT_WHITELISTED, server.whitelistReason); - return; - } else if (this.isBanned()) { - String reason = this.server.getNameBans().getEntires().get(lowerName).getReason(); - this.kick(PlayerKickEvent.Reason.NAME_BANNED, "You are banned!" + (reason.isEmpty() ? "" : (" Reason: " + reason))); - return; - } else if (!server.strongIPBans && this.server.getIPBans().isBanned(this.getAddress())) { - this.kick(PlayerKickEvent.Reason.IP_BANNED, "Your IP is banned!"); - return; - } - - for (Player p : new ArrayList<>(this.server.playerList.values())) { - if (p != this && p.username != null) { - if (p.username.equalsIgnoreCase(this.username) || this.getUniqueId().equals(p.getUniqueId())) { - p.close("", "disconnectionScreen.loggedinOtherLocation"); - break; - } - } - } - - CompoundTag nbt; - File legacyDataFile = new File(server.getDataPath() + "players/" + lowerName + ".dat"); - File dataFile = new File(server.getDataPath() + "players/" + this.uuid.toString() + ".dat"); - if (this.server.savePlayerDataByUuid) { - boolean dataFound = dataFile.exists(); - if (!dataFound && legacyDataFile.exists()) { - nbt = this.server.getOfflinePlayerData(lowerName, false); - if (!legacyDataFile.delete()) { - this.server.getLogger().warning("Could not delete legacy player data for " + this.username); - } - } else { - nbt = this.server.getOfflinePlayerData(this.uuid, !dataFound); - } - } else { - boolean legacyMissing = !legacyDataFile.exists(); - if (legacyMissing && dataFile.exists()) { - nbt = this.server.getOfflinePlayerData(this.uuid, false); - } else { - nbt = this.server.getOfflinePlayerData(lowerName, legacyMissing); - } - } - - if (nbt == null) { - this.close(this.getLeaveMessage(), "Invalid data"); - return; - } - - if (loginChainData.isXboxAuthed() || !server.xboxAuth) { - server.updateName(this.uuid, this.username); - } - - this.playedBefore = (nbt.getLong("lastPlayed") - nbt.getLong("firstPlayed")) > 1; - - nbt.putString("NameTag", this.username); - - this.setExperience(nbt.getInt("EXP"), nbt.getInt("expLevel")); - - if (this.server.getForceGamemode()) { - this.gamemode = this.server.getGamemode(); - nbt.putInt("playerGameType", this.gamemode); - } else { - this.gamemode = nbt.getInt("playerGameType") & 0x03; - } - - this.adventureSettings = new AdventureSettings(this) - .set(Type.WORLD_IMMUTABLE, isAdventure() || isSpectator()) - .set(Type.WORLD_BUILDER, !isAdventure() && !isSpectator()) - .set(Type.AUTO_JUMP, true) - .set(Type.ALLOW_FLIGHT, isCreative()) - .set(Type.NO_CLIP, isSpectator()); - - Level level; - if ((level = this.server.getLevelByName(nbt.getString("Level"))) == null || nbt.getShort("Health") < 1) { - this.setLevel(this.server.getDefaultLevel()); - nbt.putString("Level", this.level.getName()); - Position sp = this.level.getSpawnLocation(); - nbt.getList("Pos", DoubleTag.class) - .add(new DoubleTag("0", sp.x)) - .add(new DoubleTag("1", sp.y)) - .add(new DoubleTag("2", sp.z)); - } else { - this.setLevel(level); - } - - if (nbt.contains("SpawnLevel")) { - Level spawnLevel = server.getLevelByName(nbt.getString("SpawnLevel")); - if (spawnLevel != null) { - this.spawnPosition = new Position( - nbt.getInt("SpawnX"), - nbt.getInt("SpawnY"), - nbt.getInt("SpawnZ"), - level - ); - } - } - - this.timeSinceRest = nbt.getInt("TimeSinceRest"); - - for (Tag achievement : nbt.getCompound("Achievements").getAllTags()) { - if (!(achievement instanceof ByteTag)) { - continue; - } - - if (((ByteTag) achievement).getData() > 0) { - this.achievements.add(achievement.getName()); - } - } - - nbt.putLong("lastPlayed", System.currentTimeMillis() / 1000); - - UUID uuid = getUniqueId(); - nbt.putLong("UUIDLeast", uuid.getLeastSignificantBits()); - nbt.putLong("UUIDMost", uuid.getMostSignificantBits()); - - if (this.server.getAutoSave()) { - if (this.server.savePlayerDataByUuid) { - this.server.saveOfflinePlayerData(this.uuid, nbt, true); - } else { - this.server.saveOfflinePlayerData(this.username, nbt, true); - } - } - - this.sendPlayStatus(PlayStatusPacket.LOGIN_SUCCESS); - - ListTag posList = nbt.getList("Pos", DoubleTag.class); - - super.init(this.level.getChunk((int) posList.get(0).data >> 4, (int) posList.get(2).data >> 4, true), nbt); - - if (!this.namedTag.contains("foodLevel")) { - this.namedTag.putInt("foodLevel", 20); - } - - if (!this.namedTag.contains("FoodSaturationLevel")) { - this.namedTag.putFloat("FoodSaturationLevel", 20); - } - - this.foodData = new PlayerFood(this, this.namedTag.getInt("foodLevel"), this.namedTag.getFloat("foodSaturationLevel")); - - if (this.isSpectator()) this.keepMovement = true; - - this.forceMovement = this.teleportPosition = this.getPosition(); - - ResourcePacksInfoPacket infoPacket = new ResourcePacksInfoPacket(); - infoPacket.resourcePackEntries = this.server.getResourcePackManager().getResourceStack(); - infoPacket.mustAccept = this.server.getForceResources(); - this.dataPacket(infoPacket); - } - - protected void completeLoginSequence() { - if (this.loggedIn) { - this.server.getLogger().warning("(BUG) Tried to call completeLoginSequence but player is already logged in"); - return; - } - - PlayerLoginEvent ev; - this.server.getPluginManager().callEvent(ev = new PlayerLoginEvent(this, "Plugin reason")); - if (ev.isCancelled()) { - this.close(this.getLeaveMessage(), ev.getKickMessage()); - return; - } - - StartGamePacket startGamePacket = new StartGamePacket(); - startGamePacket.entityUniqueId = this.id; - startGamePacket.entityRuntimeId = this.id; - startGamePacket.playerGamemode = getClientFriendlyGamemode(this.gamemode); - startGamePacket.x = (float) this.x; - startGamePacket.y = (float) this.y; - startGamePacket.z = (float) this.z; - startGamePacket.yaw = (float) this.yaw; - startGamePacket.pitch = (float) this.pitch; - startGamePacket.dimension = this.getServer().dimensionsEnabled ? (byte) (this.level.getDimension() & 0xff) : 0; - startGamePacket.worldGamemode = getClientFriendlyGamemode(this.gamemode); - startGamePacket.difficulty = this.server.getDifficulty(); - startGamePacket.spawnX = (int) this.x; - startGamePacket.spawnY = (int) this.y; - startGamePacket.spawnZ = (int) this.z; - startGamePacket.commandsEnabled = this.enableClientCommand; - startGamePacket.gameRules = this.getLevel().getGameRules(); - startGamePacket.worldName = this.getServer().getNetwork().getName(); - startGamePacket.version = this.getLoginChainData().getGameVersion(); - if (this.getLevel().isRaining()) { - startGamePacket.rainLevel = this.getLevel().getRainTime(); - if (this.getLevel().isThundering()) { - startGamePacket.lightningLevel = this.getLevel().getThunderTime(); - } - } - this.quickBatch(startGamePacket); - - this.loggedIn = true; - this.server.getLogger().info(this.getServer().getLanguage().translateString("nukkit.player.logIn", - TextFormat.AQUA + this.username + TextFormat.WHITE, - this.getAddress(), - String.valueOf(this.getPort()))); - - this.setDataFlag(DATA_FLAGS, DATA_FLAG_CAN_CLIMB, true, false); - this.setDataFlag(DATA_FLAGS, DATA_FLAG_CAN_SHOW_NAMETAG, true, false); - this.setDataProperty(new ByteEntityData(DATA_ALWAYS_SHOW_NAMETAG, 1), false); - - try { - if (this.protocol >= ProtocolInfo.v1_8_0) { - if (this.protocol >= ProtocolInfo.v1_12_0) { - if (this.protocol >= ProtocolInfo.v1_16_100) { - this.dataPacket(new ItemComponentPacket()); - } - this.dataPacket(new BiomeDefinitionListPacket()); - } - this.dataPacket(new AvailableEntityIdentifiersPacket()); - } - - if (this.protocol >= ProtocolInfo.v1_16_100) { - this.sendSpawnPos((int) this.x, (int) this.y, (int) this.z, this.level.getDimension()); - } - this.getLevel().sendTime(this); - - SetDifficultyPacket difficultyPacket = new SetDifficultyPacket(); - difficultyPacket.difficulty = this.server.getDifficulty(); - this.dataPacket(difficultyPacket); - - SetCommandsEnabledPacket commandsPacket = new SetCommandsEnabledPacket(); - commandsPacket.enabled = this.isEnableClientCommand(); - this.dataPacket(commandsPacket); - - this.adventureSettings.update(); - - GameRulesChangedPacket gameRulesPK = new GameRulesChangedPacket(); - gameRulesPK.gameRulesMap = level.getGameRules().getGameRules(); - this.dataPacket(gameRulesPK); - - this.server.sendFullPlayerListData(this); - this.sendAttributes(); - - if (this.protocol < ProtocolInfo.v1_16_0 && this.gamemode == Player.SPECTATOR) { - InventoryContentPacket inventoryContentPacket = new InventoryContentPacket(); - inventoryContentPacket.inventoryId = ContainerIds.CREATIVE; - this.dataPacket(inventoryContentPacket); - } else { - this.inventory.sendCreativeContents(); - } - this.sendAllInventories(); - this.inventory.sendHeldItemIfNotAir(this); - this.server.sendRecipeList(this); - - if (this.isEnableClientCommand()) { - this.sendCommandData(); - } - - this.sendPotionEffects(this); - this.sendData(this, this.dataProperties.clone()); - - if (!this.server.checkOpMovement && this.isOp()) { - this.setCheckMovement(false); - } - - if (this.isOp() || this.hasPermission("nukkit.textcolor") || this.server.suomiCraftPEMode()) { - this.setRemoveFormat(false); - } - - this.server.onPlayerCompleteLoginSequence(this); - } catch (Exception e) { - this.close("", "Internal Server Error"); - this.server.getLogger().logException(e); - } - } - - public void handleDataPacket(DataPacket packet) { - if (!connected) { - return; - } - - if (!verified && packet.pid() != ProtocolInfo.LOGIN_PACKET && packet.pid() != ProtocolInfo.BATCH_PACKET) { - server.getLogger().warning("Ignoring " + packet.getClass().getSimpleName() + " from " + getAddress() + " due to player not verified yet"); - if (unverifiedPackets++ > 100) { - this.close("", "Too many failed login attempts"); - } - return; - } - - if (!loggedIn && !PRE_LOGIN_PACKETS.contains(packet.pid())) { - server.getLogger().warning("Ignoring " + packet.getClass().getSimpleName() + " from " + username + " due to player not logged in yet"); - return; - } - - packet.protocol = this.protocol; - - try (Timing ignore = Timings.getReceiveDataPacketTiming(packet)) { - DataPacketReceiveEvent ev = new DataPacketReceiveEvent(this, packet); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return; - } - - if (packet.pid() == ProtocolInfo.BATCH_PACKET) { - this.server.getNetwork().processBatch((BatchPacket) packet, this); - return; - } - - if (Nukkit.DEBUG > 2 /*&& !server.isIgnoredPacket(packet.getClass())*/) { - log.trace("Inbound {}: {}", this.getName(), packet); - } - - packetswitch: - switch (packet.pid()) { - case ProtocolInfo.LOGIN_PACKET: - if (this.loggedIn) { - break; - } - - LoginPacket loginPacket = (LoginPacket) packet; - - this.protocol = loginPacket.getProtocol(); - - if (!ProtocolInfo.SUPPORTED_PROTOCOLS.contains(this.protocol)) { - this.close("", "You are running unsupported Minecraft version"); - this.server.getLogger().debug(this.username + " disconnected with protocol " + this.protocol); - break; - } - - if (this.protocol < server.minimumProtocol) { - this.close("", "Multiversion support for this Minecraft version is disabled"); - this.server.getLogger().debug(this.username + " disconnected with protocol " + this.protocol); - break; - } - - this.username = TextFormat.clean(loginPacket.username); - this.displayName = this.username; - this.iusername = this.username.toLowerCase(); - this.setDataProperty(new StringEntityData(DATA_NAMETAG, this.username), false); - - this.loginChainData = ClientChainData.read(loginPacket); - - if (!loginChainData.isXboxAuthed() && server.xboxAuth) { - this.close("", "disconnectionScreen.notAuthenticated"); - if (server.banXBAuthFailed) { - this.server.getNetwork().blockAddress(this.socketAddress.getAddress(), 5); - this.server.getLogger().notice("Blocked " + getAddress() + " for 5 seconds due to failed Xbox auth"); - } - break; - } - - if (this.server.getOnlinePlayersCount() >= this.server.getMaxPlayers() && this.kick(PlayerKickEvent.Reason.SERVER_FULL, "disconnectionScreen.serverFull")) { - break; - } - - this.version = loginChainData.getGameVersion(); - - getServer().getLogger().debug("Name: " + this.username + " Protocol: " + this.protocol + " Version: " + this.version); - - this.randomClientId = loginPacket.clientId; - - this.uuid = loginPacket.clientUUID; - this.rawUUID = Binary.writeUUID(this.uuid); - - boolean valid = true; - int len = loginPacket.username.length(); - if (len > 16 || len < 3) { - valid = false; - } - - if (valid) { - for (int i = 0; i < len; i++) { - char c = loginPacket.username.charAt(i); - if ((c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - c == '_' || c == ' ' - ) { - continue; - } - - valid = false; - break; - } - } - - if (!valid || Objects.equals(this.iusername, "rcon") || Objects.equals(this.iusername, "console")) { - this.close("", "disconnectionScreen.invalidName"); - break; - } - - if (!loginPacket.skin.isValid()) { - this.close("", "disconnectionScreen.invalidSkin"); - break; - } - Skin skin = loginPacket.skin; - this.setSkin(skin.isPersona() && !this.getServer().personaSkins? Skin.NO_PERSONA_SKIN : skin); - - PlayerPreLoginEvent playerPreLoginEvent; - this.server.getPluginManager().callEvent(playerPreLoginEvent = new PlayerPreLoginEvent(this, "Plugin reason")); - if (playerPreLoginEvent.isCancelled()) { - this.close("", playerPreLoginEvent.getKickMessage()); - break; - } - - Player playerInstance = this; - this.verified = true; - - this.preLoginEventTask = new AsyncTask() { - private PlayerAsyncPreLoginEvent event; - - @Override - public void onRun() { - this.event = new PlayerAsyncPreLoginEvent(username, uuid, loginChainData, skin, playerInstance.getAddress(), playerInstance.getPort()); - server.getPluginManager().callEvent(this.event); - } - - @Override - public void onCompletion(Server server) { - if (playerInstance.closed) { - return; - } - - if (this.event.getLoginResult() == LoginResult.KICK) { - playerInstance.close(this.event.getKickMessage(), this.event.getKickMessage()); - } else if (playerInstance.shouldLogin) { - playerInstance.setSkin(this.event.getSkin()); - playerInstance.completeLoginSequence(); - for (Consumer action : this.event.getScheduledActions()) { - action.accept(server); - } - } - } - }; - - this.server.getScheduler().scheduleAsyncTask(this.preLoginEventTask); - this.processLogin(); - break; - case ProtocolInfo.RESOURCE_PACK_CLIENT_RESPONSE_PACKET: - ResourcePackClientResponsePacket responsePacket = (ResourcePackClientResponsePacket) packet; - switch (responsePacket.responseStatus) { - case ResourcePackClientResponsePacket.STATUS_REFUSED: - this.close("", "disconnectionScreen.noReason"); - break; - case ResourcePackClientResponsePacket.STATUS_SEND_PACKS: - for (ResourcePackClientResponsePacket.Entry entry : responsePacket.packEntries) { - ResourcePack resourcePack = this.server.getResourcePackManager().getPackById(entry.uuid); - if (resourcePack == null) { - this.close("", "disconnectionScreen.resourcePack"); - break; - } - - ResourcePackDataInfoPacket dataInfoPacket = new ResourcePackDataInfoPacket(); - dataInfoPacket.packId = resourcePack.getPackId(); - dataInfoPacket.maxChunkSize = 1048576; //megabyte - dataInfoPacket.chunkCount = resourcePack.getPackSize() / dataInfoPacket.maxChunkSize; - dataInfoPacket.compressedPackSize = resourcePack.getPackSize(); - dataInfoPacket.sha256 = resourcePack.getSha256(); - this.dataPacket(dataInfoPacket); - } - break; - case ResourcePackClientResponsePacket.STATUS_HAVE_ALL_PACKS: - ResourcePackStackPacket stackPacket = new ResourcePackStackPacket(); - stackPacket.mustAccept = this.server.getForceResources(); - stackPacket.resourcePackStack = this.server.getResourcePackManager().getResourceStack(); - this.dataPacket(stackPacket); - break; - case ResourcePackClientResponsePacket.STATUS_COMPLETED: - this.shouldLogin = true; - - if (this.preLoginEventTask.isFinished()) { - this.preLoginEventTask.onCompletion(server); - } - break; - } - break; - case ProtocolInfo.RESOURCE_PACK_CHUNK_REQUEST_PACKET: - ResourcePackChunkRequestPacket requestPacket = (ResourcePackChunkRequestPacket) packet; - ResourcePack resourcePack = this.server.getResourcePackManager().getPackById(requestPacket.packId); - if (resourcePack == null) { - this.close("", "disconnectionScreen.resourcePack"); - break; - } - - ResourcePackChunkDataPacket dataPacket = new ResourcePackChunkDataPacket(); - dataPacket.packId = resourcePack.getPackId(); - dataPacket.chunkIndex = requestPacket.chunkIndex; - dataPacket.data = resourcePack.getPackChunk(1048576 * requestPacket.chunkIndex, 1048576); - dataPacket.progress = 1048576L * requestPacket.chunkIndex; - this.dataPacket(dataPacket); - break; - case ProtocolInfo.PLAYER_SKIN_PACKET: - PlayerSkinPacket skinPacket = (PlayerSkinPacket) packet; - skin = skinPacket.skin; - - if (!skin.isValid()) { - break; - } - - PlayerChangeSkinEvent playerChangeSkinEvent = new PlayerChangeSkinEvent(this, skin); - playerChangeSkinEvent.setCancelled(TimeUnit.SECONDS.toMillis(this.server.getPlayerSkinChangeCooldown()) > System.currentTimeMillis() - this.lastSkinChange); - this.server.getPluginManager().callEvent(playerChangeSkinEvent); - if (!playerChangeSkinEvent.isCancelled()) { - this.lastSkinChange = System.currentTimeMillis(); - this.setSkin(skin.isPersona() && !this.getServer().personaSkins? Skin.NO_PERSONA_SKIN : skin); - } - break; - case ProtocolInfo.PLAYER_INPUT_PACKET: - if (!this.isAlive() || !this.spawned) { - break; - } - if (riding instanceof EntityControllable) { - PlayerInputPacket ipk = (PlayerInputPacket) packet; - ((EntityControllable) riding).onPlayerInput(this, ipk.motionX, ipk.motionY); - } - break; - case ProtocolInfo.MOVE_PLAYER_PACKET: - if (this.teleportPosition != null || !this.locallyInitialized) { - break; - } - - MovePlayerPacket movePlayerPacket = (MovePlayerPacket) packet; - Vector3 newPos = new Vector3(movePlayerPacket.x, movePlayerPacket.y - this.getEyeHeight(), movePlayerPacket.z); - double dis = newPos.distanceSquared(this); - - if (dis == 0 && movePlayerPacket.yaw % 360 == this.yaw && movePlayerPacket.pitch % 360 == this.pitch) { - break; - } - - if (dis > 81) { - this.sendPosition(this, movePlayerPacket.yaw, movePlayerPacket.pitch, MovePlayerPacket.MODE_RESET); - break; - } - - boolean revert = false; - if (!this.isAlive() || !this.spawned) { - revert = true; - this.forceMovement = this; - } - - if (this.forceMovement != null && (newPos.distanceSquared(this.forceMovement) > 0.1 || revert)) { - this.sendPosition(this.forceMovement, movePlayerPacket.yaw, movePlayerPacket.pitch, MovePlayerPacket.MODE_RESET); - } else { - - movePlayerPacket.yaw %= 360; - movePlayerPacket.pitch %= 360; - - if (movePlayerPacket.yaw < 0) { - movePlayerPacket.yaw += 360; - } - - this.setRotation(movePlayerPacket.yaw, movePlayerPacket.pitch); - this.newPosition = newPos; - this.forceMovement = null; - } - break; - case ProtocolInfo.MOVE_ENTITY_ABSOLUTE_PACKET: - MoveEntityAbsolutePacket moveEntityAbsolutePacket = (MoveEntityAbsolutePacket) packet; - if (!this.spawned || this.riding == null || this.riding.getId() != moveEntityAbsolutePacket.eid || !this.riding.isControlling(this)) { - break; - } - if (this.riding instanceof EntityBoat) { - ((EntityBoat) this.riding).onInput(moveEntityAbsolutePacket.x, moveEntityAbsolutePacket.y, moveEntityAbsolutePacket.z, moveEntityAbsolutePacket.headYaw); - } - break; - case ProtocolInfo.ADVENTURE_SETTINGS_PACKET: - AdventureSettingsPacket adventureSettingsPacket = (AdventureSettingsPacket) packet; - if (!server.getAllowFlight() && (adventureSettingsPacket.getFlag(AdventureSettingsPacket.ALLOW_FLIGHT) || adventureSettingsPacket.getFlag(AdventureSettingsPacket.FLYING)) && !this.adventureSettings.get(Type.ALLOW_FLIGHT)) { - this.kick(PlayerKickEvent.Reason.FLYING_DISABLED, "Flying is not enabled on this server", true, "type=AdventureSettingsPacket, flags=ALLOW_FLIGHT: " + adventureSettingsPacket.getFlag(AdventureSettingsPacket.ALLOW_FLIGHT) + ", FLYING: " + adventureSettingsPacket.getFlag(AdventureSettingsPacket.ALLOW_FLIGHT)); - break; - } - PlayerToggleFlightEvent playerToggleFlightEvent = new PlayerToggleFlightEvent(this, adventureSettingsPacket.getFlag(AdventureSettingsPacket.FLYING)); - this.server.getPluginManager().callEvent(playerToggleFlightEvent); - if (playerToggleFlightEvent.isCancelled()) { - this.adventureSettings.update(); - } else { - this.adventureSettings.set(Type.FLYING, playerToggleFlightEvent.isFlying()); - } - break; - case ProtocolInfo.MOB_EQUIPMENT_PACKET: - if (!this.spawned || !this.isAlive()) { - break; - } - - MobEquipmentPacket mobEquipmentPacket = (MobEquipmentPacket) packet; - - Inventory inv = this.getWindowById(mobEquipmentPacket.windowId); - - if (inv == null) { - this.server.getLogger().debug("Player " + this.getName() + " has no open container with window ID " + mobEquipmentPacket.windowId); - return; - } - - Item item = inv.getItem(mobEquipmentPacket.hotbarSlot); - - if (!item.equals(mobEquipmentPacket.item)) { - this.server.getLogger().debug("Tried to equip " + mobEquipmentPacket.item + " but have " + item + " in target slot"); - inv.sendContents(this); - return; - } - - if (inv instanceof PlayerInventory) { - ((PlayerInventory) inv).equipItem(mobEquipmentPacket.hotbarSlot); - } - - this.setDataFlag(Player.DATA_FLAGS, Player.DATA_FLAG_ACTION, false); - - break; - case ProtocolInfo.PLAYER_ACTION_PACKET: - PlayerActionPacket playerActionPacket = (PlayerActionPacket) packet; - if (!this.spawned || (!this.isAlive() && playerActionPacket.action != PlayerActionPacket.ACTION_RESPAWN && playerActionPacket.action != PlayerActionPacket.ACTION_DIMENSION_CHANGE_REQUEST)) { - break; - } - - playerActionPacket.entityId = this.id; - Vector3 pos = this.temporalVector.setComponents(playerActionPacket.x, playerActionPacket.y, playerActionPacket.z); - BlockFace face = BlockFace.fromIndex(playerActionPacket.face); - - actionswitch: - switch (playerActionPacket.action) { - case PlayerActionPacket.ACTION_START_BREAK: - long currentBreak = System.currentTimeMillis(); - BlockVector3 currentBreakPosition = new BlockVector3(playerActionPacket.x, playerActionPacket.y, playerActionPacket.z); - // HACK: Client spams multiple left clicks so we need to skip them. - if ((lastBreakPosition.equals(currentBreakPosition) && (currentBreak - this.lastBreak) < 10) || pos.distanceSquared(this) > 100) { - break; - } - Block target = this.level.getBlock(pos); - PlayerInteractEvent playerInteractEvent = new PlayerInteractEvent(this, this.inventory.getItemInHand(), target, face, target.getId() == 0 ? Action.LEFT_CLICK_AIR : Action.LEFT_CLICK_BLOCK); - this.getServer().getPluginManager().callEvent(playerInteractEvent); - if (playerInteractEvent.isCancelled()) { - this.inventory.sendHeldItem(this); - break; - } - switch (target.getId()) { - case Block.NOTEBLOCK: - ((BlockNoteblock) target).emitSound(); - break actionswitch; - case Block.DRAGON_EGG: - if (!this.isCreative()) { - ((BlockDragonEgg) target).teleport(); - break actionswitch; - } - case Block.ITEM_FRAME_BLOCK: - BlockEntity itemFrame = this.level.getBlockEntityIfLoaded(pos); - if (itemFrame instanceof BlockEntityItemFrame && ((BlockEntityItemFrame) itemFrame).dropItem(this)) { - break actionswitch; - } - } - Block block = target.getSide(face); - if (block.getId() == Block.FIRE) { - this.level.setBlock(block, Block.get(BlockID.AIR), true); - this.level.addLevelSoundEvent(block, LevelSoundEventPacket.SOUND_EXTINGUISH_FIRE); - break; - } - if (!this.isCreative()) { - double breakTime = Math.ceil(target.getBreakTime(this.inventory.getItemInHandFast(), this) * 20); - if (breakTime > 0) { - LevelEventPacket pk = new LevelEventPacket(); - pk.evid = LevelEventPacket.EVENT_BLOCK_START_BREAK; - pk.x = (float) pos.x; - pk.y = (float) pos.y; - pk.z = (float) pos.z; - pk.data = (int) (65535 / breakTime); - this.getLevel().addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, pk); - } - } - - this.breakingBlock = target; - this.lastBreak = currentBreak; - this.lastBreakPosition = currentBreakPosition; - break; - - case PlayerActionPacket.ACTION_ABORT_BREAK: - case PlayerActionPacket.ACTION_STOP_BREAK: - LevelEventPacket pk = new LevelEventPacket(); - pk.evid = LevelEventPacket.EVENT_BLOCK_STOP_BREAK; - pk.x = (float) pos.x; - pk.y = (float) pos.y; - pk.z = (float) pos.z; - pk.data = 0; - this.getLevel().addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, pk); - this.breakingBlock = null; - break; - case PlayerActionPacket.ACTION_GET_UPDATED_BLOCK: - case PlayerActionPacket.ACTION_DROP_ITEM: - break; - case PlayerActionPacket.ACTION_STOP_SLEEPING: - this.stopSleep(); - break; - case PlayerActionPacket.ACTION_RESPAWN: - if (!this.spawned || this.isAlive() || !this.isOnline()) { - break; - } - - this.respawn(); - break; - case PlayerActionPacket.ACTION_JUMP: - if (this.inAirTicks > 40 && this.checkMovement && !server.getAllowFlight() && !this.isCreative() && !this.isSwimming() && !this.isGliding()) { - /*if (this.inAirTicks < 150) { - PlayerInvalidMoveEvent playerInvalidMoveEvent = new PlayerInvalidMoveEvent(this, true); - this.getServer().getPluginManager().callEvent(playerInvalidMoveEvent); - if (!playerInvalidMoveEvent.isCancelled()) { - this.motionY = -4; - } - } else {*/ - this.kick(PlayerKickEvent.Reason.FLYING_DISABLED, "Flying is not enabled on this server", true, "type=ACTION_JUMP, inAirTicks=" + this.inAirTicks); - //} - break; - } - this.server.getPluginManager().callEvent(new PlayerJumpEvent(this)); - break packetswitch; - case PlayerActionPacket.ACTION_START_SPRINT: - PlayerToggleSprintEvent playerToggleSprintEvent = new PlayerToggleSprintEvent(this, true); - this.server.getPluginManager().callEvent(playerToggleSprintEvent); - if (playerToggleSprintEvent.isCancelled()) { - this.sendData(this); - } else { - this.setSprinting(true); - } - break packetswitch; - case PlayerActionPacket.ACTION_STOP_SPRINT: - playerToggleSprintEvent = new PlayerToggleSprintEvent(this, false); - this.server.getPluginManager().callEvent(playerToggleSprintEvent); - if (playerToggleSprintEvent.isCancelled()) { - this.sendData(this); - } else { - this.setSprinting(false); - } - break packetswitch; - case PlayerActionPacket.ACTION_START_SNEAK: - PlayerToggleSneakEvent playerToggleSneakEvent = new PlayerToggleSneakEvent(this, true); - this.server.getPluginManager().callEvent(playerToggleSneakEvent); - if (playerToggleSneakEvent.isCancelled()) { - this.sendData(this); - } else { - this.setSneaking(true); - } - break packetswitch; - case PlayerActionPacket.ACTION_STOP_SNEAK: - playerToggleSneakEvent = new PlayerToggleSneakEvent(this, false); - this.server.getPluginManager().callEvent(playerToggleSneakEvent); - if (playerToggleSneakEvent.isCancelled()) { - this.sendData(this); - } else { - this.setSneaking(false); - } - break packetswitch; - case PlayerActionPacket.ACTION_DIMENSION_CHANGE_ACK: - this.sendPosition(this, this.yaw, this.pitch, MovePlayerPacket.MODE_RESET); - this.dummyBossBars.values().forEach(DummyBossBar::reshow); - break; - case PlayerActionPacket.ACTION_START_GLIDE: - if (!server.getAllowFlight() && this.checkMovement) { - Item chestplate = this.getInventory().getChestplateFast(); - if ((chestplate == null || chestplate.getId() != ItemID.ELYTRA) && !server.getAllowFlight()) { - this.kick(PlayerKickEvent.Reason.FLYING_DISABLED, "Flying is not enabled on this server", true, "type=ACTION_START_GLIDE"); - break; - } - } - PlayerToggleGlideEvent playerToggleGlideEvent = new PlayerToggleGlideEvent(this, true); - this.server.getPluginManager().callEvent(playerToggleGlideEvent); - if (playerToggleGlideEvent.isCancelled()) { - this.sendData(this); - } else { - this.setGliding(true); - } - break packetswitch; - case PlayerActionPacket.ACTION_STOP_GLIDE: - playerToggleGlideEvent = new PlayerToggleGlideEvent(this, false); - this.server.getPluginManager().callEvent(playerToggleGlideEvent); - if (playerToggleGlideEvent.isCancelled()) { - this.sendData(this); - } else { - this.setGliding(false); - } - break packetswitch; - case PlayerActionPacket.ACTION_CONTINUE_BREAK: - if (this.isBreakingBlock()) { - this.level.addParticle(new PunchBlockParticle(pos, this.breakingBlock, face)); - } - break; - case PlayerActionPacket.ACTION_START_SWIMMING: - PlayerToggleSwimEvent ptse = new PlayerToggleSwimEvent(this, true); - if (!this.isInsideOfWater()) { - ptse.setCancelled(true); - } - this.server.getPluginManager().callEvent(ptse); - if (ptse.isCancelled()) { - this.sendData(this); - } else { - this.setSwimming(true); - } - break; - case PlayerActionPacket.ACTION_STOP_SWIMMING: - ptse = new PlayerToggleSwimEvent(this, false); - this.server.getPluginManager().callEvent(ptse); - if (ptse.isCancelled()) { - this.sendData(this); - } else { - this.setSwimming(false); - } - break; - } - - this.setUsingItem(false); - break; - case ProtocolInfo.MODAL_FORM_RESPONSE_PACKET: - this.formOpen = false; - - if (!this.spawned || !this.isAlive()) { - break; - } - - ModalFormResponsePacket modalFormPacket = (ModalFormResponsePacket) packet; - - if (formWindows.containsKey(modalFormPacket.formId)) { - FormWindow window = formWindows.remove(modalFormPacket.formId); - window.setResponse(modalFormPacket.data.trim()); - - PlayerFormRespondedEvent event = new PlayerFormRespondedEvent(this, modalFormPacket.formId, window); - getServer().getPluginManager().callEvent(event); - } else if (serverSettings.containsKey(modalFormPacket.formId)) { - FormWindow window = serverSettings.get(modalFormPacket.formId); - window.setResponse(modalFormPacket.data.trim()); - - PlayerSettingsRespondedEvent event = new PlayerSettingsRespondedEvent(this, modalFormPacket.formId, window); - getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled() && window instanceof FormWindowCustom) - ((FormWindowCustom) window).setElementsFromResponse(); - } - - break; - - case ProtocolInfo.INTERACT_PACKET: - if (!this.spawned || !this.isAlive()) { - break; - } - - this.craftingType = CRAFTING_SMALL; - - InteractPacket interactPacket = (InteractPacket) packet; - - Entity targetEntity = this.level.getEntity(interactPacket.target); - - if (interactPacket.action != InteractPacket.ACTION_OPEN_INVENTORY && (targetEntity == null || !this.isAlive() || !targetEntity.isAlive())) { - break; - } - - if (interactPacket.action != InteractPacket.ACTION_OPEN_INVENTORY && (targetEntity instanceof EntityItem || targetEntity instanceof EntityArrow || targetEntity instanceof EntityXPOrb)) { - //this.kick(PlayerKickEvent.Reason.INVALID_PVE, "Attempting to interact with an invalid entity"); - this.server.getLogger().warning(this.getServer().getLanguage().translateString("nukkit.player.invalidEntity", this.username)); - break; - } - - switch (interactPacket.action) { - case InteractPacket.ACTION_OPEN_INVENTORY: - if (this.protocol >= 407) { - if (!this.inventoryOpen) { - this.inventoryOpen = this.inventory.open(this); - } - } - break; - case InteractPacket.ACTION_MOUSEOVER: - if (interactPacket.target == 0 && this.protocol >= 313) { - break packetswitch; - } - this.getServer().getPluginManager().callEvent(new PlayerMouseOverEntityEvent(this, targetEntity)); - break; - case InteractPacket.ACTION_VEHICLE_EXIT: - if (!(targetEntity instanceof EntityRideable) || this.riding == null) { - break; - } - - ((EntityRideable) riding).dismountEntity(this); - break; - } - break; - case ProtocolInfo.BLOCK_PICK_REQUEST_PACKET: - BlockPickRequestPacket pickRequestPacket = (BlockPickRequestPacket) packet; - Block block = this.level.getBlock(pickRequestPacket.x, pickRequestPacket.y, pickRequestPacket.z, false); - item = block.toItem(); - if (pickRequestPacket.addUserData) { - BlockEntity blockEntity = this.getLevel().getBlockEntityIfLoaded(this.temporalVector.setComponents(pickRequestPacket.x, pickRequestPacket.y, pickRequestPacket.z)); - if (blockEntity != null) { - CompoundTag nbt = blockEntity.getCleanedNBT(); - if (nbt != null) { - item.setCustomBlockData(nbt); - item.setLore("+(DATA)"); - } - } - } - - PlayerBlockPickEvent pickEvent = new PlayerBlockPickEvent(this, block, item); - if (this.isSpectator()) { - pickEvent.setCancelled(); - } - - this.server.getPluginManager().callEvent(pickEvent); - - if (!pickEvent.isCancelled()) { - boolean itemExists = false; - int itemSlot = -1; - for (int slot = 0; slot < this.inventory.getSize(); slot++) { - if (this.inventory.getItem(slot).equals(pickEvent.getItem())) { - if (slot < this.inventory.getHotbarSize()) { - this.inventory.setHeldItemSlot(slot); - } else { - itemSlot = slot; - } - itemExists = true; - break; - } - } - - for (int slot = 0; slot < this.inventory.getHotbarSize(); slot++) { - if (this.inventory.getItem(slot).isNull()) { - if (!itemExists && this.isCreative()) { - this.inventory.setHeldItemSlot(slot); - this.inventory.setItemInHand(pickEvent.getItem()); - break packetswitch; - } else if (itemSlot > -1) { - this.inventory.setHeldItemSlot(slot); - this.inventory.setItemInHand(this.inventory.getItem(itemSlot)); - this.inventory.clear(itemSlot, true); - break packetswitch; - } - } - } - - if (!itemExists && this.isCreative()) { - Item itemInHand = this.inventory.getItemInHand(); - this.inventory.setItemInHand(pickEvent.getItem()); - if (!this.inventory.isFull()) { - for (int slot = 0; slot < this.inventory.getSize(); slot++) { - if (this.inventory.getItem(slot).isNull()) { - this.inventory.setItem(slot, itemInHand); - break; - } - } - } - } else if (itemSlot > -1) { - Item itemInHand = this.inventory.getItemInHand(); - this.inventory.setItemInHand(this.inventory.getItem(itemSlot)); - this.inventory.setItem(itemSlot, itemInHand); - } - } - break; - case ProtocolInfo.ANIMATE_PACKET: - if (!this.spawned || !this.isAlive()) { - break; - } - - PlayerAnimationEvent animationEvent = new PlayerAnimationEvent(this, ((AnimatePacket) packet).action); - this.server.getPluginManager().callEvent(animationEvent); - if (animationEvent.isCancelled()) { - break; - } - - AnimatePacket.Action animation = animationEvent.getAnimationType(); - - switch (animation) { - case ROW_RIGHT: - case ROW_LEFT: - if (this.riding instanceof EntityBoat) { - ((EntityBoat) this.riding).onPaddle(animation, ((AnimatePacket) packet).rowingTime); - } - break; - } - - AnimatePacket animatePacket = new AnimatePacket(); - animatePacket.eid = this.getId(); - animatePacket.action = animationEvent.getAnimationType(); - Server.broadcastPacket(this.getViewers().values(), animatePacket); - break; - case ProtocolInfo.ENTITY_EVENT_PACKET: - if (!this.spawned || !this.isAlive()) { - break; - } - - EntityEventPacket entityEventPacket = (EntityEventPacket) packet; - - if (entityEventPacket.event != EntityEventPacket.ENCHANT) { - this.craftingType = CRAFTING_SMALL; - } - - switch (entityEventPacket.event) { - case EntityEventPacket.EATING_ITEM: - if (entityEventPacket.data == 0 || entityEventPacket.eid != this.id) { - break; - } - - entityEventPacket.eid = this.id; - entityEventPacket.isEncoded = false; - this.dataPacket(entityEventPacket); - Server.broadcastPacket(this.getViewers().values(), entityEventPacket); - break; - case EntityEventPacket.ENCHANT: - if (entityEventPacket.eid != this.id) { - break; - } - - if (this.protocol >= ProtocolInfo.v1_16_0) { - Inventory inventory = this.getWindowById(ANVIL_WINDOW_ID); - if (inventory instanceof AnvilInventory) { - ((AnvilInventory) inventory).setCost(-entityEventPacket.data); - } - break; - } - - int levels = entityEventPacket.data; // Sent as negative number of levels lost - if (levels < 0) { - this.setExperience(this.exp, this.expLevel + levels); - } - break; - } - break; - case ProtocolInfo.COMMAND_REQUEST_PACKET: - if (!this.spawned || !this.isAlive()) { - break; - } - this.craftingType = CRAFTING_SMALL; - CommandRequestPacket commandRequestPacket = (CommandRequestPacket) packet; - PlayerCommandPreprocessEvent playerCommandPreprocessEvent = new PlayerCommandPreprocessEvent(this, commandRequestPacket.command + ' '); - this.server.getPluginManager().callEvent(playerCommandPreprocessEvent); - if (playerCommandPreprocessEvent.isCancelled()) { - break; - } - - if (Timings.playerCommandTimer != null) Timings.playerCommandTimer.startTiming(); - this.server.dispatchCommand(playerCommandPreprocessEvent.getPlayer(), playerCommandPreprocessEvent.getMessage().substring(1)); - if (Timings.playerCommandTimer != null) Timings.playerCommandTimer.stopTiming(); - break; - case ProtocolInfo.TEXT_PACKET: - if (!this.spawned || !this.isAlive()) { - break; - } - - TextPacket textPacket = (TextPacket) packet; - - if (textPacket.type == TextPacket.TYPE_CHAT) { - String chatMessage = textPacket.message; - int breakLine = chatMessage.indexOf('\n'); - // Chat messages shouldn't contain break lines so ignore text afterwards - if (breakLine != -1) { - chatMessage = chatMessage.substring(0, breakLine); - } - this.chat(chatMessage); - } - break; - case ProtocolInfo.CONTAINER_CLOSE_PACKET: - ContainerClosePacket containerClosePacket = (ContainerClosePacket) packet; - if (!this.spawned || (containerClosePacket.windowId == ContainerIds.INVENTORY && !inventoryOpen && this.protocol >= 407)) { - break; - } - - if (this.windowIndex.containsKey(containerClosePacket.windowId)) { - this.server.getPluginManager().callEvent(new InventoryCloseEvent(this.windowIndex.get(containerClosePacket.windowId), this)); - if (containerClosePacket.windowId == ContainerIds.INVENTORY) this.inventoryOpen = false; - this.closingWindowId = containerClosePacket.windowId; - this.removeWindow(this.windowIndex.get(containerClosePacket.windowId), true); - this.closingWindowId = Integer.MIN_VALUE; - } - if (containerClosePacket.windowId == -1) { - this.craftingType = CRAFTING_SMALL; - this.resetCraftingGridType(); - this.addWindow(this.craftingGrid, ContainerIds.NONE); - if (this.protocol >= 407) { - ContainerClosePacket pk = new ContainerClosePacket(); - pk.windowId = -1; - pk.wasServerInitiated = false; - this.dataPacket(pk); - } - } - break; - case ProtocolInfo.BLOCK_ENTITY_DATA_PACKET: - if (!this.spawned || !this.isAlive()) { - break; - } - BlockEntityDataPacket blockEntityDataPacket = (BlockEntityDataPacket) packet; - this.craftingType = CRAFTING_SMALL; - this.resetCraftingGridType(); - - pos = this.temporalVector.setComponents(blockEntityDataPacket.x, blockEntityDataPacket.y, blockEntityDataPacket.z); - if (pos.distanceSquared(this) > 10000) { - break; - } - - BlockEntity t = this.level.getBlockEntity(pos); - if (t instanceof BlockEntitySpawnable) { - CompoundTag nbt; - try { - nbt = NBTIO.read(blockEntityDataPacket.namedTag, ByteOrder.LITTLE_ENDIAN, true); - } catch (IOException e) { - throw new RuntimeException(e); - } - - if (!((BlockEntitySpawnable) t).updateCompoundTag(nbt, this)) { - ((BlockEntitySpawnable) t).spawnTo(this); - } - } - break; - case ProtocolInfo.REQUEST_CHUNK_RADIUS_PACKET: - RequestChunkRadiusPacket requestChunkRadiusPacket = (RequestChunkRadiusPacket) packet; - ChunkRadiusUpdatedPacket chunkRadiusUpdatePacket = new ChunkRadiusUpdatedPacket(); - this.chunkRadius = Math.max(3, Math.min(requestChunkRadiusPacket.radius, this.viewDistance)); - chunkRadiusUpdatePacket.radius = this.chunkRadius; - this.dataPacket(chunkRadiusUpdatePacket); - break; - case ProtocolInfo.SET_PLAYER_GAME_TYPE_PACKET: - SetPlayerGameTypePacket setPlayerGameTypePacket = (SetPlayerGameTypePacket) packet; - if (setPlayerGameTypePacket.gamemode != this.gamemode) { - if (!this.hasPermission("nukkit.command.gamemode")) { - this.kick(PlayerKickEvent.Reason.INVALID_PACKET, "Invalid SetPlayerGameTypePacket", true, "type=SetPlayerGameTypePacket"); - /*SetPlayerGameTypePacket setPlayerGameTypePacket1 = new SetPlayerGameTypePacket(); - setPlayerGameTypePacket1.gamemode = this.gamemode & 0x01; - this.dataPacket(setPlayerGameTypePacket1); - this.adventureSettings.update();*/ - break; - } - this.setGamemode(setPlayerGameTypePacket.gamemode, true); - Command.broadcastCommandMessage(this, new TranslationContainer("commands.gamemode.success.self", Server.getGamemodeString(this.gamemode))); - } - break; - case ProtocolInfo.ITEM_FRAME_DROP_ITEM_PACKET: - ItemFrameDropItemPacket itemFrameDropItemPacket = (ItemFrameDropItemPacket) packet; - BlockEntity itemFrame = this.level.getBlockEntityIfLoaded(this.temporalVector.setComponents(itemFrameDropItemPacket.x, itemFrameDropItemPacket.y, itemFrameDropItemPacket.z)); - if (itemFrame instanceof BlockEntityItemFrame) { - ((BlockEntityItemFrame) itemFrame).dropItem(this); - } - break; - case ProtocolInfo.MAP_INFO_REQUEST_PACKET: - MapInfoRequestPacket pk = (MapInfoRequestPacket) packet; - Item mapItem = null; - - for (Item item1 : this.inventory.getContents().values()) { - if (item1 instanceof ItemMap && ((ItemMap) item1).getMapId() == pk.mapId) { - mapItem = item1; - } - } - - if (mapItem == null) { - for (BlockEntity be : this.level.getBlockEntities().values()) { - if (be instanceof BlockEntityItemFrame) { - BlockEntityItemFrame itemFrame1 = (BlockEntityItemFrame) be; - - if (itemFrame1.getItem() instanceof ItemMap && ((ItemMap) itemFrame1.getItem()).getMapId() == pk.mapId) { - ((ItemMap) itemFrame1.getItem()).sendImage(this); - break; - } - } - } - } else { - PlayerMapInfoRequestEvent event; - getServer().getPluginManager().callEvent(event = new PlayerMapInfoRequestEvent(this, mapItem)); - - if (!event.isCancelled()) { - ItemMap map = (ItemMap) mapItem; - if (map.trySendImage(this)) { - return; - } - try { - BufferedImage image = new BufferedImage(128, 128, BufferedImage.TYPE_INT_RGB); - Graphics2D graphics = image.createGraphics(); - - int worldX = (this.getFloorX () / 128) << 7; - int worldZ = (this.getFloorZ () / 128) << 7; - for (int x = 0; x < 128; x++) { - for (int y = 0; y < 128; y++) { - graphics.setColor(new Color(this.getLevel().getMapColorAt(worldX + x, worldZ + y).getRGB())); - graphics.fillRect(x, y, x + 1, y + 1); - } - } - - map.setImage(image); - map.sendImage(this); - } catch (Exception ex) { - this.getServer().getLogger().debug("There was an error while generating map image", ex); - } - } - } - - break; - case ProtocolInfo.LEVEL_SOUND_EVENT_PACKET: - case ProtocolInfo.LEVEL_SOUND_EVENT_PACKET_V1: - case ProtocolInfo.LEVEL_SOUND_EVENT_PACKET_V2: - if (this.isSpectator()) { - if (((LevelSoundEventPacket) packet).sound == LevelSoundEventPacket.SOUND_HIT || ((LevelSoundEventPacket) packet).sound == LevelSoundEventPacket.SOUND_ATTACK_NODAMAGE || ((LevelSoundEventPacket) packet).sound == LevelSoundEventPacket.SOUND_ATTACK || ((LevelSoundEventPacket) packet).sound == LevelSoundEventPacket.SOUND_ATTACK_STRONG) { - break; - } - } - this.level.addChunkPacket(this.getChunkX(), this.getChunkZ(), packet); - break; - case ProtocolInfo.INVENTORY_TRANSACTION_PACKET: - if (this.isSpectator()) { - this.sendAllInventories(); - break; - } - - InventoryTransactionPacket transactionPacket = (InventoryTransactionPacket) packet; - - List actions = new ArrayList<>(); - for (NetworkInventoryAction networkInventoryAction : transactionPacket.actions) { - InventoryAction a = networkInventoryAction.createInventoryAction(this); - - if (a == null) { - this.getServer().getLogger().debug("Unmatched inventory action from " + this.username + ": " + networkInventoryAction); - this.getCursorInventory().sendContents(this); - this.sendAllInventories(); - break packetswitch; - } - - actions.add(a); - } - - if (transactionPacket.isCraftingPart) { - if (this.craftingTransaction == null) { - this.craftingTransaction = new CraftingTransaction(this, actions); - } else { - for (InventoryAction action : actions) { - this.craftingTransaction.addAction(action); - } - } - - if (this.craftingTransaction.getPrimaryOutput() != null && this.craftingTransaction.canExecute()) { - try { - this.craftingTransaction.execute(); - } catch (Exception e) { - this.server.getLogger().debug("Executing crafting transaction failed"); - } - this.craftingTransaction = null; - } - return; - } else if (this.protocol >= ProtocolInfo.v1_16_0 && transactionPacket.isEnchantingPart) { - if (this.enchantTransaction == null) { - this.enchantTransaction = new EnchantTransaction(this, actions); - } else { - for (InventoryAction action : actions) { - this.enchantTransaction.addAction(action); - } - } - if (this.enchantTransaction.canExecute()) { - this.enchantTransaction.execute(); - this.enchantTransaction = null; - } - return; - } else if (this.protocol >= ProtocolInfo.v1_16_0 && transactionPacket.isRepairItemPart) { - if (this.repairItemTransaction == null) { - this.repairItemTransaction = new RepairItemTransaction(this, actions); - } else { - for (InventoryAction action : actions) { - this.repairItemTransaction.addAction(action); - } - } - if (this.repairItemTransaction.canExecute()) { - this.repairItemTransaction.execute(); - this.repairItemTransaction = null; - } - return; - } else if (this.craftingTransaction != null) { - if (craftingTransaction.checkForCraftingPart(actions)) { - for (InventoryAction action : actions) { - craftingTransaction.addAction(action); - } - return; - } else { - this.server.getLogger().debug("Got unexpected normal inventory action with incomplete crafting transaction from " + this.username + ", refusing to execute crafting"); - if (this.protocol >= ProtocolInfo.v1_16_0) { - this.removeAllWindows(false); - this.getCursorInventory().sendContents(this); - this.sendAllInventories(); - } - this.craftingTransaction = null; - } - } else if (this.protocol >= ProtocolInfo.v1_16_0 && this.enchantTransaction != null) { - if (enchantTransaction.checkForEnchantPart(actions)) { - for (InventoryAction action : actions) { - enchantTransaction.addAction(action); - } - return; - } else { - this.server.getLogger().debug("Got unexpected normal inventory action with incomplete enchanting transaction from " + this.username + ", refusing to execute enchant " + transactionPacket.toString()); - this.removeAllWindows(false); - this.getCursorInventory().sendContents(this); - this.sendAllInventories(); - this.enchantTransaction = null; - } - } else if (this.protocol >= ProtocolInfo.v1_16_0 && this.repairItemTransaction != null) { - if (RepairItemTransaction.checkForRepairItemPart(actions)) { - for (InventoryAction action : actions) { - this.repairItemTransaction.addAction(action); - } - return; - } else { - this.server.getLogger().debug("Got unexpected normal inventory action with incomplete repair item transaction from " + this.username + ", refusing to execute repair item " + transactionPacket.toString()); - this.removeAllWindows(false); - this.getCursorInventory().sendContents(this); - this.sendAllInventories(); - this.repairItemTransaction = null; - } - } - - switch (transactionPacket.transactionType) { - case InventoryTransactionPacket.TYPE_NORMAL: - InventoryTransaction transaction = new InventoryTransaction(this, actions); - - if (!transaction.execute()) { - this.server.getLogger().debug("Failed to execute inventory transaction from " + this.username + " with actions: " + Arrays.toString(transactionPacket.actions)); - failedTransactions++; - if (failedTransactions > 10) { - this.close("", "Too many failed inventory transactions"); - } - break packetswitch; - } - - break packetswitch; - case InventoryTransactionPacket.TYPE_MISMATCH: - if (transactionPacket.actions.length > 0) { - this.server.getLogger().debug("Expected 0 actions for mismatch, got " + transactionPacket.actions.length + ", " + Arrays.toString(transactionPacket.actions)); - } - this.getCursorInventory().sendContents(this); - this.sendAllInventories(); - break packetswitch; - case InventoryTransactionPacket.TYPE_USE_ITEM: - UseItemData useItemData; - BlockVector3 blockVector; - int type; - - try { - useItemData = (UseItemData) transactionPacket.transactionData; - blockVector = useItemData.blockPos; - face = useItemData.face; - type = useItemData.actionType; - } catch (Exception ignored) { - break packetswitch; - } - - if (this.isBlocking()) { - this.setBlocking(false); - } - - if (inventory.getHeldItemIndex() != useItemData.hotbarSlot) { - inventory.equipItem(useItemData.hotbarSlot); - } - - switch (type) { - case InventoryTransactionPacket.USE_ITEM_ACTION_CLICK_BLOCK: - // Hack: Fix client spamming right clicks - if (!server.doNotLimitInteractions && (lastRightClickPos != null && this.getInventory().getItemInHandFast().getBlockId() == BlockID.AIR && System.currentTimeMillis() - lastRightClickTime < 200.0 && blockVector.distanceSquared(lastRightClickPos) < 0.00001)) { - return; - } - - lastRightClickPos = blockVector.asVector3(); - lastRightClickTime = System.currentTimeMillis(); - - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ACTION, false); - - if (!(this.distance(blockVector.asVector3()) > (this.isCreative() ? 13 : 7))) { - if (this.isCreative()) { - if (this.level.useItemOn(blockVector.asVector3(), inventory.getItemInHand(), face, useItemData.clickPos.x, useItemData.clickPos.y, useItemData.clickPos.z, this) != null) { - break packetswitch; - } - } else if (inventory.getItemInHand().equals(useItemData.itemInHand)) { - Item i = inventory.getItemInHand(); - Item oldItem = i.clone(); - if ((i = this.level.useItemOn(blockVector.asVector3(), i, face, useItemData.clickPos.x, useItemData.clickPos.y, useItemData.clickPos.z, this)) != null) { - if (!i.equals(oldItem) || i.getCount() != oldItem.getCount()) { - if (oldItem.getId() == i.getId() || i.getId() == 0) { - inventory.setItemInHand(i); - } else { - server.getLogger().debug("Tried to set item " + i.getId() + " but " + this.username + " had item " + oldItem.getId() + " in their hand slot"); - } - inventory.sendHeldItem(this.getViewers().values()); - } - break packetswitch; - } - } - } - - inventory.sendHeldItem(this); - - if (blockVector.distanceSquared(this) > 10000) { - break packetswitch; - } - - Block target = this.level.getBlock(blockVector.asVector3()); - block = target.getSide(face); - - this.level.sendBlocks(this, new Block[]{target, block}, UpdateBlockPacket.FLAG_ALL_PRIORITY); - - if (target instanceof BlockDoor) { - BlockDoor door = (BlockDoor) target; - - Block part; - - if ((door.getDamage() & 0x08) > 0) { - part = target.down(); - - if (part.getId() == target.getId()) { - target = part; - - this.level.sendBlocks(this, new Block[]{target}, UpdateBlockPacket.FLAG_ALL_PRIORITY); - } - } - } - break packetswitch; - case InventoryTransactionPacket.USE_ITEM_ACTION_BREAK_BLOCK: - if (!this.spawned || !this.isAlive()) { - break packetswitch; - } - - this.resetCraftingGridType(); - - Item i = this.getInventory().getItemInHand(); - - Item oldItem = i.clone(); - - if (this.canInteract(blockVector.add(0.5, 0.5, 0.5), this.isCreative() ? 13 : 7) && (i = this.level.useBreakOn(blockVector.asVector3(), face, i, this, true)) != null) { - if (this.isSurvival() || this.isAdventure()) { - this.foodData.updateFoodExpLevel(0.025); - if (!i.equals(oldItem) || i.getCount() != oldItem.getCount()) { - if (oldItem.getId() == i.getId() || i.getId() == 0) { - inventory.setItemInHand(i); - } else { - server.getLogger().debug("Tried to set item " + i.getId() + " but " + this.username + " had item " + oldItem.getId() + " in their hand slot"); - } - inventory.sendHeldItem(this.getViewers().values()); - } - } - break packetswitch; - } - - inventory.sendContents(this); - target = this.level.getBlock(blockVector.asVector3()); - BlockEntity blockEntity = this.level.getBlockEntity(blockVector.asVector3()); - - this.level.sendBlocks(this, new Block[]{target}, UpdateBlockPacket.FLAG_ALL_PRIORITY); - - inventory.sendHeldItem(this); - - if (blockEntity instanceof BlockEntitySpawnable) { - ((BlockEntitySpawnable) blockEntity).spawnTo(this); - } - - break packetswitch; - case InventoryTransactionPacket.USE_ITEM_ACTION_CLICK_AIR: - Vector3 directionVector = this.getDirectionVector(); - - if (inventory.getHeldItemIndex() != useItemData.hotbarSlot) { - inventory.equipItem(useItemData.hotbarSlot); - } - - item = this.inventory.getItemInHand(); - - if (item instanceof ItemCrossbow) { - if (!item.onClickAir(this, directionVector)) { - return; // Shoot - } - } - - if (!item.equalsFast(useItemData.itemInHand)) { - this.inventory.sendHeldItem(this); - break packetswitch; - } - - PlayerInteractEvent interactEvent = new PlayerInteractEvent(this, item, directionVector, face, Action.RIGHT_CLICK_AIR); - - this.server.getPluginManager().callEvent(interactEvent); - - if (interactEvent.isCancelled()) { - this.inventory.sendHeldItem(this); - break packetswitch; - } - - if (item.onClickAir(this, directionVector)) { - if (this.isSurvival() || this.isAdventure()) { - if (item.getId() == 0 || this.inventory.getItemInHandFast().getId() == item.getId()) { - this.inventory.setItemInHand(item); - } else { - server.getLogger().debug("Tried to set item " + item.getId() + " but " + this.username + " had item " + this.inventory.getItemInHandFast().getId() + " in their hand slot"); - } - } - - if (!this.isUsingItem()) { - this.setUsingItem(true); - break packetswitch; - } - - // Used item - int ticksUsed = this.server.getTick() - this.startAction; - this.setUsingItem(false); - if (!item.onUse(this, ticksUsed)) { - this.inventory.sendContents(this); - } - } - - break packetswitch; - default: - break; - } - break; - case InventoryTransactionPacket.TYPE_USE_ITEM_ON_ENTITY: - UseItemOnEntityData useItemOnEntityData = (UseItemOnEntityData) transactionPacket.transactionData; - - Entity target = this.level.getEntity(useItemOnEntityData.entityRuntimeId); - if (target == null) { - return; - } - - type = useItemOnEntityData.actionType; - - if (inventory.getHeldItemIndex() != useItemOnEntityData.hotbarSlot) { - inventory.equipItem(useItemOnEntityData.hotbarSlot); - } - - if (!useItemOnEntityData.itemInHand.equalsFast(this.inventory.getItemInHand())) { - this.inventory.sendHeldItem(this); - } - - item = this.inventory.getItemInHand(); - - switch (type) { - case InventoryTransactionPacket.USE_ITEM_ON_ENTITY_ACTION_INTERACT: - PlayerInteractEntityEvent playerInteractEntityEvent = new PlayerInteractEntityEvent(this, target, item, useItemOnEntityData.clickPos); - if (this.isSpectator()) playerInteractEntityEvent.setCancelled(); - getServer().getPluginManager().callEvent(playerInteractEntityEvent); - - if (playerInteractEntityEvent.isCancelled()) { - break; - } - - if (target.onInteract(this, item, useItemOnEntityData.clickPos) && (this.isSurvival() || this.isAdventure())) { - if (item.isTool()) { - if (item.useOn(target) && item.getDamage() >= item.getMaxDurability()) { - level.addSoundToViewers(this, Sound.RANDOM_BREAK); - level.addParticle(new ItemBreakParticle(this, item)); - item = new ItemBlock(Block.get(BlockID.AIR)); - } - } else { - if (item.count > 1) { - item.count--; - } else { - item = new ItemBlock(Block.get(BlockID.AIR)); - } - } - - if (item.getId() == 0 || this.inventory.getItemInHandFast().getId() == item.getId()) { - this.inventory.setItemInHand(item); - } else { - server.getLogger().debug("Tried to set item " + item.getId() + " but " + this.username + " had item " + this.inventory.getItemInHandFast().getId() + " in their hand slot"); - } - } - break; - case InventoryTransactionPacket.USE_ITEM_ON_ENTITY_ACTION_ATTACK: - if (target.getId() == this.getId()) { - this.kick(PlayerKickEvent.Reason.INVALID_PVP, "Tried to attack invalid player"); - return; - } - - if (!this.canInteractEntity(target, isCreative() ? 8 : 5)) { - break; - } else if (target instanceof Player) { - if ((((Player) target).gamemode & 0x01) > 0) { - break; - } else if (!this.server.pvpEnabled) { - break; - } - } - - Enchantment[] enchantments = item.getEnchantments(); - - float itemDamage = item.getAttackDamage(); - for (Enchantment enchantment : enchantments) { - itemDamage += enchantment.getDamageBonus(target); - } - - Map damage = new EnumMap<>(DamageModifier.class); - damage.put(DamageModifier.BASE, itemDamage); - - float knockBack = 0.3f; - Enchantment knockBackEnchantment = item.getEnchantment(Enchantment.ID_KNOCKBACK); - if (knockBackEnchantment != null) { - knockBack += knockBackEnchantment.getLevel() * 0.1f; - } - - EntityDamageByEntityEvent entityDamageByEntityEvent = new EntityDamageByEntityEvent(this, target, DamageCause.ENTITY_ATTACK, damage, knockBack, enchantments); - if (this.isSpectator()) entityDamageByEntityEvent.setCancelled(); - if ((target instanceof Player) && !this.level.getGameRules().getBoolean(GameRule.PVP)) { - entityDamageByEntityEvent.setCancelled(); - } - - if (!target.attack(entityDamageByEntityEvent)) { - if (item.isTool() && !this.isCreative()) { - this.inventory.sendContents(this); - } - break; - } - - for (Enchantment enchantment : item.getEnchantments()) { - enchantment.doPostAttack(this, target); - } - - if (item.isTool() && !this.isCreative()) { - if (item.useOn(target) && item.getDamage() >= item.getMaxDurability()) { - level.addSoundToViewers(this, Sound.RANDOM_BREAK); - level.addParticle(new ItemBreakParticle(this, item)); - this.inventory.setItemInHand(Item.get(0)); - } else { - if (item.getId() == 0 || this.inventory.getItemInHandFast().getId() == item.getId()) { - this.inventory.setItemInHand(item); - } else { - server.getLogger().debug("Tried to set item " + item.getId() + " but " + this.username + " had item " + this.inventory.getItemInHandFast().getId() + " in their hand slot"); - } - } - } - return; - default: - break; - } - - break; - case InventoryTransactionPacket.TYPE_RELEASE_ITEM: - if (this.isSpectator()) { - this.sendAllInventories(); - break packetswitch; - } - ReleaseItemData releaseItemData = (ReleaseItemData) transactionPacket.transactionData; - - try { - type = releaseItemData.actionType; - switch (type) { - case InventoryTransactionPacket.RELEASE_ITEM_ACTION_RELEASE: - if (this.isUsingItem()) { - item = this.inventory.getItemInHand(); - int ticksUsed = this.server.getTick() - this.startAction; - if (!item.onRelease(this, ticksUsed)) { - this.inventory.sendContents(this); - } - this.setUsingItem(false); - } else { - this.inventory.sendContents(this); - } - return; - case InventoryTransactionPacket.RELEASE_ITEM_ACTION_CONSUME: - if (this.protocol >= 388) break; // Usage of potions on 1.13 and later is handled at ItemPotion#onUse - Item itemInHand = this.inventory.getItemInHand(); - PlayerItemConsumeEvent consumeEvent = new PlayerItemConsumeEvent(this, itemInHand); - - if (itemInHand.getId() == Item.POTION) { - this.server.getPluginManager().callEvent(consumeEvent); - if (consumeEvent.isCancelled()) { - this.inventory.sendContents(this); - break; - } - Potion potion = Potion.getPotion(itemInHand.getDamage()); - - if (this.gamemode == SURVIVAL || this.gamemode == ADVENTURE) { - this.getInventory().decreaseCount(this.getInventory().getHeldItemIndex()); - this.inventory.addItem(new ItemGlassBottle()); - } - - if (potion != null) { - potion.applyPotion(this); - } - } else { // Food - this.server.getPluginManager().callEvent(consumeEvent); - if (consumeEvent.isCancelled()) { - this.inventory.sendContents(this); - break; - } - - Food food = Food.getByRelative(itemInHand); - if (food != null && food.eatenBy(this)) { - this.getInventory().decreaseCount(this.getInventory().getHeldItemIndex()); - } - } - return; - default: - break; - } - } finally { - this.setUsingItem(false); - } - break; - default: - this.inventory.sendContents(this); - break; - } - break; - case ProtocolInfo.PLAYER_HOTBAR_PACKET: - PlayerHotbarPacket hotbarPacket = (PlayerHotbarPacket) packet; - - if (hotbarPacket.windowId != ContainerIds.INVENTORY) { - return; - } - - this.inventory.equipItem(hotbarPacket.selectedHotbarSlot); - break; - case ProtocolInfo.SERVER_SETTINGS_REQUEST_PACKET: - PlayerServerSettingsRequestEvent settingsRequestEvent = new PlayerServerSettingsRequestEvent(this, new HashMap<>(this.serverSettings)); - this.getServer().getPluginManager().callEvent(settingsRequestEvent); - - if (!settingsRequestEvent.isCancelled()) { - settingsRequestEvent.getSettings().forEach((id, window) -> { - ServerSettingsResponsePacket re = new ServerSettingsResponsePacket(); - re.formId = id; - re.data = window.getJSONData(); - this.dataPacket(re); - }); - } - break; - case ProtocolInfo.SET_LOCAL_PLAYER_AS_INITIALIZED_PACKET: - if (this.locallyInitialized || this.protocol <= 274) { - return; - } - - this.doFirstSpawn(); - break; - case ProtocolInfo.RESPAWN_PACKET: - if (this.isAlive() || this.protocol < 388) { - break; - } - - RespawnPacket respawnPacket = (RespawnPacket) packet; - if (respawnPacket.respawnState == RespawnPacket.STATE_CLIENT_READY_TO_SPAWN) { - RespawnPacket respawn1 = new RespawnPacket(); - respawn1.x = (float) this.getX(); - respawn1.y = (float) this.getY(); - respawn1.z = (float) this.getZ(); - respawn1.respawnState = RespawnPacket.STATE_READY_TO_SPAWN; - this.dataPacket(respawn1); - } - break; - case ProtocolInfo.BOOK_EDIT_PACKET: - BookEditPacket bookEditPacket = (BookEditPacket) packet; - Item oldBook = this.inventory.getItem(bookEditPacket.inventorySlot); - if (oldBook.getId() != Item.BOOK_AND_QUILL) { - return; - } - - if (bookEditPacket.text != null && bookEditPacket.text.length() > 256) { - return; - } - - Item newBook = oldBook.clone(); - boolean success; - switch (bookEditPacket.action) { - case REPLACE_PAGE: - success = ((ItemBookAndQuill) newBook).setPageText(bookEditPacket.pageNumber, bookEditPacket.text); - break; - case ADD_PAGE: - success = ((ItemBookAndQuill) newBook).insertPage(bookEditPacket.pageNumber, bookEditPacket.text); - break; - case DELETE_PAGE: - success = ((ItemBookAndQuill) newBook).deletePage(bookEditPacket.pageNumber); - break; - case SWAP_PAGES: - success = ((ItemBookAndQuill) newBook).swapPages(bookEditPacket.pageNumber, bookEditPacket.secondaryPageNumber); - break; - case SIGN_BOOK: - newBook = Item.get(Item.WRITTEN_BOOK, 0, 1, oldBook.getCompoundTag()); - success = ((ItemBookWritten) newBook).signBook(bookEditPacket.title, bookEditPacket.author, bookEditPacket.xuid, ItemBookWritten.GENERATION_ORIGINAL); - break; - default: - return; - } - - if (success) { - PlayerEditBookEvent editBookEvent = new PlayerEditBookEvent(this, oldBook, newBook, bookEditPacket.action); - this.server.getPluginManager().callEvent(editBookEvent); - if (!editBookEvent.isCancelled()) { - this.inventory.setItem(bookEditPacket.inventorySlot, editBookEvent.getNewBook()); - } - } - break; - case ProtocolInfo.FILTER_TEXT_PACKET: - FilterTextPacket filterTextPacket = (FilterTextPacket) packet; - FilterTextPacket textResponsePacket = new FilterTextPacket(); - textResponsePacket.text = filterTextPacket.text; - textResponsePacket.fromServer = true; - this.dataPacket(textResponsePacket); - break; - case ProtocolInfo.PACKET_VIOLATION_WARNING_PACKET: - PacketViolationWarningPacket PVWpk = (PacketViolationWarningPacket) packet; - if (pkIDs == null) { - pkIDs = Arrays.stream(ProtocolInfo.class.getDeclaredFields()).filter(field -> field.getType() == Byte.TYPE); - } - Optional PVWpkName = pkIDs - .filter(field -> { - try { - return field.getByte(null) == ((PacketViolationWarningPacket) packet).packetId; - } catch (IllegalAccessException e) { - return false; - } - }).map(Field::getName).findFirst(); - this.getServer().getLogger().warning("PacketViolationWarningPacket" + PVWpkName.map(name -> " for packet " + name).orElse(" UNKNOWN") + " from " + this.username + " (Protocol " + this.protocol + "): " + PVWpk.toString()); - break; - case ProtocolInfo.EMOTE_PACKET: - if (!this.spawned || server.getTick() - this.lastEmote < 20) { - return; - } - this.lastEmote = server.getTick(); - EmotePacket emotePacket = (EmotePacket) packet; - if (emotePacket.runtimeId != this.id) { - server.getLogger().warning(this.username + " tried to send EmotePacket with invalid entity id: " + emotePacket.runtimeId + "!=" + this.id); - return; - } - this.emote(emotePacket); - break; - default: - break; - } - } - } - - /** - * Sends a chat message as this player - * - * @param message message to send - * @return successful - */ - public boolean chat(String message) { - this.resetCraftingGridType(); - this.craftingType = CRAFTING_SMALL; - - if (this.removeFormat) { - message = TextFormat.clean(message, true); - } - - for (String msg : message.split("\n")) { - if (!msg.trim().isEmpty() && msg.length() <= 255) { - PlayerChatEvent chatEvent = new PlayerChatEvent(this, msg); - this.server.getPluginManager().callEvent(chatEvent); - if (!chatEvent.isCancelled()) { - this.server.broadcastMessage(this.getServer().getLanguage().translateString(chatEvent.getFormat(), new String[]{chatEvent.getPlayer().displayName, chatEvent.getMessage()}), chatEvent.getRecipients()); - } - } - } - - return true; - } - - public void emote(EmotePacket emote) { - for (Player player : this.getViewers().values()) { - if (player.protocol >= ProtocolInfo.v1_16_0) { - player.dataPacket(emote); - } - } - } - - public boolean kick() { - return this.kick(""); - } - - public boolean kick(String reason, boolean isAdmin) { - return this.kick(PlayerKickEvent.Reason.UNKNOWN, reason, isAdmin); - } - - public boolean kick(String reason) { - return kick(PlayerKickEvent.Reason.UNKNOWN, reason); - } - - public boolean kick(PlayerKickEvent.Reason reason) { - return this.kick(reason, true); - } - - public boolean kick(PlayerKickEvent.Reason reason, String reasonString) { - return this.kick(reason, reasonString, true); - } - - public boolean kick(PlayerKickEvent.Reason reason, boolean isAdmin) { - return this.kick(reason, reason.toString(), isAdmin); - } - - public boolean kick(PlayerKickEvent.Reason reason, String reasonString, boolean isAdmin) { - return kick(reason, reasonString, isAdmin, ""); - } - - public boolean kick(PlayerKickEvent.Reason reason, String reasonString, boolean isAdmin, String extraData) { - PlayerKickEvent ev; - this.server.getPluginManager().callEvent(ev = new PlayerKickEvent(this, reason, reasonString, this.getLeaveMessage(), extraData)); - if (!ev.isCancelled()) { - String message; - if (isAdmin) { - if (!this.isBanned()) { - message = "Kicked!" + (!reasonString.isEmpty() ? " Reason: " + reasonString : ""); - } else { - message = reasonString; - } - } else { - if (reasonString.isEmpty()) { - message = "disconnectionScreen.noReason"; - } else { - message = reasonString; - } - } - - this.close(ev.getQuitMessage(), message); - - return true; - } - - return false; - } - - public void setViewDistance(int distance) { - this.chunkRadius = distance; - - ChunkRadiusUpdatedPacket pk = new ChunkRadiusUpdatedPacket(); - pk.radius = distance; - - this.dataPacket(pk); - } - - public int getViewDistance() { - return this.chunkRadius; - } - - @Override - public void sendMessage(String message) { - TextPacket pk = new TextPacket(); - pk.type = TextPacket.TYPE_RAW; - pk.message = this.server.getLanguage().translateString(message); - this.dataPacket(pk); - } - - @Override - public void sendMessage(TextContainer message) { - if (message instanceof TranslationContainer) { - this.sendTranslation(message.getText(), ((TranslationContainer) message).getParameters()); - return; - } - this.sendMessage(message.getText()); - } - - public void sendTranslation(String message) { - this.sendTranslation(message, new String[0]); - } - - public void sendTranslation(String message, String[] parameters) { - TextPacket pk = new TextPacket(); - if (!this.server.isLanguageForced()) { - pk.type = TextPacket.TYPE_TRANSLATION; - pk.message = this.server.getLanguage().translateString(message, parameters, "nukkit."); - for (int i = 0; i < parameters.length; i++) { - parameters[i] = this.server.getLanguage().translateString(parameters[i], parameters, "nukkit."); - } - pk.parameters = parameters; - } else { - pk.type = TextPacket.TYPE_RAW; - pk.message = this.server.getLanguage().translateString(message, parameters); - } - this.dataPacket(pk); - } - - public void sendChat(String message) { - this.sendChat("", message); - } - - public void sendChat(String source, String message) { - TextPacket pk = new TextPacket(); - pk.type = TextPacket.TYPE_CHAT; - pk.source = source; - pk.message = this.server.getLanguage().translateString(message); - this.dataPacket(pk); - } - - public void sendPopup(String message) { - TextPacket pk = new TextPacket(); - pk.type = TextPacket.TYPE_POPUP; - pk.message = message; - this.dataPacket(pk); - } - - public void sendPopup(String message, String subtitle) { - this.sendPopup(message); - } - - public void sendTip(String message) { - TextPacket pk = new TextPacket(); - pk.type = TextPacket.TYPE_TIP; - pk.message = message; - this.dataPacket(pk); - } - - public void clearTitle() { - SetTitlePacket pk = new SetTitlePacket(); - pk.type = SetTitlePacket.TYPE_CLEAR; - this.dataPacket(pk); - } - - /** - * Resets both title animation times and subtitle for the next shown title - */ - public void resetTitleSettings() { - SetTitlePacket pk = new SetTitlePacket(); - pk.type = SetTitlePacket.TYPE_RESET; - this.dataPacket(pk); - } - - public void setSubtitle(String subtitle) { - SetTitlePacket pk = new SetTitlePacket(); - pk.type = SetTitlePacket.TYPE_SUBTITLE; - pk.text = subtitle; - this.dataPacket(pk); - } - - public void setTitleAnimationTimes(int fadein, int duration, int fadeout) { - SetTitlePacket pk = new SetTitlePacket(); - pk.type = SetTitlePacket.TYPE_ANIMATION_TIMES; - pk.fadeInTime = fadein; - pk.stayTime = duration; - pk.fadeOutTime = fadeout; - this.dataPacket(pk); - } - - private void setTitle(String text) { - SetTitlePacket packet = new SetTitlePacket(); - packet.text = text; - packet.type = SetTitlePacket.TYPE_TITLE; - this.dataPacket(packet); - } - - public void sendTitle(String title) { - this.sendTitle(title, null, 20, 20, 5); - } - - public void sendTitle(String title, String subtitle) { - this.sendTitle(title, subtitle, 20, 20, 5); - } - - public void sendTitle(String title, String subtitle, int fadeIn, int stay, int fadeOut) { - this.setTitleAnimationTimes(fadeIn, stay, fadeOut); - if (!Strings.isNullOrEmpty(subtitle)) { - this.setSubtitle(subtitle); - } - // Title won't send if an empty string is used - this.setTitle(Strings.isNullOrEmpty(title) ? " " : title); - } - - public void sendActionBar(String title) { - this.sendActionBar(title, 1, 0, 1); - } - - public void sendActionBar(String title, int fadein, int duration, int fadeout) { - SetTitlePacket pk = new SetTitlePacket(); - pk.type = SetTitlePacket.TYPE_ACTION_BAR; - pk.text = title; - pk.fadeInTime = fadein; - pk.stayTime = duration; - pk.fadeOutTime = fadeout; - this.dataPacket(pk); - } - - @Override - public void close() { - this.close(""); - } - - public void close(String message) { - this.close(message, "generic"); - } - - public void close(String message, String reason) { - this.close(message, reason, true); - } - - public void close(String message, String reason, boolean notify) { - this.close(new TextContainer(message), reason, notify); - } - - public void close(TextContainer message) { - this.close(message, "generic"); - } - - public void close(TextContainer message, String reason) { - this.close(message, reason, true); - } - - public void close(TextContainer message, String reason, boolean notify) { - if (this.connected && !this.closed) { - if (notify && !reason.isEmpty()) { - DisconnectPacket pk = new DisconnectPacket(); - pk.message = reason; - this.quickBatch(pk); // Batch the packet here to make sure it gets thru before the connection is closed - } - - this.connected = false; - PlayerQuitEvent ev = null; - if (this.username != null && !this.username.isEmpty()) { - this.server.getPluginManager().callEvent(ev = new PlayerQuitEvent(this, message, true, reason)); - if (this.loggedIn && ev.getAutoSave()) { - this.save(); - } - if (this.fishing != null) { - this.stopFishing(false); - } - } - - for (Player player : new ArrayList<>(this.server.playerList.values())) { - if (!player.canSee(this)) { - player.showPlayer(this); - } - } - - this.hiddenPlayers.clear(); - - this.removeAllWindows(true); - - this.unloadChunks(false); - - super.close(); - - this.interfaz.close(this, notify ? reason : ""); - - if (this.loggedIn) { - this.server.removeOnlinePlayer(this); - this.loggedIn = false; - } - - if (ev != null && !Objects.equals(this.username, "") && this.spawned && !Objects.equals(ev.getQuitMessage().toString(), "")) { - this.server.broadcastMessage(ev.getQuitMessage()); - } - - this.server.getPluginManager().unsubscribeFromPermission(Server.BROADCAST_CHANNEL_USERS, this); - this.spawned = false; - this.server.getLogger().info(this.getServer().getLanguage().translateString("nukkit.player.logOut", - TextFormat.AQUA + (this.username == null ? "" : this.username) + TextFormat.WHITE, - this.getAddress(), - String.valueOf(this.getPort()), - this.getServer().getLanguage().translateString(reason))); - this.windows.clear(); - this.hasSpawned.clear(); - this.spawnPosition = null; - - if (this.riding instanceof EntityRideable) { - this.riding.passengers.remove(this); - } - - this.riding = null; - } - - if (this.perm != null) { - this.perm.clearPermissions(); - this.perm = null; - } - - this.inventory = null; - this.chunk = null; - - this.server.removePlayer(this); - - if (this.loggedIn) { - this.server.getLogger().warning("(BUG) Player still logged in"); - this.interfaz.close(this, notify ? reason : ""); - this.server.removeOnlinePlayer(this); - this.loggedIn = false; - } - } - - /** - * Save player data to disk - */ - public void save() { - this.save(false); - } - - /** - * Save player data to disk - * @param async save asynchronously - */ - public void save(boolean async) { - if (this.closed) { - throw new IllegalStateException("Tried to save closed player"); - } - - super.saveNBT(); - - if (this.level != null) { - this.namedTag.putString("Level", this.level.getFolderName()); - if (this.spawnPosition != null && this.spawnPosition.getLevel() != null) { - this.namedTag.putString("SpawnLevel", this.spawnPosition.getLevel().getFolderName()); - this.namedTag.putInt("SpawnX", (int) this.spawnPosition.x); - this.namedTag.putInt("SpawnY", (int) this.spawnPosition.y); - this.namedTag.putInt("SpawnZ", (int) this.spawnPosition.z); - } - - CompoundTag achievements = new CompoundTag(); - for (String achievement : this.achievements) { - achievements.putByte(achievement, 1); - } - - this.namedTag.putCompound("Achievements", achievements); - - this.namedTag.putInt("playerGameType", this.gamemode); - this.namedTag.putLong("lastPlayed", System.currentTimeMillis() / 1000); - - this.namedTag.putString("lastIP", this.getAddress()); - - this.namedTag.putInt("EXP", this.exp); - this.namedTag.putInt("expLevel", this.expLevel); - - this.namedTag.putInt("foodLevel", this.foodData.getLevel()); - this.namedTag.putFloat("foodSaturationLevel", this.foodData.getFoodSaturationLevel()); - - this.namedTag.putInt("TimeSinceRest", this.timeSinceRest); - - if (!this.username.isEmpty() && this.namedTag != null) { - if (this.server.savePlayerDataByUuid) { - this.server.saveOfflinePlayerData(this.uuid, this.namedTag, async); - } else { - this.server.saveOfflinePlayerData(this.username, this.namedTag, async); - } - } - } - } - - /** - * Get player's username - * @return username - */ - public String getName() { - return this.username; - } - - @Override - public void kill() { - if (!this.spawned) { - return; - } - - boolean showMessages = this.level.getGameRules().getBoolean(GameRule.SHOW_DEATH_MESSAGES); - String message = ""; - List params = new ArrayList<>(); - EntityDamageEvent cause = this.getLastDamageCause(); - - if (showMessages) { - params.add(this.displayName); - - switch (cause == null ? DamageCause.CUSTOM : cause.getCause()) { - case ENTITY_ATTACK: - case THORNS: - if (cause instanceof EntityDamageByEntityEvent) { - Entity e = ((EntityDamageByEntityEvent) cause).getDamager(); - killer = e; - if (e instanceof Player) { - message = "death.attack.player"; - params.add(((Player) e).displayName); - break; - } else if (e instanceof EntityLiving) { - message = "death.attack.mob"; - params.add(!Objects.equals(e.getNameTag(), "") ? e.getNameTag() : e.getName()); - break; - } else { - params.add("Unknown"); - } - } - break; - case PROJECTILE: - if (cause instanceof EntityDamageByEntityEvent) { - Entity e = ((EntityDamageByEntityEvent) cause).getDamager(); - killer = e; - if (e instanceof Player) { - message = "death.attack.arrow"; - params.add(((Player) e).displayName); - } else if (e instanceof EntityLiving) { - message = "death.attack.arrow"; - params.add(!Objects.equals(e.getNameTag(), "") ? e.getNameTag() : e.getName()); - break; - } else { - params.add("Unknown"); - } - } - break; - case VOID: - message = "death.attack.outOfWorld"; - break; - case FALL: - if (cause.getFinalDamage() > 2) { - message = "death.fell.accident.generic"; - break; - } - message = "death.attack.fall"; - break; - - case SUFFOCATION: - message = "death.attack.inWall"; - break; - - case LAVA: - message = "death.attack.lava"; - break; - - case MAGMA: - message = "death.attack.magma"; - break; - - case FIRE: - message = "death.attack.onFire"; - break; - - case FIRE_TICK: - message = "death.attack.inFire"; - break; - - case DROWNING: - message = "death.attack.drown"; - break; - - case CONTACT: - if (cause instanceof EntityDamageByBlockEvent) { - int id = ((EntityDamageByBlockEvent) cause).getDamager().getId(); - if (id == Block.CACTUS) { - message = "death.attack.cactus"; - } else if (id == Block.ANVIL) { - message = "death.attack.anvil"; - } - } - break; - - case BLOCK_EXPLOSION: - case ENTITY_EXPLOSION: - if (cause instanceof EntityDamageByEntityEvent) { - Entity e = ((EntityDamageByEntityEvent) cause).getDamager(); - killer = e; - if (e instanceof Player) { - message = "death.attack.explosion.player"; - params.add(((Player) e).displayName); - } else if (e instanceof EntityLiving) { - message = "death.attack.explosion.player"; - params.add(!Objects.equals(e.getNameTag(), "") ? e.getNameTag() : e.getName()); - break; - } else { - message = "death.attack.explosion"; - } - } else { - message = "death.attack.explosion"; - } - break; - case MAGIC: - message = "death.attack.magic"; - break; - case LIGHTNING: - message = "death.attack.lightningBolt"; - break; - case HUNGER: - message = "death.attack.starve"; - break; - default: - message = "death.attack.generic"; - break; - } - } - - PlayerDeathEvent ev = new PlayerDeathEvent(this, this.getDrops(), new TranslationContainer(message, params.toArray(new String[0])), this.expLevel); - ev.setKeepInventory(this.level.gameRules.getBoolean(GameRule.KEEP_INVENTORY)); - ev.setKeepExperience(ev.getKeepInventory()); // Same as above - this.server.getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - if (this.fishing != null) { - this.stopFishing(false); - } - - this.extinguish(); - this.removeAllEffects(); - this.health = 0; - this.scheduleUpdate(); - this.timeSinceRest = 0; - - if (this.getKiller() != null && this.getKiller() instanceof EntityWalkingMob && ((EntityWalkingMob) this.getKiller()).isAngryTo == this.getId()) { - ((EntityWalkingMob) this.getKiller()).isAngryTo = -1; // Reset golem target - if (this.getKiller() instanceof EntityWolf) { - ((EntityWolf) this.getKiller()).setAngry(false); - } - } - - if (!ev.getKeepInventory() && this.level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) { - for (Item item : ev.getDrops()) { - if (!item.hasEnchantment(Enchantment.ID_VANISHING_CURSE)) { - this.level.dropItem(this, item, null, true, 40); - } - } - - if (this.inventory != null) { - this.inventory.clearAll(); - } - - // Offhand inventory is already cleared in inventory.clearAll() - - if (this.playerUIInventory != null) { - this.playerUIInventory.clearAll(); - } - } - - if (!ev.getKeepExperience() && this.level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) { - if (this.isSurvival() || this.isAdventure()) { - int exp = ev.getExperience() * 7; - if (exp > 100) exp = 100; - this.getLevel().dropExpOrb(this, exp); - } - this.setExperience(0, 0); - } - - if (showMessages && !ev.getDeathMessage().toString().isEmpty()) { - this.server.broadcast(ev.getDeathMessage(), Server.BROADCAST_CHANNEL_USERS); - } - - RespawnPacket pk = new RespawnPacket(); - Position pos = this.getSpawn(); - pk.x = (float) pos.x; - pk.y = (float) pos.y; - pk.z = (float) pos.z; - pk.respawnState = RespawnPacket.STATE_SEARCHING_FOR_SPAWN; - this.dataPacket(pk); - - if (level.getGameRules().getBoolean(GameRule.DO_IMMEDIATE_RESPAWN)) { - SetHealthPacket healthPk = new SetHealthPacket(); - healthPk.health = this.getMaxHealth(); - this.dataPacket(healthPk); - } - } - } - - protected void respawn() { - if (this.server.isHardcore()) { - this.setBanned(true); - return; - } - - this.craftingType = CRAFTING_SMALL; - this.resetCraftingGridType(); - - PlayerRespawnEvent playerRespawnEvent = new PlayerRespawnEvent(this, this.getSpawn()); - this.server.getPluginManager().callEvent(playerRespawnEvent); - - Position respawnPos = playerRespawnEvent.getRespawnPosition(); - - this.teleport(respawnPos, null); - - if (this.protocol < 388) { - RespawnPacket respawnPacket = new RespawnPacket(); - respawnPacket.x = (float) respawnPos.x; - respawnPacket.y = (float) respawnPos.y; - respawnPacket.z = (float) respawnPos.z; - this.dataPacket(respawnPacket); - } - - this.sendExperience(); - this.sendExperienceLevel(); - - this.setSprinting(false); - this.setSneaking(false); - - this.extinguish(); - this.setDataProperty(new ShortEntityData(Player.DATA_AIR, 400), false); - this.deadTicks = 0; - this.noDamageTicks = 60; - - this.removeAllEffects(); - this.setHealth(this.getMaxHealth()); - this.foodData.setLevel(20, 20); - - this.sendData(this); - - this.setMovementSpeed(DEFAULT_SPEED); - - this.adventureSettings.update(); - this.inventory.sendContents(this); - this.inventory.sendArmorContents(this); - this.offhandInventory.sendContents(this); - - this.spawnToAll(); - this.scheduleUpdate(); - } - - @Override - public void setHealth(float health) { - if (health < 1) { - health = 0; - } - - super.setHealth(health); - - // HACK: solve the client-side absorption bug - if (this.spawned) { - UpdateAttributesPacket pk = new UpdateAttributesPacket(); - pk.entries = new Attribute[]{Attribute.getAttribute(Attribute.MAX_HEALTH).setMaxValue(this.getAbsorption() % 2 != 0 ? this.getMaxHealth() + 1 : this.getMaxHealth()).setValue(health > 0 ? (health < getMaxHealth() ? health : getMaxHealth()) : 0)}; - pk.entityId = this.id; - this.dataPacket(pk); - } - } - - @Override - public void setMaxHealth(int maxHealth) { - super.setMaxHealth(maxHealth); - - if (this.spawned) { - UpdateAttributesPacket pk = new UpdateAttributesPacket(); - pk.entries = new Attribute[]{Attribute.getAttribute(Attribute.MAX_HEALTH).setMaxValue(this.getAbsorption() % 2 != 0 ? this.getMaxHealth() + 1 : this.getMaxHealth()).setValue(health > 0 ? (health < getMaxHealth() ? health : getMaxHealth()) : 0)}; - pk.entityId = this.id; - this.dataPacket(pk); - } - } - - public int getExperience() { - return this.exp; - } - - public int getExperienceLevel() { - return this.expLevel; - } - - public void addExperience(int add) { - if (add == 0) return; - int added = this.exp + add; - int level = this.expLevel; - int most = calculateRequireExperience(level); - while (added >= most) { - added -= most; - level++; - most = calculateRequireExperience(level); - } - this.setExperience(added, level); - } - - public static int calculateRequireExperience(int level) { - if (level >= 30) { - return 112 + (level - 30) * 9; - } else if (level >= 15) { - return 37 + (level - 15) * 5; - } else { - return 7 + (level << 1); - } - } - - public void setExperience(int exp) { - setExperience(exp, this.expLevel); - } - - public void setExperience(int exp, int level) { - this.exp = exp; - this.expLevel = level; - - this.sendExperienceLevel(level); - this.sendExperience(exp); - } - - public void sendExperience() { - sendExperience(this.exp); - } - - public void sendExperience(int exp) { - if (this.spawned) { - this.setAttribute(Attribute.getAttribute(Attribute.EXPERIENCE).setValue(Math.max(0f, Math.min(1f, ((float) exp) / calculateRequireExperience(this.expLevel))))); - } - } - - public void sendExperienceLevel() { - sendExperienceLevel(this.expLevel); - } - - public void sendExperienceLevel(int level) { - if (this.spawned) { - this.setAttribute(Attribute.getAttribute(Attribute.EXPERIENCE_LEVEL).setValue(level)); - } - } - - public void setAttribute(Attribute attribute) { - UpdateAttributesPacket pk = new UpdateAttributesPacket(); - pk.entries = new Attribute[]{attribute}; - pk.entityId = this.id; - this.dataPacket(pk); - } - - @Override - public void setMovementSpeed(float speed) { - setMovementSpeed(speed, true); - } - - public void setMovementSpeed(float speed, boolean send) { - super.setMovementSpeed(speed); - if (this.spawned && send) { - this.setAttribute(Attribute.getAttribute(Attribute.MOVEMENT_SPEED).setValue(speed).setDefaultValue(speed)); - } - } - - public void sendMovementSpeed(float speed) { - Attribute attribute = Attribute.getAttribute(Attribute.MOVEMENT_SPEED).setValue(speed); - this.setAttribute(attribute); - } - - public Entity getKiller() { - return killer; - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (!this.isAlive()) { - return false; - } - - if (this.isSpectator() || (this.isCreative() && source.getCause() != DamageCause.SUICIDE)) { - source.setCancelled(); - return false; - } else if (source.getCause() == DamageCause.FALL && this.getAllowFlight()) { - source.setCancelled(); - return false; - } else if (source.getCause() == DamageCause.FALL) { - Position pos = this.getPosition().floor().add(0.5, -1, 0.5); - int block = this.getLevel().getBlockIdAt(chunk, (int) pos.x, (int) pos.y, (int) pos.z); - if (block == Block.SLIME_BLOCK || block == Block.COBWEB) { - if (!this.isSneaking()) { - source.setCancelled(); - this.resetFallDistance(); - return false; - } - } - } - - if (super.attack(source)) { - if (this.getLastDamageCause() == source && this.spawned) { - if (source instanceof EntityDamageByEntityEvent) { - Entity damager = ((EntityDamageByEntityEvent) source).getDamager(); - if (damager instanceof Player) { - ((Player) damager).foodData.updateFoodExpLevel(0.3); - } - } - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.id; - pk.event = EntityEventPacket.HURT_ANIMATION; - this.dataPacket(pk); - } - return true; - } else { - return false; - } - } - - /** - * Drops an item on the ground in front of the player. Returns if the item drop was successful. - * - * @param item to drop - * @return bool if the item was dropped or if the item was null - */ - public boolean dropItem(Item item) { - if (!this.spawned || !this.isAlive()) { - return false; - } - - if (item.isNull()) { - this.server.getLogger().debug(this.username + " attempted to drop a null item (" + item + ')'); - return true; - } - - Vector3 motion = this.getDirectionVector().multiply(0.4); - - this.level.dropItem(this.add(0, 1.3, 0), item, motion, 40); - - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ACTION, false); - return true; - } - - /** - * Drops an item on the ground in front of the player. Returns the dropped item. - * - * @param item to drop - * @return EntityItem if the item was dropped or null if the item was null - */ - public EntityItem dropAndGetItem(Item item) { - if (!this.spawned || !this.isAlive()) { - return null; - } - - if (item.isNull()) { - this.server.getLogger().debug(this.getName() + " attempted to drop a null item (" + item + ')'); - return null; - } - - Vector3 motion = this.getDirectionVector().multiply(0.4); - - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ACTION, false); - - return this.level.dropAndGetItem(this.add(0, 1.3, 0), item, motion, 40); - } - - public void sendPosition(Vector3 pos) { - this.sendPosition(pos, this.yaw); - } - - public void sendPosition(Vector3 pos, double yaw) { - this.sendPosition(pos, yaw, this.pitch); - } - - public void sendPosition(Vector3 pos, double yaw, double pitch) { - this.sendPosition(pos, yaw, pitch, MovePlayerPacket.MODE_NORMAL); - } - - public void sendPosition(Vector3 pos, double yaw, double pitch, int mode) { - this.sendPosition(pos, yaw, pitch, mode, null); - } - - public void sendPosition(Vector3 pos, double yaw, double pitch, int mode, Player[] targets) { - MovePlayerPacket pk = new MovePlayerPacket(); - pk.eid = this.getId(); - pk.x = (float) pos.x; - pk.y = (float) (pos.y + this.getEyeHeight()); - pk.z = (float) pos.z; - pk.headYaw = (float) yaw; - pk.pitch = (float) pitch; - pk.yaw = (float) yaw; - pk.mode = mode; - pk.onGround = this.onGround; - - if (this.riding != null) { - pk.ridingEid = this.riding.getId(); - pk.mode = MovePlayerPacket.MODE_PITCH; - } - - this.ySize = 0; - - if (targets != null) { - Server.broadcastPacket(targets, pk); - } else { - this.dataPacket(pk); - } - } - - public void sendPosition(double x, double y, double z, double yaw, double pitch, int mode, Collection targets) { - MovePlayerPacket pk = new MovePlayerPacket(); - pk.eid = this.getId(); - pk.x = (float) x; - pk.y = (float) y; - pk.z = (float) z; - pk.headYaw = (float) yaw; - pk.pitch = (float) pitch; - pk.yaw = (float) yaw; - pk.mode = mode; - pk.onGround = this.onGround; - - if (this.riding != null) { - pk.ridingEid = this.riding.getId(); - pk.mode = MovePlayerPacket.MODE_PITCH; - } - - this.ySize = 0; - - Server.broadcastPacket(targets, pk); - } - - @Override - protected void checkChunks() { - if (this.chunk == null || (this.chunk.getX() != ((int) this.x >> 4) || this.chunk.getZ() != ((int) this.z >> 4))) { - if (this.chunk != null) { - this.chunk.removeEntity(this); - } - this.chunk = this.level.getChunk((int) this.x >> 4, (int) this.z >> 4, true); - - if (!this.justCreated) { - Map newChunk = this.level.getChunkPlayers((int) this.x >> 4, (int) this.z >> 4); - newChunk.remove(this.loaderId); - - for (Player player : new ArrayList<>(this.hasSpawned.values())) { - if (!newChunk.containsKey(player.loaderId)) { - this.despawnFrom(player); - } else { - newChunk.remove(player.loaderId); - } - } - - for (Player player : newChunk.values()) { - this.spawnTo(player); - } - } - - if (this.chunk == null) { - return; - } - - this.chunk.addEntity(this); - } - } - - protected boolean checkTeleportPosition() { - return checkTeleportPosition(false); - } - - protected boolean checkTeleportPosition(boolean enderPearl) { - if (this.teleportPosition != null) { - int chunkX = (int) this.teleportPosition.x >> 4; - int chunkZ = (int) this.teleportPosition.z >> 4; - - for (int X = -1; X <= 1; ++X) { - for (int Z = -1; Z <= 1; ++Z) { - long index = Level.chunkHash(chunkX + X, chunkZ + Z); - if (!this.usedChunks.containsKey(index) || !this.usedChunks.get(index)) { - return false; - } - } - } - - this.spawnToAll(); - if (!enderPearl) { - this.forceMovement = this.teleportPosition; - } - this.teleportPosition = null; - return true; - } - - return false; - } - - protected void sendPlayStatus(int status) { - sendPlayStatus(status, false); - } - - protected void sendPlayStatus(int status, boolean immediate) { - PlayStatusPacket pk = new PlayStatusPacket(); - pk.status = status; - - if (immediate) { - this.directDataPacket(pk); - } else { - this.dataPacket(pk); - } - } - - @Override - public boolean teleport(Location location, TeleportCause cause) { - if (!this.isOnline()) { - return false; - } - - Location from = this.getLocation(); - Location to = location; - - if (cause != null) { - PlayerTeleportEvent event = new PlayerTeleportEvent(this, from, to, cause); - this.server.getPluginManager().callEvent(event); - if (event.isCancelled()) return false; - to = event.getTo(); - } - - // HACK: solve the client-side teleporting bug (inside into the block) - if (super.teleport(to.getY() == to.getFloorY() ? to.add(0, 0.00001, 0) : to, null)) { // null to prevent fire of duplicate EntityTeleportEvent - this.removeAllWindows(); - this.formOpen = false; - - this.teleportPosition = this; - if (cause != PlayerTeleportEvent.TeleportCause.ENDER_PEARL) { - this.forceMovement = this.teleportPosition; - } - - if (this.dimensionChangeInProgress) { - this.dimensionChangeInProgress = false; - } else { - this.sendPosition(this, this.yaw, this.pitch, MovePlayerPacket.MODE_TELEPORT); - this.checkTeleportPosition(cause == PlayerTeleportEvent.TeleportCause.ENDER_PEARL); - this.dummyBossBars.values().forEach(DummyBossBar::reshow); - } - - this.resetFallDistance(); - this.nextChunkOrderRun = 0; - this.newPosition = null; - - this.stopFishing(false); - return true; - } - - return false; - } - - protected void forceSendEmptyChunks() { - int chunkPositionX = this.getFloorX() >> 4; - int chunkPositionZ = this.getFloorZ() >> 4; - for (int x = -chunkRadius; x < chunkRadius; x++) { - for (int z = -chunkRadius; z < chunkRadius; z++) { - LevelChunkPacket chunk = new LevelChunkPacket(); - chunk.chunkX = chunkPositionX + x; - chunk.chunkZ = chunkPositionZ + z; - chunk.data = new byte[0]; - this.dataPacket(chunk); - } - } - } - - public void teleportImmediate(Location location) { - this.teleportImmediate(location, TeleportCause.PLUGIN); - } - - public void teleportImmediate(Location location, TeleportCause cause) { - Location from = this.getLocation(); - if (super.teleport(location.add(0, 0.00001, 0), cause)) { - - for (Inventory window : new ArrayList<>(this.windows.keySet())) { - if (window == this.inventory) { - continue; - } - this.removeWindow(window); - } - - if (from.getLevel().getId() != location.getLevel().getId()) { // Different level, update compass position - SetSpawnPositionPacket pk = new SetSpawnPositionPacket(); - pk.spawnType = SetSpawnPositionPacket.TYPE_WORLD_SPAWN; - Position spawn = location.getLevel().getSpawnLocation(); - pk.x = spawn.getFloorX(); - pk.y = spawn.getFloorY(); - pk.z = spawn.getFloorZ(); - pk.dimension = location.getLevel().getDimension(); - this.dataPacket(pk); - } - - this.forceMovement = this; - this.sendPosition(this, this.yaw, this.pitch, MovePlayerPacket.MODE_RESET); - - this.resetFallDistance(); - this.orderChunks(); - this.nextChunkOrderRun = 0; - this.newPosition = null; - - // Weather - this.getLevel().sendWeather(this); - // Update time - this.getLevel().sendTime(this); - } - } - - /** - * Shows a new FormWindow to the player - * You can find out FormWindow result by listening to PlayerFormRespondedEvent - * - * @param window to show - * @return form id to use in {@link PlayerFormRespondedEvent} - */ - public int showFormWindow(FormWindow window) { - return showFormWindow(window, this.formWindowCount++); - } - - /** - * Shows a new FormWindow to the player - * You can find out FormWindow result by listening to PlayerFormRespondedEvent - * - * @param window to show - * @param id form id - * @return form id to use in {@link PlayerFormRespondedEvent} - */ - public int showFormWindow(FormWindow window, int id) { - if (formOpen) return 0; - ModalFormRequestPacket packet = new ModalFormRequestPacket(); - packet.formId = id; - packet.data = window.getJSONData(); - this.formWindows.put(packet.formId, window); - this.dataPacket(packet); - this.formOpen = true; - return id; - } - - /** - * Shows a new setting page in game settings - * You can find out settings result by listening to PlayerFormRespondedEvent - * - * @param window to show on settings page - * @return form id to use in {@link PlayerFormRespondedEvent} - */ - public int addServerSettings(FormWindow window) { - int id = this.formWindowCount++; - - this.serverSettings.put(id, window); - return id; - } - - /** - * Creates and sends a BossBar to the player - * - * @param text The BossBar message - * @param length The BossBar percentage - * @return bossBarId The BossBar ID, you should store it if you want to remove or update the BossBar later - */ - public long createBossBar(String text, int length) { - return this.createBossBar(new DummyBossBar.Builder(this).text(text).length(length).build()); - } - - /** - * Creates and sends a BossBar to the player - * - * @param dummyBossBar DummyBossBar Object (Instantiate it by the Class Builder) - * @return bossBarId The BossBar ID, you should store it if you want to remove or update the BossBar later - * @see DummyBossBar.Builder - */ - public long createBossBar(DummyBossBar dummyBossBar) { - this.dummyBossBars.put(dummyBossBar.getBossBarId(), dummyBossBar); - dummyBossBar.create(); - return dummyBossBar.getBossBarId(); - } - - /** - * Get a DummyBossBar object - * - * @param bossBarId The BossBar ID - * @return DummyBossBar object - * @see DummyBossBar#setText(String) Set BossBar text - * @see DummyBossBar#setLength(float) Set BossBar length - * @see DummyBossBar#setColor(BlockColor) Set BossBar color - */ - public DummyBossBar getDummyBossBar(long bossBarId) { - return this.dummyBossBars.getOrDefault(bossBarId, null); - } - - /** - * Get all DummyBossBar objects - * - * @return DummyBossBars Map - */ - public Map getDummyBossBars() { - return dummyBossBars; - } - - /** - * Updates a BossBar - * - * @param text The new BossBar message - * @param length The new BossBar length - * @param bossBarId The BossBar ID - */ - public void updateBossBar(String text, int length, long bossBarId) { - if (this.dummyBossBars.containsKey(bossBarId)) { - DummyBossBar bossBar = this.dummyBossBars.get(bossBarId); - bossBar.setText(text); - bossBar.setLength(length); - } - } - - /** - * Removes a BossBar - * - * @param bossBarId The BossBar ID - */ - public void removeBossBar(long bossBarId) { - if (this.dummyBossBars.containsKey(bossBarId)) { - this.dummyBossBars.get(bossBarId).destroy(); - this.dummyBossBars.remove(bossBarId); - } - } - - public int getWindowId(Inventory inventory) { - if (this.windows.containsKey(inventory)) { - return this.windows.get(inventory); - } - - return -1; - } - - public Inventory getWindowById(int id) { - return this.windowIndex.get(id); - } - - public int addWindow(Inventory inventory) { - return this.addWindow(inventory, null); - } - - public int addWindow(Inventory inventory, Integer forceId) { - return addWindow(inventory, forceId, false); - } - - public int addWindow(Inventory inventory, Integer forceId, boolean isPermanent) { - return addWindow(inventory, forceId, isPermanent, false); - } - - public int addWindow(Inventory inventory, Integer forceId, boolean isPermanent, boolean alwaysOpen) { - if (this.windows.containsKey(inventory)) { - return this.windows.get(inventory); - } - int cnt; - if (forceId == null) { - this.windowCnt = cnt = Math.max(4, ++this.windowCnt % 99); - } else { - cnt = forceId; - } - this.windows.forcePut(inventory, cnt); - - if (isPermanent) { - this.permanentWindows.add(cnt); - } - - if (this.spawned && inventory.open(this)) { - return cnt; - } else if (!alwaysOpen) { - this.removeWindow(inventory); - - return -1; - } else { - inventory.getViewers().add(this); - } - - return cnt; - } - - public Optional getTopWindow() { - for (Entry entry : this.windows.entrySet()) { - if (!this.permanentWindows.contains(entry.getValue())) { - return Optional.of(entry.getKey()); - } - } - return Optional.empty(); - } - - public void removeWindow(Inventory inventory) { - this.removeWindow(inventory, false); - } - - protected void removeWindow(Inventory inventory, boolean isResponse) { - inventory.close(this); - if (isResponse && !this.permanentWindows.contains(this.getWindowId(inventory))) { - this.windows.remove(inventory); - } - } - - public void sendAllInventories() { - for (Inventory inv : this.windows.keySet()) { - inv.sendContents(this); - - if (inv instanceof PlayerInventory) { - ((PlayerInventory) inv).sendArmorContents(this); - } - } - } - - protected void addDefaultWindows() { - this.addWindow(this.getInventory(), ContainerIds.INVENTORY, true, true); - - this.playerUIInventory = new PlayerUIInventory(this); - this.addWindow(this.playerUIInventory, ContainerIds.UI, true); - this.addWindow(this.offhandInventory, ContainerIds.OFFHAND, true, true); - - this.craftingGrid = this.playerUIInventory.getCraftingGrid(); - this.addWindow(this.craftingGrid, ContainerIds.NONE); - } - - public PlayerUIInventory getUIInventory() { - return playerUIInventory; - } - - public PlayerCursorInventory getCursorInventory() { - return this.playerUIInventory.getCursorInventory(); - } - - public CraftingGrid getCraftingGrid() { - return this.craftingGrid; - } - - public void setCraftingGrid(CraftingGrid grid) { - this.craftingGrid = grid; - this.addWindow(grid, ContainerIds.NONE); - } - - public void resetCraftingGridType() { - if (this.craftingGrid != null) { - Item[] drops = this.inventory.addItem(this.craftingGrid.getContents().values().toArray(new Item[0])); - - if (drops.length > 0) { - for (Item drop : drops) { - this.dropItem(drop); - } - } - - drops = this.inventory.addItem(this.getCursorInventory().getItem(0)); - if (drops.length > 0) { - for (Item drop : drops) { - this.dropItem(drop); - } - } - - this.playerUIInventory.clearAll(); - - if (this.craftingGrid instanceof BigCraftingGrid) { - this.craftingGrid = this.playerUIInventory.getCraftingGrid(); - this.addWindow(this.craftingGrid, ContainerIds.NONE); - } - - this.craftingType = CRAFTING_SMALL; - } - } - - /** - * Remove all windows - */ - public void removeAllWindows() { - removeAllWindows(false); - } - - /** - * Remove all windows - * @param permanent remove permanent windows - */ - public void removeAllWindows(boolean permanent) { - for (Entry entry : new ArrayList<>(this.windowIndex.entrySet())) { - if (!permanent && this.permanentWindows.contains(entry.getKey())) { - continue; - } - - this.removeWindow(entry.getValue()); - } - } - - public int getClosingWindowId() { - return this.closingWindowId; - } - - @Override - public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { - this.server.getPlayerMetadata().setMetadata(this, metadataKey, newMetadataValue); - } - - @Override - public List getMetadata(String metadataKey) { - return this.server.getPlayerMetadata().getMetadata(this, metadataKey); - } - - @Override - public boolean hasMetadata(String metadataKey) { - return this.server.getPlayerMetadata().hasMetadata(this, metadataKey); - } - - @Override - public void removeMetadata(String metadataKey, Plugin owningPlugin) { - this.server.getPlayerMetadata().removeMetadata(this, metadataKey, owningPlugin); - } - - @Override - public void onChunkChanged(FullChunk chunk) { - this.usedChunks.remove(Level.chunkHash(chunk.getX(), chunk.getZ())); - } - - @Override - public void onChunkLoaded(FullChunk chunk) { - } - - @Override - public void onChunkPopulated(FullChunk chunk) { - } - - @Override - public void onChunkUnloaded(FullChunk chunk) { - } - - @Override - public void onBlockChanged(Vector3 block) { - } - - @Override - public int getLoaderId() { - return this.loaderId; - } - - @Override - public boolean isLoaderActive() { - return this.connected; - } - - /** - * Get chunk cache from data - * @param protocol protocol version - * @param chunkX chunk x - * @param chunkZ chunk z - * @param subChunkCount sub chunk count - * @param payload data - * @return BatchPacket - */ - public static BatchPacket getChunkCacheFromData(int protocol, int chunkX, int chunkZ, int subChunkCount, byte[] payload) { - LevelChunkPacket pk = new LevelChunkPacket(); - pk.chunkX = chunkX; - pk.chunkZ = chunkZ; - pk.subChunkCount = subChunkCount; - pk.data = payload; - pk.protocol = protocol; - pk.tryEncode(); - - BatchPacket batch = new BatchPacket(); - byte[][] batchPayload = new byte[2][]; - byte[] buf = pk.getBuffer(); - batchPayload[0] = Binary.writeUnsignedVarInt(buf.length); - batchPayload[1] = buf; - try { - if (protocol >= 407) { - batch.payload = Zlib.deflateRaw(Binary.appendBytes(batchPayload), Server.getInstance().networkCompressionLevel); - } else { - batch.payload = Zlib.deflate(Binary.appendBytes(batchPayload), Server.getInstance().networkCompressionLevel); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - return batch; - } - - /** - * Check whether food is enabled or not - * @return food enabled - */ - public boolean isFoodEnabled() { - return !(this.isCreative() || this.isSpectator()) && this.foodEnabled; - } - - /** - * Enable or disable food - * @param foodEnabled food enabled - */ - public void setFoodEnabled(boolean foodEnabled) { - this.foodEnabled = foodEnabled; - } - - /** - * Get player's food data - * @return food data - */ - public PlayerFood getFoodData() { - return this.foodData; - } - - /** - * Send dimension change - * @param dimension dimension id - */ - public void setDimension(int dimension) { - this.dimensionChangeInProgress = true; - - ChangeDimensionPacket changeDimensionPacket = new ChangeDimensionPacket(); - changeDimensionPacket.dimension = dimension; - changeDimensionPacket.x = (float) this.x; - changeDimensionPacket.y = (float) this.y; - changeDimensionPacket.z = (float) this.z; - changeDimensionPacket.respawn = !this.isAlive(); - this.dataPacket(changeDimensionPacket); - - if (this.protocol >= ProtocolInfo.v1_8_0) { - NetworkChunkPublisherUpdatePacket pk0 = new NetworkChunkPublisherUpdatePacket(); - pk0.position = new BlockVector3((int) this.x, (int) this.y, (int) this.z); - pk0.radius = this.chunkRadius << 4; - this.dataPacket(pk0); - } - } - - @Override - protected void preSwitchLevel() { - // Make sure batch packets from the previous world gets through first - this.processBatchPackets(); - - // Remove old chunks - this.unloadChunks(true); - } - - @Override - protected void afterSwitchLevel() { - // Send spawn to update compass position - SetSpawnPositionPacket spawnPosition = new SetSpawnPositionPacket(); - spawnPosition.spawnType = SetSpawnPositionPacket.TYPE_WORLD_SPAWN; - Position spawn = level.getSpawnLocation(); - spawnPosition.x = spawn.getFloorX(); - spawnPosition.y = spawn.getFloorY(); - spawnPosition.z = spawn.getFloorZ(); - spawnPosition.dimension = level.getDimension(); - this.dataPacket(spawnPosition); - - // Update time and weather - level.sendTime(this); - level.sendWeather(this); - - // Update game rules - GameRulesChangedPacket packet = new GameRulesChangedPacket(); - packet.gameRulesMap = level.getGameRules().getGameRules(); - this.dataPacket(packet); - - // Reset sleeping timer - this.timeSinceRest = 0; - } - - /** - * Enable or disable movement check - * @param checkMovement movement check enabled - */ - public void setCheckMovement(boolean checkMovement) { - this.checkMovement = checkMovement; - } - - /** - * @return player movement checks enabled - */ - public boolean isCheckingMovement() { - return this.checkMovement; - } - - /** - * Set locale - * @param locale locale - */ - public synchronized void setLocale(Locale locale) { - this.locale.set(locale); - } - - /** - * Get locale - * @return locale - */ - public synchronized Locale getLocale() { - return this.locale.get(); - } - - @Override - public void setSprinting(boolean value) { - if (isSprinting() != value) { - super.setSprinting(value); - this.setMovementSpeed(value ? getMovementSpeed() * 1.3f : getMovementSpeed() / 1.3f, false); - } - } - - /** - * Transfer player to other server - * @param address target server address - */ - public void transfer(InetSocketAddress address) { - transfer(address.getAddress().getHostAddress(), address.getPort()); - } - - /** - * Transfer player to other server - * @param hostName target server address - * @param port target server port - */ - public void transfer(String hostName, int port) { - TransferPacket pk = new TransferPacket(); - pk.address = hostName; - pk.port = port; - this.dataPacket(pk); - } - - /** - * Get player's LoginChainData - * @return login chain data - */ - public LoginChainData getLoginChainData() { - return this.loginChainData; - } - - /** - * Try to pick up an entity - * @param entity target - * @param near near - * @return success - */ - public boolean pickupEntity(Entity entity, boolean near) { - if (!this.spawned || !this.isAlive() || !this.isOnline() || this.isSpectator() || entity.isClosed()) { - return false; - } - - if (near) { - if (entity instanceof EntityArrow && ((EntityArrow) entity).hadCollision) { - ItemArrow item = new ItemArrow(); - if (!this.isCreative() && !this.inventory.canAddItem(item)) { - return false; - } - - InventoryPickupArrowEvent ev = new InventoryPickupArrowEvent(this.inventory, (EntityArrow) entity); - - int pickupMode = ((EntityArrow) entity).getPickupMode(); - if (pickupMode == EntityArrow.PICKUP_NONE || (pickupMode == EntityArrow.PICKUP_CREATIVE && !this.isCreative())) { - ev.setCancelled(); - } - - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - - TakeItemEntityPacket pk = new TakeItemEntityPacket(); - pk.entityId = this.getId(); - pk.target = entity.getId(); - Server.broadcastPacket(entity.getViewers().values(), pk); - this.dataPacket(pk); - - if (!this.isCreative()) { - this.inventory.addItem(item.clone()); - } - entity.close(); - return true; - } else if (entity instanceof EntityThrownTrident && ((EntityThrownTrident) entity).hadCollision) { - Item item = ((EntityThrownTrident) entity).getItem(); - if (!this.isCreative() && !this.inventory.canAddItem(item)) { - return false; - } - - InventoryPickupTridentEvent ev = new InventoryPickupTridentEvent(this.inventory, (EntityThrownTrident) entity); - - int pickupMode = ((EntityThrownTrident) entity).getPickupMode(); - if (pickupMode == EntityThrownTrident.PICKUP_NONE || (pickupMode == EntityThrownTrident.PICKUP_CREATIVE && !this.isCreative())) { - ev.setCancelled(); - } - - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - - TakeItemEntityPacket pk = new TakeItemEntityPacket(); - pk.entityId = this.getId(); - pk.target = entity.getId(); - Server.broadcastPacket(entity.getViewers().values(), pk); - this.dataPacket(pk); - - if (!this.isCreative()) { - this.inventory.addItem(item.clone()); - } - entity.close(); - return true; - } else if (entity instanceof EntityItem) { - if (((EntityItem) entity).getPickupDelay() <= 0) { - Item item = ((EntityItem) entity).getItem(); - - if (item != null) { - if (!this.isCreative() && !this.inventory.canAddItem(item)) { - return false; - } - - InventoryPickupItemEvent ev; - this.server.getPluginManager().callEvent(ev = new InventoryPickupItemEvent(this.inventory, (EntityItem) entity)); - if (ev.isCancelled()) { - return false; - } - - switch (item.getId()) { - case Item.WOOD: - case Item.WOOD2: - this.awardAchievement("mineWood"); - break; - case Item.DIAMOND: - this.awardAchievement("diamond"); - break; - } - - TakeItemEntityPacket pk = new TakeItemEntityPacket(); - pk.entityId = this.getId(); - pk.target = entity.getId(); - Server.broadcastPacket(entity.getViewers().values(), pk); - this.dataPacket(pk); - - this.inventory.addItem(item.clone()); - entity.close(); - return true; - } - } - } - } - - if (pickedXPOrb < server.getTick() && entity instanceof EntityXPOrb && this.boundingBox.isVectorInside(entity)) { - EntityXPOrb xpOrb = (EntityXPOrb) entity; - if (xpOrb.getPickupDelay() <= 0) { - int exp = xpOrb.getExp(); - entity.close(); - this.getLevel().addSound(new ExperienceOrbSound(this)); - pickedXPOrb = server.getTick(); - - ArrayList itemsWithMending = new ArrayList<>(); - for (int i = 0; i < 4; i++) { - if (inventory.getArmorItem(i).hasEnchantment(Enchantment.ID_MENDING)) { - itemsWithMending.add(inventory.getSize() + i); - } - } - if (inventory.getItemInHandFast().hasEnchantment(Enchantment.ID_MENDING)) { - itemsWithMending.add(inventory.getHeldItemIndex()); - } - if (!itemsWithMending.isEmpty()) { - int itemToRepair = itemsWithMending.get(Utils.random.nextInt(itemsWithMending.size())); - Item toRepair = inventory.getItem(itemToRepair); - if (toRepair instanceof ItemTool || toRepair instanceof ItemArmor) { - if (toRepair.getDamage() > 0) { - int dmg = toRepair.getDamage() - 2; - if (dmg < 0) { - dmg = 0; - } - toRepair.setDamage(dmg); - inventory.setItem(itemToRepair, toRepair); - return true; - } - } - } - - this.addExperience(exp); - return true; - } - } - - return false; - } - - @Override - public int hashCode() { - if ((this.hash == 0) || (this.hash == 485)) { - this.hash = (485 + (getUniqueId() != null ? getUniqueId().hashCode() : 0)); - } - - return this.hash; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Player)) { - return false; - } - Player other = (Player) obj; - return Objects.equals(this.getUniqueId(), other.getUniqueId()) && this.getId() == other.getId(); - } - - public boolean isBreakingBlock() { - return this.breakingBlock != null; - } - - /** - * Show a window of a XBOX account's profile - * @param xuid XUID - */ - public void showXboxProfile(String xuid) { - ShowProfilePacket pk = new ShowProfilePacket(); - pk.xuid = xuid; - this.dataPacket(pk); - } - - /** - * Start fishing - * @param fishingRod fishing rod item - */ - public void startFishing(Item fishingRod) { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", x)) - .add(new DoubleTag("", y + this.getEyeHeight())) - .add(new DoubleTag("", z))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", -Math.sin(yaw / 180 + Math.PI) * Math.cos(pitch / 180 * Math.PI))) - .add(new DoubleTag("", -Math.sin(pitch / 180 * Math.PI))) - .add(new DoubleTag("", Math.cos(yaw / 180 * Math.PI) * Math.cos(pitch / 180 * Math.PI)))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", (float) yaw)) - .add(new FloatTag("", (float) pitch))); - double f = 1.1; - EntityFishingHook fishingHook = new EntityFishingHook(chunk, nbt, this); - fishingHook.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - ProjectileLaunchEvent ev = new ProjectileLaunchEvent(fishingHook); - this.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - fishingHook.close(); - } else { - this.fishing = fishingHook; - fishingHook.rod = fishingRod; - fishingHook.checkLure(); - fishingHook.spawnToAll(); - } - } - - /** - * Stop fishing - * @param click clicked or forced - */ - public void stopFishing(boolean click) { - if (this.fishing != null && click) { - fishing.reelLine(); - } else if (this.fishing != null) { - this.fishing.close(); - } - - this.fishing = null; - } - - /** - * Batch packet and send it immediately - * @param pk data packet - */ - protected void quickBatch(DataPacket pk) { - pk.protocol = this.protocol; - if (server.callDataPkSendEv) { - DataPacketSendEvent event = new DataPacketSendEvent(this, pk); - this.server.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - } - pk.tryEncode(); - BinaryStream stream = new BinaryStream(); - byte[] buf = pk.getBuffer(); - stream.putUnsignedVarInt(buf.length); - stream.put(buf); - try { - byte[] bytes = Binary.appendBytes(stream.getBuffer()); - BatchPacket batched = new BatchPacket(); - if (this.protocol >= ProtocolInfo.v1_16_0) { - batched.payload = Zlib.deflateRaw(bytes, Server.getInstance().networkCompressionLevel); - } else { - batched.payload = Zlib.deflate(bytes, Server.getInstance().networkCompressionLevel); - } - this.directDataPacket(batched); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public boolean doesTriggerPressurePlate() { - return this.gamemode != SPECTATOR; - } - - /*@Override - protected void onBlock(Entity entity, boolean animate, float damage) { - super.onBlock(entity, animate, damage); - if (animate) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SHIELD_SHAKING, true); - this.getServer().getScheduler().scheduleTask(null, ()-> { - if (this.isOnline()) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SHIELD_SHAKING, false); - } - }); - } - }*/ - - /** - * Get ticks since sleeping in the current world last time - * - * @return ticks since sleeping - */ - public int getTimeSinceRest() { - return timeSinceRest; - } - - /** - * Set ticks since sleeping in the current world last time - * - * @param ticks ticks since sleeping - */ - public void setTimeSinceRest(int ticks) { - this.timeSinceRest = ticks; - } - - @Override - public String toString() { - return "Player(name='" + getName() + "', location=" + super.toString() + ')'; - } - - @Override - public void setAirTicks(int ticks) { - if (this.airTicks != ticks) { - if (this.spawned || ticks > this.airTicks) { // Don't consume air before spawned - this.airTicks = ticks; - this.setDataPropertyAndSendOnlyToSelf(new ShortEntityData(DATA_AIR, ticks)); - } - } - } -} diff --git a/src/main/java/cn/nukkit/PlayerFood.java b/src/main/java/cn/nukkit/PlayerFood.java deleted file mode 100644 index 5ef550023..000000000 --- a/src/main/java/cn/nukkit/PlayerFood.java +++ /dev/null @@ -1,191 +0,0 @@ -package cn.nukkit; - -import cn.nukkit.entity.Attribute; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.EntityRegainHealthEvent; -import cn.nukkit.event.player.PlayerFoodLevelChangeEvent; -import cn.nukkit.item.food.Food; -import cn.nukkit.potion.Effect; - -/** - * This class handles player's food. - * - * Created by funcraft on 2015/11/11. - */ -public class PlayerFood { - - private int foodLevel; - private float foodSaturationLevel; - private short foodTickTimer = 0; - private double foodExpLevel = 0; - - private final Player player; - - public PlayerFood(Player player, int foodLevel, float foodSaturationLevel) { - this.player = player; - this.foodLevel = foodLevel; - this.foodSaturationLevel = foodSaturationLevel; - } - - public Player getPlayer() { - return this.player; - } - - public int getLevel() { - return this.foodLevel; - } - - public int getMaxLevel() { - return 20; - } - - public void setLevel(int foodLevel) { - this.setLevel(foodLevel, -1); - } - - public void setLevel(int foodLevel, float saturationLevel) { - if (foodLevel > 20) { - foodLevel = 20; - } - - if (foodLevel < 0) { - foodLevel = 0; - } - - if (foodLevel <= 6 && !(this.foodLevel <= 6)) { - if (this.player.isSprinting()) { - this.player.setSprinting(false); - } - } - - PlayerFoodLevelChangeEvent ev = new PlayerFoodLevelChangeEvent(this.player, foodLevel, saturationLevel); - this.player.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - this.sendFoodLevel(this.foodLevel); - return; - } - int foodLevel0 = ev.getFoodLevel(); - float fsl = ev.getFoodSaturationLevel(); - this.foodLevel = foodLevel; - if (fsl != -1) { - if (fsl > foodLevel) fsl = foodLevel; - this.foodSaturationLevel = fsl; - } - this.foodLevel = foodLevel0; - this.sendFoodLevel(); - } - - public float getFoodSaturationLevel() { - return this.foodSaturationLevel; - } - - public void setFoodSaturationLevel(float fsl) { - if (fsl > this.foodLevel) fsl = this.foodLevel; - if (fsl < 0) fsl = 0; - PlayerFoodLevelChangeEvent ev = new PlayerFoodLevelChangeEvent(this.player, this.foodLevel, fsl); - this.player.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return; - } - fsl = ev.getFoodSaturationLevel(); - this.foodSaturationLevel = fsl; - } - - public void useHunger() { - this.useHunger(1); - } - - public void useHunger(int amount) { - float sfl = this.foodSaturationLevel; - int foodLevel = this.foodLevel; - if (sfl > 0) { - float newSfl = sfl - amount; - if (newSfl < 0) newSfl = 0; - this.setFoodSaturationLevel(newSfl); - } else { - this.setLevel(foodLevel - amount); - } - } - - public void addFoodLevel(Food food) { - this.addFoodLevel(food.getRestoreFood(), food.getRestoreSaturation()); - } - - public void addFoodLevel(int foodLevel, float fsl) { - this.setLevel(this.foodLevel + foodLevel, this.foodSaturationLevel + fsl); - } - - public void sendFoodLevel() { - this.sendFoodLevel(this.foodLevel); - } - - public void reset() { - this.foodLevel = 20; - this.foodSaturationLevel = 20; - this.foodExpLevel = 0; - this.foodTickTimer = 0; - this.sendFoodLevel(); - } - - public void sendFoodLevel(int foodLevel) { - if (this.player.spawned) { - this.player.setAttribute(Attribute.getAttribute(Attribute.MAX_HUNGER).setValue(foodLevel).setDefaultValue(getMaxLevel())); - } - } - - public void update(int tickDiff) { - if (!this.player.isFoodEnabled()) return; - if (this.player.isAlive()) { - int diff = Server.getInstance().getDifficulty(); - if (this.foodLevel > 17 || diff == 0) { - this.foodTickTimer += tickDiff; - if (this.foodTickTimer >= 80) { - if (this.player.getHealth() < this.player.getMaxHealth()) { - EntityRegainHealthEvent ev = new EntityRegainHealthEvent(this.player, 1, EntityRegainHealthEvent.CAUSE_EATING); - this.player.heal(ev); - this.updateFoodExpLevel(6); - } - this.foodTickTimer = 0; - } - } else if (this.foodLevel == 0) { - this.foodTickTimer += tickDiff; - if (this.foodTickTimer >= 80) { - EntityDamageEvent ev = new EntityDamageEvent(this.player, DamageCause.HUNGER, 1); - float now = this.player.getHealth(); - if (diff == 1) { - if (now > 10) this.player.attack(ev); - } else if (diff == 2) { - if (now > 1) this.player.attack(ev); - } else { - this.player.attack(ev); - } - - this.foodTickTimer = 0; - } - } - if (this.player.hasEffect(Effect.HUNGER)) { - this.updateFoodExpLevel(0.025); - } - } - } - - public void updateFoodExpLevel(double use) { - if (!this.player.isFoodEnabled()) return; - if (Server.getInstance().getDifficulty() == 0) return; - if (this.player.hasEffect(Effect.SATURATION)) return; - this.foodExpLevel += use; - if (this.foodExpLevel > 4) { - this.useHunger(1); - this.foodExpLevel = 0; - } - } - - public void setFoodLevel(int foodLevel) { - setLevel(foodLevel); - } - - public void setFoodLevel(int foodLevel, float saturationLevel) { - setLevel(foodLevel, saturationLevel); - } -} diff --git a/src/main/java/cn/nukkit/Server.java b/src/main/java/cn/nukkit/Server.java deleted file mode 100644 index ddb5daef7..000000000 --- a/src/main/java/cn/nukkit/Server.java +++ /dev/null @@ -1,3084 +0,0 @@ -package cn.nukkit; - -import cn.nukkit.block.Block; -import cn.nukkit.blockentity.*; -import cn.nukkit.command.*; -import cn.nukkit.console.NukkitConsole; -import cn.nukkit.dispenser.DispenseBehaviorRegister; -import cn.nukkit.entity.Attribute; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityHuman; -import cn.nukkit.entity.data.Skin; -import cn.nukkit.entity.item.*; -import cn.nukkit.entity.mob.*; -import cn.nukkit.entity.passive.*; -import cn.nukkit.entity.projectile.*; -import cn.nukkit.entity.weather.EntityLightning; -import cn.nukkit.event.HandlerList; -import cn.nukkit.event.level.LevelInitEvent; -import cn.nukkit.event.level.LevelLoadEvent; -import cn.nukkit.event.server.BatchPacketsEvent; -import cn.nukkit.event.server.PlayerDataSerializeEvent; -import cn.nukkit.event.server.QueryRegenerateEvent; -import cn.nukkit.event.server.ServerStopEvent; -import cn.nukkit.inventory.CraftingManager; -import cn.nukkit.inventory.Recipe; -import cn.nukkit.item.Item; -import cn.nukkit.item.RuntimeItems; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.lang.BaseLang; -import cn.nukkit.lang.TextContainer; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.EnumLevel; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.level.biome.EnumBiome; -import cn.nukkit.level.format.LevelProvider; -import cn.nukkit.level.format.LevelProviderManager; -import cn.nukkit.level.format.anvil.Anvil; -import cn.nukkit.level.generator.*; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.metadata.EntityMetadataStore; -import cn.nukkit.metadata.LevelMetadataStore; -import cn.nukkit.metadata.PlayerMetadataStore; -import cn.nukkit.metrics.NukkitMetrics; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.BatchingHelper; -import cn.nukkit.network.Network; -import cn.nukkit.network.RakNetInterface; -import cn.nukkit.network.SourceInterface; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.PlayerListPacket; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.network.query.QueryHandler; -import cn.nukkit.network.rcon.RCON; -import cn.nukkit.permission.BanEntry; -import cn.nukkit.permission.BanList; -import cn.nukkit.permission.DefaultPermissions; -import cn.nukkit.permission.Permissible; -import cn.nukkit.plugin.JavaPluginLoader; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.plugin.PluginLoadOrder; -import cn.nukkit.plugin.PluginManager; -import cn.nukkit.plugin.service.NKServiceManager; -import cn.nukkit.plugin.service.ServiceManager; -import cn.nukkit.potion.Effect; -import cn.nukkit.potion.Potion; -import cn.nukkit.resourcepacks.ResourcePackManager; -import cn.nukkit.scheduler.ServerScheduler; -import cn.nukkit.scheduler.Task; -import cn.nukkit.utils.*; -import cn.nukkit.utils.bugreport.ExceptionHandler; -import co.aikar.timings.Timings; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; -import com.google.gson.JsonParser; -import io.netty.buffer.ByteBuf; -import io.sentry.SentryClient; -import io.sentry.SentryClientFactory; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import it.unimi.dsi.fastutil.objects.ObjectList; -import lombok.extern.log4j.Log4j2; -import org.iq80.leveldb.CompressionType; -import org.iq80.leveldb.DB; -import org.iq80.leveldb.Options; -import org.iq80.leveldb.impl.Iq80DBFactory; - -import java.io.*; -import java.net.*; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.regex.Pattern; - -/** - * The main server class - * - * @author MagicDroidX - * @author Box - */ -@Log4j2 -public class Server { - - public static final String BROADCAST_CHANNEL_ADMINISTRATIVE = "nukkit.broadcast.admin"; - public static final String BROADCAST_CHANNEL_USERS = "nukkit.broadcast.user"; - - private static Server instance; - - private final BanList banByName; - private final BanList banByIP; - private final Config operators; - private final Config whitelist; - - private final AtomicBoolean isRunning = new AtomicBoolean(true); - private boolean hasStopped; - - private final PluginManager pluginManager; - private final ServerScheduler scheduler; - - private int tickCounter; - private long nextTick; - private final float[] tickAverage = {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}; - private final float[] useAverage = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - private float maxTick = 20; - private float maxUse = 0; - - private final NukkitConsole console; - private final ConsoleThread consoleThread; - - private final SimpleCommandMap commandMap; - private final CraftingManager craftingManager; - private final ResourcePackManager resourcePackManager; - private final ConsoleCommandSender consoleSender; - - private int maxPlayers; - private boolean autoSave = true; - private RCON rcon; - - private final EntityMetadataStore entityMetadata; - private final PlayerMetadataStore playerMetadata; - private final LevelMetadataStore levelMetadata; - private final Network network; - - private boolean autoTickRate; - private int autoTickRateLimit; - private boolean alwaysTickPlayers; - private int baseTickRate; - private int difficulty; - private int defaultGameMode = Integer.MAX_VALUE; - int c_s_spawnThreshold; - - private int autoSaveTicker; - private int autoSaveTicks; - - private final BaseLang baseLang; - private boolean forceLanguage; - - private final String filePath; - private final String dataPath; - private final String pluginPath; - - private String ip; - private int port; - private QueryHandler queryHandler; - private QueryRegenerateEvent queryRegenerateEvent; - private final UUID serverID; - private final Config properties; - - private final Map players = new HashMap<>(); - final Map playerList = new HashMap<>(); - - /** - * Worlds where automatic mob spawning is disabled. - */ - public static final List disabledSpawnWorlds = new ArrayList<>(); - /** - * Worlds where automatic saving is disabled. - */ - public static final List nonAutoSaveWorlds = new ArrayList<>(); - /** - * Worlds that have their own nether worlds. - */ - public static final List multiNetherWorlds = new ArrayList<>(); - /** - * Worlds where random block ticking is disabled. - */ - public static final List noTickingWorlds = new ArrayList<>(); - - private static final Pattern uuidPattern = Pattern.compile("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}.dat$"); - - private final Map levels = new HashMap() { - public Level put(Integer key, Level value) { - Level result = super.put(key, value); - levelArray = levels.values().toArray(new Level[0]); - return result; - } - public boolean remove(Object key, Object value) { - boolean result = super.remove(key, value); - levelArray = levels.values().toArray(new Level[0]); - return result; - } - public Level remove(Object key) { - Level result = super.remove(key); - levelArray = levels.values().toArray(new Level[0]); - return result; - } - }; - - public SentryClient sentry; - private Level[] levelArray = new Level[0]; - private final ServiceManager serviceManager = new NKServiceManager(); - private Level defaultLevel; - private final Thread currentThread; - private Watchdog watchdog; - private final DB nameLookup; - private PlayerDataSerializer playerDataSerializer; - private SpawnerTask spawnerTask; - private final BatchingHelper batchingHelper; - - /** - * The server's MOTD. Remember to call network.setName() when updated. - */ - public String motd; - /** - * Disconnection message shown to players who are not allowed to join due to whitelist. - */ - public String whitelistReason; - /** - * SuomiCraft PE optimizations enabled. - */ - public boolean suomicraftMode; - /** - * Mob AI enabled. - */ - public boolean mobAiEnabled; - /** - * Default player data saving enabled. - */ - public boolean shouldSavePlayerData; - /** - * Anti fly checks enabled. - */ - public boolean flyChecks; - /** - * Hardcore mode enabled. - */ - public boolean isHardcore; - /** - * Force resource packs. - */ - public boolean forceResources; - /** - * Force player gamemode to default on every join. - */ - public boolean forceGamemode; - /** - * The nether dimension and portals enabled. - */ - public boolean netherEnabled; - /** - * Level garbage collection enabled. - */ - public boolean doLevelGC; - /** - * Call BatchPacketsEvent on batch packet sending. - */ - public boolean callBatchPkEv; - /** - * Whitelist enabled. - */ - public boolean whitelistEnabled; - /** - * Xbox authentication enabled. - */ - public boolean xboxAuth; - /** - * Spawn eggs enabled. - */ - public boolean spawnEggsEnabled; - /** - * XP bottles can be used on creative. - */ - public boolean xpBottlesOnCreative; - /** - * Dimension changes enabled. - */ - public boolean dimensionsEnabled; - /** - * Call DataPacketSendEvent on data packet sending. - */ - public boolean callDataPkSendEv; - /** - * Bed spawnpoints enabled. - */ - public boolean bedSpawnpoints; - /** - * Server side achievements enabled. - */ - public boolean achievementsEnabled; - /** - * Temporary ban player on failed Xbox authentication. - */ - public boolean banXBAuthFailed; - /** - * The end dimension and portals enabled. - */ - public boolean endEnabled; - /** - * Pvp enabled. Can be changed per world using game rules. - */ - public boolean pvpEnabled; - /** - * Announce server side announcements to all players. - */ - public boolean announceAchievements; - /** - * Enable movement checks for OPs. - */ - public boolean checkOpMovement; - /** - * Disable player interaction spam limiter. - */ - public boolean doNotLimitInteractions; - /** - * After how many ticks mobs are despawned. - */ - public int mobDespawnTicks; - /** - * How many chunks are sent to player per tick. - */ - public int chunksPerTick; - /** - * How many chunks needs to be sent before the player can spawn. - */ - public int spawnThreshold; - /** - * Zlib compression level for packets - */ - public int networkCompressionLevel; - /** - * Maximum view distance. - */ - public int viewDistance; - /** - * Server's default gamemode. - */ - public int gamemode; - /** - * Minimum amount of time between player skin changes. - */ - public int skinChangeCooldown; - /** - * Spawn protection radius. - */ - public int spawnRadius; - /** - * Minimum allowed protocol version. - */ - public int minimumProtocol; - /** - * Do not limit the maximum size of player skins. - */ - public boolean doNotLimitSkinGeometry; - /** - * Mob spawning from blocks and items enabled. - */ - public boolean mobsFromBlocks; - /** - * Explosions breaking blocks enabled. - */ - public boolean explosionBreakBlocks; - /** - * Boss bars enabled for wither and ender dragon. - */ - public boolean vanillaBossBar; - /** - * Stop command allowed in game. - */ - public boolean stopInGame; - /** - * OP command allowed in game. - */ - public boolean opInGame; - /** - * Sky light updates enabled. - */ - public boolean lightUpdates; - /** - * Showing plugins in query enabled. - */ - public boolean queryPlugins; - /** - * Mob despawning enabled. - */ - public boolean despawnMobs; - /** - * Strong RakNet level IP bans enabled. - */ - public boolean strongIPBans; - /** - * Auto spawning of animals enabled. - */ - public boolean spawnAnimals; - /** - * Auto spawning of monsters enabled. - */ - public boolean spawnMonsters; - /** - * Anvils enabled. - */ - public boolean anvilsEnabled; - /** - * Player data is saved by player uuid instead of by player name. - */ - public boolean savePlayerDataByUuid; - /** - * More vanilla like portal logics enabled. - */ - public boolean vanillaPortals; - /** - * Persona skins allowed. - */ - public boolean personaSkins; - /** - * Chunk caching enabled. - */ - public boolean cacheChunks; - /** - * Call EntityMotionEvent on entity movement. - */ - public boolean callEntityMotionEv; - /** - * Check for new releases automatically. - */ - public boolean updateChecks; - - Server(final String filePath, String dataPath, String pluginPath, boolean loadPlugins, boolean debug) { - Preconditions.checkState(instance == null, "Already initialized!"); - currentThread = Thread.currentThread(); // Saves the current thread instance as a reference, used in Server#isPrimaryThread() - instance = this; - - this.filePath = filePath; - if (!new File(dataPath + "worlds/").exists()) { - new File(dataPath + "worlds/").mkdirs(); - } - - if (!new File(pluginPath).exists()) { - new File(pluginPath).mkdirs(); - } - - this.dataPath = new File(dataPath).getAbsolutePath() + '/'; - this.pluginPath = new File(pluginPath).getAbsolutePath() + '/'; - - this.playerDataSerializer = new DefaultPlayerDataSerializer(this); - - this.console = new NukkitConsole(); - this.consoleThread = new ConsoleThread(); - this.consoleThread.start(); - this.console.setExecutingCommands(true); - - log.info("Loading server properties..."); - this.properties = new Config(this.dataPath + "server.properties", Config.PROPERTIES, new ServerProperties()); - - if (!this.getPropertyBoolean("ansi-title", true)) Nukkit.TITLE = false; - - int debugLvl = NukkitMath.clamp(this.getPropertyInt("debug-level", 1), 1, 3); - if (debug && debugLvl < 2) { - debugLvl = 2; - } - Nukkit.DEBUG = debugLvl; - - this.loadSettings(); - - if (this.getPropertyBoolean("automatic-bug-report", true)) { - ExceptionHandler.registerExceptionHandler(); - this.sentry = SentryClientFactory.sentryClient("https://0e094ce5464f4663a0b521d61f4bfe54@o381665.ingest.sentry.io/5209314"); - } - - if (!new File(dataPath + "players/").exists() && this.shouldSavePlayerData) { - new File(dataPath + "players/").mkdirs(); - } - - this.baseLang = new BaseLang(this.getPropertyString("language", BaseLang.FALLBACK_LANGUAGE)); - - Object poolSize = this.getProperty("async-workers", "auto"); - if (!(poolSize instanceof Integer)) { - try { - poolSize = Integer.valueOf((String) poolSize); - } catch (Exception e) { - poolSize = Math.max(Runtime.getRuntime().availableProcessors() + 1, 4); - } - } - - ServerScheduler.WORKERS = (int) poolSize; - - Zlib.setProvider(this.getPropertyInt("zlib-provider", 2)); - - this.scheduler = new ServerScheduler(); - - this.batchingHelper = new BatchingHelper(); - - if (this.getPropertyBoolean("enable-rcon", false)) { - try { - this.rcon = new RCON(this, this.getPropertyString("rcon.password", ""), (!this.getIp().isEmpty()) ? this.getIp() : "0.0.0.0", this.getPropertyInt("rcon.port", this.getPort())); - } catch (IllegalArgumentException e) { - log.error(baseLang.translateString(e.getMessage(), e.getCause().getMessage())); - } - } - - this.entityMetadata = new EntityMetadataStore(); - this.playerMetadata = new PlayerMetadataStore(); - this.levelMetadata = new LevelMetadataStore(); - - this.operators = new Config(this.dataPath + "ops.txt", Config.ENUM); - this.whitelist = new Config(this.dataPath + "white-list.txt", Config.ENUM); - this.banByName = new BanList(this.dataPath + "banned-players.json"); - this.banByName.load(); - this.banByIP = new BanList(this.dataPath + "banned-ips.json"); - this.banByIP.load(); - - this.maxPlayers = this.getPropertyInt("max-players", 50); - this.setAutoSave(this.getPropertyBoolean("auto-save", true)); - - if (this.isHardcore && this.difficulty < 3) { - this.setDifficulty(3); - } else { - this.setDifficulty(getDifficultyFromString(this.getPropertyString("difficulty", "2"))); - } - - org.apache.logging.log4j.Level currentLevel = Nukkit.getLogLevel(); - for (org.apache.logging.log4j.Level level : org.apache.logging.log4j.Level.values()) { - if (level.intLevel() == (Nukkit.DEBUG + 3) * 100 && level.intLevel() > currentLevel.intLevel()) { - Nukkit.setLogLevel(level); - break; - } - } - - log.info("\u00A7b-- \u00A7cNukkit \u00A7aPetteriM1 Edition \u00A7b--"); - - this.consoleSender = new ConsoleCommandSender(); - this.commandMap = new SimpleCommandMap(this); - - registerEntities(); - registerBlockEntities(); - - Block.init(); - Enchantment.init(); - GlobalBlockPalette.init(); - RuntimeItems.init(); - Item.init(); - EnumBiome.values(); - Effect.init(); - Potion.init(); - Attribute.init(); - DispenseBehaviorRegister.init(); - GlobalBlockPalette.getOrCreateRuntimeId(ProtocolInfo.CURRENT_PROTOCOL, 0, 0); - - // Convert legacy data before plugins get the chance to mess with it - try { - nameLookup = Iq80DBFactory.factory.open(new File(dataPath, "players"), new Options() - .createIfMissing(true) - .compressionType(CompressionType.ZLIB_RAW)); - } catch (IOException e) { - throw new RuntimeException(e); - } - - if (this.savePlayerDataByUuid) { - convertLegacyPlayerData(); - } - - this.serverID = UUID.randomUUID(); - - this.craftingManager = new CraftingManager(); - this.resourcePackManager = new ResourcePackManager(new File(Nukkit.DATA_PATH, "resource_packs")); - - this.pluginManager = new PluginManager(this, this.commandMap); - this.pluginManager.subscribeToPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE, this.consoleSender); - - this.pluginManager.registerInterface(JavaPluginLoader.class); - - this.queryRegenerateEvent = new QueryRegenerateEvent(this, 5); - - log.info(this.baseLang.translateString("nukkit.server.networkStart", new String[]{this.getIp().isEmpty() ? "*" : this.getIp(), String.valueOf(this.getPort())})); - this.network = new Network(this); - this.network.setName(this.getMotd()); - this.network.setSubName(this.getSubMotd()); - this.network.registerInterface(new RakNetInterface(this)); - - if (loadPlugins) { - this.pluginManager.loadPlugins(this.pluginPath); - this.enablePlugins(PluginLoadOrder.STARTUP); - } - - LevelProviderManager.addProvider(this, Anvil.class); - - Generator.addGenerator(Flat.class, "flat", Generator.TYPE_FLAT); - Generator.addGenerator(Normal.class, "normal", Generator.TYPE_INFINITE); - Generator.addGenerator(Normal.class, "default", Generator.TYPE_INFINITE); - Generator.addGenerator(Nether.class, "nether", Generator.TYPE_NETHER); - Generator.addGenerator(End.class, "the_end", Generator.TYPE_THE_END); - Generator.addGenerator(cn.nukkit.level.generator.Void.class, "void", Generator.TYPE_VOID); - - if (this.defaultLevel == null) { - String defaultName = this.getPropertyString("level-name", "world"); - if (defaultName == null || defaultName.trim().isEmpty()) { - this.getLogger().warning("level-name cannot be null, using default"); - defaultName = "world"; - this.setPropertyString("level-name", defaultName); - } - - if (!this.loadLevel(defaultName)) { - long seed; - String seedString = String.valueOf(this.getProperty("level-seed", System.currentTimeMillis())); - try { - seed = Long.parseLong(seedString); - } catch (NumberFormatException e) { - seed = seedString.hashCode(); - } - this.generateLevel(defaultName, seed == 0 ? System.currentTimeMillis() : seed); - } - - this.setDefaultLevel(this.getLevelByName(defaultName)); - } - - this.properties.save(true); - - if (this.defaultLevel == null) { - this.getLogger().emergency(this.baseLang.translateString("nukkit.level.defaultError")); - this.forceShutdown(); - return; - } - - for (Map.Entry entry : this.getLevels().entrySet()) { - Level level = entry.getValue(); - this.getLogger().debug("Preparing spawn region for level " + level.getName()); - Position spawn = level.getSpawnLocation(); - level.populateChunk(spawn.getChunkX(), spawn.getChunkZ(), true); - } - - // Load levels - if (this.getPropertyBoolean("load-all-worlds", true)) { - try { - for (File fs : new File(new File("").getCanonicalPath() + "/worlds/").listFiles()) { - if ((fs.isDirectory() && !this.isLevelLoaded(fs.getName()))) { - this.loadLevel(fs.getName()); - } - } - EnumLevel.initLevels(); - } catch (Exception e) { - this.getLogger().error("Unable to load levels", e); - } - } - - if (loadPlugins) { - this.enablePlugins(PluginLoadOrder.POSTWORLD); - } - - if (this.getPropertyBoolean("thread-watchdog", true)) { - this.watchdog = new Watchdog(this, this.getPropertyInt("thread-watchdog-tick", 60000)); - this.watchdog.start(); - } - - String worlds1 = Server.getInstance().getPropertyString("worlds-entity-spawning-disabled"); - if (!worlds1.trim().isEmpty()) { - StringTokenizer tokenizer = new StringTokenizer(worlds1, ", "); - while (tokenizer.hasMoreTokens()) { - disabledSpawnWorlds.add(tokenizer.nextToken()); - } - } - - String worlds2 = Server.getInstance().getPropertyString("worlds-level-auto-save-disabled"); - if (!worlds2.trim().isEmpty()) { - StringTokenizer tokenizer = new StringTokenizer(worlds2, ", "); - while (tokenizer.hasMoreTokens()) { - nonAutoSaveWorlds.add(tokenizer.nextToken()); - } - } - - if (this.getPropertyBoolean("entity-auto-spawn-task", true)) { - this.spawnerTask = new SpawnerTask(); - int spawnerTicks = Math.max(this.getPropertyInt("ticks-per-entity-spawns", 200), 2) >> 1; // Run the spawner on 2x speed but spawn only either monsters or animals - this.scheduler.scheduleDelayedRepeatingTask(this.spawnerTask, spawnerTicks, spawnerTicks); - } - - if (this.getPropertyBoolean("bstats-metrics", true)) { - new NukkitMetrics(this); - } - - // Check for updates - CompletableFuture.runAsync(() -> { - try { - URLConnection request = new URL(Nukkit.BRANCH).openConnection(); - request.connect(); - InputStreamReader content = new InputStreamReader((InputStream) request.getContent()); - String latest = "git-" + new JsonParser().parse(content).getAsJsonObject().get("sha").getAsString().substring(0, 7); - content.close(); - - boolean isMaster = Nukkit.getBranch().equals("master"); - if (!this.getNukkitVersion().equals(latest) && !this.getNukkitVersion().equals("git-null") && isMaster) { - this.getLogger().info("\u00A7c[Update] \u00A7eThere is a new build of Nukkit PetteriM1 Edition available! Current: " + this.getNukkitVersion() + " Latest: " + latest); - this.getLogger().info("\u00A7c[Update] \u00A7eYou can download the latest build from https://github.com/PetteriM1/NukkitPetteriM1Edition/releases"); - } else if (!isMaster) { - this.getLogger().warning("\u00A7eYou are running a dev build! Do not use in production! Branch: " + Nukkit.getBranch()); - } - - this.getLogger().debug("Update check done"); - } catch (Exception ignore) { - this.getLogger().debug("Update check failed"); - } - }); - - this.start(); - } - - public int broadcastMessage(String message) { - return this.broadcast(message, BROADCAST_CHANNEL_USERS); - } - - public int broadcastMessage(TextContainer message) { - return this.broadcast(message, BROADCAST_CHANNEL_USERS); - } - - public int broadcastMessage(String message, CommandSender[] recipients) { - for (CommandSender recipient : recipients) { - recipient.sendMessage(message); - } - - return recipients.length; - } - - public int broadcastMessage(String message, Collection recipients) { - for (CommandSender recipient : recipients) { - recipient.sendMessage(message); - } - - return recipients.size(); - } - - public int broadcastMessage(TextContainer message, Collection recipients) { - for (CommandSender recipient : recipients) { - recipient.sendMessage(message); - } - - return recipients.size(); - } - - public int broadcast(String message, String permissions) { - Set recipients = new HashSet<>(); - - for (String permission : permissions.split(";")) { - for (Permissible permissible : this.pluginManager.getPermissionSubscriptions(permission)) { - if (permissible instanceof CommandSender && permissible.hasPermission(permission)) { - recipients.add((CommandSender) permissible); - } - } - } - - for (CommandSender recipient : recipients) { - recipient.sendMessage(message); - } - - return recipients.size(); - } - - public int broadcast(TextContainer message, String permissions) { - Set recipients = new HashSet<>(); - - for (String permission : permissions.split(";")) { - for (Permissible permissible : this.pluginManager.getPermissionSubscriptions(permission)) { - if (permissible instanceof CommandSender && permissible.hasPermission(permission)) { - recipients.add((CommandSender) permissible); - } - } - } - - for (CommandSender recipient : recipients) { - recipient.sendMessage(message); - } - - return recipients.size(); - } - - - public static void broadcastPacket(Collection players, DataPacket packet) { - if (packet.pid() == ProtocolInfo.BATCH_PACKET) { - for (Player player : players) { - player.directDataPacket(packet); - } - return; - } - for (Player player : players) { - if (player.protocol >= ProtocolInfo.v1_16_100) { - player.batchDataPacket(packet); - } else { - player.dataPacket(packet); - } - } - } - - public static void broadcastPacket(Player[] players, DataPacket packet) { - if (packet.pid() == ProtocolInfo.BATCH_PACKET) { - for (Player player : players) { - player.directDataPacket(packet); - } - return; - } - for (Player player : players) { - if (player.protocol >= ProtocolInfo.v1_16_100) { - player.batchDataPacket(packet); - } else { - player.dataPacket(packet); - } - } - } - - public static void broadcastPackets(Player[] players, DataPacket[] packets) { - instance.batchPackets(players, packets, false); - } - - public void batchPackets(Player[] players, DataPacket[] packets) { - this.batchPackets(players, packets, false); - } - - public void batchPackets(Player[] players, DataPacket[] packets, boolean forceSync) { - if (players == null || packets == null || players.length == 0 || packets.length == 0) { - return; - } - - if (callBatchPkEv) { - BatchPacketsEvent ev = new BatchPacketsEvent(players, packets, forceSync); - pluginManager.callEvent(ev); - if (ev.isCancelled()) { - return; - } - } - - this.batchingHelper.batchPackets(players, packets); - } - - public void enablePlugins(PluginLoadOrder type) { - for (Plugin plugin : new ArrayList<>(this.pluginManager.getPlugins().values())) { - if (!plugin.isEnabled() && type == plugin.getDescription().getOrder()) { - this.enablePlugin(plugin); - } - } - - if (type == PluginLoadOrder.POSTWORLD) { - DefaultPermissions.registerCorePermissions(); - } - } - - public void enablePlugin(Plugin plugin) { - this.pluginManager.enablePlugin(plugin); - } - - public void disablePlugins() { - this.pluginManager.disablePlugins(); - } - - public boolean dispatchCommand(CommandSender sender, String commandLine) throws ServerException { - // First we need to check if this command is on the main thread or not, if not, warn the user - if (!this.isPrimaryThread() && !this.suomiCraftPEMode()) { - getLogger().warning("Command Dispatched Async: " + commandLine); - } - if (sender == null) { - throw new ServerException("CommandSender is not valid"); - } - - if (this.commandMap.dispatch(sender, commandLine)) { - return true; - } - - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.unknown", commandLine)); - - return false; - } - - public ConsoleCommandSender getConsoleSender() { - return consoleSender; - } - - public void reload() { - log.info("Reloading..."); - - log.info("Saving levels..."); - - for (Level level : this.levelArray) { - level.save(); - } - - this.pluginManager.clearPlugins(); - this.commandMap.clearCommands(); - - log.info("Reloading properties..."); - this.properties.reload(); - this.maxPlayers = this.getPropertyInt("max-players", 50); - - if (this.isHardcore && this.difficulty < 3) { - this.setDifficulty(3); - } - - this.loadSettings(); - - this.banByIP.load(); - this.banByName.load(); - this.reloadWhitelist(); - this.operators.reload(); - - for (BanEntry entry : this.banByIP.getEntires().values()) { - try { - this.network.blockAddress(InetAddress.getByName(entry.getName()), -1); - } catch (UnknownHostException ignore) {} - } - - this.pluginManager.registerInterface(JavaPluginLoader.class); - this.pluginManager.loadPlugins(this.pluginPath); - this.enablePlugins(PluginLoadOrder.STARTUP); - this.enablePlugins(PluginLoadOrder.POSTWORLD); - Timings.reset(); - } - - public void shutdown() { - isRunning.compareAndSet(true, false); - } - - public void forceShutdown() { - this.forceShutdown(this.getPropertyString("shutdown-message", "§cServer closed").replace("§n", "\n")); - } - - public void forceShutdown(String reason) { - if (this.hasStopped) { - return; - } - - try { - isRunning.compareAndSet(true, false); - - this.hasStopped = true; - - ServerStopEvent serverStopEvent = new ServerStopEvent(); - pluginManager.callEvent(serverStopEvent); - - if (this.rcon != null) { - this.getLogger().debug("Closing RCON..."); - this.rcon.close(); - } - - this.getLogger().debug("Disconnecting all players..."); - for (Player player : new ArrayList<>(this.players.values())) { - player.close(player.getLeaveMessage(), reason); - } - - this.getLogger().debug("Disabling all plugins..."); - this.disablePlugins(); - - this.getLogger().debug("Unloading all levels..."); - for (Level level : this.levelArray) { - this.unloadLevel(level, true); - this.nextTick = System.currentTimeMillis(); // Fix Watchdog killing the server while saving worlds - } - - this.getLogger().debug("Removing event handlers..."); - HandlerList.unregisterAll(); - - this.getLogger().debug("Stopping all tasks..."); - this.scheduler.cancelAllTasks(); - this.scheduler.mainThreadHeartbeat(Integer.MAX_VALUE); - - this.getLogger().debug("Closing console..."); - this.consoleThread.interrupt(); - - this.getLogger().debug("Closing BatchingHelper..."); - this.batchingHelper.shutdown(); - - this.getLogger().debug("Stopping network interfaces..."); - for (SourceInterface interfaz : this.network.getInterfaces()) { - interfaz.shutdown(); - this.network.unregisterInterface(interfaz); - } - - if (nameLookup != null) { - this.getLogger().debug("Closing name lookup DB..."); - nameLookup.close(); - } - - this.getLogger().debug("Disabling timings..."); - Timings.stopServer(); - } catch (Exception e) { - log.fatal("Exception happened while shutting down, exiting the process", e); - System.exit(1); - } - } - - public void start() { - if (this.getPropertyBoolean("enable-query", true)) { - this.queryHandler = new QueryHandler(); - } - - for (BanEntry entry : this.banByIP.getEntires().values()) { - try { - this.network.blockAddress(InetAddress.getByName(entry.getName()), -1); - } catch (UnknownHostException ignore) {} - } - - this.tickCounter = 0; - - log.info(this.baseLang.translateString("nukkit.server.startFinished", String.valueOf((double) (System.currentTimeMillis() - Nukkit.START_TIME) / 1000))); - - this.tickProcessor(); - this.forceShutdown(); - } - - public void handlePacket(InetSocketAddress address, ByteBuf payload) { - try { - if (!payload.isReadable(3)) { - return; - } - byte[] prefix = new byte[2]; - payload.readBytes(prefix); - - if (!Arrays.equals(prefix, new byte[]{(byte) 0xfe, (byte) 0xfd})) { - return; - } - if (this.queryHandler != null) { - this.queryHandler.handle(address, payload); - } - } catch (Exception e) { - log.error("Error whilst handling packet", e); - - this.network.blockAddress(address.getAddress(), -1); - } - } - - private int lastLevelGC; - - public void tickProcessor() { - this.nextTick = System.currentTimeMillis(); - try { - while (this.isRunning.get()) { - try { - this.tick(); - - long next = this.nextTick; - long current = System.currentTimeMillis(); - - if (next - 0.1 > current) { - long allocated = next - current - 1; - - if (doLevelGC) { // Instead of wasting time, do something potentially useful - int offset = 0; - for (int i = 0; i < levelArray.length; i++) { - offset = (i + lastLevelGC) % levelArray.length; - levelArray[offset].doGarbageCollection(allocated - 1); - allocated = next - System.currentTimeMillis(); - if (allocated <= 0) break; - } - lastLevelGC = offset + 1; - } - - if (allocated > 0 || !doLevelGC) { - try { - Thread.sleep(allocated, 900000); - } catch (Exception e) { - this.getLogger().logException(e); - } - } - } - } catch (RuntimeException e) { - this.getLogger().logException(e); - } - } - } catch (Throwable e) { - log.fatal("Exception happened while ticking server", e); - log.fatal(Utils.getAllThreadDumps()); - } - } - - public void onPlayerCompleteLoginSequence(Player player) { - this.playerList.put(player.getUniqueId(), player); - this.updatePlayerListData(player.getUniqueId(), player.getId(), player.getDisplayName(), player.getSkin(), player.getLoginChainData().getXUID()); - } - - public void addPlayer(InetSocketAddress socketAddress, Player player) { - this.players.put(socketAddress, player); - } - - public void addOnlinePlayer(Player player) { - this.playerList.put(player.getUniqueId(), player); - this.updatePlayerListData(player.getUniqueId(), player.getId(), player.getDisplayName(), player.getSkin(), player.getLoginChainData().getXUID()); - } - - public void removeOnlinePlayer(Player player) { - if (this.playerList.containsKey(player.getUniqueId())) { - this.playerList.remove(player.getUniqueId()); - - PlayerListPacket pk = new PlayerListPacket(); - pk.type = PlayerListPacket.TYPE_REMOVE; - pk.entries = new PlayerListPacket.Entry[]{new PlayerListPacket.Entry(player.getUniqueId())}; - - Server.broadcastPacket(this.playerList.values(), pk); - } - } - - public void updatePlayerListData(UUID uuid, long entityId, String name, Skin skin) { - this.updatePlayerListData(uuid, entityId, name, skin, "", this.playerList.values()); - } - - public void updatePlayerListData(UUID uuid, long entityId, String name, Skin skin, String xboxUserId) { - this.updatePlayerListData(uuid, entityId, name, skin, xboxUserId, this.playerList.values()); - } - - public void updatePlayerListData(UUID uuid, long entityId, String name, Skin skin, Player[] players) { - this.updatePlayerListData(uuid, entityId, name, skin, "", players); - } - - public void updatePlayerListData(UUID uuid, long entityId, String name, Skin skin, String xboxUserId, Player[] players) { - PlayerListPacket pk = new PlayerListPacket(); - pk.type = PlayerListPacket.TYPE_ADD; - pk.entries = new PlayerListPacket.Entry[]{new PlayerListPacket.Entry(uuid, entityId, name, skin, xboxUserId)}; - this.batchPackets(players, new DataPacket[]{pk}); // This is sent "directly" so it always gets thru before possible TYPE_REMOVE packet for NPCs etc. - } - - public void updatePlayerListData(UUID uuid, long entityId, String name, Skin skin, String xboxUserId, Collection players) { - this.updatePlayerListData(uuid, entityId, name, skin, xboxUserId, players.toArray(new Player[0])); - } - - public void removePlayerListData(UUID uuid) { - this.removePlayerListData(uuid, this.playerList.values()); - } - - public void removePlayerListData(UUID uuid, Player[] players) { - PlayerListPacket pk = new PlayerListPacket(); - pk.type = PlayerListPacket.TYPE_REMOVE; - pk.entries = new PlayerListPacket.Entry[]{new PlayerListPacket.Entry(uuid)}; - for (Player player : players) { - player.dataPacket(pk); - } - } - - public void removePlayerListData(UUID uuid, Collection players) { - this.removePlayerListData(uuid, players.toArray(new Player[0])); - } - - public void removePlayerListData(UUID uuid, Player player) { - PlayerListPacket pk = new PlayerListPacket(); - pk.type = PlayerListPacket.TYPE_REMOVE; - pk.entries = new PlayerListPacket.Entry[]{new PlayerListPacket.Entry(uuid)}; - player.dataPacket(pk); - } - - public void sendFullPlayerListData(Player player) { - PlayerListPacket pk = new PlayerListPacket(); - pk.type = PlayerListPacket.TYPE_ADD; - pk.entries = this.playerList.values().stream() - .map(p -> new PlayerListPacket.Entry( - p.getUniqueId(), - p.getId(), - p.getDisplayName(), - p.getSkin(), - p.getLoginChainData().getXUID())) - .toArray(PlayerListPacket.Entry[]::new); - player.dataPacket(pk); - } - - public void sendRecipeList(Player player) { - if (player.protocol >= ProtocolInfo.v1_17_40) { - player.dataPacket(CraftingManager.packet471); - } if (player.protocol >= ProtocolInfo.v1_17_30) { - player.dataPacket(CraftingManager.packet465); - } else if (player.protocol >= ProtocolInfo.v1_17_10) { - player.dataPacket(CraftingManager.packet448); - } else if (player.protocol >= ProtocolInfo.v1_17_0) { - player.dataPacket(CraftingManager.packet440); - } else if (player.protocol >= ProtocolInfo.v1_16_220) { - player.dataPacket(CraftingManager.packet431); - } else if (player.protocol >= ProtocolInfo.v1_16_100) { - player.dataPacket(CraftingManager.packet419); - } else if (player.protocol >= ProtocolInfo.v1_16_0) { - player.dataPacket(CraftingManager.packet407); - } else if (player.protocol > ProtocolInfo.v1_12_0) { - player.dataPacket(CraftingManager.packet388); - } else if (player.protocol == ProtocolInfo.v1_12_0) { - player.dataPacket(CraftingManager.packet361); - } else if (player.protocol == ProtocolInfo.v1_11_0) { - player.dataPacket(CraftingManager.packet354); - } else if (player.protocol == ProtocolInfo.v1_10_0) { - player.dataPacket(CraftingManager.packet340); - } else if (player.protocol == ProtocolInfo.v1_9_0 || player.protocol == ProtocolInfo.v1_8_0 || player.protocol == ProtocolInfo.v1_7_0) { // these should work just fine - player.dataPacket(CraftingManager.packet313); - } - // Don't send recipes if they wouldn't work anyways - } - - private void checkTickUpdates(int currentTick) { - if (this.alwaysTickPlayers) { - for (Player p : new ArrayList<>(this.players.values())) { - p.onUpdate(currentTick); - } - } - - // Do level ticks - for (Level level : this.levelArray) { - if (level.getTickRate() > this.baseTickRate && --level.tickRateCounter > 0) { - continue; - } - - try { - long levelTime = System.currentTimeMillis(); - level.doTick(currentTick); - int tickMs = (int) (System.currentTimeMillis() - levelTime); - level.tickRateTime = tickMs; - - if (this.autoTickRate) { - if (tickMs < 50 && level.getTickRate() > this.baseTickRate) { - int r; - level.setTickRate(r = level.getTickRate() - 1); - if (r > this.baseTickRate) { - level.tickRateCounter = level.getTickRate(); - } - this.getLogger().debug("Raising level \"" + level.getName() + "\" tick rate to " + level.getTickRate() + " ticks"); - } else if (tickMs >= 50) { - if (level.getTickRate() == this.baseTickRate) { - level.setTickRate(Math.max(this.baseTickRate + 1, Math.min(this.autoTickRateLimit, tickMs / 50))); - this.getLogger().debug("Level \"" + level.getName() + "\" took " + tickMs + "ms, setting tick rate to " + level.getTickRate() + " ticks"); - } else if ((tickMs / level.getTickRate()) >= 50 && level.getTickRate() < this.autoTickRateLimit) { - level.setTickRate(level.getTickRate() + 1); - this.getLogger().debug("Level \"" + level.getName() + "\" took " + tickMs + "ms, setting tick rate to " + level.getTickRate() + " ticks"); - } - level.tickRateCounter = level.getTickRate(); - } - } - } catch (Exception e) { - log.error(this.baseLang.translateString("nukkit.level.tickError", new String[]{level.getFolderName(), Utils.getExceptionMessage(e)})); - } - } - } - - public void doAutoSave() { - if (this.autoSave) { - if (Timings.levelSaveTimer != null) Timings.levelSaveTimer.startTiming(); - for (Player player : new ArrayList<>(this.players.values())) { - if (player.isOnline()) { - player.save(true); - } else if (!player.isConnected()) { - this.removePlayer(player); - } - } - - for (Level level : this.levelArray) { - if (!nonAutoSaveWorlds.contains(level.getName())) { - level.save(); - } - } - if (Timings.levelSaveTimer != null) Timings.levelSaveTimer.stopTiming(); - } - } - - private void tick() { - long tickTime = System.currentTimeMillis(); - - long time = tickTime - this.nextTick; - if (time < -25) { - try { - Thread.sleep(Math.max(5, -time - 25)); - } catch (InterruptedException e) { - Server.getInstance().getLogger().logException(e); - } - } - - long tickTimeNano = System.nanoTime(); - if ((tickTime - this.nextTick) < -25) { - return; - } - - if (Timings.isTimingsEnabled()) { - Timings.fullServerTickTimer.startTiming(); - } - - ++this.tickCounter; - - if (Timings.connectionTimer != null) Timings.connectionTimer.startTiming(); - this.network.processInterfaces(); - - if (this.rcon != null) { - this.rcon.check(); - } - if (Timings.connectionTimer != null) Timings.connectionTimer.stopTiming(); - - if (Timings.schedulerTimer != null) Timings.schedulerTimer.startTiming(); - this.scheduler.mainThreadHeartbeat(this.tickCounter); - if (Timings.schedulerTimer != null) Timings.schedulerTimer.stopTiming(); - - this.checkTickUpdates(this.tickCounter); - - for (Player player : new ArrayList<>(this.players.values())) { - player.checkNetwork(); - } - - if ((this.tickCounter & 0b1111) == 0) { - this.titleTick(); - - //this.network.resetStatistics(); // Unnecessary since addStatistics is not used in the new raknet - this.maxTick = 20; - this.maxUse = 0; - - if ((this.tickCounter & 0b111111111) == 0) { - try { - this.pluginManager.callEvent(this.queryRegenerateEvent = new QueryRegenerateEvent(this, 5)); - if (this.queryHandler != null) { - this.queryHandler.regenerateInfo(); - } - } catch (Exception e) { - log.error(e); - } - } - - this.network.updateName(); - } - - if (++this.autoSaveTicker >= this.autoSaveTicks) { - this.autoSaveTicker = 0; - this.doAutoSave(); - } - - if (this.tickCounter % 100 == 0) { - for (Level level : this.levelArray) { - level.doChunkGarbageCollection(); - } - } - - if (Timings.isTimingsEnabled()) { - Timings.fullServerTickTimer.stopTiming(); - } - - long nowNano = System.nanoTime(); - - float tick = (float) Math.min(20, 1000000000 / Math.max(1000000, ((double) nowNano - tickTimeNano))); - float use = (float) Math.min(1, ((double) (nowNano - tickTimeNano)) / 50000000); - - if (this.maxTick > tick) { - this.maxTick = tick; - } - - if (this.maxUse < use) { - this.maxUse = use; - } - - System.arraycopy(this.tickAverage, 1, this.tickAverage, 0, this.tickAverage.length - 1); - this.tickAverage[this.tickAverage.length - 1] = tick; - - System.arraycopy(this.useAverage, 1, this.useAverage, 0, this.useAverage.length - 1); - this.useAverage[this.useAverage.length - 1] = use; - - if ((this.nextTick - tickTime) < -1000) { - this.nextTick = tickTime; - } else { - this.nextTick += 50; - } - } - - public long getNextTick() { - return nextTick; - } - - private void titleTick() { - if (!Nukkit.TITLE) return; - - Runtime runtime = Runtime.getRuntime(); - double used = NukkitMath.round((double) (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024, 2); - double max = NukkitMath.round(((double) runtime.maxMemory()) / 1024 / 1024, 2); - System.out.print((char) 0x1b + "]0;" + Nukkit.NUKKIT + - " | Online " + this.players.size() + '/' + this.maxPlayers + - " | Memory " + Math.round(used / max * 100) + '%' + - /*" | U " + NukkitMath.round((this.network.getUpload() / 1024 * 1000), 2) + - " D " + NukkitMath.round((this.network.getDownload() / 1024 * 1000), 2) + " kB/s" +*/ - " | TPS " + this.getTicksPerSecond() + - " | Load " + this.getTickUsage() + '%' + (char) 0x07); - } - - public QueryRegenerateEvent getQueryInformation() { - return this.queryRegenerateEvent; - } - - public String getName() { - return Nukkit.NUKKIT; - } - - public boolean isRunning() { - return isRunning.get(); - } - - public String getNukkitVersion() { - return Nukkit.VERSION; - } - - public String getCodename() { - return "PM1E"; - } - - public String getVersion() { - return ProtocolInfo.MINECRAFT_VERSION; - } - - public String getApiVersion() { - return "CUSTOM"; - } - - public String getFilePath() { - return filePath; - } - - public String getDataPath() { - return dataPath; - } - - public String getPluginPath() { - return pluginPath; - } - - public int getMaxPlayers() { - return maxPlayers; - } - - public void setMaxPlayers(int maxPlayers) { - this.maxPlayers = maxPlayers; - } - - public int getPort() { - return port; - } - - public int getViewDistance() { - return viewDistance; - } - - public String getIp() { - return ip; - } - - public UUID getServerUniqueId() { - return this.serverID; - } - - public boolean getAutoSave() { - return this.autoSave; - } - - public void setAutoSave(boolean autoSave) { - this.autoSave = autoSave; - for (Level level : this.levelArray) { - level.setAutoSave(this.autoSave); - } - } - - public String getLevelType() { - return this.getPropertyString("level-type", "default"); - } - - public int getGamemode() { - return gamemode; - } - - public boolean getForceGamemode() { - return this.forceGamemode; - } - - public static String getGamemodeString(int mode) { - return getGamemodeString(mode, false); - } - - public static String getGamemodeString(int mode, boolean direct) { - switch (mode) { - case Player.SURVIVAL: - return direct ? "Survival" : "%gameMode.survival"; - case Player.CREATIVE: - return direct ? "Creative" : "%gameMode.creative"; - case Player.ADVENTURE: - return direct ? "Adventure" : "%gameMode.adventure"; - case Player.SPECTATOR: - return direct ? "Spectator" : "%gameMode.spectator"; - } - return "UNKNOWN"; - } - - public static int getGamemodeFromString(String str) { - switch (str.trim().toLowerCase()) { - case "0": - case "survival": - case "s": - return Player.SURVIVAL; - - case "1": - case "creative": - case "c": - return Player.CREATIVE; - - case "2": - case "adventure": - case "a": - return Player.ADVENTURE; - - case "3": - case "spectator": - case "spc": - case "view": - case "v": - return Player.SPECTATOR; - } - return -1; - } - - public static int getDifficultyFromString(String str) { - switch (str.trim().toLowerCase()) { - case "0": - case "peaceful": - case "p": - return 0; - - case "1": - case "easy": - case "e": - return 1; - - case "2": - case "normal": - case "n": - return 2; - - case "3": - case "hard": - case "h": - return 3; - } - return -1; - } - - public int getDifficulty() { - return this.difficulty; - } - - public void setDifficulty(int difficulty) { - int value = difficulty; - if (value < 0) value = 0; - if (value > 3) value = 3; - this.difficulty = value; - this.setPropertyInt("difficulty", value); - } - - public boolean hasWhitelist() { - return this.whitelistEnabled; - } - - public int getSpawnRadius() { - return spawnRadius; - } - - public boolean getAllowFlight() { - return flyChecks; - } - - public boolean isHardcore() { - return this.isHardcore; - } - - public int getDefaultGamemode() { - if (this.defaultGameMode == Integer.MAX_VALUE) { - this.defaultGameMode = this.getGamemode(); - } - return this.defaultGameMode; - } - - public String getMotd() { - return motd; - } - - public String getSubMotd() { - String sub = this.getPropertyString("sub-motd", "Powered by Nukkit"); - if (sub.isEmpty()) sub = "Powered by Nukkit"; - return sub; - } - - public boolean getForceResources() { - return this.forceResources; - } - - public boolean getMobAiEnabled() { - return this.mobAiEnabled; - } - - public MainLogger getLogger() { - return MainLogger.getLogger(); - } - - public EntityMetadataStore getEntityMetadata() { - return entityMetadata; - } - - public PlayerMetadataStore getPlayerMetadata() { - return playerMetadata; - } - - public LevelMetadataStore getLevelMetadata() { - return levelMetadata; - } - - public PluginManager getPluginManager() { - return this.pluginManager; - } - - public CraftingManager getCraftingManager() { - return craftingManager; - } - - public ResourcePackManager getResourcePackManager() { - return resourcePackManager; - } - - public ServerScheduler getScheduler() { - return scheduler; - } - - /** - * Get current tick - * - * @return current tick - */ - public int getTick() { - return tickCounter; - } - - /** - * Get ticks per second - * - * @return TPS - */ - public float getTicksPerSecond() { - return ((float) Math.round(this.maxTick * 100)) / 100; - } - - /** - * Get average ticks per second - * - * @return average TPS - */ - public float getTicksPerSecondAverage() { - float sum = 0; - int count = this.tickAverage.length; - for (float aTickAverage : this.tickAverage) { - sum += aTickAverage; - } - return (float) NukkitMath.round(sum / count, 2); - } - - public float getTickUsage() { - return (float) NukkitMath.round(this.maxUse * 100, 2); - } - - public float getTickUsageAverage() { - float sum = 0; - for (float aUseAverage : this.useAverage) { - sum += aUseAverage; - } - return ((float) Math.round(sum / this.useAverage.length * 100)) / 100; - } - - public SimpleCommandMap getCommandMap() { - return commandMap; - } - - public Map getOnlinePlayers() { - return ImmutableMap.copyOf(playerList); - } - - public int getOnlinePlayersCount() { - return this.playerList.size(); - } - - public void addRecipe(Recipe recipe) { - this.craftingManager.registerRecipe(recipe); - } - - public Optional getPlayer(UUID uuid) { - Preconditions.checkNotNull(uuid, "uuid"); - return Optional.ofNullable(playerList.get(uuid)); - } - - public Optional lookupName(String name) { - byte[] nameBytes = name.toLowerCase().getBytes(StandardCharsets.UTF_8); - byte[] uuidBytes = nameLookup.get(nameBytes); - if (uuidBytes == null) { - return Optional.empty(); - } - - if (uuidBytes.length != 16) { - log.warn("Invalid uuid in name lookup database detected! Removing..."); - nameLookup.delete(nameBytes); - return Optional.empty(); - } - - ByteBuffer buffer = ByteBuffer.wrap(uuidBytes); - return Optional.of(new UUID(buffer.getLong(), buffer.getLong())); - } - - void updateName(UUID uuid, String name) { - byte[] nameBytes = name.toLowerCase().getBytes(StandardCharsets.UTF_8); - - ByteBuffer buffer = ByteBuffer.allocate(16); - buffer.putLong(uuid.getMostSignificantBits()); - buffer.putLong(uuid.getLeastSignificantBits()); - - nameLookup.put(nameBytes, buffer.array()); - } - - public IPlayer getOfflinePlayer(final String name) { - IPlayer result = this.getPlayerExact(name.toLowerCase()); - if (result != null) { - return result; - } - - return lookupName(name).map(uuid -> new OfflinePlayer(this, uuid)) - .orElse(new OfflinePlayer(this, name)); - } - - public IPlayer getOfflinePlayer(UUID uuid) { - Preconditions.checkNotNull(uuid, "uuid"); - Optional onlinePlayer = getPlayer(uuid); - if (onlinePlayer.isPresent()) { - return onlinePlayer.get(); - } - - return new OfflinePlayer(this, uuid); - } - - public CompoundTag getOfflinePlayerData(UUID uuid) { - return getOfflinePlayerData(uuid, false); - } - - public CompoundTag getOfflinePlayerData(UUID uuid, boolean create) { - return getOfflinePlayerDataInternal(uuid.toString(), true, create); - } - - public CompoundTag getOfflinePlayerData(String name) { - return getOfflinePlayerData(name, false); - } - - public CompoundTag getOfflinePlayerData(String name, boolean create) { - if (this.savePlayerDataByUuid) { - Optional uuid = lookupName(name); - return getOfflinePlayerDataInternal(uuid.map(UUID::toString).orElse(name), true, create); - } else { - return getOfflinePlayerDataInternal(name, true, create); - } - } - - private CompoundTag getOfflinePlayerDataInternal(String name, boolean runEvent, boolean create) { - Preconditions.checkNotNull(name, "name"); - - PlayerDataSerializeEvent event = new PlayerDataSerializeEvent(name, playerDataSerializer); - if (runEvent) { - pluginManager.callEvent(event); - } - - Optional dataStream = Optional.empty(); - try { - dataStream = event.getSerializer().read(name, event.getUuid().orElse(null)); - if (dataStream.isPresent()) { - return NBTIO.readCompressed(dataStream.get()); - } - } catch (IOException e) { - log.warn(this.getLanguage().translateString("nukkit.data.playerCorrupted", name)); - log.throwing(e); - } finally { - if (dataStream.isPresent()) { - try { - dataStream.get().close(); - } catch (IOException e) { - log.throwing(e); - } - } - } - CompoundTag nbt = null; - if (create) { - Position spawn = this.getDefaultLevel().getSafeSpawn(); - long time = System.currentTimeMillis(); - nbt = new CompoundTag() - .putLong("firstPlayed", time / 1000) - .putLong("lastPlayed", time / 1000) - .putList(new ListTag("Pos") - .add(new DoubleTag("0", spawn.x)) - .add(new DoubleTag("1", spawn.y)) - .add(new DoubleTag("2", spawn.z))) - .putString("Level", this.getDefaultLevel().getName()) - .putList(new ListTag<>("Inventory")) - .putCompound("Achievements", new CompoundTag()) - .putInt("playerGameType", this.getGamemode()) - .putList(new ListTag("Motion") - .add(new DoubleTag("0", 0)) - .add(new DoubleTag("1", 0)) - .add(new DoubleTag("2", 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("0", 0)) - .add(new FloatTag("1", 0))) - .putFloat("FallDistance", 0) - .putShort("Fire", 0) - .putShort("Air", 300) - .putBoolean("OnGround", true) - .putBoolean("Invulnerable", false); - - this.saveOfflinePlayerData(name, nbt, true, runEvent); - } - return nbt; - } - - public void saveOfflinePlayerData(UUID uuid, CompoundTag tag) { - this.saveOfflinePlayerData(uuid, tag, false); - } - - public void saveOfflinePlayerData(String name, CompoundTag tag) { - this.saveOfflinePlayerData(name, tag, false); - } - - public void saveOfflinePlayerData(UUID uuid, CompoundTag tag, boolean async) { - this.saveOfflinePlayerData(uuid.toString(), tag, async); - } - - public void saveOfflinePlayerData(String name, CompoundTag tag, boolean async) { - if (this.savePlayerDataByUuid) { - Optional uuid = lookupName(name); - saveOfflinePlayerData(uuid.map(UUID::toString).orElse(name), tag, async, true); - } else { - saveOfflinePlayerData(name, tag, async, true); - } - } - - private void saveOfflinePlayerData(String name, CompoundTag tag, boolean async, boolean runEvent) { - String nameLower = name.toLowerCase(); - if (this.shouldSavePlayerData()) { - PlayerDataSerializeEvent event = new PlayerDataSerializeEvent(nameLower, playerDataSerializer); - if (runEvent) { - pluginManager.callEvent(event); - } - - if (async) { - this.getScheduler().scheduleTask(new Task() { - boolean hasRun = false; - - @Override - public void onRun(int currentTick) { - this.onCancel(); - } - - // Doing it like this ensures that the player data will be saved in a server shutdown - @Override - public void onCancel() { - if (!this.hasRun) { - this.hasRun = true; - saveOfflinePlayerDataInternal(event.getSerializer(), tag, nameLower, event.getUuid().orElse(null)); - } - } - }, true); - } else { - saveOfflinePlayerDataInternal(event.getSerializer(), tag, nameLower, event.getUuid().orElse(null)); - } - } - } - - /** - * Internal: Save offline player data - * - * @param serializer serializer - * @param tag compound tag - * @param name player name - * @param uuid player uuid - */ - private void saveOfflinePlayerDataInternal(PlayerDataSerializer serializer, CompoundTag tag, String name, UUID uuid) { - try (OutputStream dataStream = serializer.write(name, uuid)) { - NBTIO.writeGZIPCompressed(tag, dataStream, ByteOrder.BIG_ENDIAN); - } catch (Exception e) { - log.error(this.getLanguage().translateString("nukkit.data.saveError", name, e)); - } - } - - /** - * Internal: Convert legacy player saves to the uuid based saving - */ - private void convertLegacyPlayerData() { - File dataDirectory = new File(getDataPath(), "players/"); - - File[] files = dataDirectory.listFiles(file -> { - String name = file.getName(); - return !uuidPattern.matcher(name).matches() && name.endsWith(".dat"); - }); - - if (files == null) { - return; - } - - for (File legacyData : files) { - String name = legacyData.getName(); - // Remove file extension - name = name.substring(0, name.length() - 4); - - log.debug("Attempting legacy player data conversion for {}", name); - - CompoundTag tag = getOfflinePlayerDataInternal(name, false, false); - - if (tag == null || !tag.contains("UUIDLeast") || !tag.contains("UUIDMost")) { - // No UUID so we cannot convert. Wait until player logs in. - continue; - } - - UUID uuid = new UUID(tag.getLong("UUIDMost"), tag.getLong("UUIDLeast")); - if (!tag.contains("NameTag")) { - tag.putString("NameTag", name); - } - - if (new File(getDataPath() + "players/" + uuid.toString() + ".dat").exists()) { - // We don't want to overwrite existing data. - continue; - } - - saveOfflinePlayerData(uuid.toString(), tag, false, false); - - // Add name to lookup table - updateName(uuid, name); - - // Delete legacy data - if (!legacyData.delete()) { - log.warn("Unable to delete legacy data for {}", name); - } - } - } - - /** - * Get an online player by name - * - * @param name player name - * @return Player or null - */ - public Player getPlayer(String name) { - Player found = null; - name = name.toLowerCase(); - int delta = Integer.MAX_VALUE; - for (Player player : this.getOnlinePlayers().values()) { - if (player.getName().toLowerCase().startsWith(name)) { - int curDelta = player.getName().length() - name.length(); - if (curDelta < delta) { - found = player; - delta = curDelta; - } - if (curDelta == 0) { - break; - } - } - } - - return found; - } - - /** - * Get an online player by exact player name - * - * @param name exact player name - * @return Player or null - */ - public Player getPlayerExact(String name) { - for (Player player : this.getOnlinePlayers().values()) { - if (player.getName().equalsIgnoreCase(name)) { - return player; - } - } - - return null; - } - - /** - * Get players that match with the name - * - * @param partialName name - * @return matching players - */ - public Player[] matchPlayer(String partialName) { - partialName = partialName.toLowerCase(); - List matchedPlayer = new ArrayList<>(); - for (Player player : this.getOnlinePlayers().values()) { - if (player.getName().toLowerCase().equals(partialName)) { - return new Player[]{player}; - } else if (player.getName().toLowerCase().contains(partialName)) { - matchedPlayer.add(player); - } - } - - return matchedPlayer.toArray(new Player[0]); - } - - /** - * Internal: Remove a player from the server - * - * @param player player - */ - public void removePlayer(Player player) { - if (this.players.remove(player.getSocketAddress()) != null) { - return; - } - - for (InetSocketAddress socketAddress : new ArrayList<>(this.players.keySet())) { - if (player == this.players.get(socketAddress)) { - this.players.remove(socketAddress); - break; - } - } - } - - /** - * Get all levels - * - * @return levels - */ - public Map getLevels() { - return levels; - } - - /** - * Get default level - * - * @return default level - */ - public Level getDefaultLevel() { - return defaultLevel; - } - - /** - * Change the default level - * - * @param defaultLevel new default level - */ - public void setDefaultLevel(Level defaultLevel) { - if (defaultLevel == null || (this.isLevelLoaded(defaultLevel.getFolderName()) && defaultLevel != this.defaultLevel)) { - this.defaultLevel = defaultLevel; - } - } - - /** - * Check whether a level is loaded - * - * @param name level name - * @return is loaded - */ - public boolean isLevelLoaded(String name) { - return this.getLevelByName(name) != null; - } - - /** - * Get a level by ID - * - * @param levelId level ID - * @return Level or null - */ - public Level getLevel(int levelId) { - if (this.levels.containsKey(levelId)) { - return this.levels.get(levelId); - } - return null; - } - - /** - * Get a level by name - * - * @param name level name - * @return Level or null - */ - public Level getLevelByName(String name) { - for (Level level : this.levelArray) { - if (level.getFolderName().equalsIgnoreCase(name)) { - return level; - } - } - - return null; - } - - /** - * Unload a level - * - * Notice: the default level cannot be unloaded without forceUnload=true - * - * @param level Level - * @return unloaded - */ - public boolean unloadLevel(Level level) { - return this.unloadLevel(level, false); - } - - /** - * Unload a level - * - * Notice: the default level cannot be unloaded without forceUnload=true - * - * @param level Level - * @param forceUnload force unload (ignore cancelled events and default level) - * @return unloaded - */ - public boolean unloadLevel(Level level, boolean forceUnload) { - if (level == this.defaultLevel && !forceUnload) { - throw new IllegalStateException("The default level cannot be unloaded while running, please switch levels."); - } - - return level.unload(forceUnload); - } - - /** - * Load a level by name - * - * @param name level name - * @return loaded - */ - public boolean loadLevel(String name) { - if (Objects.equals(name.trim(), "")) { - throw new LevelException("Invalid empty level name"); - } - - if (this.isLevelLoaded(name)) { - return true; - } else if (!this.isLevelGenerated(name)) { - log.warn(this.baseLang.translateString("nukkit.level.notFound", name)); - return false; - } - - String path; - - if (name.contains("/") || name.contains("\\")) { - path = name; - } else { - path = this.dataPath + "worlds/" + name + '/'; - } - - Class provider = LevelProviderManager.getProvider(path); - - if (provider == null) { - log.error(this.baseLang.translateString("nukkit.level.loadError", new String[]{name, "Unknown provider"})); - return false; - } - - Level level; - try { - level = new Level(this, name, path, provider); - } catch (Exception e) { - log.error(this.baseLang.translateString("nukkit.level.loadError", new String[]{name, e.getMessage()})); - return false; - } - - this.levels.put(level.getId(), level); - - level.initLevel(); - - level.setTickRate(this.baseTickRate); - - this.pluginManager.callEvent(new LevelLoadEvent(level)); - return true; - } - - /** - * Generate a new level - * - * @param name level name - * @return generated - */ - public boolean generateLevel(String name) { - return this.generateLevel(name, Utils.random.nextLong()); - } - - /** - * Generate a new level - * - * @param name level name - * @param seed level seed - * @return generated - */ - public boolean generateLevel(String name, long seed) { - return this.generateLevel(name, seed, null); - } - - /** - * Generate a new level - * - * @param name level name - * @param seed level seed - * @param generator level generator - * @return generated - */ - public boolean generateLevel(String name, long seed, Class generator) { - return this.generateLevel(name, seed, generator, new HashMap<>()); - } - - /** - * Generate a new level - * - * @param name level name - * @param seed level seed - * @param generator level generator - * @param options level generator options - * @return generated - */ - public boolean generateLevel(String name, long seed, Class generator, Map options) { - return generateLevel(name, seed, generator, options, null); - } - - /** - * Generate a new level - * - * @param name level name - * @param seed level seed - * @param generator level generator - * @param options level generator options - * @param provider level provider - * @return generated - */ - public boolean generateLevel(String name, long seed, Class generator, Map options, Class provider) { - if (Objects.equals(name.trim(), "") || this.isLevelGenerated(name)) { - return false; - } - - if (!options.containsKey("preset")) { - options.put("preset", this.getPropertyString("generator-settings", "")); - } - - if (generator == null) { - generator = Generator.getGenerator(this.getLevelType()); - } - - if (provider == null) { - provider = LevelProviderManager.getProviderByName("anvil"); - } - - String path; - - if (name.contains("/") || name.contains("\\")) { - path = name; - } else { - path = this.dataPath + "worlds/" + name + '/'; - } - - Level level; - try { - provider.getMethod("generate", String.class, String.class, long.class, Class.class, Map.class).invoke(null, path, name, seed, generator, options); - - level = new Level(this, name, path, provider); - this.levels.put(level.getId(), level); - - level.initLevel(); - - level.setTickRate(this.baseTickRate); - } catch (Exception e) { - log.error(this.baseLang.translateString("nukkit.level.generationError", new String[]{name, Utils.getExceptionMessage(e)})); - return false; - } - - this.pluginManager.callEvent(new LevelInitEvent(level)); - this.pluginManager.callEvent(new LevelLoadEvent(level)); - return true; - } - - /** - * Check whether a level by name is generated - * - * @param name level name - * @return level found - */ - public boolean isLevelGenerated(String name) { - if (Objects.equals(name.trim(), "")) { - return false; - } - - if (this.getLevelByName(name) == null) { - String path; - - if (name.contains("/") || name.contains("\\")) { - path = name; - } else { - path = this.dataPath + "worlds/" + name + '/'; - } - - return LevelProviderManager.getProvider(path) != null; - } - - return true; - } - - /** - * Get BaseLang (server's default language) - * - * @return BaseLang - */ - public BaseLang getLanguage() { - return baseLang; - } - - /** - * Is forcing language enabled - * - * @return force-language enabled - */ - public boolean isLanguageForced() { - return forceLanguage; - } - - /** - * Get Network - * - * @return Network - */ - public Network getNetwork() { - return network; - } - - /** - * Get server.properties - * - * @return server.properties as a Config - */ - public Config getProperties() { - return this.properties; - } - - /** - * Get a value from server.properties - * - * @param variable key - * @return value - */ - public Object getProperty(String variable) { - return this.getProperty(variable, null); - } - - /** - * Get a value from server.properties - * - * @param variable key - * @param defaultValue default value - * @return value - */ - public Object getProperty(String variable, Object defaultValue) { - return this.properties.exists(variable) ? this.properties.get(variable) : defaultValue; - } - - /** - * Set a string value in server.properties - * - * @param variable key - * @param value value - */ - public void setPropertyString(String variable, String value) { - this.properties.set(variable, value); - this.properties.save(); - } - - /** - * Get a string value from server.properties - * - * @param key key - * @return value - */ - public String getPropertyString(String key) { - return this.getPropertyString(key, null); - } - - /** - * Get a string value from server.properties - * - * @param key key - * @param defaultValue default value - * @return value - */ - public String getPropertyString(String key, String defaultValue) { - return this.properties.exists(key) ? this.properties.get(key).toString() : defaultValue; - } - - /** - * Get an int value from server.properties - * - * @param variable key - * @return value - */ - public int getPropertyInt(String variable) { - return this.getPropertyInt(variable, null); - } - - /** - * Get an int value from server.properties - * - * @param variable key - * @param defaultValue default value - * @return value - */ - public int getPropertyInt(String variable, Integer defaultValue) { - return this.properties.exists(variable) ? (!this.properties.get(variable).equals("") ? Integer.parseInt(String.valueOf(this.properties.get(variable))) : defaultValue) : defaultValue; - } - - /** - * Set an int value in server.properties - * - * @param variable key - * @param value value - */ - public void setPropertyInt(String variable, int value) { - this.properties.set(variable, value); - this.properties.save(); - } - - /** - * Get a boolean value from server.properties - * - * @param variable key - * @return value - */ - public boolean getPropertyBoolean(String variable) { - return this.getPropertyBoolean(variable, null); - } - - /** - * Get a boolean value from server.properties - * - * @param variable key - * @param defaultValue default value - * @return value - */ - public boolean getPropertyBoolean(String variable, Object defaultValue) { - Object value = this.properties.exists(variable) ? this.properties.get(variable) : defaultValue; - if (value instanceof Boolean) { - return (Boolean) value; - } - switch (String.valueOf(value)) { - case "on": - case "true": - case "1": - case "yes": - return true; - } - return false; - } - - /** - * Set a boolean value in server.properties - * - * @param variable key - * @param value value - */ - public void setPropertyBoolean(String variable, boolean value) { - this.properties.set(variable, value ? "1" : "0"); - this.properties.save(); - } - - /** - * Get plugin commands - * - * @param name command name - * @return PluginIdentifiableCommand or null - */ - public PluginIdentifiableCommand getPluginCommand(String name) { - Command command = this.commandMap.getCommand(name); - if (command instanceof PluginIdentifiableCommand) { - return (PluginIdentifiableCommand) command; - } else { - return null; - } - } - - /** - * Get list of banned players - * - * @return ban list - */ - public BanList getNameBans() { - return this.banByName; - } - - /** - * Get list of IP bans - * - * @return IP bans - */ - public BanList getIPBans() { - return this.banByIP; - } - - /** - * Give player the operator status - * - * @param name player name - */ - public void addOp(String name) { - this.operators.set(name.toLowerCase(), true); - Player player = this.getPlayerExact(name); - if (player != null) { - player.recalculatePermissions(); - } - this.operators.save(true); - } - - /** - * Remove player's operator status - * - * @param name player name - */ - public void removeOp(String name) { - this.operators.remove(name.toLowerCase()); - Player player = this.getPlayerExact(name); - if (player != null) { - player.recalculatePermissions(); - } - this.operators.save(); - } - - /** - * Add a player to whitelist - * - * @param name player name - */ - public void addWhitelist(String name) { - this.whitelist.set(name.toLowerCase(), true); - this.whitelist.save(true); - } - - /** - * Remove a player from whitelist - * - * @param name player name - */ - public void removeWhitelist(String name) { - this.whitelist.remove(name.toLowerCase()); - this.whitelist.save(true); - } - - /** - * Check whether a player is whitelisted - * - * @param name player name - * @return is whitelisted or whitelist is not enabled - */ - public boolean isWhitelisted(String name) { - return !this.hasWhitelist() || this.operators.exists(name, true) || this.whitelist.exists(name, true); - } - - /** - * Check whether a player is an operator - * - * @param name player name - * @return is operator - */ - public boolean isOp(String name) { - return this.operators.exists(name, true); - } - - /** - * Get whitelist config - * - * @return whitelist - */ - public Config getWhitelist() { - return whitelist; - } - - /** - * Get operator list config - * - * @return operators - */ - public Config getOps() { - return operators; - } - - /** - * Reload whitelist - */ - public void reloadWhitelist() { - this.whitelist.reload(); - } - - /** - * Get service manager - * - * @return service manager - */ - public ServiceManager getServiceManager() { - return serviceManager; - } - - /** - * Should player data saving be enabled - * - * @return player data saving enabled - */ - public boolean shouldSavePlayerData() { - return shouldSavePlayerData; - } - - /** - * How often player is allowed to change skin in game (in seconds) - * - * @return skin change cooldown - */ - public int getPlayerSkinChangeCooldown() { - return skinChangeCooldown; - } - - /** - * Get nether world for a level - * - * @param world level - * @return nether world for that level - */ - public Level getNetherWorld(String world) { - return multiNetherWorlds.contains(world) ? this.getLevelByName(world + "-nether") : this.getLevelByName("nether"); - } - - /** - * Sort players by protocol version - * - * @param players players - * @return players sorted by protocol - */ - public static Int2ObjectMap> sortPlayers(Player[] players) { - Int2ObjectMap> targets = new Int2ObjectOpenHashMap<>(); - for (Player player : players) { - targets.computeIfAbsent(player.protocol, i -> new ObjectArrayList<>()).add(player); - } - return targets; - } - - /** - * Sort players by protocol version - * - * @param players players - * @return players sorted by protocol - */ - public static Int2ObjectMap> sortPlayers(Collection players) { - Int2ObjectMap> targets = new Int2ObjectOpenHashMap<>(); - for (Player player : players) { - targets.computeIfAbsent(player.protocol, i -> new ObjectArrayList<>()).add(player); - } - return targets; - } - - /** - * Checks the current thread against the expected primary thread for the server. - * - * Note: this method should not be used to indicate the current synchronized state of the runtime. A current thread matching the main thread indicates that it is synchronized, but a mismatch does not preclude the same assumption. - * - * @return true if the current thread matches the expected primary thread, false otherwise - */ - public boolean isPrimaryThread() { - return (Thread.currentThread() == currentThread); - } - - /** - * Get server's primary thread - * - * @return primary thread - */ - public Thread getPrimaryThread() { - return currentThread; - } - - /** - * Internal method to register all default entities - */ - private static void registerEntities() { - //Items - Entity.registerEntity("Item", EntityItem.class); - Entity.registerEntity("Painting", EntityPainting.class); - Entity.registerEntity("XpOrb", EntityXPOrb.class); - Entity.registerEntity("ArmorStand", EntityArmorStand.class); - Entity.registerEntity("EndCrystal", EntityEndCrystal.class); - Entity.registerEntity("FallingSand", EntityFallingBlock.class); - Entity.registerEntity("PrimedTnt", EntityPrimedTNT.class); - Entity.registerEntity("Firework", EntityFirework.class); - //Projectiles - Entity.registerEntity("Arrow", EntityArrow.class); - Entity.registerEntity("Snowball", EntitySnowball.class); - Entity.registerEntity("EnderPearl", EntityEnderPearl.class); - Entity.registerEntity("ThrownExpBottle", EntityExpBottle.class); - Entity.registerEntity("ThrownPotion", EntityPotion.class); - Entity.registerEntity("Egg", EntityEgg.class); - Entity.registerEntity("BlazeFireBall", EntityBlazeFireBall.class); - Entity.registerEntity("GhastFireBall", EntityGhastFireBall.class); - Entity.registerEntity("ShulkerBullet", EntityShulkerBullet.class); - Entity.registerEntity("ThrownLingeringPotion", EntityPotionLingering.class); - Entity.registerEntity("ThrownTrident", EntityThrownTrident.class); - Entity.registerEntity("WitherSkull", EntityWitherSkull.class); - Entity.registerEntity("BlueWitherSkull", EntityBlueWitherSkull.class); - Entity.registerEntity("LlamaSpit", EntityLlamaSpit.class); - Entity.registerEntity("EvocationFangs", EntityEvocationFangs.class); - Entity.registerEntity("EnderCharge", EntityEnderCharge.class); - Entity.registerEntity("FishingHook", EntityFishingHook.class); - //Monsters - Entity.registerEntity("Blaze", EntityBlaze.class); - Entity.registerEntity("Creeper", EntityCreeper.class); - Entity.registerEntity("CaveSpider", EntityCaveSpider.class); - Entity.registerEntity("Drowned", EntityDrowned.class); - Entity.registerEntity("ElderGuardian", EntityElderGuardian.class); - Entity.registerEntity("EnderDragon", EntityEnderDragon.class); - Entity.registerEntity("Enderman", EntityEnderman.class); - Entity.registerEntity("Endermite", EntityEndermite.class); - Entity.registerEntity("Evoker", EntityEvoker.class); - Entity.registerEntity("Ghast", EntityGhast.class); - Entity.registerEntity("Guardian", EntityGuardian.class); - Entity.registerEntity("Husk", EntityHusk.class); - Entity.registerEntity("MagmaCube", EntityMagmaCube.class); - Entity.registerEntity("Phantom", EntityPhantom.class); - Entity.registerEntity("Ravager", EntityRavager.class); - Entity.registerEntity("Shulker", EntityShulker.class); - Entity.registerEntity("Silverfish", EntitySilverfish.class); - Entity.registerEntity("Skeleton", EntitySkeleton.class); - Entity.registerEntity("SkeletonHorse", EntitySkeletonHorse.class); - Entity.registerEntity("Slime", EntitySlime.class); - Entity.registerEntity("Spider", EntitySpider.class); - Entity.registerEntity("Stray", EntityStray.class); - Entity.registerEntity("Vindicator", EntityVindicator.class); - Entity.registerEntity("Vex", EntityVex.class); - Entity.registerEntity("WitherSkeleton", EntityWitherSkeleton.class); - Entity.registerEntity("Wither", EntityWither.class); - Entity.registerEntity("Witch", EntityWitch.class); - Entity.registerEntity("ZombiePigman", EntityZombiePigman.class); - Entity.registerEntity("ZombieVillager", EntityZombieVillager.class); - Entity.registerEntity("Zombie", EntityZombie.class); - Entity.registerEntity("Pillager", EntityPillager.class); - Entity.registerEntity("ZombieVillagerV2", EntityZombieVillagerV2.class); - Entity.registerEntity("Hoglin", EntityHoglin.class); - Entity.registerEntity("Piglin", EntityPiglin.class); - Entity.registerEntity("Zoglin", EntityZoglin.class); - Entity.registerEntity("PiglinBrute", EntityPiglinBrute.class); - //Passive - Entity.registerEntity("Bat", EntityBat.class); - Entity.registerEntity("Cat", EntityCat.class); - Entity.registerEntity("Chicken", EntityChicken.class); - Entity.registerEntity("Cod", EntityCod.class); - Entity.registerEntity("Cow", EntityCow.class); - Entity.registerEntity("Dolphin", EntityDolphin.class); - Entity.registerEntity("Donkey", EntityDonkey.class); - Entity.registerEntity("Horse", EntityHorse.class); - Entity.registerEntity("IronGolem", EntityIronGolem.class); - Entity.registerEntity("Llama", EntityLlama.class); - Entity.registerEntity("Mooshroom", EntityMooshroom.class); - Entity.registerEntity("Mule", EntityMule.class); - Entity.registerEntity("Panda", EntityPanda.class); - Entity.registerEntity("Parrot", EntityParrot.class); - Entity.registerEntity("PolarBear", EntityPolarBear.class); - Entity.registerEntity("Pig", EntityPig.class); - Entity.registerEntity("Pufferfish", EntityPufferfish.class); - Entity.registerEntity("Rabbit", EntityRabbit.class); - Entity.registerEntity("Salmon", EntitySalmon.class); - Entity.registerEntity("Sheep", EntitySheep.class); - Entity.registerEntity("Squid", EntitySquid.class); - Entity.registerEntity("SnowGolem", EntitySnowGolem.class); - Entity.registerEntity("TropicalFish", EntityTropicalFish.class); - Entity.registerEntity("Turtle", EntityTurtle.class); - Entity.registerEntity("Wolf", EntityWolf.class); - Entity.registerEntity("Ocelot", EntityOcelot.class); - Entity.registerEntity("Villager", EntityVillager.class); - Entity.registerEntity("ZombieHorse", EntityZombieHorse.class); - Entity.registerEntity("WanderingTrader", EntityWanderingTrader.class); - Entity.registerEntity("VillagerV2", EntityVillagerV2.class); - Entity.registerEntity("Fox", EntityFox.class); - Entity.registerEntity("Bee", EntityBee.class); - Entity.registerEntity("Strider", EntityStrider.class); - Entity.registerEntity("Goat", EntityGoat.class); - Entity.registerEntity("Axolotl", EntityAxolotl.class); - Entity.registerEntity("GlowSquid", EntityGlowSquid.class); - //Vehicles - Entity.registerEntity("MinecartRideable", EntityMinecartEmpty.class); - Entity.registerEntity("MinecartChest", EntityMinecartChest.class); - Entity.registerEntity("MinecartHopper", EntityMinecartHopper.class); - Entity.registerEntity("MinecartTnt", EntityMinecartTNT.class); - Entity.registerEntity("Boat", EntityBoat.class); - //Others - Entity.registerEntity("Human", EntityHuman.class, true); - Entity.registerEntity("Lightning", EntityLightning.class); - } - - /** - * Internal method to register all default block entities - */ - private static void registerBlockEntities() { - BlockEntity.registerBlockEntity(BlockEntity.FURNACE, BlockEntityFurnace.class); - BlockEntity.registerBlockEntity(BlockEntity.CHEST, BlockEntityChest.class); - BlockEntity.registerBlockEntity(BlockEntity.SIGN, BlockEntitySign.class); - BlockEntity.registerBlockEntity(BlockEntity.ENCHANT_TABLE, BlockEntityEnchantTable.class); - BlockEntity.registerBlockEntity(BlockEntity.SKULL, BlockEntitySkull.class); - BlockEntity.registerBlockEntity(BlockEntity.FLOWER_POT, BlockEntityFlowerPot.class); - BlockEntity.registerBlockEntity(BlockEntity.BREWING_STAND, BlockEntityBrewingStand.class); - BlockEntity.registerBlockEntity(BlockEntity.ITEM_FRAME, BlockEntityItemFrame.class); - BlockEntity.registerBlockEntity(BlockEntity.CAULDRON, BlockEntityCauldron.class); - BlockEntity.registerBlockEntity(BlockEntity.ENDER_CHEST, BlockEntityEnderChest.class); - BlockEntity.registerBlockEntity(BlockEntity.BEACON, BlockEntityBeacon.class); - BlockEntity.registerBlockEntity(BlockEntity.PISTON_ARM, BlockEntityPistonArm.class); - BlockEntity.registerBlockEntity(BlockEntity.COMPARATOR, BlockEntityComparator.class); - BlockEntity.registerBlockEntity(BlockEntity.HOPPER, BlockEntityHopper.class); - BlockEntity.registerBlockEntity(BlockEntity.BED, BlockEntityBed.class); - BlockEntity.registerBlockEntity(BlockEntity.JUKEBOX, BlockEntityJukebox.class); - BlockEntity.registerBlockEntity(BlockEntity.SHULKER_BOX, BlockEntityShulkerBox.class); - BlockEntity.registerBlockEntity(BlockEntity.BANNER, BlockEntityBanner.class); - BlockEntity.registerBlockEntity(BlockEntity.DROPPER, BlockEntityDropper.class); - BlockEntity.registerBlockEntity(BlockEntity.DISPENSER, BlockEntityDispenser.class); - BlockEntity.registerBlockEntity(BlockEntity.MOB_SPAWNER, BlockEntitySpawner.class); - BlockEntity.registerBlockEntity(BlockEntity.MUSIC, BlockEntityMusic.class); - } - - /** - * Is nether enabled on this server - * - * @return nether enabled - */ - public boolean isNetherAllowed() { - return this.netherEnabled; - } - - /** - * Get player data serializer that is used to save player data - * - * @return player data serializer - */ - public PlayerDataSerializer getPlayerDataSerializer() { - return playerDataSerializer; - } - - /** - * Set player data serializer that is used to save player data - * - * @param playerDataSerializer player data serializer - */ - public void setPlayerDataSerializer(PlayerDataSerializer playerDataSerializer) { - this.playerDataSerializer = Preconditions.checkNotNull(playerDataSerializer, "playerDataSerializer"); - } - - /** - * Get the Server instance - * - * @return Server - */ - public static Server getInstance() { - return instance; - } - - /** - * SuomiCraft PE mode tweaks some stuff to work better on SuomiCraft PE server. - * - * @return SuomiCraft PE mode enabled - */ - public boolean suomiCraftPEMode() { - return suomicraftMode; - } - - /** - * Get the mob spawner task - * - * @return spawner task - */ - public SpawnerTask getSpawnerTask() { - return this.spawnerTask; - } - - /** - * Load some settings from server.properties - */ - private void loadSettings() { - this.forceLanguage = this.getPropertyBoolean("force-language", false); - this.networkCompressionLevel = Math.max(Math.min(this.getPropertyInt("compression-level", 4), 9), 0); - this.autoTickRate = this.getPropertyBoolean("auto-tick-rate", true); - this.autoTickRateLimit = this.getPropertyInt("auto-tick-rate-limit", 20); - this.alwaysTickPlayers = this.getPropertyBoolean("always-tick-players", false); - this.baseTickRate = this.getPropertyInt("base-tick-rate", 1); - this.suomicraftMode = this.getPropertyBoolean("suomicraft-mode", false); - this.callDataPkSendEv = this.getPropertyBoolean("call-data-pk-send-event", true); - this.callBatchPkEv = this.getPropertyBoolean("call-batch-pk-send-event", true); - this.doLevelGC = this.getPropertyBoolean("do-level-gc", true); - this.mobAiEnabled = this.getPropertyBoolean("mob-ai", true); - this.netherEnabled = this.getPropertyBoolean("nether", true); - this.endEnabled = this.getPropertyBoolean("end", false); - this.xboxAuth = this.getPropertyBoolean("xbox-auth", true); - this.bedSpawnpoints = this.getPropertyBoolean("bed-spawnpoints", true); - this.achievementsEnabled = this.getPropertyBoolean("achievements", true); - this.dimensionsEnabled = this.getPropertyBoolean("dimensions", true); - this.banXBAuthFailed = this.getPropertyBoolean("temp-ip-ban-failed-xbox-auth", false); - this.pvpEnabled = this.getPropertyBoolean("pvp", true); - this.announceAchievements = this.getPropertyBoolean("announce-player-achievements", false); - this.spawnEggsEnabled = this.getPropertyBoolean("spawn-eggs", true); - this.xpBottlesOnCreative = this.getPropertyBoolean("xp-bottles-on-creative", false); - this.shouldSavePlayerData = this.getPropertyBoolean("save-player-data", true); - this.mobsFromBlocks = this.getPropertyBoolean("block-listener", true); - this.explosionBreakBlocks = this.getPropertyBoolean("explosion-break-blocks", true); - this.vanillaBossBar = this.getPropertyBoolean("vanilla-bossbars", false); - this.stopInGame = this.getPropertyBoolean("stop-in-game", false); - this.opInGame = this.getPropertyBoolean("op-in-game", false); - this.lightUpdates = this.getPropertyBoolean("light-updates", false); - this.queryPlugins = this.getPropertyBoolean("query-plugins", false); - this.flyChecks = this.getPropertyBoolean("allow-flight", false); - this.isHardcore = this.getPropertyBoolean("hardcore", false); - this.despawnMobs = this.getPropertyBoolean("entity-despawn-task", true); - this.forceResources = this.getPropertyBoolean("force-resources", false); - this.whitelistEnabled = this.getPropertyBoolean("white-list", false); - this.checkOpMovement = this.getPropertyBoolean("check-op-movement", false); - this.forceGamemode = this.getPropertyBoolean("force-gamemode", true); - this.doNotLimitInteractions = this.getPropertyBoolean("do-not-limit-interactions", false); - this.motd = this.getPropertyString("motd", "Minecraft Server"); - this.viewDistance = this.getPropertyInt("view-distance", 8); - this.mobDespawnTicks = this.getPropertyInt("ticks-per-entity-despawns", 12000); - this.port = this.getPropertyInt("server-port", 19132); - this.ip = this.getPropertyString("server-ip", "0.0.0.0"); - this.skinChangeCooldown = this.getPropertyInt("skin-change-cooldown", 30); - this.strongIPBans = this.getPropertyBoolean("strong-ip-bans", false); - this.spawnRadius = this.getPropertyInt("spawn-protection", 10); - this.spawnAnimals = this.getPropertyBoolean("spawn-animals", true); - this.spawnMonsters = this.getPropertyBoolean("spawn-mobs", true); - this.autoSaveTicks = this.getPropertyInt("ticks-per-autosave", 6000); - this.doNotLimitSkinGeometry = this.getPropertyBoolean("do-not-limit-skin-geometry", true); - this.anvilsEnabled = this.getPropertyBoolean("anvils-enabled", true); - this.chunksPerTick = this.getPropertyInt("chunk-sending-per-tick", 4); - this.spawnThreshold = this.getPropertyInt("spawn-threshold", 56); - this.savePlayerDataByUuid = this.getPropertyBoolean("save-player-data-by-uuid", true); - this.vanillaPortals = this.getPropertyBoolean("vanilla-portals", true); - this.personaSkins = this.getPropertyBoolean("persona-skins", true); - this.cacheChunks = this.getPropertyBoolean("cache-chunks", false); - this.callEntityMotionEv = this.getPropertyBoolean("call-entity-motion-event", true); - this.updateChecks = this.getPropertyBoolean("update-notifications", true); - this.minimumProtocol = this.getPropertyInt("multiversion-min-protocol", 0); - this.whitelistReason = this.getPropertyString("whitelist-reason", "§cServer is white-listed").replace("§n", "\n"); - this.c_s_spawnThreshold = (int) Math.ceil(Math.sqrt(this.spawnThreshold)); - try { - this.gamemode = this.getPropertyInt("gamemode", 0) & 0b11; - } catch (NumberFormatException exception) { - this.gamemode = getGamemodeFromString(this.getPropertyString("gamemode")) & 0b11; - } - String list = this.getPropertyString("do-not-tick-worlds"); - if (!list.trim().isEmpty()) { - StringTokenizer tokenizer = new StringTokenizer(list, ", "); - while (tokenizer.hasMoreTokens()) { - noTickingWorlds.add(tokenizer.nextToken()); - } - } - } - - /** - * Internal: Warn user about non multiversion compatible plugins. - */ - public static void mvw(String action) { - if (getInstance().minimumProtocol != ProtocolInfo.CURRENT_PROTOCOL) { - if (Nukkit.DEBUG > 1) { - getInstance().getLogger().logException(new PluginException("Default " + action + " used by a plugin. This can cause instability with the multiversion.")); - } else { - getInstance().getLogger().warning("Default " + action + " used by a plugin. This can cause instability with the multiversion."); - } - } - } - - /** - * This class contains all default server.properties values. - */ - private static class ServerProperties extends ConfigSection { - { - put("motd", "Minecraft Server"); - put("sub-motd", "Powered by Nukkit"); - put("server-port", 19132); - put("server-ip", "0.0.0.0"); - put("view-distance", 8); - put("white-list", false); - put("achievements", true); - put("announce-player-achievements", false); - put("spawn-protection", 10); - put("max-players", 50); - put("spawn-animals", true); - put("spawn-mobs", true); - put("gamemode", 0); - put("force-gamemode", true); - put("hardcore", false); - put("pvp", true); - put("difficulty", 2); - put("generator-settings", ""); - put("level-name", "world"); - put("level-seed", ""); - put("level-type", "default"); - put("enable-query", true); - put("enable-rcon", false); - put("rcon.password", Base64.getEncoder().encodeToString(UUID.randomUUID().toString().replace("-", "").getBytes()).substring(3, 13)); - put("auto-save", true); - put("force-resources", false); - put("xbox-auth", true); - put("bed-spawnpoints", true); - put("explosion-break-blocks", true); - put("stop-in-game", false); - put("op-in-game", true); - put("xp-bottles-on-creative", true); - put("spawn-eggs", true); - put("mob-ai", true); - put("entity-auto-spawn-task", true); - put("entity-despawn-task", true); - put("language", "eng"); - put("force-language", false); - put("shutdown-message", "§cServer closed"); - put("save-player-data", true); - put("query-plugins", false); - put("debug-level", 1); - put("async-workers", "auto"); - put("zlib-provider", 2); - put("compression-level", 4); - put("auto-tick-rate", true); - put("auto-tick-rate-limit", 20); - put("base-tick-rate", 1); - put("always-tick-players", false); - put("enable-timings", false); - put("timings-verbose", false); - put("timings-privacy", false); - put("timings-history-interval", 6000); - put("timings-history-length", 72000); - put("timings-bypass-max", false); - put("light-updates", false); - put("clear-chunk-tick-list", true); - put("cache-chunks", false); - put("spawn-threshold", 56); - put("chunk-sending-per-tick", 4); - put("chunk-ticking-per-tick", 40); - put("chunk-ticking-radius", 3); - put("chunk-generation-queue-size", 8); - put("chunk-generation-population-queue-size", 8); - put("ticks-per-autosave", 6000); - put("ticks-per-entity-spawns", 200); - put("ticks-per-entity-despawns", 12000); - put("thread-watchdog", true); - put("thread-watchdog-tick", 60000); - put("nether", true); - put("end", false); - put("suomicraft-mode", false); - put("do-not-tick-worlds", ""); - put("load-all-worlds", true); - put("ansi-title", true); - put("worlds-entity-spawning-disabled", ""); - put("block-listener", true); - put("allow-flight", false); - put("timeout-milliseconds", 25000); - put("multiversion-min-protocol", 0); - put("vanilla-bossbars", false); - put("dimensions", true); - put("whitelist-reason", "§cServer is white-listed"); - put("chemistry-resources-enabled", false); - put("strong-ip-bans", false); - put("worlds-level-auto-save-disabled", ""); - put("temp-ip-ban-failed-xbox-auth", false); - put("call-data-pk-send-event", true); - put("call-batch-pk-send-event", true); - put("do-level-gc", true); - put("skin-change-cooldown", 30); - put("check-op-movement", false); - put("do-not-limit-interactions", false); - put("do-not-limit-skin-geometry", true); - put("automatic-bug-report", true); - put("anvils-enabled", true); - put("save-player-data-by-uuid", true); - put("vanilla-portals", true); - put("persona-skins", true); - put("multi-nether-worlds", ""); - put("call-entity-motion-event", true); - put("update-notifications", true); - put("bstats-metrics", true); - put("min-mtu", 576); - put("max-mtu", 1492); - } - } - - private class ConsoleThread extends Thread implements InterruptibleThread { - - @Override - public void run() { - console.start(); - } - } -} diff --git a/src/main/java/cn/nukkit/api/API.java b/src/main/java/cn/nukkit/api/API.java deleted file mode 100644 index 9276ee5bb..000000000 --- a/src/main/java/cn/nukkit/api/API.java +++ /dev/null @@ -1,130 +0,0 @@ -package cn.nukkit.api; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import static cn.nukkit.api.API.Definition.UNIVERSAL; -import static cn.nukkit.api.API.Usage.BLEEDING; - -/** - * Describes an API element. - * - * @author Lin Mulan, Nukkit Project - * @see Usage - * @see Definition - */ -@Retention(RetentionPolicy.SOURCE) -@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.TYPE}) -@API(usage = BLEEDING, definition = UNIVERSAL) -@SuppressWarnings("unused") -public @interface API { - - /** - * Indicates the level of stability of an API element. - * The stability also describes when to use this API element. - * - * @return The stability - * @see Usage - */ - Usage usage(); - - /** - * Indicates definition or the platforms this API element supports. - * - * @return The definition - * @see Definition - */ - Definition definition(); - - /** - * Enum constant for API usage. Indicates when to use this API element. - * - * @see #DEPRECATED - * @see #INCUBATING - * @see #BLEEDING - * @see #EXPERIMENTAL - * @see #MAINTAINED - * @see #STABLE - */ - enum Usage { - - /** - * Should no longer be used, might disappear in the next minor release. - */ - DEPRECATED, - - /** - * Intended for features in drafts. Should only be used for tests. - * - *

Might contains notable new features, but will be moved to a new package before remarking to {@link #BLEEDING}. - * Could be unsafe, might be removed without prior notice. Warnings will be send if used. - */ - INCUBATING, - - /** - * Intended for features in early development. Should only be used for tests. - * - *

Might be unwrapped, unsafe or have unchecked parameters. - * Further contribution was demanded to enhance, strengthen or simplify before remarking to {@link #EXPERIMENTAL}. - * Might be removed or modified without prior notice. - */ - BLEEDING, - - /** - * Intended for new, experimental features where we are looking for feedback. - * At least stable for development. - * - *

Use with caution, might be remarked to {@link #MAINTAINED} or {@link #STABLE} in the future, - * but also might be removed without prior notice. - */ - EXPERIMENTAL, - - /** - * Intended for features that was tested, documented and at least stable for production use. - * - *

These features will not be modified in a backwards-incompatible way for at least next minor release - * of the current major version. Will be remarked to {@link #DEPRECATED} first if scheduled for removal. - */ - MAINTAINED, - - /** - * Intended for features that was tested, documented and is preferred in production use. - * - *

Will not be changed in a backwards-incompatible way in the current version. - */ - STABLE - } - - /** - * Enum constant for API definition. Indicates which client platform this API element supports. - * - * @see #INTERNAL - * @see #PLATFORM_NATIVE - * @see #UNIVERSAL - */ - enum Definition { - - /** - * Intended for features should only be used by Nukkit itself. - * Should not be used in production. - */ - INTERNAL, - - /** - * Intended for features only available on one or several client platforms. - * - *

By using {@code PLATFORM_NATIVE} features, program will lose some cross-platform features provided. - * Might not available in some client platforms. Read the documents carefully before using this API element. - */ - PLATFORM_NATIVE, - - /** - * Intended for features implemented in all client platforms. - * - *

Preferred to use for production use, but sometimes be lack of platform-native features. - */ - UNIVERSAL - } -} diff --git a/src/main/java/cn/nukkit/block/Block.java b/src/main/java/cn/nukkit/block/Block.java deleted file mode 100644 index 159faaffc..000000000 --- a/src/main/java/cn/nukkit/block/Block.java +++ /dev/null @@ -1,1000 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.Level; -import cn.nukkit.level.MovingObjectPosition; -import cn.nukkit.level.Position; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.metadata.MetadataValue; -import cn.nukkit.metadata.Metadatable; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.BlockColor; - -import java.lang.reflect.Constructor; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Block extends Position implements Metadatable, Cloneable, BlockID { - - @SuppressWarnings("rawtypes") - public static Class[] list = null; - public static Block[] fullList = null; - public static int[] light = null; - public static int[] lightFilter = null; - public static boolean[] solid = null; - public static double[] hardness = null; - public static boolean[] transparent = null; - public AxisAlignedBB boundingBox = null; - public AxisAlignedBB collisionBoundingBox = null; - public static boolean[] hasMeta = null; - - protected Block() {} - - @SuppressWarnings("unchecked") - public static void init() { - if (list == null) { - list = new Class[256]; - fullList = new Block[4096]; - light = new int[256]; - lightFilter = new int[256]; - solid = new boolean[256]; - hardness = new double[256]; - transparent = new boolean[256]; - hasMeta = new boolean[256]; - - list[AIR] = BlockAir.class; //0 - list[STONE] = BlockStone.class; //1 - list[GRASS] = BlockGrass.class; //2 - list[DIRT] = BlockDirt.class; //3 - list[COBBLESTONE] = BlockCobblestone.class; //4 - list[PLANKS] = BlockPlanks.class; //5 - list[SAPLING] = BlockSapling.class; //6 - list[BEDROCK] = BlockBedrock.class; //7 - list[WATER] = BlockWater.class; //8 - list[STILL_WATER] = BlockWaterStill.class; //9 - list[LAVA] = BlockLava.class; //10 - list[STILL_LAVA] = BlockLavaStill.class; //11 - list[SAND] = BlockSand.class; //12 - list[GRAVEL] = BlockGravel.class; //13 - list[GOLD_ORE] = BlockOreGold.class; //14 - list[IRON_ORE] = BlockOreIron.class; //15 - list[COAL_ORE] = BlockOreCoal.class; //16 - list[WOOD] = BlockWood.class; //17 - list[LEAVES] = BlockLeaves.class; //18 - list[SPONGE] = BlockSponge.class; //19 - list[GLASS] = BlockGlass.class; //20 - list[LAPIS_ORE] = BlockOreLapis.class; //21 - list[LAPIS_BLOCK] = BlockLapis.class; //22 - list[DISPENSER] = BlockDispenser.class; //23 - list[SANDSTONE] = BlockSandstone.class; //24 - list[NOTEBLOCK] = BlockNoteblock.class; //25 - list[BED_BLOCK] = BlockBed.class; //26 - list[POWERED_RAIL] = BlockRailPowered.class; //27 - list[DETECTOR_RAIL] = BlockRailDetector.class; //28 - list[STICKY_PISTON] = BlockPistonSticky.class; //29 - list[COBWEB] = BlockCobweb.class; //30 - list[TALL_GRASS] = BlockTallGrass.class; //31 - list[DEAD_BUSH] = BlockDeadBush.class; //32 - list[PISTON] = BlockPiston.class; //33 - list[PISTON_HEAD] = BlockPistonHead.class; //34 - list[WOOL] = BlockWool.class; //35 - list[DANDELION] = BlockDandelion.class; //37 - list[FLOWER] = BlockFlower.class; //38 - list[BROWN_MUSHROOM] = BlockMushroomBrown.class; //39 - list[RED_MUSHROOM] = BlockMushroomRed.class; //40 - list[GOLD_BLOCK] = BlockGold.class; //41 - list[IRON_BLOCK] = BlockIron.class; //42 - list[DOUBLE_STONE_SLAB] = BlockDoubleSlabStone.class; //43 - list[STONE_SLAB] = BlockSlabStone.class; //44 - list[BRICKS_BLOCK] = BlockBricks.class; //45 - list[TNT] = BlockTNT.class; //46 - list[BOOKSHELF] = BlockBookshelf.class; //47 - list[MOSS_STONE] = BlockMossStone.class; //48 - list[OBSIDIAN] = BlockObsidian.class; //49 - list[TORCH] = BlockTorch.class; //50 - list[FIRE] = BlockFire.class; //51 - list[MONSTER_SPAWNER] = BlockMobSpawner.class; //52 - list[WOOD_STAIRS] = BlockStairsWood.class; //53 - list[CHEST] = BlockChest.class; //54 - list[REDSTONE_WIRE] = BlockRedstoneWire.class; //55 - list[DIAMOND_ORE] = BlockOreDiamond.class; //56 - list[DIAMOND_BLOCK] = BlockDiamond.class; //57 - list[WORKBENCH] = BlockCraftingTable.class; //58 - list[WHEAT_BLOCK] = BlockWheat.class; //59 - list[FARMLAND] = BlockFarmland.class; //60 - list[FURNACE] = BlockFurnace.class; //61 - list[BURNING_FURNACE] = BlockFurnaceBurning.class; //62 - list[SIGN_POST] = BlockSignPost.class; //63 - list[WOOD_DOOR_BLOCK] = BlockDoorWood.class; //64 - list[LADDER] = BlockLadder.class; //65 - list[RAIL] = BlockRail.class; //66 - list[COBBLESTONE_STAIRS] = BlockStairsCobblestone.class; //67 - list[WALL_SIGN] = BlockWallSign.class; //68 - list[LEVER] = BlockLever.class; //69 - list[STONE_PRESSURE_PLATE] = BlockPressurePlateStone.class; //70 - list[IRON_DOOR_BLOCK] = BlockDoorIron.class; //71 - list[WOODEN_PRESSURE_PLATE] = BlockPressurePlateWood.class; //72 - list[REDSTONE_ORE] = BlockOreRedstone.class; //73 - list[GLOWING_REDSTONE_ORE] = BlockOreRedstoneGlowing.class; //74 - list[UNLIT_REDSTONE_TORCH] = BlockRedstoneTorchUnlit.class; - list[REDSTONE_TORCH] = BlockRedstoneTorch.class; //76 - list[STONE_BUTTON] = BlockButtonStone.class; //77 - list[SNOW_LAYER] = BlockSnowLayer.class; //78 - list[ICE] = BlockIce.class; //79 - list[SNOW_BLOCK] = BlockSnow.class; //80 - list[CACTUS] = BlockCactus.class; //81 - list[CLAY_BLOCK] = BlockClay.class; //82 - list[SUGARCANE_BLOCK] = BlockSugarcane.class; //83 - list[JUKEBOX] = BlockJukebox.class; //84 - list[FENCE] = BlockFence.class; //85 - list[PUMPKIN] = BlockPumpkin.class; //86 - list[NETHERRACK] = BlockNetherrack.class; //87 - list[SOUL_SAND] = BlockSoulSand.class; //88 - list[GLOWSTONE_BLOCK] = BlockGlowstone.class; //89 - list[NETHER_PORTAL] = BlockNetherPortal.class; //90 - list[LIT_PUMPKIN] = BlockPumpkinLit.class; //91 - list[CAKE_BLOCK] = BlockCake.class; //92 - list[UNPOWERED_REPEATER] = BlockRedstoneRepeaterUnpowered.class; //93 - list[POWERED_REPEATER] = BlockRedstoneRepeaterPowered.class; //94 - list[INVISIBLE_BEDROCK] = BlockBedrockInvisible.class; //95 - list[TRAPDOOR] = BlockTrapdoor.class; //96 - list[MONSTER_EGG] = BlockMonsterEgg.class; //97 - list[STONE_BRICKS] = BlockBricksStone.class; //98 - list[BROWN_MUSHROOM_BLOCK] = BlockHugeMushroomBrown.class; //99 - list[RED_MUSHROOM_BLOCK] = BlockHugeMushroomRed.class; //100 - list[IRON_BARS] = BlockIronBars.class; //101 - list[GLASS_PANE] = BlockGlassPane.class; //102 - list[MELON_BLOCK] = BlockMelon.class; //103 - list[PUMPKIN_STEM] = BlockStemPumpkin.class; //104 - list[MELON_STEM] = BlockStemMelon.class; //105 - list[VINE] = BlockVine.class; //106 - list[FENCE_GATE] = BlockFenceGate.class; //107 - list[BRICK_STAIRS] = BlockStairsBrick.class; //108 - list[STONE_BRICK_STAIRS] = BlockStairsStoneBrick.class; //109 - list[MYCELIUM] = BlockMycelium.class; //110 - list[WATER_LILY] = BlockWaterLily.class; //111 - list[NETHER_BRICKS] = BlockBricksNether.class; //112 - list[NETHER_BRICK_FENCE] = BlockFenceNetherBrick.class; //113 - list[NETHER_BRICKS_STAIRS] = BlockStairsNetherBrick.class; //114 - list[NETHER_WART_BLOCK] = BlockNetherWart.class; //115 - list[ENCHANTING_TABLE] = BlockEnchantingTable.class; //116 - list[BREWING_STAND_BLOCK] = BlockBrewingStand.class; //117 - list[CAULDRON_BLOCK] = BlockCauldron.class; //118 - list[END_PORTAL] = BlockEndPortal.class; //119 - list[END_PORTAL_FRAME] = BlockEndPortalFrame.class; //120 - list[END_STONE] = BlockEndStone.class; //121 - list[DRAGON_EGG] = BlockDragonEgg.class; //122 - list[REDSTONE_LAMP] = BlockRedstoneLamp.class; //123 - list[LIT_REDSTONE_LAMP] = BlockRedstoneLampLit.class; //124 - list[DROPPER] = BlockDropper.class; //125 - list[ACTIVATOR_RAIL] = BlockRailActivator.class; //126 - list[COCOA] = BlockCocoa.class; //127 - list[SANDSTONE_STAIRS] = BlockStairsSandstone.class; //128 - list[EMERALD_ORE] = BlockOreEmerald.class; //129 - list[ENDER_CHEST] = BlockEnderChest.class; //130 - list[TRIPWIRE_HOOK] = BlockTripWireHook.class; - list[TRIPWIRE] = BlockTripWire.class; //132 - list[EMERALD_BLOCK] = BlockEmerald.class; //133 - list[SPRUCE_WOOD_STAIRS] = BlockStairsSpruce.class; //134 - list[BIRCH_WOOD_STAIRS] = BlockStairsBirch.class; //135 - list[JUNGLE_WOOD_STAIRS] = BlockStairsJungle.class; //136 - list[COMMAND_BLOCK] = BlockCommandBlock.class; //137 - list[BEACON] = BlockBeacon.class; //138 - list[STONE_WALL] = BlockWall.class; //139 - list[FLOWER_POT_BLOCK] = BlockFlowerPot.class; //140 - list[CARROT_BLOCK] = BlockCarrot.class; //141 - list[POTATO_BLOCK] = BlockPotato.class; //142 - list[WOODEN_BUTTON] = BlockButtonWooden.class; //143 - list[SKULL_BLOCK] = BlockSkull.class; //144 - list[ANVIL] = BlockAnvil.class; //145 - list[TRAPPED_CHEST] = BlockTrappedChest.class; //146 - list[LIGHT_WEIGHTED_PRESSURE_PLATE] = BlockWeightedPressurePlateLight.class; //147 - list[HEAVY_WEIGHTED_PRESSURE_PLATE] = BlockWeightedPressurePlateHeavy.class; //148 - list[UNPOWERED_COMPARATOR] = BlockRedstoneComparatorUnpowered.class; //149 - list[POWERED_COMPARATOR] = BlockRedstoneComparatorPowered.class; //149 - list[DAYLIGHT_DETECTOR] = BlockDaylightDetector.class; //151 - list[REDSTONE_BLOCK] = BlockRedstone.class; //152 - list[QUARTZ_ORE] = BlockOreQuartz.class; //153 - list[HOPPER_BLOCK] = BlockHopper.class; //154 - list[QUARTZ_BLOCK] = BlockQuartz.class; //155 - list[QUARTZ_STAIRS] = BlockStairsQuartz.class; //156 - list[DOUBLE_WOOD_SLAB] = BlockDoubleSlabWood.class; //157 - list[WOOD_SLAB] = BlockSlabWood.class; //158 - list[STAINED_TERRACOTTA] = BlockTerracottaStained.class; //159 - list[STAINED_GLASS_PANE] = BlockGlassPaneStained.class; //160 - list[LEAVES2] = BlockLeaves2.class; //161 - list[WOOD2] = BlockWood2.class; //162 - list[ACACIA_WOOD_STAIRS] = BlockStairsAcacia.class; //163 - list[DARK_OAK_WOOD_STAIRS] = BlockStairsDarkOak.class; //164 - list[SLIME_BLOCK] = BlockSlime.class; //165 - list[GLOW_STICK] = BlockGlowStick.class; //166 - list[IRON_TRAPDOOR] = BlockTrapdoorIron.class; //167 - list[PRISMARINE] = BlockPrismarine.class; //168 - list[SEA_LANTERN] = BlockSeaLantern.class; //169 - list[HAY_BALE] = BlockHayBale.class; //170 - list[CARPET] = BlockCarpet.class; //171 - list[TERRACOTTA] = BlockTerracotta.class; //172 - list[COAL_BLOCK] = BlockCoal.class; //173 - list[PACKED_ICE] = BlockIcePacked.class; //174 - list[DOUBLE_PLANT] = BlockDoublePlant.class; //175 - list[STANDING_BANNER] = BlockBanner.class; //176 - list[WALL_BANNER] = BlockWallBanner.class; //177 - list[DAYLIGHT_DETECTOR_INVERTED] = BlockDaylightDetectorInverted.class; //178 - list[RED_SANDSTONE] = BlockRedSandstone.class; //179 - list[RED_SANDSTONE_STAIRS] = BlockStairsRedSandstone.class; //180 - list[DOUBLE_RED_SANDSTONE_SLAB] = BlockDoubleSlabRedSandstone.class; //181 - list[RED_SANDSTONE_SLAB] = BlockSlabRedSandstone.class; //182 - list[FENCE_GATE_SPRUCE] = BlockFenceGateSpruce.class; //183 - list[FENCE_GATE_BIRCH] = BlockFenceGateBirch.class; //184 - list[FENCE_GATE_JUNGLE] = BlockFenceGateJungle.class; //185 - list[FENCE_GATE_DARK_OAK] = BlockFenceGateDarkOak.class; //186 - list[FENCE_GATE_ACACIA] = BlockFenceGateAcacia.class; //187 - list[REPEATING_COMMAND_BLOCK] = BlockCommandBlockRepeating.class; //188 - list[CHAIN_COMMAND_BLOCK] = BlockCommandBlockChain.class; //189 - list[HARD_GLASS_PANE] = BlockHardGlassPane.class; //190 - list[HARD_STAINED_GLASS_PANE] = BlockHardGlassPaneStained.class; //191 - list[CHEMICAL_HEAT] = BlockChemicalHeat.class; //192 - list[SPRUCE_DOOR_BLOCK] = BlockDoorSpruce.class; //193 - list[BIRCH_DOOR_BLOCK] = BlockDoorBirch.class; //194 - list[JUNGLE_DOOR_BLOCK] = BlockDoorJungle.class; //195 - list[ACACIA_DOOR_BLOCK] = BlockDoorAcacia.class; //196 - list[DARK_OAK_DOOR_BLOCK] = BlockDoorDarkOak.class; //197 - list[GRASS_PATH] = BlockGrassPath.class; //198 - list[ITEM_FRAME_BLOCK] = BlockItemFrame.class; //199 - list[CHORUS_FLOWER] = BlockChorusFlower.class; //200 - list[PURPUR_BLOCK] = BlockPurpur.class; //201 - list[COLORED_TORCH_RG] = BlockColoredTorchRG.class; //202 - list[PURPUR_STAIRS] = BlockStairsPurpur.class; //203 - list[COLORED_TORCH_BP] = BlockColoredTorchBP.class; //204 - list[UNDYED_SHULKER_BOX] = BlockUndyedShulkerBox.class; //205 - list[END_BRICKS] = BlockBricksEndStone.class; //206 - list[FROSTED_ICE] = BlockIceFrosted.class; //207 - list[END_ROD] = BlockEndRod.class; //208 - list[END_GATEWAY] = BlockEndGateway.class; //209 - // 210 Allow in Education Edition - // 211 Deny in Education Edition - // 212 Border in Education Edition - list[MAGMA] = BlockMagma.class; //213 - list[BLOCK_NETHER_WART_BLOCK] = BlockNetherWartBlock.class; //214 - list[RED_NETHER_BRICK] = BlockBricksRedNether.class; //215 - list[BONE_BLOCK] = BlockBone.class; //216 - // 217 not yet in Minecraft - list[SHULKER_BOX] = BlockShulkerBox.class; //218 - list[PURPLE_GLAZED_TERRACOTTA] = BlockTerracottaGlazedPurple.class; //219 - list[WHITE_GLAZED_TERRACOTTA] = BlockTerracottaGlazedWhite.class; //220 - list[ORANGE_GLAZED_TERRACOTTA] = BlockTerracottaGlazedOrange.class; //221 - list[MAGENTA_GLAZED_TERRACOTTA] = BlockTerracottaGlazedMagenta.class; //222 - list[LIGHT_BLUE_GLAZED_TERRACOTTA] = BlockTerracottaGlazedLightBlue.class; //223 - list[YELLOW_GLAZED_TERRACOTTA] = BlockTerracottaGlazedYellow.class; //224 - list[LIME_GLAZED_TERRACOTTA] = BlockTerracottaGlazedLime.class; //225 - list[PINK_GLAZED_TERRACOTTA] = BlockTerracottaGlazedPink.class; //226 - list[GRAY_GLAZED_TERRACOTTA] = BlockTerracottaGlazedGray.class; //227 - list[SILVER_GLAZED_TERRACOTTA] = BlockTerracottaGlazedSilver.class; //228 - list[CYAN_GLAZED_TERRACOTTA] = BlockTerracottaGlazedCyan.class; //229 - // 230 Chalkboard in Education Edition - list[BLUE_GLAZED_TERRACOTTA] = BlockTerracottaGlazedBlue.class; //231 - list[BROWN_GLAZED_TERRACOTTA] = BlockTerracottaGlazedBrown.class; //232 - list[GREEN_GLAZED_TERRACOTTA] = BlockTerracottaGlazedGreen.class; //233 - list[RED_GLAZED_TERRACOTTA] = BlockTerracottaGlazedRed.class; //234 - list[BLACK_GLAZED_TERRACOTTA] = BlockTerracottaGlazedBlack.class; //235 - list[CONCRETE] = BlockConcrete.class; //236 - list[CONCRETE_POWDER] = BlockConcretePowder.class; //237 - list[CHEMISTRY_TABLE] = BlockChemistryTable.class; //238 - list[UNDERWATER_TORCH] = BlockUnderwaterTorch.class; //239 - list[CHORUS_PLANT] = BlockChorusPlant.class; //240 - list[STAINED_GLASS] = BlockGlassStained.class; //241 - // 242 Camera in Education Edition - list[PODZOL] = BlockPodzol.class; //243 - list[BEETROOT_BLOCK] = BlockBeetroot.class; //244 - list[STONECUTTER] = BlockStonecutter.class; //244 - list[GLOWING_OBSIDIAN] = BlockObsidianGlowing.class; //246 - list[NETHER_REACTOR] = BlockNetherReactor.class; //247 - list[INFO_UPDATE] = BlockInfoUpdate.class; //248 - list[INFO_UPDATE2] = BlockInfoUpdate2.class; //249 - list[PISTON_EXTENSION] = BlockPistonExtension.class; //250 - list[OBSERVER] = BlockObserver.class; //251 - list[STRUCTURE_BLOCK] = BlockStructureBlock.class; //252 - list[HARD_GLASS] = BlockHardGlass.class; //253 - list[HARD_STAINED_GLASS] = BlockHardGlassStained.class; //254 - list[RESERVED6] = BlockReserved6.class; //255 - - for (int id = 0; id < 256; id++) { - Class c = list[id]; - if (c != null) { - Block block; - try { - block = (Block) c.newInstance(); - try { - @SuppressWarnings("rawtypes") - Constructor constructor = c.getDeclaredConstructor(int.class); - constructor.setAccessible(true); - for (int data = 0; data < 16; ++data) { - fullList[(id << 4) | data] = (Block) constructor.newInstance(data); - } - hasMeta[id] = true; - } catch (NoSuchMethodException ignore) { - for (int data = 0; data < 16; ++data) { - fullList[(id << 4) | data] = block; - } - } - } catch (Exception e) { - Server.getInstance().getLogger().error("Error while registering " + c.getName(), e); - for (int data = 0; data < 16; ++data) { - fullList[(id << 4) | data] = new BlockUnknown(id, data); - } - return; - } - - solid[id] = block.isSolid(); - transparent[id] = block.isTransparent(); - hardness[id] = block.getHardness(); - light[id] = block.getLightLevel(); - - if (block.isSolid()) { - if (block.isTransparent()) { - if (block instanceof BlockLiquid || block instanceof BlockIce) { - lightFilter[id] = 2; - } else { - lightFilter[id] = 1; - } - } else { - lightFilter[id] = 15; - } - } else { - lightFilter[id] = 1; - } - } else { - lightFilter[id] = 1; - for (int data = 0; data < 16; ++data) { - fullList[(id << 4) | data] = new BlockUnknown(id, data); - } - } - } - } - } - - public static Block get(int id) { - return fullList[id << 4].clone(); - } - - public static Block get(int id, Integer meta) { - if (meta != null) { - return fullList[(id << 4) + meta].clone(); - } else { - return fullList[id << 4].clone(); - } - } - - public static Block get(int id, Integer meta, Position pos) { - Block block = fullList[(id << 4) | (meta == null ? 0 : meta)].clone(); - if (pos != null) { - block.x = pos.x; - block.y = pos.y; - block.z = pos.z; - block.level = pos.level; - } - return block; - } - - public static Block get(int id, int data) { - return fullList[(id << 4) + data].clone(); - } - - public static Block get(int fullId, Level level, int x, int y, int z) { - Block block = fullList[fullId].clone(); - block.x = x; - block.y = y; - block.z = z; - block.level = level; - return block; - } - - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - return this.getLevel().setBlock(this, this, true, true); - } - - public boolean canHarvestWithHand() { - return true; - } - - public boolean isBreakable(Item item) { - return true; - } - - public int tickRate() { - return 10; - } - - public boolean onBreak(Item item, Player player) { - return this.onBreak(item); - } - - public boolean onBreak(Item item) { - return this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - } - - public int onUpdate(int type) { - return 0; - } - - public boolean onActivate(Item item) { - return this.onActivate(item, null); - } - - public boolean onActivate(Item item, Player player) { - return false; - } - - public double getHardness() { - return 10; - } - - public double getResistance() { - return 1; - } - - public int getBurnChance() { - return 0; - } - - public int getBurnAbility() { - return 0; - } - - public int getToolType() { - return ItemTool.TYPE_NONE; - } - - public double getFrictionFactor() { - return 0.6; - } - - public int getLightLevel() { - return 0; - } - - public boolean canBePlaced() { - return true; - } - - public boolean canBeReplaced() { - return false; - } - - public boolean isTransparent() { - return false; - } - - public boolean isSolid() { - return true; - } - - public boolean canBeFlowedInto() { - return false; - } - - public boolean canBeActivated() { - return false; - } - - public boolean hasEntityCollision() { - return false; - } - - public boolean canPassThrough() { - return false; - } - - public boolean canBePushed() { - return this.level.getBlockEntity(this) == null; - } - - public boolean breakWhenPushed() { - return false; - } - - public boolean hasComparatorInputOverride() { - return false; - } - - public int getComparatorInputOverride() { - return 0; - } - - public boolean canBeClimbed() { - return false; - } - - public BlockColor getColor() { - return BlockColor.VOID_BLOCK_COLOR; - } - - public abstract String getName(); - - public abstract int getId(); - - /** - * The full id is a combination of the id and data. - * @return full id - */ - public int getFullId() { - return (getId() << 4); - } - - public void addVelocityToEntity(Entity entity, Vector3 vector) { - - } - - public int getDamage() { - return 0; - } - - public void setDamage(int meta) { - } - - public final void setDamage(Integer meta) { - setDamage((meta == null ? 0 : meta & 0x0f)); - } - - final public void position(Position v) { - this.x = (int) v.x; - this.y = (int) v.y; - this.z = (int) v.z; - this.level = v.level; - this.boundingBox = null; - } - - public Item[] getDrops(Item item) { - if (this.getId() < 0 || this.getId() > list.length) { - return new Item[0]; - } else { - return new Item[]{ - this.toItem() - }; - } - } - - private static double toolBreakTimeBonus0(int toolType, int toolTier, int blockId) { - if (toolType == ItemTool.TYPE_NONE) return 1.0; - if (toolType == ItemTool.TYPE_SWORD) return blockId == Block.COBWEB ? 15.0 : 1.0; - if (toolType == ItemTool.TYPE_SHEARS) { - if (blockId == Block.WOOL || blockId == LEAVES || blockId == LEAVES2) { - return 5.0; - } else if (blockId == COBWEB) { - return 15.0; - } - return 1.0; - } - switch (toolTier) { - case ItemTool.TIER_WOODEN: - return 2.0; - case ItemTool.TIER_STONE: - return 4.0; - case ItemTool.TIER_IRON: - return 6.0; - case ItemTool.TIER_DIAMOND: - return 8.0; - case ItemTool.TIER_NETHERITE: - return 9.0; - case ItemTool.TIER_GOLD: - return 12.0; - default: - return 1.0; - } - } - - private static double speedBonusByEfficiencyLore0(int efficiencyLoreLevel) { - if (efficiencyLoreLevel == 0) return 0; - return efficiencyLoreLevel * efficiencyLoreLevel + 1; - } - - private static double speedRateByHasteLore0(int hasteLoreLevel) { - return 1.0 + (0.2 * hasteLoreLevel); - } - - private static int toolType0(Item item) { - if (item.isSword()) return ItemTool.TYPE_SWORD; - if (item.isShovel()) return ItemTool.TYPE_SHOVEL; - if (item.isPickaxe()) return ItemTool.TYPE_PICKAXE; - if (item.isAxe()) return ItemTool.TYPE_AXE; - if (item.isHoe()) return ItemTool.TYPE_HOE; - if (item.isShears()) return ItemTool.TYPE_SHEARS; - return ItemTool.TYPE_NONE; - } - - private static boolean correctTool0(int blockToolType, Item item) { - return (blockToolType == ItemTool.TYPE_SWORD && item.isSword()) || - (blockToolType == ItemTool.TYPE_SHOVEL && item.isShovel()) || - (blockToolType == ItemTool.TYPE_PICKAXE && item.isPickaxe()) || - (blockToolType == ItemTool.TYPE_AXE && item.isAxe()) || - (blockToolType == ItemTool.TYPE_HOE && item.isHoe()) || - (blockToolType == ItemTool.TYPE_SHEARS && item.isShears()) || - blockToolType == ItemTool.TYPE_NONE; - } - - private static double breakTime0(double blockHardness, boolean correctTool, boolean canHarvestWithHand, - int blockId, int toolType, int toolTier, int efficiencyLoreLevel, int hasteEffectLevel, - boolean insideOfWaterWithoutAquaAffinity, boolean outOfWaterButNotOnGround) { - double baseTime = ((correctTool || canHarvestWithHand) ? 1.5 : 5.0) * blockHardness; - double speed = 1.0 / baseTime; - if (correctTool) speed *= toolBreakTimeBonus0(toolType, toolTier, blockId); - speed += correctTool ? speedBonusByEfficiencyLore0(efficiencyLoreLevel) : 0; - speed *= speedRateByHasteLore0(hasteEffectLevel); - if (insideOfWaterWithoutAquaAffinity || outOfWaterButNotOnGround) speed *= 0.25; - return 1.0 / speed; - } - - public double getBreakTime(Item item, Player player) { - Objects.requireNonNull(item, "getBreakTime: Item can not be null"); - Objects.requireNonNull(player, "getBreakTime: Player can not be null"); - double blockHardness = getHardness(); - if (blockHardness == 0) { - return 0; - } - int blockId = getId(); - boolean correctTool = correctTool0(getToolType(), item) || item.isShears() && (blockId == COBWEB || blockId == LEAVES || blockId == LEAVES2); - boolean canHarvestWithHand = canHarvestWithHand(); - int itemToolType = toolType0(item); - int itemTier = item.getTier(); - int efficiencyLoreLevel = Optional.ofNullable(item.getEnchantment(Enchantment.ID_EFFICIENCY)) - .map(Enchantment::getLevel).orElse(0); - int hasteEffectLevel = Optional.ofNullable(player.getEffect(Effect.HASTE)) - .map(Effect::getAmplifier).orElse(0); - boolean submerged = player.isSubmerged(); - boolean insideOfWaterWithoutAquaAffinity = submerged && - Optional.ofNullable(player.getInventory().getHelmetFast().getEnchantment(Enchantment.ID_WATER_WORKER)) - .map(Enchantment::getLevel).map(l -> l >= 1).orElse(false); - boolean outOfWaterButNotOnGround = !player.isOnGround() && !submerged; - return breakTime0(blockHardness, correctTool, canHarvestWithHand, blockId, itemToolType, itemTier, - efficiencyLoreLevel, hasteEffectLevel, insideOfWaterWithoutAquaAffinity, outOfWaterButNotOnGround); - } - - public double getBreakTime(Item item) { - double base = this.getHardness() * 1.5; - if (this.canBeBrokenWith(item)) { - if (this.getToolType() == ItemTool.TYPE_SHEARS && item.isShears()) { - base /= 15; - } else if ( - (this.getToolType() == ItemTool.TYPE_PICKAXE && item.isPickaxe()) || - (this.getToolType() == ItemTool.TYPE_AXE && item.isAxe()) || - (this.getToolType() == ItemTool.TYPE_SHOVEL && item.isShovel()) || - (this.getToolType() == ItemTool.TYPE_HOE && item.isHoe()) - ) { - switch (item.getTier()) { - case ItemTool.TIER_WOODEN: - base /= 2; - break; - case ItemTool.TIER_STONE: - base /= 4; - break; - case ItemTool.TIER_IRON: - base /= 6; - break; - case ItemTool.TIER_DIAMOND: - base /= 8; - break; - case ItemTool.TIER_NETHERITE: - base /= 9; - break; - case ItemTool.TIER_GOLD: - base /= 12; - break; - } - } - } else { - base *= 3.33; - } - - if (item.isSword()) { - base *= 0.5; - } - - return base; - } - - public boolean canBeBrokenWith(Item item) { - return this.getHardness() != -1; - } - - public Block getSide(BlockFace face) { - return this.getSide(face, 1); - } - - public Block getSide(BlockFace face, int step) { - if (this.isValid()) { - return this.getLevel().getBlock(super.getSide(face, step)); - } - return Block.get(Item.AIR, 0, Position.fromObject(new Vector3(this.x, this.y, this.z).getSide(face, step))); - } - - public Block up() { - return up(1); - } - - public Block up(int step) { - return getSide(BlockFace.UP, step); - } - - public Block down() { - return down(1); - } - - public Block down(int step) { - return getSide(BlockFace.DOWN, step); - } - - public Block north() { - return north(1); - } - - public Block north(int step) { - return getSide(BlockFace.NORTH, step); - } - - public Block south() { - return south(1); - } - - public Block south(int step) { - return getSide(BlockFace.SOUTH, step); - } - - public Block east() { - return east(1); - } - - public Block east(int step) { - return getSide(BlockFace.EAST, step); - } - - public Block west() { - return west(1); - } - - public Block west(int step) { - return getSide(BlockFace.WEST, step); - } - - @Override - public String toString() { - return "Block[" + this.getName() + "] (" + this.getId() + ':' + this.getDamage() + ')'; - } - - public boolean collidesWithBB(AxisAlignedBB bb) { - return collidesWithBB(bb, false); - } - - public boolean collidesWithBB(AxisAlignedBB bb, boolean collisionBB) { - AxisAlignedBB bb1 = collisionBB ? this.getCollisionBoundingBox() : this.getBoundingBox(); - return bb1 != null && bb.intersectsWith(bb1); - } - - public void onEntityCollide(Entity entity) { - } - - public AxisAlignedBB getBoundingBox() { - if (this.boundingBox == null) { - this.boundingBox = this.recalculateBoundingBox(); - } - return this.boundingBox; - } - - public AxisAlignedBB getCollisionBoundingBox() { - if (this.collisionBoundingBox == null) { - this.collisionBoundingBox = this.recalculateCollisionBoundingBox(); - } - return this.collisionBoundingBox; - } - - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - - protected AxisAlignedBB recalculateCollisionBoundingBox() { - return getBoundingBox(); - } - - public MovingObjectPosition calculateIntercept(Vector3 pos1, Vector3 pos2) { - AxisAlignedBB bb = this.getBoundingBox(); - if (bb == null) { - return null; - } - - Vector3 v1 = pos1.getIntermediateWithXValue(pos2, bb.minX); - Vector3 v2 = pos1.getIntermediateWithXValue(pos2, bb.maxX); - Vector3 v3 = pos1.getIntermediateWithYValue(pos2, bb.minY); - Vector3 v4 = pos1.getIntermediateWithYValue(pos2, bb.maxY); - Vector3 v5 = pos1.getIntermediateWithZValue(pos2, bb.minZ); - Vector3 v6 = pos1.getIntermediateWithZValue(pos2, bb.maxZ); - - if (v1 != null && !bb.isVectorInYZ(v1)) { - v1 = null; - } - - if (v2 != null && !bb.isVectorInYZ(v2)) { - v2 = null; - } - - if (v3 != null && !bb.isVectorInXZ(v3)) { - v3 = null; - } - - if (v4 != null && !bb.isVectorInXZ(v4)) { - v4 = null; - } - - if (v5 != null && !bb.isVectorInXY(v5)) { - v5 = null; - } - - if (v6 != null && !bb.isVectorInXY(v6)) { - v6 = null; - } - - Vector3 vector = v1; - - if (v2 != null && (vector == null || pos1.distanceSquared(v2) < pos1.distanceSquared(vector))) { - vector = v2; - } - - if (v3 != null && (vector == null || pos1.distanceSquared(v3) < pos1.distanceSquared(vector))) { - vector = v3; - } - - if (v4 != null && (vector == null || pos1.distanceSquared(v4) < pos1.distanceSquared(vector))) { - vector = v4; - } - - if (v5 != null && (vector == null || pos1.distanceSquared(v5) < pos1.distanceSquared(vector))) { - vector = v5; - } - - if (v6 != null && (vector == null || pos1.distanceSquared(v6) < pos1.distanceSquared(vector))) { - vector = v6; - } - - if (vector == null) { - return null; - } - - int f = -1; - - if (vector == v1) { - f = 4; - } else if (vector == v2) { - f = 5; - } else if (vector == v3) { - f = 0; - } else if (vector == v4) { - f = 1; - } else if (vector == v5) { - f = 2; - } else if (vector == v6) { - f = 3; - } - - return MovingObjectPosition.fromBlock((int) this.x, (int) this.y, (int) this.z, f, vector.add(this.x, this.y, this.z)); - } - - public String getSaveId() { - String name = getClass().getName(); - return name.substring(16); - } - - @Override - public void setMetadata(String metadataKey, MetadataValue newMetadataValue) throws Exception { - if (this.getLevel() != null) { - this.getLevel().getBlockMetadata().setMetadata(this, metadataKey, newMetadataValue); - } - } - - @Override - public List getMetadata(String metadataKey) throws Exception { - if (this.getLevel() != null) { - return this.getLevel().getBlockMetadata().getMetadata(this, metadataKey); - - } - return null; - } - - @Override - public boolean hasMetadata(String metadataKey) throws Exception { - return this.getLevel() != null && this.getLevel().getBlockMetadata().hasMetadata(this, metadataKey); - } - - @Override - public void removeMetadata(String metadataKey, Plugin owningPlugin) throws Exception { - if (this.getLevel() != null) { - this.getLevel().getBlockMetadata().removeMetadata(this, metadataKey, owningPlugin); - } - } - - public Block clone() { - return (Block) super.clone(); - } - - public int getWeakPower(BlockFace face) { - return 0; - } - - public int getStrongPower(BlockFace side) { - return 0; - } - - public boolean isPowerSource() { - return false; - } - - public String getLocationHash() { - return this.getFloorX() + ":" + this.getFloorY() + ':' + this.getFloorZ(); - } - - public int getDropExp() { - return 0; - } - - public boolean isNormalBlock() { - return !isTransparent() && isSolid() && !isPowerSource(); - } - - public static boolean equals(Block b1, Block b2) { - return equals(b1, b2, true); - } - - public static boolean equals(Block b1, Block b2, boolean checkDamage) { - return b1 != null && b2 != null && b1.getId() == b2.getId() && (!checkDamage || b1.getDamage() == b2.getDamage()); - } - - public Item toItem() { - return new ItemBlock(this, this.getDamage(), 1); - } - - public boolean canSilkTouch() { - return false; - } - - public double getMinX() { - return this.x; - } - - public double getMinY() { - return this.y; - } - - public double getMinZ() { - return this.z; - } - - public double getMaxX() { - return this.x + 1; - } - - public double getMaxY() { - return this.y + 1; - } - - public double getMaxZ() { - return this.z + 1; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockAir.java b/src/main/java/cn/nukkit/block/BlockAir.java deleted file mode 100644 index f19ca3032..000000000 --- a/src/main/java/cn/nukkit/block/BlockAir.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockAir extends BlockTransparent { - - @Override - public int getId() { - return AIR; - } - - @Override - public String getName() { - return "Air"; - } - - @Override - public boolean canPassThrough() { - return true; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public boolean canBeFlowedInto() { - return true; - } - - @Override - public boolean canBePlaced() { - return false; - } - - @Override - public boolean canBeReplaced() { - return true; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - public AxisAlignedBB getBoundingBox() { - return null; - } - - @Override - public double getHardness() { - return 0; - } - - @Override - public double getResistance() { - return 0; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockAnvil.java b/src/main/java/cn/nukkit/block/BlockAnvil.java deleted file mode 100644 index 40933579c..000000000 --- a/src/main/java/cn/nukkit/block/BlockAnvil.java +++ /dev/null @@ -1,152 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.inventory.AnvilInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.sound.AnvilFallSound; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -import java.util.Collection; - -/** - * Created by Pub4Game on 27.12.2015. - */ -public class BlockAnvil extends BlockFallableMeta implements Faceable { - - private static final int[] faces = {1, 2, 3, 0}; - - private static final String[] NAMES = new String[]{ - "Anvil", - "Anvil", - "Anvil", - "Anvil", - "Slighty Damaged Anvil", - "Slighty Damaged Anvil", - "Slighty Damaged Anvil", - "Slighty Damaged Anvil", - "Very Damaged Anvil", - "Very Damaged Anvil", - "Very Damaged Anvil", - "Very Damaged Anvil" - }; - - public BlockAnvil() { - this(0); - } - - public BlockAnvil(int meta) { - super(meta); - } - - @Override - public int getFullId() { - return (2320) + getDamage(); - } - - @Override - public int getId() { - return ANVIL; - } - - @Override - public boolean canBeActivated() { - return Server.getInstance().anvilsEnabled; - } - - @Override - public boolean isTransparent() { - return true; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 6000; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return NAMES[this.getDamage() > 11 ? 0 : this.getDamage()]; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - int damage = this.getDamage(); - this.setDamage(faces[player != null ? player.getDirection().getHorizontalIndex() : 0]); - if (damage >= 4 && damage <= 7) { - this.setDamage(this.getDamage() | 0x04); - } else if (damage >= 8 && damage <= 11) { - this.setDamage(this.getDamage() | 0x08); - } - this.getLevel().setBlock(block, this, true); - if (player == null) { - this.getLevel().addSound(new AnvilFallSound(this)); - } else { - Collection players = getLevel().getChunkPlayers(getChunkX(), getChunkZ()).values(); - players.remove(player); - if (!players.isEmpty()) { - this.getLevel().addSound(new AnvilFallSound(this)); - } - } - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - player.addWindow(new AnvilInventory(player.getUIInventory(), this), Player.ANVIL_WINDOW_ID); - } - return true; - } - - @Override - public Item toItem() { - int damage = this.getDamage(); - if (damage >= 4 && damage <= 7) { - return new ItemBlock(this, this.getDamage() & 0x04); - } else if (damage >= 8 && damage <= 11) { - return new ItemBlock(this, this.getDamage() & 0x08); - } else { - return new ItemBlock(this); - } - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - this.toItem() - }; - } - return new Item[0]; - } - - @Override - public BlockColor getColor() { - return BlockColor.IRON_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBanner.java b/src/main/java/cn/nukkit/block/BlockBanner.java deleted file mode 100644 index 6dc3ad7cc..000000000 --- a/src/main/java/cn/nukkit/block/BlockBanner.java +++ /dev/null @@ -1,154 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityBanner; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.IntTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; -import cn.nukkit.utils.Faceable; - -/** - * Created by PetteriM1 - */ -public class BlockBanner extends BlockTransparentMeta implements Faceable { - - public BlockBanner() { - this(0); - } - - public BlockBanner(int meta) { - super(meta); - } - - @Override - public int getId() { - return STANDING_BANNER; - } - - @Override - public double getHardness() { - return 1; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public String getName() { - return "Banner"; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return null; - } - - @Override - public boolean canPassThrough() { - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (face != BlockFace.DOWN) { - if (face == BlockFace.UP) { - this.setDamage(NukkitMath.floorDouble(((player.yaw + 180) * 16 / 360) + 0.5) & 0x0f); - this.getLevel().setBlock(block, this, true); - } else { - this.setDamage(face.getIndex()); - this.getLevel().setBlock(block, Block.get(WALL_BANNER, this.getDamage()), true); - } - - CompoundTag nbt = BlockEntity.getDefaultCompound(this, BlockEntity.BANNER) - .putInt("Base", item.getDamage() & 0xf); - - Tag type = item.getNamedTagEntry("Type"); - - if (type instanceof IntTag) { - nbt.put("Type", type); - } - - Tag patterns = item.getNamedTagEntry("Patterns"); - if (patterns instanceof ListTag) { - nbt.put("Patterns", patterns); - } - - BlockEntity.createBlockEntity(BlockEntity.BANNER, this.getChunk(), nbt); - return true; - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().getId() == Block.AIR) { - this.getLevel().useBreakOn(this); - - return Level.BLOCK_UPDATE_NORMAL; - } - } - - return 0; - } - - @Override - public Item toItem() { - BlockEntity blockEntity = this.getLevel().getBlockEntity(this); - Item item = Item.get(Item.BANNER); - if (blockEntity instanceof BlockEntityBanner) { - BlockEntityBanner banner = (BlockEntityBanner) blockEntity; - item.setDamage(banner.getBaseColor() & 0xf); - int type = banner.namedTag.getInt("Type"); - if (type > 0) { - item.setNamedTag((item.hasCompoundTag() ? item.getNamedTag() : new CompoundTag()) - .putInt("Type", type)); - } - ListTag patterns = banner.namedTag.getList("Patterns", CompoundTag.class); - if (patterns.size() > 0) { - item.setNamedTag((item.hasCompoundTag() ? item.getNamedTag() : new CompoundTag()) - .putList(patterns)); - } - } - return item; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public BlockColor getColor() { - return this.getDyeColor().getColor(); - } - - public DyeColor getDyeColor() { - if (this.level != null) { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityBanner) { - return ((BlockEntityBanner) blockEntity).getDyeColor(); - } - } - - return DyeColor.WHITE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBeacon.java b/src/main/java/cn/nukkit/block/BlockBeacon.java deleted file mode 100644 index 32105ad6e..000000000 --- a/src/main/java/cn/nukkit/block/BlockBeacon.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityBeacon; -import cn.nukkit.inventory.BeaconInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.BlockColor; - -/** - * @author Angelic47 Nukkit Project - */ -public class BlockBeacon extends BlockTransparent { - - @Override - public int getId() { - return BEACON; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getLightLevel() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Beacon"; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - - BlockEntity t = this.getLevel().getBlockEntity(this); - if (!(t instanceof BlockEntityBeacon)) { - CompoundTag nbt = new CompoundTag("") - .putString("id", BlockEntity.BEACON) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - BlockEntity.createBlockEntity(BlockEntity.BEACON, this.getChunk(), nbt); - } - - player.addWindow(new BeaconInventory(player.getUIInventory(), this), Player.BEACON_WINDOW_ID); - } - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - boolean blockSuccess = super.place(item, block, target, face, fx, fy, fz, player); - - if (blockSuccess) { - CompoundTag nbt = new CompoundTag("") - .putString("id", BlockEntity.BEACON) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - BlockEntity.createBlockEntity(BlockEntity.BEACON, this.getChunk(), nbt); - } - - return blockSuccess; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.DIAMOND_BLOCK_COLOR; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockBed.java b/src/main/java/cn/nukkit/block/BlockBed.java deleted file mode 100644 index 4202edbfe..000000000 --- a/src/main/java/cn/nukkit/block/BlockBed.java +++ /dev/null @@ -1,263 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityBed; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityPrimedTNT; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBed; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; -import cn.nukkit.utils.Faceable; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockBed extends BlockTransparentMeta implements Faceable { - - public BlockBed() { - this(0); - } - - public BlockBed(int meta) { - super(meta); - } - - @Override - public int getId() { - return BED_BLOCK; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public double getHardness() { - return 0.2; - } - - @Override - public String getName() { - return this.getDyeColor().getName() + " Bed Block"; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 0.5625, - this.z + 1 - ); - } - - @Override - public boolean onActivate(Item item) { - return this.onActivate(item, null); - } - - @Override - public boolean onActivate(Item item, Player player) { - if (this.level.getDimension() != Level.DIMENSION_OVERWORLD) { - this.level.useBreakOn(this); - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", x)) - .add(new DoubleTag("", y)) - .add(new DoubleTag("", z))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - .putShort("Fuse", 0); // create an instant explosion - new EntityPrimedTNT(this.level.getChunk(this.getFloorX() >> 4, this.getFloorZ() >> 4), nbt); // we don't even have to spawn the tnt entity for players - return true; - } - - int time = this.getLevel().getTime() % Level.TIME_FULL; - - boolean isNight = (time >= Level.TIME_NIGHT && time < Level.TIME_SUNRISE); - - if (player != null && !isNight) { - player.sendTranslation("§7%tile.bed.noSleep"); - return true; - } - - Block blockNorth = this.north(); - Block blockSouth = this.south(); - Block blockEast = this.east(); - Block blockWest = this.west(); - - Block b; - if ((this.getDamage() & 0x08) == 0x08) { - b = this; - } else { - if (blockNorth.getId() == BED_BLOCK && (blockNorth.getDamage() & 0x08) == 0x08) { - b = blockNorth; - } else if (blockSouth.getId() == BED_BLOCK && (blockSouth.getDamage() & 0x08) == 0x08) { - b = blockSouth; - } else if (blockEast.getId() == BED_BLOCK && (blockEast.getDamage() & 0x08) == 0x08) { - b = blockEast; - } else if (blockWest.getId() == BED_BLOCK && (blockWest.getDamage() & 0x08) == 0x08) { - b = blockWest; - } else { - if (player != null) { - player.sendTranslation("§7%tile.bed.notValid"); - } - - return true; - } - } - - if (player != null) { - if (player.distanceSquared(this) > 36) { - player.sendTranslation("§7%tile.bed.tooFar"); - return true; - } - - if (!player.isCreative()) { - BlockFace secondPart = this.getBlockFace().getOpposite(); - AxisAlignedBB checkArea = new AxisAlignedBB(b.x - 8, b.y - 6.5, b.z - 8, b.x + 9, b.y + 5.5, b.z + 9).addCoord(secondPart.getXOffset(), 0, secondPart.getZOffset()); - - for (Entity entity : this.getLevel().getCollidingEntities(checkArea)) { - if (!entity.isClosed() && Utils.monstersList.contains(entity.getNetworkId())) { - player.sendTranslation("§7%tile.bed.notSafe"); - return true; - } - } - } - - if (!player.sleepOn(b)) { - player.sendTranslation("§7%tile.bed.occupied"); - } - } - - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (!down.isTransparent() || down instanceof BlockSlab) { - Block next = this.getSide(player.getHorizontalFacing()); - Block downNext = next.down(); - - if (next.canBeReplaced() && (!downNext.isTransparent() || downNext instanceof BlockSlab)) { - int meta = player.getDirection().getHorizontalIndex(); - - this.getLevel().setBlock(block, Block.get(BED_BLOCK, meta), true, true); - this.getLevel().setBlock(next, Block.get(BED_BLOCK, meta | 0x08), true, true); - - // HACK: Make bed color to update for the player - Server.getInstance().getScheduler().scheduleDelayedTask(() -> { - createBlockEntity(this, item.getDamage()); - createBlockEntity(next, item.getDamage()); - }, 2); - return true; - } - } - - return false; - } - - @Override - public boolean onBreak(Item item) { - Block blockNorth = this.north(); - Block blockSouth = this.south(); - Block blockEast = this.east(); - Block blockWest = this.west(); - - Block secondPart = null; - if ((this.getDamage() & 0x08) == 0x08) { // Top part of the bed - if (blockNorth.getId() == BED_BLOCK && (blockNorth.getDamage() & 0x08) != 0x08) { // Check if the block ID & meta are right - secondPart = blockNorth; - } else if (blockSouth.getId() == BED_BLOCK && (blockSouth.getDamage() & 0x08) != 0x08) { - secondPart = blockSouth; - } else if (blockEast.getId() == BED_BLOCK && (blockEast.getDamage() & 0x08) != 0x08) { - secondPart = blockEast; - } else if (blockWest.getId() == BED_BLOCK && (blockWest.getDamage() & 0x08) != 0x08) { - secondPart = blockWest; - } - } else { // Bottom part of the bed - if (blockNorth.getId() == BED_BLOCK && (blockNorth.getDamage() & 0x08) == 0x08) { - secondPart = blockNorth; - } else if (blockSouth.getId() == BED_BLOCK && (blockSouth.getDamage() & 0x08) == 0x08) { - secondPart = blockSouth; - } else if (blockEast.getId() == BED_BLOCK && (blockEast.getDamage() & 0x08) == 0x08) { - secondPart = blockEast; - } else if (blockWest.getId() == BED_BLOCK && (blockWest.getDamage() & 0x08) == 0x08) { - secondPart = blockWest; - } - } - - if (secondPart != null) { - this.getLevel().setBlock(secondPart, Block.get(BlockID.AIR), true, true); - } - - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, false); // Don't update both parts to prevent duplication bug if there are two fallable blocks on top of the bed - - for (Entity entity : this.level.getNearbyEntities(new AxisAlignedBB(this, this).grow(2, 1, 2))) { - if (!(entity instanceof Player)) continue; - Player player = (Player) entity; - - if (player.getSleepingPos() == null) continue; - if (!player.getSleepingPos().equals(this) && !player.getSleepingPos().equals(secondPart)) continue; - player.stopSleep(); - } - - return true; - } - - private void createBlockEntity(Vector3 pos, int color) { - CompoundTag nbt = BlockEntity.getDefaultCompound(pos, BlockEntity.BED); - nbt.putByte("color", color); - - BlockEntity.createBlockEntity(BlockEntity.BED, this.level.getChunk(pos.getFloorX() >> 4, pos.getFloorZ() >> 4), nbt); - } - - @Override - public Item toItem() { - return new ItemBed(this.getDyeColor().getWoolData()); - } - - @Override - public BlockColor getColor() { - return this.getDyeColor().getColor(); - } - - public DyeColor getDyeColor() { - if (this.level != null) { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityBed) { - return ((BlockEntityBed) blockEntity).getDyeColor(); - } - } - - return DyeColor.WHITE; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBedrock.java b/src/main/java/cn/nukkit/block/BlockBedrock.java deleted file mode 100644 index bde9f7bf0..000000000 --- a/src/main/java/cn/nukkit/block/BlockBedrock.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockBedrock extends BlockSolid { - - @Override - public int getId() { - return BEDROCK; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public String getName() { - return "Bedrock"; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBedrockInvisible.java b/src/main/java/cn/nukkit/block/BlockBedrockInvisible.java deleted file mode 100644 index 0077c14a7..000000000 --- a/src/main/java/cn/nukkit/block/BlockBedrockInvisible.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.utils.BlockColor; - -/** - * Created by Pub4Game on 03.01.2016. - */ -public class BlockBedrockInvisible extends BlockSolid { - - @Override - public int getId() { - return INVISIBLE_BEDROCK; - } - - @Override - public String getName() { - return "Invisible Bedrock"; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.TRANSPARENT_BLOCK_COLOR; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(BlockID.AIR)); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBeetroot.java b/src/main/java/cn/nukkit/block/BlockBeetroot.java deleted file mode 100644 index 155f69f58..000000000 --- a/src/main/java/cn/nukkit/block/BlockBeetroot.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSeedsBeetroot; - -/** - * Created on 2015/11/22 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockBeetroot extends BlockCrops { - public BlockBeetroot() { - this(0); - } - - public BlockBeetroot(int meta) { - super(meta); - } - - @Override - public int getId() { - return BEETROOT_BLOCK; - } - - @Override - public String getName() { - return "Beetroot Block"; - } - - @Override - public Item toItem() { - return new ItemSeedsBeetroot(); - } - - @Override - public Item[] getDrops(Item item) { - if (this.getDamage() >= 0x07) { - return new Item[]{ - Item.get(Item.BEETROOT, 0, 1), - Item.get(Item.BEETROOT_SEEDS, 0, (int) (4d * Math.random())) - }; - } else { - return new Item[]{ - Item.get(Item.BEETROOT_SEEDS, 0, 1) - }; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBone.java b/src/main/java/cn/nukkit/block/BlockBone.java deleted file mode 100644 index b8ee934f6..000000000 --- a/src/main/java/cn/nukkit/block/BlockBone.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * @author CreeperFace - */ -public class BlockBone extends BlockSolid implements Faceable { - - private static final int[] faces = { - 0, - 0, - 0b1000, - 0b1000, - 0b0100, - 0b0100 - }; - - @Override - public int getId() { - return BONE_BLOCK; - } - - @Override - public String getName() { - return "Bone Block"; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{new ItemBlock(this)}; - } - - return new Item[0]; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(((this.getDamage() & 0x3) | faces[face.getIndex()])); - this.getLevel().setBlock(block, this, true); - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBookshelf.java b/src/main/java/cn/nukkit/block/BlockBookshelf.java deleted file mode 100644 index 1c13a7e17..000000000 --- a/src/main/java/cn/nukkit/block/BlockBookshelf.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBook; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockBookshelf extends BlockSolid { - - @Override - public String getName() { - return "Bookshelf"; - } - - @Override - public int getId() { - return BOOKSHELF; - } - - @Override - public double getHardness() { - return 1.5D; - } - - @Override - public double getResistance() { - return 7.5D; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public int getBurnChance() { - return 30; - } - - @Override - public int getBurnAbility() { - return 20; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - new ItemBook(0, 3) - }; - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBrewingStand.java b/src/main/java/cn/nukkit/block/BlockBrewingStand.java deleted file mode 100644 index 351a66a1f..000000000 --- a/src/main/java/cn/nukkit/block/BlockBrewingStand.java +++ /dev/null @@ -1,163 +0,0 @@ -package cn.nukkit.block; - - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityBrewingStand; -import cn.nukkit.inventory.ContainerInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBrewingStand; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.StringTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.BlockColor; - -import java.util.Map; - -public class BlockBrewingStand extends BlockSolidMeta { - - public BlockBrewingStand() { - this(0); - } - - public BlockBrewingStand(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Brewing Stand"; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public int getId() { - return BREWING_STAND_BLOCK; - } - - @Override - public int getLightLevel() { - return 1; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - getLevel().setBlock(block, this, true, true); - - CompoundTag nbt = new CompoundTag() - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.BREWING_STAND) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (item.hasCustomName()) { - nbt.putString("CustomName", item.getCustomName()); - } - - if (item.hasCustomBlockData()) { - Map customData = item.getCustomBlockData().getTags(); - for (Map.Entry tag : customData.entrySet()) { - nbt.put(tag.getKey(), tag.getValue()); - } - } - - BlockEntityBrewingStand brewing = (BlockEntityBrewingStand) BlockEntity.createBlockEntity(BlockEntity.BREWING_STAND, getLevel().getChunk((int) this.x >> 4, (int) this.z >> 4), nbt); - return brewing != null; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - BlockEntity t = getLevel().getBlockEntity(this); - BlockEntityBrewingStand brewing; - if (t instanceof BlockEntityBrewingStand) { - brewing = (BlockEntityBrewingStand) t; - } else { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.BREWING_STAND) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - brewing = (BlockEntityBrewingStand) BlockEntity.createBlockEntity(BlockEntity.BREWING_STAND, this.getLevel().getChunk((int) (this.x) >> 4, (int) (this.z) >> 4), nbt); - if (brewing == null) { - return false; - } - } - - if (brewing.namedTag.contains("Lock") && brewing.namedTag.get("Lock") instanceof StringTag) { - if (!brewing.namedTag.getString("Lock").equals(item.getCustomName())) { - return false; - } - } - - player.addWindow(brewing.getInventory()); - } - - return true; - } - - @Override - public Item toItem() { - return new ItemBrewingStand(); - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_WOODEN) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.IRON_BLOCK_COLOR; - } - - public boolean hasComparatorInputOverride() { - return true; - } - - @Override - public int getComparatorInputOverride() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityBrewingStand) { - return ContainerInventory.calculateRedstone(((BlockEntityBrewingStand) blockEntity).getInventory()); - } - - return super.getComparatorInputOverride(); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBricks.java b/src/main/java/cn/nukkit/block/BlockBricks.java deleted file mode 100644 index fadb8d552..000000000 --- a/src/main/java/cn/nukkit/block/BlockBricks.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockBricks extends BlockSolid { - - @Override - public String getName() { - return "Bricks"; - } - - @Override - public int getId() { - return BRICKS_BLOCK; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.BRICKS_BLOCK, 0, 1) - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.RED_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBricksEndStone.java b/src/main/java/cn/nukkit/block/BlockBricksEndStone.java deleted file mode 100644 index abc6095e4..000000000 --- a/src/main/java/cn/nukkit/block/BlockBricksEndStone.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -public class BlockBricksEndStone extends BlockSolid { - - @Override - public String getName() { - return "End Stone Bricks"; - } - - @Override - public int getId() { - return END_BRICKS; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 0.8; - } - - @Override - public double getResistance() { - return 4; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.END_BRICKS, 0, 1) - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBricksNether.java b/src/main/java/cn/nukkit/block/BlockBricksNether.java deleted file mode 100644 index ac533f6f1..000000000 --- a/src/main/java/cn/nukkit/block/BlockBricksNether.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/7 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockBricksNether extends BlockSolid { - - @Override - public String getName() { - return "Nether Brick"; - } - - @Override - public int getId() { - return NETHER_BRICKS; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.NETHER_BRICKS, 0, 1) - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.NETHERRACK_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBricksRedNether.java b/src/main/java/cn/nukkit/block/BlockBricksRedNether.java deleted file mode 100644 index 8ce2ad7ca..000000000 --- a/src/main/java/cn/nukkit/block/BlockBricksRedNether.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -public class BlockBricksRedNether extends BlockNetherBrick { - - @Override - public String getName() { - return "Red Nether Bricks"; - } - - @Override - public int getId() { - return RED_NETHER_BRICK; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.RED_NETHER_BRICK, 0, 1) - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.NETHERRACK_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockBricksStone.java b/src/main/java/cn/nukkit/block/BlockBricksStone.java deleted file mode 100644 index 0de4d334a..000000000 --- a/src/main/java/cn/nukkit/block/BlockBricksStone.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockBricksStone extends BlockSolidMeta { - public static final int NORMAL = 0; - public static final int MOSSY = 1; - public static final int CRACKED = 2; - public static final int CHISELED = 3; - - - public BlockBricksStone() { - this(0); - } - - public BlockBricksStone(int meta) { - super(meta); - } - - @Override - public int getId() { - return STONE_BRICKS; - } - - @Override - public double getHardness() { - return 1.5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Stone Bricks", - "Mossy Stone Bricks", - "Cracked Stone Bricks", - "Chiseled Stone Bricks" - }; - - return names[this.getDamage() & 0x03]; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.STONE_BRICKS, this.getDamage() & 0x03, 1) - }; - } else { - return new Item[0]; - } - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockButton.java b/src/main/java/cn/nukkit/block/BlockButton.java deleted file mode 100644 index 9f299f9f7..000000000 --- a/src/main/java/cn/nukkit/block/BlockButton.java +++ /dev/null @@ -1,132 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.block.BlockRedstoneEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.ButtonClickSound; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.Faceable; - -/** - * Created by CreeperFace on 27. 11. 2016. - */ -public abstract class BlockButton extends BlockFlowable implements Faceable { - - public BlockButton() { - this(0); - } - - public BlockButton(int meta) { - super(meta); - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (target.isTransparent()) { - return false; - } - - this.setDamage(face.getIndex()); - this.level.setBlock(block, this, true, true); - return true; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (this.isActivated()) { - return false; - } - - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, 0, 15)); - this.setDamage(this.getDamage() ^ 0x08); - this.level.setBlock(this, this, true, false); - this.level.addSound(new ButtonClickSound(this.add(0.5, 0.5, 0.5))); - this.level.scheduleUpdate(this, 30); - - level.updateAroundRedstone(getLocation(), null); - level.updateAroundRedstone(getLocation().getSide(getFacing().getOpposite()), null); - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.getSide(getFacing().getOpposite()).isTransparent()) { - this.level.useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_SCHEDULED) { - if (this.isActivated()) { - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, 15, 0)); - - this.setDamage(this.getDamage() ^ 0x08); - this.level.setBlock(this, this, true, false); - this.level.addSound(new ButtonClickSound(this.add(0.5, 0.5, 0.5))); - - level.updateAroundRedstone(getLocation(), null); - level.updateAroundRedstone(getLocation().getSide(getFacing().getOpposite()), null); - } - - return Level.BLOCK_UPDATE_SCHEDULED; - } - - return 0; - } - - public boolean isActivated() { - return ((this.getDamage() & 0x08) == 0x08); - } - - @Override - public boolean isPowerSource() { - return true; - } - - public int getWeakPower(BlockFace side) { - return isActivated() ? 15 : 0; - } - - public int getStrongPower(BlockFace side) { - return !isActivated() ? 0 : (getFacing() == side ? 15 : 0); - } - - public BlockFace getFacing() { - int side = isActivated() ? getDamage() ^ 0x08 : getDamage(); - return BlockFace.fromIndex(side); - } - - @Override - public boolean onBreak(Item item) { - if (isActivated()) { - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, 15, 0)); - } - - return super.onBreak(item); - } - - @Override - public Item toItem() { - return Item.get(this.getId(), 0); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockButtonStone.java b/src/main/java/cn/nukkit/block/BlockButtonStone.java deleted file mode 100644 index 2583cf077..000000000 --- a/src/main/java/cn/nukkit/block/BlockButtonStone.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; - -/** - * Created by CreeperFace on 27. 11. 2016. - */ -public class BlockButtonStone extends BlockButton { - - public BlockButtonStone() { - this(0); - } - - public BlockButtonStone(int meta) { - super(meta); - } - - @Override - public int getId() { - return STONE_BUTTON; - } - - @Override - public String getName() { - return "Stone Button"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockButtonWooden.java b/src/main/java/cn/nukkit/block/BlockButtonWooden.java deleted file mode 100644 index b5d8fb294..000000000 --- a/src/main/java/cn/nukkit/block/BlockButtonWooden.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; - -/** - * Created by CreeperFace on 27. 11. 2016. - */ -public class BlockButtonWooden extends BlockButton { - - public BlockButtonWooden() { - this(0); - } - - public BlockButtonWooden(int meta) { - super(meta); - } - - @Override - public int getId() { - return WOODEN_BUTTON; - } - - @Override - public String getName() { - return "Wooden Button"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCactus.java b/src/main/java/cn/nukkit/block/BlockCactus.java deleted file mode 100644 index 550a4088a..000000000 --- a/src/main/java/cn/nukkit/block/BlockCactus.java +++ /dev/null @@ -1,144 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.block.BlockGrowEvent; -import cn.nukkit.event.entity.EntityDamageByBlockEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemCactus; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockCactus extends BlockTransparentMeta { - - public BlockCactus(int meta) { - super(meta); - } - - public BlockCactus() { - this(0); - } - - @Override - public int getId() { - return CACTUS; - } - - @Override - public double getHardness() { - return 0.4; - } - - @Override - public double getResistance() { - return 2; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x + 0.0625, - this.y + 0.0625, - this.z + 0.0625, - this.x + 0.9375, - this.y + 0.9375, - this.z + 0.9375 - ); - } - - @Override - protected AxisAlignedBB recalculateCollisionBoundingBox() { - return new AxisAlignedBB(this.x, this.y, this.z, this.x + 1, this.y + 1, this.z + 1); - } - - @Override - public void onEntityCollide(Entity entity) { - entity.attack(new EntityDamageByBlockEvent(this, entity, DamageCause.CONTACT, 1)); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - Block down = down(); - if (down.getId() != SAND && down.getId() != CACTUS) { - this.getLevel().useBreakOn(this); - } else { - for (int side = 2; side <= 5; ++side) { - Block block = getSide(BlockFace.fromIndex(side)); - if (!block.canBeFlowedInto()) { - this.getLevel().useBreakOn(this); - } - } - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if (down().getId() != CACTUS) { - if (this.getDamage() == 0x0F) { - for (int y = 1; y < 3; ++y) { - Block b = this.getLevel().getBlock(new Vector3(this.x, this.y + y, this.z)); - if (b.getId() == AIR) { - BlockGrowEvent event = new BlockGrowEvent(b, Block.get(CACTUS)); - Server.getInstance().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.getLevel().setBlock(b, event.getNewState(), true, true); - } - } - } - this.setDamage(0); - this.getLevel().setBlock(this, this); - } else { - this.setDamage(this.getDamage() + 1); - this.getLevel().setBlock(this, this); - } - } - } - - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (down.getId() == SAND || down.getId() == CACTUS) { - Block block0 = north(); - Block block1 = south(); - Block block2 = west(); - Block block3 = east(); - if (block0.canBeFlowedInto() && block1.canBeFlowedInto() && block2.canBeFlowedInto() && block3.canBeFlowedInto()) { - this.getLevel().setBlock(this, this, true); - - return true; - } - } - return false; - } - - @Override - public String getName() { - return "Cactus"; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - new ItemCactus(0, 1) - }; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCake.java b/src/main/java/cn/nukkit/block/BlockCake.java deleted file mode 100644 index 042258da0..000000000 --- a/src/main/java/cn/nukkit/block/BlockCake.java +++ /dev/null @@ -1,122 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemCake; -import cn.nukkit.item.food.Food; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockCake extends BlockTransparentMeta { - - public BlockCake(int meta) { - super(meta); - } - - public BlockCake() { - this(0); - } - - @Override - public String getName() { - return "Cake Block"; - } - - @Override - public int getId() { - return CAKE_BLOCK; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getResistance() { - return 0.5; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - x + ((1 + (getDamage() << 1)) >> 4), - y, - z + 0.0625, - x - 0.0625 + 1, - y + 0.5, - z - 0.0625 + 1 - ); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (down().getId() != Block.AIR) { - getLevel().setBlock(block, this, true, true); - - return true; - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (down().getId() == Block.AIR) { - getLevel().setBlock(this, Block.get(BlockID.AIR), true); - - return Level.BLOCK_UPDATE_NORMAL; - } - } - - return 0; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public Item toItem() { - return new ItemCake(); - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null && player.getFoodData().getLevel() < player.getFoodData().getMaxLevel()) { - if (getDamage() <= 0x06) setDamage(getDamage() + 1); - if (getDamage() >= 0x06) { - getLevel().setBlock(this, Block.get(BlockID.AIR), true); - } else { - Food.getByRelative(this).eatenBy(player); - getLevel().setBlock(this, this, true); - } - return true; - } - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - public int getComparatorInputOverride() { - return (7 - this.getDamage()) << 1; - } - - public boolean hasComparatorInputOverride() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCarpet.java b/src/main/java/cn/nukkit/block/BlockCarpet.java deleted file mode 100644 index 5b7d9c9de..000000000 --- a/src/main/java/cn/nukkit/block/BlockCarpet.java +++ /dev/null @@ -1,103 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created on 2015/11/24 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockCarpet extends BlockFlowable { - - public BlockCarpet() { - this(0); - } - - public BlockCarpet(int meta) { - super(meta); - } - - public BlockCarpet(DyeColor dyeColor) { - this(dyeColor.getWoolData()); - } - - @Override - public int getId() { - return CARPET; - } - - @Override - public double getHardness() { - return 0.1; - } - - @Override - public double getResistance() { - return 0.5; - } - - @Override - public boolean isSolid() { - return true; - } - - @Override - public String getName() { - return DyeColor.getByWoolData(getDamage()) + " Carpet"; - } - - @Override - public boolean canPassThrough() { - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 0.0625, - this.z + 1 - ); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (down.getId() != Item.AIR) { - this.getLevel().setBlock(block, this, true, true); - return true; - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().getId() == Item.AIR) { - this.getLevel().useBreakOn(this); - - return Level.BLOCK_UPDATE_NORMAL; - } - } - - return 0; - } - - @Override - public BlockColor getColor() { - return DyeColor.getByWoolData(getDamage()).getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(getDamage()); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCarrot.java b/src/main/java/cn/nukkit/block/BlockCarrot.java deleted file mode 100644 index 2b669b717..000000000 --- a/src/main/java/cn/nukkit/block/BlockCarrot.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemCarrot; -import cn.nukkit.utils.Utils; - -/** - * @author Nukkit Project Team - */ -public class BlockCarrot extends BlockCrops { - - public BlockCarrot(int meta) { - super(meta); - } - - public BlockCarrot() { - this(0); - } - - @Override - public String getName() { - return "Carrot Block"; - } - - @Override - public int getId() { - return CARROT_BLOCK; - } - - @Override - public Item[] getDrops(Item item) { - if (getDamage() >= 0x07) { - return new Item[]{ - new ItemCarrot(0, Utils.rand(1, 5)) - }; - } - return new Item[]{ - new ItemCarrot() - }; - } - - @Override - public Item toItem() { - return new ItemCarrot(); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCauldron.java b/src/main/java/cn/nukkit/block/BlockCauldron.java deleted file mode 100644 index 70f28a857..000000000 --- a/src/main/java/cn/nukkit/block/BlockCauldron.java +++ /dev/null @@ -1,392 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityCauldron; -import cn.nukkit.event.player.PlayerBucketEmptyEvent; -import cn.nukkit.event.player.PlayerBucketFillEvent; -import cn.nukkit.item.*; -import cn.nukkit.level.Level; -import cn.nukkit.level.Sound; -import cn.nukkit.level.particle.SmokeParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.MathHelper; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author CreeperFace - * Nukkit Project - */ -public class BlockCauldron extends BlockSolidMeta { - - /** - * Used to cache biome check for freezing - * 1 = can't freeze, 2 = can freeze - */ - private byte freezing; - - public BlockCauldron() { - super(0); - } - - public BlockCauldron(int meta) { - super(meta); - } - - @Override - public int getId() { - return CAULDRON_BLOCK; - } - - public String getName() { - return "Cauldron Block"; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public boolean canBeActivated() { - return true; - } - - public boolean isFull() { - return (this.getDamage() & 0x06) == 0x06; - } - - public boolean isEmpty() { - return this.getDamage() == 0x00; - } - - public int getFillLevel() { - return (getDamage() & 0x6) >> 1; - } - - public void setFillLevel(int fillLevel) { - fillLevel = MathHelper.clamp(fillLevel, 0, 3); - setDamage(fillLevel << 1); - } - - @Override - public boolean onActivate(Item item, Player player) { - BlockEntity be = this.level.getBlockEntity(this); - - if (!(be instanceof BlockEntityCauldron)) { - return false; - } - - BlockEntityCauldron cauldron = (BlockEntityCauldron) be; - - switch (item.getId()) { - case Item.BUCKET: - if (item.getDamage() == 0) {//empty bucket - if (!isFull() || cauldron.isCustomColor() || cauldron.hasPotion()) { - break; - } - - ItemBucket bucket = (ItemBucket) item.clone(); - bucket.setCount(1); - bucket.setDamage(8);//water bucket - - PlayerBucketFillEvent ev = new PlayerBucketFillEvent(player, this, null, item, bucket); - this.level.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - replaceBucket(item, player, ev.getItem()); - this.setFillLevel(0);//empty - this.level.setBlock(this, this, true); - cauldron.clearCustomColor(); - this.getLevel().addSoundToViewers(this, Sound.CAULDRON_TAKEWATER); - } - } else if (item.getDamage() == 8 || item.getDamage() == 10) {//water and lava buckets - if (isFull() && !cauldron.isCustomColor() && !cauldron.hasPotion() && item.getDamage() == 8) { - break; - } - - ItemBucket bucket = (ItemBucket) item.clone(); - bucket.setCount(1); - bucket.setDamage(0);//empty bucket - - PlayerBucketEmptyEvent ev = new PlayerBucketEmptyEvent(player, this, null, item, bucket); - this.level.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - if (player.isSurvival() || player.isAdventure()) { - replaceBucket(item, player, ev.getItem()); - } - if (cauldron.hasPotion()) {//if has potion - clearWithFizz(cauldron); - } else if (item.getDamage() == 8) { //water bucket - this.setFillLevel(3);//fill - cauldron.clearCustomColor(); - this.level.setBlock(this, this, true); - this.getLevel().addSoundToViewers(this, Sound.CAULDRON_FILLWATER); - } else { // lava bucket - if (!isEmpty()) { - clearWithFizz(cauldron); - } - } - //this.update(); - } - } - break; - case Item.DYE: - if (isEmpty() || cauldron.hasPotion()) { - break; - } - - if (player.isSurvival() || player.isAdventure()) { - item.setCount(item.getCount() - 1); - player.getInventory().setItemInHand(item); - } - - BlockColor color = new ItemDye(item.getDamage()).getDyeColor().getColor(); - if (!cauldron.isCustomColor()) { - cauldron.setCustomColor(color); - } else { - BlockColor current = cauldron.getCustomColor(); - BlockColor mixed = new BlockColor( - current.getRed() + (color.getRed() - current.getRed()) / 2, - current.getGreen() + (color.getGreen() - current.getGreen()) / 2, - current.getBlue() + (color.getBlue() - current.getBlue()) / 2 - ); - cauldron.setCustomColor(mixed); - } - this.level.addSoundToViewers(this, Sound.CAULDRON_ADDDYE); - break; - case Item.LEATHER_CAP: - case Item.LEATHER_TUNIC: - case Item.LEATHER_PANTS: - case Item.LEATHER_BOOTS: - case Item.LEATHER_HORSE_ARMOR: - if (isEmpty() || cauldron.hasPotion()) { - break; - } - - CompoundTag compoundTag = item.hasCompoundTag() ? item.getNamedTag() : new CompoundTag(); - compoundTag.putInt("customColor", cauldron.getCustomColor().getRGB()); - item.setCompoundTag(compoundTag); - player.getInventory().setItemInHand(item); - - setFillLevel(getFillLevel() - 1); - this.level.setBlock(this, this, true, true); - this.level.addSoundToViewers(this, Sound.CAULDRON_DYEARMOR); - break; - case Item.POTION: - case Item.SPLASH_POTION: - case Item.LINGERING_POTION: - if (!isEmpty() && (cauldron.hasPotion() ? cauldron.getPotionId() != item.getDamage() : item.getDamage() != 0)) { - clearWithFizz(cauldron); - consumePotion(item, player); - break; - } - if (isFull()) { - break; - } - if (item.getDamage() != 0 && isEmpty()) { - cauldron.setPotionId(item.getDamage()); - } - cauldron.setPotionType( - item.getId() == Item.POTION ? BlockEntityCauldron.POTION_TYPE_NORMAL : - item.getId() == Item.SPLASH_POTION ? BlockEntityCauldron.POTION_TYPE_SPLASH : - BlockEntityCauldron.POTION_TYPE_LINGERING - ); - cauldron.spawnToAll(); - - setFillLevel(getFillLevel() + 1); - this.level.setBlock(this, this, true); - consumePotion(item, player); - this.getLevel().addSoundToViewers(this, Sound.CAULDRON_FILLPOTION); - break; - case Item.GLASS_BOTTLE: - if (isEmpty()) { - break; - } - - int meta = cauldron.hasPotion() ? cauldron.getPotionId() : 0; - Item potion; - if (meta == 0) { - potion = new ItemPotion(); - } else { - switch (cauldron.getPotionType()) { - case BlockEntityCauldron.POTION_TYPE_SPLASH: - potion = new ItemPotionSplash(meta); - break; - case BlockEntityCauldron.POTION_TYPE_LINGERING: - potion = new ItemPotionLingering(meta); - break; - case BlockEntityCauldron.POTION_TYPE_NORMAL: - default: - potion = new ItemPotion(meta); - break; - } - } - - setFillLevel(getFillLevel() - 1); - if (isEmpty()) { - cauldron.setPotionId(0xffff);//reset potion - cauldron.clearCustomColor(); - } - this.level.setBlock(this, this, true); - - boolean consumeBottle = player.isSurvival() || player.isAdventure(); - if (consumeBottle && item.getCount() == 1) { - player.getInventory().setItemInHand(potion); - } else if (item.getCount() > 1) { - if (consumeBottle) { - item.setCount(item.getCount() - 1); - player.getInventory().setItemInHand(item); - } - - if (player.getInventory().canAddItem(potion)) { - player.getInventory().addItem(potion); - } else { - player.getLevel().dropItem(player.add(0, 1.3, 0), potion, player.getDirectionVector().multiply(0.4)); - } - } - - this.getLevel().addSoundToViewers(this, Sound.CAULDRON_TAKEPOTION); - break; - case BlockID.SHULKER_BOX: - if (isEmpty() || cauldron.isCustomColor() || cauldron.hasPotion()) { - break; - } - - player.getInventory().setItemInHand(Item.get(Item.UNDYED_SHULKER_BOX).setCompoundTag(item.getCompoundTag())); - setFillLevel(getFillLevel() - 1); - this.level.setBlock(this, this, true); - this.getLevel().addSoundToViewers(this, Sound.CAULDRON_TAKEPOTION); - break; - default: - return true; - } - - this.level.updateComparatorOutputLevel(this); - return true; - } - - protected void replaceBucket(Item oldBucket, Player player, Item newBucket) { - if (player.isSurvival() || player.isAdventure()) { - if (oldBucket.getCount() == 1) { - player.getInventory().setItemInHand(newBucket); - } else { - oldBucket.setCount(oldBucket.getCount() - 1); - if (player.getInventory().canAddItem(newBucket)) { - player.getInventory().addItem(newBucket); - } else { - player.getLevel().dropItem(player.add(0, 1.3, 0), newBucket, player.getDirectionVector().multiply(0.4)); - } - } - } - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - CompoundTag nbt = new CompoundTag("") - .putString("id", BlockEntity.CAULDRON) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putShort("PotionId", 0xffff) - .putByte("SplashPotion", 0); - - if (item.hasCustomBlockData()) { - Map customData = item.getCustomBlockData().getTags(); - for (Map.Entry tag : customData.entrySet()) { - nbt.put(tag.getKey(), tag.getValue()); - } - } - - BlockEntity.createBlockEntity(BlockEntity.CAULDRON, this.getChunk(), nbt); - this.getLevel().setBlock(block, this, true, true); - return true; - } - - @Override - public Item[] getDrops(Item item) { - if (item.getTier() >= ItemTool.TIER_WOODEN) { - return new Item[]{new ItemCauldron()}; - } - - return new Item[0]; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_RANDOM && level.isRaining() && !this.isFull()) { - if (freezing < 1) { - freezing = Utils.freezingBiomes.contains(level.getBiomeId((int) this.x, (int) this.z)) ? (byte) 2 : (byte) 1; - } - if (freezing == 1 && ThreadLocalRandom.current().nextInt(20) == 0 && level.canBlockSeeSky(this)) { - this.setFillLevel(this.getFillLevel() + 1); - this.getLevel().setBlock(this, this, true, true); - return Level.BLOCK_UPDATE_RANDOM; - } - } - return super.onUpdate(type); - } - - @Override - public Item toItem() { - return new ItemCauldron(); - } - - public boolean hasComparatorInputOverride() { - return true; - } - - public int getComparatorInputOverride() { - return getFillLevel(); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - // Source: PN/#666 - private void consumePotion(Item item, Player player) { - if (player.isSurvival() || player.isAdventure()) { - if (item.getCount() == 1) { - player.getInventory().setItemInHand(new ItemBlock(new BlockAir())); - } else if (item.getCount() > 1) { - item.setCount(item.getCount() - 1); - player.getInventory().setItemInHand(item); - Item bottle = new ItemGlassBottle(); - if (player.getInventory().canAddItem(bottle)) { - player.getInventory().addItem(bottle); - } else { - player.getLevel().dropItem(player.add(0, 1.3, 0), bottle, player.getDirectionVector().multiply(0.4)); - } - } - } - } - - // Source: PN/#666 - public void clearWithFizz(BlockEntityCauldron cauldron) { - this.setFillLevel(0); - cauldron.setPotionId(0xffff); - cauldron.setSplashPotion(false); - cauldron.clearCustomColor(); - this.level.setBlock(this, new BlockCauldron(0), true); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_FIZZ); - this.getLevel().addParticle(new SmokeParticle(add(Math.random(), 1.2, Math.random())), null, 8); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockChemicalHeat.java b/src/main/java/cn/nukkit/block/BlockChemicalHeat.java deleted file mode 100644 index 3b1d7c877..000000000 --- a/src/main/java/cn/nukkit/block/BlockChemicalHeat.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; - -/** - * Created by PetteriM1 - */ -public class BlockChemicalHeat extends BlockSolid { - - @Override - public int getId() { - return CHEMICAL_HEAT; - } - - @Override - public String getName() { - return "Heat Block"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 2.5; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - this.toItem() - }; - } - return new Item[0]; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockChemistryTable.java b/src/main/java/cn/nukkit/block/BlockChemistryTable.java deleted file mode 100644 index 6519a8349..000000000 --- a/src/main/java/cn/nukkit/block/BlockChemistryTable.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; - -/** - * Created by PetteriM1 - */ -public class BlockChemistryTable extends BlockSolidMeta { - - public BlockChemistryTable() { - this(0); - } - - public BlockChemistryTable(int meta) { - super(meta); - } - - @Override - public int getId() { - return CHEMISTRY_TABLE; - } - - @Override - public String getName() { - int meta = this.getDamage(); - if (meta >= 12) { - return "Lab Table"; - } else if (meta >= 8) { - return "Element Constructor"; - } else if (meta >= 4) { - return "Material Reducer"; - } - return "Compound Creator"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getResistance() { - return this.getDamage() >= 12 ? 3 : 2; - } - - @Override - public double getHardness() { - return 2.5; - } - - @Override - public Item toItem() { - return new ItemBlock(this, (this.getDamage() >> 2) << 2); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(((this.getDamage() >> 2) << 2) + (player != null ? player.getDirection().getHorizontalIndex() : 0)); - return this.getLevel().setBlock(block, this, true); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockChest.java b/src/main/java/cn/nukkit/block/BlockChest.java deleted file mode 100644 index 1a5e51b95..000000000 --- a/src/main/java/cn/nukkit/block/BlockChest.java +++ /dev/null @@ -1,225 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityChest; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.mob.EntityPiglin; -import cn.nukkit.inventory.ContainerInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.StringTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -import java.util.Map; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockChest extends BlockTransparentMeta implements Faceable { - - private static final int[] faces = {2, 5, 3, 4}; - - public BlockChest() { - this(0); - } - - public BlockChest(int meta) { - super(meta); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public int getId() { - return CHEST; - } - - @Override - public String getName() { - return "Chest"; - } - - @Override - public double getHardness() { - return 2.5; - } - - @Override - public double getResistance() { - return 12.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x + 0.0625, - this.y, - this.z + 0.0625, - this.x + 0.9375, - this.y + 0.9475, - this.z + 0.9375 - ); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - BlockEntityChest chest = null; - this.setDamage(faces[player != null ? player.getDirection().getHorizontalIndex() : 0]); - - for (int side = 2; side <= 5; ++side) { - if ((this.getDamage() == 4 || this.getDamage() == 5) && (side == 4 || side == 5)) { - continue; - } else if ((this.getDamage() == 3 || this.getDamage() == 2) && (side == 2 || side == 3)) { - continue; - } - Block c = this.getSide(BlockFace.fromIndex(side)); - if (c instanceof BlockChest && c.getDamage() == this.getDamage()) { - BlockEntity blockEntity = this.getLevel().getBlockEntity(c); - if (blockEntity instanceof BlockEntityChest && !((BlockEntityChest) blockEntity).isPaired()) { - chest = (BlockEntityChest) blockEntity; - break; - } - } - } - - this.getLevel().setBlock(block, this, true, true); - CompoundTag nbt = new CompoundTag("") - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.CHEST) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (item.hasCustomName()) { - nbt.putString("CustomName", item.getCustomName()); - } - - if (item.hasCustomBlockData()) { - Map customData = item.getCustomBlockData().getTags(); - for (Map.Entry tag : customData.entrySet()) { - nbt.put(tag.getKey(), tag.getValue()); - } - } - - BlockEntityChest blockEntity = (BlockEntityChest) BlockEntity.createBlockEntity(BlockEntity.CHEST, this.getChunk(), nbt); - - if (chest != null) { - chest.pairWith(blockEntity); - blockEntity.pairWith(chest); - } - - return true; - } - - @Override - public boolean onBreak(Item item) { - BlockEntity t = this.getLevel().getBlockEntity(this); - if (t instanceof BlockEntityChest) { - ((BlockEntityChest) t).unpair(); - } - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - Block top = this.up(); - if (!top.isTransparent() && !(top instanceof BlockSlab && (top.getDamage() & 0x07) <= 0)) { // avoid issues with the slab hack - return true; - } - - BlockEntity t = this.getLevel().getBlockEntity(this); - BlockEntityChest chest; - if (t instanceof BlockEntityChest) { - chest = (BlockEntityChest) t; - } else { - CompoundTag nbt = new CompoundTag("") - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.CHEST) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - chest = (BlockEntityChest) BlockEntity.createBlockEntity(BlockEntity.CHEST, this.getChunk(), nbt); - } - - if (chest.namedTag.contains("Lock") && chest.namedTag.get("Lock") instanceof StringTag) { - if (!chest.namedTag.getString("Lock").equals(item.getCustomName())) { - return true; - } - } - - player.addWindow(chest.getInventory()); - - for (Entity e : this.getChunk().getEntities().values()) { - if (e instanceof EntityPiglin) { - ((EntityPiglin) e).setAngry(600); - } - } - } - - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } - - public boolean hasComparatorInputOverride() { - return true; - } - - public int getComparatorInputOverride() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityChest) { - return ContainerInventory.calculateRedstone(((BlockEntityChest) blockEntity).getInventory()); - } - - return super.getComparatorInputOverride(); - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public boolean onBreak(Item item, Player player) { - boolean broken = this.onBreak(item); - - if (broken && player != null) { - for (Entity e : this.getChunk().getEntities().values()) { - if (e instanceof EntityPiglin) { - ((EntityPiglin) e).setAngry(600); - } - } - } - - return broken; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockChorusFlower.java b/src/main/java/cn/nukkit/block/BlockChorusFlower.java deleted file mode 100644 index e00516280..000000000 --- a/src/main/java/cn/nukkit/block/BlockChorusFlower.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -public class BlockChorusFlower extends BlockChorusPlant { - - @Override - public int getId() { - return CHORUS_FLOWER; - } - - @Override - public String getName() { - return "Chorus Flower"; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{this.toItem()}; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockChorusPlant.java b/src/main/java/cn/nukkit/block/BlockChorusPlant.java deleted file mode 100644 index 6840aefaf..000000000 --- a/src/main/java/cn/nukkit/block/BlockChorusPlant.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -public class BlockChorusPlant extends BlockTransparent { - - @Override - public int getId() { - return CHORUS_PLANT; - } - - @Override - public String getName() { - return "Chorus Plant"; - } - - @Override - public double getHardness() { - return 0.4; - } - - @Override - public double getResistance() { - return 0.4; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = block.down(); - if (!(down instanceof BlockEndStone) && - !(down instanceof BlockChorusPlant) && - !(block.north() instanceof BlockChorusPlant) && - !(block.east() instanceof BlockChorusPlant) && - !(block.south() instanceof BlockChorusPlant) && - !(block.west() instanceof BlockChorusPlant)) { - return false; - } - - this.level.setBlock(block, this, true, true); - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().isTransparent() && - !(this.down() instanceof BlockChorusPlant) && - !(this.north() instanceof BlockChorusPlant) && - !(this.east() instanceof BlockChorusPlant) && - !(this.south() instanceof BlockChorusPlant) && - !(this.west() instanceof BlockChorusPlant)) { - this.getLevel().useBreakOn(this); - - return Level.BLOCK_UPDATE_NORMAL; - } - } - - return 0; - } - - @Override - public BlockColor getColor() { - return BlockColor.PURPLE_BLOCK_COLOR; - } - - @Override - public Item[] getDrops(Item item) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return Utils.rand() ? new Item[]{Item.get(ItemID.CHORUS_FRUIT, 0, 1)} : new Item[0]; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockClay.java b/src/main/java/cn/nukkit/block/BlockClay.java deleted file mode 100644 index f09a7ed35..000000000 --- a/src/main/java/cn/nukkit/block/BlockClay.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemClay; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockClay extends BlockSolid { - - @Override - public double getHardness() { - return 0.6; - } - - @Override - public double getResistance() { - return 3; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - public int getId() { - return CLAY_BLOCK; - } - - @Override - public String getName() { - return "Clay Block"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[]{ - new ItemClay(0, 4) - }; - } - - @Override - public BlockColor getColor() { - return BlockColor.CLAY_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCoal.java b/src/main/java/cn/nukkit/block/BlockCoal.java deleted file mode 100644 index 9df6085b5..000000000 --- a/src/main/java/cn/nukkit/block/BlockCoal.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/24 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockCoal extends BlockSolid { - - @Override - public int getId() { - return COAL_BLOCK; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public int getBurnChance() { - return 5; - } - - @Override - public int getBurnAbility() { - return 5; - } - - @Override - public String getName() { - return "Block of Coal"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.BLACK_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCobblestone.java b/src/main/java/cn/nukkit/block/BlockCobblestone.java deleted file mode 100644 index bdf270cb1..000000000 --- a/src/main/java/cn/nukkit/block/BlockCobblestone.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockCobblestone extends BlockSolid { - - @Override - public int getId() { - return COBBLESTONE; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Cobblestone"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCobweb.java b/src/main/java/cn/nukkit/block/BlockCobweb.java deleted file mode 100644 index 8cee81d3e..000000000 --- a/src/main/java/cn/nukkit/block/BlockCobweb.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.entity.Entity; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemString; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockCobweb extends BlockFlowable { - - public BlockCobweb() { - this(0); - } - - public BlockCobweb(int meta) { - super(0); - } - - @Override - public String getName() { - return "Cobweb"; - } - - @Override - public int getId() { - return COBWEB; - } - - @Override - public double getHardness() { - return 4; - } - - @Override - public double getResistance() { - return 20; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SWORD; - } - - @Override - public void onEntityCollide(Entity entity) { - entity.resetFallDistance(); - } - - @Override - public Item[] getDrops(Item item) { - if (item.isShears()) { - return new Item[]{ - this.toItem() - }; - } else if (item.isSword()) { - return new Item[]{ - new ItemString() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.CLOTH_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCocoa.java b/src/main/java/cn/nukkit/block/BlockCocoa.java deleted file mode 100644 index 4363c84bc..000000000 --- a/src/main/java/cn/nukkit/block/BlockCocoa.java +++ /dev/null @@ -1,212 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.block.BlockGrowEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDye; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.DyeColor; -import cn.nukkit.utils.Faceable; -import cn.nukkit.utils.Utils; - -/** - * Created by CreeperFace on 27. 10. 2016. - */ -public class BlockCocoa extends BlockTransparentMeta implements Faceable { - - protected static final AxisAlignedBB[] EAST = new AxisAlignedBB[]{new AxisAlignedBB(0.6875D, 0.4375D, 0.375D, 0.9375D, 0.75D, 0.625D), new AxisAlignedBB(0.5625D, 0.3125D, 0.3125D, 0.9375D, 0.75D, 0.6875D), new AxisAlignedBB(0.5625D, 0.3125D, 0.3125D, 0.9375D, 0.75D, 0.6875D)}; - protected static final AxisAlignedBB[] WEST = new AxisAlignedBB[]{new AxisAlignedBB(0.0625D, 0.4375D, 0.375D, 0.3125D, 0.75D, 0.625D), new AxisAlignedBB(0.0625D, 0.3125D, 0.3125D, 0.4375D, 0.75D, 0.6875D), new AxisAlignedBB(0.0625D, 0.3125D, 0.3125D, 0.4375D, 0.75D, 0.6875D)}; - protected static final AxisAlignedBB[] NORTH = new AxisAlignedBB[]{new AxisAlignedBB(0.375D, 0.4375D, 0.0625D, 0.625D, 0.75D, 0.3125D), new AxisAlignedBB(0.3125D, 0.3125D, 0.0625D, 0.6875D, 0.75D, 0.4375D), new AxisAlignedBB(0.3125D, 0.3125D, 0.0625D, 0.6875D, 0.75D, 0.4375D)}; - protected static final AxisAlignedBB[] SOUTH = new AxisAlignedBB[]{new AxisAlignedBB(0.375D, 0.4375D, 0.6875D, 0.625D, 0.75D, 0.9375D), new AxisAlignedBB(0.3125D, 0.3125D, 0.5625D, 0.6875D, 0.75D, 0.9375D), new AxisAlignedBB(0.3125D, 0.3125D, 0.5625D, 0.6875D, 0.75D, 0.9375D)}; - - private static final short[] faces = new short[]{ - 0, - 0, - 0, - 2, - 3, - 1, - }; - - private static final short[] faces2 = new short[]{ - 3, 4, 2, 5, 3, 4, 2, 5, 3, 4, 2, 5 - }; - - public BlockCocoa() { - this(0); - } - - public BlockCocoa(int meta) { - super(meta); - } - - @Override - public int getId() { - return COCOA; - } - - @Override - public String getName() { - return "Cocoa"; - } - - @Override - public AxisAlignedBB getBoundingBox() { - if (boundingBox == null) { - this.boundingBox = recalculateBoundingBox(); - } - - return this.boundingBox; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - AxisAlignedBB[] bbs; - - int damage = this.getDamage(); - if (damage > 11) { - this.setDamage(11); - } - - switch (getDamage()) { - case 1: - case 5: - case 9: - bbs = EAST; - break; - case 2: - case 6: - case 10: - bbs = SOUTH; - break; - case 3: - case 7: - case 11: - bbs = WEST; - break; - default: - bbs = NORTH; - break; - } - - return bbs[(this.getDamage() >> 2)].getOffsetBoundingBox(x, y, z); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (target.getId() == Block.WOOD && (target.getDamage() & 0x03) == BlockWood.JUNGLE) { - if (face != BlockFace.DOWN && face != BlockFace.UP) { - this.setDamage(faces[face.getIndex()]); - this.level.setBlock(block, this, true, true); - return true; - } - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - Block side = this.getSide(BlockFace.fromIndex(faces2[this.getDamage()])); - - if (side.getId() != Block.WOOD && (side.getDamage() & 0x03) != BlockWood.JUNGLE) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if (Utils.random.nextInt(2) == 1) { - if (this.getDamage() >> 2 < 2) { - BlockCocoa block = (BlockCocoa) this.clone(); - block.setDamage(block.getDamage() + 4); - BlockGrowEvent ev = new BlockGrowEvent(this, block); - Server.getInstance().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - this.getLevel().setBlock(this, ev.getNewState(), true, true); - } else { - return Level.BLOCK_UPDATE_RANDOM; - } - } - } else { - return Level.BLOCK_UPDATE_RANDOM; - } - } - - return 0; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.DYE && item.getDamage() == 0x0f) { - Block block = this.clone(); - if (this.getDamage() >> 2 < 2) { - block.setDamage(block.getDamage() + 4); - BlockGrowEvent ev = new BlockGrowEvent(this, block); - Server.getInstance().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return false; - } - - this.getLevel().setBlock(this, ev.getNewState(), true, true); - this.level.addParticle(new BoneMealParticle(this)); - - if (player != null && !player.isCreative()) { - item.count--; - } - } - - return true; - } - - return false; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public double getHardness() { - return 0.2; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public Item toItem() { - return new ItemDye(DyeColor.BROWN.getDyeData()); - } - - @Override - public Item[] getDrops(Item item) { - if (this.getDamage() >= 8) { - return new Item[]{ - new ItemDye(3, Utils.rand(2, 3)) - }; - } else { - return new Item[]{ - new ItemDye(3, 1) - }; - } - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockColoredTorchBP.java b/src/main/java/cn/nukkit/block/BlockColoredTorchBP.java deleted file mode 100644 index 387683d47..000000000 --- a/src/main/java/cn/nukkit/block/BlockColoredTorchBP.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.block; - -/** - * Created by PetteriM1 - */ -public class BlockColoredTorchBP extends BlockTorch { - - public BlockColoredTorchBP() { - this(0); - } - - public BlockColoredTorchBP(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Blue Torch"; - } - - @Override - public int getId() { - return COLORED_TORCH_BP; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockColoredTorchRG.java b/src/main/java/cn/nukkit/block/BlockColoredTorchRG.java deleted file mode 100644 index 10acc5471..000000000 --- a/src/main/java/cn/nukkit/block/BlockColoredTorchRG.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.block; - -/** - * Created by PetteriM1 - */ -public class BlockColoredTorchRG extends BlockTorch { - - public BlockColoredTorchRG() { - this(0); - } - - public BlockColoredTorchRG(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Red Torch"; - } - - @Override - public int getId() { - return COLORED_TORCH_RG; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCommandBlock.java b/src/main/java/cn/nukkit/block/BlockCommandBlock.java deleted file mode 100644 index 4f727d3d0..000000000 --- a/src/main/java/cn/nukkit/block/BlockCommandBlock.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -public class BlockCommandBlock extends BlockSolid { - - @Override - public int getId() { - return COMMAND_BLOCK; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public String getName() { - return "Command Block"; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCommandBlockChain.java b/src/main/java/cn/nukkit/block/BlockCommandBlockChain.java deleted file mode 100644 index 5f11fc8c5..000000000 --- a/src/main/java/cn/nukkit/block/BlockCommandBlockChain.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -public class BlockCommandBlockChain extends BlockSolid { - - @Override - public int getId() { - return CHAIN_COMMAND_BLOCK; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public String getName() { - return "Chain Command Block"; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCommandBlockRepeating.java b/src/main/java/cn/nukkit/block/BlockCommandBlockRepeating.java deleted file mode 100644 index 179badce4..000000000 --- a/src/main/java/cn/nukkit/block/BlockCommandBlockRepeating.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -public class BlockCommandBlockRepeating extends BlockSolid { - - @Override - public int getId() { - return REPEATING_COMMAND_BLOCK; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public String getName() { - return "Repeating Command Block"; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockConcrete.java b/src/main/java/cn/nukkit/block/BlockConcrete.java deleted file mode 100644 index 115f54301..000000000 --- a/src/main/java/cn/nukkit/block/BlockConcrete.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockConcrete extends BlockSolidMeta { - - public BlockConcrete() { - this(0); - } - - public BlockConcrete(int meta) { - super(meta); - } - - @Override - public int getId() { - return CONCRETE; - } - - @Override - public double getResistance() { - return 9; - } - - @Override - public double getHardness() { - return 1.8; - } - - @Override - public String getName() { - return "Concrete"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - return item.getTier() >= ItemTool.TIER_WOODEN ? new Item[]{toItem()} : new Item[0]; - } - - @Override - public BlockColor getColor() { - return DyeColor.getByWoolData(getDamage()).getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(getDamage()); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockConcretePowder.java b/src/main/java/cn/nukkit/block/BlockConcretePowder.java deleted file mode 100644 index 502cd6564..000000000 --- a/src/main/java/cn/nukkit/block/BlockConcretePowder.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockConcretePowder extends BlockFallableMeta { - - public BlockConcretePowder() { - super(0); - } - - public BlockConcretePowder(int meta) { - super(meta); - } - - @Override - public int getFullId() { - return (3792) + getDamage(); - } - - @Override - public int getId() { - return CONCRETE_POWDER; - } - - @Override - public String getName() { - return "Concrete Powder"; - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - super.onUpdate(Level.BLOCK_UPDATE_NORMAL); - - for (int side = 1; side <= 5; side++) { - Block block = this.getSide(BlockFace.fromIndex(side)); - if (block.getId() == Block.WATER || block.getId() == Block.STILL_WATER) { - this.level.setBlock(this, Block.get(Block.CONCRETE, this.getDamage()), true, true); - } - } - - return Level.BLOCK_UPDATE_NORMAL; - } - return 0; - } - - @Override - public boolean place(Item item, Block b, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - boolean concrete = false; - - for (int side = 1; side <= 5; side++) { - Block block = this.getSide(BlockFace.fromIndex(side)); - if (block.getId() == Block.WATER || block.getId() == Block.STILL_WATER) { - concrete = true; - break; - } - } - - if (concrete) { - this.level.setBlock(this, Block.get(Block.CONCRETE, this.getDamage()), true, true); - } else { - this.level.setBlock(this, this, true, true); - } - - return true; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockCraftingTable.java b/src/main/java/cn/nukkit/block/BlockCraftingTable.java deleted file mode 100644 index 1cc08b443..000000000 --- a/src/main/java/cn/nukkit/block/BlockCraftingTable.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.player.CraftingTableOpenEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.network.protocol.ContainerOpenPacket; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/5 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockCraftingTable extends BlockSolid { - - @Override - public String getName() { - return "Crafting Table"; - } - - @Override - public int getId() { - return WORKBENCH; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public double getHardness() { - return 2.5; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - CraftingTableOpenEvent ev = new CraftingTableOpenEvent(player, this); - player.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - player.craftingType = Player.CRAFTING_BIG; - player.setCraftingGrid(player.getUIInventory().getBigCraftingGrid()); - if (player.protocol >= 407) { - ContainerOpenPacket pk = new ContainerOpenPacket(); - pk.windowId = -1; - pk.type = 1; - pk.x = (int) x; - pk.y = (int) y; - pk.z = (int) z; - pk.entityId = player.getId(); - player.dataPacket(pk); - } - } - } - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockCrops.java b/src/main/java/cn/nukkit/block/BlockCrops.java deleted file mode 100644 index 17579d200..000000000 --- a/src/main/java/cn/nukkit/block/BlockCrops.java +++ /dev/null @@ -1,102 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.block.BlockGrowEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockCrops extends BlockFlowable { - - protected BlockCrops(int meta) { - super(meta); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (block.down().getId() == FARMLAND) { - this.getLevel().setBlock(block, this, true, true); - return true; - } - return false; - } - - @Override - public boolean onActivate(Item item, Player player) { - // Bone meal - if (item.getId() == Item.DYE && item.getDamage() == 0x0f) { - if (this.getDamage() < 7) { - BlockCrops block = (BlockCrops) this.clone(); - block.setDamage(block.getDamage() + Utils.random.nextInt(3) + 2); - if (block.getDamage() > 7) { - block.setDamage(7); - } - BlockGrowEvent ev = new BlockGrowEvent(this, block); - Server.getInstance().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return false; - } - - this.getLevel().setBlock(this, ev.getNewState(), false, true); - - this.level.addParticle(new BoneMealParticle(this)); - - if (player != null && !player.isCreative()) { - item.count--; - } - } - - return true; - } - - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().getId() != FARMLAND) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if (Utils.random.nextInt(2) == 1) { - if (this.getDamage() < 0x07) { - BlockCrops block = (BlockCrops) this.clone(); - block.setDamage(block.getDamage() + 1); - BlockGrowEvent ev = new BlockGrowEvent(this, block); - Server.getInstance().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - this.getLevel().setBlock(this, ev.getNewState(), false, true); - } else { - return Level.BLOCK_UPDATE_RANDOM; - } - } - } else { - return Level.BLOCK_UPDATE_RANDOM; - } - } - - return 0; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDandelion.java b/src/main/java/cn/nukkit/block/BlockDandelion.java deleted file mode 100644 index 965f7ff4d..000000000 --- a/src/main/java/cn/nukkit/block/BlockDandelion.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockDandelion extends BlockFlower { - - public BlockDandelion() { - this(0); - } - - public BlockDandelion(int meta) { - super(0); - } - - @Override - public String getName() { - return "Dandelion"; - } - - @Override - public int getId() { - return DANDELION; - } - - @Override - protected Block getUncommonFlower() { - return get(POPPY); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDaylightDetector.java b/src/main/java/cn/nukkit/block/BlockDaylightDetector.java deleted file mode 100644 index c6b511ded..000000000 --- a/src/main/java/cn/nukkit/block/BlockDaylightDetector.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/22 by CreeperFace. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockDaylightDetector extends BlockTransparent { - - @Override - public int getId() { - return DAYLIGHT_DETECTOR; - } - - @Override - public String getName() { - return "Daylight Detector"; - } - - @Override - public double getHardness() { - return 0.2; - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - this.getLevel().setBlock(this, Block.get(DAYLIGHT_DETECTOR_INVERTED)); - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public boolean isPowerSource() { - return this.level.isAnimalSpawningAllowedByTime(); - } - - @Override - public int getWeakPower(BlockFace face) { - return this.level.isAnimalSpawningAllowedByTime() ? 15 : 0; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 0.625, - this.z + 1 - ); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDaylightDetectorInverted.java b/src/main/java/cn/nukkit/block/BlockDaylightDetectorInverted.java deleted file mode 100644 index 5725949f0..000000000 --- a/src/main/java/cn/nukkit/block/BlockDaylightDetectorInverted.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.math.BlockFace; - -/** - * Created on 2015/11/22 by CreeperFace. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockDaylightDetectorInverted extends BlockDaylightDetector { - - @Override - public int getId() { - return DAYLIGHT_DETECTOR_INVERTED; - } - - @Override - public String getName() { - return "Daylight Detector Inverted"; - } - - @Override - public boolean onActivate(Item item, Player player) { - this.getLevel().setBlock(this, Block.get(DAYLIGHT_DETECTOR)); - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(DAYLIGHT_DETECTOR), 0); - } - - @Override - public boolean isPowerSource() { - return !this.level.isAnimalSpawningAllowedByTime(); - } - - @Override - public int getWeakPower(BlockFace face) { - return this.level.isAnimalSpawningAllowedByTime() ? 0 : 15; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDeadBush.java b/src/main/java/cn/nukkit/block/BlockDeadBush.java deleted file mode 100644 index 3542944fd..000000000 --- a/src/main/java/cn/nukkit/block/BlockDeadBush.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemStick; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockDeadBush extends BlockFlowable { - - public BlockDeadBush() { - this(0); - } - - public BlockDeadBush(int meta) { - super(0); - } - - @Override - public String getName() { - return "Dead Bush"; - } - - @Override - public int getId() { - return DEAD_BUSH; - } - - @Override - public boolean canBeReplaced() { - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (down.getId() == SAND || down.getId() == TERRACOTTA || down.getId() == STAINED_TERRACOTTA || down.getId() == DIRT || down.getId() == PODZOL) { - this.getLevel().setBlock(block, this, true, true); - return true; - } - return false; - } - - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().isTransparent()) { - this.getLevel().useBreakOn(this); - - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isShears()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[]{ - new ItemStick(0, Utils.random.nextInt(3)) - }; - } - } - - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDiamond.java b/src/main/java/cn/nukkit/block/BlockDiamond.java deleted file mode 100644 index 61f95a42c..000000000 --- a/src/main/java/cn/nukkit/block/BlockDiamond.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockDiamond extends BlockSolid { - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public int getId() { - return DIAMOND_BLOCK; - } - - @Override - public String getName() { - return "Block of Diamond"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_IRON) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.DIAMOND_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDirt.java b/src/main/java/cn/nukkit/block/BlockDirt.java deleted file mode 100644 index ad492855f..000000000 --- a/src/main/java/cn/nukkit/block/BlockDirt.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Sound; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * AMAZING COARSE DIRT added by kvetinac97 - * Nukkit Project - */ -public class BlockDirt extends BlockSolidMeta { - - public BlockDirt() { - this(0); - } - - public BlockDirt(int meta) { - super(meta); - } - - @Override - public int getId() { - return DIRT; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - public String getName() { - return this.getDamage() == 0 ? "Dirt" : "Coarse Dirt"; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.isHoe()) { - Block up = this.up(); - if (up instanceof BlockAir || up instanceof BlockFlowable) { - item.useOn(this); - this.getLevel().setBlock(this, this.getDamage() == 0 ? get(FARMLAND) : get(DIRT), true); - if (player != null) { - player.getLevel().addSoundToViewers(player, Sound.STEP_GRASS); - } - return true; - } - } else if (item.isShovel()) { - Block up = this.up(); - if (up instanceof BlockAir || up instanceof BlockFlowable) { - item.useOn(this); - this.getLevel().setBlock(this, Block.get(GRASS_PATH)); - if (player != null) { - player.getLevel().addSoundToViewers(player, Sound.STEP_GRASS); - } - return true; - } - } - - return false; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{new ItemBlock(Block.get(BlockID.DIRT))}; - } - - @Override - public BlockColor getColor() { - return BlockColor.DIRT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDispenser.java b/src/main/java/cn/nukkit/block/BlockDispenser.java deleted file mode 100644 index 4b95d9d36..000000000 --- a/src/main/java/cn/nukkit/block/BlockDispenser.java +++ /dev/null @@ -1,213 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityDispenser; -import cn.nukkit.dispenser.DispenseBehavior; -import cn.nukkit.dispenser.DispenseBehaviorRegister; -import cn.nukkit.inventory.ContainerInventory; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.Faceable; -import cn.nukkit.utils.Utils; - -import java.util.Map.Entry; - -/** - * Created by CreeperFace on 15.4.2017. - */ -public class BlockDispenser extends BlockSolidMeta implements Faceable { - - public BlockDispenser() { - this(0); - } - - public BlockDispenser(int meta) { - super(meta); - } - - @Override - public boolean hasComparatorInputOverride() { - return true; - } - - @Override - public String getName() { - return "Dispenser"; - } - - @Override - public int getId() { - return DISPENSER; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public int getComparatorInputOverride() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityDispenser) { - return ContainerInventory.calculateRedstone(((BlockEntityDispenser) blockEntity).getInventory()); - } - - return 0; - } - - public boolean isTriggered() { - return (this.getDamage() & 8) > 0; - } - - public void setTriggered(boolean value) { - int i = 0; - i |= getBlockFace().getIndex(); - - if (value) { - i |= 8; - } - - this.setDamage(i); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player == null) { - return false; - } - - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (!(blockEntity instanceof BlockEntityDispenser)) { - return false; - } - - player.addWindow(((BlockEntityDispenser) blockEntity).getInventory()); - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (player != null) { - if (Math.abs(player.x - this.x) < 2 && Math.abs(player.z - this.z) < 2) { - double y = player.y + player.getEyeHeight(); - - if (y - this.y > 2) { - this.setDamage(BlockFace.UP.getIndex()); - } else if (this.y - y > 0) { - this.setDamage(BlockFace.DOWN.getIndex()); - } else { - this.setDamage(player.getHorizontalFacing().getOpposite().getIndex()); - } - } else { - this.setDamage(player.getHorizontalFacing().getOpposite().getIndex()); - } - } - - this.getLevel().setBlock(block, this, true); - - BlockEntity.createBlockEntity(BlockEntity.DISPENSER, this.getChunk(), BlockEntity.getDefaultCompound(this, BlockEntity.DISPENSER)); - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_SCHEDULED) { - this.setTriggered(false); - this.level.setBlock(this, this, false, false); - - dispense(); - return type; - } else if (type == Level.BLOCK_UPDATE_REDSTONE) { - if ((level.isBlockPowered(this) || level.isBlockPowered(this.up())) && !isTriggered()) { - this.setTriggered(true); - this.level.setBlock(this, this, false, false); - level.scheduleUpdate(this, this, 4); - } - - return type; - } - - return 0; - } - - public void dispense() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (!(blockEntity instanceof BlockEntityDispenser)) { - return; - } - - int r = 1; - int slot = -1; - Item target = null; - - Inventory inv = ((BlockEntityDispenser) blockEntity).getInventory(); - for (Entry entry : inv.getContents().entrySet()) { - Item item = entry.getValue(); - - if (!item.isNull() && Utils.random.nextInt(r++) == 0) { - target = item; - slot = entry.getKey(); - } - } - - if (target == null) { - //this.level.addLevelSoundEvent(this); //TODO: sound - return; - } - //Item origin = target; - target = target.clone(); - - DispenseBehavior behavior = DispenseBehaviorRegister.getBehavior(target.getId()); - Item result = behavior.dispense(this, getBlockFace(), target); - - if (result == null) { - target.count--; - inv.setItem(slot, target); - } else { - /*if (result.getId() != origin.getId() || result.getDamage() != origin.getDamage()) { - Item[] fit = inv.addItem(result); - - if (fit.length > 0) { - for (Item drop : fit) { - this.level.dropItem(this, drop); - } - } - } else { - inv.setItem(slot, result); - }*/ - inv.setItem(slot, result); - } - } - - public Vector3 getDispensePosition() { - BlockFace facing = getBlockFace(); - return this.add( - 0.5 + 0.7 * facing.getXOffset(), - 0.5 + 0.7 * facing.getYOffset(), - 0.5 + 0.7 * facing.getZOffset() - ); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromIndex(this.getDamage() & 0x07); - } - - @Override - public double getHardness() { - return 0.5; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoor.java b/src/main/java/cn/nukkit/block/BlockDoor.java deleted file mode 100644 index bca10fd19..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoor.java +++ /dev/null @@ -1,353 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.block.BlockRedstoneEvent; -import cn.nukkit.event.block.DoorToggleEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.DoorSound; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.Faceable; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockDoor extends BlockTransparentMeta implements Faceable { - - public static int DOOR_OPEN_BIT = 0x04; - public static int DOOR_TOP_BIT = 0x08; - public static int DOOR_HINGE_BIT = 0x01; - public static int DOOR_POWERED_BIT = 0x02; - - private static final int[] faces = {1, 2, 3, 0}; - - protected BlockDoor(int meta) { - super(meta); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean isSolid() { - return false; - } - - private int getFullDamage() { - int up; - int down; - if (isTop()) { - down = this.down().getDamage(); - up = this.getDamage(); - } else { - down = this.getDamage(); - up = this.up().getDamage(); - } - - boolean isRight = (up & DOOR_HINGE_BIT) > 0; - - return down & 0x07 | (isTop() ? 0x08 : 0) | (isRight ? 0x10 : 0); - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - - double f = 0.1875; - int damage = this.getFullDamage(); - - AxisAlignedBB bb = new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 2, - this.z + 1 - ); - - int j = damage & 0x03; - boolean isOpen = ((damage & 0x04) > 0); - boolean isRight = ((damage & 0x10) > 0); - - if (j == 0) { - if (isOpen) { - if (!isRight) { - bb.setBounds( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + f - ); - } else { - bb.setBounds( - this.x, - this.y, - this.z + 1 - f, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - } else { - bb.setBounds( - this.x, - this.y, - this.z, - this.x + f, - this.y + 1, - this.z + 1 - ); - } - } else if (j == 1) { - if (isOpen) { - if (!isRight) { - bb.setBounds( - this.x + 1 - f, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } else { - bb.setBounds( - this.x, - this.y, - this.z, - this.x + f, - this.y + 1, - this.z + 1 - ); - } - } else { - bb.setBounds( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + f - ); - } - } else if (j == 2) { - if (isOpen) { - if (!isRight) { - bb.setBounds( - this.x, - this.y, - this.z + 1 - f, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } else { - bb.setBounds( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + f - ); - } - } else { - bb.setBounds( - this.x + 1 - f, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - } else if (j == 3) { - if (isOpen) { - if (!isRight) { - bb.setBounds( - this.x, - this.y, - this.z, - this.x + f, - this.y + 1, - this.z + 1 - ); - } else { - bb.setBounds( - this.x + 1 - f, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - } else { - bb.setBounds( - this.x, - this.y, - this.z + 1 - f, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - } - - return bb; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().getId() == AIR) { - Block up = this.up(); - - if (up instanceof BlockDoor) { - this.getLevel().setBlock(up, Block.get(BlockID.AIR), false); - this.getLevel().useBreakOn(this, getToolType() == ItemTool.TYPE_PICKAXE ? Item.get(ItemID.DIAMOND_PICKAXE) : null); // Drop iron doors - } - - return Level.BLOCK_UPDATE_NORMAL; - } - } - - if (type == Level.BLOCK_UPDATE_REDSTONE) { - if ((!isOpen() && this.level.isBlockPowered(this.getLocation())) || (isOpen() && !this.level.isBlockPowered(this.getLocation()))) { - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, isOpen() ? 15 : 0, isOpen() ? 0 : 15)); - - this.toggle(null); - } - } - - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (this.y > 254) return false; - if (face == BlockFace.UP) { - Block blockUp = this.up(); - Block blockDown = this.down(); - if (!blockUp.canBeReplaced() || blockDown.isTransparent()) { - return false; - } - - int direction = faces[player != null ? player.getDirection().getHorizontalIndex() : 0]; - - Block left = this.getSide(player.getDirection().rotateYCCW()); - Block right = this.getSide(player.getDirection().rotateY()); - int metaUp = DOOR_TOP_BIT; - if (left.getId() == this.getId() || (!right.isTransparent() && left.isTransparent())) { //Door hinge - metaUp |= DOOR_HINGE_BIT; - } - - this.setDamage(direction); - this.getLevel().setBlock(block, this, true, true); //Bottom - this.getLevel().setBlock(blockUp, Block.get(this.getId(), metaUp), true); //Top - - if (!this.isOpen() && this.level.isBlockPowered(this.getLocation())) { - this.toggle(null); - metaUp |= DOOR_POWERED_BIT; - this.getLevel().setBlockDataAt(blockUp.getFloorX(), blockUp.getFloorY(), blockUp.getFloorZ(), metaUp); - } - - return true; - } - - return false; - } - - @Override - public boolean onBreak(Item item) { - if (isTop(this.getDamage())) { - Block down = this.down(); - if (down.getId() == this.getId()) { - this.getLevel().setBlock(down, Block.get(BlockID.AIR), true); - } - } else { - Block up = this.up(); - if (up.getId() == this.getId()) { - this.getLevel().setBlock(up, Block.get(BlockID.AIR), true); - } - } - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - - return true; - } - - @Override - public boolean onActivate(Item item) { - return this.onActivate(item, null); - } - - @Override - public boolean onActivate(Item item, Player player) { - if (!this.toggle(player)) { - return false; - } - - this.level.addSound(new DoorSound(this)); - return true; - } - - public boolean toggle(Player player) { - DoorToggleEvent event = new DoorToggleEvent(this, player); - this.getLevel().getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - Block down; - Block up; - if (isTop(this.getDamage())) { - down = this.down(); - up = this; - } else { - down = this; - up = this.up(); - } - - if (up.getId() != down.getId()) { - return false; - } - - this.level.setBlockDataAt(down.getFloorX(), down.getFloorY(), down.getFloorZ(), down.getDamage() ^ 0x04); - this.level.addSound(new DoorSound(this)); - return true; - } - - public boolean isOpen() { - if (isTop(this.getDamage())) { - return (this.down().getDamage() & DOOR_OPEN_BIT) > 0; - } else { - return (this.getDamage() & DOOR_OPEN_BIT) > 0; - } - } - public boolean isTop() { - return isTop(this.getDamage()); - } - - public boolean isTop(int meta) { - return (meta & DOOR_TOP_BIT) != 0; - } - - public boolean isRightHinged() { - if (isTop()) { - return (this.getDamage() & DOOR_HINGE_BIT ) > 0; - } - return (this.up().getDamage() & DOOR_HINGE_BIT) > 0; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoorAcacia.java b/src/main/java/cn/nukkit/block/BlockDoorAcacia.java deleted file mode 100644 index 0ca8279bb..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoorAcacia.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDoorAcacia; -import cn.nukkit.utils.BlockColor; - -public class BlockDoorAcacia extends BlockDoorWood { - - public BlockDoorAcacia() { - this(0); - } - - public BlockDoorAcacia(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Acacia Door Block"; - } - - @Override - public int getId() { - return ACACIA_DOOR_BLOCK; - } - - @Override - public Item toItem() { - return new ItemDoorAcacia(); - } - - @Override - public BlockColor getColor() { - return BlockColor.ORANGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoorBirch.java b/src/main/java/cn/nukkit/block/BlockDoorBirch.java deleted file mode 100644 index 6556596f8..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoorBirch.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDoorBirch; -import cn.nukkit.utils.BlockColor; - -public class BlockDoorBirch extends BlockDoorWood { - - public BlockDoorBirch() { - this(0); - } - - public BlockDoorBirch(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Birch Door Block"; - } - - @Override - public int getId() { - return BIRCH_DOOR_BLOCK; - } - - @Override - public Item toItem() { - return new ItemDoorBirch(); - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoorDarkOak.java b/src/main/java/cn/nukkit/block/BlockDoorDarkOak.java deleted file mode 100644 index 4da32f31c..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoorDarkOak.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDoorDarkOak; -import cn.nukkit.utils.BlockColor; - -public class BlockDoorDarkOak extends BlockDoorWood { - - public BlockDoorDarkOak() { - this(0); - } - - public BlockDoorDarkOak(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Dark Oak Door Block"; - } - - @Override - public int getId() { - return DARK_OAK_DOOR_BLOCK; - } - - @Override - public Item toItem() { - return new ItemDoorDarkOak(); - } - - @Override - public BlockColor getColor() { - return BlockColor.BROWN_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoorIron.java b/src/main/java/cn/nukkit/block/BlockDoorIron.java deleted file mode 100644 index df813f7a8..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoorIron.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDoorIron; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockDoorIron extends BlockDoor { - - public BlockDoorIron() { - this(0); - } - - public BlockDoorIron(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Iron Door Block"; - } - - @Override - public int getId() { - return IRON_DOOR_BLOCK; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 25; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemDoorIron(); - } - - @Override - public BlockColor getColor() { - return BlockColor.IRON_BLOCK_COLOR; - } - - @Override - public boolean onActivate(Item item, Player player) { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoorJungle.java b/src/main/java/cn/nukkit/block/BlockDoorJungle.java deleted file mode 100644 index 5f6cb1fed..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoorJungle.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDoorJungle; -import cn.nukkit.utils.BlockColor; - -public class BlockDoorJungle extends BlockDoorWood { - - public BlockDoorJungle() { - this(0); - } - - public BlockDoorJungle(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Jungle Door Block"; - } - - @Override - public int getId() { - return JUNGLE_DOOR_BLOCK; - } - - @Override - public Item toItem() { - return new ItemDoorJungle(); - } - - @Override - public BlockColor getColor() { - return BlockColor.DIRT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoorSpruce.java b/src/main/java/cn/nukkit/block/BlockDoorSpruce.java deleted file mode 100644 index 1f9accf6e..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoorSpruce.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDoorSpruce; -import cn.nukkit.utils.BlockColor; - -public class BlockDoorSpruce extends BlockDoorWood { - - public BlockDoorSpruce() { - this(0); - } - - public BlockDoorSpruce(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Spruce Door Block"; - } - - @Override - public int getId() { - return SPRUCE_DOOR_BLOCK; - } - - @Override - public Item toItem() { - return new ItemDoorSpruce(); - } - - @Override - public BlockColor getColor() { - return BlockColor.SPRUCE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoorWood.java b/src/main/java/cn/nukkit/block/BlockDoorWood.java deleted file mode 100644 index 3aa05917f..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoorWood.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDoorWood; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockDoorWood extends BlockDoor { - - public BlockDoorWood() { - this(0); - } - - public BlockDoorWood(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Wood Door Block"; - } - - @Override - public int getId() { - return WOOD_DOOR_BLOCK; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public Item toItem() { - return new ItemDoorWood(); - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoublePlant.java b/src/main/java/cn/nukkit/block/BlockDoublePlant.java deleted file mode 100644 index 8f07ffd2e..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoublePlant.java +++ /dev/null @@ -1,174 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemSeedsWheat; -import cn.nukkit.level.Level; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/11/23 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockDoublePlant extends BlockFlowable { - - public static final int SUNFLOWER = 0; - public static final int LILAC = 1; - public static final int TALL_GRASS = 2; - public static final int LARGE_FERN = 3; - public static final int ROSE_BUSH = 4; - public static final int PEONY = 5; - public static final int TOP_HALF_BITMASK = 0x8; - - private static final String[] NAMES = new String[]{ - "Sunflower", - "Lilac", - "Double Tallgrass", - "Large Fern", - "Rose Bush", - "Peony" - }; - - public BlockDoublePlant() { - this(0); - } - - public BlockDoublePlant(int meta) { - super(meta); - } - - @Override - public int getId() { - return DOUBLE_PLANT; - } - - @Override - public boolean canBeReplaced() { - return this.getDamage() == TALL_GRASS || this.getDamage() == LARGE_FERN; - } - - @Override - public String getName() { - return NAMES[this.getDamage() > 5 ? 0 : this.getDamage()]; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if ((this.getDamage() & TOP_HALF_BITMASK) == TOP_HALF_BITMASK) { - // Top - if (!(this.down().getId() == DOUBLE_PLANT)) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), false, true); - return Level.BLOCK_UPDATE_NORMAL; - } - } else { - // Bottom - Block down = this.down(); - if ((down.isTransparent() && down.getId() != FARMLAND) || this.up().getId() != DOUBLE_PLANT) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } - } - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = down(); - Block up = up(); - - if (up.getId() == AIR && (down.getId() == GRASS || down.getId() == DIRT || down.getId() == PODZOL || down.getId() == FARMLAND)) { - this.getLevel().setBlock(block, this, true, false); // If we update the bottom half, it will drop the item because there isn't a flower block above - this.getLevel().setBlock(up, Block.get(DOUBLE_PLANT, getDamage() ^ TOP_HALF_BITMASK), true, true); - return true; - } - - return false; - } - - @Override - public boolean onBreak(Item item) { - Block down = down(); - - if ((this.getDamage() & TOP_HALF_BITMASK) == TOP_HALF_BITMASK) { // Top half - this.getLevel().useBreakOn(down); - } else { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - } - - return true; - } - - @Override - public Item[] getDrops(Item item) { - if ((this.getDamage() & TOP_HALF_BITMASK) != TOP_HALF_BITMASK) { - switch (this.getDamage() & 0x07) { - case TALL_GRASS: - case LARGE_FERN: - boolean dropSeeds = Utils.random.nextInt(10) == 0; - if (item.isShears()) { - //todo enchantment - if (dropSeeds) { - return new Item[]{ - new ItemSeedsWheat(0, 1), - toItem() - }; - } else { - return new Item[]{ - toItem() - }; - } - } - - if (dropSeeds) { - return new Item[]{ - new ItemSeedsWheat() - }; - } else { - return new Item[0]; - } - } - - return new Item[]{toItem()}; - } - - return new Item[0]; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.DYE && item.getDamage() == 0x0f) { // Bone meal - int type = this.getDamage() & 0x07; - if (type == SUNFLOWER || type == LILAC || type == ROSE_BUSH || type == PEONY) { // Flower - if (player != null && !player.isCreative()) { - item.count--; - } - - this.level.addParticle(new BoneMealParticle(this)); - this.level.dropItem(this, this.toItem()); - } - return true; - } - - return false; - } - - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x07, 1); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoubleSlab.java b/src/main/java/cn/nukkit/block/BlockDoubleSlab.java deleted file mode 100644 index 80f8e5c46..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoubleSlab.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockDoubleSlab extends BlockSolidMeta { - - public static final int STONE = 0; - public static final int SANDSTONE = 1; - public static final int WOODEN = 2; - public static final int COBBLESTONE = 3; - public static final int BRICK = 4; - public static final int STONE_BRICK = 5; - public static final int QUARTZ = 6; - public static final int NETHER_BRICK = 7; - - public BlockDoubleSlab() { - this(0); - } - - public BlockDoubleSlab(int meta) { - super(meta); - } - - @Override - public int getId() { - return DOUBLE_SLAB; - } - - //todo hardness and residence - - @Override - public double getHardness() { - return 2; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Stone", - "Sandstone", - "Wooden", - "Cobblestone", - "Brick", - "Stone Brick", - "Quartz", - "Nether Brick" - }; - return "Double " + names[this.getDamage() & 0x07] + " Slab"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.SLAB, this.getDamage() & 0x07, 2) - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - switch (this.getDamage() & 0x07) { - case BlockDoubleSlab.WOODEN: - return BlockColor.WOOD_BLOCK_COLOR; - default: - case BlockDoubleSlab.COBBLESTONE: - case BlockDoubleSlab.BRICK: - case BlockDoubleSlab.STONE_BRICK: - case BlockDoubleSlab.STONE: - return BlockColor.STONE_BLOCK_COLOR; - case BlockDoubleSlab.SANDSTONE: - return BlockColor.SAND_BLOCK_COLOR; - case BlockDoubleSlab.QUARTZ: - return BlockColor.QUARTZ_BLOCK_COLOR; - case BlockDoubleSlab.NETHER_BRICK: - return BlockColor.NETHERRACK_BLOCK_COLOR; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoubleSlabRedSandstone.java b/src/main/java/cn/nukkit/block/BlockDoubleSlabRedSandstone.java deleted file mode 100644 index f427ddcee..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoubleSlabRedSandstone.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created by CreeperFace on 26. 11. 2016. - */ -public class BlockDoubleSlabRedSandstone extends BlockSolidMeta { - - public BlockDoubleSlabRedSandstone() { - this(0); - } - - public BlockDoubleSlabRedSandstone(int meta) { - super(meta); - } - - @Override - public int getId() { - return DOUBLE_RED_SANDSTONE_SLAB; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Red Sandstone", - "Purpur", - "", - "", - "", - "", - "", - "" - }; - - return "Double " + names[this.getDamage() & 0x07] + " Slab"; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(RED_SANDSTONE_SLAB), this.getDamage() & 0x07); - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.RED_SANDSTONE_SLAB, this.getDamage() & 0x07, 2) - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - switch (this.getDamage() & 0x07) { - case 0: - return BlockColor.ORANGE_BLOCK_COLOR; - case 1: - return BlockColor.PURPLE_BLOCK_COLOR; - default: - return BlockColor.STONE_BLOCK_COLOR; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoubleSlabStone.java b/src/main/java/cn/nukkit/block/BlockDoubleSlabStone.java deleted file mode 100644 index 2c97476b6..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoubleSlabStone.java +++ /dev/null @@ -1,106 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockDoubleSlabStone extends BlockSolidMeta { - - public static final int STONE = 0; - public static final int SANDSTONE = 1; - public static final int WOODEN = 2; - public static final int COBBLESTONE = 3; - public static final int BRICK = 4; - public static final int STONE_BRICK = 5; - public static final int QUARTZ = 6; - public static final int NETHER_BRICK = 7; - - public BlockDoubleSlabStone() { - this(0); - } - - public BlockDoubleSlabStone(int meta) { - super(meta); - } - - @Override - public int getId() { - return DOUBLE_SLAB; - } - - @Override - public double getResistance() { - return getToolType() > ItemTool.TIER_WOODEN ? 30 : 15; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Stone", - "Sandstone", - "Wooden", - "Cobblestone", - "Brick", - "Stone Brick", - "Quartz", - "Nether Brick" - }; - return "Double " + names[this.getDamage() & 0x07] + " Slab"; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(STONE_SLAB), this.getDamage() & 0x07); - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.SLAB, this.getDamage() & 0x07, 2) - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - switch (this.getDamage() & 0x07) { - default: - case BlockDoubleSlabStone.STONE: - case BlockDoubleSlabStone.COBBLESTONE: - case BlockDoubleSlabStone.BRICK: - case BlockDoubleSlabStone.STONE_BRICK: - return BlockColor.STONE_BLOCK_COLOR; - case BlockDoubleSlabStone.SANDSTONE: - return BlockColor.SAND_BLOCK_COLOR; - case BlockDoubleSlabStone.WOODEN: - return BlockColor.WOOD_BLOCK_COLOR; - case BlockDoubleSlabStone.QUARTZ: - return BlockColor.QUARTZ_BLOCK_COLOR; - case BlockDoubleSlabStone.NETHER_BRICK: - return BlockColor.NETHERRACK_BLOCK_COLOR; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDoubleSlabWood.java b/src/main/java/cn/nukkit/block/BlockDoubleSlabWood.java deleted file mode 100644 index b75ff56d1..000000000 --- a/src/main/java/cn/nukkit/block/BlockDoubleSlabWood.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockDoubleSlabWood extends BlockSolidMeta { - - public BlockDoubleSlabWood() { - this(0); - } - - public BlockDoubleSlabWood(int meta) { - super(meta); - } - - @Override - public int getId() { - return DOUBLE_WOOD_SLAB; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Oak", - "Spruce", - "Birch", - "Jungle", - "Acacia", - "Dark Oak", - "", - "" - }; - return "Double " + names[this.getDamage() & 0x07] + " Slab"; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(WOOD_SLAB), this.getDamage() & 0x07); - } - - public Item[] getDrops(Item item) { - return new Item[]{ - Item.get(Item.WOOD_SLAB, this.getDamage() & 0x07, 2) - }; - } - - @Override - public BlockColor getColor() { - switch (this.getDamage() & 0x07) { - default: - case 0: //OAK - return BlockColor.WOOD_BLOCK_COLOR; - case 1: //SPRUCE - return BlockColor.SPRUCE_BLOCK_COLOR; - case 2: //BIRCH - return BlockColor.SAND_BLOCK_COLOR; - case 3: //JUNGLE - return BlockColor.DIRT_BLOCK_COLOR; - case 4: //Acacia - return BlockColor.ORANGE_BLOCK_COLOR; - case 5: //DARK OAK - return BlockColor.BROWN_BLOCK_COLOR; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDragonEgg.java b/src/main/java/cn/nukkit/block/BlockDragonEgg.java deleted file mode 100644 index a94cab1c3..000000000 --- a/src/main/java/cn/nukkit/block/BlockDragonEgg.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.event.block.BlockFromToEvent; -import cn.nukkit.level.Level; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -public class BlockDragonEgg extends BlockFallable { - - @Override - public String getName() { - return "Dragon Egg"; - } - - @Override - public int getId() { - return DRAGON_EGG; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 45; - } - - @Override - public int getLightLevel() { - return 1; - } - - @Override - public BlockColor getColor() { - return BlockColor.OBSIDIAN_BLOCK_COLOR; - } - - @Override - public boolean isTransparent() { - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_TOUCH) { - this.teleport(); - } - return super.onUpdate(type); - } - - public void teleport() { - if (!level.randomTickingEnabled()) return; - for (int i = 0; i < 1000; ++i) { - Block to = this.getLevel().getBlock(this.add(Utils.random.nextInt(-16, 16), Utils.random.nextInt(-16, 16), Utils.random.nextInt(-16, 16))); - if (to.getId() == AIR) { - BlockFromToEvent event = new BlockFromToEvent(this, to); - this.level.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return; - to = event.getTo(); - int diffX = this.getFloorX() - to.getFloorX(); - int diffY = this.getFloorY() - to.getFloorY(); - int diffZ = this.getFloorZ() - to.getFloorZ(); - LevelEventPacket pk = new LevelEventPacket(); - pk.evid = LevelEventPacket.EVENT_PARTICLE_DRAGON_EGG_TELEPORT; - pk.data = (((((Math.abs(diffX) << 16) | (Math.abs(diffY) << 8)) | Math.abs(diffZ)) | ((diffX < 0 ? 1 : 0) << 24)) | ((diffY < 0 ? 1 : 0) << 25)) | ((diffZ < 0 ? 1 : 0) << 26); - pk.x = this.getFloorX(); - pk.y = this.getFloorY(); - pk.z = this.getFloorZ(); - this.getLevel().addChunkPacket(this.getFloorX() >> 4, this.getFloorZ() >> 4, pk); - this.getLevel().setBlock(this, get(AIR), true); - this.getLevel().setBlock(to, this, true); - return; - } - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockDropper.java b/src/main/java/cn/nukkit/block/BlockDropper.java deleted file mode 100644 index 1da1e16a5..000000000 --- a/src/main/java/cn/nukkit/block/BlockDropper.java +++ /dev/null @@ -1,224 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityDropper; -import cn.nukkit.inventory.ContainerInventory; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.Faceable; -import cn.nukkit.utils.Utils; - -import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; - -public class BlockDropper extends BlockSolidMeta implements Faceable { - - protected boolean triggered = false; - - public BlockDropper() { - this(0); - } - - public BlockDropper(int meta) { - super(meta); - } - - @Override - public int getId() { - return DROPPER; - } - - @Override - public String getName() { - return "Dropper"; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getResistance() { - return 17.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (player != null) { - if (Math.abs(player.x - this.x) < 2 && Math.abs(player.z - this.z) < 2) { - double y = player.y + player.getEyeHeight(); - - if (y - this.y > 2) { - this.setDamage(BlockFace.UP.getIndex()); - } else if (this.y - y > 0) { - this.setDamage(BlockFace.DOWN.getIndex()); - } else { - this.setDamage(player.getHorizontalFacing().getOpposite().getIndex()); - } - } else { - this.setDamage(player.getHorizontalFacing().getOpposite().getIndex()); - } - } - - this.getLevel().setBlock(block, this, true); - - BlockEntity.createBlockEntity(BlockEntity.DROPPER, this.getChunk(), BlockEntity.getDefaultCompound(this, BlockEntity.DROPPER)); - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player == null) { - return false; - } - - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (!(blockEntity instanceof BlockEntityDropper)) { - return false; - } - - player.addWindow(((BlockEntityDropper) blockEntity).getInventory()); - return true; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - public Vector3 getDispensePosition() { - BlockFace facing = getBlockFace(); - return this.add( - 0.5 + 0.7 * facing.getXOffset(), - 0.5 + 0.7 * facing.getYOffset(), - 0.5 + 0.7 * facing.getZOffset() - ); - } - - public void dispense() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (!(blockEntity instanceof BlockEntityDropper)) { - return; - } - - int r = 1; - int slot = -1; - Item target = null; - - Inventory inv = ((BlockEntityDropper) blockEntity).getInventory(); - for (Map.Entry entry : inv.getContents().entrySet()) { - Item item = entry.getValue(); - - if (!item.isNull() && Utils.random.nextInt(r++) == 0) { - target = item; - slot = entry.getKey(); - } - } - - if (target != null) { - target = target.clone(); - drop(target); - - target.count--; - inv.setItem(slot, target); - } - } - - public void drop(Item item) { - BlockFace face = this.getBlockFace(); - Vector3 dispensePos = this.getDispensePosition(); - - if (face.getAxis() == BlockFace.Axis.Y) { - dispensePos.y -= 0.125; - } else { - dispensePos.y -= 0.15625; - } - - ThreadLocalRandom rand = ThreadLocalRandom.current(); - Vector3 motion = new Vector3(); - - double offset = rand.nextDouble() * 0.1 + 0.2; - - motion.x = face.getXOffset() * offset; - motion.y = 0.1; - motion.z = face.getZOffset() * offset; - - motion.x += rand.nextGaussian() * 0.007499999832361937 * 6; - motion.y += rand.nextGaussian() * 0.007499999832361937 * 6; - motion.z += rand.nextGaussian() * 0.007499999832361937 * 6; - - Item i = item.clone(); - i.setCount(1); - this.level.dropItem(dispensePos, i, motion); - } - - @Override - public int getComparatorInputOverride() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityDropper) { - return ContainerInventory.calculateRedstone(((BlockEntityDropper) blockEntity).getInventory()); - } - - return 0; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_SCHEDULED) { - triggered = false; - dispense(); - - return type; - } else if (type == Level.BLOCK_UPDATE_REDSTONE) { - if ((level.isBlockPowered(this) || level.isBlockPowered(this.up())) && !triggered) { - triggered = true; - level.scheduleUpdate(this, this, 4); - } - - return type; - } - - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockEmerald.java b/src/main/java/cn/nukkit/block/BlockEmerald.java deleted file mode 100644 index e31af8631..000000000 --- a/src/main/java/cn/nukkit/block/BlockEmerald.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/1 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockEmerald extends BlockSolid { - - @Override - public String getName() { - return "Block of Emerald"; - } - - @Override - public int getId() { - return EMERALD_BLOCK; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.EMERALD_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockEnchantingTable.java b/src/main/java/cn/nukkit/block/BlockEnchantingTable.java deleted file mode 100644 index 10604a506..000000000 --- a/src/main/java/cn/nukkit/block/BlockEnchantingTable.java +++ /dev/null @@ -1,134 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityEnchantTable; -import cn.nukkit.inventory.EnchantInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.StringTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.BlockColor; - -import java.util.Map; - -/** - * Created on 2015/11/22 by CreeperFace. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockEnchantingTable extends BlockTransparent { - - @Override - public int getId() { - return ENCHANTING_TABLE; - } - - @Override - public String getName() { - return "Enchanting Table"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 6000; - } - - @Override - public int getLightLevel() { - return 12; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.getLevel().setBlock(block, this, true, true); - - CompoundTag nbt = new CompoundTag() - .putString("id", BlockEntity.ENCHANT_TABLE) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (item.hasCustomName()) { - nbt.putString("CustomName", item.getCustomName()); - } - - if (item.hasCustomBlockData()) { - Map customData = item.getCustomBlockData().getTags(); - for (Map.Entry tag : customData.entrySet()) { - nbt.put(tag.getKey(), tag.getValue()); - } - } - - BlockEntity.createBlockEntity(BlockEntity.ENCHANT_TABLE, getLevel().getChunk((int) this.x >> 4, (int) this.z >> 4), nbt); - - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - BlockEntity t = this.getLevel().getBlockEntity(this); - BlockEntityEnchantTable enchantTable; - if (t instanceof BlockEntityEnchantTable) { - enchantTable = (BlockEntityEnchantTable) t; - } else { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.ENCHANT_TABLE) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - enchantTable = (BlockEntityEnchantTable) BlockEntity.createBlockEntity(BlockEntity.ENCHANT_TABLE, this.getChunk(), nbt); - } - - if (enchantTable.namedTag.contains("Lock") && enchantTable.namedTag.get("Lock") instanceof StringTag) { - if (!enchantTable.namedTag.getString("Lock").equals(item.getCustomName())) { - return true; - } - } - - player.addWindow(new EnchantInventory(player.getUIInventory(), this.getLocation()), Player.ENCHANT_WINDOW_ID); - } - - return true; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.RED_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockEndGateway.java b/src/main/java/cn/nukkit/block/BlockEndGateway.java deleted file mode 100644 index 7202f2eaa..000000000 --- a/src/main/java/cn/nukkit/block/BlockEndGateway.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.utils.BlockColor; - -/** - * @author PikyCZ - */ -public class BlockEndGateway extends BlockSolid { - - @Override - public String getName() { - return "End Gateway"; - } - - @Override - public int getId() { - return END_GATEWAY; - } - - @Override - public boolean canPassThrough() { - return true; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public int getLightLevel() { - return 15; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.BLACK_BLOCK_COLOR; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(BlockID.AIR)); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockEndPortal.java b/src/main/java/cn/nukkit/block/BlockEndPortal.java deleted file mode 100644 index e6b7afe54..000000000 --- a/src/main/java/cn/nukkit/block/BlockEndPortal.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.utils.BlockColor; - -public class BlockEndPortal extends BlockFlowable { - - public BlockEndPortal() { - this(0); - } - - public BlockEndPortal(int meta) { - super(0); - } - - @Override - public String getName() { - return "End Portal Block"; - } - - @Override - public int getId() { - return END_PORTAL; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public int getLightLevel() { - return 15; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.BLACK_BLOCK_COLOR; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canBeFlowedInto() { - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(BlockID.AIR)); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockEndPortalFrame.java b/src/main/java/cn/nukkit/block/BlockEndPortalFrame.java deleted file mode 100644 index 79671e513..000000000 --- a/src/main/java/cn/nukkit/block/BlockEndPortalFrame.java +++ /dev/null @@ -1,150 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * Created by Pub4Game on 26.12.2015. - */ -public class BlockEndPortalFrame extends BlockTransparentMeta implements Faceable { - - private static final int[] faces = {2, 3, 0, 1}; - - public BlockEndPortalFrame() { - this(0); - } - - public BlockEndPortalFrame(int meta) { - super(meta); - } - - @Override - public int getId() { - return END_PORTAL_FRAME; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public int getLightLevel() { - return 1; - } - - @Override - public String getName() { - return "End Portal Frame"; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - x, - y, - z, - x + 1, - y + ((this.getDamage() & 0x04) > 0 ? 1 : 0.8125), - z + 1 - ); - } - - @Override - public boolean canBePushed() { - return false; - } - - public boolean hasComparatorInputOverride() { - return true; - } - - public int getComparatorInputOverride() { - return (getDamage() & 4) != 0 ? 15 : 0; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if ((this.getDamage() & 0x04) == 0 && player != null && item.getId() == Item.ENDER_EYE && !player.isSneaking()) { - this.setDamage(this.getDamage() + 4); - this.getLevel().setBlock(this, this, true, false); - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BLOCK_END_PORTAL_FRAME_FILL); - for (int i = 0; i < 4; i++) { - for (int j = -1; j <= 1; j++) { - Block t = this.getSide(BlockFace.fromHorizontalIndex(i), 2).getSide(BlockFace.fromHorizontalIndex((i + 1) % 4), j); - if (isCompletedPortal(t)) { - for (int k = -1; k <= 1; k++) { - for (int l = -1; l <= 1; l++) { - this.getLevel().setBlock(t.add(k, 0, l), Block.get(Block.END_PORTAL), true); - } - } - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BLOCK_END_PORTAL_SPAWN); - return true; - } - } - } - return true; - } - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(faces[player != null ? player.getDirection().getHorizontalIndex() : 0]); - this.getLevel().setBlock(block, this, true, true); - return true; - } - - private static boolean isCompletedPortal(Block center) { - for (int i = 0; i < 4; i++) { - for (int j = -1; j <= 1; j++) { - Block block = center.getSide(BlockFace.fromHorizontalIndex(i), 2).getSide(BlockFace.fromHorizontalIndex((i + 1) % 4), j); - if (block.getId() != Block.END_PORTAL_FRAME || (block.getDamage() & 0x4) == 0) { - return false; - } - } - } - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.GREEN_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockEndRod.java b/src/main/java/cn/nukkit/block/BlockEndRod.java deleted file mode 100644 index e34b1becf..000000000 --- a/src/main/java/cn/nukkit/block/BlockEndRod.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.Faceable; - -/** - * http://minecraft.gamepedia.com/End_Rod - * - * @author PikyCZ - */ -public class BlockEndRod extends BlockTransparentMeta implements Faceable { - - private static final int[] faces = {0, 1, 3, 2, 5, 4}; - - public BlockEndRod() { - this(0); - } - - public BlockEndRod(int meta) { - super(meta); - } - - @Override - public String getName() { - return "End Rod"; - } - - @Override - public int getId() { - return END_ROD; - } - - @Override - public double getHardness() { - return 0; - } - - @Override - public double getResistance() { - return 0; - } - - @Override - public int getLightLevel() { - return 14; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x + 0.4, - this.y, - this.z + 0.4, - this.x + 0.6, - this.y + 1, - this.z + 0.6 - ); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(faces[player != null ? face.getIndex() : 0]); - this.getLevel().setBlock(block, this, true, true); - - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockEndStone.java b/src/main/java/cn/nukkit/block/BlockEndStone.java deleted file mode 100644 index 1956362e9..000000000 --- a/src/main/java/cn/nukkit/block/BlockEndStone.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/1 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockEndStone extends BlockSolid { - - @Override - public String getName() { - return "End Stone"; - } - - @Override - public int getId() { - return END_STONE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 45; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockEnderChest.java b/src/main/java/cn/nukkit/block/BlockEnderChest.java deleted file mode 100644 index 8798e2204..000000000 --- a/src/main/java/cn/nukkit/block/BlockEnderChest.java +++ /dev/null @@ -1,198 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityEnderChest; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.mob.EntityPiglin; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.StringTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class BlockEnderChest extends BlockTransparentMeta implements Faceable { - - private static final int[] faces = {2, 5, 3, 4}; - - private final Set viewers = new HashSet<>(); - - public BlockEnderChest() { - this(0); - } - - public BlockEnderChest(int meta) { - super(meta); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public int getId() { - return ENDER_CHEST; - } - - @Override - public int getLightLevel() { - return 7; - } - - @Override - public String getName() { - return "Chest"; - } - - @Override - public double getHardness() { - return 22.5; - } - - @Override - public double getResistance() { - return 3000; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x + 0.0625, - this.y, - this.z + 0.0625, - this.x + 0.9375, - this.y + 0.9475, - this.z + 0.9375 - ); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(faces[player != null ? player.getDirection().getHorizontalIndex() : 0]); - - this.getLevel().setBlock(block, this, true, true); - CompoundTag nbt = new CompoundTag("") - .putString("id", BlockEntity.ENDER_CHEST) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (item.hasCustomName()) { - nbt.putString("CustomName", item.getCustomName()); - } - - if (item.hasCustomBlockData()) { - Map customData = item.getCustomBlockData().getTags(); - for (Map.Entry tag : customData.entrySet()) { - nbt.put(tag.getKey(), tag.getValue()); - } - } - - BlockEntity.createBlockEntity(BlockEntity.ENDER_CHEST, this.getChunk(), nbt); - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - Block top = this.up(); - if (!top.isTransparent() && !(top instanceof BlockSlab && (top.getDamage() & 0x07) <= 0)) { // avoid issues with the slab hack - return true; - } - - BlockEntity t = this.getLevel().getBlockEntity(this); - BlockEntityEnderChest chest; - if (t instanceof BlockEntityEnderChest) { - chest = (BlockEntityEnderChest) t; - } else { - CompoundTag nbt = new CompoundTag("") - .putString("id", BlockEntity.ENDER_CHEST) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - chest = (BlockEntityEnderChest) BlockEntity.createBlockEntity(BlockEntity.ENDER_CHEST, this.getChunk(), nbt); - } - - if (chest.namedTag.contains("Lock") && chest.namedTag.get("Lock") instanceof StringTag) { - if (!chest.namedTag.getString("Lock").equals(item.getCustomName())) { - return true; - } - } - - player.setViewingEnderChest(this); - player.addWindow(player.getEnderChestInventory()); - - for (Entity e : this.getChunk().getEntities().values()) { - if (e instanceof EntityPiglin) { - ((EntityPiglin) e).setAngry(600); - } - } - } - - return true; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[]{ - Item.get(Item.OBSIDIAN, 0, 8) - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.OBSIDIAN_BLOCK_COLOR; - } - - public Set getViewers() { - return viewers; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFallable.java b/src/main/java/cn/nukkit/block/BlockFallable.java deleted file mode 100644 index 08d5b43ee..000000000 --- a/src/main/java/cn/nukkit/block/BlockFallable.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.entity.item.EntityFallingBlock; -import cn.nukkit.event.block.BlockFallEvent; -import cn.nukkit.level.Level; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; - -/** - * @author rcsuperman - * Nukkit Project - */ -public abstract class BlockFallable extends BlockSolid { - - protected BlockFallable() { - } - - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (!this.getLevel().randomTickingEnabled()) return type; - Block down = this.down(); - if (down.getId() == AIR || down instanceof BlockLiquid || down instanceof BlockFire) { - BlockFallEvent event = new BlockFallEvent(this); - this.level.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return type; - } - this.level.setBlock(this, Block.get(Block.AIR), true, true); - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", this.x + 0.5)) - .add(new DoubleTag("", this.y)) - .add(new DoubleTag("", this.z + 0.5))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - - .putList(new ListTag("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - .putInt("TileID", this.getId()) - .putByte("Data", this.getDamage()); - - EntityFallingBlock fall = new EntityFallingBlock(this.getLevel().getChunk((int) this.x >> 4, (int) this.z >> 4), nbt); - - fall.spawnToAll(); - } - } - return type; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFallableMeta.java b/src/main/java/cn/nukkit/block/BlockFallableMeta.java deleted file mode 100644 index 3f3797418..000000000 --- a/src/main/java/cn/nukkit/block/BlockFallableMeta.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.entity.item.EntityFallingBlock; -import cn.nukkit.event.block.BlockFallEvent; -import cn.nukkit.level.Level; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; - -/** - * @author rcsuperman - * Nukkit Project - */ -public abstract class BlockFallableMeta extends BlockSolidMeta { - - protected BlockFallableMeta(int meta) { - super(meta); - } - - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (!this.getLevel().randomTickingEnabled()) return type; - Block down = this.down(); - if (down.getId() == AIR || down instanceof BlockLiquid || down instanceof BlockFire) { - BlockFallEvent event = new BlockFallEvent(this); - this.level.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return type; - } - this.level.setBlock(this, Block.get(Block.AIR), true, true); - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", this.x + 0.5)) - .add(new DoubleTag("", this.y)) - .add(new DoubleTag("", this.z + 0.5))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - - .putList(new ListTag("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - .putInt("TileID", this.getId()) - .putByte("Data", this.getDamage()); - - EntityFallingBlock fall = new EntityFallingBlock(this.getLevel().getChunk((int) this.x >> 4, (int) this.z >> 4), nbt); - - fall.spawnToAll(); - } - } - return type; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFarmland.java b/src/main/java/cn/nukkit/block/BlockFarmland.java deleted file mode 100644 index c0715f2f8..000000000 --- a/src/main/java/cn/nukkit/block/BlockFarmland.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFarmland extends BlockTransparentMeta { - - public BlockFarmland() { - this(0); - } - - public BlockFarmland(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Farmland"; - } - - @Override - public int getId() { - return FARMLAND; - } - - @Override - public double getResistance() { - return 3; - } - - @Override - public double getHardness() { - return 0.6; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, // the actual bounding box is a normal cube - this.z + 1 - ); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_RANDOM) { - Block up = this.up(); - - if (up instanceof BlockCrops) { - return 0; - } - - if (up.isSolid()) { - this.level.setBlock(this, Block.get(BlockID.DIRT), false, true); - return Level.BLOCK_UPDATE_RANDOM; - } - - boolean found = false; - Vector3 v = new Vector3(); - - if (this.level.isRaining()) { - found = true; - } else { - for (int x = (int) this.x - 4; x <= this.x + 4; x++) { - for (int z = (int) this.z - 4; z <= this.z + 4; z++) { - for (int y = (int) this.y; y <= this.y + 1; y++) { - if (z == this.z && x == this.x && y == this.y) { - continue; - } - - v.setComponents(x, y, z); - int block = this.level.getBlockIdAt(v.getFloorX(), v.getFloorY(), v.getFloorZ()); - - if (block == WATER || block == STILL_WATER || block == FROSTED_ICE) { - found = true; - break; - } - } - } - } - } - - Block block = this.level.getBlock(v.setComponents(x, y - 1, z)); - if (found || block instanceof BlockWater || block instanceof BlockIceFrosted) { - if (this.getDamage() < 7) { - this.setDamage(7); - this.level.setBlock(this, this, false, false); - } - return Level.BLOCK_UPDATE_RANDOM; - } - - if (this.getDamage() > 0) { - this.setDamage(this.getDamage() - 1); - this.level.setBlock(this, this, false, false); - } else { - this.level.setBlock(this, Block.get(Block.DIRT), false, true); - } - - return Level.BLOCK_UPDATE_RANDOM; - } else if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.up().isSolid()) { - this.level.setBlock(this, Block.get(DIRT), false, false); - return Level.BLOCK_UPDATE_NORMAL; - } - } - - return 0; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(BlockID.DIRT)); - } - - @Override - public BlockColor getColor() { - return BlockColor.DIRT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFence.java b/src/main/java/cn/nukkit/block/BlockFence.java deleted file mode 100644 index 8580a0736..000000000 --- a/src/main/java/cn/nukkit/block/BlockFence.java +++ /dev/null @@ -1,121 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/7 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFence extends BlockTransparentMeta { - - public static final int FENCE_OAK = 0; - public static final int FENCE_SPRUCE = 1; - public static final int FENCE_BIRCH = 2; - public static final int FENCE_JUNGLE = 3; - public static final int FENCE_ACACIA = 4; - public static final int FENCE_DARK_OAK = 5; - - public BlockFence() { - this(0); - } - - public BlockFence(int meta) { - super(meta); - } - - @Override - public int getId() { - return FENCE; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Oak Fence", - "Spruce Fence", - "Birch Fence", - "Jungle Fence", - "Acacia Fence", - "Dark Oak Fence", - "", - "" - }; - return names[this.getDamage() & 0x07]; - } - - protected AxisAlignedBB recalculateBoundingBox() { - boolean north = this.canConnect(this.north()); - boolean south = this.canConnect(this.south()); - boolean west = this.canConnect(this.west()); - boolean east = this.canConnect(this.east()); - double n = north ? 0 : 0.375; - double s = south ? 1 : 0.625; - double w = west ? 0 : 0.375; - double e = east ? 1 : 0.625; - return new AxisAlignedBB( - this.x + w, - this.y, - this.z + n, - this.x + e, - this.y + 1.5, - this.z + s - ); - } - - @Override - public int getBurnChance() { - return 5; - } - - @Override - public int getBurnAbility() { - return 20; - } - - public boolean canConnect(Block block) { - return (block instanceof BlockFence || block instanceof BlockFenceGate) || block.isSolid() && !block.isTransparent(); - } - - @Override - public BlockColor getColor() { - switch (this.getDamage() & 0x07) { - default: - case FENCE_OAK: //OAK - return BlockColor.WOOD_BLOCK_COLOR; - case FENCE_SPRUCE: //SPRUCE - return BlockColor.SPRUCE_BLOCK_COLOR; - case FENCE_BIRCH: //BIRCH - return BlockColor.SAND_BLOCK_COLOR; - case FENCE_JUNGLE: //JUNGLE - return BlockColor.DIRT_BLOCK_COLOR; - case FENCE_ACACIA: //ACACIA - return BlockColor.ORANGE_BLOCK_COLOR; - case FENCE_DARK_OAK: //DARK OAK - return BlockColor.BROWN_BLOCK_COLOR; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage()); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFenceGate.java b/src/main/java/cn/nukkit/block/BlockFenceGate.java deleted file mode 100644 index b750161a4..000000000 --- a/src/main/java/cn/nukkit/block/BlockFenceGate.java +++ /dev/null @@ -1,195 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.block.DoorToggleEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.DoorSound; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * Created on 2015/11/23 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFenceGate extends BlockTransparentMeta implements Faceable { - - public BlockFenceGate() { - this(0); - } - - public BlockFenceGate(int meta) { - super(meta); - } - - @Override - public int getId() { - return FENCE_GATE_OAK; - } - - @Override - public String getName() { - return "Oak Fence Gate"; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - if ((this.getDamage() & 0x04) > 0) { - return null; - } - int i = this.getDamage() & 0x03; - if (i == 2 || i == 0) { - return new AxisAlignedBB( - x, - y, - z + 0.375, - x + 1, - y + 1.5, - z + 0.625 - ); - } else { - return new AxisAlignedBB( - x + 0.375, - y, - z, - x + 0.625, - y + 1.5, - z + 1 - ); - } - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(player != null ? player.getDirection().getHorizontalIndex() : 0); - this.getLevel().setBlock(block, this, true, true); - - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player == null) { - return false; - } - - if (!this.toggle(player)) { - return false; - } - - this.getLevel().setBlock(this, this, true); - this.getLevel().addSound(new DoorSound(this)); - - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } - - public boolean toggle(Player player) { - DoorToggleEvent event = new DoorToggleEvent(this, player); - this.getLevel().getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - player = event.getPlayer(); - - int direction; - - if (player != null) { - double yaw = player.yaw; - double rotation = (yaw - 90) % 360; - - if (rotation < 0) { - rotation += 360.0; - } - - int originDirection = this.getDamage() & 0x01; - - if (originDirection == 0) { - if (rotation >= 0 && rotation < 180) { - direction = 2; - } else { - direction = 0; - } - } else { - if (rotation >= 90 && rotation < 270) { - direction = 3; - } else { - direction = 1; - } - } - } else { - int originDirection = this.getDamage() & 0x01; - - if (originDirection == 0) { - direction = 0; - } else { - direction = 1; - } - } - - this.setDamage(direction | ((~this.getDamage()) & 0x04)); - this.level.addSound(new DoorSound(this)); - this.level.setBlock(this, this, false, false); - return true; - } - - public boolean isOpen() { - return (this.getDamage() & 0x04) > 0; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_REDSTONE) { - if ((!isOpen() && this.level.isBlockPowered(this.getLocation())) || (isOpen() && !this.level.isBlockPowered(this.getLocation()))) { - this.toggle(null); - return type; - } - } - - return 0; - } - - @Override - public Item toItem() { - return Item.get(Item.FENCE_GATE, 0, 1); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public boolean canPassThrough() { - return this.isOpen(); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFenceGateAcacia.java b/src/main/java/cn/nukkit/block/BlockFenceGateAcacia.java deleted file mode 100644 index 69663971f..000000000 --- a/src/main/java/cn/nukkit/block/BlockFenceGateAcacia.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/23 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFenceGateAcacia extends BlockFenceGate { - - public BlockFenceGateAcacia() { - this(0); - } - - public BlockFenceGateAcacia(int meta) { - super(meta); - } - - @Override - public int getId() { - return FENCE_GATE_ACACIA; - } - - @Override - public String getName() { - return "Acacia Fence Gate"; - } - - @Override - public Item toItem() { - return Item.get(Item.FENCE_GATE_ACACIA, 0, 1); - } - - @Override - public BlockColor getColor() { - return BlockColor.ORANGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFenceGateBirch.java b/src/main/java/cn/nukkit/block/BlockFenceGateBirch.java deleted file mode 100644 index 97654be29..000000000 --- a/src/main/java/cn/nukkit/block/BlockFenceGateBirch.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/23 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFenceGateBirch extends BlockFenceGate { - - public BlockFenceGateBirch() { - this(0); - } - - public BlockFenceGateBirch(int meta) { - super(meta); - } - - @Override - public int getId() { - return FENCE_GATE_BIRCH; - } - - @Override - public String getName() { - return "Birch Fence Gate"; - } - - @Override - public Item toItem() { - return Item.get(Item.FENCE_GATE_BIRCH, 0, 1); - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFenceGateDarkOak.java b/src/main/java/cn/nukkit/block/BlockFenceGateDarkOak.java deleted file mode 100644 index 04ca651b2..000000000 --- a/src/main/java/cn/nukkit/block/BlockFenceGateDarkOak.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/23 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFenceGateDarkOak extends BlockFenceGate { - - public BlockFenceGateDarkOak() { - this(0); - } - - public BlockFenceGateDarkOak(int meta) { - super(meta); - } - - @Override - public int getId() { - return FENCE_GATE_DARK_OAK; - } - - @Override - public String getName() { - return "Dark Oak Fence Gate"; - } - - @Override - public Item toItem() { - return Item.get(Item.FENCE_GATE_DARK_OAK, 0, 1); - } - - @Override - public BlockColor getColor() { - return BlockColor.BROWN_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFenceGateJungle.java b/src/main/java/cn/nukkit/block/BlockFenceGateJungle.java deleted file mode 100644 index eb5e17648..000000000 --- a/src/main/java/cn/nukkit/block/BlockFenceGateJungle.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/23 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFenceGateJungle extends BlockFenceGate { - - public BlockFenceGateJungle() { - this(0); - } - - public BlockFenceGateJungle(int meta) { - super(meta); - } - - @Override - public int getId() { - return FENCE_GATE_JUNGLE; - } - - @Override - public String getName() { - return "Jungle Fence Gate"; - } - - @Override - public Item toItem() { - return Item.get(Item.FENCE_GATE_JUNGLE, 0, 1); - } - - @Override - public BlockColor getColor() { - return BlockColor.DIRT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFenceGateSpruce.java b/src/main/java/cn/nukkit/block/BlockFenceGateSpruce.java deleted file mode 100644 index 8b38f74df..000000000 --- a/src/main/java/cn/nukkit/block/BlockFenceGateSpruce.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/23 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFenceGateSpruce extends BlockFenceGate { - - public BlockFenceGateSpruce() { - this(0); - } - - public BlockFenceGateSpruce(int meta) { - super(meta); - } - - @Override - public int getId() { - return FENCE_GATE_SPRUCE; - } - - @Override - public String getName() { - return "Spruce Fence Gate"; - } - - @Override - public Item toItem() { - return Item.get(Item.FENCE_GATE_SPRUCE,0, 1); - } - - @Override - public BlockColor getColor() { - return BlockColor.SPRUCE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFenceNetherBrick.java b/src/main/java/cn/nukkit/block/BlockFenceNetherBrick.java deleted file mode 100644 index baa16ba4c..000000000 --- a/src/main/java/cn/nukkit/block/BlockFenceNetherBrick.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/7 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFenceNetherBrick extends BlockFence { - - public BlockFenceNetherBrick() { - this(0); - } - - public BlockFenceNetherBrick(int meta) { - super(meta); - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Nether Brick Fence"; - } - - @Override - public int getId() { - return NETHER_BRICK_FENCE; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canConnect(Block block) { - return (block instanceof BlockFenceNetherBrick || block instanceof BlockFenceGate) || block.isSolid() && !block.isTransparent(); - } - - @Override - public BlockColor getColor() { - return BlockColor.NETHERRACK_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public int getBurnChance() { - return 0; - } - - @Override - public int getBurnAbility() { - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFire.java b/src/main/java/cn/nukkit/block/BlockFire.java deleted file mode 100644 index fe05311a2..000000000 --- a/src/main/java/cn/nukkit/block/BlockFire.java +++ /dev/null @@ -1,304 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityPotion; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.event.block.BlockBurnEvent; -import cn.nukkit.event.block.BlockIgniteEvent; -import cn.nukkit.event.entity.EntityCombustByBlockEvent; -import cn.nukkit.event.entity.EntityDamageByBlockEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.potion.Effect; -import cn.nukkit.potion.Potion; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockFire extends BlockFlowable { - - public BlockFire() { - this(0); - } - - public BlockFire(int meta) { - super(meta); - } - - @Override - public int getId() { - return FIRE; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public String getName() { - return "Fire Block"; - } - - @Override - public int getLightLevel() { - return 15; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public boolean canBeReplaced() { - return true; - } - - @Override - public void onEntityCollide(Entity entity) { - if (entity instanceof EntityPotion) { - if (((EntityPotion) entity).potionId == Potion.WATER) { - this.level.setBlock(this, Block.get(AIR)); - } - return; - } - - if (!entity.hasEffect(Effect.FIRE_RESISTANCE) && this.level.getGameRules().getBoolean(GameRule.FIRE_DAMAGE)) { - entity.attack(new EntityDamageByBlockEvent(this, entity, DamageCause.FIRE, 1)); - } - - EntityCombustByBlockEvent ev = new EntityCombustByBlockEvent(this, entity, 8); - if (entity instanceof EntityArrow) { - ev.setCancelled(); - } - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled() && entity.isAlive() && entity.noDamageTicks == 0) { - entity.setOnFire(ev.getDuration()); - } - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_RANDOM) { - if (!this.isBlockTopFacingSurfaceSolid(this.down()) && !this.canNeighborBurn()) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - } else if (!Server.getInstance().suomiCraftPEMode() && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK) && !level.isUpdateScheduled(this, this)) { - level.scheduleUpdate(this, tickRate()); - } - - return Level.BLOCK_UPDATE_NORMAL; - } else if (type == Level.BLOCK_UPDATE_SCHEDULED && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK)) { - Block down = this.down(); - boolean forever = down.getId() == NETHERRACK || down.getId() == MAGMA || (down.getId() == BEDROCK && level.getDimension() == Level.DIMENSION_THE_END); - - if (!forever && this.getLevel().isRaining() && - (this.getLevel().canBlockSeeSky(this) || - this.getLevel().canBlockSeeSky(this.east()) || - this.getLevel().canBlockSeeSky(this.west()) || - this.getLevel().canBlockSeeSky(this.south()) || - this.getLevel().canBlockSeeSky(this.north())) - ) { - - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - } - - if (Server.getInstance().suomiCraftPEMode()) { - if (forever) return 0; - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - return 0; - } - - if (!this.isBlockTopFacingSurfaceSolid(down) && !this.canNeighborBurn()) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - return 0; - } - - int meta = this.getDamage(); - - if (meta < 15) { - int newMeta = meta + Utils.random.nextInt(3); - if (newMeta > 15) newMeta = 15; - this.setDamage(newMeta); - this.getLevel().setBlock(this, this, true); - } - - this.getLevel().scheduleUpdate(this, this.tickRate() + Utils.random.nextInt(10)); - - if (!forever && !this.canNeighborBurn()) { - if (!this.isBlockTopFacingSurfaceSolid(this.down()) || meta > 3) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - } - } else if (!forever && !(this.down().getBurnAbility() > 0) && meta == 15 && Utils.random.nextInt(4) == 0) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - } else { - int o = 0; - - //TODO: decrease the o if the rainfall values are high - - this.tryToCatchBlockOnFire(this.east(), 300 + o, meta); - this.tryToCatchBlockOnFire(this.west(), 300 + o, meta); - this.tryToCatchBlockOnFire(this.down(), 250 + o, meta); - this.tryToCatchBlockOnFire(this.up(), 250 + o, meta); - this.tryToCatchBlockOnFire(this.south(), 300 + o, meta); - this.tryToCatchBlockOnFire(this.north(), 300 + o, meta); - - for (int x = (int) (this.x - 1); x <= (int) (this.x + 1); ++x) { - for (int z = (int) (this.z - 1); z <= (int) (this.z + 1); ++z) { - for (int y = (int) (this.y - 1); y <= (int) (this.y + 4); ++y) { - if (x != (int) this.x || y != (int) this.y || z != (int) this.z) { - int k = 100; - - if (y > this.y + 1) { - k += (y - (this.y + 1)) * 100; - } - - Block block = this.getLevel().getBlock(new Vector3(x, y, z)); - int chance = getChanceOfNeighborsEncouragingFire(block); - - if (chance > 0) { - int t = (chance + 40 + this.getLevel().getServer().getDifficulty() * 7) / (meta + 30); - - //TODO: decrease the t if the rainfall values are high - - if (t > 0 && Utils.random.nextInt(k) <= t) { - int damage = meta + (Utils.random.nextInt(5) >> 2); - - if (damage > 15) { - damage = 15; - } - - BlockIgniteEvent e = new BlockIgniteEvent(block, this, null, BlockIgniteEvent.BlockIgniteCause.SPREAD); - this.level.getServer().getPluginManager().callEvent(e); - - if (!e.isCancelled()) { - this.getLevel().setBlock(block, Block.get(FIRE, damage), true); - this.getLevel().scheduleUpdate(block, this.tickRate()); - } - } - } - } - } - } - } - } - } - - return 0; - } - - private void tryToCatchBlockOnFire(Block block, int bound, int damage) { - if (Utils.random.nextInt(bound) < block.getBurnAbility()) { - - if (Utils.random.nextInt(damage + 10) < 5) { - int meta = damage + (Utils.random.nextInt(5) >> 2); - - if (meta > 15) { - meta = 15; - } - - BlockIgniteEvent e = new BlockIgniteEvent(block, this, null, BlockIgniteEvent.BlockIgniteCause.SPREAD); - this.level.getServer().getPluginManager().callEvent(e); - - if (!e.isCancelled()) { - this.getLevel().setBlock(block, Block.get(FIRE, meta), true); - this.getLevel().scheduleUpdate(block, this.tickRate()); - } - } else { - BlockBurnEvent ev = new BlockBurnEvent(block); - this.getLevel().getServer().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - this.getLevel().setBlock(block, Block.get(BlockID.AIR), true); - } - } - - if (block instanceof BlockTNT) { - ((BlockTNT) block).prime(); - } - } - } - - private static int getChanceOfNeighborsEncouragingFire(Block block) { - if (block.getId() != AIR) { - return 0; - } else { - int chance = 0; - chance = Math.max(chance, block.east().getBurnChance()); - chance = Math.max(chance, block.west().getBurnChance()); - chance = Math.max(chance, block.down().getBurnChance()); - chance = Math.max(chance, block.up().getBurnChance()); - chance = Math.max(chance, block.south().getBurnChance()); - chance = Math.max(chance, block.north().getBurnChance()); - return chance; - } - } - - public boolean canNeighborBurn() { - for (BlockFace face : BlockFace.values()) { - if (this.getSide(face).getBurnChance() > 0) { - return true; - } - } - - return false; - } - - public boolean isBlockTopFacingSurfaceSolid(Block block) { - if (block != null) { - if (block.isSolid()) { - return true; - } else { - if (block instanceof BlockStairs && (block.getDamage() & 4) == 4) { - return true; - } else if (block instanceof BlockSlab && (block.getDamage() & 8) == 8) { - return true; - } else return block instanceof BlockSnowLayer && (block.getDamage() & 7) == 7; - } - } - - return false; - } - - @Override - public int tickRate() { - return 30; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - @Override - protected AxisAlignedBB recalculateCollisionBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(BlockID.AIR)); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFlowable.java b/src/main/java/cn/nukkit/block/BlockFlowable.java deleted file mode 100644 index 55cf44d99..000000000 --- a/src/main/java/cn/nukkit/block/BlockFlowable.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.math.AxisAlignedBB; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockFlowable extends BlockTransparentMeta { - - protected BlockFlowable(int meta) { - super(meta); - } - - @Override - public boolean canBeFlowedInto() { - return true; - } - - @Override - public boolean canPassThrough() { - return true; - } - - @Override - public double getHardness() { - return 0; - } - - @Override - public double getResistance() { - return 0; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return null; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFlower.java b/src/main/java/cn/nukkit/block/BlockFlower.java deleted file mode 100644 index f5aaa83ab..000000000 --- a/src/main/java/cn/nukkit/block/BlockFlower.java +++ /dev/null @@ -1,134 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/11/23 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockFlower extends BlockFlowable { - - public static final int TYPE_POPPY = 0; - public static final int TYPE_BLUE_ORCHID = 1; - public static final int TYPE_ALLIUM = 2; - public static final int TYPE_AZURE_BLUET = 3; - public static final int TYPE_RED_TULIP = 4; - public static final int TYPE_ORANGE_TULIP = 5; - public static final int TYPE_WHITE_TULIP = 6; - public static final int TYPE_PINK_TULIP = 7; - public static final int TYPE_OXEYE_DAISY = 8; - public static final int CORNFLOWER = 9; - public static final int LILY_OF_THE_VALLEY = 10; - - private static final String[] names = new String[]{ - "Poppy", - "Blue Orchid", - "Allium", - "Azure Bluet", - "Red Tulip", - "Orange Tulip", - "White Tulip", - "Pink Tulip", - "Oxeye Daisy", - "Cornflower", - "Lily of the Valley", - "Unknown", - "Unknown", - "Unknown", - "Unknown", - "Unknown" - }; - - public BlockFlower() { - this(0); - } - - public BlockFlower(int meta) { - super(meta); - } - - @Override - public int getId() { - return FLOWER; - } - - @Override - public String getName() { - return names[this.getDamage() & 0x0f]; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (down.getId() == Block.GRASS || down.getId() == Block.DIRT || down.getId() == Block.FARMLAND || down.getId() == Block.PODZOL) { - this.getLevel().setBlock(block, this, true); - - return true; - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().isTransparent()) { - this.getLevel().useBreakOn(this); - - return Level.BLOCK_UPDATE_NORMAL; - } - } - - return 0; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.DYE && item.getDamage() == 0x0f) { // Bone meal - if (player != null && !player.isCreative()) { - item.count--; - } - - this.level.addParticle(new BoneMealParticle(this)); - - for (int i = 0; i < 8; i++) { - Vector3 vec = this.add( - Utils.random.nextInt(-3, 4), - Utils.random.nextInt(-1, 2), - Utils.random.nextInt(-3, 4)); - - if (level.getBlock(vec).getId() == AIR && level.getBlock(vec.down()).getId() == GRASS && vec.getY() >= 0 && vec.getY() < 256) { - if (Utils.random.nextInt(10) == 0) { - this.level.setBlock(vec, this.getUncommonFlower(), true); - } else { - this.level.setBlock(vec, get(this.getId()), true); - } - } - } - - return true; - } - - return false; - } - - protected Block getUncommonFlower() { - return get(DANDELION); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFlowerPot.java b/src/main/java/cn/nukkit/block/BlockFlowerPot.java deleted file mode 100644 index 8ad321494..000000000 --- a/src/main/java/cn/nukkit/block/BlockFlowerPot.java +++ /dev/null @@ -1,185 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityFlowerPot; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemFlowerPot; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.Tag; - -/** - * @author Nukkit Project Team - */ -public class BlockFlowerPot extends BlockFlowable { - - public BlockFlowerPot() { - this(0); - } - - public BlockFlowerPot(int meta) { - super(meta); - } - - protected static boolean canPlaceIntoFlowerPot(int id, int dmg) { - switch (id) { - case SAPLING: - case DEAD_BUSH: - case DANDELION: - case ROSE: - case RED_MUSHROOM: - case BROWN_MUSHROOM: - case CACTUS: - return true; - case TALL_GRASS: - if (dmg == 2 || dmg == 3) { - return true; - } - default: - return false; - } - } - - @Override - public String getName() { - return "Flower Pot"; - } - - @Override - public int getId() { - return FLOWER_POT_BLOCK; - } - - private boolean isSupportValid(Block block) { - return block.isSolid() || block instanceof BlockFence || block instanceof BlockWall || block instanceof BlockHopper; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (!isSupportValid(down())) { - level.useBreakOn(this); - return type; - } - } - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (!isSupportValid(down())) return false; - CompoundTag nbt = new CompoundTag() - .putString("id", BlockEntity.FLOWER_POT) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putShort("item", 0) - .putInt("data", 0); - if (item.hasCustomBlockData()) { - for (Tag aTag : item.getCustomBlockData().getAllTags()) { - nbt.put(aTag.getName(), aTag); - } - } - BlockEntity.createBlockEntity(BlockEntity.FLOWER_POT, this.level.getChunk(block.getChunkX(), block.getChunkZ()), nbt); - - this.getLevel().setBlock(block, this, true, true); - return true; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item) { - return this.onActivate(item, null); - } - - @Override - public boolean onActivate(Item item, Player player) { - BlockEntity blockEntity = getLevel().getBlockEntity(this); - if (!(blockEntity instanceof BlockEntityFlowerPot)) return false; - if (blockEntity.namedTag.getShort("item") != AIR || blockEntity.namedTag.getInt("mData") != AIR) { - if (!canPlaceIntoFlowerPot(item.getId(), item.getDamage())) { - int id = blockEntity.namedTag.getShort("item"); - if (id == AIR) id = blockEntity.namedTag.getInt("mData"); - for (Item drop : player.getInventory().addItem(Item.get(id, blockEntity.namedTag.getInt("data")))) { - player.dropItem(drop); - } - - blockEntity.namedTag.putShort("item", AIR); - blockEntity.namedTag.putInt("data", 0); - this.setDamage(0); - this.level.setBlock(this, this, true); - ((BlockEntityFlowerPot) blockEntity).spawnToAll(); - return true; - } - return false; - } - int itemID; - if (!canPlaceIntoFlowerPot(item.getId(), item.getDamage())) { - Block b = item.getBlock(); - if (!canPlaceIntoFlowerPot(b.getId(), b.getDamage())) { - return true; - } - itemID = b.getId(); - } else { - itemID = item.getId(); - } - blockEntity.namedTag.putShort("item", itemID); - blockEntity.namedTag.putInt("data", item.getDamage()); - - this.setDamage(1); - this.getLevel().setBlock(this, this, true); - ((BlockEntityFlowerPot) blockEntity).spawnToAll(); - - if (!player.isCreative()) { - item.setCount(item.getCount() - 1); - player.getInventory().setItemInHand(item.getCount() > 0 ? item : Item.get(Item.AIR)); - } - return true; - } - - @Override - public Item[] getDrops(Item item) { - boolean dropInside = false; - int insideID = 0; - int insideMeta = 0; - BlockEntity blockEntity = getLevel().getBlockEntity(this); - if (blockEntity instanceof BlockEntityFlowerPot) { - dropInside = true; - insideID = blockEntity.namedTag.getShort("item"); - insideMeta = blockEntity.namedTag.getInt("data"); - } - - if (dropInside) { - return new Item[]{ - new ItemFlowerPot(), - Item.get(insideID, insideMeta, 1) - }; - } else { - return new Item[]{ - new ItemFlowerPot() - }; - } - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB(this.x + 0.3125, this.y, this.z + 0.3125, this.x + 0.6875, this.y + 0.375, this.z + 0.6875); - } - - @Override - public boolean canPassThrough() { - return false; - } - - @Override - public Item toItem() { - return new ItemFlowerPot(); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockFurnace.java b/src/main/java/cn/nukkit/block/BlockFurnace.java deleted file mode 100644 index ac7ba3988..000000000 --- a/src/main/java/cn/nukkit/block/BlockFurnace.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.Faceable; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockFurnace extends BlockFurnaceBurning implements Faceable { - - public BlockFurnace() { - this(0); - } - - public BlockFurnace(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Furnace"; - } - - @Override - public int getId() { - return FURNACE; - } - - @Override - public int getLightLevel() { - return 0; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockFurnaceBurning.java b/src/main/java/cn/nukkit/block/BlockFurnaceBurning.java deleted file mode 100644 index 0ff9d2c6a..000000000 --- a/src/main/java/cn/nukkit/block/BlockFurnaceBurning.java +++ /dev/null @@ -1,165 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityFurnace; -import cn.nukkit.inventory.ContainerInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.StringTag; -import cn.nukkit.nbt.tag.Tag; - -import java.util.Map; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockFurnaceBurning extends BlockSolidMeta { - - private static final int[] faces = {2, 5, 3, 4}; - - public BlockFurnaceBurning() { - this(0); - } - - public BlockFurnaceBurning(int meta) { - super(meta); - } - - @Override - public int getId() { - return BURNING_FURNACE; - } - - @Override - public String getName() { - return "Burning Furnace"; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public double getHardness() { - return 3.5; - } - - @Override - public double getResistance() { - return 17.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public int getLightLevel() { - return 13; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(faces[player != null ? player.getDirection().getHorizontalIndex() : 0]); - this.getLevel().setBlock(block, this, true, true); - CompoundTag nbt = new CompoundTag() - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.FURNACE) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (item.hasCustomName()) { - nbt.putString("CustomName", item.getCustomName()); - } - - if (item.hasCustomBlockData()) { - Map customData = item.getCustomBlockData().getTags(); - for (Map.Entry tag : customData.entrySet()) { - nbt.put(tag.getKey(), tag.getValue()); - } - } - - BlockEntity.createBlockEntity(BlockEntity.FURNACE, this.getChunk(), nbt); - return true; - } - - @Override - public boolean onBreak(Item item) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - BlockEntity t = this.getLevel().getBlockEntity(this); - BlockEntityFurnace furnace; - if (t instanceof BlockEntityFurnace) { - furnace = (BlockEntityFurnace) t; - } else { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.FURNACE) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - furnace = (BlockEntityFurnace) BlockEntity.createBlockEntity(BlockEntity.FURNACE, this.getChunk(), nbt); - } - - if (furnace.namedTag.contains("Lock") && furnace.namedTag.get("Lock") instanceof StringTag) { - if (!furnace.namedTag.getString("Lock").equals(item.getCustomName())) { - return true; - } - } - - player.addWindow(furnace.getInventory()); - } - - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(FURNACE)); - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - this.toItem() - }; - } else { - return new Item[0]; - } - } - - public boolean hasComparatorInputOverride() { - return true; - } - - @Override - public int getComparatorInputOverride() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityFurnace) { - return ContainerInventory.calculateRedstone(((BlockEntityFurnace) blockEntity).getInventory()); - } - - return super.getComparatorInputOverride(); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGlass.java b/src/main/java/cn/nukkit/block/BlockGlass.java deleted file mode 100644 index c754c9c81..000000000 --- a/src/main/java/cn/nukkit/block/BlockGlass.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockGlass extends BlockTransparent { - - @Override - public int getId() { - return GLASS; - } - - @Override - public String getName() { - return "Glass"; - } - - @Override - public double getResistance() { - return 1.5; - } - - @Override - public double getHardness() { - return 0.3; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGlassPane.java b/src/main/java/cn/nukkit/block/BlockGlassPane.java deleted file mode 100644 index 4470d48e4..000000000 --- a/src/main/java/cn/nukkit/block/BlockGlassPane.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/6 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockGlassPane extends BlockThin { - - @Override - public String getName() { - return "Glass Pane"; - } - - @Override - public int getId() { - return GLASS_PANE; - } - - @Override - public double getResistance() { - return 1.5; - } - - @Override - public double getHardness() { - return 0.3; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGlassPaneStained.java b/src/main/java/cn/nukkit/block/BlockGlassPaneStained.java deleted file mode 100644 index 2c30f4ec5..000000000 --- a/src/main/java/cn/nukkit/block/BlockGlassPaneStained.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 7.8.2017. - */ -public class BlockGlassPaneStained extends BlockGlassPane { - - private int meta; - - public BlockGlassPaneStained() { - this(0); - } - - public BlockGlassPaneStained(int meta) { - this.meta = meta; - } - - @Override - public int getFullId() { - return (2560) + meta; - } - - @Override - public int getId() { - return STAINED_GLASS_PANE; - } - - @Override - public String getName() { - return getDyeColor().getName() + " Stained Glass Pane"; - } - - @Override - public BlockColor getColor() { - return getDyeColor().getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(meta); - } - - @Override - public final int getDamage() { - return this.meta; - } - - @Override - public final void setDamage(int meta) { - this.meta = meta; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGlassStained.java b/src/main/java/cn/nukkit/block/BlockGlassStained.java deleted file mode 100644 index 151414aa8..000000000 --- a/src/main/java/cn/nukkit/block/BlockGlassStained.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 7.8.2017. - */ -public class BlockGlassStained extends BlockGlass { - - private int meta; - - public BlockGlassStained() { - this(0); - } - - public BlockGlassStained(int meta) { - this.meta = meta; - } - - @Override - public int getFullId() { - return (3856) + meta; - } - - @Override - public int getId() { - return STAINED_GLASS; - } - - @Override - public String getName() { - return getDyeColor().getName() + " Stained Glass"; - } - - @Override - public BlockColor getColor() { - return DyeColor.getByWoolData(meta).getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(meta); - } - - @Override - public final int getDamage() { - return this.meta; - } - - @Override - public final void setDamage(int meta) { - this.meta = meta; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGlowStick.java b/src/main/java/cn/nukkit/block/BlockGlowStick.java deleted file mode 100644 index 2c153ab91..000000000 --- a/src/main/java/cn/nukkit/block/BlockGlowStick.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -/** - * Created by PetteriM1 - */ -public class BlockGlowStick extends BlockTransparentMeta { - - public BlockGlowStick() { - this(0); - } - - public BlockGlowStick(int meta) { - super(meta); - } - - @Override - public int getId() { - return GLOW_STICK; - } - - @Override - public String getName() { - return "Glow Stick"; - } - - @Override - public Item toItem() { - return Item.get(AIR); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGlowstone.java b/src/main/java/cn/nukkit/block/BlockGlowstone.java deleted file mode 100644 index 06b53bbf8..000000000 --- a/src/main/java/cn/nukkit/block/BlockGlowstone.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemGlowstoneDust; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.math.MathHelper; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/12/6 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockGlowstone extends BlockTransparent { - - @Override - public String getName() { - return "Glowstone"; - } - - @Override - public int getId() { - return GLOWSTONE_BLOCK; - } - - @Override - public double getResistance() { - return 1.5; - } - - @Override - public double getHardness() { - return 0.3; - } - - @Override - public int getLightLevel() { - return 15; - } - - @Override - public Item[] getDrops(Item item) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - - int count = 2 + Utils.random.nextInt(3); - - Enchantment fortune = item.getEnchantment(Enchantment.ID_FORTUNE_DIGGING); - if (fortune != null && fortune.getLevel() >= 1) { - count += Utils.random.nextInt(fortune.getLevel() + 1); - } - - return new Item[]{ - new ItemGlowstoneDust(0, MathHelper.clamp(count, 1, 4)) - }; - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGold.java b/src/main/java/cn/nukkit/block/BlockGold.java deleted file mode 100644 index 7124c8445..000000000 --- a/src/main/java/cn/nukkit/block/BlockGold.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockGold extends BlockSolid { - - @Override - public int getId() { - return GOLD_BLOCK; - } - - @Override - public String getName() { - return "Block of Gold"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_IRON) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.GOLD_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGrass.java b/src/main/java/cn/nukkit/block/BlockGrass.java deleted file mode 100644 index 4a2bf4ac8..000000000 --- a/src/main/java/cn/nukkit/block/BlockGrass.java +++ /dev/null @@ -1,142 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.block.BlockSpreadEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.Level; -import cn.nukkit.level.Sound; -import cn.nukkit.level.generator.object.ObjectTallGrass; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockGrass extends BlockDirt { - - public BlockGrass() { - this(0); - } - - public BlockGrass(int meta) { - super(0); - } - - @Override - public int getId() { - return GRASS; - } - - @Override - public double getHardness() { - return 0.6; - } - - @Override - public double getResistance() { - return 3; - } - - @Override - public String getName() { - return "Grass Block"; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.DYE && item.getDamage() == 0x0F) { - ObjectTallGrass.growGrass(this.getLevel(), this, Utils.nukkitRandom); - this.level.addParticle(new BoneMealParticle(this)); - if (player != null) { - if (!player.isCreative()) { - item.count--; - } - player.getLevel().addSoundToViewers(player, Sound.STEP_GRASS); - } - return true; - } else if (item.isHoe()) { - Block up = this.up(); - if (up instanceof BlockAir || up instanceof BlockFlowable) { - item.useOn(this); - this.getLevel().setBlock(this, Block.get(FARMLAND)); - if (player != null) { - player.getLevel().addSoundToViewers(player, Sound.STEP_GRASS); - } - return true; - } - } else if (item.isShovel()) { - Block up = this.up(); - if (up instanceof BlockAir || up instanceof BlockFlowable) { - item.useOn(this); - this.getLevel().setBlock(this, Block.get(GRASS_PATH)); - if (player != null) { - player.getLevel().addSoundToViewers(player, Sound.STEP_GRASS); - } - return true; - } - } - - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_RANDOM) { - x = Utils.rand((int) x - 1, (int) x + 1); - y = Utils.rand((int) y - 2, (int) y + 2); - z = Utils.rand((int) z - 1, (int) z + 1); - Block block = this.getLevel().getBlock(new Vector3(x, y, z)); - if (block.getId() == Block.DIRT && block.getDamage() == 0) { - if (block.up() instanceof BlockAir) { - BlockSpreadEvent ev = new BlockSpreadEvent(block, this, Block.get(GRASS)); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.getLevel().setBlock(block, ev.getNewState()); - } - } - } else if (block.getId() == Block.GRASS) { - if (block.up() instanceof BlockSolid) { - BlockSpreadEvent ev = new BlockSpreadEvent(block, this, Block.get(DIRT)); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.getLevel().setBlock(block, ev.getNewState()); - } - } - } - } - return 0; - } - - @Override - public BlockColor getColor() { - return BlockColor.GRASS_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public int getFullId() { - return this.getId() << 4; - } - - @Override - public void setDamage(int meta) { - } - - @Override - public Item[] getDrops(Item item) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[]{new ItemBlock(Block.get(BlockID.DIRT))}; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockGrassPath.java b/src/main/java/cn/nukkit/block/BlockGrassPath.java deleted file mode 100644 index 6961c6e98..000000000 --- a/src/main/java/cn/nukkit/block/BlockGrassPath.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Sound; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/22 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockGrassPath extends BlockGrass { - - @Override - public int getId() { - return GRASS_PATH; - } - - @Override - public String getName() { - return "Grass Path"; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, // the actual bounding box is a normal cube - this.z + 1 - ); - } - - @Override - public double getResistance() { - return 3.25; - } - - @Override - public int onUpdate(int type) { - return 0; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.isHoe()) { - Block up = this.up(); - if (up instanceof BlockAir || up instanceof BlockFlowable) { - item.useOn(this); - this.getLevel().setBlock(this, get(FARMLAND), true); - if (player != null) { - player.getLevel().addSoundToViewers(player, Sound.STEP_GRASS); - } - return true; - } - } - - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.DIRT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockGravel.java b/src/main/java/cn/nukkit/block/BlockGravel.java deleted file mode 100644 index 33dea3af0..000000000 --- a/src/main/java/cn/nukkit/block/BlockGravel.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemFlint; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockGravel extends BlockFallable { - - @Override - public int getId() { - return GRAVEL; - } - - @Override - public double getHardness() { - return 0.6; - } - - @Override - public double getResistance() { - return 3; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - public String getName() { - return "Gravel"; - } - - @Override - public Item[] getDrops(Item item) { - if (Utils.random.nextInt(9) == 0 && !item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{ - new ItemFlint() - }; - } else { - return new Item[]{ - toItem() - }; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.GRAY_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockHardGlass.java b/src/main/java/cn/nukkit/block/BlockHardGlass.java deleted file mode 100644 index 6d0215f97..000000000 --- a/src/main/java/cn/nukkit/block/BlockHardGlass.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -/** - * Created by PetteriM1 - */ -public class BlockHardGlass extends BlockTransparent { - - @Override - public int getId() { - return HARD_GLASS; - } - - @Override - public String getName() { - return "Hardened Glass"; - } - - @Override - public double getResistance() { - return 1.5; - } - - @Override - public double getHardness() { - return 0.3; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockHardGlassPane.java b/src/main/java/cn/nukkit/block/BlockHardGlassPane.java deleted file mode 100644 index 8965d9bf7..000000000 --- a/src/main/java/cn/nukkit/block/BlockHardGlassPane.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.utils.BlockColor; - -/** - * Created by PetteriM1 - */ -public class BlockHardGlassPane extends BlockThin { - - @Override - public String getName() { - return "Hardened Glass Pane"; - } - - @Override - public int getId() { - return HARD_GLASS_PANE; - } - - @Override - public double getResistance() { - return 1.5; - } - - @Override - public double getHardness() { - return 0.3; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockHardGlassPaneStained.java b/src/main/java/cn/nukkit/block/BlockHardGlassPaneStained.java deleted file mode 100644 index 71156390c..000000000 --- a/src/main/java/cn/nukkit/block/BlockHardGlassPaneStained.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created by PetteriM1 - */ -public class BlockHardGlassPaneStained extends BlockHardGlassPane { - - private int meta; - - public BlockHardGlassPaneStained() { - this(0); - } - - public BlockHardGlassPaneStained(int meta) { - this.meta = meta; - } - - @Override - public int getFullId() { - return (3056) + meta; - } - - @Override - public int getId() { - return HARD_STAINED_GLASS_PANE; - } - - @Override - public String getName() { - return getDyeColor().getName() + " Hardened Stained Glass Pane"; - } - - @Override - public BlockColor getColor() { - return getDyeColor().getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(meta); - } - - @Override - public final int getDamage() { - return this.meta; - } - - @Override - public final void setDamage(int meta) { - this.meta = meta; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockHardGlassStained.java b/src/main/java/cn/nukkit/block/BlockHardGlassStained.java deleted file mode 100644 index b5fdadde6..000000000 --- a/src/main/java/cn/nukkit/block/BlockHardGlassStained.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -/** - * Created by PetteriM1 - */ -public class BlockHardGlassStained extends BlockTransparentMeta { - - public BlockHardGlassStained() { - this(0); - } - - public BlockHardGlassStained(int meta) { - super(meta); - } - @Override - public int getId() { - return HARD_STAINED_GLASS; - } - - @Override - public String getName() { - return "Hardened Stained Glass"; - } - - @Override - public double getResistance() { - return 1.5; - } - - @Override - public double getHardness() { - return 0.3; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockHayBale.java b/src/main/java/cn/nukkit/block/BlockHayBale.java deleted file mode 100644 index cc7b945a2..000000000 --- a/src/main/java/cn/nukkit/block/BlockHayBale.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * Created on 2015/11/24 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockHayBale extends BlockSolidMeta implements Faceable { - - private static final short[] faces = new short[]{ - 0, - 0, - 0b1000, - 0b1000, - 0b0100, - 0b0100, - }; - - public BlockHayBale() { - this(0); - } - - public BlockHayBale(int meta) { - super(meta); - } - - @Override - public int getId() { - return HAY_BALE; - } - - @Override - public String getName() { - return "Hay Bale"; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public int getBurnChance() { - return 60; - } - - @Override - public int getBurnAbility() { - return 20; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_HOE; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage((this.getDamage() & 0x03) | faces[face.getIndex()]); - this.getLevel().setBlock(block, this, true, true); - - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.YELLOW_BLOCK_COLOR; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockHopper.java b/src/main/java/cn/nukkit/block/BlockHopper.java deleted file mode 100644 index bf90df59f..000000000 --- a/src/main/java/cn/nukkit/block/BlockHopper.java +++ /dev/null @@ -1,167 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityHopper; -import cn.nukkit.inventory.ContainerInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemHopper; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.Faceable; - -/** - * @author CreeperFace - */ -public class BlockHopper extends BlockTransparentMeta implements Faceable { - - public BlockHopper() { - this(0); - } - - public BlockHopper(int meta) { - super(meta); - } - - @Override - public int getId() { - return HOPPER_BLOCK; - } - - @Override - public String getName() { - return "Hopper Block"; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 24; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - BlockFace facing = face.getOpposite(); - - if (facing == BlockFace.UP) { - facing = BlockFace.DOWN; - } - - this.setDamage(facing.getIndex()); - - boolean powered = this.level.isBlockPowered(this); - - if (powered == this.isEnabled()) { - this.setEnabled(!powered); - } - - this.level.setBlock(this, this); - - CompoundTag nbt = new CompoundTag() - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.HOPPER) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - BlockEntity.createBlockEntity(BlockEntity.HOPPER, this.getChunk(), nbt); - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityHopper) { - return player.addWindow(((BlockEntityHopper) blockEntity).getInventory()) != -1; - } - - return false; - } - - @Override - public boolean canBeActivated() { - return true; - } - - public boolean hasComparatorInputOverride() { - return true; - } - - @Override - public int getComparatorInputOverride() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityHopper) { - return ContainerInventory.calculateRedstone(((BlockEntityHopper) blockEntity).getInventory()); - } - - return super.getComparatorInputOverride(); - } - - public BlockFace getFacing() { - return BlockFace.fromIndex(this.getDamage() & 7); - } - - public boolean isEnabled() { - return (this.getDamage() & 0x08) != 8; - } - - public void setEnabled(boolean enabled) { - if (isEnabled() != enabled) { - this.setDamage(this.getDamage() ^ 0x08); - } - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - boolean powered = this.level.isBlockPowered(this); - - if (powered == this.isEnabled()) { - this.setEnabled(!powered); - this.level.setBlock(this, this, true, false); - } - - return type; - } - - return 0; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.getTier() >= ItemTool.TIER_WOODEN) { - return new Item[]{toItem()}; - } - - return new Item[0]; - } - - @Override - public Item toItem() { - return new ItemHopper(); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockHugeMushroomBrown.java b/src/main/java/cn/nukkit/block/BlockHugeMushroomBrown.java deleted file mode 100644 index e11e9ffac..000000000 --- a/src/main/java/cn/nukkit/block/BlockHugeMushroomBrown.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created by Pub4Game on 28.01.2016. - */ -public class BlockHugeMushroomBrown extends BlockSolidMeta { - - public BlockHugeMushroomBrown() { - this(0); - } - - public BlockHugeMushroomBrown(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Brown Mushroom Block"; - } - - @Override - public int getId() { - return BROWN_MUSHROOM_BLOCK; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public double getHardness() { - return 0.2; - } - - @Override - public Item[] getDrops(Item item) { - if (item != null && item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[]{new ItemBlock(Block.get(BROWN_MUSHROOM), 0, Utils.rand() ? Utils.rand(0, 2) : 0)}; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.BROWN_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockHugeMushroomRed.java b/src/main/java/cn/nukkit/block/BlockHugeMushroomRed.java deleted file mode 100644 index 08d19cbff..000000000 --- a/src/main/java/cn/nukkit/block/BlockHugeMushroomRed.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created by Pub4Game on 28.01.2016. - */ -public class BlockHugeMushroomRed extends BlockSolidMeta { - - public BlockHugeMushroomRed() { - this(0); - } - - public BlockHugeMushroomRed(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Red Mushroom Block"; - } - - @Override - public int getId() { - return RED_MUSHROOM_BLOCK; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public double getHardness() { - return 0.2; - } - - @Override - public Item[] getDrops(Item item) { - if (item != null && item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[]{new ItemBlock(Block.get(RED_MUSHROOM), 0, Utils.rand() ? Utils.rand(0, 2) : 0)}; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.RED_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockID.java b/src/main/java/cn/nukkit/block/BlockID.java deleted file mode 100644 index 8f157599d..000000000 --- a/src/main/java/cn/nukkit/block/BlockID.java +++ /dev/null @@ -1,326 +0,0 @@ -package cn.nukkit.block; - -/** - * List of block IDs - */ -public interface BlockID { - - int AIR = 0; - int STONE = 1; - int GRASS = 2; - int DIRT = 3; - int COBBLESTONE = 4; - int COBBLE = 4; - int PLANK = 5; - int PLANKS = 5; - int WOODEN_PLANK = 5; - int WOODEN_PLANKS = 5; - int SAPLING = 6; - int SAPLINGS = 6; - int BEDROCK = 7; - int WATER = 8; - int STILL_WATER = 9; - int LAVA = 10; - int STILL_LAVA = 11; - int SAND = 12; - int GRAVEL = 13; - int GOLD_ORE = 14; - int IRON_ORE = 15; - int COAL_ORE = 16; - int LOG = 17; - int WOOD = 17; - int TRUNK = 17; - int LEAVES = 18; - int LEAVE = 18; - int SPONGE = 19; - int GLASS = 20; - int LAPIS_ORE = 21; - int LAPIS_BLOCK = 22; - int DISPENSER = 23; - int SANDSTONE = 24; - int NOTEBLOCK = 25; - int BED_BLOCK = 26; - int POWERED_RAIL = 27; - int DETECTOR_RAIL = 28; - int STICKY_PISTON = 29; - int COBWEB = 30; - int TALL_GRASS = 31; - int BUSH = 32; - int DEAD_BUSH = 32; - int PISTON = 33; - int PISTON_HEAD = 34; - int WOOL = 35; - int DANDELION = 37; - int POPPY = 38; - int ROSE = 38; - int FLOWER = 38; - int RED_FLOWER = 38; - int BROWN_MUSHROOM = 39; - int RED_MUSHROOM = 40; - int GOLD_BLOCK = 41; - int IRON_BLOCK = 42; - int DOUBLE_SLAB = 43; - int DOUBLE_STONE_SLAB = 43; - int DOUBLE_SLABS = 43; - int SLAB = 44; - int STONE_SLAB = 44; - int SLABS = 44; - int BRICKS = 45; - int BRICKS_BLOCK = 45; - int TNT = 46; - int BOOKSHELF = 47; - int MOSS_STONE = 48; - int MOSSY_STONE = 48; - int OBSIDIAN = 49; - int TORCH = 50; - int FIRE = 51; - int MONSTER_SPAWNER = 52; - int WOOD_STAIRS = 53; - int WOODEN_STAIRS = 53; - int OAK_WOOD_STAIRS = 53; - int OAK_WOODEN_STAIRS = 53; - int CHEST = 54; - int REDSTONE_WIRE = 55; - int DIAMOND_ORE = 56; - int DIAMOND_BLOCK = 57; - int CRAFTING_TABLE = 58; - int WORKBENCH = 58; - int WHEAT_BLOCK = 59; - int FARMLAND = 60; - int FURNACE = 61; - int BURNING_FURNACE = 62; - int LIT_FURNACE = 62; - int SIGN_POST = 63; - int DOOR_BLOCK = 64; - int WOODEN_DOOR_BLOCK = 64; - int WOOD_DOOR_BLOCK = 64; - int LADDER = 65; - int RAIL = 66; - int COBBLE_STAIRS = 67; - int COBBLESTONE_STAIRS = 67; - int WALL_SIGN = 68; - int LEVER = 69; - int STONE_PRESSURE_PLATE = 70; - int IRON_DOOR_BLOCK = 71; - int WOODEN_PRESSURE_PLATE = 72; - int REDSTONE_ORE = 73; - int GLOWING_REDSTONE_ORE = 74; - int LIT_REDSTONE_ORE = 74; - int UNLIT_REDSTONE_TORCH = 75; - int REDSTONE_TORCH = 76; - int STONE_BUTTON = 77; - int SNOW = 78; - int SNOW_LAYER = 78; - int ICE = 79; - int SNOW_BLOCK = 80; - int CACTUS = 81; - int CLAY_BLOCK = 82; - int REEDS = 83; - int SUGARCANE_BLOCK = 83; - int JUKEBOX = 84; - int FENCE = 85; - int PUMPKIN = 86; - int NETHERRACK = 87; - int SOUL_SAND = 88; - int GLOWSTONE = 89; - int GLOWSTONE_BLOCK = 89; - int NETHER_PORTAL = 90; - int LIT_PUMPKIN = 91; - int JACK_O_LANTERN = 91; - int CAKE_BLOCK = 92; - int UNPOWERED_REPEATER = 93; - int POWERED_REPEATER = 94; - int INVISIBLE_BEDROCK = 95; - int TRAPDOOR = 96; - int MONSTER_EGG = 97; - int STONE_BRICKS = 98; - int STONE_BRICK = 98; - int BROWN_MUSHROOM_BLOCK = 99; - int RED_MUSHROOM_BLOCK = 100; - int IRON_BAR = 101; - int IRON_BARS = 101; - int GLASS_PANE = 102; - int GLASS_PANEL = 102; - int MELON_BLOCK = 103; - int PUMPKIN_STEM = 104; - int MELON_STEM = 105; - int VINE = 106; - int VINES = 106; - int FENCE_GATE = 107; - int FENCE_GATE_OAK = 107; - int BRICK_STAIRS = 108; - int STONE_BRICK_STAIRS = 109; - int MYCELIUM = 110; - int WATER_LILY = 111; - int LILY_PAD = 111; - int NETHER_BRICKS = 112; - int NETHER_BRICK_BLOCK = 112; - int NETHER_BRICK_FENCE = 113; - int NETHER_BRICKS_STAIRS = 114; - int NETHER_WART_BLOCK = 115; - int ENCHANTING_TABLE = 116; - int ENCHANT_TABLE = 116; - int ENCHANTMENT_TABLE = 116; - int BREWING_STAND_BLOCK = 117; - int BREWING_BLOCK = 117; - int CAULDRON_BLOCK = 118; - int END_PORTAL = 119; - int END_PORTAL_FRAME = 120; - int END_STONE = 121; - int DRAGON_EGG = 122; - int REDSTONE_LAMP = 123; - int LIT_REDSTONE_LAMP = 124; - int DROPPER = 125; - int ACTIVATOR_RAIL = 126; - int COCOA = 127; - int COCOA_BLOCK = 127; - int SANDSTONE_STAIRS = 128; - int EMERALD_ORE = 129; - int ENDER_CHEST = 130; - int TRIPWIRE_HOOK = 131; - int TRIPWIRE = 132; - int EMERALD_BLOCK = 133; - int SPRUCE_WOOD_STAIRS = 134; - int SPRUCE_WOODEN_STAIRS = 134; - int BIRCH_WOOD_STAIRS = 135; - int BIRCH_WOODEN_STAIRS = 135; - int JUNGLE_WOOD_STAIRS = 136; - int JUNGLE_WOODEN_STAIRS = 136; - int COMMAND_BLOCK = 137; - int BEACON = 138; - int COBBLE_WALL = 139; - int STONE_WALL = 139; - int COBBLESTONE_WALL = 139; - int FLOWER_POT_BLOCK = 140; - int CARROT_BLOCK = 141; - int POTATO_BLOCK = 142; - int WOODEN_BUTTON = 143; - int SKULL_BLOCK = 144; - int ANVIL = 145; - int TRAPPED_CHEST = 146; - int LIGHT_WEIGHTED_PRESSURE_PLATE = 147; - int HEAVY_WEIGHTED_PRESSURE_PLATE = 148; - int UNPOWERED_COMPARATOR = 149; - int POWERED_COMPARATOR = 150; - int DAYLIGHT_DETECTOR = 151; - int REDSTONE_BLOCK = 152; - int QUARTZ_ORE = 153; - int HOPPER_BLOCK = 154; - int QUARTZ_BLOCK = 155; - int QUARTZ_STAIRS = 156; - int DOUBLE_WOOD_SLAB = 157; - int DOUBLE_WOODEN_SLAB = 157; - int DOUBLE_WOOD_SLABS = 157; - int DOUBLE_WOODEN_SLABS = 157; - int WOOD_SLAB = 158; - int WOODEN_SLAB = 158; - int WOOD_SLABS = 158; - int WOODEN_SLABS = 158; - int STAINED_TERRACOTTA = 159; - int STAINED_HARDENED_CLAY = 159; - int STAINED_GLASS_PANE = 160; - int LEAVES2 = 161; - int LEAVE2 = 161; - int WOOD2 = 162; - int TRUNK2 = 162; - int LOG2 = 162; - int ACACIA_WOOD_STAIRS = 163; - int ACACIA_WOODEN_STAIRS = 163; - int DARK_OAK_WOOD_STAIRS = 164; - int DARK_OAK_WOODEN_STAIRS = 164; - int SLIME_BLOCK = 165; - int GLOW_STICK = 166; - int IRON_TRAPDOOR = 167; - int PRISMARINE = 168; - int SEA_LANTERN = 169; - int HAY_BALE = 170; - int HAY_BLOCK = 170; - int CARPET = 171; - int TERRACOTTA = 172; - int COAL_BLOCK = 173; - int PACKED_ICE = 174; - int DOUBLE_PLANT = 175; - int STANDING_BANNER = 176; - int WALL_BANNER = 177; - int DAYLIGHT_DETECTOR_INVERTED = 178; - int RED_SANDSTONE = 179; - int RED_SANDSTONE_STAIRS = 180; - int DOUBLE_RED_SANDSTONE_SLAB = 181; - int RED_SANDSTONE_SLAB = 182; - int FENCE_GATE_SPRUCE = 183; - int FENCE_GATE_BIRCH = 184; - int FENCE_GATE_JUNGLE = 185; - int FENCE_GATE_DARK_OAK = 186; - int FENCE_GATE_ACACIA = 187; - int REPEATING_COMMAND_BLOCK = 188; - int CHAIN_COMMAND_BLOCK = 189; - int HARD_GLASS_PANE = 190; - int HARD_STAINED_GLASS_PANE = 191; - int CHEMICAL_HEAT = 192; - int SPRUCE_DOOR_BLOCK = 193; - int BIRCH_DOOR_BLOCK = 194; - int JUNGLE_DOOR_BLOCK = 195; - int ACACIA_DOOR_BLOCK = 196; - int DARK_OAK_DOOR_BLOCK = 197; - int GRASS_PATH = 198; - int ITEM_FRAME_BLOCK = 199; - int CHORUS_FLOWER = 200; - int PURPUR_BLOCK = 201; - int COLORED_TORCH_RG = 202; - int PURPUR_STAIRS = 203; - int COLORED_TORCH_BP = 204; - int UNDYED_SHULKER_BOX = 205; - int END_BRICKS = 206; - int FROSTED_ICE = 207; - int ICE_FROSTED = 207; - int END_ROD = 208; - int END_GATEWAY = 209; - // 210 Allow in Education Edition - // 211 Deny in Education Edition - // 212 Border in Education Edition - int MAGMA = 213; - int MAGMA_BLOCK = 213; - int BLOCK_NETHER_WART_BLOCK = 214; - int RED_NETHER_BRICK = 215; - int BONE_BLOCK = 216; - // 217 not yet in Minecraft - int SHULKER_BOX = 218; - int PURPLE_GLAZED_TERRACOTTA = 219; - int WHITE_GLAZED_TERRACOTTA = 220; - int ORANGE_GLAZED_TERRACOTTA = 221; - int MAGENTA_GLAZED_TERRACOTTA = 222; - int LIGHT_BLUE_GLAZED_TERRACOTTA = 223; - int YELLOW_GLAZED_TERRACOTTA = 224; - int LIME_GLAZED_TERRACOTTA = 225; - int PINK_GLAZED_TERRACOTTA = 226; - int GRAY_GLAZED_TERRACOTTA = 227; - int SILVER_GLAZED_TERRACOTTA = 228; - int CYAN_GLAZED_TERRACOTTA = 229; - // 230 Chalkboard in Education Edition - int BLUE_GLAZED_TERRACOTTA = 231; - int BROWN_GLAZED_TERRACOTTA = 232; - int GREEN_GLAZED_TERRACOTTA = 233; - int RED_GLAZED_TERRACOTTA = 234; - int BLACK_GLAZED_TERRACOTTA = 235; - int CONCRETE = 236; - int CONCRETE_POWDER = 237; - int CHEMISTRY_TABLE = 238; - int UNDERWATER_TORCH = 239; - int CHORUS_PLANT = 240; - int STAINED_GLASS = 241; - int CAMERA_BLOCK = 242; - int PODZOL = 243; - int BEETROOT_BLOCK = 244; - int STONECUTTER = 245; - int GLOWING_OBSIDIAN = 246; - int NETHER_REACTOR = 247; - int INFO_UPDATE = 248; - int INFO_UPDATE2 = 249; - int PISTON_EXTENSION = 250; - int MOVING_BLOCK = 250; - int OBSERVER = 251; - int STRUCTURE_BLOCK = 252; - int HARD_GLASS = 253; - int HARD_STAINED_GLASS = 254; - int RESERVED6 = 255; -} diff --git a/src/main/java/cn/nukkit/block/BlockIce.java b/src/main/java/cn/nukkit/block/BlockIce.java deleted file mode 100644 index 3bf6a2672..000000000 --- a/src/main/java/cn/nukkit/block/BlockIce.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.event.block.BlockFadeEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.Level; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockIce extends BlockTransparent { - - @Override - public int getId() { - return ICE; - } - - @Override - public String getName() { - return "Ice"; - } - - @Override - public double getResistance() { - return 0.5; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getFrictionFactor() { - return 0.98; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public boolean onBreak(Item item) { - if (this.getLevel().getDimension() == Level.DIMENSION_NETHER || item.hasEnchantment(Enchantment.ID_SILK_TOUCH) || down().getId() == BlockID.AIR) { - return super.onBreak(item); - } - return this.getLevel().setBlock(this, Block.get(BlockID.WATER), true); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_RANDOM) { - if (level.getBlockLightAt((int) this.x, (int) this.y, (int) this.z) >= 12) { - BlockFadeEvent event = new BlockFadeEvent(this, level.getDimension() == Level.DIMENSION_NETHER ? get(AIR) : get(WATER)); - level.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - level.setBlock(this, event.getNewState(), true); - } - return Level.BLOCK_UPDATE_RANDOM; - } - } - return 0; - } - - @Override - public Item[] getDrops(Item item) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[0]; - } - - @Override - public BlockColor getColor() { - return BlockColor.ICE_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockIceFrosted.java b/src/main/java/cn/nukkit/block/BlockIceFrosted.java deleted file mode 100644 index 413839e43..000000000 --- a/src/main/java/cn/nukkit/block/BlockIceFrosted.java +++ /dev/null @@ -1,126 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created by PetteriM1 - */ -public class BlockIceFrosted extends BlockTransparentMeta { - - public BlockIceFrosted() { - this(0); - } - - public BlockIceFrosted(int meta) { - super(meta); - } - - @Override - public int getId() { - return ICE_FROSTED; - } - - @Override - public String getName() { - return "Frosted Ice"; - } - - @Override - public double getResistance() { - return 0.5; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getFrictionFactor() { - return 0.98; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - boolean success = super.place(item, block, target, face, fx, fy, fz, player); - if (success) { - level.scheduleUpdate(this, Utils.random.nextInt(20, 40)); - } - return success; - } - - @Override - public boolean onBreak(Item item) { - level.setBlock(this, get(WATER), true); - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_SCHEDULED) { - if ((this.getLevel().getBlockLightAt((int) this.x, (int) this.y, (int) this.z) >= 12 || (level.getTime() % Level.TIME_FULL < 13184 || level.getTime() % Level.TIME_FULL > 22800)) && (Utils.random.nextInt(3) == 0 || countNeighbors() < 4)) { - slightlyMelt(true); - } else { - level.scheduleUpdate(this, Utils.random.nextInt(20, 40)); - } - } else if (type == Level.BLOCK_UPDATE_NORMAL) { - if (countNeighbors() < 2) { - level.setBlock(this, get(WATER), true); - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if ((this.getLevel().getBlockLightAt((int) this.x, (int) this.y, (int) this.z) >= 12 || (level.getTime() % Level.TIME_FULL < 13184 || level.getTime() % Level.TIME_FULL > 22800)) && (Utils.random.nextInt(3) == 0 || countNeighbors() < 4)) { - slightlyMelt(true); - } - } - return super.onUpdate(type); - } - - @Override - public Item toItem() { - return Item.get(AIR); - } - - @Override - public BlockColor getColor() { - return BlockColor.ICE_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - protected void slightlyMelt(boolean isSource) { - int age = getDamage(); - if (age < 3) { - setDamage(age + 1); - level.setBlock(this, this, true); - level.scheduleUpdate(level.getBlock(this), Utils.random.nextInt(20, 40)); - } else { - level.setBlock(this, get(WATER), true); - if (isSource) { - for (BlockFace face : BlockFace.values()) { - Block block = getSide(face); - if (block instanceof BlockIceFrosted) { - ((BlockIceFrosted) block).slightlyMelt(false); - } - } - } - } - } - - private int countNeighbors() { - int neighbors = 0; - for (BlockFace face : BlockFace.values()) { - if (getSide(face).getId() == ICE_FROSTED && ++neighbors >= 4) { - return neighbors; - } - } - return neighbors; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockIcePacked.java b/src/main/java/cn/nukkit/block/BlockIcePacked.java deleted file mode 100644 index 224bd8119..000000000 --- a/src/main/java/cn/nukkit/block/BlockIcePacked.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.Enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockIcePacked extends BlockIce { - - @Override - public int getId() { - return PACKED_ICE; - } - - @Override - public String getName() { - return "Packed Ice"; - } - - @Override - public boolean onBreak(Item item) { - return this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - } - - @Override - public Item[] getDrops(Item item) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{ - this.toItem() - }; - } - return new Item[0]; - } - - @Override - public int onUpdate(int type) { - return 0; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public int getLightLevel() { - return 4; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockInfoUpdate.java b/src/main/java/cn/nukkit/block/BlockInfoUpdate.java deleted file mode 100644 index 3ab469dad..000000000 --- a/src/main/java/cn/nukkit/block/BlockInfoUpdate.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.block; - -/** - * Created by PetteriM1 - */ -public class BlockInfoUpdate extends BlockSolid { - - @Override - public int getId() { - return INFO_UPDATE; - } - - @Override - public String getName() { - return "Update Game Block"; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockInfoUpdate2.java b/src/main/java/cn/nukkit/block/BlockInfoUpdate2.java deleted file mode 100644 index 0665cc055..000000000 --- a/src/main/java/cn/nukkit/block/BlockInfoUpdate2.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.block; - -/** - * Created by PetteriM1 - */ -public class BlockInfoUpdate2 extends BlockSolid { - - @Override - public int getId() { - return INFO_UPDATE2; - } - - @Override - public String getName() { - return "Update Game Block"; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockIron.java b/src/main/java/cn/nukkit/block/BlockIron.java deleted file mode 100644 index e59d64f4c..000000000 --- a/src/main/java/cn/nukkit/block/BlockIron.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockIron extends BlockSolid { - - @Override - public int getId() { - return IRON_BLOCK; - } - - @Override - public String getName() { - return "Block of Iron"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_STONE) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.IRON_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockIronBars.java b/src/main/java/cn/nukkit/block/BlockIronBars.java deleted file mode 100644 index 947a0a36c..000000000 --- a/src/main/java/cn/nukkit/block/BlockIronBars.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/6 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockIronBars extends BlockThin { - - @Override - public String getName() { - return "Iron Bars"; - } - - @Override - public int getId() { - return IRON_BARS; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - this.toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.IRON_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockItemFrame.java b/src/main/java/cn/nukkit/block/BlockItemFrame.java deleted file mode 100644 index 3916616f5..000000000 --- a/src/main/java/cn/nukkit/block/BlockItemFrame.java +++ /dev/null @@ -1,180 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityItemFrame; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemItemFrame; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.ItemFrameItemAddedSound; -import cn.nukkit.level.sound.ItemFrameItemRotated; -import cn.nukkit.level.sound.ItemFramePlacedSound; -import cn.nukkit.level.sound.ItemFrameRemovedSound; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.Tag; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * Created by Pub4Game on 03.07.2016. - */ -public class BlockItemFrame extends BlockTransparentMeta { - - private final static int[] FACING = new int[]{4, 5, 3, 2, 1, 0}; // TODO when 1.13 support arrives, add UP/DOWN facings - - private final static int FACING_BITMASK = 0b0111; - //private final static int MAP_BIT = 0b1000; - - public BlockItemFrame() { - this(0); - } - - public BlockItemFrame(int meta) { - super(meta); - } - - @Override - public int getId() { - return ITEM_FRAME_BLOCK; - } - - @Override - public String getName() { - return "Item Frame"; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (!this.getSide(getFacing()).isSolid()) { - this.level.useBreakOn(this); - return type; - } - } - - return 0; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - BlockEntity blockEntity = this.getLevel().getBlockEntity(this); - BlockEntityItemFrame itemFrame = (BlockEntityItemFrame) blockEntity; - if (itemFrame.getItem().getId() == Item.AIR) { - Item itemToFrame = item.clone(); - if (player != null && player.isSurvival()) { - item.setCount(item.getCount() - 1); - player.getInventory().setItemInHand(item); - } - itemToFrame.setCount(1); - itemFrame.setItem(itemToFrame); - this.getLevel().addSound(new ItemFrameItemAddedSound(this)); - } else { - itemFrame.setItemRotation((itemFrame.getItemRotation() + 1) % 8); - this.getLevel().addSound(new ItemFrameItemRotated(this)); - } - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (face.getIndex() > 1 && target.isSolid() && (!block.isSolid() || block.canBeReplaced())) { - this.setDamage(FACING[face.getIndex()]); - this.getLevel().setBlock(block, this, true, true); - CompoundTag nbt = new CompoundTag() - .putString("id", BlockEntity.ITEM_FRAME) - .putInt("x", (int) block.x) - .putInt("y", (int) block.y) - .putInt("z", (int) block.z) - .putByte("ItemRotation", 0) - .putFloat("ItemDropChance", 1.0f); - if (item.hasCustomBlockData()) { - for (Tag aTag : item.getCustomBlockData().getAllTags()) { - nbt.put(aTag.getName(), aTag); - } - } - BlockEntity.createBlockEntity(BlockEntity.ITEM_FRAME, this.getChunk(), nbt); - this.getLevel().addSound(new ItemFramePlacedSound(this)); - return true; - } - return false; - } - - @Override - public boolean onBreak(Item item) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - this.getLevel().addSound(new ItemFrameRemovedSound(this)); - return true; - } - - @Override - public Item[] getDrops(Item item) { - BlockEntity blockEntity = this.getLevel().getBlockEntity(this); - BlockEntityItemFrame itemFrame = (BlockEntityItemFrame) blockEntity; - if (itemFrame != null && ThreadLocalRandom.current().nextFloat() <= itemFrame.getItemDropChance()) { - return new Item[]{ - toItem(), itemFrame.getItem().clone() - }; - } else { - return new Item[]{ - toItem() - }; - } - } - - @Override - public Item toItem() { - return new ItemItemFrame(); - } - - @Override - public boolean canPassThrough() { - return true; - } - - @Override - public boolean hasComparatorInputOverride() { - return true; - } - - @Override - public int getComparatorInputOverride() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityItemFrame) { - return ((BlockEntityItemFrame) blockEntity).getAnalogOutput(); - } - - return super.getComparatorInputOverride(); - } - - public BlockFace getFacing() { - switch (this.getDamage() & FACING_BITMASK) { - case 0: - return BlockFace.WEST; - case 1: - return BlockFace.EAST; - case 2: - return BlockFace.NORTH; - case 3: - return BlockFace.SOUTH; - } - - return null; - } - - @Override - public double getHardness() { - return 0.25; - } - - @Override - public boolean isSolid() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockJukebox.java b/src/main/java/cn/nukkit/block/BlockJukebox.java deleted file mode 100644 index 322348900..000000000 --- a/src/main/java/cn/nukkit/block/BlockJukebox.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityJukebox; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemRecord; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.BlockColor; - -/** - * Created by CreeperFace on 7.8.2017. - */ -public class BlockJukebox extends BlockSolid { - - @Override - public String getName() { - return "Jukebox"; - } - - @Override - public int getId() { - return JUKEBOX; - } - - @Override - public double getHardness() { - return 0.8; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public boolean onActivate(Item item, Player player) { - BlockEntity blockEntity = this.getLevel().getBlockEntity(this); - if (!(blockEntity instanceof BlockEntityJukebox)) { - blockEntity = this.createBlockEntity(); - } - - BlockEntityJukebox jukebox = (BlockEntityJukebox) blockEntity; - if (jukebox.getRecordItem().getId() != 0) { - jukebox.dropItem(); - } else if (item instanceof ItemRecord) { - jukebox.setRecordItem(item); - jukebox.play(); - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - - return false; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (super.place(item, block, target, face, fx, fy, fz, player)) { - createBlockEntity(); - return true; - } - - return false; - } - - /*@Override // Replaced with BlockEntityJukebox#onBreak - public boolean onBreak(Item item) { - if (super.onBreak(item)) { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityJukebox) { - ((BlockEntityJukebox) blockEntity).dropItem(); - } - return true; - } - - return false; - }*/ - - private BlockEntity createBlockEntity() { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.JUKEBOX) - .putInt("x", getFloorX()) - .putInt("y", getFloorY()) - .putInt("z", getFloorZ()); - - return BlockEntity.createBlockEntity(BlockEntity.JUKEBOX, this.level.getChunk(getFloorX() >> 4, getFloorZ() >> 4), nbt); - } - - @Override - public BlockColor getColor() { - return BlockColor.DIRT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockLadder.java b/src/main/java/cn/nukkit/block/BlockLadder.java deleted file mode 100644 index d7fc2a8f1..000000000 --- a/src/main/java/cn/nukkit/block/BlockLadder.java +++ /dev/null @@ -1,165 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemLadder; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * Created on 2015/12/8 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockLadder extends BlockTransparentMeta implements Faceable { - - private static final int[] faces = { - 0, //never use - 1, //never use - 3, - 2, - 5, - 4 - }; - - public BlockLadder() { - this(0); - } - - public BlockLadder(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Ladder"; - } - - @Override - public int getId() { - return LADDER; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public boolean canBeClimbed() { - return true; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - public double getHardness() { - return 0.4; - } - - @Override - public double getResistance() { - return 2; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - - double f = 0.1875; - - if (this.getDamage() == 2) { - return new AxisAlignedBB( - this.x, - this.y, - this.z + 1 - f, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } else if (this.getDamage() == 3) { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + f - ); - } else if (this.getDamage() == 4) { - return new AxisAlignedBB( - this.x + 1 - f, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } else if (this.getDamage() == 5) { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + f, - this.y + 1, - this.z + 1 - ); - } - return null; - } - - @Override - protected AxisAlignedBB recalculateCollisionBoundingBox() { - return super.recalculateBoundingBox(); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (!target.isTransparent()) { - if (face.getIndex() >= 2 && face.getIndex() <= 5) { - this.setDamage(face.getIndex()); - this.getLevel().setBlock(block, this, true, true); - return true; - } - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (!this.getSide(BlockFace.fromIndex(faces[this.getDamage()])).isSolid()) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - new ItemLadder(0, 1) - }; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockLapis.java b/src/main/java/cn/nukkit/block/BlockLapis.java deleted file mode 100644 index a7d24808f..000000000 --- a/src/main/java/cn/nukkit/block/BlockLapis.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockLapis extends BlockSolid { - - @Override - public int getId() { - return LAPIS_BLOCK; - } - - @Override - public String getName() { - return "Lapis Lazuli Block"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_STONE) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.LAPIS_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockLava.java b/src/main/java/cn/nukkit/block/BlockLava.java deleted file mode 100644 index 2336a0165..000000000 --- a/src/main/java/cn/nukkit/block/BlockLava.java +++ /dev/null @@ -1,249 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityPrimedTNT; -import cn.nukkit.event.block.BlockIgniteEvent; -import cn.nukkit.event.entity.EntityCombustByBlockEvent; -import cn.nukkit.event.entity.EntityDamageByBlockEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.item.Item; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockLava extends BlockLiquid { - - public BlockLava() { - this(0); - } - - public BlockLava(int meta) { - super(meta); - } - - @Override - public int getId() { - return LAVA; - } - - @Override - public int getLightLevel() { - return 15; - } - - @Override - public String getName() { - return "Lava"; - } - - @Override - public void onEntityCollide(Entity entity) { - entity.highestPosition -= (entity.highestPosition - entity.y) * 0.5; - - // Always setting the duration to 15 seconds? TODO - EntityCombustByBlockEvent ev = new EntityCombustByBlockEvent(this, entity, 15); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled() - // Making sure the entity is actually alive and not invulnerable - && entity.isAlive() - && entity.noDamageTicks == 0) { - entity.setOnFire(ev.getDuration()); - } - - if (!entity.hasEffect(Effect.FIRE_RESISTANCE)) { - entity.attack(new EntityDamageByBlockEvent(this, entity, DamageCause.LAVA, 4)); - } - - super.onEntityCollide(entity); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - boolean ret = this.getLevel().setBlock(this, this, true, false); - this.getLevel().scheduleUpdate(this, this.tickRate()); - - return ret; - } - - @Override - public int onUpdate(int type) { - int result = super.onUpdate(type); - - if (type == Level.BLOCK_UPDATE_RANDOM && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK)) { - int i = Utils.random.nextInt(3); - - if (i > 0) { - for (int k = 0; k < i; ++k) { - Vector3 v = this.add(Utils.random.nextInt(3) - 1, 1, Utils.random.nextInt(3) - 1); - Block block = this.getLevel().getBlock(v); - - if (block.getId() == AIR) { - if (this.isSurroundingBlockFlammable(block)) { - BlockIgniteEvent e = new BlockIgniteEvent(block, this, null, BlockIgniteEvent.BlockIgniteCause.LAVA); - this.level.getServer().getPluginManager().callEvent(e); - - if (!e.isCancelled()) { - Block fire = Block.get(BlockID.FIRE); - this.getLevel().setBlock(v, fire, true); - this.getLevel().scheduleUpdate(fire, fire.tickRate()); - return Level.BLOCK_UPDATE_RANDOM; - } - - return 0; - } - } else if (block.isSolid()) { - return Level.BLOCK_UPDATE_RANDOM; - } - } - } else { - for (int k = 0; k < 3; ++k) { - Vector3 v = this.add(Utils.random.nextInt(3) - 1, 0, Utils.random.nextInt(3) - 1); - Block block = this.getLevel().getBlock(v); - - if (block.up().getId() == AIR && block.getBurnChance() > 0) { - BlockIgniteEvent e = new BlockIgniteEvent(block, this, null, BlockIgniteEvent.BlockIgniteCause.LAVA); - this.level.getServer().getPluginManager().callEvent(e); - - if (!e.isCancelled()) { - Block fire = Block.get(BlockID.FIRE); - this.getLevel().setBlock(v, fire, true); - this.getLevel().scheduleUpdate(fire, fire.tickRate()); - } - } - } - } - } - - return result; - } - - protected boolean isSurroundingBlockFlammable(Block block) { - for (BlockFace face : BlockFace.values()) { - if (block.getSide(face).getBurnChance() > 0) { - return true; - } - } - - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.LAVA_BLOCK_COLOR; - } - - @Override - public BlockLiquid getBlock(int meta) { - return (BlockLiquid) Block.get(LAVA, meta); - } - - @Override - public int tickRate() { - if (this.level.getDimension() == Level.DIMENSION_NETHER) { - return 10; - } - return 30; - } - - @Override - public int getFlowDecayPerBlock() { - if (this.level.getDimension() == Level.DIMENSION_NETHER) { - return 1; - } - return 2; - } - - @Override - protected void checkForHarden() { - Block colliding = null; - for (int side = 1; side < 6; ++side) { //don't check downwards side - Block blockSide = this.getSide(BlockFace.fromIndex(side)); - if (blockSide instanceof BlockWater) { - colliding = blockSide; - break; - } - } - if (colliding != null) { - if (this.getDamage() == 0) { - this.liquidCollide(colliding, Block.get(OBSIDIAN)); - } else if (this.getDamage() <= 4) { - this.liquidCollide(colliding, Block.get(COBBLESTONE)); - } - } - } - - @Override - protected void flowIntoBlock(Block block, int newFlowDecay) { - if (block instanceof BlockWater) { - ((BlockLiquid) block).liquidCollide(this, Block.get(STONE)); - } else { - super.flowIntoBlock(block, newFlowDecay); - } - } - - @Override - public void addVelocityToEntity(Entity entity, Vector3 vector) { - if (!(entity instanceof EntityPrimedTNT)) { - super.addVelocityToEntity(entity, vector); - } - } - - @Override - protected boolean[] getOptimalFlowDirections() { - int[] flowCost = new int[]{ - 1000, - 1000, - 1000, - 1000 - }; - int maxCost = 4 / this.getFlowDecayPerBlock(); - for (int j = 0; j < 4; ++j) { - int x = (int) this.x; - int y = (int) this.y; - int z = (int) this.z; - if (j == 0) { - --x; - } else if (j == 1) { - ++x; - } else if (j == 2) { - --z; - } else { - ++z; - } - Block block = this.level.getBlock(x, y, z); - if (!this.canFlowInto(block)) { - this.flowCostVisited.put(Level.blockHash(x, y, z), BLOCKED); - } else if (this.level.getBlock(x, y - 1, z).canBeFlowedInto()) { - this.flowCostVisited.put(Level.blockHash(x, y, z), CAN_FLOW_DOWN); - flowCost[j] = maxCost = 0; - } else if (maxCost > 0) { - this.flowCostVisited.put(Level.blockHash(x, y, z), CAN_FLOW); - flowCost[j] = this.calculateFlowCost(x, y, z, 1, maxCost, j ^ 0x01, j ^ 0x01); - maxCost = Math.min(maxCost, flowCost[j]); - } - } - this.flowCostVisited.clear(); - double minCost = Double.MAX_VALUE; - for (int i = 0; i < 4; i++) { - double d = flowCost[i]; - if (d < minCost) { - minCost = d; - } - } - boolean[] isOptimalFlowDirection = new boolean[4]; - for (int i = 0; i < 4; ++i) { - isOptimalFlowDirection[i] = (flowCost[i] == minCost); - } - return isOptimalFlowDirection; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockLavaStill.java b/src/main/java/cn/nukkit/block/BlockLavaStill.java deleted file mode 100644 index 355db4c76..000000000 --- a/src/main/java/cn/nukkit/block/BlockLavaStill.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.level.Level; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockLavaStill extends BlockLava { - - public BlockLavaStill() { - super(0); - } - - public BlockLavaStill(int meta) { - super(0); - } - - @Override - public int getId() { - return STILL_LAVA; - } - - @Override - public String getName() { - return "Still Lava"; - } - - @Override - public BlockLiquid getBlock(int meta) { - return (BlockLiquid) Block.get(STILL_LAVA, meta); - } - - @Override - public int onUpdate(int type) { - if (type != Level.BLOCK_UPDATE_SCHEDULED) { - return super.onUpdate(type); - } - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockLeaves.java b/src/main/java/cn/nukkit/block/BlockLeaves.java deleted file mode 100644 index fa72afa3a..000000000 --- a/src/main/java/cn/nukkit/block/BlockLeaves.java +++ /dev/null @@ -1,237 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.block.LeavesDecayEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Hash; -import cn.nukkit.utils.Utils; -import it.unimi.dsi.fastutil.longs.LongArraySet; -import it.unimi.dsi.fastutil.longs.LongSet; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockLeaves extends BlockTransparentMeta { - - public static final int OAK = 0; - public static final int SPRUCE = 1; - public static final int BIRCH = 2; - public static final int JUNGLE = 3; - - public BlockLeaves() { - this(0); - } - - public BlockLeaves(int meta) { - super(meta); - } - - @Override - public int getId() { - return LEAVES; - } - - @Override - public double getHardness() { - return 0.2; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_HOE; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Oak Leaves", - "Spruce Leaves", - "Birch Leaves", - "Jungle Leaves" - }; - return names[this.getDamage() & 0x03]; - } - - @Override - public int getBurnChance() { - return 30; - } - - @Override - public int getBurnAbility() { - return 60; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - setPersistent(true); - this.getLevel().setBlock(this, this, true); - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x3, 1); - } - - @Override - public Item[] getDrops(Item item) { - if (item.isShears()) { - return new Item[]{ - toItem() - }; - } else { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - if (this.canDropApple() && Utils.random.nextInt(200) == 0) { - return new Item[]{ - Item.get(Item.APPLE) - }; - } - if (Utils.random.nextInt(20) == 0) { - if (Utils.random.nextBoolean()) { - return new Item[]{ - Item.get(Item.STICK, 0, Utils.random.nextInt(1, 2)) - }; - } else if ((this.getDamage() & 0x03) != JUNGLE || Utils.random.nextInt(20) == 0) { - return new Item[]{ - this.getSapling() - }; - } - } - } - return new Item[0]; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_RANDOM && !isPersistent() && !isCheckDecay()) { - setCheckDecay(true); - getLevel().setBlock(this, this, false, false); - } else if (type == Level.BLOCK_UPDATE_RANDOM && isCheckDecay() && !isPersistent()) { - setDamage(getDamage() & 0x03); - - LeavesDecayEvent ev = new LeavesDecayEvent(this); - - Server.getInstance().getPluginManager().callEvent(ev); - if (ev.isCancelled() || findLog(this, new LongArraySet(), 0, 0)) { - getLevel().setBlock(this, this, false, false); - } else { - getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - private Boolean findLog(Block pos, LongSet visited, Integer distance, Integer check) { - return findLog(pos, visited, distance, check, null); - } - - private Boolean findLog(Block pos, LongSet visited, Integer distance, Integer check, BlockFace fromSide) { - ++check; - long index = Hash.hashBlock((int) pos.x, (int) pos.y, (int) pos.z); - if (visited.contains(index)) return false; - if (pos.getId() == WOOD || pos.getId() == WOOD2) return true; - if ((pos.getId() == LEAVES || pos.getId() == LEAVES2) && distance < 6) { - visited.add(index); - int down = pos.down().getId(); - if (down == WOOD || down == WOOD2) { - return true; - } - if (fromSide == null) { - //North, East, South, West - for (int side = 2; side <= 5; ++side) { - if (this.findLog(pos.getSide(BlockFace.fromIndex(side)), visited, distance + 1, check, BlockFace.fromIndex(side))) - return true; - } - } else { //No more loops - switch (fromSide) { - case NORTH: - if (this.findLog(pos.getSide(BlockFace.NORTH), visited, distance + 1, check, fromSide)) - return true; - if (this.findLog(pos.getSide(BlockFace.WEST), visited, distance + 1, check, fromSide)) - return true; - if (this.findLog(pos.getSide(BlockFace.EAST), visited, distance + 1, check, fromSide)) - return true; - break; - case SOUTH: - if (this.findLog(pos.getSide(BlockFace.SOUTH), visited, distance + 1, check, fromSide)) - return true; - if (this.findLog(pos.getSide(BlockFace.WEST), visited, distance + 1, check, fromSide)) - return true; - if (this.findLog(pos.getSide(BlockFace.EAST), visited, distance + 1, check, fromSide)) - return true; - break; - case WEST: - if (this.findLog(pos.getSide(BlockFace.NORTH), visited, distance + 1, check, fromSide)) - return true; - if (this.findLog(pos.getSide(BlockFace.SOUTH), visited, distance + 1, check, fromSide)) - return true; - if (this.findLog(pos.getSide(BlockFace.WEST), visited, distance + 1, check, fromSide)) - return true; - case EAST: - if (this.findLog(pos.getSide(BlockFace.NORTH), visited, distance + 1, check, fromSide)) - return true; - if (this.findLog(pos.getSide(BlockFace.SOUTH), visited, distance + 1, check, fromSide)) - return true; - if (this.findLog(pos.getSide(BlockFace.EAST), visited, distance + 1, check, fromSide)) - return true; - break; - } - } - } - return false; - } - - public boolean isCheckDecay() { - return (this.getDamage() & 0x08) != 0; - } - - public void setCheckDecay(boolean checkDecay) { - if (checkDecay) { - this.setDamage(this.getDamage() | 0x08); - } else { - this.setDamage(this.getDamage() & -9); - } - } - - public boolean isPersistent() { - return (this.getDamage() & 0x04) != 0; - } - - public void setPersistent(boolean persistent) { - if (persistent) { - this.setDamage(this.getDamage() | 0x04); - } else { - this.setDamage(this.getDamage() & -5); - } - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - protected boolean canDropApple() { - return (this.getDamage() & 0x03) == OAK; - } - - protected Item getSapling() { - return Item.get(BlockID.SAPLING, this.getDamage() & 0x03); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockLeaves2.java b/src/main/java/cn/nukkit/block/BlockLeaves2.java deleted file mode 100644 index bbea1c26e..000000000 --- a/src/main/java/cn/nukkit/block/BlockLeaves2.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -/** - * Created on 2015/12/1 by xtypr. - * Package cn.nukkit.block in project Nukkit. - */ -public class BlockLeaves2 extends BlockLeaves { - - public static final int ACACIA = 0; - public static final int DARK_OAK = 1; - - private static final String[] names = new String[]{ - "Acacia Leaves", - "Dark Oak Leaves" - }; - - public BlockLeaves2() { - this(0); - } - - public BlockLeaves2(int meta) { - super(meta); - } - - public String getName() { - return names[this.getDamage() & 0x01]; - } - - @Override - public int getId() { - return LEAVES2; - } - - @Override - protected boolean canDropApple() { - return (this.getDamage() & 0x01) == DARK_OAK; - } - - @Override - protected Item getSapling() { - return Item.get(BlockID.SAPLING, (this.getDamage() & 0x01) + 4); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockLever.java b/src/main/java/cn/nukkit/block/BlockLever.java deleted file mode 100644 index 8a19c76a8..000000000 --- a/src/main/java/cn/nukkit/block/BlockLever.java +++ /dev/null @@ -1,235 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.block.BlockRedstoneEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.LeverSound; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * @author Nukkit Project Team - */ -public class BlockLever extends BlockFlowable implements Faceable { - - public BlockLever() { - this(0); - } - - public BlockLever(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Lever"; - } - - @Override - public int getId() { - return LEVER; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public double getHardness() { - return 0.5d; - } - - @Override - public double getResistance() { - return 2.5d; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{toItem()}; - } - - public boolean isPowerOn() { - return (this.getDamage() & 0x08) > 0; - } - - @Override - public boolean onActivate(Item item, Player player) { - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, isPowerOn() ? 15 : 0, isPowerOn() ? 0 : 15)); - this.setDamage(this.getDamage() ^ 0x08); - - this.getLevel().setBlock(this, this, false, true); - this.getLevel().addSound(new LeverSound(this, this.isPowerOn())); - - LeverOrientation orientation = LeverOrientation.byMetadata(this.isPowerOn() ? this.getDamage() ^ 0x08 : this.getDamage()); - BlockFace face = orientation.getFacing(); - level.updateAroundRedstone(this.getLocation(), null); - this.level.updateAroundRedstone(this.getLocation().getSide(face.getOpposite()), isPowerOn() ? face : null); - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - int face = this.isPowerOn() ? this.getDamage() ^ 0x08 : this.getDamage(); - BlockFace faces = LeverOrientation.byMetadata(face).getFacing().getOpposite(); - if (!this.getSide(faces).isSolid()) { - this.level.useBreakOn(this); - } - } - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (target.isNormalBlock()) { - this.setDamage(LeverOrientation.forFacings(face, player.getHorizontalFacing()).getMetadata()); - this.getLevel().setBlock(block, this, true, true); - return true; - } - return false; - } - - @Override - public boolean onBreak(Item item) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - - if (isPowerOn()) { - BlockFace face = LeverOrientation.byMetadata(this.getDamage() ^ 0x08).getFacing(); - this.level.updateAround(this.getLocation().getSide(face.getOpposite())); - } - return true; - } - - @Override - public int getWeakPower(BlockFace side) { - return isPowerOn() ? 15 : 0; - } - - public int getStrongPower(BlockFace side) { - if (!isPowerOn()) { - return 0; - } else { - return LeverOrientation.byMetadata(this.getDamage() ^ 0x08).getFacing() == side ? 15 : 0; - } - } - - @Override - public boolean isPowerSource() { - return true; - } - - public enum LeverOrientation { - DOWN_X(0, "down_x", BlockFace.DOWN), - EAST(1, "east", BlockFace.EAST), - WEST(2, "west", BlockFace.WEST), - SOUTH(3, "south", BlockFace.SOUTH), - NORTH(4, "north", BlockFace.NORTH), - UP_Z(5, "up_z", BlockFace.UP), - UP_X(6, "up_x", BlockFace.UP), - DOWN_Z(7, "down_z", BlockFace.DOWN); - - private static final LeverOrientation[] META_LOOKUP = new LeverOrientation[values().length]; - private final int meta; - private final String name; - private final BlockFace facing; - - LeverOrientation(int meta, String name, BlockFace face) { - this.meta = meta; - this.name = name; - this.facing = face; - } - - public int getMetadata() { - return this.meta; - } - - public BlockFace getFacing() { - return this.facing; - } - - public String toString() { - return this.name; - } - - public static LeverOrientation byMetadata(int meta) { - if (meta < 0 || meta >= META_LOOKUP.length) { - meta = 0; - } - - return META_LOOKUP[meta]; - } - - public static LeverOrientation forFacings(BlockFace clickedSide, BlockFace playerDirection) { - switch (clickedSide) { - case DOWN: - switch (playerDirection.getAxis()) { - case X: - return DOWN_X; - - case Z: - return DOWN_Z; - - default: - throw new IllegalArgumentException("Invalid entityFacing " + playerDirection + " for facing " + clickedSide); - } - - case UP: - switch (playerDirection.getAxis()) { - case X: - return UP_X; - - case Z: - return UP_Z; - - default: - throw new IllegalArgumentException("Invalid entityFacing " + playerDirection + " for facing " + clickedSide); - } - - case NORTH: - return NORTH; - - case SOUTH: - return SOUTH; - - case WEST: - return WEST; - - case EAST: - return EAST; - - default: - throw new IllegalArgumentException("Invalid facing: " + clickedSide); - } - } - - public String getName() { - return this.name; - } - - static { - for (LeverOrientation face : values()) { - META_LOOKUP[face.meta] = face; - } - } - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockLiquid.java b/src/main/java/cn/nukkit/block/BlockLiquid.java deleted file mode 100644 index 8114db83f..000000000 --- a/src/main/java/cn/nukkit/block/BlockLiquid.java +++ /dev/null @@ -1,441 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.block.BlockFromToEvent; -import cn.nukkit.event.block.LiquidFlowEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.level.particle.SmokeParticle; -import cn.nukkit.level.sound.FizzSound; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import it.unimi.dsi.fastutil.longs.Long2ByteMap; -import it.unimi.dsi.fastutil.longs.Long2ByteOpenHashMap; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockLiquid extends BlockTransparentMeta { - - protected static final byte CAN_FLOW_DOWN = 1; - protected static final byte CAN_FLOW = 0; - protected static final byte BLOCKED = -1; - public int adjacentSources = 0; - protected Vector3 flowVector = null; - protected Long2ByteMap flowCostVisited = new Long2ByteOpenHashMap(); - - protected BlockLiquid(int meta) { - super(meta); - } - - @Override - public boolean canBeFlowedInto() { - return true; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return null; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public boolean canBeReplaced() { - return true; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public AxisAlignedBB getBoundingBox() { - return null; - } - - @Override - protected AxisAlignedBB recalculateCollisionBoundingBox() { - return new AxisAlignedBB(this.x, this.y, this.z, this.x + 1, this.y + 0.9, this.z + 1); - } - - public float getFluidHeightPercent() { - float d = (float) this.getDamage(); - if (d >= 8) { - d = 0; - } - - return (d + 1) / 9f; - } - - protected int getFlowDecay(Block block) { - if (block.getId() != this.getId()) { - return -1; - } - return block.getDamage(); - } - - protected int getEffectiveFlowDecay(Block block) { - if (block.getId() != this.getId()) { - return -1; - } - int decay = block.getDamage(); - if (decay >= 8) { - decay = 0; - } - return decay; - } - - public void clearCaches() { - this.flowVector = null; - this.flowCostVisited.clear(); - } - - public Vector3 getFlowVector() { - if (this.flowVector != null) { - return this.flowVector; - } - Vector3 vector = new Vector3(0, 0, 0); - int decay = this.getEffectiveFlowDecay(this); - for (int j = 0; j < 4; ++j) { - int x = (int) this.x; - int y = (int) this.y; - int z = (int) this.z; - switch (j) { - case 0: - --x; - break; - case 1: - x++; - break; - case 2: - z--; - break; - default: - z++; - } - Block sideBlock = this.level.getBlock(x, y, z); - int blockDecay = this.getEffectiveFlowDecay(sideBlock); - if (blockDecay < 0) { - if (!sideBlock.canBeFlowedInto()) { - continue; - } - blockDecay = this.getEffectiveFlowDecay(this.level.getBlock(x, y - 1, z)); - if (blockDecay >= 0) { - int realDecay = blockDecay - (decay - 8); - vector.x += (sideBlock.x - this.x) * realDecay; - vector.y += (sideBlock.y - this.y) * realDecay; - vector.z += (sideBlock.z - this.z) * realDecay; - } - } else { - int realDecay = blockDecay - decay; - vector.x += (sideBlock.x - this.x) * realDecay; - vector.y += (sideBlock.y - this.y) * realDecay; - vector.z += (sideBlock.z - this.z) * realDecay; - } - } - if (this.getDamage() >= 8) { - if (!this.canFlowInto(this.level.getBlock((int) this.x, (int) this.y, (int) this.z - 1)) || - !this.canFlowInto(this.level.getBlock((int) this.x, (int) this.y, (int) this.z + 1)) || - !this.canFlowInto(this.level.getBlock((int) this.x - 1, (int) this.y, (int) this.z)) || - !this.canFlowInto(this.level.getBlock((int) this.x + 1, (int) this.y, (int) this.z)) || - !this.canFlowInto(this.level.getBlock((int) this.x, (int) this.y + 1, (int) this.z - 1)) || - !this.canFlowInto(this.level.getBlock((int) this.x, (int) this.y + 1, (int) this.z + 1)) || - !this.canFlowInto(this.level.getBlock((int) this.x - 1, (int) this.y + 1, (int) this.z)) || - !this.canFlowInto(this.level.getBlock((int) this.x + 1, (int) this.y + 1, (int) this.z))) { - vector = vector.normalize().add(0, -6, 0); - } - } - return this.flowVector = vector.normalize(); - } - - @Override - public void addVelocityToEntity(Entity entity, Vector3 vector) { - if (entity.canBeMovedByCurrents()) { - Vector3 flow = this.getFlowVector(); - vector.x += flow.x; - vector.y += flow.y; - vector.z += flow.z; - } - } - - public int getFlowDecayPerBlock() { - return 1; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - this.checkForHarden(); - this.level.scheduleUpdate(this, this.tickRate()); - return 0; - } else if (type == Level.BLOCK_UPDATE_SCHEDULED) { - int decay = this.getFlowDecay(this); - int multiplier = this.getFlowDecayPerBlock(); - if (decay > 0) { - int smallestFlowDecay = -100; - this.adjacentSources = 0; - smallestFlowDecay = this.getSmallestFlowDecay(this.level.getBlock((int) this.x, (int) this.y, (int) this.z - 1), smallestFlowDecay); - smallestFlowDecay = this.getSmallestFlowDecay(this.level.getBlock((int) this.x, (int) this.y, (int) this.z + 1), smallestFlowDecay); - smallestFlowDecay = this.getSmallestFlowDecay(this.level.getBlock((int) this.x - 1, (int) this.y, (int) this.z), smallestFlowDecay); - smallestFlowDecay = this.getSmallestFlowDecay(this.level.getBlock((int) this.x + 1, (int) this.y, (int) this.z), smallestFlowDecay); - int newDecay = smallestFlowDecay + multiplier; - if (newDecay >= 8 || smallestFlowDecay < 0) { - newDecay = -1; - } - int topFlowDecay = this.getFlowDecay(this.level.getBlock((int) this.x, (int) this.y + 1, (int) this.z)); - if (topFlowDecay >= 0) { - newDecay = topFlowDecay | 0x08; - } - if (this.adjacentSources >= 2 && this instanceof BlockWater) { - Block bottomBlock = this.level.getBlock((int) this.x, (int) this.y - 1, (int) this.z); - if (bottomBlock.isSolid()) { - newDecay = 0; - } else if (bottomBlock instanceof BlockWater && bottomBlock.getDamage() == 0) { - newDecay = 0; - } - } - if (newDecay != decay) { - decay = newDecay; - boolean decayed = decay < 0; - Block to; - if (decayed) { - to = Block.get(BlockID.AIR); - } else { - to = getBlock(decay); - } - BlockFromToEvent event = new BlockFromToEvent(this, to); - level.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.level.setBlock(this, event.getTo(), true, true); - if (!decayed) { - this.level.scheduleUpdate(this, this.tickRate()); - } - } - } - } - if (decay >= 0) { - Block bottomBlock = this.level.getBlock((int) this.x, (int) this.y - 1, (int) this.z); - this.flowIntoBlock(bottomBlock, decay | 0x08); - if (decay == 0 || !bottomBlock.canBeFlowedInto()) { - int adjacentDecay; - if (decay >= 8) { - adjacentDecay = 1; - } else { - adjacentDecay = decay + multiplier; - } - if (adjacentDecay < 8) { - boolean[] flags = this.getOptimalFlowDirections(); - if (flags[0]) { - this.flowIntoBlock(this.level.getBlock((int) this.x - 1, (int) this.y, (int) this.z), adjacentDecay); - } - if (flags[1]) { - this.flowIntoBlock(this.level.getBlock((int) this.x + 1, (int) this.y, (int) this.z), adjacentDecay); - } - if (flags[2]) { - this.flowIntoBlock(this.level.getBlock((int) this.x, (int) this.y, (int) this.z - 1), adjacentDecay); - } - if (flags[3]) { - this.flowIntoBlock(this.level.getBlock((int) this.x, (int) this.y, (int) this.z + 1), adjacentDecay); - } - } - } - this.checkForHarden(); - } - } - return 0; - } - - protected void flowIntoBlock(Block block, int newFlowDecay) { - if (this.canFlowInto(block) && !(block instanceof BlockLiquid)) { - LiquidFlowEvent event = new LiquidFlowEvent(block, this, newFlowDecay); - level.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - if (block.getId() > 0) { - this.level.useBreakOn(block, block.getId() == COBWEB ? Item.get(Item.WOODEN_SWORD) : null); - } - this.level.setBlock(block, getBlock(newFlowDecay), true, true); - this.level.scheduleUpdate(block, this.tickRate()); - } - } - } - - protected int calculateFlowCost(int blockX, int blockY, int blockZ, int accumulatedCost, int maxCost, int originOpposite, int lastOpposite) { - int cost = 1000; - for (int j = 0; j < 4; ++j) { - if (j == originOpposite || j == lastOpposite) { - continue; - } - int x = blockX; - int z = blockZ; - if (j == 0) { - --x; - } else if (j == 1) { - ++x; - } else if (j == 2) { - --z; - } else { - ++z; - } - long hash = Level.blockHash(x, blockY, z); - if (!this.flowCostVisited.containsKey(hash)) { - Block blockSide = this.level.getBlock(x, blockY, z); - if (!this.canFlowInto(blockSide)) { - this.flowCostVisited.put(hash, BLOCKED); - } else if (this.level.getBlock(x, blockY - 1, z).canBeFlowedInto()) { - this.flowCostVisited.put(hash, CAN_FLOW_DOWN); - } else { - this.flowCostVisited.put(hash, CAN_FLOW); - } - } - byte status = this.flowCostVisited.get(hash); - if (status == BLOCKED) { - continue; - } else if (status == CAN_FLOW_DOWN) { - return accumulatedCost; - } - if (accumulatedCost >= maxCost) { - continue; - } - int realCost = this.calculateFlowCost(x, blockY, z, accumulatedCost + 1, maxCost, originOpposite, j ^ 0x01); - if (realCost < cost) { - cost = realCost; - } - } - return cost; - } - - @Override - public double getHardness() { - return 100d; - } - - @Override - public double getResistance() { - return 500; - } - - protected boolean[] getOptimalFlowDirections() { - int[] flowCost = new int[]{ - 1000, - 1000, - 1000, - 1000 - }; - int maxCost = 4; - for (int j = 0; j < 4; ++j) { - int x = (int) this.x; - int y = (int) this.y; - int z = (int) this.z; - if (j == 0) { - --x; - } else if (j == 1) { - ++x; - } else if (j == 2) { - --z; - } else { - ++z; - } - Block block = this.level.getBlock(x, y, z); - if (!this.canFlowInto(block)) { - this.flowCostVisited.put(Level.blockHash(x, y, z), BLOCKED); - } else if (this.level.getBlock(x, y - 1, z).canBeFlowedInto()) { - this.flowCostVisited.put(Level.blockHash(x, y, z), CAN_FLOW_DOWN); - flowCost[j] = maxCost = 0; - } else if (maxCost > 0) { - this.flowCostVisited.put(Level.blockHash(x, y, z), CAN_FLOW); - flowCost[j] = this.calculateFlowCost(x, y, z, 1, maxCost, j ^ 0x01, j ^ 0x01); - maxCost = Math.min(maxCost, flowCost[j]); - } - } - this.flowCostVisited.clear(); - double minCost = Double.MAX_VALUE; - for (int i = 0; i < 4; i++) { - double d = flowCost[i]; - if (d < minCost) { - minCost = d; - } - } - boolean[] isOptimalFlowDirection = new boolean[4]; - for (int i = 0; i < 4; ++i) { - isOptimalFlowDirection[i] = (flowCost[i] == minCost); - } - return isOptimalFlowDirection; - } - - private int getSmallestFlowDecay(Block block, int decay) { - int blockDecay = this.getFlowDecay(block); - if (blockDecay < 0) { - return decay; - } else if (blockDecay == 0) { - ++this.adjacentSources; - } else if (blockDecay >= 8) { - blockDecay = 0; - } - return (decay >= 0 && blockDecay >= decay) ? decay : blockDecay; - } - - protected void checkForHarden() { - } - - protected void triggerLavaMixEffects(Vector3 pos) { - this.getLevel().addSound(new FizzSound(pos.add(0.5, 0.5, 0.5), 2.6F + (ThreadLocalRandom.current().nextFloat() - ThreadLocalRandom.current().nextFloat()) * 0.8F)); - this.getLevel().addParticle(new SmokeParticle(pos.add(Math.random(), 1.2, Math.random())), null, 8); - } - - public abstract BlockLiquid getBlock(int meta); - - @Override - public boolean canPassThrough() { - return true; - } - - @Override - public void onEntityCollide(Entity entity) { - entity.resetFallDistance(); - } - - protected boolean liquidCollide(Block cause, Block result) { - BlockFromToEvent event = new BlockFromToEvent(this, result); - this.level.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return false; - } - this.level.setBlock(this, event.getTo(), true, true); - this.getLevel().addLevelSoundEvent(this.add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_FIZZ); - return true; - } - - protected boolean canFlowInto(Block block) { - return block.canBeFlowedInto() && !(block instanceof BlockLiquid && block.getDamage() == 0); - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(BlockID.AIR)); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockMagma.java b/src/main/java/cn/nukkit/block/BlockMagma.java deleted file mode 100644 index ef5f143bd..000000000 --- a/src/main/java/cn/nukkit/block/BlockMagma.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageByBlockEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.inventory.PlayerInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.BlockColor; - -public class BlockMagma extends BlockSolid { - - @Override - public int getId() { - return MAGMA; - } - - @Override - public String getName() { - return "Magma Block"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getLightLevel() { - return 3; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public void onEntityCollide(Entity entity) { - if (!entity.hasEffect(Effect.FIRE_RESISTANCE)) { - if (entity instanceof Player) { - Player p = (Player) entity; - PlayerInventory inv = p.getInventory(); - if (inv == null || inv.getBootsFast().hasEnchantment(Enchantment.ID_FROST_WALKER)) { - return; - } - if (!p.isCreative() && !p.isSpectator() && !p.isSneaking()) { - entity.attack(new EntityDamageByBlockEvent(this, entity, EntityDamageEvent.DamageCause.MAGMA, 1)); - } - } else { - entity.attack(new EntityDamageByBlockEvent(this, entity, EntityDamageEvent.DamageCause.MAGMA, 1)); - } - } - } - - @Override - public BlockColor getColor() { - return BlockColor.NETHERRACK_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean hasEntityCollision() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockMelon.java b/src/main/java/cn/nukkit/block/BlockMelon.java deleted file mode 100644 index a5cb65f6d..000000000 --- a/src/main/java/cn/nukkit/block/BlockMelon.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemMelon; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/12/11 by Pub4Game. - * Package cn.nukkit.block in project Nukkit . - */ - -public class BlockMelon extends BlockSolid { - - @Override - public int getId() { - return MELON_BLOCK; - } - - public String getName() { - return "Melon Block"; - } - - public double getHardness() { - return 1; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public Item[] getDrops(Item item) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - - int count = 3 + Utils.random.nextInt(5); - - Enchantment fortune = item.getEnchantment(Enchantment.ID_FORTUNE_DIGGING); - if (fortune != null && fortune.getLevel() >= 1) { - count += Utils.random.nextInt(fortune.getLevel() + 1); - } - - return new Item[]{ - new ItemMelon(0, Math.min(9, count)) - }; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public BlockColor getColor() { - return BlockColor.LIME_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public boolean breakWhenPushed() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockMeta.java b/src/main/java/cn/nukkit/block/BlockMeta.java deleted file mode 100644 index 3f6e1529e..000000000 --- a/src/main/java/cn/nukkit/block/BlockMeta.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.block; - -public abstract class BlockMeta extends Block { - - private int meta; - - protected BlockMeta(int meta) { - this.meta = meta; - } - - @Override - public int getFullId() { - return (getId() << 4) + meta; - } - - @Override - public final int getDamage() { - return this.meta; - } - - @Override - public void setDamage(int meta) { - this.meta = meta; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockMobSpawner.java b/src/main/java/cn/nukkit/block/BlockMobSpawner.java deleted file mode 100644 index d8ab09c16..000000000 --- a/src/main/java/cn/nukkit/block/BlockMobSpawner.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; - -/** - * Created by Pub4Game on 27.12.2015. - */ -public class BlockMobSpawner extends BlockSolid { - - @Override - public String getName() { - return "Monster Spawner"; - } - - @Override - public int getId() { - return MONSTER_SPAWNER; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 25; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (!super.place(item, block, target, face, fx, fy, fz, player)) return false; - BlockEntity.createBlockEntity(BlockEntity.MOB_SPAWNER, this.getChunk(), BlockEntity.getDefaultCompound(this, BlockEntity.MOB_SPAWNER)); - return true; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public int getLightLevel() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockMonsterEgg.java b/src/main/java/cn/nukkit/block/BlockMonsterEgg.java deleted file mode 100644 index 20f5d842c..000000000 --- a/src/main/java/cn/nukkit/block/BlockMonsterEgg.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.mob.EntitySilverfish; -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.utils.Utils; - -public class BlockMonsterEgg extends BlockSolidMeta { - - public static final int STONE = 0; - public static final int COBBLESTONE = 1; - public static final int STONE_BRICK = 2; - public static final int MOSSY_BRICK = 3; - public static final int CRACKED_BRICK = 4; - public static final int CHISELED_BRICK = 5; - - private static final String[] NAMES = new String[]{ - "Stone", - "Cobblestone", - "Stone Brick", - "Mossy Stone Brick", - "Cracked Stone Brick", - "Chiseled Stone Brick" - }; - - public BlockMonsterEgg() { - this(0); - } - - public BlockMonsterEgg(int meta) { - super(meta); - } - - @Override - public int getId() { - return MONSTER_EGG; - } - - @Override - public double getHardness() { - return 0.75; - } - - @Override - public double getResistance() { - return 3.75; - } - - @Override - public String getName() { - return NAMES[this.getDamage() > 5 ? 0 : this.getDamage()] + " Monster Egg"; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public boolean onBreak(Item item) { - if (Server.getInstance().mobsFromBlocks) { - if (Utils.rand(1, 5) == 1 && !item.hasEnchantment(Enchantment.ID_SILK_TOUCH) && this.getLevel().getBlockLightAt((int) this.x, (int) this.y, (int) this.z) < 12) { - EntitySilverfish entity = (EntitySilverfish) Entity.createEntity("Silverfish", this.add(0.5, 0, 0.5)); - entity.spawnToAll(); - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = entity.getId(); - pk.event = EntityEventPacket.SILVERFISH_SPAWN_ANIMATION; - entity.getLevel().addChunkPacket(entity.getChunkX() >> 2, entity.getChunkZ() >> 2, pk); - } - } - return this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockMossStone.java b/src/main/java/cn/nukkit/block/BlockMossStone.java deleted file mode 100644 index 9ba866930..000000000 --- a/src/main/java/cn/nukkit/block/BlockMossStone.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockMossStone extends BlockSolid { - - @Override - public String getName() { - return "Moss Stone"; - } - - @Override - public int getId() { - return MOSS_STONE; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockMushroom.java b/src/main/java/cn/nukkit/block/BlockMushroom.java deleted file mode 100644 index 820fd7be5..000000000 --- a/src/main/java/cn/nukkit/block/BlockMushroom.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.generator.object.mushroom.BigMushroom; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -import java.util.concurrent.ThreadLocalRandom; - -public abstract class BlockMushroom extends BlockFlowable { - - public BlockMushroom() { - this(0); - } - - public BlockMushroom(int meta) { - super(0); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (!canStay()) { - getLevel().useBreakOn(this); - - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (canStay()) { - getLevel().setBlock(block, this, true, true); - return true; - } - return false; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.DYE && item.getDamage() == DyeColor.WHITE.getDyeData()) { - if (player != null && !player.isCreative()) { - item.count--; - } - - if (ThreadLocalRandom.current().nextFloat() < 0.4) { - this.grow(); - } - - this.level.addParticle(new BoneMealParticle(this)); - return true; - } - return false; - } - - public boolean grow() { - this.level.setBlock(this, Block.get(BlockID.AIR), true, false); - - BigMushroom generator = new BigMushroom(getType()); - - if (generator.generate(this.level, new NukkitRandom(), this)) { - return true; - } else { - this.level.setBlock(this, this, true, false); - return false; - } - } - - public boolean canStay() { - Block block = this.down(); - return block.getId() == MYCELIUM || block.getId() == PODZOL || (!block.isTransparent() && this.level.getFullLight(this) < 13); - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - protected abstract int getType(); -} diff --git a/src/main/java/cn/nukkit/block/BlockMushroomBrown.java b/src/main/java/cn/nukkit/block/BlockMushroomBrown.java deleted file mode 100644 index 8ce4f00e3..000000000 --- a/src/main/java/cn/nukkit/block/BlockMushroomBrown.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.block; - -/** - * @author Nukkit Project Team - */ -public class BlockMushroomBrown extends BlockMushroom { - - public BlockMushroomBrown() { - super(); - } - - public BlockMushroomBrown(int meta) { - super(0); - } - - @Override - public String getName() { - return "Brown Mushroom"; - } - - @Override - public int getId() { - return BROWN_MUSHROOM; - } - - @Override - public int getLightLevel() { - return 1; - } - - @Override - protected int getType() { - return 0; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockMushroomRed.java b/src/main/java/cn/nukkit/block/BlockMushroomRed.java deleted file mode 100644 index 9f27cc06c..000000000 --- a/src/main/java/cn/nukkit/block/BlockMushroomRed.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.block; - -/** - * Created by Pub4Game on 03.01.2015. - */ -public class BlockMushroomRed extends BlockMushroom { - - public BlockMushroomRed() { - super(); - } - - public BlockMushroomRed(int meta) { - super(0); - } - - @Override - public String getName() { - return "Red Mushroom"; - } - - @Override - public int getId() { - return RED_MUSHROOM; - } - - @Override - protected int getType() { - return 1; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockMycelium.java b/src/main/java/cn/nukkit/block/BlockMycelium.java deleted file mode 100644 index f29b8fe18..000000000 --- a/src/main/java/cn/nukkit/block/BlockMycelium.java +++ /dev/null @@ -1,102 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.block.BlockSpreadEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.level.Sound; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created by Pub4Game on 03.01.2016. - */ -public class BlockMycelium extends BlockSolid { - - @Override - public String getName() { - return "Mycelium"; - } - - @Override - public int getId() { - return MYCELIUM; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - public double getHardness() { - return 0.6; - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - new ItemBlock(Block.get(BlockID.DIRT)) - }; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_RANDOM) { - x = Utils.rand((int) x - 1, (int) x + 1); - y = Utils.rand((int) y - 1, (int) y + 1); - z = Utils.rand((int) z - 1, (int) z + 1); - Block block = this.getLevel().getBlock(new Vector3(x, y, z)); - if (block.getId() == Block.DIRT && block.getDamage() == 0) { - if (block.up() instanceof BlockAir) { - BlockSpreadEvent ev = new BlockSpreadEvent(block, this, Block.get(MYCELIUM)); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.getLevel().setBlock(block, ev.getNewState()); - } - } - } - } - return 0; - } - - @Override - public BlockColor getColor() { - return BlockColor.PURPLE_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.isShovel()) { - Block up = this.up(); - if (up instanceof BlockAir || up instanceof BlockFlowable) { - item.useOn(this); - this.getLevel().setBlock(this, Block.get(GRASS_PATH)); - if (player != null) { - player.getLevel().addSoundToViewers(player, Sound.STEP_GRASS); - } - return true; - } - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockNetherBrick.java b/src/main/java/cn/nukkit/block/BlockNetherBrick.java deleted file mode 100644 index 06e3bb942..000000000 --- a/src/main/java/cn/nukkit/block/BlockNetherBrick.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/7 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockNetherBrick extends BlockSolid { - - @Override - public String getName() { - return "Nether Bricks"; - } - - @Override - public int getId() { - return NETHER_BRICKS; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.NETHERRACK_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockNetherPortal.java b/src/main/java/cn/nukkit/block/BlockNetherPortal.java deleted file mode 100644 index 25e5d1fa1..000000000 --- a/src/main/java/cn/nukkit/block/BlockNetherPortal.java +++ /dev/null @@ -1,372 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockFace.Axis; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * Created on 2016/1/5 by xtypr. - * Package cn.nukkit.block in project nukkit . - * The name NetherPortalBlock comes from minecraft wiki. - */ -public class BlockNetherPortal extends BlockFlowable implements Faceable { - - public BlockNetherPortal() { - this(0); - } - - public BlockNetherPortal(int meta) { - super(0); - } - - @Override - public String getName() { - return "Nether Portal Block"; - } - - @Override - public int getId() { - return NETHER_PORTAL; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public int getLightLevel() { - return 11; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(BlockID.AIR)); - } - - @Override - public boolean canBeFlowedInto() { - return false; - } - - @Override - public boolean onBreak(Item item) { - boolean result = super.onBreak(item); - for (BlockFace face : BlockFace.values()) { - Block b = this.getSide(face); - if (b != null) { - if (b instanceof BlockNetherPortal) { - result &= b.onBreak(item); - } - } - } - return result; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - - public static boolean trySpawnPortal(Level level, Vector3 pos) { - return trySpawnPortal(level, pos, false); - } - - public static boolean trySpawnPortal(Level level, Vector3 pos, boolean force) { - PortalBuilder builder = new PortalBuilder(level, pos, Axis.X, force); - - if (builder.isValid() && builder.portalBlockCount == 0) { - builder.placePortalBlocks(); - return true; - } else { - builder = new PortalBuilder(level, pos, Axis.Z, force); - - if (builder.isValid() && builder.portalBlockCount == 0) { - builder.placePortalBlocks(); - return true; - } else { - return false; - } - } - } - - public static class PortalBuilder { - - private final Level level; - private final Axis axis; - private final BlockFace rightDir; - private final BlockFace leftDir; - private int portalBlockCount; - private Vector3 bottomLeft; - private int height; - private int width; - - private boolean force; - - public PortalBuilder(Level level, Vector3 pos, Axis axis, boolean force) { - this.level = level; - this.axis = axis; - this.force = force; - - if (axis == Axis.X) { - this.leftDir = BlockFace.EAST; - this.rightDir = BlockFace.WEST; - } else { - this.leftDir = BlockFace.NORTH; - this.rightDir = BlockFace.SOUTH; - } - - - for (Vector3 blockpos = pos; pos.getY() > blockpos.getY() - 21 && pos.getY() > 0 && this.isEmptyBlock(getBlockId(pos.down())); pos = pos.down()) { - } - - int i = this.getDistanceUntilEdge(pos, this.leftDir) - 1; - - if (i >= 0) { - this.bottomLeft = pos.getSide(this.leftDir, i); - this.width = this.getDistanceUntilEdge(this.bottomLeft, this.rightDir); - - if (this.width < 2 || this.width > 21) { - this.bottomLeft = null; - this.width = 0; - } - } - - if (this.bottomLeft != null) { - this.height = this.calculatePortalHeight(); - } - } - - protected int getDistanceUntilEdge(Vector3 pos, BlockFace dir) { - int i; - - for (i = 0; i < 22; ++i) { - Vector3 v = pos.getSide(dir, i); - - if (!this.isEmptyBlock(getBlockId(v)) || getBlockId(v.down()) != OBSIDIAN) { - break; - } - } - - return getBlockId(pos.getSide(dir, i)) == OBSIDIAN ? i : 0; - } - - public int getHeight() { - return this.height; - } - - public int getWidth() { - return this.width; - } - - protected int calculatePortalHeight() { - - loop: - for (this.height = 0; this.height < 21; ++this.height) { - for (int i = 0; i < this.width; ++i) { - Vector3 blockpos = this.bottomLeft.getSide(this.rightDir, i).up(this.height); - int block = getBlockId(blockpos); - - if (!this.isEmptyBlock(block)) { - break loop; - } - - if (block == NETHER_PORTAL) { - ++this.portalBlockCount; - } - - if (i == 0) { - block = getBlockId(blockpos.getSide(this.leftDir)); - - if (block != OBSIDIAN) { - break loop; - } - } else if (i == this.width - 1) { - block = getBlockId(blockpos.getSide(this.rightDir)); - - if (block != OBSIDIAN) { - break loop; - } - } - } - } - - for (int i = 0; i < this.width; ++i) { - if (getBlockId(this.bottomLeft.getSide(this.rightDir, i).up(this.height)) != OBSIDIAN) { - this.height = 0; - break; - } - } - - if (this.height <= 21 && this.height >= 3) { - return this.height; - } else { - this.bottomLeft = null; - this.width = 0; - this.height = 0; - return 0; - } - } - - private int getBlockId(Vector3 pos) { - return this.level.getBlockIdAt(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ()); - } - - protected boolean isEmptyBlock(int id) { - return force || id == AIR || id == FIRE || id == NETHER_PORTAL; - } - - public boolean isValid() { - return this.bottomLeft != null && this.width >= 2 && this.width <= 21 && this.height >= 3 && this.height <= 21; - } - - public void placePortalBlocks() { - for (int i = 0; i < this.width; ++i) { - Vector3 blockpos = this.bottomLeft.getSide(this.rightDir, i); - - for (int j = 0; j < this.height; ++j) { - this.level.setBlock(blockpos.up(j), Block.get(NETHER_PORTAL, this.axis == Axis.X ? 1 : this.axis == Axis.Z ? 2 : 0)); - } - } - } - } - - public static Position getSafePortal(Position portal) { - Level level = portal.getLevel(); - Vector3 down = portal.down(); - while (level.getBlockIdAt(down.getFloorX(), down.getFloorY(), down.getFloorZ()) == NETHER_PORTAL) { - down = down.down(); - } - - return Position.fromObject(down.up(), portal.getLevel()); - } - - public static Position findNearestPortal(Position pos) { - Level level = pos.getLevel(); - Position found = null; - - for (int xx = -16; xx <= 16; xx++) { - for (int zz = -16; zz <= 16; zz++) { - for (int y = 0; y < 255; y++) { - int x = pos.getFloorX() + xx, z = pos.getFloorZ() + zz; - if (level.getBlockIdAt(x, y, z) == NETHER_PORTAL) { - found = new Position(x, y, z, level); - break; - } - } - } - } - - if (found == null) { - return null; - } - Vector3 up = found.up(); - int x = up.getFloorX(), y = up.getFloorY(), z = up.getFloorZ(); - int id = level.getBlockIdAt(x, y, z); - if (id != AIR && id != OBSIDIAN && id != NETHER_PORTAL) { - for (int xx = -1; xx < 4; xx++) { - for (int yy = 1; yy < 4; yy++) { - for (int zz = -1; zz < 3; zz++) { - level.setBlockAt(x + xx, y + yy, z + zz, AIR); - } - } - } - } - return found; - } - - public static void spawnPortal(Position pos) { - Level lvl = pos.level; - int x = pos.getFloorX(), y = pos.getFloorY(), z = pos.getFloorZ(); - - for (int xx = -1; xx < 4; xx++) { - for (int yy = 1; yy < 4; yy++) { - for (int zz = -1; zz < 3; zz++) { - lvl.setBlockAt(x + xx, y + yy, z + zz, AIR); - } - } - } - - lvl.setBlockAt(x + 1, y, z, OBSIDIAN); - lvl.setBlockAt(x + 2, y, z, OBSIDIAN); - - z += 1; - lvl.setBlockAt(x, y, z, OBSIDIAN); - lvl.setBlockAt(x + 1, y, z, OBSIDIAN); - lvl.setBlockAt(x + 2, y, z, OBSIDIAN); - lvl.setBlockAt(x + 3, y, z, OBSIDIAN); - - z += 1; - lvl.setBlockAt(x + 1, y, z, OBSIDIAN); - lvl.setBlockAt(x + 2, y, z, OBSIDIAN); - - z -= 1; - y += 1; - lvl.setBlockAt(x, y, z, OBSIDIAN); - lvl.setBlockAt(x + 1, y, z, NETHER_PORTAL); - lvl.setBlockAt(x + 2, y, z, NETHER_PORTAL); - lvl.setBlockAt(x + 3, y, z, OBSIDIAN); - - y += 1; - lvl.setBlockAt(x, y, z, OBSIDIAN); - lvl.setBlockAt(x + 1, y, z, NETHER_PORTAL); - lvl.setBlockAt(x + 2, y, z, NETHER_PORTAL); - lvl.setBlockAt(x + 3, y, z, OBSIDIAN); - - y += 1; - lvl.setBlockAt(x, y, z, OBSIDIAN); - lvl.setBlockAt(x + 1, y, z, NETHER_PORTAL); - lvl.setBlockAt(x + 2, y, z, NETHER_PORTAL); - lvl.setBlockAt(x + 3, y, z, OBSIDIAN); - - y += 1; - lvl.setBlockAt(x, y, z, OBSIDIAN); - lvl.setBlockAt(x + 1, y, z, OBSIDIAN); - lvl.setBlockAt(x + 2, y, z, OBSIDIAN); - lvl.setBlockAt(x + 3, y, z, OBSIDIAN); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockNetherReactor.java b/src/main/java/cn/nukkit/block/BlockNetherReactor.java deleted file mode 100644 index 541ae9763..000000000 --- a/src/main/java/cn/nukkit/block/BlockNetherReactor.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDiamond; -import cn.nukkit.item.ItemIngotIron; -import cn.nukkit.item.ItemTool; - -public class BlockNetherReactor extends BlockSolid { - - @Override - public int getId() { - return NETHER_REACTOR; - } - - @Override - public String getName() { - return "Nether Reactor Core"; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_WOODEN) { - return new Item[]{new ItemDiamond(0, 3), new ItemIngotIron(0, 6)}; - } else return new Item[0]; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockNetherWart.java b/src/main/java/cn/nukkit/block/BlockNetherWart.java deleted file mode 100644 index 5386eddc7..000000000 --- a/src/main/java/cn/nukkit/block/BlockNetherWart.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.block.BlockGrowEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemNetherWart; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created by Leonidius20 on 22.03.17. - */ -public class BlockNetherWart extends BlockFlowable { - - public BlockNetherWart() { - this(0); - } - - public BlockNetherWart(int meta) { - super(meta); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (down.getId() == SOUL_SAND) { - this.getLevel().setBlock(block, this, true, true); - return true; - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().getId() != SOUL_SAND) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if (Utils.random.nextInt(10) == 1) { - if (this.getDamage() < 0x03) { - BlockNetherWart block = (BlockNetherWart) this.clone(); - block.setDamage(block.getDamage() + 1); - BlockGrowEvent ev = new BlockGrowEvent(this, block); - Server.getInstance().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - this.getLevel().setBlock(this, ev.getNewState(), true, true); - } else { - return Level.BLOCK_UPDATE_RANDOM; - } - } - } else { - return Level.BLOCK_UPDATE_RANDOM; - } - } - - return 0; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } - - @Override - public String getName() { - return "Nether Wart Block"; - } - - @Override - public int getId() { - return NETHER_WART_BLOCK; - } - - @Override - public Item[] getDrops(Item item) { - if (this.getDamage() == 0x03) { - return new Item[]{ - new ItemNetherWart(0, 2 + (int) (Math.random() * (3))) - }; - } else { - return new Item[]{ - new ItemNetherWart() - }; - } - } - - @Override - public Item toItem() { - return new ItemNetherWart(); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockNetherWartBlock.java b/src/main/java/cn/nukkit/block/BlockNetherWartBlock.java deleted file mode 100644 index d20ed238e..000000000 --- a/src/main/java/cn/nukkit/block/BlockNetherWartBlock.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -public class BlockNetherWartBlock extends BlockSolid { - - @Override - public String getName() { - return "Nether Wart Block"; - } - - @Override - public int getId() { - return BLOCK_NETHER_WART_BLOCK; - } - - @Override - public double getResistance() { - return 1; - } - - @Override - public double getHardness() { - return 1; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - toItem() - }; - } - - @Override - public BlockColor getColor() { - return BlockColor.RED_BLOCK_COLOR; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_HOE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockNetherrack.java b/src/main/java/cn/nukkit/block/BlockNetherrack.java deleted file mode 100644 index 2043e7dd3..000000000 --- a/src/main/java/cn/nukkit/block/BlockNetherrack.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/26 by Pub4Game. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockNetherrack extends BlockSolid { - - @Override - public int getId() { - return NETHERRACK; - } - - @Override - public double getResistance() { - return 2; - } - - @Override - public double getHardness() { - return 0.4; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Netherrack"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.NETHERRACK_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockNoteblock.java b/src/main/java/cn/nukkit/block/BlockNoteblock.java deleted file mode 100644 index 2dafb6c78..000000000 --- a/src/main/java/cn/nukkit/block/BlockNoteblock.java +++ /dev/null @@ -1,296 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityMusic; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.level.Sound; -import cn.nukkit.math.BlockFace; -import cn.nukkit.network.protocol.BlockEventPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.BlockColor; - -/** - * Created by Snake1999 on 2016/1/17. - * Package cn.nukkit.block in project nukkit. - */ -public class BlockNoteblock extends BlockSolid { - - @Override - public String getName() { - return "Note Block"; - } - - @Override - public int getId() { - return NOTEBLOCK; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public double getHardness() { - return 0.8D; - } - - @Override - public double getResistance() { - return 4D; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.getLevel().setBlock(block, this, true); - this.createBlockEntity(); - return true; - } - - public int getStrength() { - BlockEntityMusic blockEntity = this.getBlockEntity(); - return blockEntity != null ? blockEntity.getPitch() : 0; - } - - public void increaseStrength() { - BlockEntityMusic blockEntity = this.getBlockEntity(); - if (blockEntity != null) { - blockEntity.changePitch(); - } - } - - public Instrument getInstrument() { - switch (this.down().getId()) { - case GOLD_BLOCK: - return Instrument.GLOCKENSPIEL; - case CLAY_BLOCK: - return Instrument.FLUTE; - case PACKED_ICE: - return Instrument.CHIME; - case WOOL: - return Instrument.GUITAR; - case BONE_BLOCK: - return Instrument.XYLOPHONE; - case IRON_BLOCK: - return Instrument.VIBRAPHONE; - case SOUL_SAND: - return Instrument.COW_BELL; - case PUMPKIN: - return Instrument.DIDGERIDOO; - case EMERALD_BLOCK: - return Instrument.SQUARE_WAVE; - case HAY_BALE: - return Instrument.BANJO; - case GLOWSTONE_BLOCK: - return Instrument.ELECTRIC_PIANO; - case LOG: - case LOG2: - case PLANKS: - case DOUBLE_WOODEN_SLAB: - case WOODEN_SLAB: - case WOOD_STAIRS: - case SPRUCE_WOOD_STAIRS: - case BIRCH_WOOD_STAIRS: - case JUNGLE_WOOD_STAIRS: - case ACACIA_WOOD_STAIRS: - case DARK_OAK_WOOD_STAIRS: - case FENCE: - case FENCE_GATE: - case FENCE_GATE_SPRUCE: - case FENCE_GATE_BIRCH: - case FENCE_GATE_JUNGLE: - case FENCE_GATE_DARK_OAK: - case FENCE_GATE_ACACIA: - case DOOR_BLOCK: - case SPRUCE_DOOR_BLOCK: - case BIRCH_DOOR_BLOCK: - case JUNGLE_DOOR_BLOCK: - case ACACIA_DOOR_BLOCK: - case DARK_OAK_DOOR_BLOCK: - case WOODEN_PRESSURE_PLATE: - case TRAPDOOR: - case SIGN_POST: - case WALL_SIGN: - case NOTEBLOCK: - case BOOKSHELF: - case CHEST: - case TRAPPED_CHEST: - case CRAFTING_TABLE: - case JUKEBOX: - case BROWN_MUSHROOM_BLOCK: - case RED_MUSHROOM_BLOCK: - case DAYLIGHT_DETECTOR: - case DAYLIGHT_DETECTOR_INVERTED: - case STANDING_BANNER: - case WALL_BANNER: - return Instrument.BASS; - case SAND: - case GRAVEL: - case CONCRETE_POWDER: - return Instrument.DRUM; - case GLASS: - case GLASS_PANEL: - case STAINED_GLASS_PANE: - case STAINED_GLASS: - case BEACON: - case SEA_LANTERN: - return Instrument.STICKS; - case STONE: - case SANDSTONE: - case RED_SANDSTONE: - case COBBLESTONE: - case MOSSY_STONE: - case BRICKS: - case STONE_BRICKS: - case NETHER_BRICK_BLOCK: - case RED_NETHER_BRICK: - case QUARTZ_BLOCK: - case DOUBLE_SLAB: - case SLAB: - case DOUBLE_RED_SANDSTONE_SLAB: - case RED_SANDSTONE_SLAB: - case COBBLE_STAIRS: - case BRICK_STAIRS: - case STONE_BRICK_STAIRS: - case NETHER_BRICKS_STAIRS: - case SANDSTONE_STAIRS: - case QUARTZ_STAIRS: - case RED_SANDSTONE_STAIRS: - case PURPUR_STAIRS: - case COBBLE_WALL: - case NETHER_BRICK_FENCE: - case BEDROCK: - case GOLD_ORE: - case IRON_ORE: - case COAL_ORE: - case LAPIS_ORE: - case DIAMOND_ORE: - case REDSTONE_ORE: - case GLOWING_REDSTONE_ORE: - case EMERALD_ORE: - case DROPPER: - case DISPENSER: - case FURNACE: - case BURNING_FURNACE: - case OBSIDIAN: - case GLOWING_OBSIDIAN: - case MONSTER_SPAWNER: - case STONE_PRESSURE_PLATE: - case NETHERRACK: - case QUARTZ_ORE: - case ENCHANTING_TABLE: - case END_PORTAL_FRAME: - case END_STONE: - case END_BRICKS: - case ENDER_CHEST: - case STAINED_TERRACOTTA: - case TERRACOTTA: - case PRISMARINE: - case COAL_BLOCK: - case PURPUR_BLOCK: - case MAGMA: - case CONCRETE: - case STONECUTTER: - case OBSERVER: - return Instrument.BASS_DRUM; - default: - return Instrument.PIANO; - } - } - - public void emitSound() { - if (this.up().getId() != AIR) return; - - Instrument instrument = this.getInstrument(); - - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_NOTE, instrument.ordinal() << 8 | this.getStrength()); - - BlockEventPacket pk = new BlockEventPacket(); - pk.x = this.getFloorX(); - pk.y = this.getFloorY(); - pk.z = this.getFloorZ(); - pk.case1 = instrument.ordinal(); - pk.case2 = this.getStrength(); - this.getLevel().addChunkPacket(this.getFloorX() >> 4, this.getFloorZ() >> 4, pk); - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player.isSneaking()) return false; - this.increaseStrength(); - this.emitSound(); - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_REDSTONE) { - BlockEntityMusic blockEntity = this.getBlockEntity(); - if (blockEntity != null) { - if (this.getLevel().isBlockPowered(this)) { - if (!blockEntity.isPowered()) { - this.emitSound(); - } - blockEntity.setPowered(true); - } else { - blockEntity.setPowered(false); - } - } - } - return super.onUpdate(type); - } - - private BlockEntityMusic getBlockEntity() { - BlockEntity blockEntity = this.getLevel().getBlockEntity(this); - if (blockEntity instanceof BlockEntityMusic) { - return (BlockEntityMusic) blockEntity; - } - return null; - } - - private BlockEntityMusic createBlockEntity() { - return (BlockEntityMusic) BlockEntity.createBlockEntity(BlockEntity.MUSIC, this.getChunk(), BlockEntity.getDefaultCompound(this, BlockEntity.MUSIC)); - } - - public enum Instrument { - PIANO(Sound.NOTE_HARP), - BASS_DRUM(Sound.NOTE_BD), - DRUM(Sound.NOTE_SNARE), - STICKS(Sound.NOTE_HAT), - BASS(Sound.NOTE_BASS), - GLOCKENSPIEL(Sound.NOTE_BELL), - FLUTE(Sound.NOTE_FLUTE), - CHIME(Sound.NOTE_CHIME), - GUITAR(Sound.NOTE_GUITAR), - XYLOPHONE(Sound.NOTE_XYLOPHONE), - VIBRAPHONE(Sound.NOTE_IRON_XYLOPHONE), - COW_BELL(Sound.NOTE_COW_BELL), - DIDGERIDOO(Sound.NOTE_DIDGERIDOO), - SQUARE_WAVE(Sound.NOTE_BIT), - BANJO(Sound.NOTE_BANJO), - ELECTRIC_PIANO(Sound.NOTE_PLING); - - private final Sound sound; - - Instrument(Sound sound) { - this.sound = sound; - } - - public Sound getSound() { - return sound; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockObserver.java b/src/main/java/cn/nukkit/block/BlockObserver.java deleted file mode 100644 index 5537b7b6a..000000000 --- a/src/main/java/cn/nukkit/block/BlockObserver.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.Faceable; - -public class BlockObserver extends BlockSolid implements Faceable { - - @Override - public int getId() { - return OBSERVER; - } - - @Override - public String getName() { - return "Observer"; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getResistance() { - return 17.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - Item.get(Item.OBSERVER, 0, 1) - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (player != null) { - if (Math.abs(player.x - this.x) < 2 && Math.abs(player.z - this.z) < 2) { - double y = player.y + player.getEyeHeight(); - if (y - this.y > 2) { - this.setDamage(BlockFace.DOWN.getIndex()); - } else if (this.y - y > 0) { - this.setDamage(BlockFace.UP.getIndex()); - } else { - this.setDamage(player.getHorizontalFacing().getIndex()); - } - } else { - this.setDamage(player.getHorizontalFacing().getIndex()); - } - } else { - this.setDamage(0); - } - this.getLevel().setBlock(block, this, true, true); - return true; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockObsidian.java b/src/main/java/cn/nukkit/block/BlockObsidian.java deleted file mode 100644 index 1ec785a6c..000000000 --- a/src/main/java/cn/nukkit/block/BlockObsidian.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockObsidian extends BlockSolid { - - @Override - public String getName() { - return "Obsidian"; - } - - @Override - public int getId() { - return OBSIDIAN; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 35; - } - - @Override - public double getResistance() { - return 6000; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_DIAMOND) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean onBreak(Item item) { - //destroy the nether portal - Block[] nearby = new Block[]{ - this.up(), this.down(), - this.north(), south(), - this.west(), this.east(), - }; - for (Block aNearby : nearby) { - if (aNearby != null) if (aNearby.getId() == NETHER_PORTAL) { - aNearby.onBreak(item); - } - } - return super.onBreak(item); - } - - @Override - public BlockColor getColor() { - return BlockColor.OBSIDIAN_BLOCK_COLOR; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockObsidianGlowing.java b/src/main/java/cn/nukkit/block/BlockObsidianGlowing.java deleted file mode 100644 index b04804742..000000000 --- a/src/main/java/cn/nukkit/block/BlockObsidianGlowing.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; - -/** - * Created on 2015/11/22 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockObsidianGlowing extends BlockObsidian { - - @Override - public int getId() { - return GLOWING_OBSIDIAN; - } - - @Override - public String getName() { - return "Glowing Obsidian"; - } - - @Override - public int getLightLevel() { - return 12; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(GLOWING_OBSIDIAN)); - } - - @Override - public boolean onBreak(Item item) { - return this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreCoal.java b/src/main/java/cn/nukkit/block/BlockOreCoal.java deleted file mode 100644 index 979b2afa6..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreCoal.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemCoal; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockOreCoal extends BlockSolid { - - @Override - public int getId() { - return COAL_ORE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Coal Ore"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - - int count = 1; - Enchantment fortune = item.getEnchantment(Enchantment.ID_FORTUNE_DIGGING); - if (fortune != null && fortune.getLevel() >= 1) { - int i = Utils.random.nextInt(fortune.getLevel() + 2) - 1; - - if (i < 0) { - i = 0; - } - - count = i + 1; - } - - return new Item[]{ - new ItemCoal(0, count) - }; - } else { - return new Item[0]; - } - } - - @Override - public int getDropExp() { - return Utils.rand(0, 2); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreDiamond.java b/src/main/java/cn/nukkit/block/BlockOreDiamond.java deleted file mode 100644 index 903e320b0..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreDiamond.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDiamond; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockOreDiamond extends BlockSolid { - - @Override - public int getId() { - return DIAMOND_ORE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Diamond Ore"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_IRON) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - - int count = 1; - Enchantment fortune = item.getEnchantment(Enchantment.ID_FORTUNE_DIGGING); - if (fortune != null && fortune.getLevel() >= 1) { - int i = Utils.random.nextInt(fortune.getLevel() + 2) - 1; - - if (i < 0) { - i = 0; - } - - count = i + 1; - } - - return new Item[]{ - new ItemDiamond(0, count) - }; - } else { - return new Item[0]; - } - } - - @Override - public int getDropExp() { - return Utils.rand(3, 7); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreEmerald.java b/src/main/java/cn/nukkit/block/BlockOreEmerald.java deleted file mode 100644 index 39aed84dd..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreEmerald.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemEmerald; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/12/1 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockOreEmerald extends BlockSolid { - - @Override - public String getName() { - return "Emerald Ore"; - } - - @Override - public int getId() { - return EMERALD_ORE; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_IRON) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - - int count = 1; - Enchantment fortune = item.getEnchantment(Enchantment.ID_FORTUNE_DIGGING); - if (fortune != null && fortune.getLevel() >= 1) { - int i = Utils.random.nextInt(fortune.getLevel() + 2) - 1; - - if (i < 0) { - i = 0; - } - - count = i + 1; - } - - return new Item[]{ - new ItemEmerald(0, count) - }; - } else { - return new Item[0]; - } - } - - @Override - public int getDropExp() { - return Utils.rand(3, 7); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreGold.java b/src/main/java/cn/nukkit/block/BlockOreGold.java deleted file mode 100644 index 802fbb50a..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreGold.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockOreGold extends BlockSolid { - - @Override - public int getId() { - return GOLD_ORE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Gold Ore"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_IRON) { - return new Item[]{ - Item.get(GOLD_ORE) - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreIron.java b/src/main/java/cn/nukkit/block/BlockOreIron.java deleted file mode 100644 index 0c03d9548..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreIron.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockOreIron extends BlockSolid { - - @Override - public int getId() { - return IRON_ORE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Iron Ore"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_STONE) { - return new Item[]{ - Item.get(IRON_ORE) - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreLapis.java b/src/main/java/cn/nukkit/block/BlockOreLapis.java deleted file mode 100644 index 54f6b263a..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreLapis.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDye; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockOreLapis extends BlockSolid { - - @Override - public int getId() { - return LAPIS_ORE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Lapis Lazuli Ore"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_STONE) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - - int count = 4 + Utils.random.nextInt(5); - Enchantment fortune = item.getEnchantment(Enchantment.ID_FORTUNE_DIGGING); - if (fortune != null && fortune.getLevel() >= 1) { - int i = Utils.random.nextInt(fortune.getLevel() + 2) - 1; - - if (i < 0) { - i = 0; - } - - count = count + i; - } - - return new Item[]{ - new ItemDye(4, count) - }; - } else { - return new Item[0]; - } - } - - @Override - public int getDropExp() { - return Utils.rand(2, 5); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreQuartz.java b/src/main/java/cn/nukkit/block/BlockOreQuartz.java deleted file mode 100644 index 6043fb38a..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreQuartz.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemQuartz; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/12/26 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockOreQuartz extends BlockSolid { - - @Override - public String getName() { - return "Quartz Ore"; - } - - @Override - public int getId() { - return QUARTZ_ORE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - - int count = 1; - Enchantment fortune = item.getEnchantment(Enchantment.ID_FORTUNE_DIGGING); - if (fortune != null && fortune.getLevel() >= 1) { - int i = Utils.random.nextInt(fortune.getLevel() + 2) - 1; - - if (i < 0) { - i = 0; - } - - count = i + 1; - } - - return new Item[]{ - new ItemQuartz(0, count) - }; - } else { - return new Item[0]; - } - } - - @Override - public int getDropExp() { - return Utils.rand(1, 5); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreRedstone.java b/src/main/java/cn/nukkit/block/BlockOreRedstone.java deleted file mode 100644 index 66a8bad29..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreRedstone.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemRedstone; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.Level; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockOreRedstone extends BlockSolid { - - @Override - public int getId() { - return REDSTONE_ORE; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Redstone Ore"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe() && item.getTier() >= ItemTool.TIER_IRON) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - - int count = Utils.random.nextInt(2) + 4; - - Enchantment fortune = item.getEnchantment(Enchantment.ID_FORTUNE_DIGGING); - if (fortune != null && fortune.getLevel() >= 1) { - count += Utils.random.nextInt(fortune.getLevel() + 1); - } - - return new Item[]{ - new ItemRedstone(0, count) - }; - } else { - return new Item[0]; - } - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_TOUCH) { - this.getLevel().setBlock(this, Block.get(GLOWING_REDSTONE_ORE), false, false); - this.getLevel().scheduleUpdate(this, 600); - - return Level.BLOCK_UPDATE_WEAK; - } - - return 0; - } - - @Override - public int getDropExp() { - return Utils.rand(1, 5); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockOreRedstoneGlowing.java b/src/main/java/cn/nukkit/block/BlockOreRedstoneGlowing.java deleted file mode 100644 index d737a298b..000000000 --- a/src/main/java/cn/nukkit/block/BlockOreRedstoneGlowing.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.event.block.BlockFadeEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; - -/** - * Created on 2015/12/6 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockOreRedstoneGlowing extends BlockOreRedstone { - - @Override - public String getName() { - return "Glowing Redstone Ore"; - } - - @Override - public int getId() { - return GLOWING_REDSTONE_ORE; - } - - @Override - public int getLightLevel() { - return 9; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(REDSTONE_ORE)); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_SCHEDULED || type == Level.BLOCK_UPDATE_RANDOM) { - BlockFadeEvent event = new BlockFadeEvent(this, get(REDSTONE_ORE)); - level.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - level.setBlock(this, event.getNewState(), false, false); - } - - return Level.BLOCK_UPDATE_WEAK; - } - - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPiston.java b/src/main/java/cn/nukkit/block/BlockPiston.java deleted file mode 100644 index 6bf3cff2f..000000000 --- a/src/main/java/cn/nukkit/block/BlockPiston.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.block; - -/** - * @author CreeperFace - */ -public class BlockPiston extends BlockPistonBase { - - public BlockPiston() { - this(0); - } - - public BlockPiston(int meta) { - super(meta); - } - - @Override - public int getId() { - return PISTON; - } - - @Override - public String getName() { - return "Piston"; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPistonBase.java b/src/main/java/cn/nukkit/block/BlockPistonBase.java deleted file mode 100644 index b621e4a67..000000000 --- a/src/main/java/cn/nukkit/block/BlockPistonBase.java +++ /dev/null @@ -1,417 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityPistonArm; -import cn.nukkit.event.block.BlockPistonChangeEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Faceable; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author CreeperFace - */ -public abstract class BlockPistonBase extends BlockSolidMeta implements Faceable { - - public boolean sticky; - - public BlockPistonBase() { - this(0); - } - - public BlockPistonBase(int meta) { - super(meta); - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (Math.abs(player.x - this.x) < 2 && Math.abs(player.z - this.z) < 2) { - double y = player.y + player.getEyeHeight(); - - if (y - this.y > 2) { - this.setDamage(BlockFace.DOWN.getIndex()); // These needed to be swapped for some reason - } else if (this.y - y > 0) { - this.setDamage(BlockFace.UP.getIndex()); - } else { - this.setDamage(player.getHorizontalFacing().getIndex()); - } - } else { - this.setDamage(player.getHorizontalFacing().getIndex()); - } - this.level.setBlock(block, this, true, false); - - CompoundTag nbt = new CompoundTag("") - .putString("id", BlockEntity.PISTON_ARM) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putBoolean("Sticky", this.sticky); - - BlockEntityPistonArm be = (BlockEntityPistonArm) BlockEntity.createBlockEntity(BlockEntity.PISTON_ARM, this.getChunk(), nbt); - be.sticky = this.sticky; - be.spawnToAll(); - - this.checkState(); - return true; - } - - @Override - public boolean onBreak(Item item) { - this.level.setBlock(this, Block.get(BlockID.AIR), true, true); - - Block block = this.getSide(getFacing()); - - if (block instanceof BlockPistonHead && ((BlockPistonHead) block).getFacing() == this.getFacing()) { - block.onBreak(item); - } - return true; - } - - public boolean isExtended() { - BlockFace face = getFacing(); - Block block = getSide(face); - return block instanceof BlockPistonHead && ((BlockPistonHead) block).getFacing() == face; - } - - @Override - public int onUpdate(int type) { - if (type != 6 && type != 1) { - return 0; - } else { - this.checkState(); - - return type; - } - } - - private void checkState() { - BlockFace facing = getFacing(); - boolean isPowered = this.isPowered(); - - if (isPowered && !isExtended()) { - BlocksCalculator calculator = new BlocksCalculator(this, facing, true); - if (calculator.canMove()) { - if (!this.doMove(true, calculator)) { - return; - } - - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_PISTON_OUT); - } - } else if (!isPowered && isExtended()) { - //this.level.setBlock() TODO: Set piston extension? - - if (this.sticky) { - Vector3 pos = this.add(facing.getXOffset() << 1, facing.getYOffset() << 1, facing.getZOffset() << 1); - Block block = this.level.getBlock(pos); - - if (block.getId() == AIR) { - this.level.setBlock(this.getLocation().getSide(facing), Block.get(BlockID.AIR), true, true); - } - if (canPush(block, facing.getOpposite(), false) && (!(block instanceof BlockFlowable) || block.getId() == PISTON || block.getId() == STICKY_PISTON)) { - this.doMove(false, null); - } - } else { - this.level.setBlock(getLocation().getSide(facing), Block.get(BlockID.AIR), true, false); - } - - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_PISTON_IN); - } - } - - public BlockFace getFacing() { - return BlockFace.fromIndex(this.getDamage()).getOpposite(); - } - - private boolean isPowered() { - BlockFace face = getFacing(); - - for (BlockFace side : BlockFace.values()) { - if (side != face && this.level.isSidePowered(this.getLocation().getSide(side), side)) { - return true; - } - } - - if (this.level.isSidePowered(this, BlockFace.DOWN)) { - return true; - } else { - Vector3 pos = this.getLocation().up(); - - for (BlockFace side : BlockFace.values()) { - if (side != BlockFace.DOWN && this.level.isSidePowered(pos.getSide(side), side)) { - return true; - } - } - - return false; - } - } - - private boolean doMove(boolean extending, BlocksCalculator calculator) { - BlockEntity blockEntity = this.level.getBlockEntity(this); - if (blockEntity instanceof BlockEntityPistonArm) { - BlockEntityPistonArm arm = (BlockEntityPistonArm) blockEntity; - if (arm.powered != extending) { - this.level.getServer().getPluginManager().callEvent(new BlockPistonChangeEvent(this, extending ? 0 : 15, extending ? 15 : 0)); - arm.powered = !arm.powered; - if (arm.chunk != null) { - arm.chunk.setChanged(); - } - } - } - - Vector3 pos = this.getLocation(); - BlockFace direction = getFacing(); - - if (!extending) { - this.level.setBlock(pos.getSide(direction), Block.get(BlockID.AIR), true, false); - } - if (calculator == null) { - calculator = new BlocksCalculator(this, direction, extending); - } - - if (calculator.canMove()) { - List blocks = calculator.getBlocksToMove(); - if (!extending && blocks.isEmpty()) { - this.level.setBlock(pos.getSide(direction), Block.get(BlockID.AIR), false, true); - return true; - } - List newBlocks = new ArrayList<>(blocks); - List destroyBlocks = calculator.getBlocksToDestroy(); - BlockFace side = extending ? direction : direction.getOpposite(); - - for (int i = destroyBlocks.size() - 1; i >= 0; --i) { - Block block = destroyBlocks.get(i); - this.level.useBreakOn(block); - } - - for (int i = blocks.size() - 1; i >= 0; --i) { - Block block = blocks.get(i); - this.level.setBlock(block, Block.get(BlockID.AIR), true, false); - Vector3 newPos = block.getLocation().getSide(side); - - // TODO: Change this to block entity - this.level.setBlock(newPos, newBlocks.get(i), true, false); - } - - if (extending) { - this.setDamage(this.getDamage() | 0x8); - } else { - this.setDamage(this.getDamage() & 0x7); - } - - if (extending) { - // Extension block entity - Vector3 pistonHead = pos.getSide(direction); - this.level.setBlockFullIdAt(pistonHead.getFloorX(), pistonHead.getFloorY(), pistonHead.getFloorZ(), (544) | (this.getDamage() & 0x7)); - //this.level.setBlock(pistonHead, Block.get(PISTON_HEAD, this.getDamage())); - } - return true; - } else { - return false; - } - } - - public static boolean canPush(Block block, BlockFace face, boolean destroyBlocks) { - if (block.canBePushed() && block.getY() >= 0 && (face != BlockFace.DOWN || block.getY() != 0) && block.getY() <= 255 && (face != BlockFace.UP || block.getY() != 255)) { - if (!(block instanceof BlockPistonBase)) { - if (block instanceof BlockFlowable) { - return destroyBlocks; - } - } else return !((BlockPistonBase) block).isExtended(); - return true; - } - return false; - } - - public static class BlocksCalculator { - private final Vector3 pistonPos; - private final Block blockToMove; - private final BlockFace moveDirection; - - private final List toMove = new ArrayList<>(); - private final List toDestroy = new ArrayList<>(); - - protected Boolean canMove; - - public BlocksCalculator(Block pos, BlockFace facing, boolean extending) { - this.pistonPos = pos.getLocation(); - - if (extending) { - this.moveDirection = facing; - this.blockToMove = pos.getSide(facing); - } else { - this.moveDirection = facing.getOpposite(); - this.blockToMove = pos.getSide(facing, 2); - } - } - - public boolean canMove() { - return this.canMove == null ? this.canMove = this.eval() : this.canMove; - } - - private boolean eval() { - this.toMove.clear(); - this.toDestroy.clear(); - Block block = this.blockToMove; - - if (!canPush(block, this.moveDirection, false)) { - if (block instanceof BlockFlowable || block.breakWhenPushed()) { - this.toDestroy.add(this.blockToMove); - return true; - } else { - return false; - } - } else if (!this.addBlockLine(this.blockToMove)) { - return false; - } else { - /*if (false) { //todo? - for (Block b : this.toMove) { - if (b.getId() == SLIME_BLOCK && !this.addBranchingBlocks(b)) { - return false; - } - } - }*/ - - return true; - } - } - - private boolean addBlockLine(Block origin) { - Block block = origin.clone(); - - if (block.getId() == AIR) { - return true; - } else if (!canPush(origin, this.moveDirection, false)) { - return true; - } else if (origin.equals(this.pistonPos)) { - return true; - } else if (this.toMove.contains(origin)) { - return true; - } else { - int count = 1; - - if (count + this.toMove.size() > 12) { - return false; - } else { - while (false && block.getId() == SLIME_BLOCK) { - block = origin.getSide(this.moveDirection.getOpposite(), count); - - if (block.getId() == AIR || !canPush(block, this.moveDirection, false) || block.equals(this.pistonPos)) { - break; - } - - ++count; - - if (count + this.toMove.size() > 12) { - return false; - } - } - - int blockCount = 0; - - for (int step = count - 1; step >= 0; --step) { - this.toMove.add(block.getSide(this.moveDirection.getOpposite(), step)); - ++blockCount; - } - - int steps = 1; - - while (true) { - Block nextBlock = block.getSide(this.moveDirection, steps); - int index = this.toMove.indexOf(nextBlock); - - if (index > -1) { - this.reorderListAtCollision(blockCount, index); - - for (int l = 0; l <= index + blockCount; ++l) { - Block b = this.toMove.get(l); - - if (false && b.getId() == SLIME_BLOCK && !this.addBranchingBlocks(b)) { - return false; - } - } - - return true; - } - - if (nextBlock.getId() == AIR) { - return true; - } - - if (!canPush(nextBlock, this.moveDirection, true) || nextBlock.equals(this.pistonPos)) { - return false; - } - - if (nextBlock instanceof BlockFlowable || block.breakWhenPushed()) { - this.toDestroy.add(nextBlock); - return true; - } - - if (this.toMove.size() >= 12) { - return false; - } - - this.toMove.add(nextBlock); - ++blockCount; - ++steps; - } - } - } - } - - private void reorderListAtCollision(int count, int index) { - List list = new ArrayList<>(this.toMove.subList(0, index)); - List list1 = new ArrayList<>(this.toMove.subList(this.toMove.size() - count, this.toMove.size())); - List list2 = new ArrayList<>(this.toMove.subList(index, this.toMove.size() - count)); - this.toMove.clear(); - this.toMove.addAll(list); - this.toMove.addAll(list1); - this.toMove.addAll(list2); - } - - private boolean addBranchingBlocks(Block block) { - for (BlockFace face : BlockFace.values()) { - if (face.getAxis() != this.moveDirection.getAxis() && !this.addBlockLine(block.getSide(face))) { - return false; - } - } - - return true; - } - - public List getBlocksToMove() { - return this.toMove; - } - - public List getBlocksToDestroy() { - return this.toDestroy; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x07); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockPistonExtension.java b/src/main/java/cn/nukkit/block/BlockPistonExtension.java deleted file mode 100644 index 92df04df9..000000000 --- a/src/main/java/cn/nukkit/block/BlockPistonExtension.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -public class BlockPistonExtension extends BlockTransparent { - - @Override - public int getId() { - return PISTON_EXTENSION; - } - - @Override - public String getName() { - return "Piston Extension"; - } - - @Override - public double getHardness() { - return 0.1; - } - - @Override - public double getResistance() { - return 0.1; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPistonHead.java b/src/main/java/cn/nukkit/block/BlockPistonHead.java deleted file mode 100644 index fb99b4233..000000000 --- a/src/main/java/cn/nukkit/block/BlockPistonHead.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.math.BlockFace; - -/** - * @author CreeperFace - */ -public class BlockPistonHead extends BlockTransparentMeta { - - public BlockPistonHead() { - this(0); - } - - public BlockPistonHead(int meta) { - super(meta); - } - - @Override - public int getId() { - return PISTON_HEAD; - } - - @Override - public String getName() { - return "Piston Head"; - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[0]; - } - - @Override - public boolean onBreak(Item item) { - this.level.setBlock(this, Block.get(BlockID.AIR), true, true); - Block piston = getSide(getFacing().getOpposite()); - - if (piston instanceof BlockPistonBase && ((BlockPistonBase) piston).getFacing() == this.getFacing()) { - piston.onBreak(item); - } - return true; - } - - public BlockFace getFacing() { - return BlockFace.fromIndex(this.getDamage()).getOpposite(); - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(BlockID.AIR)); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPistonSticky.java b/src/main/java/cn/nukkit/block/BlockPistonSticky.java deleted file mode 100644 index 4962b5c6d..000000000 --- a/src/main/java/cn/nukkit/block/BlockPistonSticky.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.block; - -/** - * @author CreeperFace - */ -public class BlockPistonSticky extends BlockPistonBase { - - public BlockPistonSticky() { - this(0); - } - - public BlockPistonSticky(int meta) { - super(meta); - this.sticky = true; - } - - @Override - public int getId() { - return STICKY_PISTON; - } - - @Override - public String getName() { - return "Sticky Piston"; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPlanks.java b/src/main/java/cn/nukkit/block/BlockPlanks.java deleted file mode 100644 index 11f265e87..000000000 --- a/src/main/java/cn/nukkit/block/BlockPlanks.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockPlanks extends BlockSolidMeta { - - public static final int OAK = 0; - public static final int SPRUCE = 1; - public static final int BIRCH = 2; - public static final int JUNGLE = 3; - public static final int ACACIA = 4; - public static final int DARK_OAK = 5; - - public BlockPlanks() { - this(0); - } - - public BlockPlanks(int meta) { - super(meta % 6); - } - - @Override - public int getId() { - return WOODEN_PLANKS; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getBurnChance() { - return 5; - } - - @Override - public int getBurnAbility() { - return 20; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Oak Wood Planks", - "Spruce Wood Planks", - "Birch Wood Planks", - "Jungle Wood Planks", - "Acacia Wood Planks", - "Dark Oak Wood Planks", - }; - - return names[this.getDamage() & 0x07]; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public BlockColor getColor() { - switch (getDamage() & 0x07) { - default: - case OAK: - return BlockColor.WOOD_BLOCK_COLOR; - case SPRUCE: - return BlockColor.SPRUCE_BLOCK_COLOR; - case BIRCH: - return BlockColor.SAND_BLOCK_COLOR; - case JUNGLE: - return BlockColor.DIRT_BLOCK_COLOR; - case ACACIA: - return BlockColor.ORANGE_BLOCK_COLOR; - case DARK_OAK: - return BlockColor.BROWN_BLOCK_COLOR; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPodzol.java b/src/main/java/cn/nukkit/block/BlockPodzol.java deleted file mode 100644 index 59c994271..000000000 --- a/src/main/java/cn/nukkit/block/BlockPodzol.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Sound; - -/** - * Created on 2015/11/22 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockPodzol extends BlockDirt { - - public BlockPodzol() { - this(0); - } - - public BlockPodzol(int meta) { - super(0); - } - - @Override - public int getId() { - return PODZOL; - } - - @Override - public String getName() { - return "Podzol"; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.isShovel()) { - Block up = this.up(); - if (up instanceof BlockAir || up instanceof BlockFlowable) { - item.useOn(this); - this.getLevel().setBlock(this, Block.get(GRASS_PATH)); - if (player != null) { - player.getLevel().addSoundToViewers(player, Sound.STEP_GRASS); - } - return true; - } - } - return false; - } - - @Override - public int getFullId() { - return 3888; - } - - @Override - public void setDamage(int meta) { - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPotato.java b/src/main/java/cn/nukkit/block/BlockPotato.java deleted file mode 100644 index 1d07daa2a..000000000 --- a/src/main/java/cn/nukkit/block/BlockPotato.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemPotato; -import cn.nukkit.utils.Utils; - -/** - * Created by Pub4Game on 15.01.2016. - */ -public class BlockPotato extends BlockCrops { - - public BlockPotato(int meta) { - super(meta); - } - - public BlockPotato() { - this(0); - } - - @Override - public String getName() { - return "Potato Block"; - } - - @Override - public int getId() { - return POTATO_BLOCK; - } - - @Override - public Item toItem() { - return new ItemPotato(); - } - - @Override - public Item[] getDrops(Item item) { - if (getDamage() >= 0x07) { - return new Item[]{ - new ItemPotato(0, Utils.random.nextInt(3) + 2) - }; - } else { - return new Item[]{ - new ItemPotato() - }; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPressurePlateBase.java b/src/main/java/cn/nukkit/block/BlockPressurePlateBase.java deleted file mode 100644 index 9e43a33bf..000000000 --- a/src/main/java/cn/nukkit/block/BlockPressurePlateBase.java +++ /dev/null @@ -1,180 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Event; -import cn.nukkit.event.block.BlockRedstoneEvent; -import cn.nukkit.event.entity.EntityInteractEvent; -import cn.nukkit.event.player.PlayerInteractEvent; -import cn.nukkit.event.player.PlayerInteractEvent.Action; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.ClickSound; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; - -/** - * Created by Snake1999 on 2016/1/11. - * Package cn.nukkit.block in project nukkit - */ -public abstract class BlockPressurePlateBase extends BlockFlowable { - - protected float onPitch; - protected float offPitch; - - protected BlockPressurePlateBase() { - this(0); - } - - protected BlockPressurePlateBase(int meta) { - super(meta); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - if (isActivated()) { - return new AxisAlignedBB(this.x + 0.0625, this.y, this.z + 0.0625, this.x + 0.9375, this.y + 0.03125, this.z + 0.9375); - } else { - return new AxisAlignedBB(this.x + 0.0625, this.y, this.z + 0.0625, this.x + 0.9375, this.y + 0.0625, this.z + 0.9375); - } - } - - @Override - public boolean isPowerSource() { - return true; - } - - public boolean isActivated() { - return this.getDamage() == 0; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().isTransparent()) { - this.level.useBreakOn(this); - } - } else if (type == Level.BLOCK_UPDATE_SCHEDULED) { - int power = this.getRedstonePower(); - - if (power > 0) { - this.updateState(power); - } - } - - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (block.down().isTransparent()) { - return false; - } - - this.level.setBlock(block, this, true, true); - return true; - } - - @Override - protected AxisAlignedBB recalculateCollisionBoundingBox() { - return new AxisAlignedBB(this.x + 0.125, this.y, this.z + 0.125, this.x + 0.875, this.y + 0.25, this.z + 0.875D); - } - - @Override - public void onEntityCollide(Entity entity) { - int power = getRedstonePower(); - - if (power == 0) { - Event ev; - - if (entity instanceof Player) { - ev = new PlayerInteractEvent((Player) entity, null, this, null, Action.PHYSICAL); - } else { - ev = new EntityInteractEvent(entity, this); - } - - this.level.getServer().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - updateState(power); - } - } - } - - protected void updateState(int oldStrength) { - int strength = this.computeRedstoneStrength(); - boolean wasPowered = oldStrength > 0; - boolean isPowered = strength > 0; - - if (oldStrength != strength) { - this.setRedstonePower(strength); - this.level.setBlock(this, this, false, false); - - this.level.updateAroundRedstone(this, null); - this.level.updateAroundRedstone(this.getLocation().down(), null); - - if (!isPowered && wasPowered) { - this.playOffSound(); - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, 15, 0)); - } else if (isPowered && !wasPowered) { - this.playOnSound(); - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, 0, 15)); - } - } - - if (isPowered) { - this.level.scheduleUpdate(this, 20); - } - } - - @Override - public boolean onBreak(Item item) { - this.level.setBlock(this, Block.get(BlockID.AIR), true, true); - - if (this.getRedstonePower() > 0) { - this.level.updateAroundRedstone(this, null); - this.level.updateAroundRedstone(this.getLocation().down(), null); - } - - return true; - } - - @Override - public int getWeakPower(BlockFace side) { - return getRedstonePower(); - } - - @Override - public int getStrongPower(BlockFace side) { - return side == BlockFace.UP ? this.getRedstonePower() : 0; - } - - public int getRedstonePower() { - return this.getDamage(); - } - - public void setRedstonePower(int power) { - this.setDamage(power); - } - - protected void playOnSound() { - this.level.addSound(new ClickSound(this, onPitch)); - } - - protected void playOffSound() { - this.level.addSound(new ClickSound(this, offPitch)); - } - - protected abstract int computeRedstoneStrength(); - - @Override - public Item toItem() { - return new ItemBlock(this, 0, 1); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPressurePlateStone.java b/src/main/java/cn/nukkit/block/BlockPressurePlateStone.java deleted file mode 100644 index e18fa96f0..000000000 --- a/src/main/java/cn/nukkit/block/BlockPressurePlateStone.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockPressurePlateStone extends BlockPressurePlateBase { - - public BlockPressurePlateStone(int meta) { - super(meta); - this.onPitch = 0.6f; - this.offPitch = 0.5f; - } - - public BlockPressurePlateStone() { - this(0); - } - - @Override - public String getName() { - return "Stone Pressure Plate"; - } - - @Override - public int getId() { - return STONE_PRESSURE_PLATE; - } - - @Override - public double getHardness() { - return 0.5D; - } - - @Override - public double getResistance() { - return 2.5D; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.STONE_BLOCK_COLOR; - } - - @Override - protected int computeRedstoneStrength() { - AxisAlignedBB bb = getCollisionBoundingBox(); - - for (Entity entity : this.level.getCollidingEntities(bb)) { - if (entity instanceof EntityLiving && entity.doesTriggerPressurePlate()) { - return 15; - } - } - - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPressurePlateWood.java b/src/main/java/cn/nukkit/block/BlockPressurePlateWood.java deleted file mode 100644 index 7588c91f9..000000000 --- a/src/main/java/cn/nukkit/block/BlockPressurePlateWood.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.entity.Entity; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockPressurePlateWood extends BlockPressurePlateBase { - - public BlockPressurePlateWood(int meta) { - super(meta); - this.onPitch = 0.8f; - this.offPitch = 0.7f; - } - - public BlockPressurePlateWood() { - this(0); - } - - @Override - public String getName() { - return "Wooden Pressure Plate"; - } - - @Override - public int getId() { - return WOODEN_PRESSURE_PLATE; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public double getHardness() { - return 0.5D; - } - - @Override - public double getResistance() { - return 2.5D; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - toItem() - }; - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } - - @Override - protected int computeRedstoneStrength() { - AxisAlignedBB bb = getCollisionBoundingBox(); - - for (Entity entity : this.level.getCollidingEntities(bb)) { - if (entity.doesTriggerPressurePlate()) { - return 15; - } - } - - return 0; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockPrismarine.java b/src/main/java/cn/nukkit/block/BlockPrismarine.java deleted file mode 100644 index bb87923c5..000000000 --- a/src/main/java/cn/nukkit/block/BlockPrismarine.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - - -public class BlockPrismarine extends BlockSolidMeta { - - public static final int NORMAL = 0; - public static final int DARK = 1; - public static final int BRICKS = 2; - - private static final String[] NAMES = new String[]{ - "Prismarine", - "Dark Prismarine", - "Prismarine Bricks" - }; - - public BlockPrismarine() { - this(0); - } - - public BlockPrismarine(int meta) { - super(meta); - } - - @Override - public int getId() { - return PRISMARINE; - } - - @Override - public double getHardness() { - return 1.5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return NAMES[this.getDamage() > 2 ? 0 : this.getDamage()]; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - switch (getDamage() & 0x07) { - case NORMAL: - return BlockColor.CYAN_BLOCK_COLOR; - case BRICKS: - case DARK: - return BlockColor.DIAMOND_BLOCK_COLOR; - default: - return BlockColor.STONE_BLOCK_COLOR; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPumpkin.java b/src/main/java/cn/nukkit/block/BlockPumpkin.java deleted file mode 100644 index 8170c1bb3..000000000 --- a/src/main/java/cn/nukkit/block/BlockPumpkin.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * Created on 2015/12/8 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockPumpkin extends BlockSolidMeta implements Faceable { - - public BlockPumpkin() { - this(0); - } - - public BlockPumpkin(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Pumpkin"; - } - - @Override - public int getId() { - return PUMPKIN; - } - - @Override - public double getHardness() { - return 1; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(player != null ? player.getDirection().getOpposite().getHorizontalIndex() : 0); - this.getLevel().setBlock(block, this, true, true); - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.ORANGE_BLOCK_COLOR; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public boolean breakWhenPushed() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPumpkinLit.java b/src/main/java/cn/nukkit/block/BlockPumpkinLit.java deleted file mode 100644 index 328720d3c..000000000 --- a/src/main/java/cn/nukkit/block/BlockPumpkinLit.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -/** - * Created on 2015/12/8 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockPumpkinLit extends BlockPumpkin { - - public BlockPumpkinLit() { - this(0); - } - - public BlockPumpkinLit(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Jack o'Lantern"; - } - - @Override - public int getId() { - return LIT_PUMPKIN; - } - - @Override - public int getLightLevel() { - return 15; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockPurpur.java b/src/main/java/cn/nukkit/block/BlockPurpur.java deleted file mode 100644 index 93e30d682..000000000 --- a/src/main/java/cn/nukkit/block/BlockPurpur.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -public class BlockPurpur extends BlockSolidMeta { - - public static final int PURPUR_NORMAL = 0; - public static final int PURPUR_PILLAR = 2; - - private static final short[] faces = new short[]{ - 0, - 0, - 0b1000, - 0b1000, - 0b0100, - 0b0100 - }; - - public BlockPurpur() { - this(PURPUR_NORMAL); - } - - public BlockPurpur(int meta) { - super(meta); - } - - @Override - public String getName() { - String[] names = new String[]{ - "Purpur Block", - "", - "Purpur Pillar", - "" - }; - - return names[this.getDamage() & 0x03]; - } - - @Override - public int getId() { - return PURPUR_BLOCK; - } - - @Override - public double getHardness() { - return 1.5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (this.getDamage() != PURPUR_NORMAL) { - this.setDamage(((this.getDamage() & 0x03) | faces[face.getIndex()])); - } - this.getLevel().setBlock(block, this, true, true); - - return true; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(Block.PURPUR_BLOCK), this.getDamage() & 0x03, 1); - } - - @Override - public BlockColor getColor() { - return BlockColor.MAGENTA_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockQuartz.java b/src/main/java/cn/nukkit/block/BlockQuartz.java deleted file mode 100644 index 87e3ea596..000000000 --- a/src/main/java/cn/nukkit/block/BlockQuartz.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockQuartz extends BlockSolidMeta { - - public static final int QUARTZ_NORMAL = 0; - public static final int QUARTZ_CHISELED = 1; - public static final int QUARTZ_PILLAR = 2; - public static final int QUARTZ_PILLAR2 = 3; - - private static final short[] faces = new short[]{ - 0, - 0, - 0b1000, - 0b1000, - 0b0100, - 0b0100 - }; - - public BlockQuartz() { - this(0); - } - - public BlockQuartz(int meta) { - super(meta); - } - - @Override - public int getId() { - return QUARTZ_BLOCK; - } - - @Override - public double getHardness() { - return 0.8; - } - - @Override - public double getResistance() { - return 4; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Quartz Block", - "Chiseled Quartz Block", - "Quartz Pillar", - "Quartz Pillar" - }; - - return names[this.getDamage() & 0x03]; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (this.getDamage() != QUARTZ_NORMAL) { - this.setDamage(((this.getDamage() & 0x03) | faces[face.getIndex()])); - } - this.getLevel().setBlock(block, this, true, true); - - return true; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(QUARTZ_BLOCK), this.getDamage() & 0x03, 1); - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public BlockColor getColor() { - return BlockColor.QUARTZ_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRail.java b/src/main/java/cn/nukkit/block/BlockRail.java deleted file mode 100644 index 5b7072460..000000000 --- a/src/main/java/cn/nukkit/block/BlockRail.java +++ /dev/null @@ -1,278 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemRail; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; -import cn.nukkit.utils.Rail; -import cn.nukkit.utils.Rail.Orientation; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static cn.nukkit.math.BlockFace.*; -import static cn.nukkit.utils.Rail.Orientation.*; - -/** - * Created by Snake1999 on 2016/1/11. - * Package cn.nukkit.block in project nukkit - */ -public class BlockRail extends BlockFlowable implements Faceable { - - // 0x8: Set the block active - // 0x7: Reset the block to normal - // If the rail can be powered. So its a complex rail! - protected boolean canBePowered = false; - - public BlockRail() { - this(0); - } - - public BlockRail(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Rail"; - } - - @Override - public int getId() { - return RAIL; - } - - @Override - public double getHardness() { - return 0.7; - } - - @Override - public double getResistance() { - return 3.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - Optional ascendingDirection = this.getOrientation().ascendingDirection(); - Block down = this.down(); - if ((down.isTransparent() && down.getId() != HOPPER_BLOCK) || (ascendingDirection.isPresent() && this.getSide(ascendingDirection.get()).isTransparent())) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - @Override - public AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 0.125D, - this.z + 1); - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - //Information from http://minecraft.gamepedia.com/Rail - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (down == null || (down.isTransparent() && down.getId() != HOPPER_BLOCK)) { - return false; - } - Map railsAround = this.checkRailsAroundAffected(); - List rails = new ArrayList<>(railsAround.keySet()); - List faces = new ArrayList<>(railsAround.values()); - if (railsAround.size() == 1) { - BlockRail other = rails.get(0); - this.setDamage(this.connect(other, railsAround.get(other)).metadata()); - } else if (railsAround.size() == 4) { - if (this.isAbstract()) { - this.setDamage(this.connect(rails.get(faces.indexOf(SOUTH)), SOUTH, rails.get(faces.indexOf(EAST)), EAST).metadata()); - } else { - this.setDamage(this.connect(rails.get(faces.indexOf(EAST)), EAST, rails.get(faces.indexOf(WEST)), WEST).metadata()); - } - } else if (!railsAround.isEmpty()) { - if (this.isAbstract()) { - if (railsAround.size() == 2) { - BlockRail rail1 = rails.get(0); - BlockRail rail2 = rails.get(1); - this.setDamage(this.connect(rail1, railsAround.get(rail1), rail2, railsAround.get(rail2)).metadata()); - } else { - List cd = Stream.of(CURVED_SOUTH_EAST, CURVED_NORTH_EAST, CURVED_SOUTH_WEST) - .filter(o -> faces.containsAll(o.connectingDirections())) - .findFirst().get().connectingDirections(); - BlockFace f1 = cd.get(0); - BlockFace f2 = cd.get(1); - this.setDamage(this.connect(rails.get(faces.indexOf(f1)), f1, rails.get(faces.indexOf(f2)), f2).metadata()); - } - } else { - BlockFace f = faces.stream().min((f1, f2) -> (f1.getIndex() < f2.getIndex()) ? 1 : ((x == y) ? 0 : -1)).get(); - BlockFace fo = f.getOpposite(); - if (faces.contains(fo)) { //Opposite connectable - this.setDamage(this.connect(rails.get(faces.indexOf(f)), f, rails.get(faces.indexOf(fo)), fo).metadata()); - } else { - this.setDamage(this.connect(rails.get(faces.indexOf(f)), f).metadata()); - } - } - } - this.level.setBlock(this, this, true, true); - if (!isAbstract()) { - level.scheduleUpdate(this, this, 0); - } - return true; - } - - private Orientation connect(BlockRail rail1, BlockFace face1, BlockRail rail2, BlockFace face2) { - this.connect(rail1, face1); - this.connect(rail2, face2); - - if (face1.getOpposite() == face2) { - int delta1 = (int) (this.y - rail1.y); - int delta2 = (int) (this.y - rail2.y); - - if (delta1 == -1) { - return Orientation.ascending(face1); - } else if (delta2 == -1) { - return Orientation.ascending(face2); - } - } - return straightOrCurved(face1, face2); - } - - private Orientation connect(BlockRail other, BlockFace face) { - int delta = (int) (this.y - other.y); - Map rails = other.checkRailsConnected(); - if (rails.isEmpty()) { //Only one - other.setOrientation(delta == 1 ? ascending(face.getOpposite()) : straight(face)); - return delta == -1 ? ascending(face) : straight(face); - } else if (rails.size() == 1) { //Already connected - BlockFace faceConnected = rails.values().iterator().next(); - - if (other.isAbstract() && faceConnected != face) { //Curve! - other.setOrientation(curved(face.getOpposite(), faceConnected)); - return delta == -1 ? ascending(face) : straight(face); - } else if (faceConnected == face) { //Turn! - if (!other.getOrientation().isAscending()) { - other.setOrientation(delta == 1 ? ascending(face.getOpposite()) : straight(face)); - } - return delta == -1 ? ascending(face) : straight(face); - } else if (other.getOrientation().hasConnectingDirections(NORTH, SOUTH)) { //North-south - other.setOrientation(delta == 1 ? ascending(face.getOpposite()) : straight(face)); - return delta == -1 ? ascending(face) : straight(face); - } - } - return STRAIGHT_NORTH_SOUTH; - } - - private Map checkRailsAroundAffected() { - Map railsAround = this.checkRailsAround(Arrays.asList(SOUTH, EAST, WEST, NORTH)); - return railsAround.keySet().stream() - .filter(r -> r.checkRailsConnected().size() != 2) - .collect(Collectors.toMap(r -> r, railsAround::get)); - } - - private Map checkRailsAround(Collection faces) { - Map result = new HashMap<>(); - faces.forEach(f -> { - Block b = this.getSide(f); - Stream.of(b, b.up(), b.down()) - .filter(Rail::isRailBlock) - .forEach(block -> result.put((BlockRail) block, f)); - }); - return result; - } - - protected Map checkRailsConnected() { - Map railsAround = this.checkRailsAround(this.getOrientation().connectingDirections()); - return railsAround.keySet().stream() - .filter(r -> r.getOrientation().hasConnectingDirections(railsAround.get(r).getOpposite())) - .collect(Collectors.toMap(r -> r, railsAround::get)); - } - - public boolean isAbstract() { - return this.getId() == RAIL; - } - - public boolean canPowered() { - return this.canBePowered; - } - - public Orientation getOrientation() { - return byMetadata(this.getRealMeta()); - } - - public void setOrientation(Orientation o) { - if (o.metadata() != this.getRealMeta()) { - this.setDamage(o.metadata()); - this.level.setBlock(this, this, false, true); - } - } - - public int getRealMeta() { - // Check if this can be powered - // Avoid modifying the value from meta (The rail orientation may be false) - // Reason: When the rail is curved, the meta will return STRAIGHT_NORTH_SOUTH. - // OR Null Pointer Exception - if (!isAbstract()) { - return getDamage() & 0x7; - } - // Return the default: This meta - return getDamage(); - } - - public boolean isActive() { - return (getDamage() & 0x8) != 0; - } - - public void setActive(boolean active) { - if (active) { - setDamage(getDamage() | 0x8); - } else { - setDamage(getDamage() & 0x7); - } - level.setBlock(this, this, true, true); - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - new ItemRail(0, 1) - }; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public boolean canBeFlowedInto() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRailActivator.java b/src/main/java/cn/nukkit/block/BlockRailActivator.java deleted file mode 100644 index 2ca3d83a3..000000000 --- a/src/main/java/cn/nukkit/block/BlockRailActivator.java +++ /dev/null @@ -1,183 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.Rail; - -/** - * @author Nukkit Project Team - */ -public class BlockRailActivator extends BlockRail { - - public BlockRailActivator(int meta) { - super(meta); - } - - public BlockRailActivator() { - this(0); - canBePowered = true; - } - - @Override - public String getName() { - return "Activator Rail"; - } - - @Override - public int getId() { - return ACTIVATOR_RAIL; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_REDSTONE || type == Level.BLOCK_UPDATE_SCHEDULED) { - if (super.onUpdate(type) == Level.BLOCK_UPDATE_NORMAL) { - return 0; // Already broken - } - - boolean isPowered = level.isBlockPowered(this.getLocation()) - || checkSurrounding(this, true, 0) - || checkSurrounding(this, false, 0); - - if (isActive() != isPowered) { - setActive(isPowered); - level.updateAround(down()); - if (getOrientation().isAscending()) { - level.updateAround(up()); - } - } - return type; - } - return 0; - } - - /** - * Check the surrounding of the rail - * - * @param pos The rail position - * @param relative The relative of the rail that will be checked - * @param power The count of the rail that had been counted - * @return Boolean of the surrounding area. Where the powered rail on! - */ - protected boolean checkSurrounding(Vector3 pos, boolean relative, int power) { - if (power >= 8) { - return false; - } - int dx = pos.getFloorX(); - int dy = pos.getFloorY(); - int dz = pos.getFloorZ(); - - BlockRail block; - Block block2 = level.getBlock(new Vector3(dx, dy, dz)); - - if (Rail.isRailBlock(block2)) { - block = (BlockRail) block2; - } else { - return false; - } - - Rail.Orientation base = null; - boolean onStraight = true; - - switch (block.getOrientation()) { - case STRAIGHT_NORTH_SOUTH: - if (relative) { - dz++; - } else { - dz--; - } - break; - case STRAIGHT_EAST_WEST: - if (relative) { - dx--; - } else { - dx++; - } - break; - case ASCENDING_EAST: - if (relative) { - dx--; - } else { - dx++; - dy++; - onStraight = false; - } - base = Rail.Orientation.STRAIGHT_EAST_WEST; - break; - case ASCENDING_WEST: - if (relative) { - dx--; - dy++; - onStraight = false; - } else { - dx++; - } - base = Rail.Orientation.STRAIGHT_EAST_WEST; - break; - case ASCENDING_NORTH: - if (relative) { - dz++; - } else { - dz--; - dy++; - onStraight = false; - } - base = Rail.Orientation.STRAIGHT_NORTH_SOUTH; - break; - case ASCENDING_SOUTH: - if (relative) { - dz++; - dy++; - onStraight = false; - } else { - dz--; - } - base = Rail.Orientation.STRAIGHT_NORTH_SOUTH; - break; - default: - return false; - } - - return canPowered(new Vector3(dx, dy, dz), base, power, relative) - || onStraight && canPowered(new Vector3(dx, dy - 1, dz), base, power, relative); - } - - protected boolean canPowered(Vector3 pos, Rail.Orientation state, int power, boolean relative) { - Block block = level.getBlock(pos); - - if (!(block instanceof BlockRailActivator)) { - return false; - } - - Rail.Orientation base = ((BlockRailActivator) block).getOrientation(); - - return (state != Rail.Orientation.STRAIGHT_EAST_WEST - || base != Rail.Orientation.STRAIGHT_NORTH_SOUTH - && base != Rail.Orientation.ASCENDING_NORTH - && base != Rail.Orientation.ASCENDING_SOUTH) - && (state != Rail.Orientation.STRAIGHT_NORTH_SOUTH - || base != Rail.Orientation.STRAIGHT_EAST_WEST - && base != Rail.Orientation.ASCENDING_EAST - && base != Rail.Orientation.ASCENDING_WEST) - && (level.isBlockPowered(pos) || checkSurrounding(pos, relative, power + 1)); - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - Item.get(Item.ACTIVATOR_RAIL, 0, 1) - }; - } - - @Override - public double getHardness() { - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRailDetector.java b/src/main/java/cn/nukkit/block/BlockRailDetector.java deleted file mode 100644 index 15847cbb1..000000000 --- a/src/main/java/cn/nukkit/block/BlockRailDetector.java +++ /dev/null @@ -1,122 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityMinecartAbstract; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; - -/** - * Created on 2015/11/22 by CreeperFace. - * Contributed by: larryTheCoder on 2017/7/8. - * - * Nukkit Project, - * Minecart and Riding Project, - * Package cn.nukkit.block in project Nukkit. - */ -public class BlockRailDetector extends BlockRail { - - public BlockRailDetector() { - this(0); - canBePowered = true; - } - - public BlockRailDetector(int meta) { - super(meta); - } - - @Override - public int getId() { - return DETECTOR_RAIL; - } - - @Override - public String getName() { - return "Detector Rail"; - } - - @Override - public boolean isPowerSource() { - return true; - } - - @Override - public int getWeakPower(BlockFace side) { - return isActive() ? 15 : 0; - } - - @Override - public int getStrongPower(BlockFace side) { - return isActive() ? 0 : (side == BlockFace.UP ? 15 : 0); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_SCHEDULED) { - updateState(); - return type; - } - return super.onUpdate(type); - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public void onEntityCollide(Entity entity) { - updateState(); - } - - protected void updateState() { - boolean wasPowered = isActive(); - boolean isPowered = false; - boolean changed = false; - - for (Entity entity : level.getCollidingEntities(new AxisAlignedBB( - getFloorX() + 0.125D, - getFloorY(), - getFloorZ() + 0.125D, - getFloorX() + 0.875D, - getFloorY() + 0.750D, - getFloorZ() + 0.875D))) { - if (entity instanceof EntityMinecartAbstract) { - isPowered = true; - break; - } - } - - if (isPowered && !wasPowered) { - setActive(true); - level.scheduleUpdate(this, this, 0); - level.scheduleUpdate(this, this.down(), 0); - changed = true; - } - - if (!isPowered && wasPowered) { - setActive(false); - level.scheduleUpdate(this, this, 0); - level.scheduleUpdate(this, this.down(), 0); - changed = true; - } - - if (changed) { - level.updateComparatorOutputLevel(this); - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - Item.get(Item.DETECTOR_RAIL, 0, 1) - }; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRailPowered.java b/src/main/java/cn/nukkit/block/BlockRailPowered.java deleted file mode 100644 index 20de69538..000000000 --- a/src/main/java/cn/nukkit/block/BlockRailPowered.java +++ /dev/null @@ -1,192 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.Rail; - -/** - * Created by Snake1999 on 2016/1/11. - * Contributed by: larryTheCoder on 2017/7/18. - * - * Nukkit Project, - * Minecart and Riding Project, - * Package cn.nukkit.block in project Nukkit. - */ -public class BlockRailPowered extends BlockRail { - - public BlockRailPowered() { - this(0); - canBePowered = true; - } - - public BlockRailPowered(int meta) { - super(meta); - } - - @Override - public int getId() { - return POWERED_RAIL; - } - - @Override - public String getName() { - return "Powered Rail"; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_REDSTONE || type == Level.BLOCK_UPDATE_SCHEDULED) { - if (super.onUpdate(type) == Level.BLOCK_UPDATE_NORMAL) { - return 0; // Already broken - } - - boolean isPowered = level.isBlockPowered(this.getLocation()) - || checkSurrounding(this, true, 0) - || checkSurrounding(this, false, 0); - - if (isActive() != isPowered) { - setActive(isPowered); - level.updateAround(down()); - if (getOrientation().isAscending()) { - level.updateAround(up()); - } - } - return type; - } - return 0; - } - - /** - * Check the surrounding of the rail - * - * @param pos The rail position - * @param relative The relative of the rail that will be checked - * @param power The count of the rail that had been counted - * @return Boolean of the surrounding area. Where the powered rail on! - */ - protected boolean checkSurrounding(Vector3 pos, boolean relative, int power) { - // The powered rail can power up to 8 blocks only - if (power >= 8) { - return false; - } - // The position of the floor numbers - int dx = pos.getFloorX(); - int dy = pos.getFloorY(); - int dz = pos.getFloorZ(); - // First: get the base block - BlockRail block; - Block block2 = level.getBlock(new Vector3(dx, dy, dz)); - - // Second: check if the rail is Powered rail - if (Rail.isRailBlock(block2)) { - block = (BlockRail) block2; - } else { - return false; - } - - // Used to check if the next ascending rail should be what - Rail.Orientation base = null; - boolean onStraight = true; - // Third: Recalculate the base position - switch (block.getOrientation()) { - case STRAIGHT_NORTH_SOUTH: - if (relative) { - dz++; - } else { - dz--; - } - break; - case STRAIGHT_EAST_WEST: - if (relative) { - dx--; - } else { - dx++; - } - break; - case ASCENDING_EAST: - if (relative) { - dx--; - } else { - dx++; - dy++; - onStraight = false; - } - base = Rail.Orientation.STRAIGHT_EAST_WEST; - break; - case ASCENDING_WEST: - if (relative) { - dx--; - dy++; - onStraight = false; - } else { - dx++; - } - base = Rail.Orientation.STRAIGHT_EAST_WEST; - break; - case ASCENDING_NORTH: - if (relative) { - dz++; - } else { - dz--; - dy++; - onStraight = false; - } - base = Rail.Orientation.STRAIGHT_NORTH_SOUTH; - break; - case ASCENDING_SOUTH: - if (relative) { - dz++; - dy++; - onStraight = false; - } else { - dz--; - } - base = Rail.Orientation.STRAIGHT_NORTH_SOUTH; - break; - default: - // Unable to determinate the rail orientation - // Wrong rail? - return false; - } - // Next check the if rail is on power state - return canPowered(new Vector3(dx, dy, dz), base, power, relative) - || onStraight && canPowered(new Vector3(dx, dy - 1, dz), base, power, relative); - } - - protected boolean canPowered(Vector3 pos, Rail.Orientation state, int power, boolean relative) { - Block block = level.getBlock(pos); - // What! My block is air??!! Impossible! XD - if (!(block instanceof BlockRailPowered)) { - return false; - } - - // Sometimes the rails are diffrent orientation - Rail.Orientation base = ((BlockRailPowered) block).getOrientation(); - - // Possible way how to know when the rail is activated is rail were directly powered - // OR recheck the surrounding... Which will returns here =w= - return (state != Rail.Orientation.STRAIGHT_EAST_WEST - || base != Rail.Orientation.STRAIGHT_NORTH_SOUTH - && base != Rail.Orientation.ASCENDING_NORTH - && base != Rail.Orientation.ASCENDING_SOUTH) - && (state != Rail.Orientation.STRAIGHT_NORTH_SOUTH - || base != Rail.Orientation.STRAIGHT_EAST_WEST - && base != Rail.Orientation.ASCENDING_EAST - && base != Rail.Orientation.ASCENDING_WEST) - && (level.isBlockPowered(pos) || checkSurrounding(pos, relative, power + 1)); - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - Item.get(Item.POWERED_RAIL, 0, 1) - }; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedSandstone.java b/src/main/java/cn/nukkit/block/BlockRedSandstone.java deleted file mode 100644 index 1c8fd32ba..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedSandstone.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.utils.BlockColor; - -/** - * Created by CreeperFace on 26. 11. 2016. - */ -public class BlockRedSandstone extends BlockSandstone { - - public BlockRedSandstone() { - this(0); - } - - public BlockRedSandstone(int meta) { - super(meta); - } - - @Override - public int getId() { - return RED_SANDSTONE; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Red Sandstone", - "Chiseled Red Sandstone", - "Smooth Red Sandstone", - "" - }; - - return names[this.getDamage() & 0x03]; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x03); - } - - @Override - public BlockColor getColor() { - return BlockColor.ORANGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstone.java b/src/main/java/cn/nukkit/block/BlockRedstone.java deleted file mode 100644 index 84e9a3538..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstone.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -/* - * Created on 2015/12/11 by Pub4Game. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockRedstone extends BlockSolid { - - @Override - public int getId() { - return REDSTONE_BLOCK; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Block of Redstone"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.REDSTONE_BLOCK_COLOR; - } - - @Override - public boolean isPowerSource() { - return true; - } - - @Override - public int getWeakPower(BlockFace face) { - return 15; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canBePushed() { - return false; // anti crash machine - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneComparator.java b/src/main/java/cn/nukkit/block/BlockRedstoneComparator.java deleted file mode 100644 index dcf881a5f..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneComparator.java +++ /dev/null @@ -1,204 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityComparator; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemRedstoneComparator; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.ClickSound; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.BlockColor; - -/** - * @author CreeperFace - */ -public abstract class BlockRedstoneComparator extends BlockRedstoneDiode { - - public BlockRedstoneComparator() { - this(0); - } - - public BlockRedstoneComparator(int meta) { - super(meta); - } - - @Override - protected int getDelay() { - return 2; - } - - @Override - public BlockFace getFacing() { - return BlockFace.fromHorizontalIndex(this.getDamage()); - } - - public Mode getMode() { - return (getDamage() & 4) > 0 ? Mode.SUBTRACT : Mode.COMPARE; - } - - @Override - protected BlockRedstoneComparator getUnpowered() { - return (BlockRedstoneComparator) Block.get(UNPOWERED_COMPARATOR, this.getDamage()); - } - - @Override - protected BlockRedstoneComparator getPowered() { - return (BlockRedstoneComparator) Block.get(POWERED_COMPARATOR, this.getDamage()); - } - - @Override - protected int getRedstoneSignal() { - BlockEntity blockEntity = this.level.getBlockEntity(this); - - return blockEntity instanceof BlockEntityComparator ? ((BlockEntityComparator) blockEntity).getOutputSignal() : 0; - } - - @Override - public void updateState() { - if (!this.level.isBlockTickPending(this, this)) { - int output = this.calculateOutput(); - BlockEntity blockEntity = this.level.getBlockEntity(this); - int power = blockEntity instanceof BlockEntityComparator ? ((BlockEntityComparator) blockEntity).getOutputSignal() : 0; - - if (output != power || this.isPowered() != this.shouldBePowered()) { - /*if (isFacingTowardsRepeater()) { - this.level.scheduleUpdate(this, this, 2, -1); - } else { - this.level.scheduleUpdate(this, this, 2, 0); - }*/ - - this.level.scheduleUpdate(this, this, 2); - } - } - } - - protected int calculateInputStrength() { - int power = super.calculateInputStrength(); - BlockFace face = getFacing(); - Block block = this.getSide(face); - - if (block.hasComparatorInputOverride()) { - power = block.getComparatorInputOverride(); - } else if (power < 15 && block.isNormalBlock()) { - block = block.getSide(face); - - if (block.hasComparatorInputOverride()) { - power = block.getComparatorInputOverride(); - } - } - - return power; - } - - protected boolean shouldBePowered() { - int input = this.calculateInputStrength(); - - if (input >= 15) { - return true; - } else if (input == 0) { - return false; - } else { - int sidePower = this.getPowerOnSides(); - return sidePower == 0 || input >= sidePower; - } - } - - private int calculateOutput() { - return getMode() == Mode.SUBTRACT ? Math.max(this.calculateInputStrength() - this.getPowerOnSides(), 0) : this.calculateInputStrength(); - } - - @Override - public boolean onActivate(Item item, Player player) { - if (getMode() == Mode.SUBTRACT) { - this.setDamage(this.getDamage() - 4); - } else { - this.setDamage(this.getDamage() + 4); - } - - this.level.addSound(new ClickSound(this, getMode() == Mode.SUBTRACT ? 0.55F : 0.5F)); - this.level.setBlock(this, this, true, false); - //bug? - - this.onChange(); - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_SCHEDULED) { - this.onChange(); - return type; - } - - return super.onUpdate(type); - } - - private void onChange() { - int output = this.calculateOutput(); - BlockEntity blockEntity = this.level.getBlockEntity(this); - int currentOutput = 0; - - if (blockEntity instanceof BlockEntityComparator) { - BlockEntityComparator blockEntityComparator = (BlockEntityComparator) blockEntity; - currentOutput = blockEntityComparator.getOutputSignal(); - blockEntityComparator.setOutputSignal(output); - } - - if (currentOutput != output || getMode() == Mode.COMPARE) { - boolean shouldBePowered = this.shouldBePowered(); - boolean isPowered = this.isPowered(); - - if (isPowered && !shouldBePowered) { - this.level.setBlock(this, getUnpowered(), true, false); - } else if (!isPowered && shouldBePowered) { - this.level.setBlock(this, getPowered(), true, false); - } - - this.level.updateAroundRedstone(this, null); //TODO: remove - //Block side = this.getSide(getFacing().getOpposite()); - //side.onUpdate(Level.BLOCK_UPDATE_REDSTONE); - //this.level.updateAroundRedstone(side, null); - } - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (super.place(item, block, target, face, fx, fy, fz, player)) { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.COMPARATOR) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - BlockEntity.createBlockEntity(BlockEntity.COMPARATOR, this.getChunk(), nbt); - - onUpdate(Level.BLOCK_UPDATE_REDSTONE); - return true; - } - - return false; - } - - @Override - public boolean isPowered() { - return this.isPowered || (this.getDamage() & 8) > 0; - } - - @Override - public Item toItem() { - return new ItemRedstoneComparator(); - } - - public enum Mode { - COMPARE, - SUBTRACT - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneComparatorPowered.java b/src/main/java/cn/nukkit/block/BlockRedstoneComparatorPowered.java deleted file mode 100644 index ef84ea848..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneComparatorPowered.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -/** - * @author CreeperFace - */ -public class BlockRedstoneComparatorPowered extends BlockRedstoneComparator { - - public BlockRedstoneComparatorPowered() { - this(0); - } - - public BlockRedstoneComparatorPowered(int meta) { - super(meta); - this.isPowered = true; - } - - @Override - public int getId() { - return POWERED_COMPARATOR; - } - - @Override - public String getName() { - return "Comparator Block Powered"; - } - - @Override - protected BlockRedstoneComparator getPowered() { - return this; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneComparatorUnpowered.java b/src/main/java/cn/nukkit/block/BlockRedstoneComparatorUnpowered.java deleted file mode 100644 index 0ecb8c6b7..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneComparatorUnpowered.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.block; - -/** - * @author CreeperFace - */ -public class BlockRedstoneComparatorUnpowered extends BlockRedstoneComparator { - - public BlockRedstoneComparatorUnpowered() { - this(0); - } - - public BlockRedstoneComparatorUnpowered(int meta) { - super(meta); - } - - @Override - public int getId() { - return UNPOWERED_COMPARATOR; - } - - @Override - public String getName() { - return "Comparator Block Unpowered"; - } - - @Override - protected BlockRedstoneComparator getUnpowered() { - return this; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneDiode.java b/src/main/java/cn/nukkit/block/BlockRedstoneDiode.java deleted file mode 100644 index 9966ade57..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneDiode.java +++ /dev/null @@ -1,213 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.redstone.RedstoneUpdateEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * @author CreeperFace - */ -public abstract class BlockRedstoneDiode extends BlockFlowable implements Faceable { - - protected boolean isPowered = false; - - public BlockRedstoneDiode() { - this(0); - } - - public BlockRedstoneDiode(int meta) { - super(meta); - } - - @Override - public boolean onBreak(Item item) { - Vector3 pos = getLocation(); - this.level.setBlock(this, Block.get(BlockID.AIR), true, true); - - for (BlockFace face : BlockFace.values()) { - this.level.updateAroundRedstone(pos.getSide(face), null); - } - - return true; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (block.getSide(BlockFace.DOWN).isTransparent() && !(this.down() instanceof BlockSlab)) { - return false; - } - - this.setDamage(player != null ? player.getDirection().getOpposite().getHorizontalIndex() : 0); - this.level.setBlock(block, this, true, true); - - if (shouldBePowered()) { - this.level.scheduleUpdate(this, 1); - } - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_SCHEDULED) { - if (!this.isLocked()) { - Vector3 pos = getLocation(); - boolean shouldBePowered = this.shouldBePowered(); - - if (this.isPowered && !shouldBePowered) { - this.level.setBlock(pos, this.getUnpowered(), true, true); - - this.level.updateAroundRedstone(this.getLocation().getSide(getFacing().getOpposite()), null); - } else if (!this.isPowered) { - this.level.setBlock(pos, this.getPowered(), true, true); - this.level.updateAroundRedstone(this.getLocation().getSide(getFacing().getOpposite()), null); - - if (!shouldBePowered) { - level.scheduleUpdate(getPowered(), this, this.getDelay()); - } - } - } - } else if (type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_REDSTONE) { - // Redstone event - RedstoneUpdateEvent ev = new RedstoneUpdateEvent(this); - getLevel().getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return 0; - } - if (type == Level.BLOCK_UPDATE_NORMAL && this.getSide(BlockFace.DOWN).isTransparent() && !(this.down() instanceof BlockSlab)) { - this.level.useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } else { - this.updateState(); - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - public void updateState() { - if (!this.isLocked()) { - boolean shouldPowered = this.shouldBePowered(); - - if ((this.isPowered && !shouldPowered || !this.isPowered && shouldPowered) && !this.level.isBlockTickPending(this, this)) { - /*int priority = -1; - - if (this.isFacingTowardsRepeater()) { - priority = -3; - } else if (this.isPowered) { - priority = -2; - }*/ - - this.level.scheduleUpdate(this, this, this.getDelay()); - } - } - } - - public boolean isLocked() { - return false; - } - - protected int calculateInputStrength() { - BlockFace face = getFacing(); - Vector3 pos = this.getLocation().getSide(face); - int power = this.level.getRedstonePower(pos, face); - - if (power >= 15) { - return power; - } else { - Block block = this.level.getBlock(pos); - return Math.max(power, block.getId() == Block.REDSTONE_WIRE ? block.getDamage() : 0); - } - } - - protected int getPowerOnSides() { - Vector3 pos = getLocation(); - - BlockFace face = getFacing(); - BlockFace face1 = face.rotateY(); - BlockFace face2 = face.rotateYCCW(); - return Math.max(this.getPowerOnSide(pos.getSide(face1), face1), this.getPowerOnSide(pos.getSide(face2), face2)); - } - - protected int getPowerOnSide(Vector3 pos, BlockFace side) { - Block block = this.level.getBlock(pos); - return isAlternateInput(block) ? (block.getId() == Block.REDSTONE_BLOCK ? 15 : (block.getId() == Block.REDSTONE_WIRE ? block.getDamage() : this.level.getStrongPower(pos, side))) : 0; - } - - @Override - public boolean isPowerSource() { - return true; - } - - protected boolean shouldBePowered() { - return this.calculateInputStrength() > 0; - } - - public abstract BlockFace getFacing(); - - protected abstract int getDelay(); - - protected abstract Block getUnpowered(); - - protected abstract Block getPowered(); - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB(this.x, this.y, this.z, this.x + 1, this.y + 0.125, this.z + 1); - } - - @Override - public boolean canPassThrough() { - return false; - } - - protected boolean isAlternateInput(Block block) { - return block.isPowerSource(); - } - - public static boolean isDiode(Block block) { - return block instanceof BlockRedstoneDiode; - } - - protected int getRedstoneSignal() { - return 15; - } - - public int getStrongPower(BlockFace side) { - return getWeakPower(side); - } - - public int getWeakPower(BlockFace side) { - return !this.isPowered() ? 0 : (getFacing() == side ? this.getRedstoneSignal() : 0); - } - - @Override - public boolean canBeActivated() { - return true; - } - - public boolean isPowered() { - return isPowered; - } - - public boolean isFacingTowardsRepeater() { - BlockFace side = getFacing().getOpposite(); - Block block = this.getSide(side); - return block instanceof BlockRedstoneDiode && ((BlockRedstoneDiode) block).getFacing() != side; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneLamp.java b/src/main/java/cn/nukkit/block/BlockRedstoneLamp.java deleted file mode 100644 index 9ee6dd0e1..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneLamp.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.redstone.RedstoneUpdateEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -/** - * @author Nukkit Project Team - */ -public class BlockRedstoneLamp extends BlockSolid { - - @Override - public String getName() { - return "Redstone Lamp"; - } - - @Override - public int getId() { - return REDSTONE_LAMP; - } - - @Override - public double getHardness() { - return 0.3D; - } - - @Override - public double getResistance() { - return 1.5D; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (this.level.isBlockPowered(this.getLocation())) { - this.level.setBlock(this, Block.get(LIT_REDSTONE_LAMP), false, true); - } else { - this.level.setBlock(this, this, false, true); - } - return true; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_REDSTONE) { - // Redstone event - RedstoneUpdateEvent ev = new RedstoneUpdateEvent(this); - getLevel().getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return 0; - } - if (this.level.isBlockPowered(this.getLocation())) { - this.level.setBlock(this, Block.get(LIT_REDSTONE_LAMP), false, false); - return 1; - } - } - - return 0; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - new ItemBlock(Block.get(REDSTONE_LAMP)) - }; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneLampLit.java b/src/main/java/cn/nukkit/block/BlockRedstoneLampLit.java deleted file mode 100644 index b79948f0f..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneLampLit.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.event.redstone.RedstoneUpdateEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; - -/** - * @author Pub4Game - */ -public class BlockRedstoneLampLit extends BlockRedstoneLamp { - - @Override - public String getName() { - return "Lit Redstone Lamp"; - } - - @Override - public int getId() { - return LIT_REDSTONE_LAMP; - } - - @Override - public int getLightLevel() { - return 15; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(REDSTONE_LAMP)); - } - - @Override - public int onUpdate(int type) { - if ((type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_REDSTONE) && !this.level.isBlockPowered(this.getLocation())) { - RedstoneUpdateEvent ev = new RedstoneUpdateEvent(this); - getLevel().getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return 0; - } - this.level.scheduleUpdate(this, 4); - return 1; - } - - if (type == Level.BLOCK_UPDATE_SCHEDULED && !this.level.isBlockPowered(this.getLocation())) { - this.level.setBlock(this, Block.get(REDSTONE_LAMP), false, false); - } - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneRepeaterPowered.java b/src/main/java/cn/nukkit/block/BlockRedstoneRepeaterPowered.java deleted file mode 100644 index 7d4701ca0..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneRepeaterPowered.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemRedstoneRepeater; -import cn.nukkit.math.BlockFace; - -/** - * Created by CreeperFace on 10.4.2017. - */ -public class BlockRedstoneRepeaterPowered extends BlockRedstoneDiode { - - public BlockRedstoneRepeaterPowered() { - this(0); - } - - public BlockRedstoneRepeaterPowered(int meta) { - super(meta); - this.isPowered = true; - } - - @Override - public int getId() { - return POWERED_REPEATER; - } - - @Override - public String getName() { - return "Powered Repeater"; - } - - @Override - public BlockFace getFacing() { - return BlockFace.fromHorizontalIndex(getDamage()); - } - - @Override - protected boolean isAlternateInput(Block block) { - return isDiode(block); - } - - @Override - public Item toItem() { - return new ItemRedstoneRepeater(); - } - - @Override - protected int getDelay() { - return (1 + (getDamage() >> 2)) << 1; - } - - @Override - protected Block getPowered() { - return this; - } - - @Override - protected Block getUnpowered() { - return Block.get(UNPOWERED_REPEATER, this.getDamage()); - } - - @Override - public int getLightLevel() { - return 7; - } - - @Override - public boolean onActivate(Item item, Player player) { - this.setDamage(this.getDamage() + 4); - if (this.getDamage() > 15) this.setDamage(this.getDamage() % 4); - - this.level.setBlock(this, this, true, false); - return true; - } - - @Override - public boolean isLocked() { - return this.getPowerOnSides() > 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneRepeaterUnpowered.java b/src/main/java/cn/nukkit/block/BlockRedstoneRepeaterUnpowered.java deleted file mode 100644 index d90190e52..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneRepeaterUnpowered.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemRedstoneRepeater; -import cn.nukkit.math.BlockFace; - -/** - * Created by CreeperFace on 10.4.2017. - */ -public class BlockRedstoneRepeaterUnpowered extends BlockRedstoneDiode { - - public BlockRedstoneRepeaterUnpowered() { - this(0); - } - - public BlockRedstoneRepeaterUnpowered(int meta) { - super(meta); - this.isPowered = false; - } - - @Override - public int getId() { - return UNPOWERED_REPEATER; - } - - @Override - public String getName() { - return "Unpowered Repeater"; - } - - @Override - public boolean onActivate(Item item, Player player) { - this.setDamage(this.getDamage() + 4); - if (this.getDamage() > 15) this.setDamage(this.getDamage() % 4); - - this.level.setBlock(this, this, true, false); - return true; - } - - @Override - public BlockFace getFacing() { - return BlockFace.fromHorizontalIndex(getDamage()); - } - - @Override - protected boolean isAlternateInput(Block block) { - return isDiode(block); - } - - @Override - public Item toItem() { - return new ItemRedstoneRepeater(); - } - - @Override - protected int getDelay() { - return (1 + (getDamage() >> 2)) << 1; - } - - @Override - protected Block getPowered() { - return Block.get(POWERED_REPEATER, this.getDamage()); - } - - @Override - protected Block getUnpowered() { - return this; - } - - @Override - public boolean isLocked() { - return this.getPowerOnSides() > 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneTorch.java b/src/main/java/cn/nukkit/block/BlockRedstoneTorch.java deleted file mode 100644 index 5b1239349..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneTorch.java +++ /dev/null @@ -1,141 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.redstone.RedstoneUpdateEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockRedstoneTorch extends BlockTorch implements Faceable { - - public BlockRedstoneTorch() { - this(0); - } - - public BlockRedstoneTorch(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Redstone Torch"; - } - - @Override - public int getId() { - return REDSTONE_TORCH; - } - - @Override - public int getLightLevel() { - return 7; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (!super.place(item, block, target, face, fx, fy, fz, player)) { - return false; - } - - checkState(); - - return true; - } - - @Override - public int getWeakPower(BlockFace side) { - return getBlockFace() != side ? 15 : 0; - } - - @Override - public int getStrongPower(BlockFace side) { - return side == BlockFace.DOWN ? this.getWeakPower(side) : 0; - } - - @Override - public boolean onBreak(Item item) { - super.onBreak(item); - - Vector3 pos = getLocation(); - - BlockFace face = getBlockFace().getOpposite(); - - for (BlockFace side : BlockFace.values()) { - if (side == face) { - continue; - } - - this.level.updateAroundRedstone(pos.getSide(side), null); - } - return true; - } - - @Override - public int onUpdate(int type) { - if (super.onUpdate(type) == 0) { - if (type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_REDSTONE) { - this.level.scheduleUpdate(this, tickRate()); - } else if (type == Level.BLOCK_UPDATE_SCHEDULED) { - RedstoneUpdateEvent ev = new RedstoneUpdateEvent(this); - getLevel().getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return 0; - } - - if (checkState()) { - return 1; - } - } - } - - return 0; - } - - protected boolean checkState() { - if (isPoweredFromSide()) { - BlockFace face = getBlockFace().getOpposite(); - Vector3 pos = getLocation(); - - this.level.setBlock(pos, Block.get(UNLIT_REDSTONE_TORCH, getDamage()), false, true); - - for (BlockFace side : BlockFace.values()) { - if (side == face) { - continue; - } - - this.level.updateAroundRedstone(pos.getSide(side), null); - } - - return true; - } - - return false; - } - - protected boolean isPoweredFromSide() { - BlockFace face = getBlockFace().getOpposite(); - return this.level.isSidePowered(this.getLocation().getSide(face), face); - } - @Override - public int tickRate() { - return 2; - } - - @Override - public boolean isPowerSource() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneTorchUnlit.java b/src/main/java/cn/nukkit/block/BlockRedstoneTorchUnlit.java deleted file mode 100644 index 33bd74173..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneTorchUnlit.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.event.redstone.RedstoneUpdateEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; - -/** - * Created by CreeperFace on 10.4.2017. - */ -public class BlockRedstoneTorchUnlit extends BlockTorch { - - public BlockRedstoneTorchUnlit() { - this(0); - } - - public BlockRedstoneTorchUnlit(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Unlit Redstone Torch"; - } - - @Override - public int getId() { - return UNLIT_REDSTONE_TORCH; - } - - @Override - public int getLightLevel() { - return 0; - } - - @Override - public Item toItem() { - return new ItemBlock(Block.get(REDSTONE_TORCH)); - } - - @Override - public int onUpdate(int type) { - if (super.onUpdate(type) == 0) { - if (type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_REDSTONE) { - this.level.scheduleUpdate(this, tickRate()); - } else if (type == Level.BLOCK_UPDATE_SCHEDULED) { - RedstoneUpdateEvent ev = new RedstoneUpdateEvent(this); - getLevel().getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return 0; - } - - if (checkState()) { - return 1; - } - } - } - - return 0; - } - - protected boolean checkState() { - BlockFace face = getBlockFace().getOpposite(); - Vector3 pos = getLocation(); - - if (!this.level.isSidePowered(pos.getSide(face), face)) { - this.level.setBlock(pos, Block.get(REDSTONE_TORCH, getDamage()), false, true); - - for (BlockFace side : BlockFace.values()) { - if (side == face) { - continue; - } - - this.level.updateAroundRedstone(pos.getSide(side), null); - } - return true; - } - - return false; - } - - @Override - public int tickRate() { - return 2; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockRedstoneWire.java b/src/main/java/cn/nukkit/block/BlockRedstoneWire.java deleted file mode 100644 index 5773fa217..000000000 --- a/src/main/java/cn/nukkit/block/BlockRedstoneWire.java +++ /dev/null @@ -1,325 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.block.BlockRedstoneEvent; -import cn.nukkit.event.redstone.RedstoneUpdateEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemRedstone; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockFace.Plane; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; - -import java.util.EnumSet; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockRedstoneWire extends BlockFlowable { - - private boolean canProvidePower = true; - - public BlockRedstoneWire() { - this(0); - } - - public BlockRedstoneWire(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Redstone Wire"; - } - - @Override - public int getId() { - return REDSTONE_WIRE; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (face != BlockFace.UP || !canBePlacedOn(target)) { - return false; - } - - this.getLevel().setBlock(block, this, true, false); - this.calculateCurrentChanges(true, true); - Vector3 pos = getLocation(); - - for (BlockFace blockFace : Plane.VERTICAL) { - this.level.updateAroundRedstone(pos.getSide(blockFace), blockFace.getOpposite()); - } - - for (BlockFace blockFace : Plane.VERTICAL) { - this.updateAround(pos.getSide(blockFace), blockFace.getOpposite()); - } - - for (BlockFace blockFace : Plane.HORIZONTAL) { - Vector3 v = pos.getSide(blockFace); - - if (this.level.getBlock(v).isNormalBlock()) { - this.updateAround(v.up(), BlockFace.DOWN); - } else { - this.updateAround(v.down(), BlockFace.UP); - } - } - return true; - } - - private void updateAround(Vector3 pos, BlockFace face) { - if (this.level.getBlock(pos).getId() == Block.REDSTONE_WIRE) { - this.level.updateAroundRedstone(pos, face); - - for (BlockFace side : BlockFace.values()) { - this.level.updateAroundRedstone(pos.getSide(side), side.getOpposite()); - } - } - } - - private void calculateCurrentChanges(boolean force, boolean stillExists) { - Vector3 pos = this.getLocation(); - - int meta = this.getDamage(); - int maxStrength = meta; - this.canProvidePower = false; - int power = this.getIndirectPower(); - - this.canProvidePower = true; - - if (power > 0 && power > maxStrength - 1) { - maxStrength = power; - } - - int strength = 0; - - for (BlockFace face : Plane.HORIZONTAL) { - Vector3 v = pos.getSide(face); - - if (v.getX() == this.getX() && v.getZ() == this.getZ()) { - continue; - } - - - strength = this.getMaxCurrentStrength(v, strength); - - boolean vNormal = this.level.getBlock(v).isNormalBlock(); - - if (vNormal && !this.level.getBlock(pos.up()).isNormalBlock()) { - strength = this.getMaxCurrentStrength(v.up(), strength); - } else if (!vNormal) { - strength = this.getMaxCurrentStrength(v.down(), strength); - } - } - - if (strength > maxStrength) { - maxStrength = strength - 1; - } else if (maxStrength > 0) { - --maxStrength; - } else { - maxStrength = 0; - } - - if (power > maxStrength - 1) { - maxStrength = power; - } else if (power < maxStrength && strength <= maxStrength) { - maxStrength = Math.max(power, strength - 1); - } - - if (meta != maxStrength) { - if (stillExists) { - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, meta, maxStrength)); - - this.setDamage(maxStrength); - this.level.setBlock(this, this, false, false); - } - - this.level.updateAroundRedstone(this, null); - for (BlockFace face : BlockFace.values()) { - this.level.updateAroundRedstone(pos.getSide(face), face.getOpposite()); - } - } else if (force) { - for (BlockFace face : BlockFace.values()) { - this.level.updateAroundRedstone(pos.getSide(face), face.getOpposite()); - } - } - } - - private int getMaxCurrentStrength(Vector3 pos, int maxStrength) { - if (this.level.getBlockIdAt(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ()) != REDSTONE_WIRE) { - return maxStrength; - } else { - int strength = this.level.getBlockDataAt(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ()); - return Math.max(strength, maxStrength); - } - } - - @Override - public boolean onBreak(Item item) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - - Vector3 pos = getLocation(); - - this.calculateCurrentChanges(false, false); - - for (BlockFace blockFace : BlockFace.values()) { - this.level.updateAroundRedstone(pos.getSide(blockFace), null); - } - - for (BlockFace blockFace : Plane.HORIZONTAL) { - Vector3 v = pos.getSide(blockFace); - - if (this.level.getBlock(v).isNormalBlock()) { - this.updateAround(v.up(), BlockFace.DOWN); - } else { - this.updateAround(v.down(), BlockFace.UP); - } - } - return true; - } - - @Override - public Item toItem() { - return new ItemRedstone(); - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - @Override - public int onUpdate(int type) { - if (type != Level.BLOCK_UPDATE_NORMAL && type != Level.BLOCK_UPDATE_REDSTONE) { - return 0; - } - - if (type == Level.BLOCK_UPDATE_NORMAL && !this.canBePlacedOn(this.getLocation().down())) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - - // Redstone event - RedstoneUpdateEvent ev = new RedstoneUpdateEvent(this); - getLevel().getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return 0; - } - - this.calculateCurrentChanges(false, true); - - return Level.BLOCK_UPDATE_REDSTONE; - } - - public boolean canBePlacedOn(Vector3 v) { - Block b = this.level.getBlock(v); - - return (b.isSolid() && !b.isTransparent() && b.getId() != GLOWSTONE) || b.getId() == HOPPER_BLOCK; - } - - public int getStrongPower(BlockFace side) { - return !this.canProvidePower ? 0 : getWeakPower(side); - } - - public int getWeakPower(BlockFace side) { - if (!this.canProvidePower) { - return 0; - } else { - int power = this.getDamage(); - - if (power == 0) { - return 0; - } else if (side == BlockFace.UP) { - return power; - } else { - EnumSet enumset = EnumSet.noneOf(BlockFace.class); - - for (BlockFace face : Plane.HORIZONTAL) { - if (this.isPowerSourceAt(face)) { - enumset.add(face); - } - } - - if (side.getAxis().isHorizontal() && enumset.isEmpty()) { - return power; - } else if (enumset.contains(side) && !enumset.contains(side.rotateYCCW()) && !enumset.contains(side.rotateY())) { - return power; - } else { - return 0; - } - } - } - } - - private boolean isPowerSourceAt(BlockFace side) { - Vector3 pos = getLocation(); - Vector3 v = pos.getSide(side); - Block block = this.level.getBlock(v); - boolean flag = block.isNormalBlock(); - boolean flag1 = this.level.getBlock(pos.up()).isNormalBlock(); - return !flag1 && flag && canConnectUpwardsTo(this.level, v.up()) || (canConnectTo(block, side) || !flag && canConnectUpwardsTo(this.level, block.down())); - } - - protected static boolean canConnectUpwardsTo(Level level, Vector3 pos) { - return canConnectUpwardsTo(level.getBlock(pos)); - } - - protected static boolean canConnectUpwardsTo(Block block) { - return canConnectTo(block, null); - } - - protected static boolean canConnectTo(Block block, BlockFace side) { - if (block.getId() == Block.REDSTONE_WIRE) { - return true; - } else if (BlockRedstoneDiode.isDiode(block)) { - BlockFace face = ((BlockRedstoneDiode) block).getFacing(); - return face == side || face.getOpposite() == side; - } else { - return block.isPowerSource() && side != null; - } - } - - @Override - public boolean isPowerSource() { - return this.canProvidePower; - } - - private int getIndirectPower() { - int power = 0; - Vector3 pos = getLocation(); - - for (BlockFace face : BlockFace.values()) { - int blockPower = this.getIndirectPower(pos.getSide(face), face); - - if (blockPower >= 15) { - return 15; - } - - if (blockPower > power) { - power = blockPower; - } - } - - return power; - } - - private int getIndirectPower(Vector3 pos, BlockFace face) { - Block block = this.level.getBlock(pos); - if (block.getId() == Block.REDSTONE_WIRE) { - return 0; - } - return block.isNormalBlock() ? getStrongPower(pos.getSide(face), face) : block.getWeakPower(face); - } - - private int getStrongPower(Vector3 pos, BlockFace direction) { - Block block = this.level.getBlock(pos); - - if (block.getId() == Block.REDSTONE_WIRE) { - return 0; - } - - return block.getStrongPower(direction); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockReserved6.java b/src/main/java/cn/nukkit/block/BlockReserved6.java deleted file mode 100644 index 3eee7cc08..000000000 --- a/src/main/java/cn/nukkit/block/BlockReserved6.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.block; - -/** - * Created by PetteriM1 - */ -public class BlockReserved6 extends BlockSolid { - - @Override - public int getId() { - return RESERVED6; - } - - @Override - public String getName() { - return "reserved6"; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSand.java b/src/main/java/cn/nukkit/block/BlockSand.java deleted file mode 100644 index 9188a17f3..000000000 --- a/src/main/java/cn/nukkit/block/BlockSand.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockSand extends BlockFallableMeta { - - public static final int DEFAULT = 0; - public static final int RED = 1; - - public BlockSand() { - this(0); - } - - public BlockSand(int meta) { - super(meta); - } - - @Override - public int getId() { - return SAND; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - public String getName() { - if (this.getDamage() == 0x01) { - return "Red Sand"; - } - - return "Sand"; - } - - @Override - public BlockColor getColor() { - if (this.getDamage() == 0x01) { - return BlockColor.ORANGE_BLOCK_COLOR; - } - - return BlockColor.SAND_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSandstone.java b/src/main/java/cn/nukkit/block/BlockSandstone.java deleted file mode 100644 index 13a535d73..000000000 --- a/src/main/java/cn/nukkit/block/BlockSandstone.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockSandstone extends BlockSolidMeta { - - public static final int NORMAL = 0; - public static final int CHISELED = 1; - public static final int SMOOTH = 2; - - public BlockSandstone() { - this(0); - } - - public BlockSandstone(int meta) { - super(meta); - } - - @Override - public int getId() { - return SANDSTONE; - } - - @Override - public double getHardness() { - return 0.8; - } - - @Override - public double getResistance() { - return 4; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Sandstone", - "Chiseled Sandstone", - "Smooth Sandstone", - "" - }; - - return names[this.getDamage() & 0x03]; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x03); - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSapling.java b/src/main/java/cn/nukkit/block/BlockSapling.java deleted file mode 100644 index 513128153..000000000 --- a/src/main/java/cn/nukkit/block/BlockSapling.java +++ /dev/null @@ -1,232 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.generator.object.BasicGenerator; -import cn.nukkit.level.generator.object.tree.*; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockSapling extends BlockFlowable { - - public static final int OAK = 0; - public static final int SPRUCE = 1; - public static final int BIRCH = 2; - public static final int JUNGLE = 3; - public static final int ACACIA = 4; - public static final int DARK_OAK = 5; - public static final int BIRCH_TALL = 10; - - public BlockSapling() { - this(0); - } - - public BlockSapling(int meta) { - super(meta); - } - - @Override - public int getId() { - return SAPLING; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Oak Sapling", - "Spruce Sapling", - "Birch Sapling", - "Jungle Sapling", - "Acacia Sapling", - "Dark Oak Sapling", - "", - "" - }; - return names[this.getDamage() & 0x07]; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (down.getId() == Block.GRASS || down.getId() == Block.DIRT || down.getId() == Block.FARMLAND || down.getId() == Block.PODZOL) { - this.getLevel().setBlock(block, this, true, true); - return true; - } - - return false; - } - - @Override - public boolean canBeActivated() { - return true; - } - - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.DYE && item.getDamage() == 0x0F) { // Bone meal - if (player != null && !player.isCreative()) { - item.count--; - } - - this.level.addParticle(new BoneMealParticle(this)); - if (ThreadLocalRandom.current().nextFloat() >= 0.45) { - return true; - } - - BasicGenerator generator = null; - boolean bigTree = false; - - int x = 0; - int z = 0; - - switch (this.getDamage()) { - case JUNGLE: - loop: - for (x = 0; x >= -1; --x) { - for (z = 0; z >= -1; --z) { - if (this.findSaplings(x, z, JUNGLE)) { - generator = new ObjectJungleBigTree(10, 20, Block.get(WOOD, BlockWood.JUNGLE), Block.get(LEAVES, BlockLeaves.JUNGLE)); - bigTree = true; - break loop; - } - } - } - - if (!bigTree) { - generator = new NewJungleTree(4, 7); - } - break; - case ACACIA: - generator = new ObjectSavannaTree(); - break; - case DARK_OAK: - bigTree = false; - - loop: - for (x = 0; x >= -1; --x) { - for (z = 0; z >= -1; --z) { - if (this.findSaplings(x, z, DARK_OAK)) { - generator = new ObjectDarkOakTree(); - bigTree = true; - break loop; - } - } - } - - if (!bigTree) { - return false; - } - break; - case SPRUCE: - bigTree = false; - - loop: - for (x = 0; x >= -1; --x) { - for (z = 0; z >= -1; --z) { - if (this.findSaplings(x, z, SPRUCE)) { - new ObjectBigSpruceTree(0.5f, 5, true).placeObject(this.level, (int) this.x, (int) this.y, (int) this.z, new NukkitRandom()); - bigTree = true; - break loop; - } - } - } - - if (!bigTree) { - ObjectTree.growTree(this.getLevel(), (int) this.x, (int) this.y, (int) this.z, new NukkitRandom(), this.getDamage() & 0x07); - } else { - Block air = Block.get(BlockID.AIR); - this.level.setBlock(this.add(this.x, 0, this.z), air, true, false); - this.level.setBlock(this.add(this.x + 1, 0, this.z), air, true, false); - this.level.setBlock(this.add(this.x, 0, this.z + 1), air, true, false); - this.level.setBlock(this.add(this.x + 1, 0, this.z + 1), air, true, false); - } - - return true; - default: - ObjectTree.growTree(this.getLevel(), (int) this.x, (int) this.y, (int) this.z, new NukkitRandom(), this.getDamage() & 0x07); - return true; - } - - Block air = Block.get(BlockID.AIR); - - if (bigTree) { - this.level.setBlock(this.add(x, 0, z), air, true, false); - this.level.setBlock(this.add(x + 1, 0, z), air, true, false); - this.level.setBlock(this.add(x, 0, z + 1), air, true, false); - this.level.setBlock(this.add(x + 1, 0, z + 1), air, true, false); - } else { - this.level.setBlock(this, air, true, false); - } - - if (!generator.generate(this.level, new NukkitRandom(), this.add(x, 0, z))) { - if (bigTree) { - this.level.setBlock(this.add(x, 0, z), this, true, false); - this.level.setBlock(this.add(x + 1, 0, z), this, true, false); - this.level.setBlock(this.add(x, 0, z + 1), this, true, false); - this.level.setBlock(this.add(x + 1, 0, z + 1), this, true, false); - } else { - this.level.setBlock(this, this, true, false); - } - } - return true; - } - this.getLevel().loadChunk((int) this.x >> 4, (int) this.z >> 4); - return false; - } - - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().isTransparent()) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { //Growth - if (Utils.rand(1, 7) == 1) { - if ((this.getDamage() & 0x08) == 0x08) { - if ((this.getDamage() & 0x07) == ACACIA) { - this.level.setBlock(this, Block.get(BlockID.AIR), true, false); - new ObjectSavannaTree().generate(level, new NukkitRandom(), this); - } else { - ObjectTree.growTree(this.getLevel(), (int) this.x, (int) this.y, (int) this.z, new NukkitRandom(), this.getDamage() & 0x07); - } - } else { - this.setDamage(this.getDamage() | 0x08); - this.getLevel().setBlock(this, this, true); - return Level.BLOCK_UPDATE_RANDOM; - } - } else { - return Level.BLOCK_UPDATE_RANDOM; - } - } - return 1; - } - - private boolean findSaplings(int x, int z, int type) { - return this.isSameType(this.add(x, 0, z), type) && this.isSameType(this.add(x + 1, 0, z), type) && this.isSameType(this.add(x, 0, z + 1), type) && this.isSameType(this.add(x + 1, 0, z + 1), type); - } - - public boolean isSameType(Vector3 pos, int type) { - Block block = this.level.getBlock(pos); - return block.getId() == SAPLING && block.getDamage() == type; - } - - @Override - public Item toItem() { - return Item.get(BlockID.SAPLING, this.getDamage() & 0x7); - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSeaLantern.java b/src/main/java/cn/nukkit/block/BlockSeaLantern.java deleted file mode 100644 index 57b73c9db..000000000 --- a/src/main/java/cn/nukkit/block/BlockSeaLantern.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemPrismarineCrystals; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -public class BlockSeaLantern extends BlockTransparent { - - @Override - public String getName() { - return "Sea Lantern"; - } - - @Override - public int getId() { - return SEA_LANTERN; - } - - @Override - public double getResistance() { - return 1.5; - } - - @Override - public double getHardness() { - return 0.3; - } - - @Override - public int getLightLevel() { - return 15; - } - - @Override - public Item[] getDrops(Item item) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[]{ - new ItemPrismarineCrystals(0, Utils.random.nextInt(2, 4)) - }; - } - - @Override - public BlockColor getColor() { - return BlockColor.QUARTZ_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockShulkerBox.java b/src/main/java/cn/nukkit/block/BlockShulkerBox.java deleted file mode 100644 index 2d0710cf2..000000000 --- a/src/main/java/cn/nukkit/block/BlockShulkerBox.java +++ /dev/null @@ -1,155 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityShulkerBox; -import cn.nukkit.inventory.ShulkerBoxInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created by PetteriM1 - */ -public class BlockShulkerBox extends BlockTransparentMeta { - - public BlockShulkerBox() { - this(0); - } - - public BlockShulkerBox(int meta) { - super(meta); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public int getId() { - return SHULKER_BOX; - } - - @Override - public String getName() { - return this.getDyeColor().getName() + " Shulker Box"; - } - - @Override - public double getHardness() { - return 2.5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item toItem() { - ItemBlock item = new ItemBlock(this, this.getDamage(), 1); - - BlockEntityShulkerBox t = (BlockEntityShulkerBox) this.getLevel().getBlockEntity(this); - - if (t != null) { - ShulkerBoxInventory i = t.getRealInventory(); - - if (!i.isEmpty()) { - - CompoundTag nbt = item.getNamedTag(); - if (nbt == null) - nbt = new CompoundTag(""); - - ListTag items = new ListTag<>(); - - for (int it = 0; it < i.getSize(); it++) { - if (i.getItem(it).getId() != Item.AIR) { - CompoundTag d = NBTIO.putItemHelper(i.getItem(it), it); - items.add(d); - } - } - - nbt.put("Items", items); - - item.setCompoundTag(nbt); - } - - if (t.hasName()) { - item.setCustomName(t.getName()); - } - } - - return item; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.getLevel().setBlock(block, this, true, true); - CompoundTag nbt = BlockEntity.getDefaultCompound(this, BlockEntity.SHULKER_BOX) - .putByte("facing", face.getIndex()); - - if (item.hasCustomName()) { - nbt.putString("CustomName", item.getCustomName()); - } - - CompoundTag t = item.getNamedTag(); - - if (t != null) { - if (t.contains("Items")) { - nbt.putList(t.getList("Items")); - } - } - - BlockEntity.createBlockEntity(BlockEntity.SHULKER_BOX, this.getChunk(), nbt); - return true; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (player != null) { - BlockEntity t = this.getLevel().getBlockEntity(this); - BlockEntityShulkerBox box; - if (t instanceof BlockEntityShulkerBox) { - box = (BlockEntityShulkerBox) t; - } else { - CompoundTag nbt = BlockEntity.getDefaultCompound(this, BlockEntity.SHULKER_BOX); - box = (BlockEntityShulkerBox) BlockEntity.createBlockEntity(BlockEntity.SHULKER_BOX, this.getChunk(), nbt); - } - - Block block = this.getSide(BlockFace.fromIndex(box.namedTag.getByte("facing"))); - if (!(block instanceof BlockAir) && !(block instanceof BlockLiquid) && !(block instanceof BlockFlowable)) { - return true; - } - - player.addWindow(box.getInventory()); - } - - return true; - } - - @Override - public BlockColor getColor() { - return this.getDyeColor().getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(this.getDamage()); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockSignPost.java b/src/main/java/cn/nukkit/block/BlockSignPost.java deleted file mode 100644 index 174ea1ba4..000000000 --- a/src/main/java/cn/nukkit/block/BlockSignPost.java +++ /dev/null @@ -1,129 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSign; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * @author Nukkit Project Team - */ -public class BlockSignPost extends BlockTransparentMeta implements Faceable { - - public BlockSignPost() { - this(0); - } - - public BlockSignPost(int meta) { - super(meta); - } - - @Override - public int getId() { - return SIGN_POST; - } - - @Override - public double getHardness() { - return 1; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - public String getName() { - return "Sign Post"; - } - - @Override - public AxisAlignedBB getBoundingBox() { - return null; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (face != BlockFace.DOWN) { - CompoundTag nbt = new CompoundTag() - .putString("id", BlockEntity.SIGN) - .putInt("x", (int) block.x) - .putInt("y", (int) block.y) - .putInt("z", (int) block.z) - .putString("Text1", "") - .putString("Text2", "") - .putString("Text3", "") - .putString("Text4", ""); - - if (face == BlockFace.UP) { - setDamage((int) Math.floor(((player.yaw + 180) * 16 / 360) + 0.5) & 0x0f); - getLevel().setBlock(block, Block.get(SIGN_POST, getDamage()), true); - } else { - setDamage(face.getIndex()); - getLevel().setBlock(block, Block.get(WALL_SIGN, getDamage()), true); - } - - if (player != null) { - nbt.putString("Creator", player.getUniqueId().toString()); - } - - if (item.hasCustomBlockData()) { - for (Tag aTag : item.getCustomBlockData().getAllTags()) { - nbt.put(aTag.getName(), aTag); - } - } - - BlockEntity.createBlockEntity(BlockEntity.SIGN, this.level.getChunk(block.getChunkX(), block.getChunkZ()), nbt); - return true; - } - - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (down().getId() == Block.AIR) { - getLevel().useBreakOn(this); - - return Level.BLOCK_UPDATE_NORMAL; - } - } - - return 0; - } - - @Override - public Item toItem() { - return new ItemSign(); - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromIndex(this.getDamage() & 0x07); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSkull.java b/src/main/java/cn/nukkit/block/BlockSkull.java deleted file mode 100644 index 7db8c5a98..000000000 --- a/src/main/java/cn/nukkit/block/BlockSkull.java +++ /dev/null @@ -1,125 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSkull; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.BlockColor; - -/** - * @author Justin - */ -public class BlockSkull extends BlockTransparentMeta { - - public BlockSkull() { - this(0); - } - - public BlockSkull(int meta) { - super(meta); - } - - @Override - public int getId() { - return SKULL_BLOCK; - } - - @Override - public double getHardness() { - return 1; - } - - @Override - public double getResistance() { - return 5; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - public String getName() { - int itemMeta = 0; - - if (this.level != null) { - BlockEntity blockEntity = getLevel().getBlockEntity(this); - if (blockEntity != null) itemMeta = blockEntity.namedTag.getByte("SkullType"); - } - - return ItemSkull.getItemSkullName(itemMeta); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - switch (face) { - case NORTH: - case SOUTH: - case EAST: - case WEST: - case UP: - this.setDamage(face.getIndex()); - break; - case DOWN: - default: - return false; - } - this.getLevel().setBlock(block, this, true, true); - - CompoundTag nbt = new CompoundTag() - .putString("id", BlockEntity.SKULL) - .putByte("SkullType", item.getDamage()) - .putInt("x", block.getFloorX()) - .putInt("y", block.getFloorY()) - .putInt("z", block.getFloorZ()) - .putByte("Rot", (int) Math.floor((player.yaw * 16 / 360) + 0.5) & 0x0f); - if (item.hasCustomBlockData()) { - for (Tag aTag : item.getCustomBlockData().getAllTags()) { - nbt.put(aTag.getName(), aTag); - } - } - - // HACK - Server.getInstance().getScheduler().scheduleDelayedTask(() -> { - BlockEntity.createBlockEntity(BlockEntity.SKULL, this.getLevel().getChunk(block.getChunkX(), block.getChunkZ()), nbt); - }, 2); - - // TODO: 2016/2/3 SPAWN WITHER - - return true; - } - - @Override - public Item[] getDrops(Item item) { - BlockEntity blockEntity = getLevel().getBlockEntity(this); - int dropMeta = 0; - if (blockEntity != null) dropMeta = blockEntity.namedTag.getByte("SkullType"); - return new Item[]{ - new ItemSkull(dropMeta) - }; - } - - @Override - public Item toItem() { - BlockEntity blockEntity = getLevel().getBlockEntity(this); - int itemMeta = 0; - if (blockEntity != null) itemMeta = blockEntity.namedTag.getByte("SkullType"); - return new ItemSkull(itemMeta); - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSlab.java b/src/main/java/cn/nukkit/block/BlockSlab.java deleted file mode 100644 index 340e3a9fb..000000000 --- a/src/main/java/cn/nukkit/block/BlockSlab.java +++ /dev/null @@ -1,110 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockSlab extends BlockTransparentMeta { - - protected final int doubleSlab; - - public BlockSlab(int meta, int doubleSlab) { - super(meta); - this.doubleSlab = doubleSlab; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - if ((this.getDamage() & 0x08) > 0) { - return new AxisAlignedBB( - this.x, - this.y + 0.5, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } else { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 0.5, - this.z + 1 - ); - } - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return getToolType() < ItemTool.TYPE_AXE ? 30 : 15; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(this.getDamage() & 0x07); - if (face == BlockFace.DOWN) { - if (target instanceof BlockSlab && (target.getDamage() & 0x08) == 0x08 && (target.getDamage() & 0x07) == (this.getDamage() & 0x07)) { - this.getLevel().setBlock(target, Block.get(doubleSlab, this.getDamage()), true); - - return true; - } else if (block instanceof BlockSlab && (block.getDamage() & 0x07) == (this.getDamage() & 0x07)) { - this.getLevel().setBlock(block, Block.get(doubleSlab, this.getDamage()), true); - - return true; - } else { - this.setDamage(this.getDamage() | 0x08); - } - } else if (face == BlockFace.UP) { - if (target instanceof BlockSlab && (target.getDamage() & 0x08) == 0 && (target.getDamage() & 0x07) == (this.getDamage() & 0x07)) { - this.getLevel().setBlock(target, Block.get(doubleSlab, this.getDamage()), true); - - return true; - } else if (block instanceof BlockSlab && (block.getDamage() & 0x07) == (this.getDamage() & 0x07)) { - this.getLevel().setBlock(block, Block.get(doubleSlab, this.getDamage()), true); - - return true; - } - //TODO: check for collision - } else { - if (block instanceof BlockSlab) { - if ((block.getDamage() & 0x07) == (this.getDamage() & 0x07)) { - this.getLevel().setBlock(block, Block.get(doubleSlab, this.getDamage()), true); - - return true; - } - - return false; - } else { - if (fy > 0.5) { - this.setDamage(this.getDamage() | 0x08); - } - } - } - - if (block instanceof BlockSlab && (target.getDamage() & 0x07) != (this.getDamage() & 0x07)) { - return false; - } - this.getLevel().setBlock(block, this, true, true); - - return true; - } - - @Override - public boolean isTransparent() { - //HACK: Fix unable to place many blocks on slabs - return (this.getDamage() & 0x08) <= 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSlabRedSandstone.java b/src/main/java/cn/nukkit/block/BlockSlabRedSandstone.java deleted file mode 100644 index 768b5a35f..000000000 --- a/src/main/java/cn/nukkit/block/BlockSlabRedSandstone.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.utils.BlockColor; - -/** - * Created by CreeperFace on 26. 11. 2016. - */ -public class BlockSlabRedSandstone extends BlockSlab { - - public static final int RED_SANDSTONE = 0; - public static final int PURPUR = 1; - - public BlockSlabRedSandstone() { - this(RED_SANDSTONE); - } - - public BlockSlabRedSandstone(int meta) { - super(meta, DOUBLE_RED_SANDSTONE_SLAB); - } - - @Override - public int getId() { - return RED_SANDSTONE_SLAB; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Red Sandstone", - "Purpur", - "", - "", - "", - "", - "", - "" - }; - - return ((this.getDamage() & 0x08) > 0 ? "Upper " : "") + names[this.getDamage() & 0x07] + " Slab"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x07); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.ORANGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSlabStone.java b/src/main/java/cn/nukkit/block/BlockSlabStone.java deleted file mode 100644 index c66a98506..000000000 --- a/src/main/java/cn/nukkit/block/BlockSlabStone.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created by CreeperFace on 26. 11. 2016. - */ -public class BlockSlabStone extends BlockSlab { - - public static final int STONE = 0; - public static final int SANDSTONE = 1; - public static final int WOODEN = 2; - public static final int COBBLESTONE = 3; - public static final int BRICK = 4; - public static final int STONE_BRICK = 5; - public static final int QUARTZ = 6; - public static final int NETHER_BRICK = 7; - - public BlockSlabStone() { - this(0); - } - - public BlockSlabStone(int meta) { - super(meta, DOUBLE_STONE_SLAB); - } - - @Override - public int getId() { - return STONE_SLAB; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Stone", - "Sandstone", - "Wooden", - "Cobblestone", - "Brick", - "Stone Brick", - "Quartz", - "Nether Brick" - }; - - return ((this.getDamage() & 0x08) > 0 ? "Upper " : "") + names[this.getDamage() & 0x07] + " Slab"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x07); - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public BlockColor getColor() { - switch (this.getDamage() & 0x07) { - case NETHER_BRICK: - return BlockColor.NETHERRACK_BLOCK_COLOR; - default: - case STONE: - case COBBLESTONE: - case BRICK: - case STONE_BRICK: - return BlockColor.STONE_BLOCK_COLOR; - case SANDSTONE: - return BlockColor.SAND_BLOCK_COLOR; - case WOODEN: - return BlockColor.WOOD_BLOCK_COLOR; - case QUARTZ: - return BlockColor.QUARTZ_BLOCK_COLOR; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSlabWood.java b/src/main/java/cn/nukkit/block/BlockSlabWood.java deleted file mode 100644 index b0fc413c8..000000000 --- a/src/main/java/cn/nukkit/block/BlockSlabWood.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockSlabWood extends BlockSlab { - - public BlockSlabWood() { - this(0); - } - - public BlockSlabWood(int meta) { - super(meta, DOUBLE_WOODEN_SLAB); - } - - @Override - public String getName() { - String[] names = new String[]{ - "Oak", - "Spruce", - "Birch", - "Jungle", - "Acacia", - "Dark Oak", - "", - "" - }; - return (((this.getDamage() & 0x08) == 0x08) ? "Upper " : "") + names[this.getDamage() & 0x07] + " Wooden Slab"; - } - - @Override - public int getId() { - return WOOD_SLAB; - } - - @Override - public int getBurnChance() { - return 5; - } - - @Override - public int getBurnAbility() { - return 20; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - toItem() - }; - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x07); - } - - @Override - public BlockColor getColor() { - switch (getDamage() & 0x07) { - default: - case 0: //OAK - return BlockColor.WOOD_BLOCK_COLOR; - case 1: //SPRUCE - return BlockColor.SPRUCE_BLOCK_COLOR; - case 2: //BIRCH - return BlockColor.SAND_BLOCK_COLOR; - case 3: //JUNGLE - return BlockColor.DIRT_BLOCK_COLOR; - case 4: //ACACIA - return BlockColor.ORANGE_BLOCK_COLOR; - case 5: //DARK OAK - return BlockColor.BROWN_BLOCK_COLOR; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSlime.java b/src/main/java/cn/nukkit/block/BlockSlime.java deleted file mode 100644 index 19ea18499..000000000 --- a/src/main/java/cn/nukkit/block/BlockSlime.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * Created by Pub4Game on 21.02.2016. - */ -public class BlockSlime extends BlockSolid { - - @Override - public double getHardness() { - return 0; - } - - @Override - public String getName() { - return "Slime Block"; - } - - @Override - public int getId() { - return SLIME_BLOCK; - } - - @Override - public double getResistance() { - return 0; - } - - @Override - public BlockColor getColor() { - return BlockColor.GREEN_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSnow.java b/src/main/java/cn/nukkit/block/BlockSnow.java deleted file mode 100644 index 17250132a..000000000 --- a/src/main/java/cn/nukkit/block/BlockSnow.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSnowball; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.utils.BlockColor; - -public class BlockSnow extends BlockSolid { - - @Override - public String getName() { - return "Snow"; - } - - @Override - public int getId() { - return SNOW_BLOCK; - } - - @Override - public double getHardness() { - return 0.2; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isShovel() && item.getTier() >= ItemTool.TIER_WOODEN) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[]{ - new ItemSnowball(0, 4) - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.SNOW_BLOCK_COLOR; - } - - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.isShovel() && !Server.getInstance().suomiCraftPEMode()) { - item.useOn(this); - this.level.useBreakOn(this, item.clone().clearNamedTag(), null, true); - return true; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSnowLayer.java b/src/main/java/cn/nukkit/block/BlockSnowLayer.java deleted file mode 100644 index bbe0152a9..000000000 --- a/src/main/java/cn/nukkit/block/BlockSnowLayer.java +++ /dev/null @@ -1,185 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.block.BlockFadeEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSnowball; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/6 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockSnowLayer extends BlockFallableMeta { - - public BlockSnowLayer() { - this(0); - } - - public BlockSnowLayer(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Top Snow"; - } - - @Override - public int getId() { - return SNOW_LAYER; - } - - @Override - public double getHardness() { - return 0.1; - } - - @Override - public double getResistance() { - return 0.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - public boolean canBeReplaced() { - return (this.getDamage() & 0x7) != 0x7; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (this.canSurvive()) { - this.getLevel().setBlock(block, this, true); - - return true; - } - return false; - } - - private boolean canSurvive() { - Block below = this.down(); - return below.getId() != ICE && below.getId() != PACKED_ICE && below.getId() != ICE_FROSTED && (below.isSolid() || (this.getDamage() & 0x7) == 0x7); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if ((this.getDamage() & 0x7) != 0x7 || this.up().getId() != SNOW_LAYER) { - super.onUpdate(type); - } - - if (this.level.getBlockIdAt(this.getFloorX(), this.getFloorY(), this.getFloorZ()) == SNOW_LAYER && !this.canSurvive()) { - this.level.useBreakOn(this, null, null, true); - if (this.level.getGameRules().getBoolean(GameRule.DO_TILE_DROPS)) { - this.level.dropItem(this, this.toItem()); - } - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if (this.getLevel().getBlockLightAt((int) this.x, (int) this.y, (int) this.z) >= 10) { - BlockFadeEvent event = new BlockFadeEvent(this, (this.getDamage() & 0x7) > 0 ? get(SNOW_LAYER, this.getDamage() - 1) : get(AIR)); - level.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - level.setBlock(this, event.getNewState(), true); - } - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - @Override - public Item toItem() { - return new ItemSnowball(); - } - - @Override - public Item[] getDrops(Item item) { - if (item.isShovel() && item.getTier() >= ItemTool.TIER_WOODEN) { - Item drop = this.toItem(); - int height = this.getDamage() & 0x7; - drop.setCount(height < 3 ? 1 : height < 5 ? 2 : height == 7 ? 4 : 3); - return new Item[]{drop}; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return BlockColor.SNOW_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean isTransparent() { - return (this.getDamage() & 0x7) != 0x7; - } - - @Override - public boolean canBeFlowedInto() { - return true; - } - - @Override - public boolean isSolid() { - return (this.getDamage() & 0x7) == 0x7; - } - - @Override - public double getMaxY() { - int height = this.getDamage() & 0x7; - return height < 3 ? this.y : height == 7 ? this.y + 1 : this.y + 0.5; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.isShovel()) { - item.useOn(this); - this.level.useBreakOn(this, item.clone().clearNamedTag(), null, true); - return true; - } else if (item.getId() == SNOW_LAYER) { - if ((this.getDamage() & 0x7) != 0x7) { - this.setDamage(this.getDamage() + 1); - this.level.setBlock(this ,this, true); - - if (player != null && (player.gamemode & 0x1) == 0) { - item.count--; - } - return true; - } else { - this.level.setBlock(this ,this, true); - } - } - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - getMaxY(), - this.z + 1 - ); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSolid.java b/src/main/java/cn/nukkit/block/BlockSolid.java deleted file mode 100644 index 889be6f58..000000000 --- a/src/main/java/cn/nukkit/block/BlockSolid.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockSolid extends Block { - - protected BlockSolid() { - } - - @Override - public BlockColor getColor() { - return BlockColor.STONE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSolidMeta.java b/src/main/java/cn/nukkit/block/BlockSolidMeta.java deleted file mode 100644 index f650f403b..000000000 --- a/src/main/java/cn/nukkit/block/BlockSolidMeta.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -public abstract class BlockSolidMeta extends BlockMeta { - - protected BlockSolidMeta(int meta) { - super(meta); - } - - @Override - public BlockColor getColor() { - return BlockColor.STONE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSoulSand.java b/src/main/java/cn/nukkit/block/BlockSoulSand.java deleted file mode 100644 index 80ca0ca66..000000000 --- a/src/main/java/cn/nukkit/block/BlockSoulSand.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.entity.Entity; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.utils.BlockColor; - -/** - * Created by Pub4Game on 27.12.2015. - */ -public class BlockSoulSand extends BlockSolid { - - @Override - public String getName() { - return "Soul Sand"; - } - - @Override - public int getId() { - return SOUL_SAND; - } - - @Override - public double getHardness() { - return 0.5; - } - - @Override - public double getResistance() { - return 2.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHOVEL; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 0.875, - this.z + 1 - ); - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public void onEntityCollide(Entity entity) { - entity.motionX *= 0.4d; - entity.motionZ *= 0.4d; - } - - @Override - public BlockColor getColor() { - return BlockColor.BROWN_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSponge.java b/src/main/java/cn/nukkit/block/BlockSponge.java deleted file mode 100644 index 53ea8b81a..000000000 --- a/src/main/java/cn/nukkit/block/BlockSponge.java +++ /dev/null @@ -1,132 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.level.Level; -import cn.nukkit.level.Sound; -import cn.nukkit.level.particle.ExplodeParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.BlockColor; - -import java.util.ArrayDeque; -import java.util.Queue; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockSponge extends BlockSolidMeta { - - public static final int DRY = 0; - public static final int WET = 1; - - private static final String[] NAMES = new String[]{ - "Sponge", - "Wet sponge" - }; - - public BlockSponge() { - this(0); - } - - public BlockSponge(int meta) { - super(meta); - } - - @Override - public int getId() { - return SPONGE; - } - - @Override - public double getHardness() { - return 0.6; - } - - @Override - public double getResistance() { - return 3; - } - - @Override - public String getName() { - return NAMES[this.getDamage() & 0b1]; - } - - @Override - public BlockColor getColor() { - return BlockColor.CLOTH_BLOCK_COLOR; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_HOE; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (this.getDamage() == WET && level.getDimension() == Level.DIMENSION_NETHER) { - level.setBlock(block, Block.get(BlockID.SPONGE, DRY), true, true); - level.addSoundToViewers(block.getLocation(), Sound.RANDOM_FIZZ); - level.addParticle(new ExplodeParticle(block.add(0.5, 1, 0.5))); - return true; - } else if (this.getDamage() == DRY && block instanceof BlockWater && performWaterAbsorb(block)) { - level.setBlock(block, Block.get(BlockID.SPONGE, WET), true, true); - - for (int i = 0; i < 4; i++) { - LevelEventPacket packet = new LevelEventPacket(); - packet.evid = LevelEventPacket.EVENT_PARTICLE_DESTROY; - packet.x = (float) block.getX() + 0.5f; - packet.y = (float) block.getY() + 1f; - packet.z = (float) block.getZ() + 0.5f; - packet.data = GlobalBlockPalette.getOrCreateRuntimeId(ProtocolInfo.CURRENT_PROTOCOL, BlockID.WATER, 0); - level.addChunkPacket(getChunkX(), getChunkZ(), packet); - } - - return true; - } - - return super.place(item, block, target, face, fx, fy, fz, player); - } - - private boolean performWaterAbsorb(Block block) { - Queue entries = new ArrayDeque<>(); - - entries.add(new Entry(block, 0)); - - Entry entry; - int waterRemoved = 0; - while (waterRemoved < 64 && (entry = entries.poll()) != null) { - for (BlockFace face : BlockFace.values()) { - - Block faceBlock = entry.block.getSide(face); - if (faceBlock.getId() == BlockID.WATER || faceBlock.getId() == BlockID.STILL_WATER) { - this.level.setBlock(faceBlock, Block.get(BlockID.AIR)); - ++waterRemoved; - if (entry.distance < 6) { - entries.add(new Entry(faceBlock, entry.distance + 1)); - } - } else if (faceBlock.getId() == BlockID.AIR) { - if (entry.distance < 6) { - entries.add(new Entry(faceBlock, entry.distance + 1)); - } - } - } - } - return waterRemoved > 0; - } - - private static class Entry { - private final Block block; - private final int distance; - - public Entry(Block block, int distance) { - this.block = block; - this.distance = distance; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairs.java b/src/main/java/cn/nukkit/block/BlockStairs.java deleted file mode 100644 index 5f623e0c5..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairs.java +++ /dev/null @@ -1,145 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.Faceable; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockStairs extends BlockSolidMeta implements Faceable { - - private static final short[] faces = new short[]{2, 1, 3, 0}; - - protected BlockStairs(int meta) { - super(meta); - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - if ((this.getDamage() & 0x04) > 0) { - return new AxisAlignedBB( - this.x, - this.y + 0.5, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } else { - return new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 0.5, - this.z + 1 - ); - } - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(faces[player != null ? player.getDirection().getHorizontalIndex() : 0]); - if ((fy > 0.5 && face != BlockFace.UP) || face == BlockFace.DOWN) { - this.setDamage(this.getDamage() | 0x04); //Upside-down stairs - } - this.getLevel().setBlock(block, this, true, true); - - return true; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - Item item = super.toItem(); - item.setDamage(0); - return item; - } - - @Override - public boolean collidesWithBB(AxisAlignedBB bb) { - int damage = this.getDamage(); - int side = damage & 0x03; - double f = 0; - double f1 = 0.5; - double f2 = 0.5; - double f3 = 1; - if ((damage & 0x04) > 0) { - f = 0.5; - f1 = 1; - f2 = 0; - f3 = 0.5; - } - - if (bb.intersectsWith(new AxisAlignedBB( - this.x, - this.y + f, - this.z, - this.x + 1, - this.y + f1, - this.z + 1 - ))) { - return true; - } - - - if (side == 0) { - return bb.intersectsWith(new AxisAlignedBB( - this.x + 0.5, - this.y + f2, - this.z, - this.x + 1, - this.y + f3, - this.z + 1 - )); - } else if (side == 1) { - return bb.intersectsWith(new AxisAlignedBB( - this.x, - this.y + f2, - this.z, - this.x + 0.5, - this.y + f3, - this.z + 1 - )); - } else if (side == 2) { - return bb.intersectsWith(new AxisAlignedBB( - this.x, - this.y + f2, - this.z + 0.5, - this.x + 1, - this.y + f3, - this.z + 1 - )); - } else if (side == 3) { - return bb.intersectsWith(new AxisAlignedBB( - this.x, - this.y + f2, - this.z, - this.x + 1, - this.y + f3, - this.z + 0.5 - )); - } - - return false; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsAcacia.java b/src/main/java/cn/nukkit/block/BlockStairsAcacia.java deleted file mode 100644 index 78f31ba5c..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsAcacia.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockStairsAcacia extends BlockStairsWood { - - public BlockStairsAcacia() { - this(0); - } - - public BlockStairsAcacia(int meta) { - super(meta); - } - - @Override - public int getId() { - return ACACIA_WOOD_STAIRS; - } - - @Override - public String getName() { - return "Acacia Wood Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.ORANGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsBirch.java b/src/main/java/cn/nukkit/block/BlockStairsBirch.java deleted file mode 100644 index d24eff46b..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsBirch.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsBirch extends BlockStairsWood { - - public BlockStairsBirch() { - this(0); - } - - public BlockStairsBirch(int meta) { - super(meta); - } - - @Override - public int getId() { - return BIRCH_WOOD_STAIRS; - } - - @Override - public String getName() { - return "Birch Wood Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsBrick.java b/src/main/java/cn/nukkit/block/BlockStairsBrick.java deleted file mode 100644 index d73f6de54..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsBrick.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsBrick extends BlockStairs { - - public BlockStairsBrick() { - this(0); - } - - public BlockStairsBrick(int meta) { - super(meta); - } - - @Override - public int getId() { - return BRICK_STAIRS; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Brick Stairs"; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.RED_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsCobblestone.java b/src/main/java/cn/nukkit/block/BlockStairsCobblestone.java deleted file mode 100644 index 1497c3e46..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsCobblestone.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsCobblestone extends BlockStairs { - - public BlockStairsCobblestone() { - this(0); - } - - public BlockStairsCobblestone(int meta) { - super(meta); - } - - @Override - public int getId() { - return COBBLESTONE_STAIRS; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Cobblestone Stairs"; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsDarkOak.java b/src/main/java/cn/nukkit/block/BlockStairsDarkOak.java deleted file mode 100644 index 19d5b74ed..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsDarkOak.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsDarkOak extends BlockStairsWood { - - public BlockStairsDarkOak() { - this(0); - } - - public BlockStairsDarkOak(int meta) { - super(meta); - } - - @Override - public int getId() { - return DARK_OAK_WOOD_STAIRS; - } - - @Override - public String getName() { - return "Dark Oak Wood Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.BROWN_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsJungle.java b/src/main/java/cn/nukkit/block/BlockStairsJungle.java deleted file mode 100644 index 390f7915a..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsJungle.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsJungle extends BlockStairsWood { - - public BlockStairsJungle() { - this(0); - } - - public BlockStairsJungle(int meta) { - super(meta); - } - - @Override - public int getId() { - return JUNGLE_WOOD_STAIRS; - } - - @Override - public String getName() { - return "Jungle Wood Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.DIRT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsNetherBrick.java b/src/main/java/cn/nukkit/block/BlockStairsNetherBrick.java deleted file mode 100644 index f64eae90c..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsNetherBrick.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsNetherBrick extends BlockStairs { - - public BlockStairsNetherBrick() { - this(0); - } - - public BlockStairsNetherBrick(int meta) { - super(meta); - } - - @Override - public int getId() { - return NETHER_BRICKS_STAIRS; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Nether Bricks Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.NETHERRACK_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsPurpur.java b/src/main/java/cn/nukkit/block/BlockStairsPurpur.java deleted file mode 100644 index 46d4dd535..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsPurpur.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -public class BlockStairsPurpur extends BlockStairs { - - public BlockStairsPurpur() { - this(0); - } - - public BlockStairsPurpur(int meta) { - super(meta); - } - - @Override - public int getId() { - return PURPUR_STAIRS; - } - - @Override - public double getHardness() { - return 1.5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Purpur Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.MAGENTA_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsQuartz.java b/src/main/java/cn/nukkit/block/BlockStairsQuartz.java deleted file mode 100644 index a204d5e2f..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsQuartz.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsQuartz extends BlockStairs { - - public BlockStairsQuartz() { - this(0); - } - - public BlockStairsQuartz(int meta) { - super(meta); - } - - @Override - public int getId() { - return QUARTZ_STAIRS; - } - - @Override - public double getHardness() { - return 0.8; - } - - @Override - public double getResistance() { - return 4; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Quartz Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.QUARTZ_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsRedSandstone.java b/src/main/java/cn/nukkit/block/BlockStairsRedSandstone.java deleted file mode 100644 index 0de03be8c..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsRedSandstone.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created by CreeperFace on 26. 11. 2016. - */ -public class BlockStairsRedSandstone extends BlockStairs { - - public BlockStairsRedSandstone() { - this(0); - } - - public BlockStairsRedSandstone(int meta) { - super(meta); - } - - @Override - public int getId() { - return RED_SANDSTONE_STAIRS; - } - - @Override - public double getHardness() { - return 0.8; - } - - @Override - public double getResistance() { - return 4; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Red Sandstone Stairs"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x07); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.ORANGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsSandstone.java b/src/main/java/cn/nukkit/block/BlockStairsSandstone.java deleted file mode 100644 index a3597e02d..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsSandstone.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsSandstone extends BlockStairs { - - public BlockStairsSandstone() { - this(0); - } - - public BlockStairsSandstone(int meta) { - super(meta); - } - - @Override - public int getId() { - return SANDSTONE_STAIRS; - } - - @Override - public double getHardness() { - return 0.8; - } - - @Override - public double getResistance() { - return 4; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Sandstone Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.SAND_BLOCK_COLOR; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsSpruce.java b/src/main/java/cn/nukkit/block/BlockStairsSpruce.java deleted file mode 100644 index cb9b3cfb7..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsSpruce.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsSpruce extends BlockStairsWood { - - public BlockStairsSpruce() { - this(0); - } - - public BlockStairsSpruce(int meta) { - super(meta); - } - - @Override - public int getId() { - return SPRUCE_WOOD_STAIRS; - } - - @Override - public String getName() { - return "Spruce Wood Stairs"; - } - - @Override - public BlockColor getColor() { - return BlockColor.SPRUCE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsStoneBrick.java b/src/main/java/cn/nukkit/block/BlockStairsStoneBrick.java deleted file mode 100644 index a7145c21d..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsStoneBrick.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsStoneBrick extends BlockStairs { - - public BlockStairsStoneBrick() { - this(0); - } - - public BlockStairsStoneBrick(int meta) { - super(meta); - } - - @Override - public int getId() { - return STONE_BRICK_STAIRS; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 1.5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public String getName() { - return "Stone Brick Stairs"; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStairsWood.java b/src/main/java/cn/nukkit/block/BlockStairsWood.java deleted file mode 100644 index edd63e22e..000000000 --- a/src/main/java/cn/nukkit/block/BlockStairsWood.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/25 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockStairsWood extends BlockStairs { - - public BlockStairsWood() { - this(0); - } - - public BlockStairsWood(int meta) { - super(meta); - } - - @Override - public int getId() { - return WOOD_STAIRS; - } - - @Override - public String getName() { - return "Wood Stairs"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public int getBurnChance() { - return 5; - } - - @Override - public int getBurnAbility() { - return 20; - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } - - @Override - public Item[] getDrops(Item item) { - return new Item[]{ - toItem() - }; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStemMelon.java b/src/main/java/cn/nukkit/block/BlockStemMelon.java deleted file mode 100644 index 173c6f87d..000000000 --- a/src/main/java/cn/nukkit/block/BlockStemMelon.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Server; -import cn.nukkit.event.block.BlockGrowEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSeedsMelon; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockFace.Plane; -import cn.nukkit.utils.Utils; - -/** - * Created by Pub4Game on 15.01.2016. - */ -public class BlockStemMelon extends BlockCrops { - - public BlockStemMelon() { - this(0); - } - - public BlockStemMelon(int meta) { - super(meta); - } - - @Override - public int getId() { - return MELON_STEM; - } - - @Override - public String getName() { - return "Melon Stem"; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().getId() != FARMLAND) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if (Utils.rand(1, 2) == 1) { - if (this.getDamage() < 0x07) { - Block block = this.clone(); - block.setDamage(block.getDamage() + 1); - BlockGrowEvent ev = new BlockGrowEvent(this, block); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.getLevel().setBlock(this, ev.getNewState(), true); - } - return Level.BLOCK_UPDATE_RANDOM; - } else { - for (BlockFace face : Plane.HORIZONTAL) { - Block b = this.getSide(face); - if (b.getId() == MELON_BLOCK) { - return Level.BLOCK_UPDATE_RANDOM; - } - } - Block side = this.getSide(Plane.HORIZONTAL.random(Utils.nukkitRandom)); - Block d = side.down(); - if (side.getId() == AIR && (d.getId() == FARMLAND || d.getId() == GRASS || d.getId() == DIRT)) { - BlockGrowEvent ev = new BlockGrowEvent(side, Block.get(MELON_BLOCK)); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.getLevel().setBlock(side, ev.getNewState(), true); - } - } - } - } - return Level.BLOCK_UPDATE_RANDOM; - } - return 0; - } - - @Override - public Item toItem() { - return new ItemSeedsMelon(); - } - - @Override - public Item[] getDrops(Item item) { - if (this.getDamage() < 4) return new Item[0]; - return new Item[]{ - new ItemSeedsMelon(0, Utils.rand(0, 48) >> 4) - }; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStemPumpkin.java b/src/main/java/cn/nukkit/block/BlockStemPumpkin.java deleted file mode 100644 index a725f92c4..000000000 --- a/src/main/java/cn/nukkit/block/BlockStemPumpkin.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Server; -import cn.nukkit.event.block.BlockGrowEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSeedsPumpkin; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockFace.Plane; -import cn.nukkit.utils.Utils; - -/** - * Created by Pub4Game on 15.01.2016. - */ -public class BlockStemPumpkin extends BlockCrops { - - public BlockStemPumpkin() { - this(0); - } - - public BlockStemPumpkin(int meta) { - super(meta); - } - - @Override - public int getId() { - return PUMPKIN_STEM; - } - - @Override - public String getName() { - return "Pumpkin Stem"; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().getId() != FARMLAND) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if (Utils.rand(1, 2) == 1) { - if (this.getDamage() < 0x07) { - Block block = this.clone(); - block.setDamage(block.getDamage() + 1); - BlockGrowEvent ev = new BlockGrowEvent(this, block); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.getLevel().setBlock(this, ev.getNewState(), true); - } - return Level.BLOCK_UPDATE_RANDOM; - } else { - for (BlockFace face : Plane.HORIZONTAL) { - Block b = this.getSide(face); - if (b.getId() == PUMPKIN) { - return Level.BLOCK_UPDATE_RANDOM; - } - } - Block side = this.getSide(Plane.HORIZONTAL.random(Utils.nukkitRandom)); - Block d = side.down(); - if (side.getId() == AIR && (d.getId() == FARMLAND || d.getId() == GRASS || d.getId() == DIRT)) { - BlockGrowEvent ev = new BlockGrowEvent(side, Block.get(PUMPKIN)); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.getLevel().setBlock(side, ev.getNewState(), true); - } - } - } - } - return Level.BLOCK_UPDATE_RANDOM; - } - return 0; - } - - @Override - public Item toItem() { - return new ItemSeedsPumpkin(); - } - - @Override - public Item[] getDrops(Item item) { - if (this.getDamage() < 4) return new Item[0]; - return new Item[]{ - new ItemSeedsPumpkin(0, Utils.rand(0, 48) >> 4) - }; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStone.java b/src/main/java/cn/nukkit/block/BlockStone.java deleted file mode 100644 index a4572aef2..000000000 --- a/src/main/java/cn/nukkit/block/BlockStone.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockStone extends BlockSolidMeta { - - public static final int NORMAL = 0; - public static final int GRANITE = 1; - public static final int POLISHED_GRANITE = 2; - public static final int DIORITE = 3; - public static final int POLISHED_DIORITE = 4; - public static final int ANDESITE = 5; - public static final int POLISHED_ANDESITE = 6; - - public BlockStone() { - this(0); - } - - public BlockStone(int meta) { - super(meta); - } - - @Override - public int getId() { - return STONE; - } - - @Override - public double getHardness() { - return 1.5; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Stone", - "Granite", - "Polished Granite", - "Diorite", - "Polished Diorite", - "Andesite", - "Polished Andesite", - "Unknown Stone" - }; - return names[this.getDamage() & 0x07]; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - return new Item[]{this.toItem()}; - } - return new Item[]{ - Item.get(this.getDamage() == 0 ? Item.COBBLESTONE : Item.STONE, this.getDamage(), 1) - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStonecutter.java b/src/main/java/cn/nukkit/block/BlockStonecutter.java deleted file mode 100644 index 079f98933..000000000 --- a/src/main/java/cn/nukkit/block/BlockStonecutter.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; - -public class BlockStonecutter extends BlockSolid { - - @Override - public int getId() { - return STONECUTTER; - } - - @Override - public double getHardness() { - return 3.5; - } - - @Override - public double getResistance() { - return 17.5; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public String getName() { - return "Stonecutter"; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockStructureBlock.java b/src/main/java/cn/nukkit/block/BlockStructureBlock.java deleted file mode 100644 index c12f79999..000000000 --- a/src/main/java/cn/nukkit/block/BlockStructureBlock.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; - -/** - * Created by PetteriM1 - */ -public class BlockStructureBlock extends BlockSolid { - - @Override - public int getId() { - return STRUCTURE_BLOCK; - } - - @Override - public double getHardness() { - return -1; - } - - @Override - public double getResistance() { - return 18000000; - } - - @Override - public String getName() { - return "Structure Block"; - } - - @Override - public boolean isBreakable(Item item) { - return false; - } - - @Override - public boolean canBePushed() { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockSugarcane.java b/src/main/java/cn/nukkit/block/BlockSugarcane.java deleted file mode 100644 index 008d44f01..000000000 --- a/src/main/java/cn/nukkit/block/BlockSugarcane.java +++ /dev/null @@ -1,153 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.block.BlockGrowEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSugarcane; -import cn.nukkit.level.Level; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; - -/** - * Created by Pub4Game on 09.01.2016. - */ -public class BlockSugarcane extends BlockFlowable { - - public BlockSugarcane() { - this(0); - } - - public BlockSugarcane(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Sugar Cane"; - } - - @Override - public int getId() { - return SUGARCANE_BLOCK; - } - - @Override - public Item toItem() { - return new ItemSugarcane(); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.DYE && item.getDamage() == 0x0F) { // Bone meal - int count = 1; - - for (int i = 1; i <= 2; i++) { - int id = this.level.getBlockIdAt(this.getFloorX(), this.getFloorY() - i, this.getFloorZ()); - - if (id == SUGARCANE_BLOCK) { - count++; - } - } - - if (count < 3) { - boolean success = false; - int toGrow = 3 - count; - - for (int i = 1; i <= toGrow; i++) { - Block block = this.up(i); - if (block.getId() == 0) { - BlockGrowEvent ev = new BlockGrowEvent(block, Block.get(SUGARCANE_BLOCK)); - Server.getInstance().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - this.getLevel().setBlock(block, ev.getNewState(), true); - success = true; - } - } else if (block.getId() != SUGARCANE_BLOCK) { - break; - } - } - - if (success) { - if (player != null && !player.isCreative()) { - item.count--; - } - - this.level.addParticle(new BoneMealParticle(this)); - } - } - return true; - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - Block down = this.down(); - if (down.isTransparent() && down.getId() != SUGARCANE_BLOCK) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - if (this.down().getId() != SUGARCANE_BLOCK) { - if (this.getDamage() == 0x0F) { - for (int y = 1; y < 3; ++y) { - Block b = this.getLevel().getBlock(new Vector3(this.x, this.y + y, this.z)); - if (b.getId() == AIR) { - BlockGrowEvent ev = new BlockGrowEvent(b, Block.get(BlockID.SUGARCANE_BLOCK)); - Server.getInstance().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - this.getLevel().setBlock(b, ev.getNewState(), false); - } - break; - } - } - this.setDamage(0); - this.getLevel().setBlock(this, this, false); - } else { - this.setDamage(this.getDamage() + 1); - this.getLevel().setBlock(this, this, false); - } - return Level.BLOCK_UPDATE_RANDOM; - } - } - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (block.getId() != AIR) { - return false; - } - Block down = this.down(); - if (down.getId() == SUGARCANE_BLOCK) { - this.getLevel().setBlock(block, Block.get(SUGARCANE_BLOCK), true); - return true; - } else if (down.getId() == GRASS || down.getId() == DIRT || down.getId() == SAND || down.getId() == PODZOL) { - Block block0 = down.north(); - Block block1 = down.south(); - Block block2 = down.west(); - Block block3 = down.east(); - if (block0 instanceof BlockWater || block1 instanceof BlockWater || block2 instanceof BlockWater || block3 instanceof BlockWater || block0 instanceof BlockIceFrosted || block1 instanceof BlockIceFrosted || block2 instanceof BlockIceFrosted || block3 instanceof BlockIceFrosted) { - this.getLevel().setBlock(block, Block.get(SUGARCANE_BLOCK), true); - return true; - } - } - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTNT.java b/src/main/java/cn/nukkit/block/BlockTNT.java deleted file mode 100644 index 71db67968..000000000 --- a/src/main/java/cn/nukkit/block/BlockTNT.java +++ /dev/null @@ -1,139 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityPrimedTNT; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.Level; -import cn.nukkit.level.Sound; -import cn.nukkit.level.sound.TNTPrimeSound; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/12/8 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockTNT extends BlockSolid { - - @Override - public String getName() { - return "TNT"; - } - - @Override - public int getId() { - return TNT; - } - - @Override - public double getHardness() { - return 0; - } - - @Override - public double getResistance() { - return 0; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public int getBurnChance() { - return 15; - } - - @Override - public int getBurnAbility() { - return 100; - } - - public void prime() { - this.prime(80); - } - - public void prime(int fuse) { - prime(fuse, null); - } - - public void prime(int fuse, Entity source) { - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true); - double mot = Utils.nukkitRandom.nextSignedFloat() * 6.283185307179586; - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", this.x + 0.5)) - .add(new DoubleTag("", this.y)) - .add(new DoubleTag("", this.z + 0.5))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", -Math.sin(mot) * 0.02)) - .add(new DoubleTag("", 0.2)) - .add(new DoubleTag("", -Math.cos(mot) * 0.02))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - .putShort("Fuse", fuse); - Entity tnt = new EntityPrimedTNT( - this.getLevel().getChunk(this.getFloorX() >> 4, this.getFloorZ() >> 4), - nbt, source - ); - tnt.spawnToAll(); - this.level.addSound(new TNTPrimeSound(this)); - } - - @Override - public int onUpdate(int type) { - if ((type == Level.BLOCK_UPDATE_NORMAL || type == Level.BLOCK_UPDATE_REDSTONE) && this.level.isBlockPowered(this.getLocation())) { - this.prime(); - } - - return 0; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.FLINT_STEEL) { - item.useOn(this); - this.prime(80, player); - return true; - } else if (item.getId() == Item.FIRE_CHARGE) { - if (!player.isCreative()) item.count--; - this.level.addSoundToViewers(this, Sound.MOB_GHAST_FIREBALL); - this.prime(80, player); - return true; - } else if (item instanceof ItemTool && item.hasEnchantment(Enchantment.ID_FIRE_ASPECT)) { - item.useOn(this); - this.prime(80, player); - return true; - } - - return false; - } - - @Override - public BlockColor getColor() { - return BlockColor.TNT_BLOCK_COLOR; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public void onEntityCollide(Entity entity) { - if (entity instanceof EntityArrow && entity.isOnFire()) { - entity.close(); - this.prime(); - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTallGrass.java b/src/main/java/cn/nukkit/block/BlockTallGrass.java deleted file mode 100644 index d2de06ed0..000000000 --- a/src/main/java/cn/nukkit/block/BlockTallGrass.java +++ /dev/null @@ -1,158 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSeedsWheat; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.level.particle.BoneMealParticle; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockTallGrass extends BlockFlowable { - - public BlockTallGrass() { - this(1); - } - - public BlockTallGrass(int meta) { - super(meta); - } - - @Override - public int getId() { - return TALL_GRASS; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Grass", - "Grass", - "Fern", - "Fern" - }; - return names[this.getDamage() & 0x03]; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean canBeReplaced() { - return true; - } - - @Override - public int getBurnChance() { - return 60; - } - - @Override - public int getBurnAbility() { - return 100; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - Block down = this.down(); - if (down.getId() == Block.GRASS || down.getId() == Block.DIRT || down.getId() == Block.PODZOL) { - this.getLevel().setBlock(block, this, true); - return true; - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.down().isTransparent()) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - @Override - public boolean onActivate(Item item, Player player) { - if (item.getId() == Item.DYE && item.getDamage() == 0x0f) { - Block up = this.up(); - - if (up.getId() == AIR) { - int meta; - - switch (this.getDamage()) { - case 0: - case 1: - meta = BlockDoublePlant.TALL_GRASS; - break; - case 2: - case 3: - meta = BlockDoublePlant.LARGE_FERN; - break; - default: - meta = -1; - } - - if (meta != -1) { - if (player != null && !player.isCreative()) { - item.count--; - } - - this.level.addParticle(new BoneMealParticle(this)); - this.level.setBlock(this, get(DOUBLE_PLANT, meta), true, false); - this.level.setBlock(up, get(DOUBLE_PLANT, meta ^ BlockDoublePlant.TOP_HALF_BITMASK), true); - } - } - - return true; - } - - return false; - } - - - @Override - public Item[] getDrops(Item item) { - boolean dropSeeds = Utils.random.nextInt(10) == 0; - if (item.isShears()) { - //todo enchantment - if (dropSeeds) { - return new Item[]{ - new ItemSeedsWheat(), - Item.get(Item.TALL_GRASS, this.getDamage(), 1) - }; - } else { - return new Item[]{ - Item.get(Item.TALL_GRASS, this.getDamage(), 1) - }; - } - } - - if (dropSeeds) { - return new Item[]{ - new ItemSeedsWheat() - }; - } else { - return new Item[0]; - } - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHEARS; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracotta.java b/src/main/java/cn/nukkit/block/BlockTerracotta.java deleted file mode 100644 index d7aa08519..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracotta.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; -import cn.nukkit.utils.TerracottaColor; - -/** - * Created on 2015/11/24 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockTerracotta extends BlockSolidMeta { - - public BlockTerracotta() { - this(0); - } - - public BlockTerracotta(int meta) { - super(0); - } - - public BlockTerracotta(DyeColor dyeColor) { - this(dyeColor.getWoolData()); - } - - public BlockTerracotta(TerracottaColor dyeColor) { - this(dyeColor.getTerracottaData()); - } - - @Override - public int getId() { - return TERRACOTTA; - } - - @Override - public String getName() { - return "Terracotta"; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public double getHardness() { - return 1.25; - } - - @Override - public double getResistance() { - return 7; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return TerracottaColor.getByTerracottaData(getDamage()).getColor(); - } - - public TerracottaColor getDyeColor() { - return TerracottaColor.getByTerracottaData(getDamage()); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazed.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazed.java deleted file mode 100644 index 732233c5c..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazed.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public abstract class BlockTerracottaGlazed extends BlockSolidMeta { - - private static final int[] faces = {2, 5, 3, 4}; - - public BlockTerracottaGlazed() { - this(0); - } - - public BlockTerracottaGlazed(int meta) { - super(meta); - } - - @Override - public double getResistance() { - return 7; - } - - @Override - public double getHardness() { - return 1.4; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - return item.getTier() >= ItemTool.TIER_WOODEN ? new Item[]{this.toItem()} : new Item[0]; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(faces[player != null ? player.getDirection().getHorizontalIndex() : 0]); - return this.getLevel().setBlock(block, this, true, true); - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBlack.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBlack.java deleted file mode 100644 index 7dd57d617..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBlack.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedBlack extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedBlack() { - this(0); - } - - public BlockTerracottaGlazedBlack(int meta) { - super(meta); - } - - @Override - public int getId() { - return BLACK_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Black Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.BLACK; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBlue.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBlue.java deleted file mode 100644 index 9bb8bd023..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBlue.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedBlue extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedBlue() { - this(0); - } - - public BlockTerracottaGlazedBlue(int meta) { - super(meta); - } - - @Override - public int getId() { - return BLUE_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Blue Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.BLUE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBrown.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBrown.java deleted file mode 100644 index ac83855a8..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedBrown.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedBrown extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedBrown() { - this(0); - } - - public BlockTerracottaGlazedBrown(int meta) { - super(meta); - } - - @Override - public int getId() { - return BROWN_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Brown Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.BROWN; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedCyan.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedCyan.java deleted file mode 100644 index 28760195b..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedCyan.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedCyan extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedCyan() { - this(0); - } - - public BlockTerracottaGlazedCyan(int meta) { - super(meta); - } - - @Override - public int getId() { - return CYAN_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Cyan Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.CYAN; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedGray.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedGray.java deleted file mode 100644 index 350adb3d3..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedGray.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedGray extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedGray() { - this(0); - } - - public BlockTerracottaGlazedGray(int meta) { - super(meta); - } - - @Override - public int getId() { - return GRAY_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Gray Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.GRAY; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedGreen.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedGreen.java deleted file mode 100644 index 20d50be66..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedGreen.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedGreen extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedGreen() { - this(0); - } - - public BlockTerracottaGlazedGreen(int meta) { - super(meta); - } - - @Override - public int getId() { - return GREEN_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Green Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.GREEN; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedLightBlue.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedLightBlue.java deleted file mode 100644 index 837de5564..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedLightBlue.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedLightBlue extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedLightBlue() { - this(0); - } - - public BlockTerracottaGlazedLightBlue(int meta) { - super(meta); - } - - @Override - public int getId() { - return LIGHT_BLUE_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Light Blue Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.LIGHT_BLUE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedLime.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedLime.java deleted file mode 100644 index 2c7f72b0b..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedLime.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedLime extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedLime() { - this(0); - } - - public BlockTerracottaGlazedLime(int meta) { - super(meta); - } - - @Override - public int getId() { - return LIME_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Lime Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.LIME; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedMagenta.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedMagenta.java deleted file mode 100644 index e04103636..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedMagenta.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedMagenta extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedMagenta() { - this(0); - } - - public BlockTerracottaGlazedMagenta(int meta) { - super(meta); - } - - @Override - public int getId() { - return MAGENTA_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Magenta Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.MAGENTA; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedOrange.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedOrange.java deleted file mode 100644 index 58a851c6f..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedOrange.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedOrange extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedOrange() { - this(0); - } - - public BlockTerracottaGlazedOrange(int meta) { - super(meta); - } - - @Override - public int getId() { - return ORANGE_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Orange Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.ORANGE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedPink.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedPink.java deleted file mode 100644 index 34b06e4c7..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedPink.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedPink extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedPink() { - this(0); - } - - public BlockTerracottaGlazedPink(int meta) { - super(meta); - } - - @Override - public int getId() { - return PINK_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Pink Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.PINK; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedPurple.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedPurple.java deleted file mode 100644 index 06b4b2db8..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedPurple.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedPurple extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedPurple() { - this(0); - } - - public BlockTerracottaGlazedPurple(int meta) { - super(meta); - } - - @Override - public int getId() { - return PURPLE_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Purple Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.PURPLE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedRed.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedRed.java deleted file mode 100644 index 5bc9a00b0..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedRed.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedRed extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedRed() { - this(0); - } - - public BlockTerracottaGlazedRed(int meta) { - super(meta); - } - - @Override - public int getId() { - return RED_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Red Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.RED; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedSilver.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedSilver.java deleted file mode 100644 index 62d9953fd..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedSilver.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedSilver extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedSilver() { - this(0); - } - - public BlockTerracottaGlazedSilver(int meta) { - super(meta); - } - - @Override - public int getId() { - return SILVER_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Light Gray Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.LIGHT_GRAY; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedWhite.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedWhite.java deleted file mode 100644 index 3e478b564..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedWhite.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedWhite extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedWhite() { - this(0); - } - - public BlockTerracottaGlazedWhite(int meta) { - super(meta); - } - - @Override - public int getId() { - return WHITE_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "White Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.WHITE; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedYellow.java b/src/main/java/cn/nukkit/block/BlockTerracottaGlazedYellow.java deleted file mode 100644 index 438713153..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaGlazedYellow.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockTerracottaGlazedYellow extends BlockTerracottaGlazed { - - public BlockTerracottaGlazedYellow() { - this(0); - } - - public BlockTerracottaGlazedYellow(int meta) { - super(meta); - } - - @Override - public int getId() { - return YELLOW_GLAZED_TERRACOTTA; - } - - @Override - public String getName() { - return "Yellow Glazed Terracotta"; - } - - public DyeColor getDyeColor() { - return DyeColor.YELLOW; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTerracottaStained.java b/src/main/java/cn/nukkit/block/BlockTerracottaStained.java deleted file mode 100644 index 7d0fd18e2..000000000 --- a/src/main/java/cn/nukkit/block/BlockTerracottaStained.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockTerracottaStained extends BlockSolidMeta { - - public BlockTerracottaStained() { - this(0); - } - - public BlockTerracottaStained(int meta) { - super(meta); - } - - public BlockTerracottaStained(DyeColor dyeColor) { - this(dyeColor.getWoolData()); - } - - @Override - public String getName() { - return getDyeColor().getName() + " Terracotta"; - } - - @Override - public int getId() { - return STAINED_TERRACOTTA; - } - - @Override - public double getHardness() { - return 1.25; - } - - @Override - public double getResistance() { - return 0.75; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{toItem()}; - } else { - return new Item[0]; - } - } - - @Override - public BlockColor getColor() { - return DyeColor.getByWoolData(getDamage()).getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(getDamage()); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockThin.java b/src/main/java/cn/nukkit/block/BlockThin.java deleted file mode 100644 index 7a11ac5a9..000000000 --- a/src/main/java/cn/nukkit/block/BlockThin.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.utils.LevelException; - -/** - * Created on 2015/12/6 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public abstract class BlockThin extends BlockTransparent { - - protected BlockThin() { - } - - @Override - public boolean isSolid() { - return false; - } - - protected AxisAlignedBB recalculateBoundingBox() { - double f = 0.4375; - double f1 = 0.5625; - double f2 = 0.4375; - double f3 = 0.5625; - try { - boolean flag = this.canConnect(this.north()); - boolean flag1 = this.canConnect(this.south()); - boolean flag2 = this.canConnect(this.west()); - boolean flag3 = this.canConnect(this.east()); - if ((!flag2 || !flag3) && (flag2 || flag3 || flag || flag1)) { - if (flag2) { - f = 0; - } else if (flag3) { - f1 = 1; - } - } else { - f = 0; - f1 = 1; - } - if ((!flag || !flag1) && (flag2 || flag3 || flag || flag1)) { - if (flag) { - f2 = 0; - } else if (flag1) { - f3 = 1; - } - } else { - f2 = 0; - f3 = 1; - } - } catch (LevelException ignore) {} - return new AxisAlignedBB( - this.x + f, - this.y, - this.z + f2, - this.x + f1, - this.y + 1, - this.z + f3 - ); - } - - public boolean canConnect(Block block) { - return block.isSolid() || block.getId() == this.getId() || block.getId() == GLASS_PANE || block.getId() == GLASS; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTorch.java b/src/main/java/cn/nukkit/block/BlockTorch.java deleted file mode 100644 index 7811177d9..000000000 --- a/src/main/java/cn/nukkit/block/BlockTorch.java +++ /dev/null @@ -1,124 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockTorch extends BlockFlowable implements Faceable { - - private static final short[] faces = new short[]{ - 0, //0, never used - 5, //1 - 4, //2 - 3, //3 - 2, //4 - 1, //5 - }; - - private static final short[] faces2 = new short[]{ - 0, //0 - 4, //1 - 5, //2 - 2, //3 - 3, //4 - 0, //5 - 0 //6 - }; - - public BlockTorch() { - this(0); - } - - public BlockTorch(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Torch"; - } - - @Override - public int getId() { - return TORCH; - } - - @Override - public int getLightLevel() { - return 14; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - Block below = this.down(); - int side = this.getDamage(); - Block block = this.getSide(BlockFace.fromIndex(faces2[side])); - int id = block.getId(); - - if ((block.isTransparent() && !(side == 0 && (below instanceof BlockFence || below.getId() == COBBLE_WALL))) && id != GLASS && id != STAINED_GLASS && id != HARD_STAINED_GLASS) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } - - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - int side = faces[face.getIndex()]; - int bid = this.getSide(BlockFace.fromIndex(faces2[side])).getId(); - if ((!target.isTransparent() || bid == GLASS || bid == STAINED_GLASS || bid == HARD_STAINED_GLASS) && face != BlockFace.DOWN) { - this.setDamage(side); - this.getLevel().setBlock(block, this, true, true); - return true; - } - - Block below = this.down(); - if (!below.isTransparent() || below instanceof BlockFence || below.getId() == COBBLE_WALL || below.getId() == GLASS || below.getId() == STAINED_GLASS || below.getId() == HARD_STAINED_GLASS) { - this.setDamage(0); - this.getLevel().setBlock(block, this, true, true); - return true; - } - return false; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public BlockColor getColor() { - return BlockColor.AIR_BLOCK_COLOR; - } - - @Override - public BlockFace getBlockFace() { - return getBlockFace(this.getDamage() & 0x07); - } - - public BlockFace getBlockFace(int meta) { - switch (meta) { - case 1: - return BlockFace.EAST; - case 2: - return BlockFace.WEST; - case 3: - return BlockFace.SOUTH; - case 4: - return BlockFace.NORTH; - default: - return BlockFace.UP; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTransparent.java b/src/main/java/cn/nukkit/block/BlockTransparent.java deleted file mode 100644 index 0499a6496..000000000 --- a/src/main/java/cn/nukkit/block/BlockTransparent.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockTransparent extends Block { - - @Override - public boolean isTransparent() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.TRANSPARENT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTransparentMeta.java b/src/main/java/cn/nukkit/block/BlockTransparentMeta.java deleted file mode 100644 index bc96d517f..000000000 --- a/src/main/java/cn/nukkit/block/BlockTransparentMeta.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockTransparentMeta extends BlockMeta { - - protected BlockTransparentMeta() { - this(0); - } - - protected BlockTransparentMeta(int meta) { - super(meta); - } - - @Override - public boolean isTransparent() { - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.TRANSPARENT_BLOCK_COLOR; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTrapdoor.java b/src/main/java/cn/nukkit/block/BlockTrapdoor.java deleted file mode 100644 index 80ef97852..000000000 --- a/src/main/java/cn/nukkit/block/BlockTrapdoor.java +++ /dev/null @@ -1,219 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.block.BlockRedstoneEvent; -import cn.nukkit.event.block.DoorToggleEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.DoorSound; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Faceable; - -/** - * Created by Pub4Game on 26.12.2015. - */ -public class BlockTrapdoor extends BlockTransparentMeta implements Faceable { - - public static int TRAPDOOR_OPEN_BIT = 0x08; - public static int TRAPDOOR_TOP_BIT = 0x04; - - private static final int[] faces = {2, 1, 3, 0}; - - public BlockTrapdoor() { - this(0); - } - - public BlockTrapdoor(int meta) { - super(meta); - } - - @Override - public int getId() { - return TRAPDOOR; - } - - @Override - public String getName() { - return "Wooden Trapdoor"; - } - - @Override - public double getHardness() { - return 3; - } - - @Override - public double getResistance() { - return 15; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - int damage = this.getDamage(); - AxisAlignedBB bb; - double f = 0.1875; - if ((damage & TRAPDOOR_TOP_BIT) > 0) { - bb = new AxisAlignedBB( - this.x, - this.y + 1 - f, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } else { - bb = new AxisAlignedBB( - this.x, - this.y, - this.z, - this.x + 1, - this.y + f, - this.z + 1 - ); - } - if ((damage & TRAPDOOR_OPEN_BIT) > 0) { - if ((damage & 0x03) == 0) { - bb.setBounds( - this.x, - this.y, - this.z + 1 - f, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } else if ((damage & 0x03) == 1) { - bb.setBounds( - this.x, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + f - ); - } - if ((damage & 0x03) == 2) { - bb.setBounds( - this.x + 1 - f, - this.y, - this.z, - this.x + 1, - this.y + 1, - this.z + 1 - ); - } - if ((damage & 0x03) == 3) { - bb.setBounds( - this.x, - this.y, - this.z, - this.x + f, - this.y + 1, - this.z + 1 - ); - } - } - return bb; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_REDSTONE) { - if ((!isOpen() && this.level.isBlockPowered(this.getLocation())) || (isOpen() && !this.level.isBlockPowered(this.getLocation()))) { - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, isOpen() ? 15 : 0, isOpen() ? 0 : 15)); - this.setDamage(this.getDamage() ^ TRAPDOOR_OPEN_BIT); - this.level.setBlock(this, this, true); - this.level.addSound(new DoorSound(this)); - return type; - } - } - - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - BlockFace facing; - boolean top; - int meta = 0; - - if (face.getAxis().isHorizontal() || player == null) { - facing = face; - top = fy > 0.5; - } else { - facing = player.getDirection().getOpposite(); - top = face != BlockFace.UP; - } - - if (top) { - meta |= TRAPDOOR_TOP_BIT; - } else { - meta |= faces[facing.getHorizontalIndex()]; - } - - this.setDamage(meta); - this.level.setBlock(block, this, true, true); - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public boolean onActivate(Item item, Player player) { - if (toggle(player)) { - this.level.addSound(new DoorSound(this)); - return true; - } - return false; - } - - public boolean toggle(Player player) { - DoorToggleEvent ev = new DoorToggleEvent(this, player); - level.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - this.setDamage(this.getDamage() ^ TRAPDOOR_OPEN_BIT); - level.setBlock(this, this, true, true); - return true; - } - - @Override - public BlockColor getColor() { - return BlockColor.WOOD_BLOCK_COLOR; - } - - public boolean isOpen() { - return (this.getDamage() & TRAPDOOR_OPEN_BIT) != 0; - } - - public boolean isTop() { - return (this.getDamage() & TRAPDOOR_TOP_BIT) != 0; - } - - @Override - public BlockFace getBlockFace() { - return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); - } - - @Override - public boolean canPassThrough() { - return this.isOpen(); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTrapdoorIron.java b/src/main/java/cn/nukkit/block/BlockTrapdoorIron.java deleted file mode 100644 index ad441a4c3..000000000 --- a/src/main/java/cn/nukkit/block/BlockTrapdoorIron.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; - -/** - * Created by Pub4Game on 26.12.2015. - */ -public class BlockTrapdoorIron extends BlockTrapdoor { - - public BlockTrapdoorIron() { - this(0); - } - - public BlockTrapdoorIron(int meta) { - super(meta); - } - - @Override - public int getId() { - return IRON_TRAPDOOR; - } - - @Override - public String getName() { - return "Iron Trapdoor"; - } - - @Override - public double getHardness() { - return 5; - } - - @Override - public double getResistance() { - return 25; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public BlockColor getColor() { - return BlockColor.IRON_BLOCK_COLOR; - } - - @Override - public boolean onActivate(Item item, Player player) { - return false; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTrappedChest.java b/src/main/java/cn/nukkit/block/BlockTrappedChest.java deleted file mode 100644 index adcd91af4..000000000 --- a/src/main/java/cn/nukkit/block/BlockTrappedChest.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityChest; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockFace.Plane; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.Tag; - -import java.util.Map; - -public class BlockTrappedChest extends BlockChest { - - private static final int[] faces = {2, 5, 3, 4}; - - public BlockTrappedChest() { - this(0); - } - - public BlockTrappedChest(int meta) { - super(meta); - } - - @Override - public int getId() { - return TRAPPED_CHEST; - } - - @Override - public String getName() { - return "Trapped Chest"; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - BlockEntityChest chest = null; - this.setDamage(faces[player != null ? player.getDirection().getHorizontalIndex() : 0]); - - for (BlockFace side : Plane.HORIZONTAL) { - if ((this.getDamage() == 4 || this.getDamage() == 5) && (side == BlockFace.WEST || side == BlockFace.EAST)) { - continue; - } else if ((this.getDamage() == 3 || this.getDamage() == 2) && (side == BlockFace.NORTH || side == BlockFace.SOUTH)) { - continue; - } - Block c = this.getSide(side); - if (c instanceof BlockTrappedChest && c.getDamage() == this.getDamage()) { - BlockEntity blockEntity = this.getLevel().getBlockEntity(c); - if (blockEntity instanceof BlockEntityChest && !((BlockEntityChest) blockEntity).isPaired()) { - chest = (BlockEntityChest) blockEntity; - break; - } - } - } - - this.getLevel().setBlock(block, this, true, true); - CompoundTag nbt = new CompoundTag("") - .putList(new ListTag<>("Items")) - .putString("id", BlockEntity.CHEST) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (item.hasCustomName()) { - nbt.putString("CustomName", item.getCustomName()); - } - - if (item.hasCustomBlockData()) { - Map customData = item.getCustomBlockData().getTags(); - for (Map.Entry tag : customData.entrySet()) { - nbt.put(tag.getKey(), tag.getValue()); - } - } - - BlockEntityChest blockEntity = (BlockEntityChest) BlockEntity.createBlockEntity(BlockEntity.CHEST, this.getChunk(), nbt); - - if (chest != null) { - chest.pairWith(blockEntity); - blockEntity.pairWith(chest); - } - - return true; - } - - @Override - public int getWeakPower(BlockFace face) { - int playerCount = 0; - - BlockEntity blockEntity = this.level.getBlockEntity(this); - - if (blockEntity instanceof BlockEntityChest) { - playerCount = ((BlockEntityChest) blockEntity).getInventory().getViewers().size(); - } - - return Math.min(playerCount, 15); - } - - @Override - public int getStrongPower(BlockFace side) { - return side == BlockFace.UP ? this.getWeakPower(side) : 0; - } - - @Override - public boolean isPowerSource() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTripWire.java b/src/main/java/cn/nukkit/block/BlockTripWire.java deleted file mode 100644 index 1f8822187..000000000 --- a/src/main/java/cn/nukkit/block/BlockTripWire.java +++ /dev/null @@ -1,174 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemString; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; - -/** - * @author CreeperFace - */ -public class BlockTripWire extends BlockFlowable { - - public BlockTripWire(int meta) { - super(meta); - } - - public BlockTripWire() { - this(0); - } - - @Override - public int getId() { - return TRIPWIRE; - } - - @Override - public String getName() { - return "Tripwire"; - } - - @Override - public AxisAlignedBB getBoundingBox() { - return null; - } - - @Override - public Item toItem() { - return new ItemString(); - } - - public boolean isPowered() { - return (this.getDamage() & 1) > 0; - } - - public boolean isAttached() { - return (this.getDamage() & 4) > 0; - } - - public boolean isDisarmed() { - return (this.getDamage() & 8) > 0; - } - - public void setPowered(boolean value) { - if (value ^ this.isPowered()) { - this.setDamage(this.getDamage() ^ 0x01); - } - } - - public void setAttached(boolean value) { - if (value ^ this.isAttached()) { - this.setDamage(this.getDamage() ^ 0x04); - } - } - - public void setDisarmed(boolean value) { - if (value ^ this.isDisarmed()) { - this.setDamage(this.getDamage() ^ 0x08); - } - } - - @Override - public void onEntityCollide(Entity entity) { - if (!entity.doesTriggerPressurePlate()) { - return; - } - - boolean powered = this.isPowered(); - - if (!powered) { - this.setPowered(true); - this.level.setBlock(this, this, true, false); - this.updateHook(false); - - this.level.scheduleUpdate(this, 10); - } - } - - public void updateHook(boolean scheduleUpdate) { - for (BlockFace side : new BlockFace[]{BlockFace.SOUTH, BlockFace.WEST}) { - for (int i = 1; i < 42; ++i) { - Block block = this.getSide(side, i); - - if (block instanceof BlockTripWireHook) { - BlockTripWireHook hook = (BlockTripWireHook) block; - - if (hook.getFacing() == side.getOpposite()) { - hook.calculateState(false, true, i, this); - } - - /*if (scheduleUpdate) { - this.level.scheduleUpdate(hook, 10); - }*/ - break; - } - - if (block.getId() != Block.TRIPWIRE) { - break; - } - } - } - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_SCHEDULED) { - if (!isPowered()) { - return type; - } - - boolean found = false; - Entity[] e = this.level.getCollidingEntities(this.getCollisionBoundingBox()); - for (Entity entity : e) { - if (!entity.doesTriggerPressurePlate()) { - continue; - } - - found = true; - } - - if (found) { - this.level.scheduleUpdate(this, 10); - } else { - this.setPowered(false); - this.level.setBlock(this, this, true, false); - this.updateHook(false); - } - return type; - } - - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.getLevel().setBlock(this, this, true, true); - this.updateHook(false); - - return true; - } - - @Override - public boolean onBreak(Item item) { - if (item.getId() == Item.SHEARS) { - this.setDisarmed(true); - this.level.setBlock(this, this, true, false); - this.updateHook(false); - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - } else { - this.setPowered(true); - this.getLevel().setBlock(this, Block.get(BlockID.AIR), true, true); - this.updateHook(true); - } - - return true; - } - - @Override - protected AxisAlignedBB recalculateCollisionBoundingBox() { - return new AxisAlignedBB(this.x, this.y, this.z, this.x + 1, this.y + 0.5, this.z + 1); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockTripWireHook.java b/src/main/java/cn/nukkit/block/BlockTripWireHook.java deleted file mode 100644 index dad75d5aa..000000000 --- a/src/main/java/cn/nukkit/block/BlockTripWireHook.java +++ /dev/null @@ -1,237 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.event.block.BlockRedstoneEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -/** - * @author CreeperFace - */ -public class BlockTripWireHook extends BlockFlowable { - - public BlockTripWireHook() { - this(0); - } - - public BlockTripWireHook(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Tripwire Hook"; - } - - @Override - public int getId() { - return TRIPWIRE_HOOK; - } - - public BlockFace getFacing() { - return BlockFace.fromHorizontalIndex(getDamage() & 0b11); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (!this.getSide(this.getFacing().getOpposite()).isNormalBlock()) { - this.level.useBreakOn(this); - } - - return type; - } else if (type == Level.BLOCK_UPDATE_SCHEDULED) { - this.calculateState(false, true, -1, null); - return type; - } - - return 0; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (!this.getSide(face.getOpposite()).isNormalBlock() || face == BlockFace.DOWN || face == BlockFace.UP) { - return false; - } - - if (face.getAxis().isHorizontal()) { - this.setFace(face); - } - - this.level.setBlock(this, this); - - if (player != null) { - this.calculateState(false, false, -1, null); - } - return true; - } - - @Override - public boolean onBreak(Item item) { - super.onBreak(item); - boolean attached = isAttached(); - boolean powered = isPowered(); - - if (attached || powered) { - this.calculateState(true, false, -1, null); - } - - if (powered) { - this.level.updateAroundRedstone(this, null); - this.level.updateAroundRedstone(this.getLocation().getSide(getFacing().getOpposite()), null); - } - - return true; - } - - public void calculateState(boolean onBreak, boolean updateAround, int pos, Block block) { - BlockFace facing = getFacing(); - Vector3 v = this.getLocation(); - boolean attached = isAttached(); - boolean powered = isPowered(); - boolean canConnect = !onBreak; - boolean nextPowered = false; - int distance = 0; - Block[] blocks = new Block[42]; - - for (int i = 1; i < 42; ++i) { - Vector3 vector = v.getSide(facing, i); - Block b = this.level.getBlock(vector); - - if (b instanceof BlockTripWireHook) { - if (((BlockTripWireHook) b).getFacing() == facing.getOpposite()) { - distance = i; - } - break; - } - - if (b.getId() != Block.TRIPWIRE && i != pos) { - blocks[i] = null; - canConnect = false; - } else { - if (i == pos) { - b = block != null ? block : b; - } - - if (b instanceof BlockTripWire) { - boolean disarmed = !((BlockTripWire) b).isDisarmed(); - boolean wirePowered = ((BlockTripWire) b).isPowered(); - nextPowered |= disarmed && wirePowered; - - if (i == pos) { - this.level.scheduleUpdate(this, 10); - canConnect &= disarmed; - } - } - blocks[i] = b; - } - } - - canConnect = canConnect & distance > 1; - nextPowered = nextPowered & canConnect; - BlockTripWireHook hook = (BlockTripWireHook) Block.get(TRIPWIRE_HOOK); - hook.setAttached(canConnect); - hook.setPowered(nextPowered); - - - if (distance > 0) { - Vector3 vec = v.getSide(facing, distance); - BlockFace face = facing.getOpposite(); - hook.setFace(face); - this.level.setBlock(vec, hook, true, false); - this.level.updateAroundRedstone(vec, null); - this.level.updateAroundRedstone(vec.getSide(face.getOpposite()), null); - this.addSound(vec, canConnect, nextPowered, attached, powered); - } - - this.addSound(v, canConnect, nextPowered, attached, powered); - - if (!onBreak) { - hook.setFace(facing); - this.level.setBlock(v, hook, true, false); - - if (updateAround) { - this.level.updateAroundRedstone(v, null); - this.level.updateAroundRedstone(v.getSide(facing.getOpposite()), null); - } - } - - if (attached != canConnect) { - for (int i = 1; i < distance; i++) { - Vector3 vc = v.getSide(facing, i); - block = blocks[i]; - - if (block != null && this.level.getBlockIdAt(vc.getFloorX(), vc.getFloorY(), vc.getFloorZ()) != Block.AIR) { - if (canConnect ^ ((block.getDamage() & 0x04) > 0)) { - block.setDamage(block.getDamage() ^ 0x04); - } - - this.level.setBlock(vc, block, true, false); - } - } - } - } - - private void addSound(Vector3 pos, boolean canConnect, boolean nextPowered, boolean attached, boolean powered) { - if (nextPowered && !powered) { - this.level.addLevelSoundEvent(pos, LevelSoundEventPacket.SOUND_POWER_ON); - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, 0, 15)); - } else if (!nextPowered && powered) { - this.level.addLevelSoundEvent(pos, LevelSoundEventPacket.SOUND_POWER_OFF); - this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, 15, 0)); - } else if (canConnect && !attached) { - this.level.addLevelSoundEvent(pos, LevelSoundEventPacket.SOUND_ATTACH); - } else if (!canConnect && attached) { - this.level.addLevelSoundEvent(pos, LevelSoundEventPacket.SOUND_DETACH); - } - } - - public boolean isAttached() { - return (getDamage() & 0x04) > 0; - } - - public boolean isPowered() { - return (this.getDamage() & 0x08) > 0; - } - - public void setPowered(boolean value) { - if (value ^ this.isPowered()) { - this.setDamage(this.getDamage() ^ 0x08); - } - } - - public void setAttached(boolean value) { - if (value ^ this.isAttached()) { - this.setDamage(this.getDamage() ^ 0x04); - } - } - - public void setFace(BlockFace face) { - this.setDamage(this.getDamage() - this.getDamage() % 4); - this.setDamage(this.getDamage() | face.getHorizontalIndex()); - } - - @Override - public boolean isPowerSource() { - return true; - } - - @Override - public int getWeakPower(BlockFace face) { - return isPowered() ? 15 : 0; - } - - @Override - public int getStrongPower(BlockFace side) { - return !isPowered() ? 0 : getFacing() == side ? 15 : 0; - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockUnderwaterTorch.java b/src/main/java/cn/nukkit/block/BlockUnderwaterTorch.java deleted file mode 100644 index 16da38be3..000000000 --- a/src/main/java/cn/nukkit/block/BlockUnderwaterTorch.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.block; - -/** - * Created by PetteriM1 - */ -public class BlockUnderwaterTorch extends BlockTorch { - - public BlockUnderwaterTorch() { - this(0); - } - - public BlockUnderwaterTorch(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Underwater Torch"; - } - - @Override - public int getId() { - return UNDERWATER_TORCH; - } - - @Override - public int onUpdate(int type) { - return 0; - } - - @Override - public boolean canBeFlowedInto() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockUndyedShulkerBox.java b/src/main/java/cn/nukkit/block/BlockUndyedShulkerBox.java deleted file mode 100644 index 510cefa29..000000000 --- a/src/main/java/cn/nukkit/block/BlockUndyedShulkerBox.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.inventory.ContainerInventory; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -public class BlockUndyedShulkerBox extends BlockShulkerBox { - - public BlockUndyedShulkerBox() { - super(0); - } - - @Override - public int getId() { - return UNDYED_SHULKER_BOX; - } - - @Override - public String getName() { - return "Shulker Box"; - } - - @Override - public BlockColor getColor() { - return BlockColor.PURPLE_BLOCK_COLOR; - } - - @Override - public DyeColor getDyeColor() { - return null; - } - - @Override - public void setDamage(int meta) { - } - - @Override - public boolean hasComparatorInputOverride() { - return true; - } - - @Override - public int getComparatorInputOverride() { - BlockEntity be = this.getLevel().getBlockEntity(this); - - if (!(be instanceof InventoryHolder)) { - return 0; - } - - return ContainerInventory.calculateRedstone(((InventoryHolder) be).getInventory()); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockUnknown.java b/src/main/java/cn/nukkit/block/BlockUnknown.java deleted file mode 100644 index aa866cd1a..000000000 --- a/src/main/java/cn/nukkit/block/BlockUnknown.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockUnknown extends BlockMeta { - - private final int id; - - public BlockUnknown(int id) { - this(id, 0); - } - - public BlockUnknown(int id, Integer meta) { - super(meta); - this.id = id; - } - - @Override - public int getId() { - return id; - } - - @Override - public String getName() { - return "Unknown"; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockVine.java b/src/main/java/cn/nukkit/block/BlockVine.java deleted file mode 100644 index 60afdfa0c..000000000 --- a/src/main/java/cn/nukkit/block/BlockVine.java +++ /dev/null @@ -1,321 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.block.BlockGrowEvent; -import cn.nukkit.event.block.BlockSpreadEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -import java.util.Random; -import java.util.concurrent.ThreadLocalRandom; - -/** - * Created by Pub4Game on 15.01.2016. - */ -public class BlockVine extends BlockTransparentMeta { - - public BlockVine(int meta) { - super(meta); - } - - public BlockVine() { - this(0); - } - - @Override - public String getName() { - return "Vines"; - } - - @Override - public int getId() { - return VINE; - } - - @Override - public double getHardness() { - return 0.2; - } - - @Override - public double getResistance() { - return 1; - } - - @Override - public boolean canPassThrough() { - return true; - } - - @Override - public boolean hasEntityCollision() { - return true; - } - - @Override - public boolean canBeReplaced() { - return true; - } - - @Override - public boolean canBeClimbed() { - return true; - } - - @Override - public void onEntityCollide(Entity entity) { - entity.resetFallDistance(); - entity.onGround = true; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - double f1 = 1; - double f2 = 1; - double f3 = 1; - double f4 = 0; - double f5 = 0; - double f6 = 0; - boolean flag = this.getDamage() > 0; - if ((this.getDamage() & 0x02) > 0) { - f4 = Math.max(f4, 0.0625); - f1 = 0; - f2 = 0; - f5 = 1; - f3 = 0; - f6 = 1; - flag = true; - } - if ((this.getDamage() & 0x08) > 0) { - f1 = Math.min(f1, 0.9375); - f4 = 1; - f2 = 0; - f5 = 1; - f3 = 0; - f6 = 1; - flag = true; - } - if ((this.getDamage() & 0x01) > 0) { - f3 = Math.min(f3, 0.9375); - f6 = 1; - f1 = 0; - f4 = 1; - f2 = 0; - f5 = 1; - flag = true; - } - if (!flag && this.up().isSolid()) { - f2 = Math.min(f2, 0.9375); - f5 = 1; - f1 = 0; - f4 = 1; - f3 = 0; - f6 = 1; - } - return new AxisAlignedBB( - this.x + f1, - this.y + f2, - this.z + f3, - this.x + f4, - this.y + f5, - this.z + f6 - ); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (block.getId() != VINE && target.isSolid() && face.getHorizontalIndex() != -1) { - this.setDamage(getMetaFromFace(face.getOpposite())); - this.getLevel().setBlock(block, this, true, true); - return true; - } - - return false; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isShears()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - int meta = this.getDamage(); - Block up = this.up(); - for (BlockFace face : BlockFace.Plane.HORIZONTAL) { - int faceMeta = getMetaFromFace(face); - if (!this.getSide(face).isSolid() && (up.getId() != VINE || (up.getDamage() & faceMeta) != faceMeta)) { - meta &= ~faceMeta; - } - } - if (meta == 0 && !up.isSolid()) { - this.getLevel().useBreakOn(this, null, null, true); - return Level.BLOCK_UPDATE_NORMAL; - } - if (meta != this.getDamage()) { - this.level.setBlock(this, Block.get(VINE, meta), true); - return Level.BLOCK_UPDATE_NORMAL; - } - } else if (type == Level.BLOCK_UPDATE_RANDOM) { - Random random = ThreadLocalRandom.current(); - if (random.nextInt(4) == 0) { - BlockFace face = BlockFace.random(random); - Block block = this.getSide(face); - int faceMeta = getMetaFromFace(face); - int meta = this.getDamage(); - - if (this.y < 255 && face == BlockFace.UP && block.getId() == AIR) { - if (this.canSpread()) { - for (BlockFace horizontalFace : BlockFace.Plane.HORIZONTAL) { - if (random.nextBoolean() || !this.getSide(horizontalFace).getSide(face).isSolid()) { - meta &= ~getMetaFromFace(horizontalFace); - } - } - putVineOnHorizontalFace(block, meta, this); - } - } else if (face.getHorizontalIndex() != -1 && (meta & faceMeta) != faceMeta) { - if (this.canSpread()) { - if (block.getId() == AIR) { - BlockFace cwFace = face.rotateY(); - BlockFace ccwFace = face.rotateYCCW(); - Block cwBlock = block.getSide(cwFace); - Block ccwBlock = block.getSide(ccwFace); - int cwMeta = getMetaFromFace(cwFace); - int ccwMeta = getMetaFromFace(ccwFace); - boolean onCw = (meta & cwMeta) == cwMeta; - boolean onCcw = (meta & ccwMeta) == ccwMeta; - - if (onCw && cwBlock.isSolid()) { - putVine(block, getMetaFromFace(cwFace), this); - } else if (onCcw && ccwBlock.isSolid()) { - putVine(block, getMetaFromFace(ccwFace), this); - } else if (onCw && cwBlock.getId() == AIR && this.getSide(cwFace).isSolid()) { - putVine(cwBlock, getMetaFromFace(face.getOpposite()), this); - } else if (onCcw && ccwBlock.getId() == AIR && this.getSide(ccwFace).isSolid()) { - putVine(ccwBlock, getMetaFromFace(face.getOpposite()), this); - } else if (block.up().isSolid()) { - putVine(block, 0, this); - } - } else if (!block.isTransparent()) { - meta |= getMetaFromFace(face); - putVine(this, meta, null); - } - } - } else if (this.y > 0) { - Block below = this.down(); - int id = below.getId(); - if (id == AIR || id == VINE) { - for (BlockFace horizontalFace : BlockFace.Plane.HORIZONTAL) { - if (random.nextBoolean()) { - meta &= ~getMetaFromFace(horizontalFace); - } - } - putVineOnHorizontalFace(below, below.getDamage() | meta, id == AIR ? this : null); - } - } - return Level.BLOCK_UPDATE_RANDOM; - } - } - return 0; - } - - private boolean canSpread() { - int blockX = this.getFloorX(); - int blockY = this.getFloorY(); - int blockZ = this.getFloorZ(); - - int count = 0; - for (int x = blockX - 4; x <= blockX + 4; x++) { - for (int z = blockZ - 4; z <= blockZ + 4; z++) { - for (int y = blockY - 1; y <= blockY + 1; y++) { - if (this.level.getBlockIdAt(x, y, z) == VINE) { - if (++count >= 5) return false; - } - } - } - } - return true; - } - - private void putVine(Block block, int meta, Block source) { - if (block.getId() == VINE && block.getDamage() == meta) return; - Block vine = get(VINE, meta); - BlockGrowEvent event; - if (source != null) { - event = new BlockSpreadEvent(block, source, vine); - } else { - event = new BlockGrowEvent(block, vine); - } - this.level.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.level.setBlock(block, vine, true); - } - } - - private void putVineOnHorizontalFace(Block block, int meta, Block source) { - if (block.getId() == VINE && block.getDamage() == meta) return; - boolean isOnHorizontalFace = false; - for (BlockFace face : BlockFace.Plane.HORIZONTAL) { - int faceMeta = getMetaFromFace(face); - if ((meta & faceMeta) == faceMeta) { - isOnHorizontalFace = true; - break; - } - } - if (isOnHorizontalFace) { - putVine(block, meta, source); - } - } - - private static int getMetaFromFace(BlockFace face) { - switch (face) { - case SOUTH: - default: - return 0x01; - case WEST: - return 0x02; - case NORTH: - return 0x04; - case EAST: - return 0x08; - } - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } - - @Override - public boolean canSilkTouch() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWall.java b/src/main/java/cn/nukkit/block/BlockWall.java deleted file mode 100644 index 23b0d8e80..000000000 --- a/src/main/java/cn/nukkit/block/BlockWall.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockWall extends BlockTransparentMeta { - - public static final int NONE_MOSSY_WALL = 0; - public static final int MOSSY_WALL = 1; - - public BlockWall() { - this(0); - } - - public BlockWall(int meta) { - super(meta); - } - - @Override - public int getId() { - return STONE_WALL; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 30; - } - - @Override - public String getName() { - if (this.getDamage() == 0x01) { - return "Mossy Cobblestone Wall"; - } - - return "Cobblestone Wall"; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - - boolean north = this.canConnect(this.getSide(BlockFace.NORTH)); - boolean south = this.canConnect(this.getSide(BlockFace.SOUTH)); - boolean west = this.canConnect(this.getSide(BlockFace.WEST)); - boolean east = this.canConnect(this.getSide(BlockFace.EAST)); - - double n = north ? 0 : 0.25; - double s = south ? 1 : 0.75; - double w = west ? 0 : 0.25; - double e = east ? 1 : 0.75; - - if (north && south && !west && !east) { - w = 0.3125; - e = 0.6875; - } else if (!north && !south && west && east) { - n = 0.3125; - s = 0.6875; - } - - return new AxisAlignedBB( - this.x + w, - this.y, - this.z + n, - this.x + e, - this.y + 1.5, - this.z + s - ); - } - - public boolean canConnect(Block block) { - return (!(block.getId() != COBBLE_WALL && block.getId() != FENCE_GATE)) || block.isSolid() && !block.isTransparent(); - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public boolean canHarvestWithHand() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWallBanner.java b/src/main/java/cn/nukkit/block/BlockWallBanner.java deleted file mode 100644 index 4a1468bc4..000000000 --- a/src/main/java/cn/nukkit/block/BlockWallBanner.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; - -/** - * Created by PetteriM1 - */ -public class BlockWallBanner extends BlockBanner { - - public BlockWallBanner() { - this(0); - } - - public BlockWallBanner(int meta) { - super(meta); - } - - @Override - public int getId() { - return WALL_BANNER; - } - - @Override - public String getName() { - return "Wall Banner"; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.getDamage() >= BlockFace.NORTH.getIndex() && this.getDamage() <= BlockFace.EAST.getIndex()) { - if (this.getSide(BlockFace.fromIndex(this.getDamage()).getOpposite()).getId() == AIR) { - this.getLevel().useBreakOn(this); - } - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWallSign.java b/src/main/java/cn/nukkit/block/BlockWallSign.java deleted file mode 100644 index 695352b0b..000000000 --- a/src/main/java/cn/nukkit/block/BlockWallSign.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; - -/** - * Created by Pub4Game on 26.12.2015. - */ -public class BlockWallSign extends BlockSignPost { - - private static final int[] faces = { - 3, - 2, - 5, - 4, - }; - - public BlockWallSign() { - this(0); - } - - public BlockWallSign(int meta) { - super(meta); - } - - @Override - public int getId() { - return WALL_SIGN; - } - - @Override - public String getName() { - return "Wall Sign"; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (this.getDamage() >= 2 && this.getDamage() <= 5) { - if (this.getSide(BlockFace.fromIndex(faces[this.getDamage() - 2])).getId() == Item.AIR) { - this.getLevel().useBreakOn(this); - } - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWater.java b/src/main/java/cn/nukkit/block/BlockWater.java deleted file mode 100644 index 7a49315e2..000000000 --- a/src/main/java/cn/nukkit/block/BlockWater.java +++ /dev/null @@ -1,95 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.block.WaterFrostEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.Utils; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockWater extends BlockLiquid { - - /** - * Used to cache biome check for freezing - * 1 = can't freeze, 2 = can freeze - */ - private byte freezing; - - public BlockWater() { - this(0); - } - - public BlockWater(int meta) { - super(meta); - } - - @Override - public int getId() { - return WATER; - } - - @Override - public String getName() { - return "Water"; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - boolean ret = this.getLevel().setBlock(this, this, true, false); - this.getLevel().scheduleUpdate(this, this.tickRate()); - - return ret; - } - - @Override - public BlockColor getColor() { - return BlockColor.WATER_BLOCK_COLOR; - } - - @Override - public BlockLiquid getBlock(int meta) { - return (BlockLiquid) Block.get(WATER, meta); - } - - @Override - public void onEntityCollide(Entity entity) { - super.onEntityCollide(entity); - - if (entity.fireTicks > 0) { - entity.extinguish(); - } - } - - @Override - public int tickRate() { - return 5; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_RANDOM && this.getDamage() == 0) { - if (freezing < 1) { - freezing = Utils.freezingBiomes.contains(level.getBiomeId((int) this.x, (int) this.z)) ? (byte) 2 : (byte) 1; - } - if (freezing == 2) { - if (ThreadLocalRandom.current().nextInt(10) == 0 && level.getBlockLightAt((int) this.x, (int) this.y, (int) this.z) < 12 && level.canBlockSeeSky(this)) { - WaterFrostEvent ev = new WaterFrostEvent(this); - level.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - level.setBlock(this, Block.get(Block.ICE), true, true); - } - } - } - return Level.BLOCK_UPDATE_RANDOM; - } - return super.onUpdate(type); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWaterLily.java b/src/main/java/cn/nukkit/block/BlockWaterLily.java deleted file mode 100644 index e2e475d6e..000000000 --- a/src/main/java/cn/nukkit/block/BlockWaterLily.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/1 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockWaterLily extends BlockFlowable { - - public BlockWaterLily() { - this(0); - } - - public BlockWaterLily(int meta) { - super(0); - } - - @Override - public String getName() { - return "Lily Pad"; - } - - @Override - public int getId() { - return WATER_LILY; - } - - @Override - protected AxisAlignedBB recalculateBoundingBox() { - return new AxisAlignedBB( - this.x + 0.0625, - this.y, - this.z + 0.0625, - this.x + 0.9375, - this.y + 0.015625, - this.z + 0.9375 - ); - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - if (target instanceof BlockWater) { - Block up = target.up(); - if (up.getId() == Block.AIR) { - this.getLevel().setBlock(up, this, true, true); - return true; - } - } - return false; - } - - @Override - public int onUpdate(int type) { - if (type == Level.BLOCK_UPDATE_NORMAL) { - if (!(this.down() instanceof BlockWater)) { - this.getLevel().useBreakOn(this); - return Level.BLOCK_UPDATE_NORMAL; - } - } - return 0; - } - - @Override - public BlockColor getColor() { - return BlockColor.FOLIAGE_BLOCK_COLOR; - } - - @Override - public boolean canPassThrough() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWaterStill.java b/src/main/java/cn/nukkit/block/BlockWaterStill.java deleted file mode 100644 index 40822a32f..000000000 --- a/src/main/java/cn/nukkit/block/BlockWaterStill.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.block; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class BlockWaterStill extends BlockWater { - - public BlockWaterStill() { - super(0); - } - - public BlockWaterStill(int meta) { - super(meta); - } - - @Override - public int getId() { - return STILL_WATER; - } - - @Override - public String getName() { - return "Still Water"; - } - - @Override - public BlockLiquid getBlock(int meta) { - return (BlockLiquid) Block.get(STILL_WATER, meta); - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWeightedPressurePlateHeavy.java b/src/main/java/cn/nukkit/block/BlockWeightedPressurePlateHeavy.java deleted file mode 100644 index d52ae08ae..000000000 --- a/src/main/java/cn/nukkit/block/BlockWeightedPressurePlateHeavy.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.utils.BlockColor; - -/** - * @author CreeperFace - */ -public class BlockWeightedPressurePlateHeavy extends BlockPressurePlateBase { - - public BlockWeightedPressurePlateHeavy() { - this(0); - } - - public BlockWeightedPressurePlateHeavy(int meta) { - super(meta); - this.onPitch = 0.90000004f; - this.offPitch = 0.75f; - } - - @Override - public int getId() { - return HEAVY_WEIGHTED_PRESSURE_PLATE; - } - - @Override - public String getName() { - return "Weighted Pressure Plate (Heavy)"; - } - - @Override - public double getHardness() { - return 0.5D; - } - - @Override - public double getResistance() { - return 2.5D; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public BlockColor getColor() { - return BlockColor.IRON_BLOCK_COLOR; - } - - @Override - protected int computeRedstoneStrength() { - int count = Math.min(this.level.getCollidingEntities(getCollisionBoundingBox()).length, this.getMaxWeight()); - - if (count > 0) { - float f = (float) Math.min(this.getMaxWeight(), count) / (float) this.getMaxWeight(); - return Math.max(1, NukkitMath.ceilFloat(f * 15.0F)); - } else { - return 0; - } - } - - public int getMaxWeight() { - return 150; - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWeightedPressurePlateLight.java b/src/main/java/cn/nukkit/block/BlockWeightedPressurePlateLight.java deleted file mode 100644 index 9859e303e..000000000 --- a/src/main/java/cn/nukkit/block/BlockWeightedPressurePlateLight.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.utils.BlockColor; - -/** - * @author CreeperFace - */ -public class BlockWeightedPressurePlateLight extends BlockPressurePlateBase { - - public BlockWeightedPressurePlateLight() { - this(0); - } - - public BlockWeightedPressurePlateLight(int meta) { - super(meta); - this.onPitch = 0.90000004f; - this.offPitch = 0.75f; - } - - @Override - public int getId() { - return LIGHT_WEIGHTED_PRESSURE_PLATE; - } - - @Override - public String getName() { - return "Weighted Pressure Plate (Light)"; - } - - @Override - public double getHardness() { - return 0.5D; - } - - @Override - public double getResistance() { - return 2.5D; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_PICKAXE; - } - - @Override - public Item[] getDrops(Item item) { - if (item.isPickaxe()) { - return new Item[]{ - toItem() - }; - } else { - return new Item[0]; - } - } - - @Override - public Item toItem() { - return new ItemBlock(this, 0); - } - - @Override - public BlockColor getColor() { - return BlockColor.GOLD_BLOCK_COLOR; - } - - @Override - protected int computeRedstoneStrength() { - int count = Math.min(this.level.getCollidingEntities(getCollisionBoundingBox()).length, this.getMaxWeight()); - - if (count > 0) { - float f = (float) Math.min(this.getMaxWeight(), count) / (float) this.getMaxWeight(); - return NukkitMath.ceilFloat(f * 15.0F); - } else { - return 0; - } - } - - public int getMaxWeight() { - return 15; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/BlockWheat.java b/src/main/java/cn/nukkit/block/BlockWheat.java deleted file mode 100644 index f025c07be..000000000 --- a/src/main/java/cn/nukkit/block/BlockWheat.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSeedsWheat; -import cn.nukkit.item.ItemWheat; -import cn.nukkit.utils.Utils; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockWheat extends BlockCrops { - - public BlockWheat() { - this(0); - } - - public BlockWheat(int meta) { - super(meta); - } - - @Override - public String getName() { - return "Wheat Block"; - } - - @Override - public int getId() { - return WHEAT_BLOCK; - } - - @Override - public Item toItem() { - return new ItemSeedsWheat(); - } - - @Override - public Item[] getDrops(Item item) { - if (this.getDamage() >= 0x07) { - return new Item[]{ - new ItemWheat(), - new ItemSeedsWheat(0, Utils.random.nextInt(1, 3)) - }; - } else { - return new Item[]{ - new ItemSeedsWheat() - }; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWood.java b/src/main/java/cn/nukkit/block/BlockWood.java deleted file mode 100644 index 5dda5346d..000000000 --- a/src/main/java/cn/nukkit/block/BlockWood.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemTool; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockWood extends BlockSolidMeta { - - public static final int OAK = 0; - public static final int SPRUCE = 1; - public static final int BIRCH = 2; - public static final int JUNGLE = 3; - - private static final short[] faces = new short[]{ - 0, - 0, - 0b1000, - 0b1000, - 0b0100, - 0b0100 - }; - - public BlockWood() { - this(0); - } - - public BlockWood(int meta) { - super(meta); - } - - @Override - public int getId() { - return WOOD; - } - - @Override - public double getHardness() { - return 2; - } - - @Override - public double getResistance() { - return 10; - } - - @Override - public String getName() { - String[] names = new String[]{ - "Oak Wood", - "Spruce Wood", - "Birch Wood", - "Jungle Wood" - }; - - return names[this.getDamage() & 0x03]; - } - - @Override - public int getBurnChance() { - return 5; - } - - @Override - public int getBurnAbility() { - return 10; - } - - @Override - public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { - this.setDamage(((this.getDamage() & 0x03) | faces[face.getIndex()])); - this.getLevel().setBlock(block, this, true, true); - - return true; - } - - @Override - public Item toItem() { - return new ItemBlock(this, this.getDamage() & 0x03); - } - - @Override - public int getToolType() { - return ItemTool.TYPE_AXE; - } - - @Override - public BlockColor getColor() { - switch (getDamage() & 0x07) { - default: - case OAK: - return BlockColor.WOOD_BLOCK_COLOR; - case SPRUCE: - return BlockColor.SPRUCE_BLOCK_COLOR; - case BIRCH: - return BlockColor.SAND_BLOCK_COLOR; - case JUNGLE: - return BlockColor.DIRT_BLOCK_COLOR; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWood2.java b/src/main/java/cn/nukkit/block/BlockWood2.java deleted file mode 100644 index 540ae2a4a..000000000 --- a/src/main/java/cn/nukkit/block/BlockWood2.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.utils.BlockColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockWood2 extends BlockWood { - - public static final int ACACIA = 0; - public static final int DARK_OAK = 1; - - private static final String[] NAMES = new String[]{ - "Acacia Wood", - "Dark Oak Wood", - "" - }; - - public BlockWood2() { - this(0); - } - - public BlockWood2(int meta) { - super(meta); - } - - @Override - public int getId() { - return WOOD2; - } - - @Override - public String getName() { - return NAMES[this.getDamage() > 2 ? 0 : this.getDamage()]; - } - - @Override - public BlockColor getColor() { - switch (getDamage() & 0x07) { - case ACACIA: - return BlockColor.ORANGE_BLOCK_COLOR; - case DARK_OAK: - return BlockColor.BROWN_BLOCK_COLOR; - default: - return BlockColor.WOOD_BLOCK_COLOR; - } - } -} diff --git a/src/main/java/cn/nukkit/block/BlockWool.java b/src/main/java/cn/nukkit/block/BlockWool.java deleted file mode 100644 index ede90427b..000000000 --- a/src/main/java/cn/nukkit/block/BlockWool.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.block; - -import cn.nukkit.item.ItemTool; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created on 2015/12/2 by xtypr. - * Package cn.nukkit.block in project Nukkit . - */ -public class BlockWool extends BlockSolidMeta { - - public BlockWool() { - this(0); - } - - public BlockWool(int meta) { - super(meta); - } - - public BlockWool(DyeColor dyeColor) { - this(dyeColor.getWoolData()); - } - - @Override - public String getName() { - return getDyeColor().getName() + " Wool"; - } - - @Override - public int getId() { - return WOOL; - } - - @Override - public int getToolType() { - return ItemTool.TYPE_SHEARS; - } - - @Override - public double getHardness() { - return 0.8; - } - - @Override - public double getResistance() { - return 4; - } - - @Override - public int getBurnChance() { - return 30; - } - - @Override - public int getBurnAbility() { - return 60; - } - - @Override - public BlockColor getColor() { - return DyeColor.getByWoolData(getDamage()).getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(getDamage()); - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntity.java b/src/main/java/cn/nukkit/blockentity/BlockEntity.java deleted file mode 100644 index c685ed738..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntity.java +++ /dev/null @@ -1,212 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.level.Position; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.ChunkException; -import co.aikar.timings.Timing; -import co.aikar.timings.Timings; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; - -import java.lang.reflect.Constructor; - -/** - * @author MagicDroidX - */ -public abstract class BlockEntity extends Position { - - //WARNING: DO NOT CHANGE ANY NAME HERE, OR THE CLIENT WILL CRASH - public static final String CHEST = "Chest"; - public static final String ENDER_CHEST = "EnderChest"; - public static final String FURNACE = "Furnace"; - public static final String SIGN = "Sign"; - public static final String MOB_SPAWNER = "MobSpawner"; - public static final String ENCHANT_TABLE = "EnchantTable"; - public static final String SKULL = "Skull"; - public static final String FLOWER_POT = "FlowerPot"; - public static final String BREWING_STAND = "BrewingStand"; - public static final String DAYLIGHT_DETECTOR = "DaylightDetector"; - public static final String MUSIC = "Music"; - public static final String ITEM_FRAME = "ItemFrame"; - public static final String CAULDRON = "Cauldron"; - public static final String BEACON = "Beacon"; - public static final String PISTON_ARM = "PistonArm"; - public static final String MOVING_BLOCK = "MovingBlock"; - public static final String COMPARATOR = "Comparator"; - public static final String HOPPER = "Hopper"; - public static final String BED = "Bed"; - public static final String JUKEBOX = "Jukebox"; - public static final String SHULKER_BOX = "ShulkerBox"; - public static final String BANNER = "Banner"; - public static final String DROPPER = "Dropper"; - public static final String DISPENSER = "Dispenser"; - - public static long count = 1; - - private static final BiMap> knownBlockEntities = HashBiMap.create(24); - - public FullChunk chunk; - public String name; - public long id; - - public boolean movable; - - public boolean closed = false; - public CompoundTag namedTag; - protected Server server; - protected Timing timing; - - public BlockEntity(FullChunk chunk, CompoundTag nbt) { - if (chunk == null || chunk.getProvider() == null) { - throw new ChunkException("Invalid garbage chunk given to BlockEntity"); - } - - this.timing = Timings.getBlockEntityTiming(this); - this.server = chunk.getProvider().getLevel().getServer(); - this.chunk = chunk; - this.setLevel(chunk.getProvider().getLevel()); - this.namedTag = nbt; - this.name = ""; - this.id = BlockEntity.count++; - this.x = this.namedTag.getInt("x"); - this.y = this.namedTag.getInt("y"); - this.z = this.namedTag.getInt("z"); - this.movable = this.namedTag.getBoolean("isMovable", true); - - this.initBlockEntity(); - - this.chunk.addBlockEntity(this); - this.getLevel().addBlockEntity(this); - } - - protected void initBlockEntity() {} - - public static BlockEntity createBlockEntity(String type, FullChunk chunk, CompoundTag nbt, Object... args) { - BlockEntity blockEntity = null; - - if (knownBlockEntities.containsKey(type)) { - Class clazz = knownBlockEntities.get(type); - - if (clazz == null) { - return null; - } - - for (Constructor constructor : clazz.getConstructors()) { - if (blockEntity != null) { - break; - } - - if (constructor.getParameterCount() != (args == null ? 2 : args.length + 2)) { - continue; - } - - try { - if (args == null || args.length == 0) { - blockEntity = (BlockEntity) constructor.newInstance(chunk, nbt); - } else { - Object[] objects = new Object[args.length + 2]; - - objects[0] = chunk; - objects[1] = nbt; - System.arraycopy(args, 0, objects, 2, args.length); - blockEntity = (BlockEntity) constructor.newInstance(objects); - - } - } catch (Exception ignored) {} - } - } else { - Server.getInstance().getLogger().warning("Tried to create block entity that doesn't exists: " + type); - } - - return blockEntity; - } - - public static boolean registerBlockEntity(String name, Class c) { - if (c == null) { - return false; - } - - knownBlockEntities.put(name, c); - return true; - } - - public final String getSaveId() { - return knownBlockEntities.inverse().get(getClass()); - } - - public long getId() { - return id; - } - - public void saveNBT() { - this.namedTag.putString("id", this.getSaveId()); - this.namedTag.putInt("x", (int) this.getX()); - this.namedTag.putInt("y", (int) this.getY()); - this.namedTag.putInt("z", (int) this.getZ()); - this.namedTag.putBoolean("isMovable", this.movable); - } - - public CompoundTag getCleanedNBT() { - this.saveNBT(); - CompoundTag tag = this.namedTag.clone(); - tag.remove("x").remove("y").remove("z").remove("id"); - if (!tag.getTags().isEmpty()) { - return tag; - } else { - return null; - } - } - - public Block getBlock() { - return this.getLevelBlock(); - } - - public abstract boolean isBlockEntityValid(); - - public boolean onUpdate() { - return false; - } - - public final void scheduleUpdate() { - this.level.scheduleBlockEntityUpdate(this); - } - - public void close() { - if (!this.closed) { - this.closed = true; - if (this.chunk != null) { - this.chunk.removeBlockEntity(this); - } - if (this.level != null) { - this.level.removeBlockEntity(this); - } - this.level = null; - } - } - - public void onBreak() {} - - public void setDirty() { - chunk.setChanged(); - } - - public String getName() { - return name; - } - - public boolean isMovable() { - return movable; - } - - public static CompoundTag getDefaultCompound(Vector3 pos, String id) { - return new CompoundTag() - .putString("id", id) - .putInt("x", pos.getFloorX()) - .putInt("y", pos.getFloorY()) - .putInt("z", pos.getFloorZ()); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityBanner.java b/src/main/java/cn/nukkit/blockentity/BlockEntityBanner.java deleted file mode 100644 index ece50cf03..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityBanner.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.BannerPattern; -import cn.nukkit.utils.DyeColor; - -public class BlockEntityBanner extends BlockEntitySpawnable { - - public int color; - - public BlockEntityBanner(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (!this.namedTag.contains("color")) { - this.namedTag.putByte("color", 0); - } - - this.color = this.namedTag.getByte("color"); - - super.initBlockEntity(); - } - - @Override - public boolean isBlockEntityValid() { - return this.getBlock().getId() == Block.WALL_BANNER || this.getBlock().getId() == Block.STANDING_BANNER; - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putByte("color", this.color); - } - - @Override - public String getName() { - return "Banner"; - } - - public int getBaseColor() { - return this.namedTag.getInt("Base"); - } - - public void setBaseColor(DyeColor color) { - this.namedTag.putInt("Base", color.getDyeData() & 0x0f); - } - - public int getType() { - return this.namedTag.getInt("Type"); - } - - public void setType(int type) { - this.namedTag.putInt("Type", type); - } - - public void addPattern(BannerPattern pattern) { - ListTag patterns = this.namedTag.getList("Patterns", CompoundTag.class); - patterns.add(new CompoundTag(""). - putInt("Color", pattern.getColor().getDyeData() & 0x0f). - putString("Pattern", pattern.getType().getName())); - this.namedTag.putList(patterns); - } - - public BannerPattern getPattern(int index) { - return BannerPattern.fromCompoundTag(this.namedTag.getList("Patterns").size() > index && index >= 0 ? this.namedTag.getList("Patterns", CompoundTag.class).get(index) : new CompoundTag()); - } - - public void removePattern(int index) { - ListTag patterns = this.namedTag.getList("Patterns", CompoundTag.class); - if (patterns.size() > index && index >= 0) { - patterns.remove(index); - } - } - - public int getPatternsSize() { - return this.namedTag.getList("Patterns").size(); - } - - @Override - public CompoundTag getSpawnCompound() { - return getDefaultCompound(this, BANNER) - .putInt("Base", getBaseColor()) - .putList(this.namedTag.getList("Patterns")) - .putInt("Type", getType()) - .putByte("color", this.color); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(color); - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityBeacon.java b/src/main/java/cn/nukkit/blockentity/BlockEntityBeacon.java deleted file mode 100644 index 2838c3262..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityBeacon.java +++ /dev/null @@ -1,250 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.potion.Effect; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * @author Rover656 - */ -public class BlockEntityBeacon extends BlockEntitySpawnable { - - public BlockEntityBeacon(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (!namedTag.contains("Lock")) { - namedTag.putString("Lock", ""); - } - - if (!namedTag.contains("Levels")) { - namedTag.putInt("Levels", 0); - } - - if (!namedTag.contains("Primary")) { - namedTag.putInt("Primary", 0); - } - - if (!namedTag.contains("Secondary")) { - namedTag.putInt("Secondary", 0); - } - - this.scheduleUpdate(); - - super.initBlockEntity(); - } - - @Override - public boolean isBlockEntityValid() { - int blockID = getBlock().getId(); - return blockID == Block.BEACON; - } - - @Override - public CompoundTag getSpawnCompound() { - return new CompoundTag() - .putString("id", BlockEntity.BEACON) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putString("Lock", this.namedTag.getString("Lock")) - .putInt("Levels", this.namedTag.getInt("Levels")) - .putInt("Primary", this.namedTag.getInt("Primary")) - .putInt("Secondary", this.namedTag.getInt("Secondary")); - } - - private long currentTick = 0; - - @Override - public boolean onUpdate() { - //Only apply effects every 4 secs - if (currentTick++ % 80 != 0) { - return true; - } - - int oldPowerLevel = this.getPowerLevel(); - //Get the power level based on the pyramid - setPowerLevel(calculatePowerLevel()); - - //Skip beacons that do not have a pyramid or sky access - if (this.getPowerLevel() < 1 || !hasSkyAccess()) { - if (oldPowerLevel > 0) { - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BEACON_DEACTIVATE); - } - return true; - } else if (oldPowerLevel < 1) { - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BEACON_ACTIVATE); - } else { - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BEACON_AMBIENT); - } - - int duration = 9 + (getPowerLevel() << 1); - - for (Map.Entry entry : this.level.getPlayers().entrySet()) { - Player p = entry.getValue(); - - //If the player is in range - if (p.distance(this) < 10 + getPowerLevel() * 10) { - Effect e; - - if (getPrimaryPower() != 0) { - //Apply the primary power - e = Effect.getEffect(getPrimaryPower()); - - //Set duration - e.setDuration(duration * 20); - - //If secondary is selected as the primary too, apply 2 amplification - if (getSecondaryPower() == getPrimaryPower()) { - e.setAmplifier(1); - } else { - e.setAmplifier(0); - } - - //Hide particles - e.setVisible(false); - - //Add the effect - p.addEffect(e); - } - - //If we have a secondary power as regen, apply it - if (getSecondaryPower() == Effect.REGENERATION) { - //Get the regen effect - e = Effect.getEffect(Effect.REGENERATION); - - //Set duration - e.setDuration(duration * 20); - - //Regen I - e.setAmplifier(0); - - //Hide particles - e.setVisible(false); - - //Add effect - p.addEffect(e); - } - } - } - - return true; - } - - private static final int POWER_LEVEL_MAX = 4; - - private boolean hasSkyAccess() { - //Check every block from our y coord to the top of the world - for (int y = getFloorY() + 1; y <= 255; y++) { - int testBlockId = level.getBlockIdAt(chunk, getFloorX(), y, getFloorZ()); - if (!Block.transparent[testBlockId]) { - //There is no sky access - return false; - } - } - - return true; - } - - private int calculatePowerLevel() { - //The power level that we're testing for - for (int powerLevel = 1; powerLevel <= POWER_LEVEL_MAX; powerLevel++) { - int queryY = getFloorY() - powerLevel; //Layer below the beacon block - - for (int queryX = getFloorX() - powerLevel; queryX <= getFloorX() + powerLevel; queryX++) { - for (int queryZ = getFloorZ() - powerLevel; queryZ <= getFloorZ() + powerLevel; queryZ++) { - - int testBlockId = level.getBlockIdAt(queryX, queryY, queryZ); - if ( - testBlockId != Block.IRON_BLOCK && - testBlockId != Block.GOLD_BLOCK && - testBlockId != Block.EMERALD_BLOCK && - testBlockId != Block.DIAMOND_BLOCK - ) { - return powerLevel - 1; - } - } - } - } - - return POWER_LEVEL_MAX; - } - - public int getPowerLevel() { - return namedTag.getInt("Level"); - } - - public void setPowerLevel(int level) { - int currentLevel = getPowerLevel(); - if (level != currentLevel) { - namedTag.putInt("Level", level); - setDirty(); - this.spawnToAll(); - } - } - - public int getPrimaryPower() { - return namedTag.getInt("Primary"); - } - - public void setPrimaryPower(int power) { - int currentPower = getPrimaryPower(); - if (power != currentPower) { - namedTag.putInt("Primary", power); - setDirty(); - this.spawnToAll(); - } - } - - public int getSecondaryPower() { - return namedTag.getInt("Secondary"); - } - - public void setSecondaryPower(int power) { - int currentPower = getSecondaryPower(); - if (power != currentPower) { - namedTag.putInt("Secondary", power); - setDirty(); - this.spawnToAll(); - } - } - - private static final List allowedEffects = Arrays.asList(Effect.SPEED, Effect.HASTE, Effect.DAMAGE_RESISTANCE, Effect.JUMP, Effect.STRENGTH, Effect.REGENERATION); - - @Override - public boolean updateCompoundTag(CompoundTag nbt, Player player) { - if (!nbt.getString("id").equals(BlockEntity.BEACON)) { - return false; - } - - int primary = nbt.getInt("primary"); - if (allowedEffects.contains(primary)) { - this.setPrimaryPower(primary); - } else { - Server.getInstance().getLogger().debug(player.getName() + " tried to set an invalid primary effect to a beacon: " + primary); - } - - int secondary = nbt.getInt("secondary"); - if (allowedEffects.contains(secondary)) { - this.setSecondaryPower(secondary); - } else { - Server.getInstance().getLogger().debug(player.getName() + " tried to set an invalid secondary effect to a beacon: " + secondary); - } - - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BEACON_POWER); - - player.getWindowById(Player.BEACON_WINDOW_ID).setItem(0, Item.get(Item.AIR)); - return true; - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityBed.java b/src/main/java/cn/nukkit/blockentity/BlockEntityBed.java deleted file mode 100644 index 74a17852c..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityBed.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.DyeColor; - -/** - * Created by CreeperFace on 2.6.2017. - */ -public class BlockEntityBed extends BlockEntitySpawnable { - - public int color; - - public BlockEntityBed(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (!this.namedTag.contains("color")) { - this.namedTag.putByte("color", 0); - } - - this.color = this.namedTag.getByte("color"); - - super.initBlockEntity(); - } - - @Override - public boolean isBlockEntityValid() { - return this.level.getBlockIdAt(chunk, this.getFloorX(), this.getFloorY(), this.getFloorZ()) == Item.BED_BLOCK; - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putByte("color", this.color); - } - - @Override - public CompoundTag getSpawnCompound() { - return new CompoundTag() - .putString("id", BlockEntity.BED) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putByte("color", this.color); - } - - public DyeColor getDyeColor() { - return DyeColor.getByWoolData(color); - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityBrewingStand.java b/src/main/java/cn/nukkit/blockentity/BlockEntityBrewingStand.java deleted file mode 100644 index 393d4fccc..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityBrewingStand.java +++ /dev/null @@ -1,391 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockBrewingStand; -import cn.nukkit.block.BlockID; -import cn.nukkit.event.inventory.BrewEvent; -import cn.nukkit.event.inventory.StartBrewEvent; -import cn.nukkit.inventory.*; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.ItemID; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.ContainerSetDataPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; - -public class BlockEntityBrewingStand extends BlockEntitySpawnable implements InventoryHolder, BlockEntityContainer, BlockEntityNameable { - - protected BrewingInventory inventory; - - public static final int MAX_BREW_TIME = 400; - - public int brewTime; - public int fuelTotal; - public int fuelAmount; - - public static final List ingredients = new ArrayList<>(Arrays.asList(Item.NETHER_WART, Item.GHAST_TEAR, Item.GLOWSTONE_DUST, Item.REDSTONE_DUST, Item.GUNPOWDER, Item.MAGMA_CREAM, Item.BLAZE_POWDER, Item.GOLDEN_CARROT, Item.SPIDER_EYE, Item.FERMENTED_SPIDER_EYE, Item.GLISTERING_MELON, Item.SUGAR, Item.RABBIT_FOOT, Item.PUFFERFISH, Item.TURTLE_SHELL, Item.PHANTOM_MEMBRANE, Item.DRAGON_BREATH)); - - public BlockEntityBrewingStand(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - inventory = new BrewingInventory(this); - - if (!namedTag.contains("Items") || !(namedTag.get("Items") instanceof ListTag)) { - namedTag.putList(new ListTag("Items")); - } - - for (int i = 0; i < getSize(); i++) { - inventory.setItem(i, this.getItem(i)); - } - - if (!namedTag.contains("CookTime") || namedTag.getShort("CookTime") > MAX_BREW_TIME) { - this.brewTime = MAX_BREW_TIME; - } else { - this.brewTime = namedTag.getShort("CookTime"); - } - - this.fuelAmount = namedTag.getShort("FuelAmount"); - this.fuelTotal = namedTag.getShort("FuelTotal"); - - if (brewTime < MAX_BREW_TIME) { - this.scheduleUpdate(); - } - - super.initBlockEntity(); - } - - @Override - public String getName() { - return this.hasName() ? this.namedTag.getString("CustomName") : "Brewing Stand"; - } - - @Override - public boolean hasName() { - return namedTag.contains("CustomName"); - } - - @Override - public void setName(String name) { - if (name == null || name.isEmpty()) { - namedTag.remove("CustomName"); - return; - } - - namedTag.putString("CustomName", name); - } - - @Override - public void close() { - if (!closed) { - for (Player player : new HashSet<>(inventory.getViewers())) { - player.removeWindow(inventory); - } - super.close(); - } - } - - @Override - public void onBreak() { - for (Item content : inventory.getContents().values()) { - level.dropItem(this, content); - } - inventory.clearAll(); - } - - @Override - public void saveNBT() { - namedTag.putList(new ListTag("Items")); - for (int index = 0; index < getSize(); index++) { - this.setItem(index, inventory.getItem(index)); - } - - namedTag.putShort("CookTime", brewTime); - namedTag.putShort("FuelAmount", this.fuelAmount); - namedTag.putShort("FuelTotal", this.fuelTotal); - } - - @Override - public boolean isBlockEntityValid() { - return getBlock().getId() == Block.BREWING_STAND_BLOCK; - } - - @Override - public int getSize() { - return 5; - } - - protected int getSlotIndex(int index) { - ListTag list = this.namedTag.getList("Items", CompoundTag.class); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getByte("Slot") == index) { - return i; - } - } - - return -1; - } - - @Override - public Item getItem(int index) { - int i = this.getSlotIndex(index); - if (i < 0) { - return new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } else { - CompoundTag data = (CompoundTag) this.namedTag.getList("Items").get(i); - return NBTIO.getItemHelper(data); - } - } - - @Override - public void setItem(int index, Item item) { - int i = this.getSlotIndex(index); - - CompoundTag d = NBTIO.putItemHelper(item, index); - - if (item.getId() == Item.AIR || item.getCount() <= 0) { - if (i >= 0) { - this.namedTag.getList("Items").getAll().remove(i); - } - } else if (i < 0) { - (this.namedTag.getList("Items", CompoundTag.class)).add(d); - } else { - (this.namedTag.getList("Items", CompoundTag.class)).add(i, d); - } - } - - @Override - public BrewingInventory getInventory() { - return inventory; - } - - protected boolean checkIngredient(Item ingredient) { - return ingredients.contains(ingredient.getId()); - } - - @Override - public boolean onUpdate() { - if (closed) { - return false; - } - - restockFuel(); - - if (this.fuelAmount <= 0 || matchRecipes(true)[0] == null) { - stopBrewing(); - return false; - } - - if (brewTime == MAX_BREW_TIME) { - StartBrewEvent e = new StartBrewEvent(this); - this.server.getPluginManager().callEvent(e); - - if (e.isCancelled()) { - return false; - } - - this.sendBrewTime(); - } - - if (--brewTime > 0) { - - if (brewTime % 40 == 0) { - sendBrewTime(); - } - - return true; - } - - //20 seconds - BrewEvent e = new BrewEvent(this); - this.server.getPluginManager().callEvent(e); - - if (e.isCancelled()) { - stopBrewing(); - return true; - } - - boolean mixed = false; - MixRecipe[] recipes = matchRecipes(false); - for (int i = 0; i < 3; i++) { - MixRecipe recipe = recipes[i]; - if (recipe == null) { - continue; - } - - Item previous = inventory.getItem(i + 1); - if (!previous.isNull()) { - Item result = recipe.getResult(); - result.setCount(previous.getCount()); - if (recipe instanceof ContainerRecipe) { - result.setDamage(previous.getDamage()); - } - inventory.setItem(i + 1, result); - mixed = true; - } - } - - if (mixed) { - Item ingredient = this.inventory.getIngredient(); - ingredient.count--; - this.inventory.setIngredient(ingredient); - - this.fuelAmount--; - this.sendFuel(); - - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_POTION_BREWED); - } - - stopBrewing(); - return true; - } - - private void restockFuel() { - Item fuel = this.getInventory().getFuel(); - if (this.fuelAmount > 0 || fuel.getId() != ItemID.BLAZE_POWDER || fuel.getCount() <= 0) { - return; - } - - fuel.count--; - this.fuelAmount = 20; - this.fuelTotal = 20; - - this.inventory.setFuel(fuel); - this.sendFuel(); - } - - private void stopBrewing() { - this.brewTime = 0; - this.sendBrewTime(); - this.brewTime = MAX_BREW_TIME; - } - - private MixRecipe[] matchRecipes(boolean quickTest) { - MixRecipe[] recipes = new MixRecipe[quickTest? 1 : 3]; - Item ingredient = inventory.getIngredient(); - CraftingManager craftingManager = getLevel().getServer().getCraftingManager(); - for (int i = 0; i < 3; i++) { - Item potion = inventory.getItem(i + 1); - if (potion.isNull()) { - continue; - } - - MixRecipe recipe = craftingManager.matchBrewingRecipe(ingredient, potion); - if (recipe == null) { - recipe = craftingManager.matchContainerRecipe(ingredient, potion); - } - if (recipe == null) { - continue; - } - - if (quickTest) { - recipes[0] = recipe; - return recipes; - } - - recipes[i] = recipe; - } - - return recipes; - } - - protected void sendFuel() { - ContainerSetDataPacket pk = new ContainerSetDataPacket(); - - for (Player p : this.inventory.getViewers()) { - int windowId = p.getWindowId(this.inventory); - if (windowId > 0) { - pk.windowId = windowId; - - pk.property = ContainerSetDataPacket.PROPERTY_BREWING_STAND_FUEL_AMOUNT; - pk.value = this.fuelAmount; - p.dataPacket(pk); - - pk.property = ContainerSetDataPacket.PROPERTY_BREWING_STAND_FUEL_TOTAL; - pk.value = this.fuelTotal; - p.dataPacket(pk); - } - } - } - - protected void sendBrewTime() { - ContainerSetDataPacket pk = new ContainerSetDataPacket(); - pk.property = ContainerSetDataPacket.PROPERTY_BREWING_STAND_BREW_TIME; - pk.value = this.brewTime; - - for (Player p : this.inventory.getViewers()) { - int windowId = p.getWindowId(this.inventory); - if (windowId > 0) { - pk.windowId = windowId; - - p.dataPacket(pk); - } - } - } - - public void updateBlock() { - Block block = this.getLevelBlock(); - - if (!(block instanceof BlockBrewingStand)) { - return; - } - - int meta = 0; - - for (int i = 1; i <= 3; ++i) { - Item potion = this.inventory.getItem(i); - - int id = potion.getId(); - if ((id == Item.POTION || id == Item.SPLASH_POTION || id == Item.LINGERING_POTION) && potion.getCount() > 0) { - meta |= 1 << (i - 1); - } - } - - block.setDamage(meta); - this.level.setBlock(block, block, false, false); - - if (brewTime != MAX_BREW_TIME && matchRecipes(true)[0] == null) { - stopBrewing(); - } - } - - public int getFuel() { - return fuelAmount; - } - - public void setFuel(int fuel) { - this.fuelAmount = fuel; - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag nbt = new CompoundTag() - .putString("id", BlockEntity.BREWING_STAND) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putShort("FuelTotal", this.fuelTotal) - .putShort("FuelAmount", this.fuelAmount); - - if (this.brewTime < MAX_BREW_TIME) { - nbt.putShort("CookTime", this.brewTime); - } - - if (this.hasName()) { - nbt.put("CustomName", namedTag.get("CustomName")); - } - - return nbt; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityCauldron.java b/src/main/java/cn/nukkit/blockentity/BlockEntityCauldron.java deleted file mode 100644 index 429e07d8d..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityCauldron.java +++ /dev/null @@ -1,147 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.UpdateBlockPacket; -import cn.nukkit.utils.BlockColor; - -/** - * @author CreeperFace - * Nukkit Project - */ -public class BlockEntityCauldron extends BlockEntitySpawnable { - - public static final int POTION_TYPE_EMPTY = 0xFFFF; - public static final int POTION_TYPE_NORMAL = 0; - public static final int POTION_TYPE_SPLASH = 1; - public static final int POTION_TYPE_LINGERING = 2; - public static final int POTION_TYPE_LAVA = 0xF19B; - - public BlockEntityCauldron(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - int potionId; - if (!namedTag.contains("PotionId")) { - namedTag.putShort("PotionId", 0xffff); - } - potionId = namedTag.getShort("PotionId"); - - int potionType = (potionId & 0xFFFF) == 0xFFFF? POTION_TYPE_EMPTY : POTION_TYPE_NORMAL; - if (namedTag.getBoolean("SplashPotion")) { - potionType = POTION_TYPE_SPLASH; - namedTag.remove("SplashPotion"); - } - - if (!namedTag.contains("PotionType")) { - namedTag.putShort("PotionType", potionType); - } - - super.initBlockEntity(); - } - - public int getPotionId() { - return namedTag.getShort("PotionId"); - } - - public void setPotionId(int potionId) { - namedTag.putShort("PotionId", potionId); - this.spawnToAll(); - } - - public boolean hasPotion() { - return getPotionId() != 0xffff; - } - - public void setPotionType(int potionType) { - this.namedTag.putShort("PotionType", potionType & 0xFFFF); - } - - public int getPotionType() { - return this.namedTag.getShort("PotionType") & 0xFFFF; - } - - public boolean isSplashPotion() { - return namedTag.getShort("PotionType") == POTION_TYPE_SPLASH; - } - - public void setSplashPotion(boolean value) { - namedTag.putShort("PotionType", value ? 1 : 0); - } - - public BlockColor getCustomColor() { - if (isCustomColor()) { - int color = namedTag.getInt("CustomColor"); - - int red = (color >> 16) & 0xff; - int green = (color >> 8) & 0xff; - int blue = (color) & 0xff; - - return new BlockColor(red, green, blue); - } - - return null; - } - - public boolean isCustomColor() { - return namedTag.contains("CustomColor"); - } - - public void setCustomColor(BlockColor color) { - setCustomColor(color.getRed(), color.getGreen(), color.getBlue()); - } - - public void setCustomColor(int r, int g, int b) { - int color = (r << 16 | g << 8 | b) & 0xffffff; - - if (color != namedTag.getInt("CustomColor")) { - namedTag.putInt("CustomColor", color); - Block block = getBlock(); - Player[] pl = level.getChunkPlayers(getChunkX(), getChunkZ()).values().toArray(new Player[0]); - for (Player p : pl) { - UpdateBlockPacket air = new UpdateBlockPacket(); - air.blockRuntimeId = GlobalBlockPalette.getOrCreateRuntimeId(p.protocol, 0); - air.flags = UpdateBlockPacket.FLAG_ALL_PRIORITY; - air.x = (int) x; - air.y = (int) y; - air.z = (int) z; - UpdateBlockPacket self = (UpdateBlockPacket) air.clone(); - self.blockRuntimeId = GlobalBlockPalette.getOrCreateRuntimeId(p.protocol, block.getId(), block.getDamage()); - p.dataPacket(air); - p.dataPacket(self); - } - - spawnToAll(); - } - } - - public void clearCustomColor() { - namedTag.remove("CustomColor"); - spawnToAll(); - } - - @Override - public boolean isBlockEntityValid() { - return getBlock().getId() == Block.CAULDRON_BLOCK; - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag compoundTag = new CompoundTag() - .putString("id", BlockEntity.CAULDRON) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putShort("PotionId", namedTag.getShort("PotionId")) - .putByte("PotionType", namedTag.getShort("PotionType")); - if (namedTag.contains("CustomColor")) { - compoundTag.putInt("CustomColor", namedTag.getInt("CustomColor")); - } - return compoundTag; - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityChest.java b/src/main/java/cn/nukkit/blockentity/BlockEntityChest.java deleted file mode 100644 index 5c6f20659..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityChest.java +++ /dev/null @@ -1,285 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.inventory.BaseInventory; -import cn.nukkit.inventory.ChestInventory; -import cn.nukkit.inventory.DoubleChestInventory; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; - -import java.util.HashSet; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockEntityChest extends BlockEntitySpawnable implements InventoryHolder, BlockEntityContainer, BlockEntityNameable { - - protected ChestInventory inventory; - - protected DoubleChestInventory doubleInventory = null; - - public BlockEntityChest(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - this.inventory = new ChestInventory(this); - - if (!this.namedTag.contains("Items") || !(this.namedTag.get("Items") instanceof ListTag)) { - this.namedTag.putList(new ListTag("Items")); - } - - ListTag list = (ListTag) this.namedTag.getList("Items"); - for (CompoundTag compound : list.getAll()) { - Item item = NBTIO.getItemHelper(compound); - this.inventory.slots.put(compound.getByte("Slot"), item); - } - - super.initBlockEntity(); - } - - @Override - public void close() { - if (!closed) { - if (this.doubleInventory != null) { - for (Player player : new HashSet<>(this.doubleInventory.getViewers())) { - player.removeWindow(this.doubleInventory); - } - this.doubleInventory = null; - } - - for (Player player : new HashSet<>(this.inventory.getViewers())) { - player.removeWindow(this.inventory); - } - - this.inventory.destroyed = true; - super.close(); - } - } - - @Override - public void onBreak() { - unpair(); - for (Item content : inventory.getContents().values()) { - level.dropItem(this, content); - } - inventory.clearAll(); // Stop items from being moved around by another player in the inventory - } - - @Override - public void saveNBT() { - this.namedTag.putList(new ListTag("Items")); - for (int index = 0; index < this.getSize(); index++) { - this.setItem(index, this.inventory.getItem(index)); - } - } - - @Override - public boolean isBlockEntityValid() { - return getBlock().getId() == Block.CHEST || getBlock().getId() == Block.TRAPPED_CHEST; - } - - @Override - public int getSize() { - return 27; - } - - protected int getSlotIndex(int index) { - ListTag list = this.namedTag.getList("Items", CompoundTag.class); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getByte("Slot") == index) { - return i; - } - } - - return -1; - } - - @Override - public Item getItem(int index) { - int i = this.getSlotIndex(index); - if (i < 0) { - return new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } else { - CompoundTag data = (CompoundTag) this.namedTag.getList("Items").get(i); - return NBTIO.getItemHelper(data); - } - } - - @Override - public void setItem(int index, Item item) { - int i = this.getSlotIndex(index); - - CompoundTag d = NBTIO.putItemHelper(item, index); - - // If item is air or count less than 0, remove the item from the "Items" list - if (item.getId() == Item.AIR || item.getCount() <= 0) { - if (i >= 0) { - this.namedTag.getList("Items").remove(i); - } - } else if (i < 0) { - // If it is less than i, then it is a new item, so we are going to add it at the end of the list - (this.namedTag.getList("Items", CompoundTag.class)).add(d); - } else { - // If it is more than i, then it is an update on a inventorySlot, so we are going to overwrite the item in the list - (this.namedTag.getList("Items", CompoundTag.class)).add(i, d); - } - } - - @Override - public BaseInventory getInventory() { - if (this.doubleInventory == null && this.isPaired()) { - this.checkPairing(); - } - - return this.doubleInventory != null ? this.doubleInventory : this.inventory; - } - - public ChestInventory getRealInventory() { - return inventory; - } - - protected void checkPairing() { - BlockEntityChest pair = this.getPair(); - - if (pair != null) { - if (!pair.isPaired()) { - pair.createPair(this); - pair.checkPairing(); - } - - if (pair.doubleInventory != null) { - this.doubleInventory = pair.doubleInventory; - } else if (this.doubleInventory == null) { - if ((pair.x + ((int) pair.z << 15)) > (this.x + ((int) this.z << 15))) { //Order them correctly - this.doubleInventory = new DoubleChestInventory(pair, this); - } else { - this.doubleInventory = new DoubleChestInventory(this, pair); - } - } - } else { - if (level.isChunkLoaded(this.namedTag.getInt("pairx") >> 4, this.namedTag.getInt("pairz") >> 4)) { - this.doubleInventory = null; - this.namedTag.remove("pairx"); - this.namedTag.remove("pairz"); - } - } - } - - @Override - public String getName() { - return this.hasName() ? this.namedTag.getString("CustomName") : "Chest"; - } - - @Override - public boolean hasName() { - return this.namedTag.contains("CustomName"); - } - - @Override - public void setName(String name) { - if (name == null || name.isEmpty()) { - this.namedTag.remove("CustomName"); - return; - } - - this.namedTag.putString("CustomName", name); - } - - public boolean isPaired() { - return this.namedTag.contains("pairx") && this.namedTag.contains("pairz"); - } - - public BlockEntityChest getPair() { - if (this.isPaired()) { - BlockEntity blockEntity = this.getLevel().getBlockEntityIfLoaded(new Vector3(this.namedTag.getInt("pairx"), this.y, this.namedTag.getInt("pairz"))); - if (blockEntity instanceof BlockEntityChest) { - return (BlockEntityChest) blockEntity; - } - } - - return null; - } - - public boolean pairWith(BlockEntityChest chest) { - if (this.isPaired() || chest.isPaired() || this.getBlock().getId() != chest.getBlock().getId()) { - return false; - } - - this.createPair(chest); - - chest.spawnToAll(); - this.spawnToAll(); - this.checkPairing(); - - return true; - } - - public void createPair(BlockEntityChest chest) { - this.namedTag.putInt("pairx", (int) chest.x); - this.namedTag.putInt("pairz", (int) chest.z); - chest.namedTag.putInt("pairx", (int) this.x); - chest.namedTag.putInt("pairz", (int) this.z); - } - - public boolean unpair() { - if (!this.isPaired()) { - return false; - } - - BlockEntityChest chest = this.getPair(); - - this.doubleInventory = null; - this.namedTag.remove("pairx"); - this.namedTag.remove("pairz"); - - this.spawnToAll(); - - if (chest != null) { - chest.namedTag.remove("pairx"); - chest.namedTag.remove("pairz"); - chest.doubleInventory = null; - chest.checkPairing(); - chest.spawnToAll(); - } - this.checkPairing(); - - return true; - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag c; - if (this.isPaired()) { - c = new CompoundTag() - .putString("id", BlockEntity.CHEST) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putInt("pairx", this.namedTag.getInt("pairx")) - .putInt("pairz", this.namedTag.getInt("pairz")); - } else { - c = new CompoundTag() - .putString("id", BlockEntity.CHEST) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - } - - if (this.hasName()) { - c.put("CustomName", this.namedTag.get("CustomName")); - } - - return c; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityComparator.java b/src/main/java/cn/nukkit/blockentity/BlockEntityComparator.java deleted file mode 100644 index 5409ec524..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityComparator.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.BlockRedstoneComparator; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * @author CreeperFace - */ -public class BlockEntityComparator extends BlockEntity { - - private int outputSignal; - - public BlockEntityComparator(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - - if (!nbt.contains("OutputSignal")) { - nbt.putInt("OutputSignal", 0); - } - - this.outputSignal = nbt.getInt("OutputSignal"); - } - - @Override - public boolean isBlockEntityValid() { - return this.getLevelBlock() instanceof BlockRedstoneComparator; - } - - public int getOutputSignal() { - return outputSignal; - } - - public void setOutputSignal(int outputSignal) { - this.outputSignal = outputSignal; - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putInt("OutputSignal", this.outputSignal); - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityContainer.java b/src/main/java/cn/nukkit/blockentity/BlockEntityContainer.java deleted file mode 100644 index d209dbf11..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityContainer.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.item.Item; - -/** - * 表达一个容器的接口。
- * An interface describes a container. - * - * {@code BlockEntityContainer}容器必须包含物品的{@code Item}对象。
- * A {@code BlockEntityContainer} must contain items as {@code Item} objects. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see BlockEntityChest - * @see BlockEntityFurnace - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface BlockEntityContainer { - - /** - * 返回一个存储在容器里的物品的{@code Item}对象。
- * Returns an item that stores in this container, as an {@code Item} object. - * - * @param index 这个物品的索引序号。
The index number of this item. - * @return 这个物品的 {@code Item}对象。
An {@code Item} object for this item. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Item getItem(int index); - - /** - * 把一个物品存储进容器。
- * Sets or stores this item into this container. - * - * 注意:如果这个容器相应的索引序号已经有了物品,那么新存储的物品将会替换原有的物品。
- * Notice: If there is already an item for this index number, the new item being stored will REPLACE the old one. - * - * @param index 这个物品的索引序号。
The index number of this item. - * @param item 描述这个物品的 {@code Item}对象。
The {@code Item} object that describes this item. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void setItem(int index, Item item); - - /** - * 返回这个容器最多能包含的物品数量。
- * Returns the max number of items that this container can contain. - * - * @return 最多能包含的物品数量。
The max number. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - int getSize(); -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityDispenser.java b/src/main/java/cn/nukkit/blockentity/BlockEntityDispenser.java deleted file mode 100644 index 0b30d6189..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityDispenser.java +++ /dev/null @@ -1,146 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.inventory.DispenserInventory; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; - -/** - * Created by PetteriM1 - */ -public class BlockEntityDispenser extends BlockEntitySpawnable implements InventoryHolder, BlockEntityContainer, BlockEntityNameable { - - protected DispenserInventory inventory; - - public BlockEntityDispenser(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - this.inventory = new DispenserInventory(this); - - if (!this.namedTag.contains("Items") || !(this.namedTag.get("Items") instanceof ListTag)) { - this.namedTag.putList(new ListTag("Items")); - } - - for (int i = 0; i < this.getSize(); i++) { - this.inventory.setItem(i, this.getItem(i)); - } - - super.initBlockEntity(); - } - - @Override - public boolean isBlockEntityValid() { - return this.getLevelBlock().getId() == BlockID.DISPENSER; - } - - @Override - public String getName() { - return this.hasName() ? this.namedTag.getString("CustomName") : "Dispenser"; - } - - @Override - public boolean hasName() { - return this.namedTag.contains("CustomName"); - } - - @Override - public void setName(String name) { - if (name == null || name.isEmpty()) { - this.namedTag.remove("CustomName"); - return; - } - - this.namedTag.putString("CustomName", name); - } - - @Override - public int getSize() { - return 9; - } - - protected int getSlotIndex(int index) { - ListTag list = this.namedTag.getList("Items", CompoundTag.class); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getByte("Slot") == index) { - return i; - } - } - - return -1; - } - - @Override - public Item getItem(int index) { - int i = this.getSlotIndex(index); - if (i < 0) { - return new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } else { - CompoundTag data = (CompoundTag) this.namedTag.getList("Items").get(i); - return NBTIO.getItemHelper(data); - } - } - - @Override - public void setItem(int index, Item item) { - int i = this.getSlotIndex(index); - - CompoundTag d = NBTIO.putItemHelper(item, index); - - if (item.getId() == Item.AIR || item.getCount() <= 0) { - if (i >= 0) { - this.namedTag.getList("Items").getAll().remove(i); - } - } else if (i < 0) { - (this.namedTag.getList("Items", CompoundTag.class)).add(d); - } else { - (this.namedTag.getList("Items", CompoundTag.class)).add(i, d); - } - } - - @Override - public void saveNBT() { - this.namedTag.putList(new ListTag("Items")); - for (int index = 0; index < this.getSize(); index++) { - this.setItem(index, this.inventory.getItem(index)); - } - - super.saveNBT(); - } - - @Override - public DispenserInventory getInventory() { - return inventory; - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag c = new CompoundTag() - .putString("id", BlockEntity.DISPENSER) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (this.hasName()) { - c.put("CustomName", this.namedTag.get("CustomName")); - } - - return c; - } - - @Override - public void onBreak() { - for (Item content : inventory.getContents().values()) { - level.dropItem(this, content); - } - inventory.clearAll(); - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityDropper.java b/src/main/java/cn/nukkit/blockentity/BlockEntityDropper.java deleted file mode 100644 index e4db068ae..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityDropper.java +++ /dev/null @@ -1,141 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.inventory.DropperInventory; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; - -/** - * Created by PetteriM1 - */ -public class BlockEntityDropper extends BlockEntitySpawnable implements InventoryHolder, BlockEntityContainer, BlockEntityNameable { - - protected final DropperInventory inventory; - - public BlockEntityDropper(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - - this.inventory = new DropperInventory(this); - - if (!this.namedTag.contains("Items") || !(this.namedTag.get("Items") instanceof ListTag)) { - this.namedTag.putList(new ListTag("Items")); - } - - for (int i = 0; i < this.getSize(); i++) { - this.inventory.setItem(i, this.getItem(i)); - } - - this.scheduleUpdate(); - } - - @Override - public boolean isBlockEntityValid() { - return this.level.getBlockIdAt(chunk, this.getFloorX(), this.getFloorY(), this.getFloorZ()) == Block.DROPPER; - } - - @Override - public String getName() { - return this.hasName() ? this.namedTag.getString("CustomName") : "Dropper"; - } - - @Override - public boolean hasName() { - return this.namedTag.contains("CustomName"); - } - - @Override - public void setName(String name) { - if (name == null || name.isEmpty()) { - this.namedTag.remove("CustomName"); - return; - } - - this.namedTag.putString("CustomName", name); - } - - @Override - public int getSize() { - return 9; - } - - protected int getSlotIndex(int index) { - ListTag list = this.namedTag.getList("Items", CompoundTag.class); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getByte("Slot") == index) { - return i; - } - } - - return -1; - } - - @Override - public Item getItem(int index) { - int i = this.getSlotIndex(index); - if (i < 0) { - return new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } else { - CompoundTag data = (CompoundTag) this.namedTag.getList("Items").get(i); - return NBTIO.getItemHelper(data); - } - } - - @Override - public void setItem(int index, Item item) { - int i = this.getSlotIndex(index); - - CompoundTag d = NBTIO.putItemHelper(item, index); - - if (item.getId() == Item.AIR || item.getCount() <= 0) { - if (i >= 0) { - this.namedTag.getList("Items").getAll().remove(i); - } - } else if (i < 0) { - (this.namedTag.getList("Items", CompoundTag.class)).add(d); - } else { - (this.namedTag.getList("Items", CompoundTag.class)).add(i, d); - } - } - - @Override - public void saveNBT() { - this.namedTag.putList(new ListTag("Items")); - for (int index = 0; index < this.getSize(); index++) { - this.setItem(index, this.inventory.getItem(index)); - } - } - - @Override - public DropperInventory getInventory() { - return inventory; - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag c = new CompoundTag() - .putString("id", BlockEntity.DROPPER) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (this.hasName()) { - c.put("CustomName", this.namedTag.get("CustomName")); - } - - return c; - } - - @Override - public void onBreak() { - for (Item content : inventory.getContents().values()) { - level.dropItem(this, content); - } - inventory.clearAll(); - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityEnchantTable.java b/src/main/java/cn/nukkit/blockentity/BlockEntityEnchantTable.java deleted file mode 100644 index 7d92474f5..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityEnchantTable.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockEntityEnchantTable extends BlockEntitySpawnable implements BlockEntityNameable { - - public BlockEntityEnchantTable(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public boolean isBlockEntityValid() { - return getBlock().getId() == Block.ENCHANT_TABLE; - } - - @Override - public String getName() { - return this.hasName() ? this.namedTag.getString("CustomName") : "Enchanting Table"; - } - - @Override - public boolean hasName() { - return this.namedTag.contains("CustomName"); - } - - @Override - public void setName(String name) { - if (name == null || name.isEmpty()) { - this.namedTag.remove("CustomName"); - return; - } - - this.namedTag.putString("CustomName", name); - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag c = new CompoundTag() - .putString("id", BlockEntity.ENCHANT_TABLE) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (this.hasName()) { - c.put("CustomName", this.namedTag.get("CustomName")); - } - - return c; - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityEnderChest.java b/src/main/java/cn/nukkit/blockentity/BlockEntityEnderChest.java deleted file mode 100644 index ef834c937..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityEnderChest.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class BlockEntityEnderChest extends BlockEntitySpawnable { - - public BlockEntityEnderChest(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public boolean isBlockEntityValid() { - return this.getBlock().getId() == Block.ENDER_CHEST; - } - - @Override - public String getName() { - return "EnderChest"; - } - - @Override - public CompoundTag getSpawnCompound() { - return new CompoundTag() - .putString("id", BlockEntity.ENDER_CHEST) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityFlowerPot.java b/src/main/java/cn/nukkit/blockentity/BlockEntityFlowerPot.java deleted file mode 100644 index 2f810d372..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityFlowerPot.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * Created by Snake1999 on 2016/2/4. - * Package cn.nukkit.blockentity in project Nukkit. - */ -public class BlockEntityFlowerPot extends BlockEntitySpawnable { - public BlockEntityFlowerPot(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (!namedTag.contains("item")) { - namedTag.putShort("item", 0); - } - - if (!namedTag.contains("data")) { - if (namedTag.contains("mData")) { - namedTag.putInt("data", namedTag.getInt("mData")); - namedTag.remove("mData"); - } else { - namedTag.putInt("data", 0); - } - } - - super.initBlockEntity(); - } - - @Override - public boolean isBlockEntityValid() { - int blockID = getBlock().getId(); - return blockID == Block.FLOWER_POT_BLOCK; - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag tag = new CompoundTag() - .putString("id", BlockEntity.FLOWER_POT) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - int item = namedTag.getShort("item"); - if (item != Block.AIR) { - tag.putShort("item", item) - .putInt("mData", this.namedTag.getInt("data")); - } - return tag; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityFurnace.java b/src/main/java/cn/nukkit/blockentity/BlockEntityFurnace.java deleted file mode 100644 index 20fa14b1c..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityFurnace.java +++ /dev/null @@ -1,355 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.event.inventory.FurnaceBurnEvent; -import cn.nukkit.event.inventory.FurnaceSmeltEvent; -import cn.nukkit.inventory.FurnaceInventory; -import cn.nukkit.inventory.FurnaceRecipe; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.ContainerSetDataPacket; - -import java.util.HashSet; - -/** - * @author MagicDroidX - */ -public class BlockEntityFurnace extends BlockEntitySpawnable implements InventoryHolder, BlockEntityContainer, BlockEntityNameable { - - protected FurnaceInventory inventory; - - private int burnTime; - private int burnDuration; - private int cookTime; - private int maxTime; - - public BlockEntityFurnace(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - this.inventory = new FurnaceInventory(this); - - if (!this.namedTag.contains("Items") || !(this.namedTag.get("Items") instanceof ListTag)) { - this.namedTag.putList(new ListTag("Items")); - } - - for (int i = 0; i < this.getSize(); i++) { - this.inventory.setItem(i, this.getItem(i)); - } - - if (!this.namedTag.contains("BurnTime") || this.namedTag.getShort("BurnTime") < 0) { - burnTime = 0; - } else { - burnTime = this.namedTag.getShort("BurnTime"); - } - - if (!this.namedTag.contains("CookTime") || this.namedTag.getShort("CookTime") < 0 || (this.namedTag.getShort("BurnTime") == 0 && this.namedTag.getShort("CookTime") > 0)) { - cookTime = 0; - } else { - cookTime = this.namedTag.getShort("CookTime"); - } - - if (!this.namedTag.contains("BurnDuration") || this.namedTag.getShort("BurnDuration") < 0) { - burnDuration = 0; - } else { - burnDuration = this.namedTag.getShort("BurnDuration"); - } - - if (!this.namedTag.contains("MaxTime")) { - maxTime = burnTime; - burnDuration = 0; - } else { - maxTime = this.namedTag.getShort("MaxTime"); - } - - if (this.namedTag.contains("BurnTicks")) { - burnDuration = this.namedTag.getShort("BurnTicks"); - this.namedTag.remove("BurnTicks"); - } - - if (burnTime > 0) { - this.scheduleUpdate(); - } - - super.initBlockEntity(); - } - - @Override - public String getName() { - return this.hasName() ? this.namedTag.getString("CustomName") : "Furnace"; - } - - @Override - public boolean hasName() { - return this.namedTag.contains("CustomName"); - } - - @Override - public void setName(String name) { - if (name == null || name.isEmpty()) { - this.namedTag.remove("CustomName"); - return; - } - - this.namedTag.putString("CustomName", name); - } - - @Override - public void close() { - if (!closed) { - for (Player player : new HashSet<>(this.inventory.getViewers())) { - player.removeWindow(this.inventory); - } - - super.close(); - } - } - - @Override - public void onBreak() { - for (Item content : inventory.getContents().values()) { - level.dropItem(this, content); - } - inventory.clearAll(); - } - - @Override - public void saveNBT() { - this.namedTag.putList(new ListTag("Items")); - for (int index = 0; index < this.getSize(); index++) { - this.setItem(index, this.inventory.getItem(index)); - } - - this.namedTag.putShort("CookTime", cookTime); - this.namedTag.putShort("BurnTime", burnTime); - this.namedTag.putShort("BurnDuration", burnDuration); - this.namedTag.putShort("MaxTime", maxTime); - } - - @Override - public boolean isBlockEntityValid() { - int blockID = getBlock().getId(); - return blockID == Block.FURNACE || blockID == Block.BURNING_FURNACE; - } - - @Override - public int getSize() { - return 3; - } - - protected int getSlotIndex(int index) { - ListTag list = this.namedTag.getList("Items", CompoundTag.class); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getByte("Slot") == index) { - return i; - } - } - - return -1; - } - - @Override - public Item getItem(int index) { - int i = this.getSlotIndex(index); - if (i < 0) { - return new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } else { - CompoundTag data = (CompoundTag) this.namedTag.getList("Items").get(i); - return NBTIO.getItemHelper(data); - } - } - - @Override - public void setItem(int index, Item item) { - int i = this.getSlotIndex(index); - - CompoundTag d = NBTIO.putItemHelper(item, index); - - if (item.getId() == Item.AIR || item.getCount() <= 0) { - if (i >= 0) { - this.namedTag.getList("Items").getAll().remove(i); - } - } else if (i < 0) { - (this.namedTag.getList("Items", CompoundTag.class)).add(d); - } else { - (this.namedTag.getList("Items", CompoundTag.class)).add(i, d); - } - } - - @Override - public FurnaceInventory getInventory() { - return inventory; - } - - protected void checkFuel(Item fuel) { - FurnaceBurnEvent ev = new FurnaceBurnEvent(this, fuel, fuel.getFuelTime() == null ? 0 : fuel.getFuelTime()); - - this.server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return; - } - - maxTime = ev.getBurnTime(); - burnTime = ev.getBurnTime(); - burnDuration = 0; - if (this.getBlock().getId() == Item.FURNACE) { - this.getLevel().setBlock(this, Block.get(BlockID.BURNING_FURNACE, this.getBlock().getDamage()), true); - } - - if (burnTime > 0 && ev.isBurning()) { - fuel.setCount(fuel.getCount() - 1); - if (fuel.getCount() == 0) { - if (fuel.getId() == Item.BUCKET && fuel.getDamage() == 10) { - fuel.setDamage(0); - fuel.setCount(1); - } else { - fuel = new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } - } - this.inventory.setFuel(fuel); - } - } - - @Override - public boolean onUpdate() { - if (this.closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - boolean ret = false; - Item fuel = this.inventory.getFuel(); - Item raw = this.inventory.getSmelting(); - Item product = this.inventory.getResult(); - FurnaceRecipe smelt = this.server.getCraftingManager().matchFurnaceRecipe(raw); - boolean canSmelt = (smelt != null && raw.getCount() > 0 && ((smelt.getResult().equals(product, true) && product.getCount() < product.getMaxStackSize()) || product.getId() == Item.AIR)); - - if (burnTime <= 0 && canSmelt && fuel.getFuelTime() != null && fuel.getCount() > 0) { - this.checkFuel(fuel); - } - - if (burnTime > 0) { - burnTime--; - burnDuration = (int) Math.ceil((float) burnTime / maxTime * 200); - - if (smelt != null && canSmelt) { - cookTime++; - if (cookTime >= 200) { - product = Item.get(smelt.getResult().getId(), smelt.getResult().getDamage(), product.getCount() + 1); - - FurnaceSmeltEvent ev = new FurnaceSmeltEvent(this, raw, product); - this.server.getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - this.inventory.setResult(ev.getResult()); - raw.setCount(raw.getCount() - 1); - if (raw.getCount() == 0) { - raw = new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } - this.inventory.setSmelting(raw); - } - - cookTime -= 200; - } - } else if (burnTime <= 0) { - burnTime = 0; - cookTime = 0; - burnDuration = 0; - } else { - cookTime = 0; - } - ret = true; - } else { - if (this.getBlock().getId() == Item.BURNING_FURNACE) { - this.getLevel().setBlock(this, Block.get(BlockID.FURNACE, this.getBlock().getDamage()), true); - } - burnTime = 0; - cookTime = 0; - burnDuration = 0; - } - - if (Server.getInstance().getTick() % 4 == 0) { - for (Player player : this.inventory.getViewers()) { - int windowId = player.getWindowId(this.inventory); - if (windowId > 0) { - ContainerSetDataPacket pk = new ContainerSetDataPacket(); - pk.windowId = windowId; - pk.property = ContainerSetDataPacket.PROPERTY_FURNACE_TICK_COUNT; - pk.value = cookTime; - player.dataPacket(pk); - - pk = new ContainerSetDataPacket(); - pk.windowId = windowId; - pk.property = ContainerSetDataPacket.PROPERTY_FURNACE_LIT_TIME; - pk.value = burnDuration; - player.dataPacket(pk); - } - } - } - - if (this.timing != null) this.timing.stopTiming(); - - return ret; - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag c = new CompoundTag() - .putString("id", BlockEntity.FURNACE) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putShort("BurnDuration", burnDuration) - .putShort("BurnTime", burnTime) - .putShort("CookTime", cookTime); - - if (this.hasName()) { - c.put("CustomName", this.namedTag.get("CustomName")); - } - - return c; - } - - public int getBurnTime() { - return burnTime; - } - - public void setBurnTime(int burnTime) { - this.burnTime = burnTime; - } - - public int getBurnDuration() { - return burnDuration; - } - - public void setBurnDuration(int burnDuration) { - this.burnDuration = burnDuration; - } - - public int getCookTime() { - return cookTime; - } - - public void setCookTime(int cookTime) { - this.cookTime = cookTime; - } - - public int getMaxTime() { - return maxTime; - } - - public void setMaxTime(int maxTime) { - this.maxTime = maxTime; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityHopper.java b/src/main/java/cn/nukkit/blockentity/BlockEntityHopper.java deleted file mode 100644 index dc79e2001..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityHopper.java +++ /dev/null @@ -1,459 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.event.inventory.InventoryMoveItemEvent; -import cn.nukkit.inventory.*; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; - -import java.util.HashSet; - -/** - * Created by CreeperFace on 8.5.2017. - */ -public class BlockEntityHopper extends BlockEntitySpawnable implements InventoryHolder, BlockEntityContainer, BlockEntityNameable { - - protected HopperInventory inventory; - - public int transferCooldown; - - private AxisAlignedBB pickupArea; - - public BlockEntityHopper(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (this.namedTag.contains("TransferCooldown")) { - this.transferCooldown = this.namedTag.getInt("TransferCooldown"); - } else { - this.transferCooldown = 8; - } - - this.inventory = new HopperInventory(this); - - if (!this.namedTag.contains("Items") || !(this.namedTag.get("Items") instanceof ListTag)) { - this.namedTag.putList(new ListTag("Items")); - } - - for (int i = 0; i < this.getSize(); i++) { - this.inventory.setItem(i, this.getItem(i)); - } - - this.pickupArea = new AxisAlignedBB(this.x, this.y, this.z, this.x + 1, this.y + 2, this.z + 1); - - this.scheduleUpdate(); - - super.initBlockEntity(); - } - - @Override - public boolean isBlockEntityValid() { - return this.level.getBlockIdAt(chunk, this.getFloorX(), this.getFloorY(), this.getFloorZ()) == Block.HOPPER_BLOCK; - } - - @Override - public String getName() { - return this.hasName() ? this.namedTag.getString("CustomName") : "Hopper"; - } - - @Override - public boolean hasName() { - return this.namedTag.contains("CustomName"); - } - - @Override - public void setName(String name) { - if (name == null || name.isEmpty()) { - this.namedTag.remove("CustomName"); - return; - } - - this.namedTag.putString("CustomName", name); - } - - public boolean isOnTransferCooldown() { - return this.transferCooldown > 0; - } - - public void setTransferCooldown(int transferCooldown) { - this.transferCooldown = transferCooldown; - } - - @Override - public int getSize() { - return 5; - } - - protected int getSlotIndex(int index) { - ListTag list = this.namedTag.getList("Items", CompoundTag.class); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getByte("Slot") == index) { - return i; - } - } - - return -1; - } - - @Override - public Item getItem(int index) { - int i = this.getSlotIndex(index); - if (i < 0) { - return new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } else { - CompoundTag data = (CompoundTag) this.namedTag.getList("Items").get(i); - return NBTIO.getItemHelper(data); - } - } - - @Override - public void setItem(int index, Item item) { - int i = this.getSlotIndex(index); - - CompoundTag d = NBTIO.putItemHelper(item, index); - - if (item.getId() == Item.AIR || item.getCount() <= 0) { - if (i >= 0) { - this.namedTag.getList("Items").getAll().remove(i); - } - } else if (i < 0) { - (this.namedTag.getList("Items", CompoundTag.class)).add(d); - } else { - (this.namedTag.getList("Items", CompoundTag.class)).add(i, d); - } - } - - @Override - public void saveNBT() { - this.namedTag.putList(new ListTag("Items")); - for (int index = 0; index < this.getSize(); index++) { - this.setItem(index, this.inventory.getItem(index)); - } - - this.namedTag.putInt("TransferCooldown", this.transferCooldown); - } - - @Override - public HopperInventory getInventory() { - return inventory; - } - - @Override - public boolean onUpdate() { - if (this.closed) { - return false; - } - - this.transferCooldown--; - - if (!this.isOnTransferCooldown()) { - if (this.level.isBlockPowered(getBlock())) { - return true; - } - - boolean changed = pushItems(); - - if (!changed) { - BlockEntity blockEntity = this.level.getBlockEntity(this.up()); - if (!(blockEntity instanceof BlockEntityContainer)) { - changed = pickupItems(); - } else { - changed = pullItems(); - } - } - - if (changed) { - this.setTransferCooldown(8); - setDirty(); - } - } - - - return true; - } - - public boolean pullItems() { - if (this.inventory.isFull()) { - return false; - } - - BlockEntity blockEntity = this.level.getBlockEntity(this.up()); - if (blockEntity instanceof BlockEntityFurnace) { - FurnaceInventory inv = ((BlockEntityFurnace) blockEntity).getInventory(); - Item item = inv.getResult(); - - if (!item.isNull()) { - Item itemToAdd = item.clone(); - itemToAdd.count = 1; - - if (!this.inventory.canAddItem(itemToAdd)) { - return false; - } - - InventoryMoveItemEvent ev = new InventoryMoveItemEvent(inv, this.inventory, this, itemToAdd, InventoryMoveItemEvent.Action.SLOT_CHANGE); - this.server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return false; - } - - Item[] items = this.inventory.addItem(itemToAdd); - - if (items.length <= 0) { - item.count--; - inv.setResult(item); - return true; - } - } - } else if (blockEntity instanceof InventoryHolder) { - Inventory inv = ((InventoryHolder) blockEntity).getInventory(); - - for (int i = 0; i < inv.getSize(); i++) { - Item item = inv.getItem(i); - - if (!item.isNull()) { - Item itemToAdd = item.clone(); - itemToAdd.count = 1; - - if (!this.inventory.canAddItem(itemToAdd)) { - continue; - } - - InventoryMoveItemEvent ev = new InventoryMoveItemEvent(inv, this.inventory, this, itemToAdd, InventoryMoveItemEvent.Action.SLOT_CHANGE); - this.server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - continue; - } - - Item[] items = this.inventory.addItem(itemToAdd); - - if (items.length >= 1) { - continue; - } - - item.count--; - - inv.setItem(i, item); - return true; - } - } - } - return false; - } - - public boolean pickupItems() { - if (this.inventory.isFull()) { - return false; - } - - boolean pickedUpItem = false; - - for (Entity entity : this.level.getCollidingEntities(this.pickupArea)) { - if (entity.isClosed() || !(entity instanceof EntityItem)) { - continue; - } - - EntityItem itemEntity = (EntityItem) entity; - Item item = itemEntity.getItem(); - - if (item.isNull()) { - continue; - } - - int originalCount = item.getCount(); - - if (!this.inventory.canAddItem(item)) { - continue; - } - - InventoryMoveItemEvent ev = new InventoryMoveItemEvent(null, this.inventory, this, item, InventoryMoveItemEvent.Action.PICKUP); - this.server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - continue; - } - - Item[] items = this.inventory.addItem(item); - - if (items.length == 0) { - entity.close(); - pickedUpItem = true; - continue; - } - - if (items[0].getCount() != originalCount) { - pickedUpItem = true; - item.setCount(items[0].getCount()); - } - } - - return pickedUpItem; - } - - @Override - public void close() { - if (!closed) { - for (Player player : new HashSet<>(this.inventory.getViewers())) { - player.removeWindow(this.inventory); - } - super.close(); - } - } - - @Override - public void onBreak() { - for (Item content : inventory.getContents().values()) { - level.dropItem(this, content); - } - inventory.clearAll(); - } - - public boolean pushItems() { - if (this.inventory.isEmpty()) { - return false; - } - - BlockEntity be = this.level.getBlockEntity(this.getSide(BlockFace.fromIndex(this.level.getBlockDataAt(this.getFloorX(), this.getFloorY(), this.getFloorZ())))); - - if (be instanceof BlockEntityHopper && this.getBlock().getDamage() == 0 || !(be instanceof InventoryHolder)) - return false; - - InventoryMoveItemEvent event; - - if (be instanceof BlockEntityFurnace) { - BlockEntityFurnace furnace = (BlockEntityFurnace) be; - FurnaceInventory inventory = furnace.getInventory(); - if (inventory.isFull()) { - return false; - } - - boolean pushedItem = false; - - for (int i = 0; i < this.inventory.getSize(); i++) { - Item item = this.inventory.getItem(i); - if (!item.isNull()) { - Item itemToAdd = item.clone(); - itemToAdd.setCount(1); - - if (this.getBlock().getDamage() == 0) { - Item smelting = inventory.getSmelting(); - if (smelting.isNull()) { - event = new InventoryMoveItemEvent(this.inventory, inventory, this, itemToAdd, InventoryMoveItemEvent.Action.SLOT_CHANGE); - this.server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - inventory.setSmelting(itemToAdd); - item.count--; - pushedItem = true; - } - } else if (inventory.getSmelting().getId() == itemToAdd.getId() && inventory.getSmelting().getDamage() == itemToAdd.getDamage() && smelting.count < smelting.getMaxStackSize()) { - event = new InventoryMoveItemEvent(this.inventory, inventory, this, itemToAdd, InventoryMoveItemEvent.Action.SLOT_CHANGE); - this.server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - smelting.count++; - inventory.setSmelting(smelting); - item.count--; - pushedItem = true; - } - } - } else if (Fuel.duration.containsKey(itemToAdd.getId())) { - Item fuel = inventory.getFuel(); - if (fuel.isNull()) { - event = new InventoryMoveItemEvent(this.inventory, inventory, this, itemToAdd, InventoryMoveItemEvent.Action.SLOT_CHANGE); - this.server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - inventory.setFuel(itemToAdd); - item.count--; - pushedItem = true; - } - } else if (fuel.getId() == itemToAdd.getId() && fuel.getDamage() == itemToAdd.getDamage() && fuel.count < fuel.getMaxStackSize()) { - event = new InventoryMoveItemEvent(this.inventory, inventory, this, itemToAdd, InventoryMoveItemEvent.Action.SLOT_CHANGE); - this.server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - fuel.count++; - inventory.setFuel(fuel); - item.count--; - pushedItem = true; - } - } - } - - if (pushedItem) { - this.inventory.setItem(i, item); - } - } - } - - return pushedItem; - } else { - Inventory inventory = ((InventoryHolder) be).getInventory(); - - if (inventory.isFull()) { - return false; - } - - for (int i = 0; i < this.inventory.getSize(); i++) { - Item item = this.inventory.getItem(i); - - if (!item.isNull()) { - Item itemToAdd = item.clone(); - itemToAdd.setCount(1); - - if (!inventory.canAddItem(itemToAdd)) { - continue; - } - - InventoryMoveItemEvent ev = new InventoryMoveItemEvent(this.inventory, inventory, this, itemToAdd, InventoryMoveItemEvent.Action.SLOT_CHANGE); - this.server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - continue; - } - - Item[] items = inventory.addItem(itemToAdd); - - if (items.length > 0) { - continue; - } - - item.count--; - this.inventory.setItem(i, item); - return true; - } - } - } - - return false; - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag c = new CompoundTag() - .putString("id", BlockEntity.HOPPER) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (this.hasName()) { - c.put("CustomName", this.namedTag.get("CustomName")); - } - - return c; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityItemFrame.java b/src/main/java/cn/nukkit/blockentity/BlockEntityItemFrame.java deleted file mode 100644 index 306434270..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityItemFrame.java +++ /dev/null @@ -1,147 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.event.block.ItemFrameDropItemEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelEventPacket; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * Created by Pub4Game on 03.07.2016. - */ -public class BlockEntityItemFrame extends BlockEntitySpawnable { - - private Item item_; - - public BlockEntityItemFrame(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (!namedTag.contains("Item")) { - namedTag.putCompound("Item", NBTIO.putItemHelper(item_ = new ItemBlock(Block.get(BlockID.AIR)))); - } - - if (!namedTag.contains("ItemRotation")) { - namedTag.putByte("ItemRotation", 0); - } - - if (!namedTag.contains("ItemDropChance")) { - namedTag.putFloat("ItemDropChance", 1.0f); - } - - this.level.updateComparatorOutputLevel(this); - - super.initBlockEntity(); - } - - @Override - public String getName() { - return "Item Frame"; - } - - @Override - public boolean isBlockEntityValid() { - return this.getBlock().getId() == Block.ITEM_FRAME_BLOCK; - } - - public int getItemRotation() { - return this.namedTag.getByte("ItemRotation"); - } - - public void setItemRotation(int itemRotation) { - this.namedTag.putByte("ItemRotation", itemRotation); - this.level.updateComparatorOutputLevel(this); - this.setDirty(); - } - - public Item getItem() { - if (item_ == null) { - CompoundTag NBTTag = this.namedTag.getCompound("Item"); - item_ = NBTIO.getItemHelper(NBTTag); - } - return item_; - } - - public void setItem(Item item) { - this.setItem(item, true); - } - - public void setItem(Item item, boolean setChanged) { - item_ = null; - this.namedTag.putCompound("Item", NBTIO.putItemHelper(item)); - if (setChanged) { - this.setDirty(); - } - - this.level.updateComparatorOutputLevel(this); - } - - public float getItemDropChance() { - return this.namedTag.getFloat("ItemDropChance"); - } - - public void setItemDropChance(float chance) { - this.namedTag.putFloat("ItemDropChance", chance); - } - - public void setDirty() { - this.spawnToAll(); - super.setDirty(); - } - - @Override - public CompoundTag getSpawnCompound() { - if (!this.namedTag.contains("Item")) { - this.setItem(new ItemBlock(Block.get(BlockID.AIR)), false); - } - - CompoundTag item = namedTag.getCompound("Item").copy(); - item.setName("Item"); - CompoundTag tag = new CompoundTag() - .putString("id", BlockEntity.ITEM_FRAME) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - - if (item.getShort("id") != Item.AIR) { - tag.putCompound("Item", item) - .putByte("ItemRotation", this.getItemRotation()); - } - return tag; - } - - public int getAnalogOutput() { - return this.getItem() == null || this.getItem().getId() == 0 ? 0 : this.getItemRotation() % 8 + 1; - } - - public boolean dropItem(Player player) { - Item item = this.getItem(); - if (item != null && item.getId() != Item.AIR) { - if (player != null) { - ItemFrameDropItemEvent event = new ItemFrameDropItemEvent(player, this.getBlock(), this, item); - this.level.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.spawnTo(player); - return true; - } - } - this.setItem(Item.get(Item.AIR)); - this.setItemRotation(0); - if (this.getItemDropChance() > ThreadLocalRandom.current().nextFloat()) { - this.level.dropItem(this.add(0.5, 0, 0.5), item); - } - this.level.addLevelEvent(this, LevelEventPacket.EVENT_SOUND_ITEM_FRAME_ITEM_REMOVED); - return true; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityJukebox.java b/src/main/java/cn/nukkit/blockentity/BlockEntityJukebox.java deleted file mode 100644 index 73157e8cb..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityJukebox.java +++ /dev/null @@ -1,123 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemRecord; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -import java.util.Objects; - -/** - * @author CreeperFace - */ -public class BlockEntityJukebox extends BlockEntitySpawnable { - - private Item recordItem; - - public BlockEntityJukebox(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (namedTag.contains("RecordItem")) { - this.recordItem = NBTIO.getItemHelper(namedTag.getCompound("RecordItem")); - } else { - this.recordItem = Item.get(0); - } - - super.initBlockEntity(); - } - - @Override - public boolean isBlockEntityValid() { - return this.getLevel().getBlockIdAt(chunk, getFloorX(), getFloorY(), getFloorZ()) == Block.JUKEBOX; - } - - public void setRecordItem(Item recordItem) { - Objects.requireNonNull(recordItem, "Record item cannot be null"); - this.recordItem = recordItem; - } - - public Item getRecordItem() { - return recordItem; - } - - public void play() { - if (this.recordItem instanceof ItemRecord) { - switch (this.recordItem.getId()) { - case Item.RECORD_13: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_13); - break; - case Item.RECORD_CAT: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_CAT); - break; - case Item.RECORD_BLOCKS: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_BLOCKS); - break; - case Item.RECORD_CHIRP: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_CHIRP); - break; - case Item.RECORD_FAR: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_FAR); - break; - case Item.RECORD_MALL: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_MALL); - break; - case Item.RECORD_MELLOHI: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_MELLOHI); - break; - case Item.RECORD_STAL: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_STAL); - break; - case Item.RECORD_STRAD: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_STRAD); - break; - case Item.RECORD_WARD: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_WARD); - break; - case Item.RECORD_11: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_11); - break; - case Item.RECORD_WAIT: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_WAIT); - break; - case Item.RECORD_PIGSTEP: - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_RECORD_PIGSTEP); - break; - } - } - } - - public void stop() { - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_STOP_RECORD); - } - - public void dropItem() { - if (this.recordItem.getId() != 0) { - stop(); - this.level.dropItem(this.up(), this.recordItem); - this.recordItem = Item.get(0); - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putCompound("RecordItem", NBTIO.putItemHelper(this.recordItem)); - } - - @Override - public CompoundTag getSpawnCompound() { - return getDefaultCompound(this, JUKEBOX) - .putCompound("RecordItem", NBTIO.putItemHelper(this.recordItem)); - } - - @Override - public void onBreak() { - this.dropItem(); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java b/src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java deleted file mode 100644 index 1d23842ac..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * Created by CreeperFace on 11.4.2017. - */ -public class BlockEntityMovingBlock extends BlockEntitySpawnable { - - public Block block; - - public BlockVector3 piston; - public int progress; - - public BlockEntityMovingBlock(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (namedTag.contains("movingBlockData") && namedTag.contains("movingBlockId")) { - this.block = Block.get(namedTag.getInt("movingBlockId"), namedTag.getInt("movingBlockData")); - } else { - this.close(); - } - - if (namedTag.contains("pistonPosX") && namedTag.contains("pistonPosY") && namedTag.contains("pistonPosZ")) { - this.piston = new BlockVector3(namedTag.getInt("pistonPosX"), namedTag.getInt("pistonPosY"), namedTag.getInt("pistonPosZ")); - } else { - this.close(); - } - - super.initBlockEntity(); - } - - public Block getBlock() { - return this.block; - } - - @Override - public boolean isBlockEntityValid() { - return true; - } - - @Override - public CompoundTag getSpawnCompound() { - return getDefaultCompound(this, MOVING_BLOCK) - .putFloat("movingBlockId", this.block.getId()) - .putFloat("movingBlockData", this.block.getDamage()) - .putInt("pistonPosX", this.piston.x) - .putInt("pistonPosY", this.piston.y) - .putInt("pistonPosZ", this.piston.z); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityMusic.java b/src/main/java/cn/nukkit/blockentity/BlockEntityMusic.java deleted file mode 100644 index 336943f0c..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityMusic.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class BlockEntityMusic extends BlockEntity { - - public BlockEntityMusic(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (!this.namedTag.contains("note")) { - this.namedTag.putByte("note", 0); - } - - if (!this.namedTag.contains("powered")) { - this.namedTag.putBoolean("note", false); - } - - super.initBlockEntity(); - } - - @Override - public boolean isBlockEntityValid() { - return this.getBlock().getId() == Block.NOTEBLOCK; - } - - public void changePitch() { - this.namedTag.putByte("note", (this.namedTag.getByte("note") + 1) % 25); - } - - public int getPitch() { - return this.namedTag.getByte("note"); - } - - public void setPowered(boolean powered) { - this.namedTag.putBoolean("powered", powered); - } - - public boolean isPowered() { - return this.namedTag.getBoolean("powered"); - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityNameable.java b/src/main/java/cn/nukkit/blockentity/BlockEntityNameable.java deleted file mode 100644 index e7bea12b7..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityNameable.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.blockentity; - -/** - * 表达一个能被命名的事物的接口。
- * An interface describes an object that can be named. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface BlockEntityNameable { - - /** - * 返回这个事物的名字。
- * Gets the name of this object. - * - * @return 这个事物的名字。
The name of this object. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - String getName(); - - /** - * 设置或更改这个事物的名字。
- * Changes the name of this object, or names it. - * - * @param name 这个事物的新名字。
The new name of this object. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void setName(String name); - - /** - * 返回这个事物是否有名字。
- * Whether this object has a name. - * - * @return 如果有名字,返回 {@code true}。
{@code true} for this object has a name. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean hasName(); -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java b/src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java deleted file mode 100644 index e19d0a096..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.IntTag; -import cn.nukkit.nbt.tag.ListTag; - -/** - * @author CreeperFace - */ -public class BlockEntityPistonArm extends BlockEntitySpawnable { - - public float progress; - public float lastProgress; - public BlockFace facing; - public boolean extending = false; - public boolean sticky = false; - public byte state; - public byte newState = 1; - public Vector3 attachedBlock = null; - public boolean isMovable = true; - public boolean powered = false; - - public BlockEntityPistonArm(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - this.isMovable = true; - - if (namedTag.contains("Progress")) { - this.progress = namedTag.getFloat("Progress"); - } - - if (namedTag.contains("LastProgress")) { - this.lastProgress = (float) namedTag.getInt("LastProgress"); - } - - if (namedTag.contains("Sticky")) { - this.sticky = namedTag.getBoolean("Sticky"); - } - - if (namedTag.contains("Extending")) { - this.extending = namedTag.getBoolean("Extending"); - } - - if (namedTag.contains("powered")) { - this.powered = namedTag.getBoolean("powered"); - } - - if (namedTag.contains("AttachedBlocks")) { - ListTag blocks = namedTag.getList("AttachedBlocks", IntTag.class); - if (blocks != null && blocks.size() > 0) { - this.attachedBlock = new Vector3((double) ((IntTag) blocks.get(0)).getData(), (double) ((IntTag) blocks.get(1)).getData(), (double) ((IntTag) blocks.get(2)).getData()); - } - } else { - namedTag.putList(new ListTag("AttachedBlocks")); - } - - super.initBlockEntity(); - } - - public boolean isBlockEntityValid() { - int blockId = getBlock().getId(); - return blockId == Block.PISTON || blockId == Block.STICKY_PISTON; - } - - public void saveNBT() { - super.saveNBT(); - this.namedTag.putBoolean("isMovable", this.isMovable); - this.namedTag.putByte("State", this.state); - this.namedTag.putByte("NewState", this.newState); - this.namedTag.putFloat("Progress", this.progress); - this.namedTag.putFloat("LastProgress", this.lastProgress); - this.namedTag.putBoolean("powered", this.powered); - } - - public CompoundTag getSpawnCompound() { - return new CompoundTag() - .putString("id", BlockEntity.PISTON_ARM) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .putFloat("Progress", this.progress) - .putFloat("LastProgress", this.lastProgress) - .putBoolean("Sticky", this.sticky) - .putByte("State", this.state) - .putByte("NewState", this.newState); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityShulkerBox.java b/src/main/java/cn/nukkit/blockentity/BlockEntityShulkerBox.java deleted file mode 100644 index 34f49cad2..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityShulkerBox.java +++ /dev/null @@ -1,156 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.inventory.BaseInventory; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.inventory.ShulkerBoxInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; - -import java.util.HashSet; - -public class BlockEntityShulkerBox extends BlockEntitySpawnable implements InventoryHolder, BlockEntityContainer, BlockEntityNameable { - - protected ShulkerBoxInventory inventory; - - public BlockEntityShulkerBox(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - this.inventory = new ShulkerBoxInventory(this); - - if (!this.namedTag.contains("Items") || !(this.namedTag.get("Items") instanceof ListTag)) { - this.namedTag.putList(new ListTag("Items")); - } - - ListTag list = (ListTag) this.namedTag.getList("Items"); - for (CompoundTag compound : list.getAll()) { - Item item = NBTIO.getItemHelper(compound); - this.inventory.slots.put(compound.getByte("Slot"), item); - } - - if (!this.namedTag.contains("facing")) { - this.namedTag.putByte("facing", 0); - } - - super.initBlockEntity(); - } - - @Override - public void close() { - if (!closed) { - for (Player player : new HashSet<>(this.getInventory().getViewers())) { - player.removeWindow(this.getInventory()); - } - this.inventory.destroyed = true; - super.close(); - } - } - - @Override - public void saveNBT() { - this.namedTag.putList(new ListTag("Items")); - for (int index = 0; index < this.getSize(); index++) { - this.setItem(index, this.inventory.getItem(index)); - } - } - - @Override - public boolean isBlockEntityValid() { - int blockID = this.getBlock().getId(); - return blockID == Block.SHULKER_BOX || blockID == Block.UNDYED_SHULKER_BOX; - } - - @Override - public int getSize() { - return 27; - } - - protected int getSlotIndex(int index) { - ListTag list = this.namedTag.getList("Items", CompoundTag.class); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getByte("Slot") == index) { - return i; - } - } - - return -1; - } - - @Override - public Item getItem(int index) { - int i = this.getSlotIndex(index); - if (i < 0) { - return new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } else { - CompoundTag data = (CompoundTag) this.namedTag.getList("Items").get(i); - return NBTIO.getItemHelper(data); - } - } - - @Override - public void setItem(int index, Item item) { - int i = this.getSlotIndex(index); - - CompoundTag d = NBTIO.putItemHelper(item, index); - - if (item.getId() == Item.AIR || item.getCount() <= 0) { - if (i >= 0) { - this.namedTag.getList("Items").remove(i); - } - } else if (i < 0) { - (this.namedTag.getList("Items", CompoundTag.class)).add(d); - } else { - (this.namedTag.getList("Items", CompoundTag.class)).add(i, d); - } - } - - @Override - public BaseInventory getInventory() { - return this.inventory; - } - - public ShulkerBoxInventory getRealInventory() { - return inventory; - } - - @Override - public String getName() { - return this.hasName() ? this.namedTag.getString("CustomName") : "Shulker Box"; - } - - @Override - public boolean hasName() { - return this.namedTag.contains("CustomName"); - } - - @Override - public void setName(String name) { - if (name == null || name.isEmpty()) { - this.namedTag.remove("CustomName"); - return; - } - - this.namedTag.putString("CustomName", name); - } - - @Override - public CompoundTag getSpawnCompound() { - CompoundTag c = getDefaultCompound(this, SHULKER_BOX) - .putByte("facing", this.namedTag.getByte("facing")); - - if (this.hasName()) { - c.put("CustomName", this.namedTag.get("CustomName")); - } - - return c; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntitySign.java b/src/main/java/cn/nukkit/blockentity/BlockEntitySign.java deleted file mode 100644 index f77be69b7..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntitySign.java +++ /dev/null @@ -1,147 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.block.SignChangeEvent; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.TextFormat; - -import java.util.Arrays; -import java.util.Objects; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockEntitySign extends BlockEntitySpawnable { - - private String[] text; - - public BlockEntitySign(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - text = new String[4]; - - if (!namedTag.contains("Text")) { - - for (int i = 1; i <= 4; i++) { - String key = "Text" + i; - - if (namedTag.contains(key)) { - String line = namedTag.getString(key); - - this.text[i - 1] = line; - - this.namedTag.remove(key); - } - } - } else { - String[] lines = namedTag.getString("Text").split("\n", 4); - - for (int i = 0; i < text.length; i++) { - if (i < lines.length) - text[i] = lines[i]; - else - text[i] = ""; - } - } - - // Check old text to sanitize - if (text != null) { - sanitizeText(text); - } - - super.initBlockEntity(); - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.remove("Creator"); - } - - @Override - public boolean isBlockEntityValid() { - int blockID = getBlock().getId(); - return blockID == Block.SIGN_POST || blockID == Block.WALL_SIGN; - } - - public boolean setText(String... lines) { - for (int i = 0; i < 4; i++) { - if (i < lines.length) - text[i] = lines[i]; - else - text[i] = ""; - } - - this.namedTag.putString("Text", String.join("\n", text)); - this.spawnToAll(); - - if (this.chunk != null) { - setDirty(); - } - - return true; - } - - public String[] getText() { - return text; - } - - @Override - public boolean updateCompoundTag(CompoundTag nbt, Player player) { - if (!nbt.getString("id").equals(BlockEntity.SIGN)) { - return false; - } - String[] lines = new String[4]; - Arrays.fill(lines, ""); - String[] splitLines = nbt.getString("Text").split("\n", 4); - System.arraycopy(splitLines, 0, lines, 0, splitLines.length); - - sanitizeText(lines); - - SignChangeEvent signChangeEvent = new SignChangeEvent(this.getBlock(), player, lines); - - if (!this.namedTag.contains("Creator") || !Objects.equals(player.getUniqueId().toString(), this.namedTag.getString("Creator"))) { - signChangeEvent.setCancelled(); - } - - if (player.getRemoveFormat()) { - for (int i = 0; i < lines.length; i++) { - lines[i] = TextFormat.clean(lines[i]); - } - } - - this.server.getPluginManager().callEvent(signChangeEvent); - - if (!signChangeEvent.isCancelled()) { - this.setText(signChangeEvent.getLines()); - return true; - } - - return false; - } - - @Override - public CompoundTag getSpawnCompound() { - return new CompoundTag() - .putString("id", BlockEntity.SIGN) - .putString("Text", this.namedTag.getString("Text")) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z); - } - - private static void sanitizeText(String[] lines) { - for (int i = 0; i < lines.length; i++) { - // Don't allow excessive text per line - if (lines[i] != null) { - lines[i] = lines[i].substring(0, Math.min(200, lines[i].length())); - } - } - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntitySkull.java b/src/main/java/cn/nukkit/blockentity/BlockEntitySkull.java deleted file mode 100644 index 87ad7abd0..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntitySkull.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * Created by Snake1999 on 2016/2/3. - * Package cn.nukkit.blockentity in project Nukkit. - */ -public class BlockEntitySkull extends BlockEntitySpawnable { - public BlockEntitySkull(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - if (!namedTag.contains("SkullType")) { - namedTag.putByte("SkullType", 0); - } - if (!namedTag.contains("Rot")) { - namedTag.putByte("Rot", 0); - } - - super.initBlockEntity(); - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.remove("Creator"); - } - - @Override - public boolean isBlockEntityValid() { - return getBlock().getId() == Block.SKULL_BLOCK; - } - - @Override - public CompoundTag getSpawnCompound() { - return new CompoundTag() - .putString("id", BlockEntity.SKULL) - .put("SkullType", this.namedTag.get("SkullType")) - .putInt("x", (int) this.x) - .putInt("y", (int) this.y) - .putInt("z", (int) this.z) - .put("Rot", this.namedTag.get("Rot")); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntitySpawnable.java b/src/main/java/cn/nukkit/blockentity/BlockEntitySpawnable.java deleted file mode 100644 index e771fd797..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntitySpawnable.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.BlockEntityDataPacket; - -import java.io.IOException; -import java.nio.ByteOrder; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BlockEntitySpawnable extends BlockEntity { - - public BlockEntitySpawnable(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initBlockEntity() { - super.initBlockEntity(); - - this.spawnToAll(); - } - - public abstract CompoundTag getSpawnCompound(); - - public BlockEntityDataPacket createSpawnPacket() { - CompoundTag tag = this.getSpawnCompound(); - BlockEntityDataPacket pk = new BlockEntityDataPacket(); - pk.x = (int) this.x; - pk.y = (int) this.y; - pk.z = (int) this.z; - - try { - pk.namedTag = NBTIO.write(tag, ByteOrder.LITTLE_ENDIAN, true); - } catch (IOException e) { - throw new RuntimeException(e); - } - - return pk; - } - - public void spawnTo(Player player) { - if (!this.closed) { - player.dataPacket(this.createSpawnPacket()); - } - } - - public void spawnToAll() { - if (!this.closed) { - this.level.addChunkPacket(this.chunk.getX(), this.chunk.getZ(), this.createSpawnPacket()); - } - } - - /** - * Called when a player updates a block entity's NBT data - * for example when writing on a sign. - * - * @param nbt tag - * @param player player - * @return bool indication of success, will respawn the tile to the player if false. - */ - public boolean updateCompoundTag(CompoundTag nbt, Player player) { - return false; - } -} diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntitySpawner.java b/src/main/java/cn/nukkit/blockentity/BlockEntitySpawner.java deleted file mode 100644 index 90a2c9ae6..000000000 --- a/src/main/java/cn/nukkit/blockentity/BlockEntitySpawner.java +++ /dev/null @@ -1,239 +0,0 @@ -package cn.nukkit.blockentity; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.mob.EntityMob; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.level.Position; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ShortTag; -import cn.nukkit.utils.Utils; - -public class BlockEntitySpawner extends BlockEntitySpawnable { - - private int entityId; - private int spawnRange; - private int maxNearbyEntities; - private int requiredPlayerRange; - private int requiredPlayerRange2; - - private int delay = 0; - - private int minSpawnDelay; - private int maxSpawnDelay; - - private int minSpawnCount; - private int maxSpawnCount; - - public static final String TAG_ID = "id"; - public static final String TAG_X = "x"; - public static final String TAG_Y = "y"; - public static final String TAG_Z = "z"; - public static final String TAG_ENTITY_ID = "EntityId"; - public static final String TAG_SPAWN_RANGE = "SpawnRange"; - public static final String TAG_MIN_SPAWN_DELAY = "MinSpawnDelay"; - public static final String TAG_MAX_SPAWN_DELAY = "MaxSpawnDelay"; - public static final String TAG_MAX_NEARBY_ENTITIES = "MaxNearbyEntities"; - public static final String TAG_REQUIRED_PLAYER_RANGE = "RequiredPlayerRange"; - public static final String TAG_MINIMUM_SPAWN_COUNT = "MinimumSpawnerCount"; - public static final String TAG_MAXIMUM_SPAWN_COUNT = "MaximumSpawnerCount"; - - public static final short SPAWN_RANGE = 4; - public static final short MIN_SPAWN_DELAY = 200; - public static final short MAX_SPAWN_DELAY = 5000; - public static final short MAX_NEARBY_ENTITIES = 16; - public static final short REQUIRED_PLAYER_RANGE = 16; - public static final short MINIMUM_SPAWN_COUNT = 1; - public static final short MAXIMUM_SPAWN_COUNT = 4; - - public BlockEntitySpawner(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - this.entityId = this.namedTag.getInt(TAG_ENTITY_ID); - } - - @Override - protected void initBlockEntity() { - if (!this.namedTag.contains(TAG_SPAWN_RANGE) || !(this.namedTag.get(TAG_SPAWN_RANGE) instanceof ShortTag)) { - this.namedTag.putShort(TAG_SPAWN_RANGE, SPAWN_RANGE); - } - - if (!this.namedTag.contains(TAG_MIN_SPAWN_DELAY) || !(this.namedTag.get(TAG_MIN_SPAWN_DELAY) instanceof ShortTag)) { - this.namedTag.putShort(TAG_MIN_SPAWN_DELAY, MIN_SPAWN_DELAY); - } - - if (!this.namedTag.contains(TAG_MAX_SPAWN_DELAY) || !(this.namedTag.get(TAG_MAX_SPAWN_DELAY) instanceof ShortTag)) { - this.namedTag.putShort(TAG_MAX_SPAWN_DELAY, MAX_SPAWN_DELAY); - } - - if (!this.namedTag.contains(TAG_MAX_NEARBY_ENTITIES) || !(this.namedTag.get(TAG_MAX_NEARBY_ENTITIES) instanceof ShortTag)) { - this.namedTag.putShort(TAG_MAX_NEARBY_ENTITIES, MAX_NEARBY_ENTITIES); - } - - if (!this.namedTag.contains(TAG_REQUIRED_PLAYER_RANGE) || !(this.namedTag.get(TAG_REQUIRED_PLAYER_RANGE) instanceof ShortTag)) { - this.namedTag.putShort(TAG_REQUIRED_PLAYER_RANGE, REQUIRED_PLAYER_RANGE); - } - - if (!this.namedTag.contains(TAG_MINIMUM_SPAWN_COUNT) || !(this.namedTag.get(TAG_MINIMUM_SPAWN_COUNT) instanceof ShortTag)) { - this.namedTag.putShort(TAG_MINIMUM_SPAWN_COUNT, MINIMUM_SPAWN_COUNT); - } - - if (!this.namedTag.contains(TAG_MAXIMUM_SPAWN_COUNT) || !(this.namedTag.get(TAG_MAXIMUM_SPAWN_COUNT) instanceof ShortTag)) { - this.namedTag.putShort(TAG_MAXIMUM_SPAWN_COUNT, MAXIMUM_SPAWN_COUNT); - } - - this.spawnRange = this.namedTag.getShort(TAG_SPAWN_RANGE); - this.minSpawnDelay = this.namedTag.getShort(TAG_MIN_SPAWN_DELAY); - this.maxSpawnDelay = this.namedTag.getShort(TAG_MAX_SPAWN_DELAY); - this.maxNearbyEntities = this.namedTag.getShort(TAG_MAX_NEARBY_ENTITIES); - this.requiredPlayerRange = this.namedTag.getShort(TAG_REQUIRED_PLAYER_RANGE); - this.requiredPlayerRange2 = (int) Math.pow(this.requiredPlayerRange, 2); - this.minSpawnCount = this.namedTag.getShort(TAG_MINIMUM_SPAWN_COUNT); - this.maxSpawnCount = this.namedTag.getShort(TAG_MAXIMUM_SPAWN_COUNT); - - this.scheduleUpdate(); - super.initBlockEntity(); - } - - @Override - public boolean onUpdate() { - if (this.closed) { - return false; - } - - if (this.delay++ >= Utils.rand(this.minSpawnDelay, this.maxSpawnDelay)) { - this.delay = 0; - - int nearbyEntities = 0; - boolean playerInRange = false; - for (Entity entity : this.level.getEntities()) { - if (!playerInRange && entity instanceof Player) { - if (entity.distanceSquared(this) <= this.requiredPlayerRange2) { - playerInRange = true; - } - } else if (entity instanceof BaseEntity) { - if (entity.distanceSquared(this) <= this.requiredPlayerRange2) { - nearbyEntities++; - } - } - } - - int amountToSpawn = minSpawnCount + Utils.nukkitRandom.nextBoundedInt(maxSpawnCount); - for (int i = 0; i < amountToSpawn; i++) { - if (playerInRange && nearbyEntities <= this.maxNearbyEntities) { - Position pos = new Position - ( - this.x + Utils.rand(-this.spawnRange, this.spawnRange), - this.y, - this.z + Utils.rand(-this.spawnRange, this.spawnRange), - this.level - ); - Block block = level.getBlock(pos); - // Mobs shouldn't spawn in walls, and they shouldn't retry to - if ( - block.getId() != 0 && block.getId() != BlockID.SIGN_POST && block.getId() != BlockID.WALL_SIGN && - block.getId() != BlockID.STILL_WATER && block.getId() != BlockID.WATER && - block.getId() != BlockID.LAVA && block.getId() != BlockID.STILL_LAVA - ) { - continue; - } - - CreatureSpawnEvent ev = new CreatureSpawnEvent(this.entityId, pos, CreatureSpawnEvent.SpawnReason.SPAWNER); - level.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - continue; - } - - Entity entity = Entity.createEntity(this.entityId, pos); - if (entity != null) { - if (entity instanceof EntityMob && this.level.getBlockLightAt((int) x, (int) y, (int) z) > 3) { - entity.close(); - continue; - } - entity.spawnToAll(); - nearbyEntities++; - } - } - } - } - - return true; - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putInt(TAG_ENTITY_ID, this.entityId); - this.namedTag.putString(TAG_ID, "MobSpawner"); - this.namedTag.putShort(TAG_SPAWN_RANGE, this.spawnRange); - this.namedTag.putShort(TAG_MIN_SPAWN_DELAY, this.minSpawnDelay); - this.namedTag.putShort(TAG_MAX_SPAWN_DELAY, this.maxSpawnDelay); - this.namedTag.putShort(TAG_MAX_NEARBY_ENTITIES, this.maxNearbyEntities); - this.namedTag.putShort(TAG_REQUIRED_PLAYER_RANGE, this.requiredPlayerRange); - this.namedTag.putShort(TAG_MINIMUM_SPAWN_COUNT, this.minSpawnCount); - this.namedTag.putShort(TAG_MAXIMUM_SPAWN_COUNT, this.maxSpawnCount); - } - - @Override - public CompoundTag getSpawnCompound() { - return new CompoundTag() - .putString(TAG_ID, BlockEntity.MOB_SPAWNER) - .putInt(TAG_ENTITY_ID, this.entityId) - .putInt(TAG_X, (int) this.x) - .putInt(TAG_Y, (int) this.y) - .putInt(TAG_Z, (int) this.z); - } - - @Override - public boolean isBlockEntityValid() { - return this.getBlock().getId() == Block.MONSTER_SPAWNER; - } - - public void setSpawnEntityType(int entityId) { - this.entityId = entityId; - this.spawnToAll(); - } - - public int getSpawnEntityType() { - return this.entityId; - } - - public void setMinSpawnDelay(int minDelay) { - if (minDelay > this.maxSpawnDelay) { - return; - } - - this.minSpawnDelay = minDelay; - } - - public void setMaxSpawnDelay(int maxDelay) { - if (this.minSpawnDelay > maxDelay) { - return; - } - - this.maxSpawnDelay = maxDelay; - } - - public void setSpawnDelay(int minDelay, int maxDelay) { - if (minDelay > maxDelay) { - return; - } - - this.minSpawnDelay = minDelay; - this.maxSpawnDelay = maxDelay; - } - - public void setRequiredPlayerRange(int range) { - this.requiredPlayerRange = range; - this.requiredPlayerRange2 = (int) Math.pow(this.requiredPlayerRange, 2); - } - - public void setMaxNearbyEntities(int count) { - this.maxNearbyEntities = count; - } -} diff --git a/src/main/java/cn/nukkit/command/Command.java b/src/main/java/cn/nukkit/command/Command.java deleted file mode 100644 index 9512a8a28..000000000 --- a/src/main/java/cn/nukkit/command/Command.java +++ /dev/null @@ -1,312 +0,0 @@ -package cn.nukkit.command; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.data.*; -import cn.nukkit.lang.TextContainer; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.permission.Permissible; -import cn.nukkit.utils.TextFormat; -import co.aikar.timings.Timing; -import co.aikar.timings.Timings; - -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Command { - - private static CommandData defaultDataTemplate = null; - - protected CommandData commandData; - - private final String name; - - private String nextLabel; - - private String label; - - private String[] aliases; - - private String[] activeAliases; - - private CommandMap commandMap = null; - - protected String description; - - protected String usageMessage; - - private String permission = null; - - private String permissionMessage = null; - - protected Map commandParameters = new HashMap<>(); - - public Timing timing; - - public Command(String name) { - this(name, "", null, new String[0]); - } - - public Command(String name, String description) { - this(name, description, null, new String[0]); - } - - public Command(String name, String description, String usageMessage) { - this(name, description, usageMessage, new String[0]); - } - - public Command(String name, String description, String usageMessage, String[] aliases) { - this.commandData = new CommandData(); - this.name = name.toLowerCase(); // Prevent client crash - this.nextLabel = name; - this.label = name; - this.description = description; - this.usageMessage = usageMessage == null ? '/' + name : usageMessage; - this.aliases = aliases; - this.activeAliases = aliases; - this.timing = Timings.getCommandTiming(this); - this.commandParameters.put("default", new CommandParameter[]{new CommandParameter("args", CommandParamType.RAWTEXT, true)}); - } - - /** - * Returns an CommandData containing command data - * - * @return CommandData - */ - public CommandData getDefaultCommandData() { - return this.commandData; - } - - public CommandParameter[] getCommandParameters(String key) { - return commandParameters.get(key); - } - - public Map getCommandParameters() { - return commandParameters; - } - - public void setCommandParameters(Map commandParameters) { - this.commandParameters = commandParameters; - } - - public void addCommandParameters(String key, CommandParameter[] parameters) { - this.commandParameters.put(key, parameters); - } - - /** - * Generates modified command data for the specified player - * for AvailableCommandsPacket. - * - * @param player player - * @return CommandData|null - */ - public CommandDataVersions generateCustomCommandData(Player player) { - if (!this.testPermission(player)) { - return null; - } - - CommandData customData = this.commandData.clone(); - customData.description = player.getServer().getLanguage().translateString(this.description); - this.commandParameters.forEach((key, par) -> { - CommandOverload overload = new CommandOverload(); - overload.input.parameters = par; - customData.overloads.put(key, overload); - }); - if (customData.overloads.isEmpty()) customData.overloads.put("default", new CommandOverload()); - CommandDataVersions versions = new CommandDataVersions(); - versions.versions.add(customData); - return versions; - } - - public Map getOverloads() { - return this.commandData.overloads; - } - - public abstract boolean execute(CommandSender sender, String commandLabel, String[] args); - - public String getName() { - return name; - } - - public String getPermission() { - return permission; - } - - public void setPermission(String permission) { - this.permission = permission; - } - - public boolean testPermission(CommandSender target) { - if (this.testPermissionSilent(target)) { - return true; - } - - if (this.permissionMessage == null) { - target.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.unknown", this.name)); - } else if (!this.permissionMessage.isEmpty()) { - target.sendMessage(this.permissionMessage.replace("", this.permission)); - } - - return false; - } - - public boolean testPermissionSilent(CommandSender target) { - if (this.permission == null || this.permission.isEmpty()) { - return true; - } - - String[] permissions = this.permission.split(";"); - for (String permission : permissions) { - if (target.hasPermission(permission)) { - return true; - } - } - - return false; - } - - public String getLabel() { - return label; - } - - public boolean setLabel(String name) { - this.nextLabel = name; - if (!this.isRegistered()) { - this.label = name; - this.timing = Timings.getCommandTiming(this); - return true; - } - return false; - } - - public boolean register(CommandMap commandMap) { - if (this.allowChangesFrom(commandMap)) { - this.commandMap = commandMap; - return true; - } - return false; - } - - public boolean unregister(CommandMap commandMap) { - if (this.allowChangesFrom(commandMap)) { - this.commandMap = null; - this.activeAliases = this.aliases; - this.label = this.nextLabel; - return true; - } - return false; - } - - public boolean allowChangesFrom(CommandMap commandMap) { - return commandMap != null && !commandMap.equals(this.commandMap); - } - - public boolean isRegistered() { - return this.commandMap != null; - } - - public String[] getAliases() { - return this.activeAliases; - } - - public String getPermissionMessage() { - return permissionMessage; - } - - public String getDescription() { - return description; - } - - public String getUsage() { - return usageMessage; - } - - public void setAliases(String[] aliases) { - this.aliases = aliases; - if (!this.isRegistered()) { - this.activeAliases = aliases; - } - } - - public void setDescription(String description) { - this.description = description; - } - - public void setPermissionMessage(String permissionMessage) { - this.permissionMessage = permissionMessage; - } - - public void setUsage(String usageMessage) { - this.usageMessage = usageMessage; - } - - public static CommandData generateDefaultData() { - return defaultDataTemplate.clone(); - } - - public static void broadcastCommandMessage(CommandSender source, String message) { - broadcastCommandMessage(source, message, true); - } - - public static void broadcastCommandMessage(CommandSender source, String message, boolean sendToSource) { - Set users = source.getServer().getPluginManager().getPermissionSubscriptions(Server.BROADCAST_CHANNEL_ADMINISTRATIVE); - - TranslationContainer result = new TranslationContainer("chat.type.admin", source.getName(), message); - - TranslationContainer colored = new TranslationContainer(TextFormat.GRAY + "" + TextFormat.ITALIC + "%chat.type.admin", source.getName(), message); - - if (sendToSource && !(source instanceof ConsoleCommandSender)) { - source.sendMessage(message); - } - - for (Permissible user : users) { - if (user instanceof CommandSender) { - if (user instanceof ConsoleCommandSender) { - ((ConsoleCommandSender) user).sendMessage(result); - } else if (!user.equals(source)) { - ((CommandSender) user).sendMessage(colored); - } - } - } - } - - public static void broadcastCommandMessage(CommandSender source, TextContainer message) { - broadcastCommandMessage(source, message, true); - } - - public static void broadcastCommandMessage(CommandSender source, TextContainer message, boolean sendToSource) { - TextContainer m = message.clone(); - String resultStr = '[' + source.getName() + ": " + (!m.getText().equals(source.getServer().getLanguage().get(m.getText())) ? "%" : "") + m.getText() + ']'; - - Set users = source.getServer().getPluginManager().getPermissionSubscriptions(Server.BROADCAST_CHANNEL_ADMINISTRATIVE); - - String coloredStr = TextFormat.GRAY + "" + TextFormat.ITALIC + resultStr; - - m.setText(resultStr); - TextContainer result = m.clone(); - m.setText(coloredStr); - TextContainer colored = m.clone(); - - if (sendToSource && !(source instanceof ConsoleCommandSender)) { - source.sendMessage(message); - } - - for (Permissible user : users) { - if (user instanceof CommandSender) { - if (user instanceof ConsoleCommandSender) { - ((ConsoleCommandSender) user).sendMessage(result); - } else if (!user.equals(source)) { - ((CommandSender) user).sendMessage(colored); - } - } - } - } - - @Override - public String toString() { - return this.name; - } -} diff --git a/src/main/java/cn/nukkit/command/CommandExecutor.java b/src/main/java/cn/nukkit/command/CommandExecutor.java deleted file mode 100644 index d039da12a..000000000 --- a/src/main/java/cn/nukkit/command/CommandExecutor.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.command; - -/** - * 能监听命令执行的类实现的接口。
- * An interface what can be implemented by classes which listens command executing. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.plugin.PluginBase - * @see cn.nukkit.command.CommandExecutor#onCommand - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface CommandExecutor { - /** - * 在命令执行时会调用的方法。
- * Called when a command is executed. - * - * 一个命令可以是{@code /a_LABEL an_arg1 AN_ARG2...}的形式,这时{@code label}变量的值为{@code "a_label"}, - * {@code args}数组的元素有{@code "an_arg1","AN_ARG2",...}。注意到{@code label}变量会被转化成小写, - * 而{@code args}数组内字符串元素的大小写不变。
- * A command can be such a form like {@code /a_LABEL an_arg1 AN_ARG2...}. At this time, the value of - * variable {@code label} is {@code "a_label"}, and the values of elements of array {@code args} are - * {@code "an_arg1","AN_ARG2",...}. Notice that the value of variable {@code label} will be converted to - * lower case, but the cases of elements of array {@code args} won't change. - * - * 关于返回值,如果返回{@code false},Nukkit会给sender发送这个命令的使用方法等信息,来表示这个命令没有使用成功。 - * 如果你的命令成功的发挥了作用,你应该返回{@code true}来表示这个命令已执行成功。
- * If this function returns {@code false}, Nukkit will send command usages to command sender, to explain that - * the command didn't work normally. If your command works properly, a {@code true} should be returned to explain - * that the command works. - * - * 如果你想测试一个命令发送者是否有权限执行这个命令, - * 可以使用{@link cn.nukkit.command.Command#testPermissionSilent}。
- * If you want to test whether a command sender has the permission to execute a command, - * you can use {@link cn.nukkit.command.Command#testPermissionSilent}. - * - * @param sender 这个命令的发送者,可以是玩家或控制台等。
- * The sender of this command, this can be a player or a console. - * @param command 要被发送的命令。
- * The command to send. - * @param label 这个命令的标签。
- * Label of the command. - * @param args 这个命令的参数列表。
- * Arguments of this command. - * @return 这个命令执行是否执行成功。
whether this command is executed successfully. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean onCommand(CommandSender sender, Command command, String label, String[] args); -} diff --git a/src/main/java/cn/nukkit/command/CommandMap.java b/src/main/java/cn/nukkit/command/CommandMap.java deleted file mode 100644 index 7d1be68a5..000000000 --- a/src/main/java/cn/nukkit/command/CommandMap.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.command; - -import java.util.List; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface CommandMap { - - void registerAll(String fallbackPrefix, List commands); - - boolean register(String fallbackPrefix, Command command); - - boolean register(String fallbackPrefix, Command command, String label); - - void registerSimpleCommands(Object object); - - boolean dispatch(CommandSender sender, String cmdLine); - - void clearCommands(); - - Command getCommand(String name); -} diff --git a/src/main/java/cn/nukkit/command/CommandSender.java b/src/main/java/cn/nukkit/command/CommandSender.java deleted file mode 100644 index bbab297c7..000000000 --- a/src/main/java/cn/nukkit/command/CommandSender.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.nukkit.command; - -import cn.nukkit.Server; -import cn.nukkit.lang.TextContainer; -import cn.nukkit.permission.Permissible; - -/** - * 能发送命令的人。
- * Who sends commands. - * - * 可以是一个玩家或者一个控制台。
- * That can be a player or a console. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.command.CommandExecutor#onCommand - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface CommandSender extends Permissible { - - /** - * 给命令发送者返回信息。
- * Sends a message to the command sender. - * - * @param message 要发送的信息。
Message to send. - * @see cn.nukkit.utils.TextFormat - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void sendMessage(String message); - - /** - * 给命令发送者返回信息。
- * Sends a message to the command sender. - * - * @param message 要发送的信息。
Message to send. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void sendMessage(TextContainer message); - - /** - * 返回命令发送者所在的服务器。
- * Returns the server of the command sender. - * - * @return 命令发送者所在的服务器。
the server of the command sender. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Server getServer(); - - /** - * 返回命令发送者的名称。
- * Returns the name of the command sender. - * - * 如果命令发送者是一个玩家,将会返回他的玩家名字(name)不是显示名字(display name)。 - * 如果命令发送者是控制台,将会返回{@code "CONSOLE"}。
- * If this command sender is a player, will return his/her player name(not display name). - * If it is a console, will return {@code "CONSOLE"}. - * 当你需要判断命令的执行者是不是控制台时,可以用这个:
- * When you need to determine if the sender is a console, use this:
- * {@code if (sender instanceof ConsoleCommandSender) .....;} - * - * @return 命令发送者的名称。
the name of the command sender. - * @see cn.nukkit.Player#getName() - * @see cn.nukkit.command.ConsoleCommandSender#getName() - * @see cn.nukkit.plugin.PluginDescription - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - String getName(); - - boolean isPlayer(); -} diff --git a/src/main/java/cn/nukkit/command/ConsoleCommandSender.java b/src/main/java/cn/nukkit/command/ConsoleCommandSender.java deleted file mode 100644 index feef79423..000000000 --- a/src/main/java/cn/nukkit/command/ConsoleCommandSender.java +++ /dev/null @@ -1,111 +0,0 @@ -package cn.nukkit.command; - -import cn.nukkit.Server; -import cn.nukkit.lang.TextContainer; -import cn.nukkit.permission.PermissibleBase; -import cn.nukkit.permission.Permission; -import cn.nukkit.permission.PermissionAttachment; -import cn.nukkit.permission.PermissionAttachmentInfo; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.utils.MainLogger; - -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ConsoleCommandSender implements CommandSender { - - private final PermissibleBase perm; - - public ConsoleCommandSender() { - this.perm = new PermissibleBase(this); - } - - @Override - public boolean isPermissionSet(String name) { - return this.perm.isPermissionSet(name); - } - - @Override - public boolean isPermissionSet(Permission permission) { - return this.perm.isPermissionSet(permission); - } - - @Override - public boolean hasPermission(String name) { - return this.perm.hasPermission(name); - } - - @Override - public boolean hasPermission(Permission permission) { - return this.perm.hasPermission(permission); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin) { - return this.perm.addAttachment(plugin); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, String name) { - return this.perm.addAttachment(plugin, name); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, String name, Boolean value) { - return this.perm.addAttachment(plugin, name, value); - } - - @Override - public void removeAttachment(PermissionAttachment attachment) { - this.perm.removeAttachment(attachment); - } - - @Override - public void recalculatePermissions() { - this.perm.recalculatePermissions(); - } - - @Override - public Map getEffectivePermissions() { - return this.perm.getEffectivePermissions(); - } - - public boolean isPlayer() { - return false; - } - - @Override - public Server getServer() { - return Server.getInstance(); - } - - @Override - public void sendMessage(String message) { - message = this.getServer().getLanguage().translateString(message); - for (String line : message.trim().split("\n")) { - MainLogger.getLogger().info(line); - } - } - - @Override - public void sendMessage(TextContainer message) { - this.sendMessage(this.getServer().getLanguage().translate(message)); - } - - @Override - public String getName() { - return "CONSOLE"; - } - - @Override - public boolean isOp() { - return true; - } - - @Override - public void setOp(boolean value) { - } -} diff --git a/src/main/java/cn/nukkit/command/FormattedCommandAlias.java b/src/main/java/cn/nukkit/command/FormattedCommandAlias.java deleted file mode 100644 index d796cf776..000000000 --- a/src/main/java/cn/nukkit/command/FormattedCommandAlias.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.command; - -import cn.nukkit.Server; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.TextFormat; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class FormattedCommandAlias extends Command { - - private final String[] formatStrings; - - public FormattedCommandAlias(String alias, String[] formatStrings) { - super(alias); - this.formatStrings = formatStrings; - } - - public FormattedCommandAlias(String alias, List formatStrings) { - super(alias); - this.formatStrings = formatStrings.toArray(new String[0]); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - boolean result = false; - ArrayList commands = new ArrayList<>(); - for (String formatString : formatStrings) { - try { - commands.add(buildCommand(formatString, args)); - } catch (Exception e) { - if (e instanceof IllegalArgumentException) { - sender.sendMessage(TextFormat.RED + e.getMessage()); - } else { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.exception")); - MainLogger logger = sender.getServer().getLogger(); - if (logger != null) { - logger.logException(e); - } - } - return false; - } - } - - for (String command : commands) { - result |= Server.getInstance().dispatchCommand(sender, command); - } - - return result; - } - - private String buildCommand(String formatString, String[] args) { - int index = formatString.indexOf('$'); - while (index != -1) { - int start = index; - - if (index > 0 && formatString.charAt(start - 1) == '\\') { - formatString = formatString.substring(0, start - 1) + formatString.substring(start); - index = formatString.indexOf('$', index); - continue; - } - - boolean required = false; - if (formatString.charAt(index + 1) == '$') { - required = true; - // Move index past the second $ - index++; - } - - // Move index past the $ - index++; - int argStart = index; - while (index < formatString.length() && inRange(((int) formatString.charAt(index)) - 48, 0, 9)) { - // Move index past current digit - index++; - } - - // No numbers found - if (argStart == index) { - throw new IllegalArgumentException("Invalid replacement token"); - } - - int position = Integer.parseInt(formatString.substring(argStart, index)); - - // Arguments are not 0 indexed - if (position == 0) { - throw new IllegalArgumentException("Invalid replacement token"); - } - - // Convert position to 0 index - position--; - - boolean rest = false; - if (index < formatString.length() && formatString.charAt(index) == '-') { - rest = true; - // Move index past the - - index++; - } - - int end = index; - - if (required && position >= args.length) { - throw new IllegalArgumentException("Missing required argument " + (position + 1)); - } - - StringBuilder replacement = new StringBuilder(); - if (rest && position < args.length) { - for (int i = position; i < args.length; i++) { - if (i != position) { - replacement.append(' '); - } - replacement.append(args[i]); - } - } else if (position < args.length) { - replacement.append(args[position]); - } - - formatString = formatString.substring(0, start) + replacement + formatString.substring(end); - // Move index past the replaced data so we don't process it again - index = start + replacement.length(); - - // Move to the next replacement token - index = formatString.indexOf('$', index); - } - - return formatString; - } - - private static boolean inRange(int i, int j, int k) { - return i >= j && i <= k; - } -} diff --git a/src/main/java/cn/nukkit/command/PluginCommand.java b/src/main/java/cn/nukkit/command/PluginCommand.java deleted file mode 100644 index 07d07da0a..000000000 --- a/src/main/java/cn/nukkit/command/PluginCommand.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.command; - -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.plugin.Plugin; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PluginCommand extends Command implements PluginIdentifiableCommand { - - private final T owningPlugin; - - private CommandExecutor executor; - - public PluginCommand(String name, T owner) { - super(name); - this.owningPlugin = owner; - this.executor = owner; - this.usageMessage = ""; - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.owningPlugin.isEnabled()) { - return false; - } - - if (!this.testPermission(sender)) { - return false; - } - - boolean success = this.executor.onCommand(sender, this, commandLabel, args); - - if (!success && !this.usageMessage.isEmpty()) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - } - - return success; - } - - public CommandExecutor getExecutor() { - return executor; - } - - public void setExecutor(CommandExecutor executor) { - this.executor = (executor != null) ? executor : this.owningPlugin; - } - - @Override - public T getPlugin() { - return this.owningPlugin; - } -} diff --git a/src/main/java/cn/nukkit/command/PluginIdentifiableCommand.java b/src/main/java/cn/nukkit/command/PluginIdentifiableCommand.java deleted file mode 100644 index a22ab9446..000000000 --- a/src/main/java/cn/nukkit/command/PluginIdentifiableCommand.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.nukkit.command; - -import cn.nukkit.plugin.Plugin; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface PluginIdentifiableCommand { - - Plugin getPlugin(); -} diff --git a/src/main/java/cn/nukkit/command/RemoteConsoleCommandSender.java b/src/main/java/cn/nukkit/command/RemoteConsoleCommandSender.java deleted file mode 100644 index 031959db9..000000000 --- a/src/main/java/cn/nukkit/command/RemoteConsoleCommandSender.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.command; - -import cn.nukkit.lang.TextContainer; - -/** - * Represents an RCON command sender. - * - * @author Tee7even - */ -public class RemoteConsoleCommandSender extends ConsoleCommandSender { - - private final StringBuilder messages = new StringBuilder(); - - @Override - public void sendMessage(String message) { - message = this.getServer().getLanguage().translateString(message); - this.messages.append(message.trim()).append('\n'); - if (messages.length() > 50000) { - messages.delete(0, 49000); - } - } - - @Override - public void sendMessage(TextContainer message) { - this.sendMessage(this.getServer().getLanguage().translate(message)); - } - - public String getMessages() { - return messages.toString(); - } - - @Override - public String getName() { - return "Rcon"; - } -} diff --git a/src/main/java/cn/nukkit/command/SimpleCommandMap.java b/src/main/java/cn/nukkit/command/SimpleCommandMap.java deleted file mode 100644 index 3fc947685..000000000 --- a/src/main/java/cn/nukkit/command/SimpleCommandMap.java +++ /dev/null @@ -1,296 +0,0 @@ -package cn.nukkit.command; - -import cn.nukkit.Server; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.command.defaults.*; -import cn.nukkit.command.simple.*; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.TextFormat; -import cn.nukkit.utils.Utils; - -import java.lang.reflect.Method; -import java.util.*; -import java.util.Map.Entry; -import java.util.stream.Collectors; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class SimpleCommandMap implements CommandMap { - - protected final Map knownCommands = new HashMap<>(); - - private final Server server; - - public SimpleCommandMap(Server server) { - this.server = server; - this.setDefaultCommands(); - } - - private void setDefaultCommands() { - this.register("nukkit", new VersionCommand("version")); - this.register("nukkit", new PluginsCommand("plugins")); - this.register("nukkit", new HelpCommand("help")); - this.register("nukkit", new StopCommand("stop")); - this.register("nukkit", new TellCommand("tell")); - this.register("nukkit", new BanCommand("ban")); - this.register("nukkit", new BanIpCommand("ban-ip")); - this.register("nukkit", new BanListCommand("banlist")); - this.register("nukkit", new PardonCommand("pardon")); - this.register("nukkit", new PardonIpCommand("pardon-ip")); - this.register("nukkit", new ListCommand("list")); - this.register("nukkit", new KickCommand("kick")); - this.register("nukkit", new OpCommand("op")); - this.register("nukkit", new DeopCommand("deop")); - this.register("nukkit", new SaveCommand("save-all")); - this.register("nukkit", new GiveCommand("give")); - this.register("nukkit", new EffectCommand("effect")); - this.register("nukkit", new EnchantCommand("enchant")); - this.register("nukkit", new GamemodeCommand("gamemode")); - this.register("nukkit", new KillCommand("kill")); - this.register("nukkit", new SetWorldSpawnCommand("setworldspawn")); - this.register("nukkit", new TeleportCommand("tp")); - this.register("nukkit", new TimeCommand("time")); - this.register("nukkit", new ReloadCommand("reload")); - this.register("nukkit", new WeatherCommand("weather")); - this.register("nukkit", new XpCommand("xp")); - this.register("nukkit", new StatusCommand("status")); - this.register("nukkit", new SummonCommand("summon")); - this.register("nukkit", new WorldCommand("world")); - this.register("nukkit", new GenerateWorldCommand("genworld")); - this.register("nukkit", new WhitelistCommand("whitelist")); - this.register("nukkit", new GameruleCommand("gamerule")); - this.register("nukkit", new SpawnCommand("spawn")); - if (!Server.getInstance().suomiCraftPEMode()) { - this.register("nukkit", new DefaultGamemodeCommand("defaultgamemode")); - this.register("nukkit", new SayCommand("say")); - this.register("nukkit", new MeCommand("me")); - this.register("nukkit", new SaveOnCommand("save-on")); - this.register("nukkit", new SaveOffCommand("save-off")); - this.register("nukkit", new DifficultyCommand("difficulty")); - this.register("nukkit", new ParticleCommand("particle")); - this.register("nukkit", new SpawnpointCommand("spawnpoint")); - this.register("nukkit", new TitleCommand("title")); - this.register("nukkit", new TransferServerCommand("transfer")); - this.register("nukkit", new SeedCommand("seed")); - this.register("nukkit", new PlaySoundCommand("playsound")); - this.register("nukkit", new DebugPasteCommand("debugpaste")); - this.register("nukkit", new GarbageCollectorCommand("gc")); - this.register("nukkit", new TimingsCommand("timings")); - } - } - - @Override - public void registerAll(String fallbackPrefix, List commands) { - for (Command command : commands) { - this.register(fallbackPrefix, command); - } - } - - @Override - public boolean register(String fallbackPrefix, Command command) { - return this.register(fallbackPrefix, command, null); - } - - @Override - public boolean register(String fallbackPrefix, Command command, String label) { - if (label == null) { - label = command.getName(); - } - label = label.trim().toLowerCase(); - fallbackPrefix = fallbackPrefix.trim().toLowerCase(); - - boolean registered = this.registerAlias(command, false, fallbackPrefix, label); - - List aliases = new ArrayList<>(Arrays.asList(command.getAliases())); - - for (Iterator iterator = aliases.iterator(); iterator.hasNext(); ) { - String alias = iterator.next(); - if (!this.registerAlias(command, true, fallbackPrefix, alias)) { - iterator.remove(); - } - } - command.setAliases(aliases.toArray(new String[0])); - - if (!registered) { - command.setLabel(fallbackPrefix + ':' + label); - } - - command.register(this); - - return registered; - } - - @Override - public void registerSimpleCommands(Object object) { - for (Method method : object.getClass().getDeclaredMethods()) { - cn.nukkit.command.simple.Command def = method.getAnnotation(cn.nukkit.command.simple.Command.class); - if (def != null) { - SimpleCommand sc = new SimpleCommand(object, method, def.name(), def.description(), def.usageMessage(), def.aliases()); - - Arguments args = method.getAnnotation(Arguments.class); - if (args != null) { - sc.setMaxArgs(args.max()); - sc.setMinArgs(args.min()); - } - - CommandPermission perm = method.getAnnotation(CommandPermission.class); - if (perm != null) { - sc.setPermission(perm.value()); - } - - if (method.isAnnotationPresent(ForbidConsole.class)) { - sc.setForbidConsole(true); - } - - CommandParameters commandParameters = method.getAnnotation(CommandParameters.class); - if (commandParameters != null) { - Map map = Arrays.stream(commandParameters.parameters()) - .collect(Collectors.toMap(Parameters::name, parameters -> Arrays.stream(parameters.parameters()) - .map(parameter -> new CommandParameter(parameter.name(), parameter.type(), parameter.optional())) - .distinct() - .toArray(CommandParameter[]::new))); - - sc.commandParameters.putAll(map); - } - - this.register(def.name(), sc); - } - } - } - - private boolean registerAlias(Command command, boolean isAlias, String fallbackPrefix, String label) { - this.knownCommands.put(fallbackPrefix + ':' + label, command); - - //if you're registering a command alias that is already registered, then return false - boolean alreadyRegistered = this.knownCommands.containsKey(label); - Command existingCommand = this.knownCommands.get(label); - boolean existingCommandIsNotVanilla = alreadyRegistered && !(existingCommand instanceof VanillaCommand); - //basically, if we're an alias and it's already registered, or we're a vanilla command, then we can't override it - if ((command instanceof VanillaCommand || isAlias) && alreadyRegistered && existingCommandIsNotVanilla) { - return false; - } - - // If you're registering a name (alias or label) which is identical to another command who's primary name is the same - // So basically we can't override the main name of a command, but we can override aliases if we're not an alias - - // Added the last statement which will allow us to override a VanillaCommand unconditionally - if (alreadyRegistered && existingCommand.getLabel() != null && existingCommand.getLabel().equals(label) && existingCommandIsNotVanilla) { - return false; - } - - // You can now assume that the command is either uniquely named, or overriding another command's alias (and is not itself, an alias) - - if (!isAlias) { - command.setLabel(label); - } - - // Then we need to check if there isn't any command conflicts with vanilla commands - ArrayList toRemove = new ArrayList<>(); - - for (Entry entry : knownCommands.entrySet()) { - Command cmd = entry.getValue(); - if (cmd.getLabel().equalsIgnoreCase(command.getLabel()) && !cmd.equals(command)) { // If the new command conflicts... (But if it isn't the same command) - if (cmd instanceof VanillaCommand) { // And if the old command is a vanilla command... - // Remove it! - toRemove.add(entry.getKey()); - } - } - } - - // Now we loop the toRemove list to remove the command conflicts from the knownCommands map - for (String cmd : toRemove) { - knownCommands.remove(cmd); - } - - this.knownCommands.put(label, command); - - return true; - } - - private static ArrayList parseArguments(String cmdLine) { - StringBuilder sb = new StringBuilder(cmdLine); - ArrayList args = new ArrayList<>(); - boolean notQuoted = true; - int start = 0; - - for (int i = 0; i < sb.length(); i++) { - if (sb.charAt(i) == '\\') { - sb.deleteCharAt(i); - continue; - } - - if (sb.charAt(i) == ' ' && notQuoted) { - String arg = sb.substring(start, i); - if (!arg.isEmpty()) { - args.add(arg); - } - start = i + 1; - } else if (sb.charAt(i) == '"') { - sb.deleteCharAt(i); - --i; - notQuoted = !notQuoted; - } - } - - String arg = sb.substring(start); - if (!arg.isEmpty()) { - args.add(arg); - } - return args; - } - - @Override - public boolean dispatch(CommandSender sender, String cmdLine) { - ArrayList parsed = parseArguments(cmdLine); - if (parsed.isEmpty()) { - return false; - } - - String sentCommandLabel = parsed.remove(0).toLowerCase(); - String[] args = parsed.toArray(new String[0]); - Command target = this.getCommand(sentCommandLabel); - - if (target == null) { - return false; - } - - if (target.timing != null) target.timing.startTiming(); - try { - target.execute(sender, sentCommandLabel, args); - } catch (Exception e) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.exception")); - this.server.getLogger().critical(this.server.getLanguage().translateString("nukkit.command.exception", cmdLine, target.toString(), Utils.getExceptionMessage(e))); - MainLogger logger = sender.getServer().getLogger(); - if (logger != null) { - logger.logException(e); - } - } - if (target.timing != null) target.timing.stopTiming(); - - return true; - } - - @Override - public void clearCommands() { - for (Command command : this.knownCommands.values()) { - command.unregister(this); - } - this.knownCommands.clear(); - this.setDefaultCommands(); - } - - @Override - public Command getCommand(String name) { - if (this.knownCommands.containsKey(name)) { - return this.knownCommands.get(name); - } - return null; - } - - public Map getCommands() { - return knownCommands; - } -} diff --git a/src/main/java/cn/nukkit/command/data/CommandArgs.java b/src/main/java/cn/nukkit/command/data/CommandArgs.java deleted file mode 100644 index 1a6790682..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandArgs.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.nukkit.command.data; - -import com.google.gson.JsonElement; - -import java.util.HashMap; - -public class CommandArgs extends HashMap { -} diff --git a/src/main/java/cn/nukkit/command/data/CommandData.java b/src/main/java/cn/nukkit/command/data/CommandData.java deleted file mode 100644 index c186dd363..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandData.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.command.data; - -import java.util.HashMap; -import java.util.Map; - -public class CommandData implements Cloneable { - - public CommandEnum aliases = null; - public String description = "description"; - public Map overloads = new HashMap<>(); - - public int flags; - public int permission; - - @Override - public CommandData clone() { - try { - return (CommandData) super.clone(); - } catch (Exception e) { - return new CommandData(); - } - } -} diff --git a/src/main/java/cn/nukkit/command/data/CommandDataVersions.java b/src/main/java/cn/nukkit/command/data/CommandDataVersions.java deleted file mode 100644 index 6950dee99..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandDataVersions.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.nukkit.command.data; - -import java.util.ArrayList; -import java.util.List; - -public class CommandDataVersions { - - public List versions = new ArrayList<>(); -} diff --git a/src/main/java/cn/nukkit/command/data/CommandEnum.java b/src/main/java/cn/nukkit/command/data/CommandEnum.java deleted file mode 100644 index e9ba4e809..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandEnum.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.command.data; - -import java.util.Arrays; -import java.util.List; - -/** - * @author CreeperFace - */ -public class CommandEnum { - - /*public static final CommandEnum ENUM_BOOLEAN = new CommandEnum("Boolean", ImmutableList.of("true", "false")); - public static final CommandEnum ENUM_GAMEMODE = new CommandEnum("GameMode", - ImmutableList.of("survival", "creative", "s", "c", "adventure", "a", "spectator", "view", "v", "spc")); - public static final CommandEnum ENUM_BLOCK; - public static final CommandEnum ENUM_ITEM; - - static { - ImmutableList.Builder blocks = ImmutableList.builder(); - for (Field field : BlockID.class.getDeclaredFields()) { - blocks.add(field.getName().toLowerCase()); - } - ENUM_BLOCK = new CommandEnum("Block", blocks.build()); - - ImmutableList.Builder items = ImmutableList.builder(); - for (Field field : ItemID.class.getDeclaredFields()) { - items.add(field.getName().toLowerCase()); - } - items.addAll(ENUM_BLOCK.getValues()); - ENUM_ITEM = new CommandEnum("Item", items.build()); - }*/ - - private final String name; - private final List values; - - public CommandEnum(String name, String... values) { - this(name, Arrays.asList(values)); - } - - public CommandEnum(String name, List values) { - this.name = name; - this.values = values; - } - - public String getName() { - return name; - } - - public List getValues() { - return values; - } - - public int hashCode() { - return name.hashCode(); - } -} diff --git a/src/main/java/cn/nukkit/command/data/CommandInput.java b/src/main/java/cn/nukkit/command/data/CommandInput.java deleted file mode 100644 index 124e91632..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandInput.java +++ /dev/null @@ -1,6 +0,0 @@ -package cn.nukkit.command.data; - -public class CommandInput { - - public CommandParameter[] parameters = new CommandParameter[0]; -} diff --git a/src/main/java/cn/nukkit/command/data/CommandOutput.java b/src/main/java/cn/nukkit/command/data/CommandOutput.java deleted file mode 100644 index b3ff8811c..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandOutput.java +++ /dev/null @@ -1,6 +0,0 @@ -package cn.nukkit.command.data; - -public class CommandOutput { - - public String[] format_strings = new String[0]; -} diff --git a/src/main/java/cn/nukkit/command/data/CommandOverload.java b/src/main/java/cn/nukkit/command/data/CommandOverload.java deleted file mode 100644 index ab7c81908..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandOverload.java +++ /dev/null @@ -1,7 +0,0 @@ -package cn.nukkit.command.data; - -public class CommandOverload { - - public CommandInput input = new CommandInput(); - public CommandOutput output = new CommandOutput(); -} diff --git a/src/main/java/cn/nukkit/command/data/CommandParamType.java b/src/main/java/cn/nukkit/command/data/CommandParamType.java deleted file mode 100644 index 36bc0943c..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandParamType.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.command.data; - -import static cn.nukkit.network.protocol.AvailableCommandsPacket.*; - -/** - * @author CreeperFace - */ -public enum CommandParamType { - - INT(ARG_TYPE_INT), - FLOAT(ARG_TYPE_FLOAT), - VALUE(ARG_TYPE_VALUE), - WILDCARD_INT(ARG_TYPE_WILDCARD_INT), - TARGET(ARG_TYPE_TARGET), - WILDCARD_TARGET(ARG_TYPE_WILDCARD_TARGET), - STRING(ARG_TYPE_STRING), - BLOCK_POSITION(ARG_TYPE_BLOCK_POSITION), - POSITION(ARG_TYPE_POSITION), - MESSAGE(ARG_TYPE_MESSAGE), - RAWTEXT(ARG_TYPE_RAWTEXT), - JSON(ARG_TYPE_JSON), - TEXT(ARG_TYPE_RAWTEXT), - COMMAND(ARG_TYPE_COMMAND), - FILE_PATH(ARG_TYPE_FILE_PATH), - OPERATOR(ARG_TYPE_OPERATOR); - - private final int id; - - CommandParamType(int id) { - this.id = id; - } - - public int getId() { - return id; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/data/CommandParameter.java b/src/main/java/cn/nukkit/command/data/CommandParameter.java deleted file mode 100644 index 82d3cc71d..000000000 --- a/src/main/java/cn/nukkit/command/data/CommandParameter.java +++ /dev/null @@ -1,139 +0,0 @@ -package cn.nukkit.command.data; - - -import java.util.ArrayList; -import java.util.Arrays; - -public class CommandParameter { - - public final static String ARG_TYPE_STRING = "string"; - public final static String ARG_TYPE_STRING_ENUM = "stringenum"; - public final static String ARG_TYPE_BOOL = "bool"; - public final static String ARG_TYPE_TARGET = "target"; - public final static String ARG_TYPE_PLAYER = "target"; - public final static String ARG_TYPE_BLOCK_POS = "blockpos"; - public final static String ARG_TYPE_RAW_TEXT = "rawtext"; - public final static String ARG_TYPE_INT = "int"; - - public static final String ENUM_TYPE_ITEM_LIST = "Item"; - public static final String ENUM_TYPE_BLOCK_LIST = "Block"; - public static final String ENUM_TYPE_COMMAND_LIST = "commandName"; - public static final String ENUM_TYPE_ENCHANTMENT_LIST = "enchantmentType"; - public static final String ENUM_TYPE_ENTITY_LIST = "entityType"; - public static final String ENUM_TYPE_EFFECT_LIST = "effectType"; - public static final String ENUM_TYPE_PARTICLE_LIST = "particleType"; - - public String name; - public CommandParamType type; - public boolean optional; - public byte options = 0; - - public CommandEnum enumData; - public String postFix; - - public CommandParameter(String name, String type, boolean optional) { - this(name, fromString(type), optional); - } - - public CommandParameter(String name, CommandParamType type, boolean optional) { - this.name = name; - this.type = type; - this.optional = optional; - } - - public CommandParameter(String name, boolean optional) { - this(name, CommandParamType.RAWTEXT, optional); - } - - public CommandParameter(String name) { - this(name, false); - } - - public CommandParameter(String name, boolean optional, String enumType) { - this.name = name; - this.type = CommandParamType.RAWTEXT; - this.optional = optional; - this.enumData = new CommandEnum(enumType, new ArrayList<>()); - } - - public CommandParameter(String name, boolean optional, String[] enumValues) { - this.name = name; - this.type = CommandParamType.RAWTEXT; - this.optional = optional; - this.enumData = new CommandEnum(name + "Enums", Arrays.asList(enumValues)); - } - - public CommandParameter(String name, String enumType) { - this(name, false, enumType); - } - - public CommandParameter(String name, String[] enumValues) { - this(name, false, enumValues); - } - - private CommandParameter(String name, boolean optional, CommandParamType type, CommandEnum enumData, String postFix) { - this.name = name; - this.optional = optional; - this.type = type; - this.enumData = enumData; - this.postFix = postFix; - } - - public static CommandParameter newType(String name, CommandParamType type) { - return newType(name, false, type); - } - - public static CommandParameter newType(String name, boolean optional, CommandParamType type) { - return new CommandParameter(name, optional, type, null, null); - } - - public static CommandParameter newEnum(String name, String[] values) { - return newEnum(name, false, values); - } - - public static CommandParameter newEnum(String name, boolean optional, String[] values) { - return newEnum(name, optional, new CommandEnum(name + "Enums", values)); - } - - public static CommandParameter newEnum(String name, String type) { - return newEnum(name, false, type); - } - - public static CommandParameter newEnum(String name, boolean optional, String type) { - return newEnum(name, optional, new CommandEnum(type, new ArrayList<>())); - } - - public static CommandParameter newEnum(String name, CommandEnum data) { - return newEnum(name, false, data); - } - - public static CommandParameter newEnum(String name, boolean optional, CommandEnum data) { - return new CommandParameter(name, optional, CommandParamType.RAWTEXT, data, null); - } - - public static CommandParameter newPostfix(String name, String postfix) { - return newPostfix(name, false, postfix); - } - - public static CommandParameter newPostfix(String name, boolean optional, String postfix) { - return new CommandParameter(name, optional, CommandParamType.RAWTEXT, null, postfix); - } - - protected static CommandParamType fromString(String param) { - switch (param) { - case "string": - case "stringenum": - return CommandParamType.STRING; - case "target": - return CommandParamType.TARGET; - case "blockpos": - return CommandParamType.POSITION; - case "rawtext": - return CommandParamType.RAWTEXT; - case "int": - return CommandParamType.INT; - } - - return CommandParamType.RAWTEXT; - } -} diff --git a/src/main/java/cn/nukkit/command/data/args/CommandArg.java b/src/main/java/cn/nukkit/command/data/args/CommandArg.java deleted file mode 100644 index c2f8a888b..000000000 --- a/src/main/java/cn/nukkit/command/data/args/CommandArg.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.command.data.args; - -public class CommandArg { - - private CommandArgRules[] rules; - private String selector; - - public CommandArgRules[] getRules() { - return rules; - } - - public String getSelector() { - return selector; - } -} diff --git a/src/main/java/cn/nukkit/command/data/args/CommandArgBlockVector.java b/src/main/java/cn/nukkit/command/data/args/CommandArgBlockVector.java deleted file mode 100644 index 83cc78b7c..000000000 --- a/src/main/java/cn/nukkit/command/data/args/CommandArgBlockVector.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.command.data.args; - -public class CommandArgBlockVector { - - private int x; - private int y; - private int z; - private boolean xrelative; - private boolean yrelative; - private boolean zrelative; - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getZ() { - return z; - } - - public boolean isXrelative() { - return xrelative; - } - - public boolean isYrelative() { - return yrelative; - } - - public boolean isZrelative() { - return zrelative; - } -} diff --git a/src/main/java/cn/nukkit/command/data/args/CommandArgRules.java b/src/main/java/cn/nukkit/command/data/args/CommandArgRules.java deleted file mode 100644 index e6bb1e05c..000000000 --- a/src/main/java/cn/nukkit/command/data/args/CommandArgRules.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.command.data.args; - -public class CommandArgRules { - - private boolean inverted; - private String name; - private String value; - - public boolean isInverted() { - return inverted; - } - - public String getName() { - return name; - } - - public String getValue() { - return value; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/BanCommand.java b/src/main/java/cn/nukkit/command/defaults/BanCommand.java deleted file mode 100644 index 7c17c5210..000000000 --- a/src/main/java/cn/nukkit/command/defaults/BanCommand.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.event.player.PlayerKickEvent; -import cn.nukkit.lang.TranslationContainer; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BanCommand extends VanillaCommand { - - public BanCommand(String name) { - super(name, "%nukkit.command.ban.player.description", "%commands.ban.usage"); - this.setPermission("nukkit.command.ban.player"); - this.commandParameters.clear(); - this.commandParameters.put("default", - new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("reason", CommandParamType.STRING, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - String name = args[0].replace("@s", sender.getName()); - StringBuilder reason = new StringBuilder(); - for (int i = 1; i < args.length; i++) { - reason.append(args[i]).append(' '); - } - - if (reason.length() > 0) { - reason = new StringBuilder(reason.substring(0, reason.length() - 1)); - } - - sender.getServer().getNameBans().addBan(name, reason.toString(), null, sender.getName()); - - Player player = sender.getServer().getPlayerExact(name); - if (player != null) { - player.kick(PlayerKickEvent.Reason.NAME_BANNED, (reason.length() > 0) ? "You are banned! Reason: " + reason : "You are banned!", true, "source=" + sender.getName() + ", reason=" + reason); - } - - Command.broadcastCommandMessage(sender, new TranslationContainer("%commands.ban.success", player != null ? player.getName() : name)); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/BanIpCommand.java b/src/main/java/cn/nukkit/command/defaults/BanIpCommand.java deleted file mode 100644 index 24e54711d..000000000 --- a/src/main/java/cn/nukkit/command/defaults/BanIpCommand.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.event.player.PlayerKickEvent; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.regex.Pattern; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BanIpCommand extends VanillaCommand { - - public BanIpCommand(String name) { - super(name, "%nukkit.command.ban.ip.description", "%commands.banip.usage"); - this.setPermission("nukkit.command.ban.ip"); - this.setAliases(new String[]{"banip"}); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("reason", CommandParamType.STRING, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - String value = args[0]; - StringBuilder reason = new StringBuilder(); - for (int i = 1; i < args.length; i++) { - reason.append(args[i]).append(' '); - } - - if (reason.length() > 0) { - reason = new StringBuilder(reason.substring(0, reason.length() - 1)); - } - - if (Pattern.matches("^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$", value)) { - processIPBan(value, sender, reason.toString()); - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.banip.success", value)); - } else { - Player player = sender.getServer().getPlayer(value); - if (player != null) { - processIPBan(player.getAddress(), sender, reason.toString()); - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.banip.success.players", player.getAddress(), player.getName())); - } else { - String name = value.toLowerCase(); - String path = sender.getServer().getDataPath() + "players/"; - File file = new File(path + name + ".dat"); - CompoundTag nbt = null; - if (file.exists()) { - try { - nbt = NBTIO.readCompressed(new FileInputStream(file)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - if (nbt != null && nbt.contains("lastIP") && Pattern.matches("^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$", (value = nbt.getString("lastIP")))) { - processIPBan(value, sender, reason.toString()); - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.banip.success", value)); - } else { - sender.sendMessage(new TranslationContainer("commands.banip.invalid")); - return false; - } - } - } - - return true; - } - - private static void processIPBan(String ip, CommandSender sender, String reason) { - sender.getServer().getIPBans().addBan(ip, reason, null, sender.getName()); - - for (Player player : /*new ArrayList<>(*/sender.getServer().getOnlinePlayers().values()/*)*/) { - if (player.getAddress().equals(ip)) { - player.kick(PlayerKickEvent.Reason.IP_BANNED, !reason.isEmpty() ? reason : "IP banned", true, "source=" + sender.getName() + ", reason=" + reason); - } - } - - try { - sender.getServer().getNetwork().blockAddress(InetAddress.getByName(ip), -1); - } catch (UnknownHostException ignore) {} - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/BanListCommand.java b/src/main/java/cn/nukkit/command/defaults/BanListCommand.java deleted file mode 100644 index 3da8e6395..000000000 --- a/src/main/java/cn/nukkit/command/defaults/BanListCommand.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.permission.BanEntry; -import cn.nukkit.permission.BanList; - -import java.util.Iterator; - -/** - * Created on 2015/11/11 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class BanListCommand extends VanillaCommand { - - public BanListCommand(String name) { - super(name, "%nukkit.command.banlist.description", "%commands.banlist.usage"); - this.setPermission("nukkit.command.ban.list"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("ips|players", true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - BanList list; - boolean ips = false; - if (args.length > 0) { - switch (args[0].toLowerCase()) { - case "ips": - list = sender.getServer().getIPBans(); - ips = true; - break; - case "players": - list = sender.getServer().getNameBans(); - break; - default: - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - } else { - list = sender.getServer().getNameBans(); - } - - StringBuilder builder = new StringBuilder(); - Iterator itr = list.getEntires().values().iterator(); - while (itr.hasNext()) { - builder.append(itr.next().getName()); - if (itr.hasNext()) { - builder.append(", "); - } - } - - if (ips) { - sender.sendMessage(new TranslationContainer("commands.banlist.ips", String.valueOf(list.getEntires().size()))); - } else { - sender.sendMessage(new TranslationContainer("commands.banlist.players", String.valueOf(list.getEntires().size()))); - } - sender.sendMessage(builder.toString()); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/DebugPasteCommand.java b/src/main/java/cn/nukkit/command/defaults/DebugPasteCommand.java deleted file mode 100644 index ccd987e40..000000000 --- a/src/main/java/cn/nukkit/command/defaults/DebugPasteCommand.java +++ /dev/null @@ -1,104 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Nukkit; -import cn.nukkit.Server; -import cn.nukkit.command.CommandSender; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.plugin.PluginDescription; -import cn.nukkit.scheduler.AsyncTask; -import cn.nukkit.utils.HastebinUtility; -import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.Utils; - -import java.io.File; -import java.io.IOException; -import java.lang.management.ManagementFactory; - -public class DebugPasteCommand extends VanillaCommand { - - public DebugPasteCommand(String name) { - super(name, "%nukkit.command.debug.description", "%commands.debug.usage"); - this.setPermission("nukkit.command.debug.perform"); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - Server server = Server.getInstance(); - sender.sendMessage("Uploading..."); - server.getScheduler().scheduleAsyncTask(new DebugPasteTask(server, sender)); - return true; - } - - private static class DebugPasteTask extends AsyncTask { - - private final Server server; - private final CommandSender sender; - - public DebugPasteTask(Server server, CommandSender sender) { - this.server = server; - this.sender = sender; - } - - @Override - public void onRun() { - try { - new StatusCommand("status").execute(server.getConsoleSender(), "status", new String[]{}); - String dataPath = server.getDataPath(); - String serverProperties = HastebinUtility.upload(new File(dataPath, "server.properties")); - String latestLog = HastebinUtility.upload(new File(dataPath, "/logs/server.log")); - String threadDump = HastebinUtility.upload(Utils.getAllThreadDumps()); - - StringBuilder b = new StringBuilder(); - b.append("# Files\n"); - b.append("links.server_properties: ").append(serverProperties).append('\n'); - b.append("links.server_log: ").append(latestLog).append('\n'); - b.append("links.thread_dump: ").append(threadDump).append('\n'); - b.append("\n# Server Information\n"); - - //b.append("version.api: ").append(server.getApiVersion()).append('\n'); - b.append("version.nukkit: ").append(Nukkit.NUKKIT).append('\n'); - b.append("version.build: ").append(Nukkit.getBranch()).append('/').append(Nukkit.VERSION.substring(4)).append('\n'); - b.append("version.minecraft: ").append(ProtocolInfo.MINECRAFT_VERSION).append('\n'); - b.append("version.protocol: ").append(ProtocolInfo.CURRENT_PROTOCOL).append('\n'); - b.append("plugins:"); - - for (Plugin plugin : server.getPluginManager().getPlugins().values()) { - boolean enabled = plugin.isEnabled(); - String name = plugin.getName(); - PluginDescription desc = plugin.getDescription(); - String version = desc.getVersion(); - b.append("\n ") - .append(name) - .append(":\n ") - .append("version: '") - .append(version) - .append('\'') - .append("\n enabled: ") - .append(enabled); - } - - b.append("\n\n# Java Details\n"); - Runtime runtime = Runtime.getRuntime(); - b.append("memory.free: ").append(runtime.freeMemory()).append('\n'); - b.append("memory.max: ").append(runtime.maxMemory()).append('\n'); - b.append("cpu.runtime: ").append(ManagementFactory.getRuntimeMXBean().getUptime()).append('\n'); - b.append("cpu.processors: ").append(runtime.availableProcessors()).append('\n'); - b.append("java.specification.version: '").append(System.getProperty("java.specification.version")).append("'\n"); - b.append("java.vendor: '").append(System.getProperty("java.vendor")).append("'\n"); - b.append("java.version: '").append(System.getProperty("java.version")).append("'\n"); - b.append("os.arch: '").append(System.getProperty("os.arch")).append("'\n"); - b.append("os.name: '").append(System.getProperty("os.name")).append("'\n"); - b.append("os.version: '").append(System.getProperty("os.version")).append("'\n\n"); - String link = HastebinUtility.upload(b.toString()); - sender.sendMessage(link); - } catch (IOException e) { - MainLogger.getLogger().logException(e); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/defaults/DefaultGamemodeCommand.java b/src/main/java/cn/nukkit/command/defaults/DefaultGamemodeCommand.java deleted file mode 100644 index f1910832d..000000000 --- a/src/main/java/cn/nukkit/command/defaults/DefaultGamemodeCommand.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Server; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class DefaultGamemodeCommand extends VanillaCommand { - - public DefaultGamemodeCommand(String name) { - super(name, "%nukkit.command.defaultgamemode.description", "%commands.defaultgamemode.usage"); - this.setPermission("nukkit.command.defaultgamemode"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("mode", CommandParamType.INT, false) - }); - this.commandParameters.put("byString", new CommandParameter[]{ - new CommandParameter("mode", new String[]{"survival", "creative", "s", "c", - "adventure", "a", "spectator", "view", "v"}) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", new String[]{this.usageMessage})); - return false; - } - int gameMode = Server.getGamemodeFromString(args[0]); - if (gameMode != -1) { - sender.getServer().setPropertyInt("gamemode", gameMode); - sender.sendMessage(new TranslationContainer("commands.defaultgamemode.success", new String[]{Server.getGamemodeString(gameMode)})); - } else { - sender.sendMessage("Unknown game mode"); - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/DeopCommand.java b/src/main/java/cn/nukkit/command/defaults/DeopCommand.java deleted file mode 100644 index afe877993..000000000 --- a/src/main/java/cn/nukkit/command/defaults/DeopCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.IPlayer; -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class DeopCommand extends VanillaCommand { - - public DeopCommand(String name) { - super(name, "%nukkit.command.deop.description", "%commands.deop.description"); - this.setPermission("nukkit.command.op.take"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - String playerName = args[0].replace("@s", sender.getName()); - IPlayer player = sender.getServer().getOfflinePlayer(playerName); - player.setOp(false); - - if (player instanceof Player) { - ((Player) player).sendMessage(new TranslationContainer(TextFormat.GRAY + "%commands.deop.message")); - } - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.deop.success", new String[]{player.getName()})); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/DifficultyCommand.java b/src/main/java/cn/nukkit/command/defaults/DifficultyCommand.java deleted file mode 100644 index 993cf811b..000000000 --- a/src/main/java/cn/nukkit/command/defaults/DifficultyCommand.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.network.protocol.SetDifficultyPacket; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class DifficultyCommand extends VanillaCommand { - - public DifficultyCommand(String name) { - super(name, "%nukkit.command.difficulty.description", "%commands.difficulty.usage"); - this.setPermission("nukkit.command.difficulty"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("difficulty", CommandParamType.INT, false) - }); - this.commandParameters.put("byString", new CommandParameter[]{ - new CommandParameter("difficulty", new String[]{"peaceful", "p", "easy", "e", - "normal", "n", "hard", "h"}) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length != 1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - - int difficulty = Server.getDifficultyFromString(args[0]); - - if (sender.getServer().isHardcore()) { - difficulty = 3; - } - - if (difficulty != -1) { - sender.getServer().setDifficulty(difficulty); - - SetDifficultyPacket pk = new SetDifficultyPacket(); - pk.difficulty = sender.getServer().getDifficulty(); - Server.broadcastPacket(/*new ArrayList<>(*/sender.getServer().getOnlinePlayers().values()/*)*/, pk); - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.difficulty.success", String.valueOf(difficulty))); - } else { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/EffectCommand.java b/src/main/java/cn/nukkit/command/defaults/EffectCommand.java deleted file mode 100644 index 4028cf425..000000000 --- a/src/main/java/cn/nukkit/command/defaults/EffectCommand.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.potion.Effect; -import cn.nukkit.potion.InstantEffect; -import cn.nukkit.utils.ServerException; -import cn.nukkit.utils.TextFormat; - -/** - * Created by Snake1999 and Pub4Game on 2016/1/23. - * Package cn.nukkit.command.defaults in project nukkit. - */ -public class EffectCommand extends Command { - - public EffectCommand(String name) { - super(name, "%nukkit.command.effect.description", "%commands.effect.usage"); - this.setPermission("nukkit.command.effect"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("effect", CommandParamType.STRING, false), //Do not use Enum here because of buggy behavior - new CommandParameter("seconds", CommandParamType.INT, true), - new CommandParameter("amplifier", true), - new CommandParameter("hideParticle", true, new String[]{"true", "false"}) - }); - this.commandParameters.put("clear", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("clear", new String[]{"clear"}) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - if (args.length < 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - Player player = sender.getServer().getPlayer(args[0].replace("@s", sender.getName())); - if (player == null) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - return true; - } - if (args[1].equalsIgnoreCase("clear")) { - for (Effect effect : player.getEffects().values()) { - player.removeEffect(effect.getId()); - } - sender.sendMessage(new TranslationContainer("commands.effect.success.removed.all", player.getDisplayName())); - return true; - } - Effect effect; - try { - effect = Effect.getEffect(Integer.parseInt(args[1])); - } catch (NumberFormatException | ServerException a) { - try { - effect = Effect.getEffectByName(args[1]); - } catch (Exception e) { - sender.sendMessage(new TranslationContainer("commands.effect.notFound", args[1])); - return true; - } - } - int duration = 300; - int amplification = 1; - if (args.length >= 3) { - try { - duration = Integer.parseInt(args[2]); - } catch (NumberFormatException a) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - if (!(effect instanceof InstantEffect)) { - duration *= 20; - } - } else if (effect instanceof InstantEffect) { - duration = 1; - } - if (args.length >= 4) { - try { - amplification = Integer.parseInt(args[3]); - } catch (NumberFormatException a) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - } - if (args.length >= 5) { - String v = args[4].toLowerCase(); - if (v.matches("(?i)|on|true|t|1")) { - effect.setVisible(false); - } - } - if (duration == 0) { - if (!player.hasEffect(effect.getId())) { - if (player.getEffects().isEmpty()) { - sender.sendMessage(new TranslationContainer("commands.effect.failure.notActive.all", player.getDisplayName())); - } else { - sender.sendMessage(new TranslationContainer("commands.effect.failure.notActive", effect.getName(), player.getDisplayName())); - } - return true; - } - player.removeEffect(effect.getId()); - sender.sendMessage(new TranslationContainer("commands.effect.success.removed", effect.getName(), player.getDisplayName())); - } else { - effect.setDuration(duration).setAmplifier(amplification); - player.addEffect(effect); - Command.broadcastCommandMessage(sender, new TranslationContainer("%commands.effect.success", effect.getName(), String.valueOf(effect.getAmplifier()), player.getDisplayName(), String.valueOf(effect.getDuration() / 20))); - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/EnchantCommand.java b/src/main/java/cn/nukkit/command/defaults/EnchantCommand.java deleted file mode 100644 index e614c92ea..000000000 --- a/src/main/java/cn/nukkit/command/defaults/EnchantCommand.java +++ /dev/null @@ -1,156 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created by Pub4Game on 23.01.2016. - */ -public class EnchantCommand extends VanillaCommand { - - public EnchantCommand(String name) { - super(name, "%nukkit.command.enchant.description", "%commands.enchant.usage"); - this.setPermission("nukkit.command.enchant"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("enchantment ID", CommandParamType.INT, false), - new CommandParameter("level", CommandParamType.INT, true) - }); - this.commandParameters.put("byName", new CommandParameter[]{ - new CommandParameter("player", CommandParameter.ARG_TYPE_TARGET, false), - new CommandParameter("id", false, CommandParameter.ENUM_TYPE_ENCHANTMENT_LIST), - new CommandParameter("level", CommandParamType.INT, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - if (args.length < 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - Player player = sender.getServer().getPlayer(args[0].replace("@s", sender.getName())); - if (player == null) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - return true; - } - int enchantId; - int enchantLevel; - try { - enchantId = getIdByName(args[1]); - enchantLevel = args.length == 3 ? Integer.parseInt(args[2]) : 1; - } catch (NumberFormatException e) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - Enchantment enchantment = Enchantment.getEnchantment(enchantId); - if (enchantment == null) { - sender.sendMessage(new TranslationContainer("commands.enchant.notFound", String.valueOf(enchantId))); - return true; - } - enchantment.setLevel(enchantLevel); - Item item = player.getInventory().getItemInHand(); - if (item.getId() <= 0) { - sender.sendMessage(new TranslationContainer("commands.enchant.noItem")); - return true; - } - item.addEnchantment(enchantment); - player.getInventory().setItemInHand(item); - Command.broadcastCommandMessage(sender, new TranslationContainer("%commands.enchant.success")); - return true; - } - - public int getIdByName(String value) throws NumberFormatException { - value = value.toLowerCase(); - switch (value) { - case "protection": - return 0; - case "fire_protection": - return 1; - case "feather_falling": - return 2; - case "blast_protection": - return 3; - case "projectile_projection": - return 4; - case "thorns": - return 5; - case "respiration": - return 6; - case "aqua_affinity": - return 7; - case "depth_strider": - return 8; - case "sharpness": - return 9; - case "smite": - return 10; - case "bane_of_arthropods": - return 11; - case "knockback": - return 12; - case "fire_aspect": - return 13; - case "looting": - return 14; - case "efficiency": - return 15; - case "silk_touch": - return 16; - case "durability": - case "unbreaking": - return 17; - case "fortune": - return 18; - case "power": - return 19; - case "punch": - return 20; - case "flame": - return 21; - case "infinity": - return 22; - case "luck_of_the_sea": - return 23; - case "lure": - return 24; - case "frost_walker": - return 25; - case "mending": - return 26; - case "binding_curse": - return 27; - case "vanishing_curse": - return 28; - case "impaling": - return 29; - case "riptide": - return 30; - case "loyalty": - return 31; - case "channeling": - return 32; - case "multishot": - return 33; - case "piercing": - return 34; - case "quick_charge": - return 35; - case "soul_speed": - return 36; - default: - return Integer.parseInt(value); - } - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/GamemodeCommand.java b/src/main/java/cn/nukkit/command/defaults/GamemodeCommand.java deleted file mode 100644 index 131b60168..000000000 --- a/src/main/java/cn/nukkit/command/defaults/GamemodeCommand.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/13 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class GamemodeCommand extends VanillaCommand { - - public GamemodeCommand(String name) { - super(name, "%nukkit.command.gamemode.description", "%commands.gamemode.usage", - new String[]{"gm"}); - this.setPermission("nukkit.command.gamemode.survival;" + - "nukkit.command.gamemode.creative;" + - "nukkit.command.gamemode.adventure;" + - "nukkit.command.gamemode.spectator;" + - "nukkit.command.gamemode.other"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("mode", CommandParamType.INT, false), - new CommandParameter("player", CommandParamType.TARGET, true) - }); - this.commandParameters.put("byString", new CommandParameter[]{ - new CommandParameter("mode", new String[]{"survival", "s", "creative", "c", - "adventure", "a", "spectator", "spc", "view", "v"}), - new CommandParameter("player", CommandParamType.TARGET, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - - int gameMode = Server.getGamemodeFromString(args[0]); - if (gameMode == -1) { - sender.sendMessage("Unknown game mode"); - return true; - } - - CommandSender target = sender; - if (args.length > 1) { - if (sender.hasPermission("nukkit.command.gamemode.other")) { - target = sender.getServer().getPlayer(args[1].replace("@s", sender.getName())); - if (target == null) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - return true; - } - } else { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - return true; - } - } else if (!(sender instanceof Player)) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - - if ((gameMode == 0 && !sender.hasPermission("nukkit.command.gamemode.survival")) || - (gameMode == 1 && !sender.hasPermission("nukkit.command.gamemode.creative")) || - (gameMode == 2 && !sender.hasPermission("nukkit.command.gamemode.adventure")) || - (gameMode == 3 && !sender.hasPermission("nukkit.command.gamemode.spectator"))) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - return true; - } - - if (!((Player) target).setGamemode(gameMode)) { - sender.sendMessage("Game mode update for " + target.getName() + " failed"); - } else { - if (target.equals(sender)) { - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.gamemode.success.self", Server.getGamemodeString(gameMode))); - } else { - target.sendMessage(new TranslationContainer("gameMode.changed")); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.gamemode.success.other", target.getName(), Server.getGamemodeString(gameMode))); - } - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/GameruleCommand.java b/src/main/java/cn/nukkit/command/defaults/GameruleCommand.java deleted file mode 100644 index 19c83a6f7..000000000 --- a/src/main/java/cn/nukkit/command/defaults/GameruleCommand.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.GameRules; - -import java.util.Arrays; -import java.util.Optional; -import java.util.StringJoiner; - -public class GameruleCommand extends VanillaCommand { - - public GameruleCommand(String name) { - super(name, "%nukkit.command.gamerule.description", "%commands.gamerule.usage"); - this.setPermission("nukkit.command.gamerule"); - this.commandParameters.clear(); - this.commandParameters.put("byString", new CommandParameter[]{ - new CommandParameter("gamerule", true , GameRule.getNamesLowerCase()), - new CommandParameter("value", CommandParamType.STRING, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (!sender.isPlayer()) { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - return true; - } - GameRules rules = ((Player) sender).getLevel().getGameRules(); - - switch (args.length) { - case 0: - StringJoiner rulesJoiner = new StringJoiner(", "); - for (GameRule rule: rules.getRules()) { - rulesJoiner.add(rule.getName().toLowerCase()); - } - sender.sendMessage(rulesJoiner.toString()); - return true; - case 1: - Optional gameRule = GameRule.parseString(args[0]); - if (!gameRule.isPresent() || !rules.hasRule(gameRule.get())) { - sender.sendMessage(new TranslationContainer("commands.generic.syntax", "/gamerule", args[0])); - return true; - } - - sender.sendMessage(gameRule.get().getName() + " = " + rules.getString(gameRule.get())); - return true; - default: - Optional optionalRule = GameRule.parseString(args[0]); - - if (!optionalRule.isPresent()) { - sender.sendMessage(new TranslationContainer("commands.generic.syntax", "/gamerule ", args[0], ' ' + String.join(" ", Arrays.copyOfRange(args, 1, args.length)))); - return true; - } - - try { - rules.setGameRules(optionalRule.get(), args[1]); - sender.sendMessage(new TranslationContainer("commands.gamerule.success", optionalRule.get().getName(), args[1])); - } catch (IllegalArgumentException e) { - sender.sendMessage(new TranslationContainer("commands.generic.syntax", "/gamerule " + args[0] + ' ', args[1], ' ' + String.join(" ", Arrays.copyOfRange(args, 2, args.length)))); - } - return true; - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/defaults/GarbageCollectorCommand.java b/src/main/java/cn/nukkit/command/defaults/GarbageCollectorCommand.java deleted file mode 100644 index 94cb5c126..000000000 --- a/src/main/java/cn/nukkit/command/defaults/GarbageCollectorCommand.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.CommandSender; -import cn.nukkit.level.Level; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/11 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class GarbageCollectorCommand extends VanillaCommand { - - public GarbageCollectorCommand(String name) { - super(name, "%nukkit.command.gc.description", "%nukkit.command.gc.usage"); - this.setPermission("nukkit.command.gc"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - int chunksCollected = 0; - int entitiesCollected = 0; - int tilesCollected = 0; - long memory = Runtime.getRuntime().freeMemory(); - - for (Level level : sender.getServer().getLevels().values()) { - int chunksCount = level.getChunks().size(); - int entitiesCount = level.getEntities().length; - int tilesCount = level.getBlockEntities().size(); - level.doChunkGarbageCollection(); - level.unloadChunks(true); - chunksCollected += chunksCount - level.getChunks().size(); - entitiesCollected += entitiesCount - level.getEntities().length; - tilesCollected += tilesCount - level.getBlockEntities().size(); - } - - System.gc(); - - long freedMemory = Runtime.getRuntime().freeMemory() - memory; - - sender.sendMessage(TextFormat.GREEN + "---- " + TextFormat.WHITE + "Garbage collection result" + TextFormat.GREEN + " ----"); - sender.sendMessage(TextFormat.GOLD + "Chunks: " + TextFormat.RED + chunksCollected); - sender.sendMessage(TextFormat.GOLD + "Entities: " + TextFormat.RED + entitiesCollected); - sender.sendMessage(TextFormat.GOLD + "Block Entities: " + TextFormat.RED + tilesCollected); - sender.sendMessage(TextFormat.GOLD + "Memory freed: " + TextFormat.RED + NukkitMath.round((freedMemory / 1024d / 1024d), 2) + " MB"); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/GenerateWorldCommand.java b/src/main/java/cn/nukkit/command/defaults/GenerateWorldCommand.java deleted file mode 100644 index 9d1b469d5..000000000 --- a/src/main/java/cn/nukkit/command/defaults/GenerateWorldCommand.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.level.generator.Generator; - -public class GenerateWorldCommand extends Command { - - public GenerateWorldCommand(String name) { - super(name, "%nukkit.command.generateworld.description", "%nukkit.command.generateworld.usage"); - this.setPermission("nukkit.command.generateworld"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("name", CommandParamType.STRING, false), - new CommandParameter("type", CommandParamType.STRING, false), - new CommandParameter("seed", CommandParamType.INT, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 3) { - if (Server.getInstance().isLevelGenerated(args[0])) { - sender.sendMessage("\u00A7cWorld \u00A77" + args[0] + " \u00A7calready exists"); - return true; - } - - long seed; - - try { - seed = Long.parseLong(args[2]); - } catch (NumberFormatException e) { - sender.sendMessage("\u00A7cThe seed must be numeric"); - return true; - } - - Server.getInstance().generateLevel(args[0], seed, Generator.getGenerator(args[1])); - - sender.sendMessage("\u00A72Generating world \u00A77" + args[0] + "\u00A72..."); - - return true; - } - - return false; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/GiveCommand.java b/src/main/java/cn/nukkit/command/defaults/GiveCommand.java deleted file mode 100644 index 5678afeeb..000000000 --- a/src/main/java/cn/nukkit/command/defaults/GiveCommand.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.item.Item; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/12/9 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class GiveCommand extends VanillaCommand { - - public GiveCommand(String name) { - super(name, "%nukkit.command.give.description", "%nukkit.command.give.usage"); - this.setPermission("nukkit.command.give"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("itemName", false, CommandParameter.ENUM_TYPE_ITEM_LIST), - new CommandParameter("amount", CommandParamType.INT, true), - new CommandParameter("meta", CommandParamType.INT, true), - new CommandParameter("tags...", CommandParamType.RAWTEXT, true) - }); - this.commandParameters.put("toPlayerById", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("item ID", CommandParamType.INT, false), - new CommandParameter("amount", CommandParamType.INT, true), - new CommandParameter("tags...", CommandParamType.RAWTEXT, true) - }); - this.commandParameters.put("toPlayerByIdMeta", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("item ID:meta", CommandParamType.RAWTEXT, false), - new CommandParameter("amount", CommandParamType.INT, true), - new CommandParameter("tags...", CommandParamType.RAWTEXT, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length < 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return true; - } - - Player player = sender.getServer().getPlayer(args[0].replace("@s", sender.getName())); - Item item; - - try { - item = Item.fromString(args[1]); - } catch (Exception e) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - - if (item.getDamage() < 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - - try { - item.setCount(Integer.parseInt(args[2])); - } catch (Exception e) { - item.setCount(item.getMaxStackSize()); - } - - if (player != null) { - if (item.getId() == 0) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.give.item.notFound", args[1])); - return true; - } - player.getInventory().addItem(item.clone()); - } else { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - - return true; - } - Command.broadcastCommandMessage(sender, new TranslationContainer( - "%commands.give.success", - item.getName() + " (" + item.getId() + ':' + item.getDamage() + ')', - String.valueOf(item.getCount()), - player.getName())); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/HelpCommand.java b/src/main/java/cn/nukkit/command/defaults/HelpCommand.java deleted file mode 100644 index 206f31c00..000000000 --- a/src/main/java/cn/nukkit/command/defaults/HelpCommand.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.ConsoleCommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -import java.util.Map; -import java.util.TreeMap; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class HelpCommand extends VanillaCommand { - - public HelpCommand(String name) { - super(name, "%nukkit.command.help.description", "%commands.help.usage", new String[]{"?"}); - this.setPermission("nukkit.command.help"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("page", CommandParamType.INT, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - StringBuilder command = new StringBuilder(); - int pageNumber = 1; - int pageHeight = 5; - if (args.length != 0) { - try { - pageNumber = Integer.parseInt(args[args.length - 1]); - if (pageNumber <= 0) { - pageNumber = 1; - } - - String[] newargs = new String[args.length - 1]; - System.arraycopy(args, 0, newargs, 0, newargs.length); - args = newargs; - /*if (args.length > 1) { - args = Arrays.copyOfRange(args, 0, args.length - 2); - } else { - args = new String[0]; - }*/ - for (String arg : args) { - if (command.length() > 0) { - command.append(' '); - } - command.append(arg); - } - } catch (NumberFormatException e) { - pageNumber = 1; - for (String arg : args) { - if (command.length() > 0) { - command.append(' '); - } - command.append(arg); - } - } - } - - if (sender instanceof ConsoleCommandSender) { - pageHeight = Integer.MAX_VALUE; - } - - if (command.length() == 0) { - Map commands = new TreeMap<>(); - for (Command cmd : sender.getServer().getCommandMap().getCommands().values()) { - if (cmd.testPermissionSilent(sender)) { - commands.put(cmd.getName(), cmd); - } - } - int totalPage = commands.size() % pageHeight == 0 ? commands.size() / pageHeight : commands.size() / pageHeight + 1; - pageNumber = Math.min(pageNumber, totalPage); - if (pageNumber < 1) { - pageNumber = 1; - } - - sender.sendMessage(new TranslationContainer("commands.help.header", String.valueOf(pageNumber), String.valueOf(totalPage))); - int i = 1; - for (Command command1 : commands.values()) { - if (i >= (pageNumber - 1) * pageHeight + 1 && i <= Math.min(commands.size(), pageNumber * pageHeight)) { - sender.sendMessage(TextFormat.DARK_GREEN + "/" + command1.getName() + ": " + TextFormat.WHITE + command1.getDescription()); - } - i++; - } - - return true; - } else { - Command cmd = sender.getServer().getCommandMap().getCommand(command.toString().toLowerCase()); - if (cmd != null) { - if (cmd.testPermissionSilent(sender)) { - String message = TextFormat.YELLOW + "--------- " + TextFormat.WHITE + " Help: /" + cmd.getName() + TextFormat.YELLOW + " ---------\n"; - message += TextFormat.GOLD + "Description: " + TextFormat.WHITE + cmd.getDescription() + '\n'; - StringBuilder usage = new StringBuilder(); - String[] usages = cmd.getUsage().split("\n"); - for (String u : usages) { - if (usage.length() > 0) { - usage.append("\n" + TextFormat.WHITE); - } - usage.append(u); - } - message += TextFormat.GOLD + "Usage: " + TextFormat.WHITE + usage + '\n'; - sender.sendMessage(message); - return true; - } - } - - sender.sendMessage(TextFormat.RED + "No help for " + command.toString().toLowerCase()); - return true; - } - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/KickCommand.java b/src/main/java/cn/nukkit/command/defaults/KickCommand.java deleted file mode 100644 index db406fbea..000000000 --- a/src/main/java/cn/nukkit/command/defaults/KickCommand.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.event.player.PlayerKickEvent; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/11 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class KickCommand extends VanillaCommand { - - public KickCommand(String name) { - super(name, "%nukkit.command.kick.description", "%commands.kick.usage"); - this.setPermission("nukkit.command.kick"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("reason", CommandParamType.STRING, false), - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - - String name = args[0].replace("@s", sender.getName()); - - StringBuilder reason = new StringBuilder(); - for (int i = 1; i < args.length; i++) { - reason.append(args[i]).append(' '); - } - - if (reason.length() > 0) { - reason = new StringBuilder(reason.substring(0, reason.length() - 1)); - } - - Player player = sender.getServer().getPlayer(name); - if (player != null) { - player.kick(PlayerKickEvent.Reason.KICKED_BY_ADMIN, reason.toString(), true, "source=" + sender.getName() + ", reason=" + reason.toString()); - if (reason.length() >= 1) { - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.kick.success.reason", player.getName(), reason.toString()) - ); - } else { - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.kick.success", player.getName())); - } - } else { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/KillCommand.java b/src/main/java/cn/nukkit/command/defaults/KillCommand.java deleted file mode 100644 index 124d39689..000000000 --- a/src/main/java/cn/nukkit/command/defaults/KillCommand.java +++ /dev/null @@ -1,150 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityHuman; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Level; -import cn.nukkit.utils.TextFormat; - -import java.util.StringJoiner; - -/** - * Created on 2015/12/08 by Pub4Game. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class KillCommand extends VanillaCommand { - - public KillCommand(String name) { - super(name, "%nukkit.command.kill.description", "%nukkit.command.kill.usage", new String[]{"suicide"}); - this.setPermission("nukkit.command.kill.self;nukkit.command.kill.other"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - if (args.length >= 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - if (args.length == 1) { - if (!sender.hasPermission("nukkit.command.kill.other")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - return true; - } - Player player = sender.getServer().getPlayer(args[0]); - if (player != null) { - EntityDamageEvent ev = new EntityDamageEvent(player, DamageCause.SUICIDE, 1000); - sender.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return true; - } - player.setLastDamageCause(ev); - player.setHealth(0); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.kill.successful", player.getName())); - } else if (args[0].equals("@e")) { - StringJoiner joiner = new StringJoiner(", "); - for (Level level : Server.getInstance().getLevels().values()) { - for (Entity entity : level.getEntities()) { - if (!(entity instanceof EntityHuman)) { - joiner.add(entity.getName()); - if (!(entity instanceof BaseEntity)) { - entity.close(); - } else { - entity.attack(new EntityDamageEvent(entity, DamageCause.SUICIDE, 1000)); - } - } - } - } - String entities = joiner.toString(); - sender.sendMessage(new TranslationContainer("commands.kill.successful", entities.isEmpty() ? "0" : entities)); - } else if (args[0].equals("@b")) { - StringJoiner joiner = new StringJoiner(", "); - for (Level level : Server.getInstance().getLevels().values()) { - for (Entity entity : level.getEntities()) { - if (entity instanceof BaseEntity) { - joiner.add(entity.getName()); - entity.attack(new EntityDamageEvent(entity, DamageCause.SUICIDE, 1000)); - } - } - } - String entities = joiner.toString(); - sender.sendMessage(new TranslationContainer("commands.kill.successful", entities.isEmpty() ? "0" : entities)); - } else if (args[0].equals("@i")) { - StringJoiner joiner = new StringJoiner(", "); - for (Level level : Server.getInstance().getLevels().values()) { - for (Entity entity : level.getEntities()) { - if (entity instanceof EntityItem) { - joiner.add(entity.getName()); - entity.close(); - } - } - } - String entities = joiner.toString(); - sender.sendMessage(new TranslationContainer("commands.kill.successful", entities.isEmpty() ? "0" : entities)); - } else if (args[0].equals("@s") && sender instanceof Player) { - if (!sender.hasPermission("nukkit.command.kill.self")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - return true; - } - EntityDamageEvent ev = new EntityDamageEvent((Player) sender, DamageCause.SUICIDE, 1000); - sender.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return true; - } - ((Player) sender).setLastDamageCause(ev); - ((Player) sender).setHealth(0); - sender.sendMessage(new TranslationContainer("commands.kill.successful", sender.getName())); - } else if (args[0].equals("@a")) { - if (!sender.hasPermission("nukkit.command.kill.other")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - return true; - } - for (Level level : Server.getInstance().getLevels().values()) { - for (Entity entity : level.getEntities()) { - if (entity instanceof Player) { - entity.attack(new EntityDamageEvent(entity, DamageCause.SUICIDE, 1000)); - } - } - } - sender.sendMessage(TextFormat.GOLD + "Killed all players"); - } else { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - } - return true; - } - if (sender instanceof Player) { - if (!sender.hasPermission("nukkit.command.kill.self")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - return true; - } - EntityDamageEvent ev = new EntityDamageEvent((Player) sender, DamageCause.SUICIDE, 1000); - sender.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return true; - } - ((Player) sender).setLastDamageCause(ev); - ((Player) sender).setHealth(0); - sender.sendMessage(new TranslationContainer("commands.kill.successful", sender.getName())); - } else { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/ListCommand.java b/src/main/java/cn/nukkit/command/defaults/ListCommand.java deleted file mode 100644 index 60a0ca31a..000000000 --- a/src/main/java/cn/nukkit/command/defaults/ListCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; - -/** - * Created on 2015/11/11 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class ListCommand extends VanillaCommand { - - public ListCommand(String name) { - super(name, "%nukkit.command.list.description", "%commands.players.usage"); - this.setPermission("nukkit.command.list"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - StringBuilder online = new StringBuilder(); - int onlineCount = 0; - for (Player player : sender.getServer().getOnlinePlayers().values()) { - if (player.isOnline() && (!(sender instanceof Player) || ((Player) sender).canSee(player))) { - online.append(player.getDisplayName()).append(", "); - ++onlineCount; - } - } - - if (online.length() > 0) { - online = new StringBuilder(online.substring(0, online.length() - 2)); - } - - sender.sendMessage(new TranslationContainer("commands.players.list", String.valueOf(onlineCount), String.valueOf(sender.getServer().getMaxPlayers()))); - sender.sendMessage(online.toString()); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/MeCommand.java b/src/main/java/cn/nukkit/command/defaults/MeCommand.java deleted file mode 100644 index 70f4f81c8..000000000 --- a/src/main/java/cn/nukkit/command/defaults/MeCommand.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class MeCommand extends VanillaCommand { - - public MeCommand(String name) { - super(name, "%nukkit.command.me.description", "%nukkit.command.me.usage"); - this.setPermission("nukkit.command.me"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("action ...", CommandParamType.RAWTEXT, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - String name; - if (sender instanceof Player) { - name = ((Player) sender).getDisplayName(); - } else { - name = sender.getName(); - } - - StringBuilder msg = new StringBuilder(); - for (String arg : args) { - msg.append(arg).append(' '); - } - - if (msg.length() > 0) { - msg = new StringBuilder(msg.substring(0, msg.length() - 1)); - } - - sender.getServer().broadcastMessage(new TranslationContainer("chat.type.emote", name, TextFormat.WHITE + msg.toString())); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/OpCommand.java b/src/main/java/cn/nukkit/command/defaults/OpCommand.java deleted file mode 100644 index ca9e9d289..000000000 --- a/src/main/java/cn/nukkit/command/defaults/OpCommand.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.IPlayer; -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class OpCommand extends VanillaCommand { - - public OpCommand(String name) { - super(name, "%nukkit.command.op.description", "%nukkit.command.op.usage"); - this.setPermission("nukkit.command.op.give"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (sender instanceof Player && !(Server.getInstance().opInGame)) { - sender.sendMessage("\u00A7cCan't use this command in game"); - return true; - } - - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - - String name = args[0]; - IPlayer player = sender.getServer().getOfflinePlayer(name); - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.op.success", player.getName())); - if (player instanceof Player) { - ((Player) player).sendMessage(new TranslationContainer(TextFormat.GRAY + "%commands.op.message")); - } - - player.setOp(true); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/PardonCommand.java b/src/main/java/cn/nukkit/command/defaults/PardonCommand.java deleted file mode 100644 index 5f4719692..000000000 --- a/src/main/java/cn/nukkit/command/defaults/PardonCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PardonCommand extends VanillaCommand { - - public PardonCommand(String name) { - super(name, "%nukkit.command.unban.player.description", "%commands.unban.usage"); - this.setPermission("nukkit.command.unban.player"); - this.setAliases(new String[]{"unban"}); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length != 1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - sender.getServer().getNameBans().remove(args[0]); - - Command.broadcastCommandMessage(sender, new TranslationContainer("%commands.unban.success", args[0])); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/PardonIpCommand.java b/src/main/java/cn/nukkit/command/defaults/PardonIpCommand.java deleted file mode 100644 index 91c8a113a..000000000 --- a/src/main/java/cn/nukkit/command/defaults/PardonIpCommand.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.regex.Pattern; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PardonIpCommand extends VanillaCommand { - - public PardonIpCommand(String name) { - super(name, "%nukkit.command.unban.ip.description", "%commands.unbanip.usage"); - this.setPermission("nukkit.command.unban.ip"); - this.setAliases(new String[]{"unbanip", "unban-ip", "pardonip"}); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("ip") - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length != 1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - String value = args[0]; - - if (Pattern.matches("^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$", value)) { - sender.getServer().getIPBans().remove(value); - - try { - sender.getServer().getNetwork().unblockAddress(InetAddress.getByName(value)); - } catch (UnknownHostException e) { - sender.sendMessage(new TranslationContainer("commands.unbanip.invalid")); - return true; - } - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.unbanip.success", value)); - } else { - - sender.sendMessage(new TranslationContainer("commands.unbanip.invalid")); - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/ParticleCommand.java b/src/main/java/cn/nukkit/command/defaults/ParticleCommand.java deleted file mode 100644 index 3d5371523..000000000 --- a/src/main/java/cn/nukkit/command/defaults/ParticleCommand.java +++ /dev/null @@ -1,251 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.item.Item; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.level.particle.*; -import cn.nukkit.math.Vector3; -import cn.nukkit.math.Vector3f; -import cn.nukkit.network.protocol.SpawnParticleEffectPacket; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class ParticleCommand extends VanillaCommand { - - private static final String[] ENUM_VALUES = new String[]{"explode", "hugeexplosion", "hugeexplosionseed", "bubble" - , "splash", "wake", "water", "crit", "smoke", "spell", "instantspell", "dripwater", "driplava", "townaura" - , "spore", "portal", "flame", "lava", "reddust", "snowballpoof", "slime", "itembreak", "terrain", "heart" - , "ink", "droplet", "enchantmenttable", "happyvillager", "angryvillager", "forcefield"}; - - public ParticleCommand(String name) { - super(name, "%nukkit.command.particle.description", "%nukkit.command.particle.usage"); - this.setPermission("nukkit.command.particle"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("name", false, ENUM_VALUES), - new CommandParameter("position", CommandParamType.POSITION, false), - new CommandParameter("count", CommandParamType.INT, true), - new CommandParameter("data", true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length < 4) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - - Position defaultPosition; - if (sender instanceof Player) { - defaultPosition = ((Player) sender).getPosition(); - } else { - defaultPosition = new Position(0, 0, 0, sender.getServer().getDefaultLevel()); - } - - String name = args[0].toLowerCase(); - - double x; - double y; - double z; - - try { - x = getDouble(args[1], defaultPosition.getX()); - y = getDouble(args[2], defaultPosition.getY()); - z = getDouble(args[3], defaultPosition.getZ()); - } catch (Exception e) { - return false; - } - Position position = new Position(x, y, z, defaultPosition.getLevel()); - - int count = 1; - if (args.length > 4) { - try { - double c = Double.parseDouble(args[4]); - count = (int) c; - } catch (Exception ignored) {} - } - count = Math.max(1, count); - - int data = -1; - if (args.length > 5) { - try { - double d = Double.parseDouble(args[8]); - data = (int) d; - } catch (Exception ignored) {} - } - if (showParticleEffect(name, position, position.getLevel(), count)) { - sender.sendMessage(new TranslationContainer("commands.particle.success", name, String.valueOf(count))); - } else { - Particle particle = getParticle(name, position, data); - - if (particle == null) { - position.level.addParticleEffect(position.asVector3f(), args[0], -1, position.level.getDimension()); - return true; - } - - sender.sendMessage(new TranslationContainer("commands.particle.success", name, String.valueOf(count))); - - ThreadLocalRandom random = ThreadLocalRandom.current(); - - for (int i = 0; i < count; i++) { - particle.setComponents( - position.x + (random.nextFloat() * 2 - 1), - position.y + (random.nextFloat() * 2 - 1), - position.z + (random.nextFloat() * 2 - 1) - ); - position.getLevel().addParticle(particle); - } - } - - return true; - } - - private static Particle getParticle(String name, Vector3 pos, int data) { - switch (name) { - case "explode": - return new ExplodeParticle(pos); - case "hugeexplosion": - return new HugeExplodeParticle(pos); - case "hugeexplosionseed": - return new HugeExplodeSeedParticle(pos); - case "bubble": - return new BubbleParticle(pos); - case "splash": - return new SplashParticle(pos); - case "wake": - case "water": - return new WaterParticle(pos); - case "crit": - return new CriticalParticle(pos); - case "smoke": - return new SmokeParticle(pos, data != -1 ? data : 0); - case "spell": - return new EnchantParticle(pos); - case "instantspell": - return new InstantEnchantParticle(pos); - case "dripwater": - return new WaterDripParticle(pos); - case "driplava": - return new LavaDripParticle(pos); - case "townaura": - case "spore": - return new SporeParticle(pos); - case "portal": - return new PortalParticle(pos); - case "flame": - return new FlameParticle(pos); - case "lava": - return new LavaParticle(pos); - case "reddust": - return new RedstoneParticle(pos, data != -1 ? data : 1); - case "snowballpoof": - return new ItemBreakParticle(pos, Item.get(Item.SNOWBALL)); - case "slime": - return new ItemBreakParticle(pos, Item.get(Item.SLIMEBALL)); - case "itembreak": - if (data != -1 && data != 0) { - return new ItemBreakParticle(pos, Item.get(data)); - } - break; - case "terrain": - if (data != -1 && data != 0) { - return new TerrainParticle(pos, Block.get(data)); - } - break; - case "heart": - return new HeartParticle(pos, data != -1 ? data : 0); - case "ink": - return new InkParticle(pos, data != -1 ? data : 0); - case "droplet": - return new RainSplashParticle(pos); - case "enchantmenttable": - return new EnchantmentTableParticle(pos); - case "happyvillager": - return new HappyVillagerParticle(pos); - case "angryvillager": - return new AngryVillagerParticle(pos); - case "forcefield": - return new BlockForceFieldParticle(pos); - } - - if (name.startsWith("iconcrack_")) { - String[] d = name.split("_"); - if (d.length == 3) { - return new ItemBreakParticle(pos, Item.get(Integer.parseInt(d[1]), Integer.valueOf(d[2]))); - } - } else if (name.startsWith("blockcrack_")) { - String[] d = name.split("_"); - if (d.length == 2) { - return new TerrainParticle(pos, Block.get(Integer.parseInt(d[1]) & 0xff, Integer.parseInt(d[1]) >> 12)); - } - } else if (name.startsWith("blockdust_")) { - String[] d = name.split("_"); - if (d.length >= 4) { - return new DustParticle(pos, Integer.parseInt(d[1]) & 0xff, Integer.parseInt(d[2]) & 0xff, Integer.parseInt(d[3]) & 0xff, d.length >= 5 ? Integer.parseInt(d[4]) & 0xff : 255); - } - } - - return null; - } - - private static boolean showParticleEffect(String name, Vector3 pos, Level level, int count) { - switch (name) { - case "minecraft:test_beziercurve": - case "minecraft:test_catmullromcurve": - case "minecraft:test_combocurve": - case "minecraft:test_linearcurve": - case "minecraft:test_spiral": - case "minecraft:test_sphere": - case "minecraft:test_smoke_puff": - case "minecraft:test_mule": - case "minecraft:test_highrestitution": - case "minecraft:test_bounce": - case "minecraft:test_colorcurve": - case "minecraft:mobflame_emitter": - break; - default: - return false; - } - - SpawnParticleEffectPacket pk = new SpawnParticleEffectPacket(); - pk.dimensionId = level.getDimension(); - pk.position = new Vector3f((int) pos.x, (int) pos.y, (int) pos.z); - pk.identifier = name; - - for (Player p : level.getPlayers().values()) { - if (p.protocol >= 313) { - for (int i = 0; i < count; i++) { - p.dataPacket(pk); - } - } - } - - return true; - } - - private static double getDouble(String arg, double defaultValue) { - if (arg.startsWith("~")) { - String relativePos = arg.substring(1); - if (relativePos.isEmpty()) { - return defaultValue; - } - return defaultValue + Double.parseDouble(relativePos); - } - return Double.parseDouble(arg); - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/PlaySoundCommand.java b/src/main/java/cn/nukkit/command/defaults/PlaySoundCommand.java deleted file mode 100644 index 93ed6e02f..000000000 --- a/src/main/java/cn/nukkit/command/defaults/PlaySoundCommand.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; - -/** - * Created by PetteriM1 - */ -public class PlaySoundCommand extends VanillaCommand { - - public PlaySoundCommand(String name) { - super(name, "%nukkit.command.playsound.description", "%commands.playsound.usage"); - this.setPermission("nukkit.command.playsound"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("sound", CommandParamType.STRING, false), - new CommandParameter("player", CommandParamType.TARGET, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("%commands.playsound.usage", this.usageMessage)); - return false; - } - - if (args.length == 1) { - if (!(sender instanceof Player)) { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - return true; - } - - Player p = (Player) sender; - - p.getLevel().addSound(p, args[0], p); - p.sendMessage(new TranslationContainer("commands.playsound.success", args[0], p.getName())); - - return true; - } - - if (args[1].equalsIgnoreCase("@a")) { - for (Player p : Server.getInstance().getOnlinePlayers().values()) { - p.getLevel().addSound(p, args[0], p); - } - - sender.sendMessage(new TranslationContainer("commands.playsound.success", args[0], "@a")); - - return true; - } - - if (args[1].equalsIgnoreCase("@s") && sender instanceof Player) { - Player p = (Player) sender; - - p.getLevel().addSound(p, args[0], p); - sender.sendMessage(new TranslationContainer("commands.playsound.success", args[0], p.getName())); - - return true; - } - - Player p = Server.getInstance().getPlayer(args[1]); - - if (p == null) { - sender.sendMessage(new TranslationContainer("commands.generic.player.notFound")); - return true; - } - - p.getLevel().addSound(p, args[0], p); - sender.sendMessage(new TranslationContainer("commands.playsound.success", args[0], p.getName())); - - return true; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/defaults/PluginsCommand.java b/src/main/java/cn/nukkit/command/defaults/PluginsCommand.java deleted file mode 100644 index c8afa9fa9..000000000 --- a/src/main/java/cn/nukkit/command/defaults/PluginsCommand.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.utils.TextFormat; - -import java.util.Map; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class PluginsCommand extends VanillaCommand { - - public PluginsCommand(String name) { - super(name, "%nukkit.command.plugins.description", "%nukkit.command.plugins.usage"); - this.setPermission("nukkit.command.plugins"); - this.setAliases(new String[]{"pl"}); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - sendPluginList(sender); - return true; - } - - private static void sendPluginList(CommandSender sender) { - StringBuilder list = new StringBuilder(); - Map plugins = sender.getServer().getPluginManager().getPlugins(); - for (Plugin plugin : plugins.values()) { - if (list.length() > 0) { - list.append(TextFormat.WHITE + ", "); - } - list.append(plugin.isEnabled() ? TextFormat.GREEN : TextFormat.RED); - list.append(plugin.getDescription().getFullName()); - } - - sender.sendMessage(new TranslationContainer("nukkit.command.plugins.success", String.valueOf(plugins.size()), list.toString())); - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/ReloadCommand.java b/src/main/java/cn/nukkit/command/defaults/ReloadCommand.java deleted file mode 100644 index cf584839a..000000000 --- a/src/main/java/cn/nukkit/command/defaults/ReloadCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ReloadCommand extends VanillaCommand { - - public ReloadCommand(String name) { - super(name, "%nukkit.command.reload.description", "%commands.reload.usage"); - this.setPermission("nukkit.command.reload"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - Command.broadcastCommandMessage(sender, new TranslationContainer(TextFormat.YELLOW + "%nukkit.command.reload.reloading" + TextFormat.WHITE)); - - sender.getServer().reload(); - - Command.broadcastCommandMessage(sender, new TranslationContainer(TextFormat.YELLOW + "%nukkit.command.reload.reloaded" + TextFormat.WHITE)); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SaveCommand.java b/src/main/java/cn/nukkit/command/defaults/SaveCommand.java deleted file mode 100644 index 9e119f2d1..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SaveCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Level; - -/** - * Created on 2015/11/13 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class SaveCommand extends VanillaCommand { - - public SaveCommand(String name) { - super(name, "%nukkit.command.save.description", "%commands.save.usage"); - this.setPermission("nukkit.command.save.perform"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.save.start")); - - for (Player player : sender.getServer().getOnlinePlayers().values()) { - player.save(); - } - - for (Level level : sender.getServer().getLevels().values()) { - level.save(true); - } - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.save.success")); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SaveOffCommand.java b/src/main/java/cn/nukkit/command/defaults/SaveOffCommand.java deleted file mode 100644 index 762cd3140..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SaveOffCommand.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; - -/** - * Created on 2015/11/13 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class SaveOffCommand extends VanillaCommand { - - public SaveOffCommand(String name) { - super(name, "%nukkit.command.saveoff.description", "%commands.save-off.usage"); - this.setPermission("nukkit.command.save.disable"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - sender.getServer().setAutoSave(false); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.save.disabled")); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SaveOnCommand.java b/src/main/java/cn/nukkit/command/defaults/SaveOnCommand.java deleted file mode 100644 index a3f6a5dfd..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SaveOnCommand.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; - -/** - * Created on 2015/11/13 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class SaveOnCommand extends VanillaCommand { - - public SaveOnCommand(String name) { - super(name, "%nukkit.command.saveon.description", "%commands.save-on.usage"); - this.setPermission("nukkit.command.save.enable"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - sender.getServer().setAutoSave(true); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.save.enabled")); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SayCommand.java b/src/main/java/cn/nukkit/command/defaults/SayCommand.java deleted file mode 100644 index ae234c5f0..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SayCommand.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.ConsoleCommandSender; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class SayCommand extends VanillaCommand { - - public SayCommand(String name) { - super(name, "%nukkit.command.say.description", "%commands.say.usage"); - this.setPermission("nukkit.command.say"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("message") - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - - String senderString; - if (sender instanceof Player) { - senderString = ((Player) sender).getDisplayName(); - } else if (sender instanceof ConsoleCommandSender) { - senderString = "Server"; - } else { - senderString = sender.getName(); - } - - StringBuilder msg = new StringBuilder(); - for (String arg : args) { - msg.append(arg).append(' '); - } - if (msg.length() > 0) { - msg = new StringBuilder(msg.substring(0, msg.length() - 1)); - } - - - sender.getServer().broadcastMessage(new TranslationContainer( - TextFormat.LIGHT_PURPLE + "%chat.type.announcement", - senderString, TextFormat.LIGHT_PURPLE + msg.toString())); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SeedCommand.java b/src/main/java/cn/nukkit/command/defaults/SeedCommand.java deleted file mode 100644 index b269df22c..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SeedCommand.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class SeedCommand extends VanillaCommand { - - public SeedCommand(String name) { - super(name, "%nukkit.command.seed.description", "%commands.seed.usage"); - this.setPermission("nukkit.command.seed"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - long seed; - if (sender instanceof Player) { - seed = ((Player) sender).getLevel().getSeed(); - } else { - seed = sender.getServer().getDefaultLevel().getSeed(); - } - - sender.sendMessage(new TranslationContainer("commands.seed.success", String.valueOf(seed))); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SetWorldSpawnCommand.java b/src/main/java/cn/nukkit/command/defaults/SetWorldSpawnCommand.java deleted file mode 100644 index 2da5ba32e..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SetWorldSpawnCommand.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Level; -import cn.nukkit.math.Vector3; - -import java.text.DecimalFormat; - -/** - * Created on 2015/12/13 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class SetWorldSpawnCommand extends VanillaCommand { - - public SetWorldSpawnCommand(String name) { - super(name, "%nukkit.command.setworldspawn.description", "%commands.setworldspawn.usage"); - this.setPermission("nukkit.command.setworldspawn"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("blockPos", CommandParamType.POSITION, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - Level level; - Vector3 pos; - if (args.length == 0) { - if (sender instanceof Player) { - level = ((Player) sender).getLevel(); - pos = ((Player) sender).round(); - } else { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - return true; - } - } else if (args.length == 3) { - level = sender.getServer().getDefaultLevel(); - try { - pos = new Vector3(Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])); - } catch (NumberFormatException e1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - } else { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - level.setSpawnLocation(pos); - DecimalFormat round2 = new DecimalFormat("##0.00"); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.setworldspawn.success", round2.format(pos.x), round2.format(pos.y), round2.format(pos.z))); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SpawnCommand.java b/src/main/java/cn/nukkit/command/defaults/SpawnCommand.java deleted file mode 100644 index 21683cdc5..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SpawnCommand.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.CommandSender; -import cn.nukkit.event.player.PlayerTeleportEvent; -import cn.nukkit.lang.TranslationContainer; - -public class SpawnCommand extends VanillaCommand { - - public SpawnCommand(String name) { - super(name, "%nukkit.command.spawn.description", "%commands.spawn.usage"); - this.setPermission("nukkit.command.spawn"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (sender instanceof Player) { - ((Player) sender).teleport(((Player) sender).getLevel().getSafeSpawn(), PlayerTeleportEvent.TeleportCause.COMMAND); - } else { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SpawnpointCommand.java b/src/main/java/cn/nukkit/command/defaults/SpawnpointCommand.java deleted file mode 100644 index 565c3f0c2..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SpawnpointCommand.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.TextFormat; - -import java.text.DecimalFormat; - -/** - * Created on 2015/12/13 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class SpawnpointCommand extends VanillaCommand { - - public SpawnpointCommand(String name) { - super(name, "%nukkit.command.spawnpoint.description", "%commands.spawnpoint.usage"); - this.setPermission("nukkit.command.spawnpoint"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("blockPos", CommandParamType.POSITION, true), - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - Player target; - if (args.length == 0) { - if (sender instanceof Player) { - target = (Player) sender; - } else { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - return true; - } - } else { - target = sender.getServer().getPlayer(args[0]); - if (target == null) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - return true; - } - } - Level level = target.getLevel(); - DecimalFormat round2 = new DecimalFormat("##0.00"); - if (args.length == 4) { - if (level != null) { - int x; - int y; - int z; - try { - x = Integer.parseInt(args[1]); - y = Integer.parseInt(args[2]); - z = Integer.parseInt(args[3]); - } catch (NumberFormatException e1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - if (y < 0) y = 0; - if (y > 256) y = 256; - target.setSpawn(new Position(x, y, z, level)); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.spawnpoint.success", target.getName(), - round2.format(x), - round2.format(y), - round2.format(z))); - return true; - } - } else if (args.length <= 1) { - if (sender instanceof Player) { - Position pos = (Position) sender; - target.setSpawn(pos); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.spawnpoint.success", target.getName(), - round2.format(pos.x), - round2.format(pos.y), - round2.format(pos.z))); - return true; - } else { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - return true; - } - } - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/defaults/StatusCommand.java b/src/main/java/cn/nukkit/command/defaults/StatusCommand.java deleted file mode 100644 index edf73b213..000000000 --- a/src/main/java/cn/nukkit/command/defaults/StatusCommand.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Nukkit; -import cn.nukkit.Server; -import cn.nukkit.command.CommandSender; -import cn.nukkit.level.Level; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.utils.TextFormat; - -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -/** - * Created on 2015/11/11 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class StatusCommand extends VanillaCommand { - - private static final String UPTIME_FORMAT = TextFormat.RED + "%d" + TextFormat.GOLD + " days " + - TextFormat.RED + "%d" + TextFormat.GOLD + " hours " + - TextFormat.RED + "%d" + TextFormat.GOLD + " minutes " + - TextFormat.RED + "%d" + TextFormat.GOLD + " seconds"; - - public StatusCommand(String name) { - super(name, "%nukkit.command.status.description", "%nukkit.command.status.usage"); - this.setPermission("nukkit.command.status"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - Server server = sender.getServer(); - sender.sendMessage(TextFormat.GREEN + "---- " + TextFormat.WHITE + "Server status" + TextFormat.GREEN + " ----"); - - long time = System.currentTimeMillis() - Nukkit.START_TIME; - - sender.sendMessage(TextFormat.GOLD + "Uptime: " + formatUptime(time)); - - TextFormat tpsColor = TextFormat.GREEN; - float tps = server.getTicksPerSecond(); - if (tps < 17) { - tpsColor = TextFormat.GOLD; - } else if (tps < 12) { - tpsColor = TextFormat.RED; - } - - sender.sendMessage(TextFormat.GOLD + "Current TPS: " + tpsColor + NukkitMath.round(tps, 2)); - - sender.sendMessage(TextFormat.GOLD + "Load: " + tpsColor + server.getTickUsage() + '%'); - - sender.sendMessage(TextFormat.GOLD + "Network upload: " + TextFormat.GREEN + NukkitMath.round((server.getNetwork().getUpload() / 1024 * 1000), 2) + " kB/s"); - - sender.sendMessage(TextFormat.GOLD + "Network download: " + TextFormat.GREEN + NukkitMath.round((server.getNetwork().getDownload() / 1024 * 1000), 2) + " kB/s"); - - sender.sendMessage(TextFormat.GOLD + "Thread count: " + TextFormat.GREEN + Thread.getAllStackTraces().size()); - - - Runtime runtime = Runtime.getRuntime(); - double totalMB = NukkitMath.round(((double) runtime.totalMemory()) / 1024 / 1024, 2); - double usedMB = NukkitMath.round((double) (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024, 2); - double maxMB = NukkitMath.round(((double) runtime.maxMemory()) / 1024 / 1024, 2); - double usage = usedMB / maxMB * 100; - TextFormat usageColor = TextFormat.GREEN; - - if (usage > 85) { - usageColor = TextFormat.GOLD; - } - - sender.sendMessage(TextFormat.GOLD + "Used memory: " + usageColor + usedMB + " MB (" + NukkitMath.round(usage, 2) + "%)"); - - sender.sendMessage(TextFormat.GOLD + "Total memory: " + TextFormat.RED + totalMB + " MB"); - - sender.sendMessage(TextFormat.GOLD + "Maximum VM memory: " + TextFormat.RED + maxMB + " MB"); - - sender.sendMessage(TextFormat.GOLD + "Available processors: " + TextFormat.GREEN + runtime.availableProcessors()); - - - int players = server.getOnlinePlayersCount(); - - TextFormat playerColor = TextFormat.GREEN; - if (((float) players / (float) server.getMaxPlayers()) > 0.85) { - playerColor = TextFormat.GOLD; - } - - sender.sendMessage(TextFormat.GOLD + "Players: " + playerColor + players + TextFormat.GREEN + " online, " + - TextFormat.RED + server.getMaxPlayers() + TextFormat.GREEN + " max"); - - for (Level level : server.getLevels().values()) { - sender.sendMessage( - TextFormat.GOLD + "World \"" + level.getFolderName() + '"' + (!Objects.equals(level.getFolderName(), level.getName()) ? " (" + level.getName() + ')' : "") + ": " + - TextFormat.RED + level.getChunks().size() + TextFormat.GREEN + " chunks, " + - TextFormat.RED + level.getEntities().length + TextFormat.GREEN + " entities, " + - TextFormat.RED + level.getBlockEntities().size() + TextFormat.GREEN + " block entities." + - " Time " + ((level.getTickRate() > 1 || level.getTickRateTime() > 40) ? TextFormat.RED : TextFormat.YELLOW) + NukkitMath.round(level.getTickRateTime(), 2) + "ms" + - (level.getTickRate() > 1 ? " (tick rate " + level.getTickRate() + ')' : "") - ); - } - - return true; - } - - public static String formatUptime(long uptime) { - long days = TimeUnit.MILLISECONDS.toDays(uptime); - uptime -= TimeUnit.DAYS.toMillis(days); - long hours = TimeUnit.MILLISECONDS.toHours(uptime); - uptime -= TimeUnit.HOURS.toMillis(hours); - long minutes = TimeUnit.MILLISECONDS.toMinutes(uptime); - uptime -= TimeUnit.MINUTES.toMillis(minutes); - long seconds = TimeUnit.MILLISECONDS.toSeconds(uptime); - return String.format(UPTIME_FORMAT, days, hours, minutes, seconds); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/defaults/StopCommand.java b/src/main/java/cn/nukkit/command/defaults/StopCommand.java deleted file mode 100644 index e268883b5..000000000 --- a/src/main/java/cn/nukkit/command/defaults/StopCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Server; -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class StopCommand extends VanillaCommand { - - public StopCommand(String name) { - super(name, "%nukkit.command.stop.description", "%commands.stop.usage"); - this.setPermission("nukkit.command.stop"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (sender instanceof Player && !(Server.getInstance().stopInGame)) { - sender.sendMessage("\u00A7cCan't use this command in game"); - return true; - } - - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.stop.start")); - - sender.getServer().shutdown(); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/SummonCommand.java b/src/main/java/cn/nukkit/command/defaults/SummonCommand.java deleted file mode 100644 index 428149a40..000000000 --- a/src/main/java/cn/nukkit/command/defaults/SummonCommand.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.entity.Entity; -import cn.nukkit.level.Position; - -public class SummonCommand extends Command { - - public SummonCommand(String name) { - super(name, "%nukkit.command.summon.description", "%nukkit.command.summon.usage"); - this.setPermission("nukkit.command.summon"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("entityType", false, CommandParameter.ENUM_TYPE_ENTITY_LIST), - new CommandParameter("player", CommandParamType.TARGET, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0 || (args.length == 1 && !(sender instanceof Player))) { - return false; - } - - // Convert Minecraft format to the format what Nukkit uses - String mob = Character.toUpperCase(args[0].charAt(0)) + args[0].substring(1); - int max = mob.length() - 1; - for (int x = 2; x < max; x++) { - if (mob.charAt(x) == '_') { - mob = mob.substring(0, x) + Character.toUpperCase(mob.charAt(x + 1)) + mob.substring(x + 2); - } - } - - Player playerThatSpawns; - - if (args.length == 2) { - playerThatSpawns = Server.getInstance().getPlayer(args[1].replace("@s", sender.getName())); - } else { - playerThatSpawns = (Player) sender; - } - - if (playerThatSpawns != null) { - Position pos = playerThatSpawns.getPosition().floor().add(0.5, 0, 0.5); - Entity ent; - if ((ent = Entity.createEntity(mob, pos)) != null) { - ent.spawnToAll(); - sender.sendMessage("\u00A76Spawned " + mob + " to " + playerThatSpawns.getName()); - } else { - sender.sendMessage("\u00A7cUnable to spawn " + mob); - } - } else { - sender.sendMessage("\u00A7cUnknown player " + (args.length == 2 ? args[1] : sender.getName())); - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/TeleportCommand.java b/src/main/java/cn/nukkit/command/defaults/TeleportCommand.java deleted file mode 100644 index 9d0c320e8..000000000 --- a/src/main/java/cn/nukkit/command/defaults/TeleportCommand.java +++ /dev/null @@ -1,125 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.event.player.PlayerTeleportEvent; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Location; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/12 by Pub4Game and milkice. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class TeleportCommand extends VanillaCommand { - - public TeleportCommand(String name) { - super(name, "%nukkit.command.tp.description", "%commands.tp.usage"); - this.setPermission("nukkit.command.teleport"); - this.commandParameters.clear(); - this.commandParameters.put("->Player", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - }); - this.commandParameters.put("Player->Player", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("target", CommandParamType.TARGET, false), - }); - this.commandParameters.put("Player->Pos", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("blockPos", CommandParamType.POSITION, false), - }); - this.commandParameters.put("->Pos", new CommandParameter[]{ - new CommandParameter("blockPos", CommandParamType.POSITION, false), - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - if (args.length < 1 || args.length > 6) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - CommandSender target; - CommandSender origin = sender; - if (args.length == 1 || args.length == 3) { - if (sender instanceof Player) { - target = sender; - } else { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - return true; - } - if (args.length == 1) { - target = sender.getServer().getPlayer(args[0].replace("@s", sender.getName())); - if (target == null) { - sender.sendMessage(TextFormat.RED + "Can't find player " + args[0]); - return true; - } - } - } else { - target = sender.getServer().getPlayer(args[0].replace("@s", sender.getName())); - if (target == null) { - sender.sendMessage(TextFormat.RED + "Can't find player " + args[0]); - return true; - } - if (args.length == 2) { - origin = target; - target = sender.getServer().getPlayer(args[1].replace("@s", sender.getName())); - if (target == null) { - sender.sendMessage(TextFormat.RED + "Can't find player " + args[1]); - return true; - } - } - } - if (args.length < 3) { - ((Player) origin).teleport((Player) target, PlayerTeleportEvent.TeleportCause.COMMAND); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.tp.success", origin.getName(), target.getName())); - return true; - } else if (((Player) target).getLevel() != null) { - int pos; - if (args.length == 4 || args.length == 6) { - pos = 1; - } else { - pos = 0; - } - double x; - double y; - double z; - double yaw; - double pitch; - try { - x = Double.parseDouble(args[pos++].replace("~", "" + ((Player) target).x)); - y = Double.parseDouble(args[pos++].replace("~", "" + ((Player) target).y)); - z = Double.parseDouble(args[pos++].replace("~", "" + ((Player) target).z)); - yaw = ((Player) target).getYaw(); - pitch = ((Player) target).getPitch(); - } catch (NumberFormatException e1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - - if (x < -30000000) x = -30000000; - if (x > 30000000) x = 30000000; - if (y < -30000000) y = -30000000; - if (y > 30000000) y = 30000000; - if (z < -30000000) z = -30000000; - if (z > 30000000) z = 30000000; - - if (args.length == 6 || (args.length == 5 && pos == 3)) { - yaw = Integer.parseInt(args[pos++]); - pitch = Integer.parseInt(args[pos]); - } - ((Player) target).teleport(new Location(x, y, z, yaw, pitch, ((Player) target).getLevel()), PlayerTeleportEvent.TeleportCause.COMMAND); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.tp.success.coordinates", target.getName(), String.valueOf(NukkitMath.round(x, 2)), String.valueOf(NukkitMath.round(y, 2)), String.valueOf(NukkitMath.round(z, 2)))); - return true; - } - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/TellCommand.java b/src/main/java/cn/nukkit/command/defaults/TellCommand.java deleted file mode 100644 index 18715300f..000000000 --- a/src/main/java/cn/nukkit/command/defaults/TellCommand.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -import java.util.Objects; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class TellCommand extends VanillaCommand { - - public TellCommand(String name) { - super(name, "%nukkit.command.tell.description", "%commands.message.usage", new String[]{"w", "msg"}); - this.setPermission("nukkit.command.tell"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("message", CommandParamType.TEXT, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length < 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - - String name = args[0].toLowerCase().replace("@s", sender.getName()); - - Player player = sender.getServer().getPlayer(name); - if (player == null) { - sender.sendMessage(new TranslationContainer("commands.generic.player.notFound")); - return true; - } - - if (Objects.equals(player, sender)) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.message.sameTarget")); - return true; - } - - StringBuilder msg = new StringBuilder(); - for (int i = 1; i < args.length; i++) { - msg.append(args[i]).append(' '); - } - if (msg.length() > 512) { - sender.sendMessage(TextFormat.RED + "The message is too long"); - return true; - } else if (msg.length() > 0) { - msg = new StringBuilder(msg.substring(0, msg.length() - 1)); - } - - String displayName = (sender instanceof Player ? ((Player) sender).getDisplayName() : sender.getName()); - - sender.sendMessage('[' + sender.getName() + " -> " + player.getDisplayName() + "] " + msg); - player.sendMessage('[' + displayName + " -> " + player.getName() + "] " + msg); - if (sender instanceof Player) { - sender.getServer().getLogger().info('[' + sender.getName() + " -> " + player.getDisplayName() + "] " + msg); - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/TimeCommand.java b/src/main/java/cn/nukkit/command/defaults/TimeCommand.java deleted file mode 100644 index 225990dd4..000000000 --- a/src/main/java/cn/nukkit/command/defaults/TimeCommand.java +++ /dev/null @@ -1,154 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Level; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/11 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class TimeCommand extends VanillaCommand { - - public TimeCommand(String name) { - super(name, "%nukkit.command.time.description", "%nukkit.command.time.usage"); - this.setPermission("nukkit.command.time.add;nukkit.command.time.set;nukkit.command.time.start;nukkit.command.time.stop"); - this.commandParameters.clear(); - this.commandParameters.put("1arg", new CommandParameter[]{ - new CommandParameter("start|stop", CommandParamType.STRING, false) - }); - this.commandParameters.put("2args", new CommandParameter[]{ - new CommandParameter("add|set", CommandParamType.STRING, false), - new CommandParameter("value", CommandParamType.INT, false) - }); - this.commandParameters.put("2args_", new CommandParameter[]{ - new CommandParameter("add|set", CommandParamType.STRING, false), - new CommandParameter("value", CommandParamType.STRING, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (args.length < 1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - if ("start".equals(args[0])) { - if (!sender.hasPermission("nukkit.command.time.start")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - - return true; - } - for (Level level : sender.getServer().getLevels().values()) { - level.checkTime(); - level.startTime(); - level.checkTime(); - } - Command.broadcastCommandMessage(sender, "Restarted the time"); - return true; - } else if ("stop".equals(args[0])) { - if (!sender.hasPermission("nukkit.command.time.stop")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - - return true; - } - for (Level level : sender.getServer().getLevels().values()) { - level.checkTime(); - level.stopTime(); - level.checkTime(); - } - Command.broadcastCommandMessage(sender, "Stopped the time"); - return true; - } else if ("query".equals(args[0])) { - if (!sender.hasPermission("nukkit.command.time.query")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - - return true; - } - Level level; - if (sender instanceof Player) { - level = ((Player) sender).getLevel(); - } else { - level = sender.getServer().getDefaultLevel(); - } - sender.sendMessage(new TranslationContainer("commands.time.query.gametime", String.valueOf(level.getTime()))); - return true; - } - - - if (args.length < 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - - return false; - } - - if ("set".equals(args[0])) { - if (!sender.hasPermission("nukkit.command.time.set")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - - return true; - } - - int value; - if ("day".equals(args[1])) { - value = Level.TIME_DAY; - } else if ("night".equals(args[1])) { - value = Level.TIME_NIGHT; - } else if ("midnight".equals(args[1])) { - value = Level.TIME_MIDNIGHT; - } else if ("noon".equals(args[1])) { - value = Level.TIME_NOON; - } else if ("sunrise".equals(args[1])) { - value = Level.TIME_SUNRISE; - } else if ("sunset".equals(args[1])) { - value = Level.TIME_SUNSET; - } else { - try { - value = Math.max(0, Integer.parseInt(args[1])); - } catch (Exception e) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - } - - for (Level level : sender.getServer().getLevels().values()) { - level.checkTime(); - level.setTime(value); - level.checkTime(); - } - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.time.set", String.valueOf(value))); - } else if ("add".equals(args[0])) { - if (!sender.hasPermission("nukkit.command.time.add")) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - - return true; - } - - int value; - try { - value = Math.max(0, Integer.parseInt(args[1])); - } catch (Exception e) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - - for (Level level : sender.getServer().getLevels().values()) { - level.checkTime(); - level.setTime(level.getTime() + value); - level.checkTime(); - } - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.time.added", String.valueOf(value))); - } else { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/TimingsCommand.java b/src/main/java/cn/nukkit/command/defaults/TimingsCommand.java deleted file mode 100644 index 27919cb69..000000000 --- a/src/main/java/cn/nukkit/command/defaults/TimingsCommand.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import co.aikar.timings.Timings; -import co.aikar.timings.TimingsExport; - -/** - * @author fromgate - * @author Pub4Game - */ -public class TimingsCommand extends VanillaCommand { - - public TimingsCommand(String name) { - super(name, "%nukkit.command.timings.description", "%nukkit.command.timings.usage"); - this.setPermission("nukkit.command.timings"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("on|off|paste", CommandParameter.ARG_TYPE_STRING, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length != 1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", usageMessage)); - return true; - } - - String mode = args[0].toLowerCase(); - - if (mode.equals("on")) { - Timings.setTimingsEnabled(true); - Timings.reset(); - sender.sendMessage(new TranslationContainer("nukkit.command.timings.enable")); - return true; - } else if (mode.equals("off")) { - Timings.setTimingsEnabled(false); - sender.sendMessage(new TranslationContainer("nukkit.command.timings.disable")); - return true; - } - - if (!Timings.isTimingsEnabled()) { - sender.sendMessage(new TranslationContainer("nukkit.command.timings.timingsDisabled")); - return true; - } - - switch (mode) { - case "verbon": - sender.sendMessage(new TranslationContainer("nukkit.command.timings.verboseEnable")); - Timings.setVerboseEnabled(true); - break; - case "verboff": - sender.sendMessage(new TranslationContainer("nukkit.command.timings.verboseDisable")); - Timings.setVerboseEnabled(false); - break; - case "reset": - Timings.reset(); - sender.sendMessage(new TranslationContainer("nukkit.command.timings.reset")); - break; - case "report": - case "paste": - TimingsExport.reportTimings(sender); - break; - } - return true; - } -} - diff --git a/src/main/java/cn/nukkit/command/defaults/TitleCommand.java b/src/main/java/cn/nukkit/command/defaults/TitleCommand.java deleted file mode 100644 index ea208882b..000000000 --- a/src/main/java/cn/nukkit/command/defaults/TitleCommand.java +++ /dev/null @@ -1,124 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * @author Tee7even - */ -public class TitleCommand extends VanillaCommand { - - public TitleCommand(String name) { - super(name, "%nukkit.command.title.description", "%nukkit.command.title.usage"); - this.setPermission("nukkit.command.title"); - - this.commandParameters.clear(); - this.commandParameters.put("clear", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("clear", new String[]{"clear"}) - }); - this.commandParameters.put("reset", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("reset", new String[]{"reset"}) - }); - this.commandParameters.put("title", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("title", new String[]{"title"}), - new CommandParameter("titleText", CommandParamType.STRING, false) - }); - this.commandParameters.put("subtitle", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("subtitle", new String[]{"subtitle"}), - new CommandParameter("titleText", CommandParamType.STRING, false) - }); - this.commandParameters.put("actionbar", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("actionbar", new String[]{"actionbar"}), - new CommandParameter("titleText", CommandParamType.STRING, false) - }); - this.commandParameters.put("times", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("times", new String[]{"times"}), - new CommandParameter("fadeIn", CommandParamType.INT, false), - new CommandParameter("stay", CommandParamType.INT, false), - new CommandParameter("fadeOut", CommandParamType.INT, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - if (args.length < 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - - Player player = Server.getInstance().getPlayer(args[0]); - if (player == null) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - return true; - } - - if (args.length == 2) { - switch (args[1].toLowerCase()) { - case "clear": - player.clearTitle(); - sender.sendMessage(new TranslationContainer("nukkit.command.title.clear", player.getName())); - break; - case "reset": - player.resetTitleSettings(); - sender.sendMessage(new TranslationContainer("nukkit.command.title.reset", player.getName())); - break; - default: - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - } else if (args.length == 3) { - switch (args[1].toLowerCase()) { - case "title": - player.sendTitle(args[2]); - sender.sendMessage(new TranslationContainer("nukkit.command.title.title", - TextFormat.clean(args[2]), player.getName())); - break; - case "subtitle": - player.setSubtitle(args[2]); - sender.sendMessage(new TranslationContainer("nukkit.command.title.subtitle", TextFormat.clean(args[2]), player.getName())); - break; - case "actionbar": - player.sendActionBar(args[2]); - sender.sendMessage(new TranslationContainer("nukkit.command.title.actionbar", TextFormat.clean(args[2]), player.getName())); - break; - default: - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - } else if (args.length == 5) { - if (args[1].toLowerCase().equals("times")) { - try { - /*player.setTitleAnimationTimes(Integer.valueOf(args[2]), //fadeIn - Integer.valueOf(args[3]), //stay - Integer.valueOf(args[4])); //fadeOut*/ - sender.sendMessage(new TranslationContainer("nukkit.command.title.times.success", - args[2], args[3], args[4], player.getName())); - } catch (NumberFormatException exception) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%nukkit.command.title.times.fail")); - } - } else { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - } else { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return false; - } - - return true; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/defaults/TransferServerCommand.java b/src/main/java/cn/nukkit/command/defaults/TransferServerCommand.java deleted file mode 100644 index 1758a293f..000000000 --- a/src/main/java/cn/nukkit/command/defaults/TransferServerCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.command.defaults; - - -import cn.nukkit.Player; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; - -/** - * @author akkz - */ -public class TransferServerCommand extends VanillaCommand { - - public TransferServerCommand(String name) { - super(name, "%nukkit.command.transferserver.description", "%commands.transferserver.usage"); - this.setPermission("nukkit.command.transferserver"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("serverAddress", CommandParamType.STRING, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (!(sender instanceof Player)) { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - return false; - } - - if (args.length == 0 || args.length > 2) { - sender.sendMessage(new TranslationContainer("commands.transferserver.usage", this.usageMessage)); - return true; - } - - int port = args.length == 2 ? Integer.parseInt(args[1]) : 19132; - ((Player) sender).transfer(args[0], port); - - return true; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/VanillaCommand.java b/src/main/java/cn/nukkit/command/defaults/VanillaCommand.java deleted file mode 100644 index ee7011726..000000000 --- a/src/main/java/cn/nukkit/command/defaults/VanillaCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.Command; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class VanillaCommand extends Command { - - public VanillaCommand(String name) { - super(name); - } - - public VanillaCommand(String name, String description) { - super(name, description); - } - - public VanillaCommand(String name, String description, String usageMessage) { - super(name, description, usageMessage); - } - - public VanillaCommand(String name, String description, String usageMessage, String[] aliases) { - super(name, description, usageMessage, aliases); - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/VersionCommand.java b/src/main/java/cn/nukkit/command/defaults/VersionCommand.java deleted file mode 100644 index b289865ed..000000000 --- a/src/main/java/cn/nukkit/command/defaults/VersionCommand.java +++ /dev/null @@ -1,112 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Nukkit; -import cn.nukkit.command.CommandMap; -import cn.nukkit.command.CommandSender; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.plugin.PluginDescription; -import cn.nukkit.utils.TextFormat; -import com.google.gson.JsonParser; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; -import java.util.List; -import java.util.concurrent.CompletableFuture; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class VersionCommand extends VanillaCommand { - - public VersionCommand(String name) { - super(name, - "%nukkit.command.version.description", - "%nukkit.command.version.usage", - new String[]{"ver", "about"} - ); - this.setPermission("nukkit.command.version"); - this.commandParameters.clear(); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - /*if (!this.testPermission(sender)) { - return true; - }*/ - if (args.length == 0 || !sender.hasPermission("nukkit.command.version.plugins")) { - sender.sendMessage("§e###############################################\n§cNukkit §aPetteriM1 Edition\n§6Build: §b" + Nukkit.getBranch() + '/' + Nukkit.VERSION.substring(4) + "\n§6Multiversion: §bUp to version " + ProtocolInfo.MINECRAFT_VERSION_NETWORK + "\n§dhttps://github.com/PetteriM1/NukkitPetteriM1Edition\n§e###############################################"); - - if (sender.isOp()) { - CompletableFuture.runAsync(() -> { - try { - URLConnection request = new URL(Nukkit.BRANCH).openConnection(); - request.connect(); - InputStreamReader content = new InputStreamReader((InputStream) request.getContent()); - String latest = "git-" + new JsonParser().parse(content).getAsJsonObject().get("sha").getAsString().substring(0, 7); - content.close(); - - if (Nukkit.getBranch().equals("master")) { - if (!sender.getServer().getNukkitVersion().equals(latest) && !sender.getServer().getNukkitVersion().equals("git-null")) { - sender.sendMessage("\u00A7c[Update] \u00A7eThere is a new build of Nukkit PetteriM1 Edition available! Current: " + sender.getServer().getNukkitVersion() + " Latest: " + latest); - } else { - sender.sendMessage("\u00A7aYou are running the latest version."); - } - } - } catch (Exception ignore) { - } - }); - } - } else { - StringBuilder pluginName = new StringBuilder(); - for (String arg : args) pluginName.append(arg).append(' '); - pluginName = new StringBuilder(pluginName.toString().trim()); - final boolean[] found = {false}; - final Plugin[] exactPlugin = {sender.getServer().getPluginManager().getPlugin(pluginName.toString())}; - - if (exactPlugin[0] == null) { - pluginName = new StringBuilder(pluginName.toString().toLowerCase()); - final String finalPluginName = pluginName.toString(); - sender.getServer().getPluginManager().getPlugins().forEach((s, p) -> { - if (s.toLowerCase().contains(finalPluginName)) { - exactPlugin[0] = p; - found[0] = true; - } - }); - } else { - found[0] = true; - } - - if (found[0]) { - PluginDescription desc = exactPlugin[0].getDescription(); - sender.sendMessage(TextFormat.DARK_GREEN + desc.getName() + TextFormat.WHITE + " version " + TextFormat.DARK_GREEN + desc.getVersion()); - if (desc.getDescription() != null) { - sender.sendMessage(desc.getDescription()); - } - if (desc.getWebsite() != null) { - sender.sendMessage("Website: " + desc.getWebsite()); - } - List authors = desc.getAuthors(); - final String[] authorsString = {""}; - authors.forEach((s) -> authorsString[0] += s); - if (authors.size() == 1) { - sender.sendMessage("Author: " + authorsString[0]); - } else if (authors.size() >= 2) { - sender.sendMessage("Authors: " + authorsString[0]); - } - } else { - sender.sendMessage(new TranslationContainer("nukkit.command.version.noSuchPlugin")); - } - } - return true; - } - - @Override - public boolean unregister(CommandMap commandMap) { - return false; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/WeatherCommand.java b/src/main/java/cn/nukkit/command/defaults/WeatherCommand.java deleted file mode 100644 index b0f9151ba..000000000 --- a/src/main/java/cn/nukkit/command/defaults/WeatherCommand.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Level; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class WeatherCommand extends VanillaCommand { - - public WeatherCommand(String name) { - super(name, "%nukkit.command.weather.description", "%commands.weather.usage"); - this.setPermission("nukkit.command.weather"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("clear|rain|thunder", CommandParamType.STRING, false), - new CommandParameter("duration in seconds", CommandParamType.INT, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - if (args.length == 0 || args.length > 2) { - sender.sendMessage(new TranslationContainer("commands.weather.usage", this.usageMessage)); - return false; - } - - String weather = args[0]; - Level level; - int seconds; - if (args.length > 1) { - try { - seconds = Integer.parseInt(args[1]); - } catch (Exception e) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - } else { - seconds = 12000; - } - - if (sender instanceof Player) { - level = ((Player) sender).getLevel(); - } else { - level = sender.getServer().getDefaultLevel(); - } - - switch (weather) { - case "clear": - level.setRaining(false); - level.setThundering(false); - level.setRainTime(seconds * 20); - level.setThunderTime(seconds * 20); - Command.broadcastCommandMessage(sender, - new TranslationContainer("commands.weather.clear")); - return true; - case "rain": - level.setRaining(true); - level.setRainTime(seconds * 20); - Command.broadcastCommandMessage(sender, - new TranslationContainer("commands.weather.rain")); - return true; - case "thunder": - level.setThundering(true); - level.setRainTime(seconds * 20); - level.setThunderTime(seconds * 20); - Command.broadcastCommandMessage(sender, - new TranslationContainer("commands.weather.thunder")); - return true; - default: - sender.sendMessage(new TranslationContainer("commands.weather.usage", this.usageMessage)); - return false; - } - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/WhitelistCommand.java b/src/main/java/cn/nukkit/command/defaults/WhitelistCommand.java deleted file mode 100644 index 8b288edd8..000000000 --- a/src/main/java/cn/nukkit/command/defaults/WhitelistCommand.java +++ /dev/null @@ -1,117 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created on 2015/11/12 by xtypr. - * Package cn.nukkit.command.defaults in project Nukkit . - */ -public class WhitelistCommand extends VanillaCommand { - - public WhitelistCommand(String name) { - super(name, "%nukkit.command.whitelist.description", "%commands.whitelist.usage"); - this.setPermission( - "nukkit.command.whitelist.reload;" + - "nukkit.command.whitelist.enable;" + - "nukkit.command.whitelist.disable;" + - "nukkit.command.whitelist.list;" + - "nukkit.command.whitelist.add;" + - "nukkit.command.whitelist.remove" - ); - this.commandParameters.clear(); - this.commandParameters.put("1arg", new CommandParameter[]{ - new CommandParameter("on|off|list|reload", CommandParamType.STRING, false) - }); - this.commandParameters.put("2args", new CommandParameter[]{ - new CommandParameter("add|remove", CommandParamType.STRING, false), - new CommandParameter("player", CommandParamType.TARGET, false) - }); - } - - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0 || args.length > 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - - if (args.length == 1) { - if (badPerm(sender, args[0].toLowerCase())) { - return false; - } - switch (args[0].toLowerCase()) { - case "reload": - sender.getServer().reloadWhitelist(); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.reloaded")); - return true; - case "on": - sender.getServer().setPropertyBoolean("white-list", true); - sender.getServer().whitelistEnabled = true; - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.enabled")); - return true; - case "off": - sender.getServer().setPropertyBoolean("white-list", false); - sender.getServer().whitelistEnabled = false; - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.disabled")); - return true; - case "list": - StringBuilder result = new StringBuilder(); - int count = 0; - for (String player : sender.getServer().getWhitelist().getAll().keySet()) { - result.append(player).append(", "); - ++count; - } - sender.sendMessage(new TranslationContainer("commands.whitelist.list", String.valueOf(count), String.valueOf(count))); - sender.sendMessage(result.length() > 0 ? result.substring(0, result.length() - 2) : ""); - - return true; - - case "add": - sender.sendMessage(new TranslationContainer("commands.generic.usage", "%commands.whitelist.add.usage")); - return true; - - case "remove": - sender.sendMessage(new TranslationContainer("commands.generic.usage", "%commands.whitelist.remove.usage")); - return true; - } - } else { - if (badPerm(sender, args[0].toLowerCase())) { - return false; - } - switch (args[0].toLowerCase()) { - case "add": - sender.getServer().getOfflinePlayer(args[1]).setWhitelisted(true); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.add.success", args[1])); - - return true; - case "remove": - sender.getServer().getOfflinePlayer(args[1]).setWhitelisted(false); - Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.remove.success", args[1])); - - return true; - } - } - - return true; - } - - private static boolean badPerm(CommandSender sender, String perm) { - if (!sender.hasPermission("nukkit.command.whitelist." + perm)) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.permission")); - - return true; - } - - return false; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/WorldCommand.java b/src/main/java/cn/nukkit/command/defaults/WorldCommand.java deleted file mode 100644 index a6e7918eb..000000000 --- a/src/main/java/cn/nukkit/command/defaults/WorldCommand.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.event.player.PlayerTeleportEvent; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.Level; - -public class WorldCommand extends Command { - - public WorldCommand(String name) { - super(name, "%nukkit.command.world.description", "%nukkit.command.world.usage"); - this.setPermission("nukkit.command.world"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("world", CommandParamType.STRING, false) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - if (args.length == 0 && !Server.getInstance().suomiCraftPEMode()) { - sender.sendMessage("Available worlds:"); - for (Level level : Server.getInstance().getLevels().values()) { - sender.sendMessage(level.getName()); - } - return true; - } - - if (args.length == 2) { - if (!sender.hasPermission("nukkit.command.world.others")) { - return false; - } - - if (Server.getInstance().getPlayer(args[1].replace("@s", sender.getName())) == null) { - sender.sendMessage("\u00A7cUnknown player"); - return true; - } - if (Server.getInstance().getLevelByName(args[0]) == null) { - sender.sendMessage("\u00A7cUnknown level"); - return true; - } - Server.getInstance().getPlayer(args[1].replace("@s", sender.getName())).teleport(Server.getInstance().getLevelByName(args[0]).getSafeSpawn(), PlayerTeleportEvent.TeleportCause.COMMAND); - return true; - } - - if (!(sender instanceof Player)) { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - return true; - } - - if (args.length == 1) { - if (Server.getInstance().getLevelByName(args[0]) != null) { - ((Player) sender).teleport(Server.getInstance().getLevelByName(args[0]).getSafeSpawn(), PlayerTeleportEvent.TeleportCause.COMMAND); - } else { - sender.sendMessage("\u00A7cUnknown level"); - } - return true; - } - - return false; - } -} diff --git a/src/main/java/cn/nukkit/command/defaults/XpCommand.java b/src/main/java/cn/nukkit/command/defaults/XpCommand.java deleted file mode 100644 index c66a8bf93..000000000 --- a/src/main/java/cn/nukkit/command/defaults/XpCommand.java +++ /dev/null @@ -1,104 +0,0 @@ -package cn.nukkit.command.defaults; - -import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.data.CommandParamType; -import cn.nukkit.command.data.CommandParameter; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.utils.TextFormat; - -/** - * Created by Snake1999 on 2016/1/22. - * Package cn.nukkit.command.defaults in project nukkit. - */ -public class XpCommand extends Command { - - public XpCommand(String name) { - super(name, "%nukkit.command.xp.description", "%commands.xp.usage"); - this.setPermission("nukkit.command.xp"); - this.commandParameters.clear(); - this.commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("amount|level", CommandParamType.INT, false), - new CommandParameter("player", CommandParamType.TARGET, true) - }); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!this.testPermission(sender)) { - return true; - } - - // "/xp [player]" for adding exp - // "/xp L [player]" for adding exp level - String amountString; - String playerName; - Player player; - if (!(sender instanceof Player)) { - if (args.length != 2) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - amountString = args[0]; - playerName = args[1]; - player = sender.getServer().getPlayer(playerName); - } else { - if (args.length == 1) { - amountString = args[0]; - player = (Player) sender; - } else if (args.length == 2) { - amountString = args[0]; - playerName = args[1].replace("@s", sender.getName()); - player = sender.getServer().getPlayer(playerName); - } else { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - } - - if (player == null) { - sender.sendMessage(new TranslationContainer(TextFormat.RED + "%commands.generic.player.notFound")); - return true; - } - - int amount; - boolean isLevel = false; - if (amountString.endsWith("l") || amountString.endsWith("L")) { - amountString = amountString.substring(0, amountString.length() - 1); - isLevel = true; - } - - try { - amount = Integer.parseInt(amountString); - } catch (NumberFormatException e1) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - - if (isLevel) { - int newLevel = player.getExperienceLevel(); - newLevel += amount; - if (newLevel > 24791) newLevel = 24791; - if (newLevel < 0) { - player.setExperience(0, 0); - } else { - player.setExperience(player.getExperience(), newLevel); - } - if (amount > 0) { - sender.sendMessage(new TranslationContainer("commands.xp.success.levels", String.valueOf(amount), player.getName())); - } else { - sender.sendMessage(new TranslationContainer("commands.xp.success.levels.minus", String.valueOf(-amount), player.getName())); - } - return true; - } else { - if (amount < 0) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - return true; - } - player.addExperience(amount); - sender.sendMessage(new TranslationContainer("commands.xp.success", String.valueOf(amount), player.getName())); - return true; - } - } -} diff --git a/src/main/java/cn/nukkit/command/simple/Arguments.java b/src/main/java/cn/nukkit/command/simple/Arguments.java deleted file mode 100644 index 11b7045b1..000000000 --- a/src/main/java/cn/nukkit/command/simple/Arguments.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.command.simple; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author Tee7even - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Arguments { - int min() default 0; - - int max() default 0; -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/simple/Command.java b/src/main/java/cn/nukkit/command/simple/Command.java deleted file mode 100644 index 379f59158..000000000 --- a/src/main/java/cn/nukkit/command/simple/Command.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.command.simple; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author Tee7even - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Command { - String name(); - - String description() default ""; - - String usageMessage() default ""; - - String[] aliases() default {}; -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/command/simple/CommandParameters.java b/src/main/java/cn/nukkit/command/simple/CommandParameters.java deleted file mode 100644 index 8dd0fbe68..000000000 --- a/src/main/java/cn/nukkit/command/simple/CommandParameters.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.command.simple; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author nilsbrychzy - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface CommandParameters { - Parameters[] parameters() default {}; -} diff --git a/src/main/java/cn/nukkit/command/simple/CommandPermission.java b/src/main/java/cn/nukkit/command/simple/CommandPermission.java deleted file mode 100644 index 175db0388..000000000 --- a/src/main/java/cn/nukkit/command/simple/CommandPermission.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.command.simple; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author Tee7even - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface CommandPermission { - String value(); -} diff --git a/src/main/java/cn/nukkit/command/simple/ForbidConsole.java b/src/main/java/cn/nukkit/command/simple/ForbidConsole.java deleted file mode 100644 index ac676f395..000000000 --- a/src/main/java/cn/nukkit/command/simple/ForbidConsole.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.command.simple; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author Tee7even - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface ForbidConsole { -} diff --git a/src/main/java/cn/nukkit/command/simple/Parameter.java b/src/main/java/cn/nukkit/command/simple/Parameter.java deleted file mode 100644 index 940daf77b..000000000 --- a/src/main/java/cn/nukkit/command/simple/Parameter.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.command.simple; - -import cn.nukkit.command.data.CommandParamType; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author nilsbrychzy - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Parameter { - String name(); - - CommandParamType type() default CommandParamType.RAWTEXT; - - boolean optional() default false; -} diff --git a/src/main/java/cn/nukkit/command/simple/Parameters.java b/src/main/java/cn/nukkit/command/simple/Parameters.java deleted file mode 100644 index 9d54d9746..000000000 --- a/src/main/java/cn/nukkit/command/simple/Parameters.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.command.simple; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author nilsbrychzy - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Parameters { - String name(); - Parameter[] parameters(); -} diff --git a/src/main/java/cn/nukkit/command/simple/SimpleCommand.java b/src/main/java/cn/nukkit/command/simple/SimpleCommand.java deleted file mode 100644 index 6b63f78ca..000000000 --- a/src/main/java/cn/nukkit/command/simple/SimpleCommand.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.nukkit.command.simple; - -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.ConsoleCommandSender; -import cn.nukkit.lang.TranslationContainer; - -import java.lang.reflect.Method; - -/** - * @author Tee7even - */ -public class SimpleCommand extends Command { - private Object object; - private Method method; - private boolean forbidConsole; - private int maxArgs; - private int minArgs; - - public SimpleCommand(Object object, Method method, String name, String description, String usageMessage, String[] aliases) { - super(name, description, usageMessage, aliases); - this.object = object; - this.method = method; - } - - public void setForbidConsole(boolean forbidConsole) { - this.forbidConsole = forbidConsole; - } - - public void setMaxArgs(int maxArgs) { - this.maxArgs = maxArgs; - } - - public void setMinArgs(int minArgs) { - this.minArgs = minArgs; - } - - public void sendUsageMessage(CommandSender sender) { - if (!this.usageMessage.isEmpty()) { - sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); - } - } - - public void sendInGameMessage(CommandSender sender) { - sender.sendMessage(new TranslationContainer("commands.generic.ingame")); - } - - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (this.forbidConsole && sender instanceof ConsoleCommandSender) { - this.sendInGameMessage(sender); - return false; - } else if (!this.testPermission(sender)) { - return false; - } else if (this.maxArgs != 0 && args.length > this.maxArgs) { - this.sendUsageMessage(sender); - return false; - } else if (this.minArgs != 0 && args.length < this.minArgs) { - this.sendUsageMessage(sender); - return false; - } - - boolean success = false; - - try { - success = (Boolean) this.method.invoke(this.object, sender, commandLabel, args); - } catch (Exception exception) { - Server.getInstance().getLogger().logException(exception); - } - - if (!success) { - this.sendUsageMessage(sender); - } - - return success; - } -} diff --git a/src/main/java/cn/nukkit/console/NukkitConsole.java b/src/main/java/cn/nukkit/console/NukkitConsole.java deleted file mode 100644 index b7928bc56..000000000 --- a/src/main/java/cn/nukkit/console/NukkitConsole.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.console; - -import cn.nukkit.Nukkit; -import cn.nukkit.Server; -import cn.nukkit.event.server.ServerCommandEvent; -import co.aikar.timings.Timings; -import lombok.RequiredArgsConstructor; -import net.minecrell.terminalconsole.SimpleTerminalConsole; -import org.jline.reader.LineReader; -import org.jline.reader.LineReaderBuilder; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -@RequiredArgsConstructor -public class NukkitConsole extends SimpleTerminalConsole { - - private final BlockingQueue consoleQueue = new LinkedBlockingQueue<>(); - private final AtomicBoolean executingCommands = new AtomicBoolean(false); - - @Override - protected boolean isRunning() { - return Server.getInstance().isRunning(); - } - - @Override - protected void runCommand(String command) { - if (executingCommands.get()) { - if (Timings.serverCommandTimer != null) Timings.serverCommandTimer.startTiming(); - ServerCommandEvent event = new ServerCommandEvent(Server.getInstance().getConsoleSender(), command); - if (Server.getInstance().getPluginManager() != null) { - Server.getInstance().getPluginManager().callEvent(event); - } - if (!event.isCancelled()) { - Server.getInstance().getScheduler().scheduleTask(() -> Server.getInstance().dispatchCommand(event.getSender(), event.getCommand())); - } - if (Timings.serverCommandTimer != null) Timings.serverCommandTimer.stopTiming(); - } else { - consoleQueue.add(command); - } - } - - public String readLine() { - try { - return consoleQueue.take(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - @Override - protected void shutdown() { - Server.getInstance().shutdown(); - } - - @Override - protected LineReader buildReader(LineReaderBuilder builder) { - builder.completer(new NukkitConsoleCompleter()); - builder.appName(Nukkit.NUKKIT); - builder.option(LineReader.Option.HISTORY_BEEP, false); - builder.option(LineReader.Option.HISTORY_IGNORE_DUPS, true); - builder.option(LineReader.Option.HISTORY_IGNORE_SPACE, true); - return super.buildReader(builder); - } - - public boolean isExecutingCommands() { - return executingCommands.get(); - } - - public void setExecutingCommands(boolean executingCommands) { - if (this.executingCommands.compareAndSet(!executingCommands, executingCommands) && executingCommands) { - consoleQueue.clear(); - } - } -} diff --git a/src/main/java/cn/nukkit/console/NukkitConsoleCompleter.java b/src/main/java/cn/nukkit/console/NukkitConsoleCompleter.java deleted file mode 100644 index e898cea8c..000000000 --- a/src/main/java/cn/nukkit/console/NukkitConsoleCompleter.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.console; - -import cn.nukkit.Server; -import lombok.RequiredArgsConstructor; -import org.jline.reader.Candidate; -import org.jline.reader.Completer; -import org.jline.reader.LineReader; -import org.jline.reader.ParsedLine; - -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.function.Consumer; - -@RequiredArgsConstructor -public class NukkitConsoleCompleter implements Completer { - - @Override - public void complete(LineReader lineReader, ParsedLine parsedLine, List candidates) { - if (parsedLine.wordIndex() == 0) { - if (parsedLine.word().isEmpty()) { - addCandidates(s -> candidates.add(new Candidate(s))); - return; - } - SortedSet names = new TreeSet<>(); - addCandidates(names::add); - for (String match : names) { - if (!match.toLowerCase().startsWith(parsedLine.word())) { - continue; - } - - candidates.add(new Candidate(match)); - } - } else if (parsedLine.wordIndex() > 0 && !parsedLine.word().isEmpty()) { - String word = parsedLine.word(); - SortedSet names = new TreeSet<>(); - Server.getInstance().getOnlinePlayers().values().forEach((p) -> names.add(p.getName())); - for (String match : names) { - if (!match.toLowerCase().startsWith(word.toLowerCase())) { - continue; - } - - candidates.add(new Candidate(match)); - } - } - } - - private static void addCandidates(Consumer commandConsumer) { - for (String command : Server.getInstance().getCommandMap().getCommands().keySet()) { - if (!command.contains(":")) { - commandConsumer.accept(command); - } - } - } -} diff --git a/src/main/java/cn/nukkit/dispenser/BoatDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/BoatDispenseBehavior.java deleted file mode 100644 index 02b8a675f..000000000 --- a/src/main/java/cn/nukkit/dispenser/BoatDispenseBehavior.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockWater; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityBoat; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; - -public class BoatDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Vector3 pos = block.getSide(face).multiply(1.125); - - Block target = block.getSide(face); - - if (target instanceof BlockWater) { - pos.y += 1; - } else if (target.getId() != BlockID.AIR || !(target.down() instanceof BlockWater)) { - return super.dispense(block, face, item); - } - - pos = target.getLocation().setYaw(face.getHorizontalAngle()); - - EntityBoat boat = new EntityBoat(block.level.getChunk(target.getChunkX(), target.getChunkZ()), - Entity.getDefaultNBT(pos) - .putByte("woodID", item.getDamage()) - ); - - boat.spawnToAll(); - - return null; - } -} diff --git a/src/main/java/cn/nukkit/dispenser/BucketDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/BucketDispenseBehavior.java deleted file mode 100644 index 884bedd36..000000000 --- a/src/main/java/cn/nukkit/dispenser/BucketDispenseBehavior.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockLiquid; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBucket; -import cn.nukkit.item.ItemID; -import cn.nukkit.math.BlockFace; - -/** - * @author CreeperFace - */ -public class BucketDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Block target = block.getSide(face); - - if (item.getDamage() > 0) { - if (target.canBeFlowedInto()) { - Block replace = Block.get(ItemBucket.getDamageByTarget(item.getDamage())); - - if (replace instanceof BlockLiquid) { - block.level.setBlock(target, replace); - return Item.get(ItemID.BUCKET); - } - } - } else if (target instanceof BlockLiquid && target.getDamage() == 0) { - target.level.setBlock(target, Block.get(BlockID.AIR)); - return new ItemBucket(ItemBucket.getDamageByTarget(target.getId())); - } - - return super.dispense(block, face, item); - } -} diff --git a/src/main/java/cn/nukkit/dispenser/DefaultDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/DefaultDispenseBehavior.java deleted file mode 100644 index 049e41dba..000000000 --- a/src/main/java/cn/nukkit/dispenser/DefaultDispenseBehavior.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockFace.Axis; -import cn.nukkit.math.Vector3; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author CreeperFace - */ -public class DefaultDispenseBehavior implements DispenseBehavior { - - public boolean success = true; - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Vector3 dispensePos = block.getDispensePosition(); - - if (face.getAxis() == Axis.Y) { - dispensePos.y -= 0.125; - } else { - dispensePos.y -= 0.15625; - } - - ThreadLocalRandom rand = ThreadLocalRandom.current(); - Vector3 motion = new Vector3(); - - double offset = rand.nextDouble() * 0.1 + 0.2; - - motion.x = face.getXOffset() * offset; - motion.y = 0.20000000298023224; - motion.z = face.getZOffset() * offset; - - motion.x += rand.nextGaussian() * 0.007499999832361937 * 6; - motion.y += rand.nextGaussian() * 0.007499999832361937 * 6; - motion.z += rand.nextGaussian() * 0.007499999832361937 * 6; - - Item i = item.clone(); - i.setCount(1); - block.level.dropItem(dispensePos, i, motion); - return null; - } -} diff --git a/src/main/java/cn/nukkit/dispenser/DispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/DispenseBehavior.java deleted file mode 100644 index 54d2905a5..000000000 --- a/src/main/java/cn/nukkit/dispenser/DispenseBehavior.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; - -/** - * @author CreeperFace - */ -public interface DispenseBehavior { - - Item dispense(BlockDispenser block, BlockFace face, Item item); -} diff --git a/src/main/java/cn/nukkit/dispenser/DispenseBehaviorRegister.java b/src/main/java/cn/nukkit/dispenser/DispenseBehaviorRegister.java deleted file mode 100644 index 2a8b31e3d..000000000 --- a/src/main/java/cn/nukkit/dispenser/DispenseBehaviorRegister.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.BlockID; -import cn.nukkit.item.ItemID; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author CreeperFace - */ -public final class DispenseBehaviorRegister { - - private static final Map behaviors = new HashMap<>(); - private static DispenseBehavior defaultBehavior = new DefaultDispenseBehavior(); - - public static void registerBehavior(int itemId, DispenseBehavior behavior) { - behaviors.put(itemId, behavior); - } - - public static DispenseBehavior getBehavior(int id) { - return behaviors.getOrDefault(id, defaultBehavior); - } - - public static void removeDispenseBehavior(int id) { - behaviors.remove(id); - } - - public static void init() { - registerBehavior(ItemID.BOAT, new BoatDispenseBehavior()); - registerBehavior(ItemID.BUCKET, new BucketDispenseBehavior()); - registerBehavior(ItemID.DYE, new DyeDispenseBehavior()); - registerBehavior(ItemID.FIREWORKS, new FireworksDispenseBehavior()); - registerBehavior(ItemID.FLINT_AND_STEEL, new FlintAndSteelDispenseBehavior()); - registerBehavior(BlockID.SHULKER_BOX, new ShulkerBoxDispenseBehavior()); - registerBehavior(ItemID.SPAWN_EGG, new SpawnEggDispenseBehavior()); - registerBehavior(BlockID.TNT, new TNTDispenseBehavior()); - registerBehavior(ItemID.FIRE_CHARGE, new FireChargeDispenseBehavior()); - registerBehavior(ItemID.ARROW, new ProjectileDispenseBehavior("Arrow") { - @Override - protected double getMotion() { - return super.getMotion() * 1.5; - } - }); - //TODO: tipped arrow - //TODO: spectral arrow - registerBehavior(ItemID.EGG, new ProjectileDispenseBehavior("Egg")); - registerBehavior(ItemID.SNOWBALL, new ProjectileDispenseBehavior("Snowball")); - registerBehavior(ItemID.EXPERIENCE_BOTTLE, new ProjectileDispenseBehavior("ThrownExpBottle") { - @Override - protected float getAccuracy() { - return super.getAccuracy() * 0.5f; - } - - @Override - protected double getMotion() { - return super.getMotion() * 1.25; - } - }); - registerBehavior(ItemID.SPLASH_POTION, new ProjectileDispenseBehavior("ThrownPotion") { - @Override - protected float getAccuracy() { - return super.getAccuracy() * 0.5f; - } - - @Override - protected double getMotion() { - return super.getMotion() * 1.25; - } - }); - registerBehavior(ItemID.LINGERING_POTION, new ProjectileDispenseBehavior("LingeringPotion") { - @Override - protected float getAccuracy() { - return super.getAccuracy() * 0.5f; - } - - @Override - protected double getMotion() { - return super.getMotion() * 1.25; - } - }); - registerBehavior(ItemID.TRIDENT, new ProjectileDispenseBehavior("ThrownTrident") { - @Override - protected float getAccuracy() { - return super.getAccuracy() * 0.5f; - } - - @Override - protected double getMotion() { - return super.getMotion() * 1.25; - } - }); - } -} diff --git a/src/main/java/cn/nukkit/dispenser/DyeDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/DyeDispenseBehavior.java deleted file mode 100644 index c065af3b6..000000000 --- a/src/main/java/cn/nukkit/dispenser/DyeDispenseBehavior.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.*; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.DyeColor; - -public class DyeDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Block target = block.getSide(face); - - if (DyeColor.getByDyeData(item.getDamage()) == DyeColor.WHITE) { - if (target instanceof BlockCrops || target instanceof BlockSapling || target instanceof BlockTallGrass - || target instanceof BlockDoublePlant || target instanceof BlockMushroom) { - target.onActivate(item); - - } else { - this.success = false; - } - - return null; - } - - return super.dispense(block, face, item); - } -} diff --git a/src/main/java/cn/nukkit/dispenser/FireChargeDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/FireChargeDispenseBehavior.java deleted file mode 100644 index c67bbc146..000000000 --- a/src/main/java/cn/nukkit/dispenser/FireChargeDispenseBehavior.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; - -public class FireChargeDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Vector3 dispensePos = block.getDispensePosition(); - - Entity projectile = Entity.createEntity("GhastFireBall", block.level.getChunk(dispensePos.getChunkX(), dispensePos.getChunkZ()), Entity.getDefaultNBT(dispensePos)); - - if (!(projectile instanceof EntityProjectile)) { - return super.dispense(block, face, item); - } - - projectile.setMotion(new Vector3(face.getXOffset(), face.getYOffset() + 0.1f, face.getZOffset()).normalize().multiply(1.3)); - ((EntityProjectile) projectile).inaccurate(6f); - ((EntityProjectile) projectile).updateRotation(); - - projectile.spawnToAll(); - return null; - } -} diff --git a/src/main/java/cn/nukkit/dispenser/FireworksDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/FireworksDispenseBehavior.java deleted file mode 100644 index 3943b2f08..000000000 --- a/src/main/java/cn/nukkit/dispenser/FireworksDispenseBehavior.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityFirework; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; - -public class FireworksDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - BlockFace opposite = face.getOpposite(); - Vector3 pos = block.getSide(face).add(0.5 + opposite.getXOffset() * 0.2, 0.5 + opposite.getYOffset() * 0.2, 0.5 + opposite.getZOffset() * 0.2); - CompoundTag nbt = Entity.getDefaultNBT(pos); - nbt.putCompound("FireworkItem", NBTIO.putItemHelper(item)); - new EntityFirework(block.level.getChunk(pos.getChunkX(), pos.getChunkZ()), nbt).spawnToAll(); - return null; - } -} diff --git a/src/main/java/cn/nukkit/dispenser/FlintAndSteelDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/FlintAndSteelDispenseBehavior.java deleted file mode 100644 index 3b098800d..000000000 --- a/src/main/java/cn/nukkit/dispenser/FlintAndSteelDispenseBehavior.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.block.BlockID; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; - -public class FlintAndSteelDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Block target = block.getSide(face); - - if (target.getId() == BlockID.AIR) { - block.level.setBlock(target, Block.get(BlockID.FIRE)); - } else if (target.getId() == BlockID.TNT) { - target.onActivate(item); - } else { - this.success = false; - } - - return null; - } -} diff --git a/src/main/java/cn/nukkit/dispenser/ProjectileDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/ProjectileDispenseBehavior.java deleted file mode 100644 index 5e5c64b00..000000000 --- a/src/main/java/cn/nukkit/dispenser/ProjectileDispenseBehavior.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * @author CreeperFace - */ -public class ProjectileDispenseBehavior extends DefaultDispenseBehavior { - - private final String entityType; - - public ProjectileDispenseBehavior(String entity) { - this.entityType = entity; - } - - @Override - public Item dispense(BlockDispenser source, BlockFace face, Item item) { - Vector3 dispensePos = source.getDispensePosition(); - - CompoundTag nbt = Entity.getDefaultNBT(dispensePos); - this.correctNBT(nbt); - - Entity projectile = Entity.createEntity(entityType, source.level.getChunk(dispensePos.getChunkX(), dispensePos.getChunkZ()), nbt); - - if (!(projectile instanceof EntityProjectile)) { - return super.dispense(source, face, item); - } - - Vector3 motion = new Vector3(face.getXOffset(), face.getYOffset() + 0.1f, face.getZOffset()) - .normalize(); - - projectile.setMotion(motion); - ((EntityProjectile) projectile).inaccurate(getAccuracy()); - projectile.setMotion(projectile.getMotion().multiply(getMotion())); - - ((EntityProjectile) projectile).updateRotation(); - - projectile.spawnToAll(); - return null; - } - - protected double getMotion() { - return 1.1; - } - - protected float getAccuracy() { - return 6; - } - - /** - * you can add extra data of projectile here - * - * @param nbt tag - */ - protected void correctNBT(CompoundTag nbt) { - } -} diff --git a/src/main/java/cn/nukkit/dispenser/ShulkerBoxDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/ShulkerBoxDispenseBehavior.java deleted file mode 100644 index 8f383b61d..000000000 --- a/src/main/java/cn/nukkit/dispenser/ShulkerBoxDispenseBehavior.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.block.BlockID; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; - -public class ShulkerBoxDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Block shulkerBox = Block.get(BlockID.SHULKER_BOX); - Block target = block.getSide(face); - - this.success = block.level.getCollidingEntities(shulkerBox.getBoundingBox()).length == 0; - - if (this.success) { - BlockFace shulkerBoxFace = target.down().getId() == BlockID.AIR ? face : BlockFace.UP; - - CompoundTag nbt = BlockEntity.getDefaultCompound(target, BlockEntity.SHULKER_BOX); - nbt.putByte("facing", shulkerBoxFace.getIndex()); - - if (item.hasCustomName()) { - nbt.putString("CustomName", item.getCustomName()); - } - - CompoundTag tag = item.getNamedTag(); - - if (tag != null) { - if (tag.contains("Items")) { - nbt.putList(tag.getList("Items")); - } - } - - BlockEntity.createBlockEntity(BlockEntity.SHULKER_BOX, block.level.getChunk(target.getChunkX(), target.getChunkZ()), nbt); - block.level.updateComparatorOutputLevel(target); - } - - return null; - } -} diff --git a/src/main/java/cn/nukkit/dispenser/SpawnEggDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/SpawnEggDispenseBehavior.java deleted file mode 100644 index 04a36857f..000000000 --- a/src/main/java/cn/nukkit/dispenser/SpawnEggDispenseBehavior.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; - -public class SpawnEggDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Vector3 pos = block.getSide(face).add(0.5, 0.7, 0.5); - - Entity entity = Entity.createEntity(item.getDamage(), block.level.getChunk(pos.getChunkX(), pos.getChunkZ()), - Entity.getDefaultNBT(pos)); - - this.success = entity != null; - - if (this.success) { - if (item.hasCustomName() && entity instanceof EntityLiving) { - entity.setNameTag(item.getCustomName()); - } - - entity.spawnToAll(); - return null; - } - - return super.dispense(block, face, item); - } -} diff --git a/src/main/java/cn/nukkit/dispenser/TNTDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/TNTDispenseBehavior.java deleted file mode 100644 index 806adae78..000000000 --- a/src/main/java/cn/nukkit/dispenser/TNTDispenseBehavior.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.dispenser; - -import cn.nukkit.block.BlockDispenser; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityPrimedTNT; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; - -public class TNTDispenseBehavior extends DefaultDispenseBehavior { - - @Override - public Item dispense(BlockDispenser block, BlockFace face, Item item) { - Vector3 pos = block.getSide(face).add(0.5, 0, 0.5); - - EntityPrimedTNT tnt = new EntityPrimedTNT(block.level.getChunk(pos.getChunkX(), pos.getChunkZ()), - Entity.getDefaultNBT(pos)); - tnt.spawnToAll(); - - return null; - } -} diff --git a/src/main/java/cn/nukkit/entity/Attribute.java b/src/main/java/cn/nukkit/entity/Attribute.java deleted file mode 100644 index 37caf2139..000000000 --- a/src/main/java/cn/nukkit/entity/Attribute.java +++ /dev/null @@ -1,182 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.utils.ServerException; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -/** - * Attribute - * - * @author Box, MagicDroidX(code), PeratX @ Nukkit Project - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public class Attribute implements Cloneable { - - public static final int ABSORPTION = 0; - public static final int SATURATION = 1; - public static final int EXHAUSTION = 2; - public static final int KNOCKBACK_RESISTANCE = 3; - public static final int MAX_HEALTH = 4; - public static final int MOVEMENT_SPEED = 5; - public static final int FOLLOW_RANGE = 6; - public static final int FOOD = 7, MAX_HUNGER = FOOD; - public static final int ATTACK_DAMAGE = 8; - public static final int EXPERIENCE_LEVEL = 9; - public static final int EXPERIENCE = 10; - public static final int UNDERWATER_MOVEMENT = 11; - public static final int LUCK = 12; - public static final int FALL_DAMAGE = 13; - public static final int HORSE_JUMP_STRENGTH = 14; - public static final int ZOMBIE_SPAWN_REINFORCEMENTS = 15; - public static final int LAVA_MOVEMENT = 16; - - protected static Map attributes = new HashMap<>(); - - protected float minValue; - protected float maxValue; - protected float defaultValue; - protected float currentValue; - protected String name; - protected boolean shouldSend; - private int id; - - private Attribute(int id, String name, float minValue, float maxValue, float defaultValue, boolean shouldSend) { - this.id = id; - this.name = name; - this.minValue = minValue; - this.maxValue = maxValue; - this.defaultValue = defaultValue; - this.shouldSend = shouldSend; - this.currentValue = this.defaultValue; - } - - public static void init() { - addAttribute(ABSORPTION, "minecraft:absorption", 0.00f, 340282346638528859811704183484516925440.00f, 0.00f); - addAttribute(SATURATION, "minecraft:player.saturation", 0.00f, 20.00f, 5.00f); - addAttribute(EXHAUSTION, "minecraft:player.exhaustion", 0.00f, 5.00f, 0.00f, false); - addAttribute(KNOCKBACK_RESISTANCE, "minecraft:knockback_resistance", 0.00f, 1.00f, 0.00f); - addAttribute(MAX_HEALTH, "minecraft:health", 0.00f, 20.00f, 20.00f); - addAttribute(MOVEMENT_SPEED, "minecraft:movement", 0.00f, 340282346638528859811704183484516925440.00f, 0.10f); - addAttribute(FOLLOW_RANGE, "minecraft:follow_range", 0.00f, 2048.00f, 16.00f, false); - addAttribute(MAX_HUNGER, "minecraft:player.hunger", 0.00f, 20.00f, 20.00f); - addAttribute(ATTACK_DAMAGE, "minecraft:attack_damage", 0.00f, 340282346638528859811704183484516925440.00f, 1.00f, false); - addAttribute(EXPERIENCE_LEVEL, "minecraft:player.level", 0.00f, 24791.00f, 0.00f); - addAttribute(EXPERIENCE, "minecraft:player.experience", 0.00f, 1.00f, 0.00f); - addAttribute(UNDERWATER_MOVEMENT, "minecraft:underwater_movement", 0.0f, 340282346638528859811704183484516925440.0f, 0.02f); - addAttribute(LUCK, "minecraft:luck", -1024.0f, 1024.0f, 0.0f); - addAttribute(FALL_DAMAGE, "minecraft:fall_damage", 0.0f, 340282346638528859811704183484516925440.0f, 1.0f); - addAttribute(HORSE_JUMP_STRENGTH, "minecraft:horse.jump_strength", 0.0f, 2.0f, 0.7f); - addAttribute(ZOMBIE_SPAWN_REINFORCEMENTS, "minecraft:zombie.spawn_reinforcements", 0.0f, 1.0f, 0.0f); - addAttribute(LAVA_MOVEMENT, "minecraft:lava_movement", 0.00f, 340282346638528859811704183484516925440.00f, 0.02f); - } - - public static Attribute addAttribute(int id, String name, float minValue, float maxValue, float defaultValue) { - return addAttribute(id, name, minValue, maxValue, defaultValue, true); - } - - public static Attribute addAttribute(int id, String name, float minValue, float maxValue, float defaultValue, boolean shouldSend) { - if (minValue > maxValue || defaultValue > maxValue || defaultValue < minValue) { - throw new IllegalArgumentException("Invalid ranges: min value: " + minValue + ", max value: " + maxValue + ", defaultValue: " + defaultValue); - } - - return attributes.put(id, new Attribute(id, name, minValue, maxValue, defaultValue, shouldSend)); - } - - public static Attribute getAttribute(int id) { - if (attributes.containsKey(id)) { - return attributes.get(id).clone(); - } - throw new ServerException("Attribute id: " + id + " not found"); - } - - /** - * @param name name - * @return null|Attribute - */ - public static Attribute getAttributeByName(String name) { - for (Attribute a : attributes.values()) { - if (Objects.equals(a.name, name)) { - return a.clone(); - } - } - return null; - } - - public float getMinValue() { - return this.minValue; - } - - public Attribute setMinValue(float minValue) { - if (minValue > this.maxValue) { - throw new IllegalArgumentException("Value " + minValue + " is bigger than the maxValue!"); - } - this.minValue = minValue; - return this; - } - - public float getMaxValue() { - return this.maxValue; - } - - public Attribute setMaxValue(float maxValue) { - if (maxValue < this.minValue) { - throw new IllegalArgumentException("Value " + maxValue + " is bigger than the minValue!"); - } - this.maxValue = maxValue; - return this; - } - - public float getDefaultValue() { - return this.defaultValue; - } - - public Attribute setDefaultValue(float defaultValue) { - if (defaultValue > this.maxValue || defaultValue < this.minValue) { - throw new IllegalArgumentException("Value " + defaultValue + " exceeds the range!"); - } - this.defaultValue = defaultValue; - return this; - } - - public float getValue() { - return this.currentValue; - } - - public Attribute setValue(float value) { - return setValue(value, true); - } - - public Attribute setValue(float value, boolean fit) { - if (value > this.maxValue || value < this.minValue) { - if (!fit) { - throw new IllegalArgumentException("Value " + value + " exceeds the range!"); - } - value = Math.min(Math.max(value, this.minValue), this.maxValue); - } - this.currentValue = value; - return this; - } - - public String getName() { - return this.name; - } - - public int getId() { - return this.id; - } - - public boolean isSyncable() { - return this.shouldSend; - } - - @Override - public Attribute clone() { - try { - return (Attribute) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } -} diff --git a/src/main/java/cn/nukkit/entity/BaseEntity.java b/src/main/java/cn/nukkit/entity/BaseEntity.java deleted file mode 100644 index e459893e0..000000000 --- a/src/main/java/cn/nukkit/entity/BaseEntity.java +++ /dev/null @@ -1,541 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityEnderDragon; -import cn.nukkit.entity.mob.EntityFlyingMob; -import cn.nukkit.entity.mob.EntityMob; -import cn.nukkit.entity.mob.EntityRavager; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.HeartParticle; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; -import co.aikar.timings.Timings; -import org.apache.commons.math3.util.FastMath; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * The base class of all entities that have an AI - */ -public abstract class BaseEntity extends EntityCreature implements EntityAgeable { - - public int stayTime = 0; - protected int moveTime = 0; - - protected float moveMultiplier = 1.0f; - - protected Vector3 target = null; - protected Entity followTarget = null; - protected int attackDelay = 0; - private short inLoveTicks = 0; - - private boolean baby = false; - private boolean movement = true; - private boolean friendly = false; - - public Item[] armor; - - public BaseEntity(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - this.setHealth(this.getMaxHealth()); - this.setAirTicks(400); - } - - public abstract Vector3 updateMove(int tickDiff); - - public abstract int getKillExperience(); - - public boolean isFriendly() { - return this.friendly; - } - - public boolean isMovement() { - return this.getServer().getMobAiEnabled() && this.movement; - } - - public boolean isKnockback() { - return this.attackTime > 0; - } - - public void setFriendly(boolean bool) { - this.friendly = bool; - } - - public void setMovement(boolean value) { - this.movement = value; - } - - public double getSpeed() { - if (this.baby) { - return 1.2; - } - return 1; - } - - public int getAge() { - return this.age; - } - - public Entity getTarget() { - return this.followTarget != null ? this.followTarget : (this.target instanceof Entity ? (Entity) this.target : null); - } - - public void setTarget(Entity target) { - this.followTarget = target; - this.moveTime = 0; - this.stayTime = 0; - this.target = null; - } - - @Override - public boolean isBaby() { - return this.baby; - } - - @Override - public void setBaby(boolean baby) { - this.baby = baby; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_BABY, baby); - if (baby) { - this.setScale(0.5f); - } else { - this.setScale(1.0f); - } - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag.contains("Movement")) { - this.setMovement(this.namedTag.getBoolean("Movement")); - } - - if (this.namedTag.contains("Age")) { - this.age = this.namedTag.getShort("Age"); - } - - if (this.namedTag.getBoolean("Baby")) { - this.setBaby(true); - } - } - - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putBoolean("Baby", this.baby); - this.namedTag.putBoolean("Movement", this.isMovement()); - this.namedTag.putShort("Age", this.age); - } - - public boolean targetOption(EntityCreature creature, double distance) { - if (this instanceof EntityMob) { - if (creature instanceof Player) { - Player player = (Player) creature; - return !player.closed && player.spawned && player.isAlive() && (player.isSurvival() || player.isAdventure()) && distance <= 100; - } - return creature.isAlive() && !creature.closed && distance <= 100; - } - return false; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.startTiming(); - - if (this.canDespawn() && this.age > Server.getInstance().mobDespawnTicks && !this.hasCustomName() && !(this instanceof EntityBoss)) { - this.close(); - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.stopTiming(); - return true; - } - - if (this instanceof EntityMob && this.attackDelay < 200) { - this.attackDelay++; - } - - boolean hasUpdate = super.entityBaseTick(tickDiff); - - if (this.moveTime > 0) { - this.moveTime -= tickDiff; - } - - if (this.isInLove()) { - this.inLoveTicks -= tickDiff; - if (this.age % 20 == 0) { - for (int i = 0; i < 3; i++) { - this.level.addParticle(new HeartParticle(this.add(Utils.rand(-1.0, 1.0), this.getMountedYOffset() + Utils.rand(-1.0, 1.0), Utils.rand(-1.0, 1.0)))); - } - } - } - - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.stopTiming(); - - return hasUpdate; - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (this.isKnockback() && source instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) source).getDamager() instanceof Player) { - return false; - } - - if (this.fireProof && (source.getCause() == EntityDamageEvent.DamageCause.FIRE || source.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK || source.getCause() == EntityDamageEvent.DamageCause.LAVA || source.getCause() == EntityDamageEvent.DamageCause.MAGMA)) { - return false; - } - - if (source instanceof EntityDamageByEntityEvent) { - if (this instanceof EntityRavager && Utils.rand()) { - ((EntityDamageByEntityEvent) source).setKnockBack(0f); - } else { - ((EntityDamageByEntityEvent) source).setKnockBack(0.25f); - } - } - - super.attack(source); - - if (!source.isCancelled()) { - this.target = null; - this.stayTime = 0; - } - - return true; - } - - @Override - public boolean setMotion(Vector3 motion) { - if (this.getServer().getMobAiEnabled()) { - super.setMotion(motion); - } - return false; - } - - @Override - public boolean move(double dx, double dy, double dz) { - if (dy < -10 || dy > 10) { - if (!(this instanceof EntityFlyingMob)) { - this.kill(); - } - return false; - } - - if (dx == 0 && dz == 0 && dy == 0) { - return false; - } - - if (Timings.entityMoveTimer != null) Timings.entityMoveTimer.startTiming(); - - this.blocksAround = null; - - double movX = dx * moveMultiplier; - double movY = dy; - double movZ = dz * moveMultiplier; - - AxisAlignedBB[] list = this.level.getCollisionCubes(this, this.boundingBox.addCoord(dx, dy, dz), false); - - for (AxisAlignedBB bb : list) { - dx = bb.calculateXOffset(this.boundingBox, dx); - } - this.boundingBox.offset(dx, 0, 0); - - for (AxisAlignedBB bb : list) { - dz = bb.calculateZOffset(this.boundingBox, dz); - } - this.boundingBox.offset(0, 0, dz); - - for (AxisAlignedBB bb : list) { - dy = bb.calculateYOffset(this.boundingBox, dy); - } - this.boundingBox.offset(0, dy, 0); - - this.setComponents(this.x + dx, this.y + dy, this.z + dz); - this.checkChunks(); - - this.checkGroundState(movX, movY, movZ, dx, dy, dz); - this.updateFallState(this.onGround); - - if (Timings.entityMoveTimer != null) Timings.entityMoveTimer.stopTiming(); - return true; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.NAME_TAG) { - if (item.hasCustomName() && !(this instanceof EntityEnderDragon)) { - this.setNameTag(item.getCustomName()); - this.setNameTagVisible(true); - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - return true; - } - } - - return false; - } - - public void setInLove() { - this.inLoveTicks = 600; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_INLOVE, true); - } - - public boolean isInLove() { - return inLoveTicks > 0; - } - - public Item[] getRandomArmor() { - Item[] slots = new Item[4]; - Item helmet = Item.get(0); - Item chestplate = Item.get(0); - Item leggings = Item.get(0); - Item boots = Item.get(0); - - switch (Utils.rand(1, 5)) { - case 1: - if (Utils.rand(1, 100) < 39) { - if (Utils.rand(0, 1) == 0) { - helmet = Item.get(Item.LEATHER_HELMET, 0, 1); - this.addHealth(1); - } - } - break; - case 2: - if (Utils.rand(1, 100) < 50) { - if (Utils.rand(0, 1) == 0) { - helmet = Item.get(Item.GOLD_HELMET, 0, 1); - this.addHealth(1); - } - } - break; - case 3: - if (Utils.rand(1, 100) < 14) { - if (Utils.rand(0, 1) == 0) { - helmet = Item.get(Item.CHAIN_HELMET, 0, 1); - this.addHealth(1); - } - } - break; - case 4: - if (Utils.rand(1, 100) < 3) { - if (Utils.rand(0, 1) == 0) { - helmet = Item.get(Item.IRON_HELMET, 0, 1); - this.addHealth(1); - } - } - break; - case 5: - if (Utils.rand(1, 100) == 100) { - if (Utils.rand(0, 1) == 0) { - helmet = Item.get(Item.DIAMOND_HELMET, 0, 1); - this.addHealth(2); - } - } - break; - } - - slots[0] = helmet; - - if (Utils.rand(1, 4) != 1) { - switch (Utils.rand(1, 5)) { - case 1: - if (Utils.rand(1, 100) < 39) { - if (Utils.rand(0, 1) == 0) { - chestplate = Item.get(Item.LEATHER_CHESTPLATE, 0, 1); - this.addHealth(1); - } - } - break; - case 2: - if (Utils.rand(1, 100) < 50) { - if (Utils.rand(0, 1) == 0) { - chestplate = Item.get(Item.GOLD_CHESTPLATE, 0, 1); - this.addHealth(1); - } - } - break; - case 3: - if (Utils.rand(1, 100) < 14) { - if (Utils.rand(0, 1) == 0) { - chestplate = Item.get(Item.CHAIN_CHESTPLATE, 0, 1); - this.addHealth(1); - } - } - break; - case 4: - if (Utils.rand(1, 100) < 3) { - if (Utils.rand(0, 1) == 0) { - chestplate = Item.get(Item.IRON_CHESTPLATE, 0, 1); - this.addHealth(2); - } - } - break; - case 5: - if (Utils.rand(1, 100) == 100) { - if (Utils.rand(0, 1) == 0) { - chestplate = Item.get(Item.DIAMOND_CHESTPLATE, 0, 1); - this.addHealth(3); - } - } - break; - } - } - - slots[1] = chestplate; - - if (Utils.rand(1, 2) == 2) { - switch (Utils.rand(1, 5)) { - case 1: - if (Utils.rand(1, 100) < 39) { - if (Utils.rand(0, 1) == 0) { - leggings = Item.get(Item.LEATHER_LEGGINGS, 0, 1); - this.addHealth(1); - } - } - break; - case 2: - if (Utils.rand(1, 100) < 50) { - if (Utils.rand(0, 1) == 0) { - leggings = Item.get(Item.GOLD_LEGGINGS, 0, 1); - this.addHealth(1); - } - } - break; - case 3: - if (Utils.rand(1, 100) < 14) { - if (Utils.rand(0, 1) == 0) { - leggings = Item.get(Item.CHAIN_LEGGINGS, 0, 1); - this.addHealth(1); - } - } - break; - case 4: - if (Utils.rand(1, 100) < 3) { - if (Utils.rand(0, 1) == 0) { - leggings = Item.get(Item.IRON_LEGGINGS, 0, 1); - this.addHealth(1); - } - } - break; - case 5: - if (Utils.rand(1, 100) == 100) { - if (Utils.rand(0, 1) == 0) { - leggings = Item.get(Item.DIAMOND_LEGGINGS, 0, 1); - this.addHealth(2); - } - } - break; - } - } - - slots[2] = leggings; - - if (Utils.rand(1, 5) < 3) { - switch (Utils.rand(1, 5)) { - case 1: - if (Utils.rand(1, 100) < 39) { - if (Utils.rand(0, 1) == 0) { - boots = Item.get(Item.LEATHER_BOOTS, 0, 1); - this.addHealth(1); - } - } - break; - case 2: - if (Utils.rand(1, 100) < 50) { - if (Utils.rand(0, 1) == 0) { - boots = Item.get(Item.GOLD_BOOTS, 0, 1); - this.addHealth(1); - } - } - break; - case 3: - if (Utils.rand(1, 100) < 14) { - if (Utils.rand(0, 1) == 0) { - boots = Item.get(Item.CHAIN_BOOTS, 0, 1); - this.addHealth(1); - } - } - break; - case 4: - if (Utils.rand(1, 100) < 3) { - if (Utils.rand(0, 1) == 0) { - boots = Item.get(Item.IRON_BOOTS, 0, 1); - this.addHealth(1); - } - } - break; - case 5: - if (Utils.rand(1, 100) == 100) { - if (Utils.rand(0, 1) == 0) { - boots = Item.get(Item.DIAMOND_BOOTS, 0, 1); - this.addHealth(2); - } - } - break; - } - } - - slots[3] = boots; - - return slots; - } - - private void addHealth(int health) { - this.maxHealth = this.maxHealth + health; - this.setHealth(this.getHealth() + health); - } - - public boolean canDespawn() { - return Server.getInstance().despawnMobs; - } - - public int nearbyDistanceMultiplier() { - return 1; - } - - @Override - protected void checkGroundState(double movX, double movY, double movZ, double dx, double dy, double dz) { - if (onGround && movX == 0 && movY == 0 && movZ == 0 && dx == 0 && dy == 0 && dz == 0) { - return; - } - this.isCollidedVertically = movY != dy; - this.isCollidedHorizontally = (movX != dx || movZ != dz); - this.isCollided = (this.isCollidedHorizontally || this.isCollidedVertically); - this.onGround = (movY != dy && movY < 0); - } - - public static void setProjectileMotion(EntityProjectile projectile, double pitch, double yawR, double pitchR, double speed) { - double verticalMultiplier = Math.cos(pitchR); - double x = verticalMultiplier * Math.sin(-yawR); - double z = verticalMultiplier * Math.cos(yawR); - double y = Math.sin(-(FastMath.toRadians(pitch))); - double magnitude = Math.sqrt(x * x + y * y + z * z); - if (magnitude > 0) { - x += (x * (speed - magnitude)) / magnitude; - y += (y * (speed - magnitude)) / magnitude; - z += (z * (speed - magnitude)) / magnitude; - } - ThreadLocalRandom rand = ThreadLocalRandom.current(); - x += rand.nextGaussian() * 0.007499999832361937 * 6; - y += rand.nextGaussian() * 0.007499999832361937 * 6; - z += rand.nextGaussian() * 0.007499999832361937 * 6; - projectile.setMotion(new Vector3(x, y, z)); - } - - public boolean canTarget(Entity entity) { - return entity instanceof Player && entity.canBeFollowed(); - } - - @Override - protected void checkBlockCollision() { - for (Block block : this.getCollisionBlocks()) { - block.onEntityCollide(this); - } - - // TODO: portals - } -} diff --git a/src/main/java/cn/nukkit/entity/Entity.java b/src/main/java/cn/nukkit/entity/Entity.java deleted file mode 100644 index bc747fa1d..000000000 --- a/src/main/java/cn/nukkit/entity/Entity.java +++ /dev/null @@ -1,2691 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.*; -import cn.nukkit.entity.data.*; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.entity.mob.EntityCreeper; -import cn.nukkit.entity.mob.EntityWolf; -import cn.nukkit.event.Event; -import cn.nukkit.event.entity.*; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.player.PlayerInteractEvent; -import cn.nukkit.event.player.PlayerInteractEvent.Action; -import cn.nukkit.event.player.PlayerTeleportEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.*; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.*; -import cn.nukkit.metadata.MetadataValue; -import cn.nukkit.metadata.Metadatable; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.*; -import cn.nukkit.network.protocol.types.EntityLink; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.ChunkException; -import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.Utils; -import co.aikar.timings.Timing; -import co.aikar.timings.Timings; -import co.aikar.timings.TimingsHistory; -import com.google.common.collect.Iterables; -import org.apache.commons.math3.util.FastMath; - -import java.lang.reflect.Constructor; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -import static cn.nukkit.network.protocol.SetEntityLinkPacket.*; - -/** - * @author MagicDroidX - */ -@SuppressWarnings("rawtypes") -public abstract class Entity extends Location implements Metadatable { - - public static final int NETWORK_ID = -1; - - public abstract int getNetworkId(); - - public static final int DATA_TYPE_BYTE = 0; - public static final int DATA_TYPE_SHORT = 1; - public static final int DATA_TYPE_INT = 2; - public static final int DATA_TYPE_FLOAT = 3; - public static final int DATA_TYPE_STRING = 4; - public static final int DATA_TYPE_NBT = 5; - public static final int DATA_TYPE_POS = 6; - public static final int DATA_TYPE_LONG = 7; - public static final int DATA_TYPE_VECTOR3F = 8; - - public static final int DATA_FLAGS = 0; - public static final int DATA_HEALTH = 1; //int (minecart/boat) - public static final int DATA_VARIANT = 2; //int - public static final int DATA_COLOR = 3, DATA_COLOUR = DATA_COLOR; //byte - public static final int DATA_NAMETAG = 4; //string - public static final int DATA_OWNER_EID = 5; //long - public static final int DATA_TARGET_EID = 6; //long - public static final int DATA_AIR = 7; //short - public static final int DATA_POTION_COLOR = 8; //int (ARGB!) - public static final int DATA_POTION_AMBIENT = 9; //byte - public static final int DATA_JUMP_DURATION = 10; //long - public static final int DATA_HURT_TIME = 11; //int (minecart/boat) - public static final int DATA_HURT_DIRECTION = 12; //int (minecart/boat) - public static final int DATA_PADDLE_TIME_LEFT = 13; //float - public static final int DATA_PADDLE_TIME_RIGHT = 14; //float - public static final int DATA_EXPERIENCE_VALUE = 15; //int (xp orb) - public static final int DATA_DISPLAY_ITEM = 16; //int (id | (data << 16)) - public static final int DATA_DISPLAY_OFFSET = 17; //int - public static final int DATA_HAS_DISPLAY = 18; //byte (must be 1 for minecart to show block inside) - public static final int DATA_SWELL = 19; - public static final int DATA_OLD_SWELL = 20; - public static final int DATA_SWELL_DIR = 21; - public static final int DATA_CHARGE_AMOUNT = 22; - public static final int DATA_ENDERMAN_HELD_RUNTIME_ID = 23; //int (block runtime id) - public static final int DATA_ENTITY_AGE = 24; //short - public static final int DATA_PLAYER_FLAGS = 26; //byte - public static final int DATA_PLAYER_INDEX = 27; - public static final int DATA_PLAYER_BED_POSITION = 28; //block coords - public static final int DATA_FIREBALL_POWER_X = 29; //float - public static final int DATA_FIREBALL_POWER_Y = 30; - public static final int DATA_FIREBALL_POWER_Z = 31; - public static final int DATA_AUX_POWER = 32; - public static final int DATA_FISH_X = 33; - public static final int DATA_FISH_Z = 34; - public static final int DATA_FISH_ANGLE = 35; - public static final int DATA_POTION_AUX_VALUE = 36; //short - public static final int DATA_LEAD_HOLDER_EID = 37; //long - public static final int DATA_SCALE = 38; //float - public static final int DATA_HAS_NPC_COMPONENT = 39; //byte - public static final int DATA_NPC_SKIN_ID = 40; //string - public static final int DATA_URL_TAG = 41; //string - public static final int DATA_MAX_AIR = 42; //short - public static final int DATA_MARK_VARIANT = 43; //int - public static final int DATA_CONTAINER_TYPE = 44; //byte - public static final int DATA_CONTAINER_BASE_SIZE = 45; //int - public static final int DATA_CONTAINER_EXTRA_SLOTS_PER_STRENGTH = 46; //int - public static final int DATA_BLOCK_TARGET = 47; //block coords (ender crystal) - public static final int DATA_WITHER_INVULNERABLE_TICKS = 48; //int - public static final int DATA_WITHER_TARGET_1 = 49; //long - public static final int DATA_WITHER_TARGET_2 = 50; //long - public static final int DATA_WITHER_TARGET_3 = 51; //long - public static final int DATA_AERIAL_ATTACK = 52; - public static final int DATA_BOUNDING_BOX_WIDTH = 53; //float - public static final int DATA_BOUNDING_BOX_HEIGHT = 54; //float - public static final int DATA_FUSE_LENGTH = 55; //int - public static final int DATA_RIDER_SEAT_POSITION = 56; //vector3f - public static final int DATA_RIDER_ROTATION_LOCKED = 57; //byte - public static final int DATA_RIDER_MAX_ROTATION = 58; //float - public static final int DATA_RIDER_MIN_ROTATION = 59; //float - public static final int DATA_RIDER_ROTATION_OFFSET = 60; - public static final int DATA_AREA_EFFECT_CLOUD_RADIUS = 61; //float - public static final int DATA_AREA_EFFECT_CLOUD_WAITING = 62; //int - public static final int DATA_AREA_EFFECT_CLOUD_PARTICLE_ID = 63; //int - public static final int DATA_SHULKER_PEEK_ID = 64; //int - public static final int DATA_SHULKER_ATTACH_FACE = 65; //byte - public static final int DATA_SHULKER_ATTACHED = 66; //short - public static final int DATA_SHULKER_ATTACH_POS = 67; //block coords - public static final int DATA_TRADING_PLAYER_EID = 68; //long - public static final int DATA_TRADING_CAREER = 69; - public static final int DATA_HAS_COMMAND_BLOCK = 70; - public static final int DATA_COMMAND_BLOCK_COMMAND = 71; //string - public static final int DATA_COMMAND_BLOCK_LAST_OUTPUT = 72; //string - public static final int DATA_COMMAND_BLOCK_TRACK_OUTPUT = 73; //byte - public static final int DATA_CONTROLLING_RIDER_SEAT_NUMBER = 74; //byte - public static final int DATA_STRENGTH = 75; //int - public static final int DATA_MAX_STRENGTH = 76; //int - public static final int DATA_SPELL_CASTING_COLOR = 77; //int - public static final int DATA_LIMITED_LIFE = 78; - public static final int DATA_ARMOR_STAND_POSE_INDEX = 79; // int - public static final int DATA_ENDER_CRYSTAL_TIME_OFFSET = 80; // int - public static final int DATA_ALWAYS_SHOW_NAMETAG = 81; // byte - public static final int DATA_COLOR_2 = 82; // byte - public static final int DATA_NAME_AUTHOR = 83; - public static final int DATA_SCORE_TAG = 84; // String - public static final int DATA_BALLOON_ATTACHED_ENTITY = 85; // long - public static final int DATA_PUFFERFISH_SIZE = 86; - public static final int DATA_BUBBLE_TIME = 87; - public static final int DATA_AGENT = 88; - public static final int DATA_SITTING_AMOUNT = 89; - public static final int DATA_SITTING_AMOUNT_PREVIOUS = 90; - public static final int DATA_EATING_COUNTER = 91; - public static final int DATA_FLAGS_EXTENDED = 92, DATA_FLAGS2 = DATA_FLAGS_EXTENDED; //long (extended data flags) - public static final int DATA_LAYING_AMOUNT = 93; - public static final int DATA_LAYING_AMOUNT_PREVIOUS = 94; - public static final int DATA_DURATION = 95; - public static final int DATA_SPAWN_TIME = 96; - public static final int DATA_CHANGE_RATE = 97; - public static final int DATA_CHANGE_ON_PICKUP = 98; - public static final int DATA_PICKUP_COUNT = 99; - public static final int DATA_INTERACTIVE_TAG = 100; //string (button text) - public static final int DATA_TRADE_TIER = 101; - public static final int DATA_MAX_TRADE_TIER = 102; - public static final int DATA_TRADE_EXPERIENCE = 103; - public static final int DATA_SKIN_ID = 104; // int - public static final int DATA_SPAWNING_FRAMES = 105; - public static final int DATA_COMMAND_BLOCK_TICK_DELAY = 106; //int - public static final int DATA_COMMAND_BLOCK_EXECUTE_ON_FIRST_TICK = 107; //byte - public static final int DATA_AMBIENT_SOUND_INTERVAL = 108; - public static final int DATA_AMBIENT_SOUND_INTERVAL_RANGE = 109; - public static final int DATA_AMBIENT_SOUND_EVENT_NAME = 110; - public static final int DATA_FALL_DAMAGE_MULTIPLIER = 111; - public static final int DATA_NAME_RAW_TEXT = 112; - public static final int DATA_CAN_RIDE_TARGET = 113; - public static final int DATA_LOW_TIER_CURED_DISCOUNT = 114; - public static final int DATA_HIGH_TIER_CURED_DISCOUNT = 115; - public static final int DATA_NEARBY_CURED_DISCOUNT = 116; - public static final int DATA_NEARBY_CURED_DISCOUNT_TIMESTAMP = 117; - public static final int DATA_HITBOX = 118; - public static final int DATA_IS_BUOYANT = 119; - public static final int DATA_BASE_RUNTIME_ID = 120; - public static final int DATA_FREEZING_EFFECT_STRENGTH = 121; - public static final int DATA_BUOYANCY_DATA = 122; - public static final int DATA_GOAT_HORN_COUNT = 123; - public static final int DATA_UPDATE_PROPERTIES = 124; - - // Flags - public static final int DATA_FLAG_ONFIRE = 0; - public static final int DATA_FLAG_SNEAKING = 1; - public static final int DATA_FLAG_RIDING = 2; - public static final int DATA_FLAG_SPRINTING = 3; - public static final int DATA_FLAG_ACTION = 4; - public static final int DATA_FLAG_INVISIBLE = 5; - public static final int DATA_FLAG_TEMPTED = 6; - public static final int DATA_FLAG_INLOVE = 7; - public static final int DATA_FLAG_SADDLED = 8; - public static final int DATA_FLAG_POWERED = 9; - public static final int DATA_FLAG_IGNITED = 10; - public static final int DATA_FLAG_BABY = 11; - public static final int DATA_FLAG_CONVERTING = 12; - public static final int DATA_FLAG_CRITICAL = 13; - public static final int DATA_FLAG_CAN_SHOW_NAMETAG = 14; - public static final int DATA_FLAG_ALWAYS_SHOW_NAMETAG = 15; - public static final int DATA_FLAG_IMMOBILE = 16, DATA_FLAG_NO_AI = DATA_FLAG_IMMOBILE; - public static final int DATA_FLAG_SILENT = 17; - public static final int DATA_FLAG_WALLCLIMBING = 18; - public static final int DATA_FLAG_CAN_CLIMB = 19; - public static final int DATA_FLAG_SWIMMER = 20; - public static final int DATA_FLAG_CAN_FLY = 21; - public static final int DATA_FLAG_WALKER = 22; - public static final int DATA_FLAG_RESTING = 23; - public static final int DATA_FLAG_SITTING = 24; - public static final int DATA_FLAG_ANGRY = 25; - public static final int DATA_FLAG_INTERESTED = 26; - public static final int DATA_FLAG_CHARGED = 27; - public static final int DATA_FLAG_TAMED = 28; - public static final int DATA_FLAG_ORPHANED = 29; - public static final int DATA_FLAG_LEASHED = 30; - public static final int DATA_FLAG_SHEARED = 31; - public static final int DATA_FLAG_GLIDING = 32; - public static final int DATA_FLAG_ELDER = 33; - public static final int DATA_FLAG_MOVING = 34; - public static final int DATA_FLAG_BREATHING = 35; - public static final int DATA_FLAG_CHESTED = 36; - public static final int DATA_FLAG_STACKABLE = 37; - public static final int DATA_FLAG_SHOWBASE = 38; - public static final int DATA_FLAG_REARING = 39; - public static final int DATA_FLAG_VIBRATING = 40; - public static final int DATA_FLAG_IDLING = 41; - public static final int DATA_FLAG_EVOKER_SPELL = 42; - public static final int DATA_FLAG_CHARGE_ATTACK = 43; - public static final int DATA_FLAG_WASD_CONTROLLED = 44; - public static final int DATA_FLAG_CAN_POWER_JUMP = 45; - public static final int DATA_FLAG_LINGER = 46; - public static final int DATA_FLAG_HAS_COLLISION = 47; - public static final int DATA_FLAG_GRAVITY = 48; - public static final int DATA_FLAG_FIRE_IMMUNE = 49; - public static final int DATA_FLAG_DANCING = 50; - public static final int DATA_FLAG_ENCHANTED = 51; - public static final int DATA_FLAG_SHOW_TRIDENT_ROPE = 52; - public static final int DATA_FLAG_CONTAINER_PRIVATE = 53; - public static final int DATA_FLAG_IS_TRANSFORMING = 54; - public static final int DATA_FLAG_SPIN_ATTACK = 55; - public static final int DATA_FLAG_SWIMMING = 56; - public static final int DATA_FLAG_BRIBED = 57; - public static final int DATA_FLAG_PREGNANT = 58; - public static final int DATA_FLAG_LAYING_EGG = 59; - public static final int DATA_FLAG_RIDER_CAN_PICK = 60; - public static final int DATA_FLAG_TRANSITION_SETTING = 61; - public static final int DATA_FLAG_EATING = 62; - public static final int DATA_FLAG_LAYING_DOWN = 63; - public static final int DATA_FLAG_SNEEZING = 64; - public static final int DATA_FLAG_TRUSTING = 65; - public static final int DATA_FLAG_ROLLING = 66; - public static final int DATA_FLAG_SCARED = 67; - public static final int DATA_FLAG_IN_SCAFFOLDING = 68; - public static final int DATA_FLAG_OVER_SCAFFOLDING = 69; - public static final int DATA_FLAG_FALL_THROUGH_SCAFFOLDING = 70; - public static final int DATA_FLAG_BLOCKING = 71; - public static final int DATA_FLAG_TRANSITION_BLOCKING = 72; - public static final int DATA_FLAG_BLOCKED_USING_SHIELD = 73; - public static final int DATA_FLAG_BLOCKED_USING_DAMAGED_SHIELD = 74; - public static final int DATA_FLAG_SLEEPING = 75; - public static final int DATA_FLAG_ENTITY_GROW_UP = 76; - public static final int DATA_FLAG_TRADE_INTEREST = 77; - public static final int DATA_FLAG_DOOR_BREAKER = 78; - public static final int DATA_FLAG_BREAKING_OBSTRUCTION = 79; - public static final int DATA_FLAG_DOOR_OPENER = 80; - public static final int DATA_FLAG_IS_ILLAGER_CAPTAIN = 81; - public static final int DATA_FLAG_STUNNED = 82; - public static final int DATA_FLAG_ROARING = 83; - public static final int DATA_FLAG_DELAYED_ATTACK = 84; - public static final int DATA_FLAG_IS_AVOIDING_MOBS = 85; - public static final int DATA_FLAG_IS_AVOIDING_BLOCKS = 86; - public static final int DATA_FLAG_FACING_TARGET_TO_RANGE_ATTACK = 87; - public static final int DATA_FLAG_HIDDEN_WHEN_INVISIBLE = 88; - public static final int DATA_FLAG_IS_IN_UI = 89; - public static final int DATA_FLAG_STALKING = 90; - public static final int DATA_FLAG_EMOTING = 91; - public static final int DATA_FLAG_CELEBRATING = 92; - public static final int DATA_FLAG_ADMIRING = 93; - public static final int DATA_FLAG_CELEBRATING_SPECIAL = 94; - public static final int DATA_FLAG_RAM_ATTACK = 96; - public static final int DATA_FLAG_PLAYING_DEAD = 97; - public static final int DATA_FLAG_IN_ASCENDABLE_BLOCK = 98; - public static final int DATA_FLAG_OVER_DESCENDABLE_BLOCK = 99; - - public static final double STEP_CLIP_MULTIPLIER = 0.4; - - public static long entityCount = 1; - - private static final Map> knownEntities = new HashMap<>(); - private static final Map shortNames = new HashMap<>(); - - public final Map hasSpawned = new HashMap<>(); - - protected final Map effects = new ConcurrentHashMap<>(); - - protected long id; - - protected final EntityMetadata dataProperties = new EntityMetadata() - .putLong(DATA_FLAGS, 0) - .putByte(DATA_COLOR, 0) - .putShort(DATA_AIR, 400) - .putShort(DATA_MAX_AIR, 400) - .putString(DATA_NAMETAG, "") - .putLong(DATA_LEAD_HOLDER_EID, -1) - .putFloat(DATA_SCALE, 1f); - - public final List passengers = new ArrayList<>(); - - public Entity riding = null; - - public FullChunk chunk; - - protected EntityDamageEvent lastDamageCause = null; - - public List blocksAround = new ArrayList<>(); - public List collisionBlocks = new ArrayList<>(); - - public double lastX; - public double lastY; - public double lastZ; - - public boolean firstMove = true; - - public double motionX; - public double motionY; - public double motionZ; - - public Vector3 temporalVector; - public double lastMotionX; - public double lastMotionY; - public double lastMotionZ; - - public double lastYaw; - public double lastPitch; - public double lastHeadYaw; - - public double entityCollisionReduction = 0; // Higher than 0.9 will result a fast collisions - public AxisAlignedBB boundingBox; - public boolean onGround; - public int deadTicks = 0; - public int age = 0; - public int ticksLived = 0; - protected int airTicks = 0; - - protected float health = 20; - protected int maxHealth = 20; - - protected float absorption = 0; - - protected float ySize = 0; - public boolean keepMovement = false; - - public float fallDistance = 0; - public int lastUpdate; - public int fireTicks = 0; - public int inPortalTicks = 0; - public int inEndPortalTicks = 0; - public Position portalPos = null; - - public float scale = 1; - - public CompoundTag namedTag; - - public boolean isCollided = false; - public boolean isCollidedHorizontally = false; - public boolean isCollidedVertically = false; - - public int noDamageTicks; - public boolean justCreated; - public boolean fireProof; - public boolean invulnerable; - - private boolean gliding; - private boolean immobile; - private boolean sprinting; - private boolean swimming; - private boolean sneaking; - - protected Server server; - - public double highestPosition; - - public boolean closed = false; - - protected Timing timing; - - public final boolean isPlayer; - - private volatile boolean init; - private volatile boolean initEntity; - - public float getHeight() { - return 0; - } - - public float getEyeHeight() { - return this.getHeight() / 2 + 0.1f; - } - - protected float getBreathableHeight() { - return isSwimming() || isGliding() ? -1f : 1.62f; // Hack: fix air while swimming in one block deep water - } - - public float getWidth() { - return 0; - } - - public float getLength() { - return 0; - } - - protected double getStepHeight() { - return 0; - } - - public boolean canCollide() { - return true; - } - - public boolean canBeFollowed() { - return true; - } - - protected float getGravity() { - return 0; - } - - protected float getDrag() { - return 0; - } - - protected float getBaseOffset() { - return 0; - } - - public Entity(FullChunk chunk, CompoundTag nbt) { - this.isPlayer = this instanceof Player; - if (!this.isPlayer) { - this.init(chunk, nbt); - } - } - - protected void initEntity() { - if (this.initEntity) { - throw new RuntimeException("Entity is already initialized: " + this.getName() + " (" + this.id + ')'); - } - - this.initEntity = true; - - if (this.namedTag.contains("ActiveEffects")) { - ListTag effects = this.namedTag.getList("ActiveEffects", CompoundTag.class); - for (CompoundTag e : effects.getAll()) { - Effect effect = Effect.getEffect(e.getByte("Id")); - if (effect == null) { - continue; - } - - effect.setAmplifier(e.getByte("Amplifier")).setDuration(e.getInt("Duration")).setVisible(e.getBoolean("ShowParticles")); - - this.addEffect(effect); - } - } - - if (this.namedTag.contains("CustomName")) { - this.setNameTag(this.namedTag.getString("CustomName")); - - if (this.namedTag.contains("CustomNameVisible")) { - this.setNameTagVisible(this.namedTag.getBoolean("CustomNameVisible")); - } - - if (this.namedTag.contains("CustomNameAlwaysVisible")) { - this.setNameTagAlwaysVisible(this.namedTag.getBoolean("CustomNameAlwaysVisible")); - } - } - - this.dataProperties.put(new LongEntityData(DATA_FLAGS, this.getDataPropertyLong(DATA_FLAGS) ^ 1L << DATA_FLAG_HAS_COLLISION)); - this.dataProperties.putFloat(DATA_BOUNDING_BOX_HEIGHT, this.getHeight()); - this.dataProperties.putFloat(DATA_BOUNDING_BOX_WIDTH, this.getWidth()); - this.dataProperties.putInt(DATA_HEALTH, (int) this.health); - - this.scheduleUpdate(); - - if (this.isPlayer) { - this.sendData((Player) this); - } - } - - protected final void init(FullChunk chunk, CompoundTag nbt) { - if ((chunk == null || chunk.getProvider() == null)) { - throw new ChunkException("Invalid garbage Chunk given to Entity"); - } - - if (this.init) { - throw new RuntimeException("Entity is already initialized: " + this.getName() + " (" + this.id + ')'); - } - - this.init = true; - - this.timing = Timings.getEntityTiming(this); - - this.temporalVector = new Vector3(); - - this.id = entityCount++; - this.justCreated = true; - this.namedTag = nbt; - - this.chunk = chunk; - this.setLevel(chunk.getProvider().getLevel()); - this.server = chunk.getProvider().getLevel().getServer(); - - this.boundingBox = new AxisAlignedBB(0, 0, 0, 0, 0, 0); - - ListTag posList = this.namedTag.getList("Pos", DoubleTag.class); - ListTag rotationList = this.namedTag.getList("Rotation", FloatTag.class); - ListTag motionList = this.namedTag.getList("Motion", DoubleTag.class); - this.setPositionAndRotation( - this.temporalVector.setComponents( - posList.get(0).data, - posList.get(1).data, - posList.get(2).data - ), - rotationList.get(0).data, - rotationList.get(1).data - ); - - this.setMotion(this.temporalVector.setComponents( - motionList.get(0).data, - motionList.get(1).data, - motionList.get(2).data - )); - - if (!this.namedTag.contains("FallDistance")) { - this.namedTag.putFloat("FallDistance", 0); - } - this.fallDistance = this.namedTag.getFloat("FallDistance"); - this.highestPosition = this.y + this.namedTag.getFloat("FallDistance"); - - if (!this.namedTag.contains("Fire") || this.namedTag.getShort("Fire") > 32767) { - this.namedTag.putShort("Fire", 0); - } - this.fireTicks = this.namedTag.getShort("Fire"); - - if (!this.namedTag.contains("Air")) { - this.namedTag.putShort("Air", 300); - } - this.setDataProperty(new ShortEntityData(DATA_AIR, this.namedTag.getShort("Air")), false); - - if (!this.namedTag.contains("OnGround")) { - this.namedTag.putBoolean("OnGround", false); - } - this.onGround = this.namedTag.getBoolean("OnGround"); - - if (!this.namedTag.contains("Invulnerable")) { - this.namedTag.putBoolean("Invulnerable", false); - } - this.invulnerable = this.namedTag.getBoolean("Invulnerable"); - - if (!this.namedTag.contains("Scale")) { - this.namedTag.putFloat("Scale", 1); - } - this.scale = this.namedTag.getFloat("Scale"); - this.setDataProperty(new FloatEntityData(DATA_SCALE, scale), false); - - this.chunk.addEntity(this); - this.level.addEntity(this); - - this.initEntity(); - - this.lastUpdate = this.server.getTick(); - this.server.getPluginManager().callEvent(new EntitySpawnEvent(this)); - - this.scheduleUpdate(); - } - - public boolean hasCustomName() { - return !this.getNameTag().isEmpty(); - } - - public String getNameTag() { - return this.getDataPropertyString(DATA_NAMETAG); - } - - public boolean isNameTagVisible() { - return this.getDataFlag(DATA_FLAGS, DATA_FLAG_CAN_SHOW_NAMETAG); - } - - public boolean isNameTagAlwaysVisible() { - return this.getDataPropertyByte(DATA_ALWAYS_SHOW_NAMETAG) == 1; - } - - public void setNameTag(String name) { - this.setDataProperty(new StringEntityData(DATA_NAMETAG, name)); - } - - public void setNameTagVisible() { - this.setNameTagVisible(true); - } - - public void setNameTagVisible(boolean value) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_CAN_SHOW_NAMETAG, value); - } - - public void setNameTagAlwaysVisible() { - this.setNameTagAlwaysVisible(true); - } - - public void setNameTagAlwaysVisible(boolean value) { - this.setDataProperty(new ByteEntityData(DATA_ALWAYS_SHOW_NAMETAG, value ? 1 : 0)); - } - - public void setScoreTag(String score) { - this.setDataProperty(new StringEntityData(DATA_SCORE_TAG, score)); - } - - public String getScoreTag() { - return this.getDataPropertyString(DATA_SCORE_TAG); - } - - public boolean isSneaking() { - return this.sneaking; - } - - public void setSneaking() { - this.setSneaking(true); - } - - public void setSneaking(boolean value) { - this.sneaking = value; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SNEAKING, value); - } - - public boolean isSwimming() { - return this.swimming; - } - - public void setSwimming() { - this.setSwimming(true); - } - - public void setSwimming(boolean value) { - if (this.swimming != value) { - this.swimming = value; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SWIMMING, value); - this.recalculateBoundingBox(true); - } - } - - public boolean isSprinting() { - return this.sprinting; - } - - public void setSprinting() { - this.setSprinting(true); - } - - public void setSprinting(boolean value) { - if (this.sprinting != value) { - this.sprinting = value; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SPRINTING, value); - } - } - - public boolean isGliding() { - return this.gliding; - } - - public void setGliding() { - this.setGliding(true); - } - - public void setGliding(boolean value) { - if (this.gliding != value) { - this.gliding = value; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_GLIDING, value); - this.recalculateBoundingBox(true); - } - } - - public boolean isImmobile() { - return this.immobile; - } - - public void setImmobile() { - this.setImmobile(true); - } - - public void setImmobile(boolean value) { - this.immobile = value; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_IMMOBILE, value); - } - - public boolean canClimb() { - return this.getDataFlag(DATA_FLAGS, DATA_FLAG_CAN_CLIMB); - } - - public void setCanClimb() { - this.setCanClimb(true); - } - - public void setCanClimb(boolean value) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_CAN_CLIMB, value); - } - - public boolean canClimbWalls() { - return this.getDataFlag(DATA_FLAGS, DATA_FLAG_WALLCLIMBING); - } - - public void setCanClimbWalls() { - this.setCanClimbWalls(true); - } - - public void setCanClimbWalls(boolean value) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_WALLCLIMBING, value); - } - - public void setScale(float scale) { - if (this.scale != scale) { - this.scale = scale; - this.setDataProperty(new FloatEntityData(DATA_SCALE, this.scale)); - this.recalculateBoundingBox(true); - } - } - - public float getScale() { - return this.scale; - } - - public List getPassengers() { - return passengers; - } - - public Entity getPassenger() { - return Iterables.getFirst(this.passengers, null); - } - - public boolean isPassenger(Entity entity) { - return this.passengers.contains(entity); - } - - public boolean isControlling(Entity entity) { - return this.passengers.indexOf(entity) == 0; - } - - public boolean hasControllingPassenger() { - return !this.passengers.isEmpty() && isControlling(this.passengers.get(0)); - } - - public Entity getRiding() { - return riding; - } - - public Map getEffects() { - return effects; - } - - public void removeAllEffects() { - for (Effect effect : this.effects.values()) { - this.removeEffect(effect.getId()); - } - } - - public void removeEffect(int effectId) { - if (this.effects.containsKey(effectId)) { - Effect effect = this.effects.get(effectId); - this.effects.remove(effectId); - effect.remove(this); - this.recalculateEffectColor(); - } - } - - public Effect getEffect(int effectId) { - return this.effects.getOrDefault(effectId, null); - } - - public boolean hasEffect(int effectId) { - return this.effects.containsKey(effectId); - } - - public void addEffect(Effect effect) { - if (effect == null) { - return; //here add null means add nothing - } - - effect.add(this); - - this.effects.put(effect.getId(), effect); - - this.recalculateEffectColor(); - - if (effect.getId() == Effect.HEALTH_BOOST) { - this.setHealth(this.health + ((effect.getAmplifier() + 1) << 2)); - } - } - - public void recalculateBoundingBox() { - this.recalculateBoundingBox(false); - } - - public void recalculateBoundingBox(boolean send) { - float height = this.getHeight(); - double radius = (this.getWidth() * this.scale) / 2d; - this.boundingBox.setBounds( - this.x - radius, - this.y + this.ySize, - z - radius, - x + radius, - y + height * this.scale + this.ySize, - z + radius - ); - - if (send) { - FloatEntityData bbH = new FloatEntityData(DATA_BOUNDING_BOX_HEIGHT, height); - FloatEntityData bbW = new FloatEntityData(DATA_BOUNDING_BOX_WIDTH, this.getWidth()); - this.dataProperties.put(bbH); - this.dataProperties.put(bbW); - sendData(this.hasSpawned.values().toArray(new Player[0]), new EntityMetadata().put(bbH).put(bbW)); - } - } - - protected void recalculateEffectColor() { - int[] color = new int[3]; - int count = 0; - boolean ambient = true; - for (Effect effect : this.effects.values()) { - if (effect.isVisible()) { - int[] c = effect.getColor(); - color[0] += c[0] * (effect.getAmplifier() + 1); - color[1] += c[1] * (effect.getAmplifier() + 1); - color[2] += c[2] * (effect.getAmplifier() + 1); - count += effect.getAmplifier() + 1; - if (!effect.isAmbient()) { - ambient = false; - } - } - } - - if (count > 0) { - int r = (color[0] / count) & 0xff; - int g = (color[1] / count) & 0xff; - int b = (color[2] / count) & 0xff; - - this.setDataProperty(new IntEntityData(Entity.DATA_POTION_COLOR, (r << 16) + (g << 8) + b)); - this.setDataProperty(new ByteEntityData(Entity.DATA_POTION_AMBIENT, ambient ? 1 : 0)); - } else { - this.setDataProperty(new IntEntityData(Entity.DATA_POTION_COLOR, 0)); - this.setDataProperty(new ByteEntityData(Entity.DATA_POTION_AMBIENT, 0)); - } - } - - public static Entity createEntity(String name, Position pos, Object... args) { - return createEntity(name, pos.getChunk(), getDefaultNBT(pos), args); - } - - public static Entity createEntity(int type, Position pos, Object... args) { - return createEntity(String.valueOf(type), pos.getChunk(), getDefaultNBT(pos), args); - } - - public static Entity createEntity(String name, FullChunk chunk, CompoundTag nbt, Object... args) { - Entity entity = null; - - if (knownEntities.containsKey(name)) { - Class clazz = knownEntities.get(name); - - if (clazz == null) { - return null; - } - - for (Constructor constructor : clazz.getConstructors()) { - if (entity != null) { - break; - } - - if (constructor.getParameterCount() != (args == null ? 2 : args.length + 2)) { - continue; - } - - try { - if (args == null || args.length == 0) { - entity = (Entity) constructor.newInstance(chunk, nbt); - } else { - Object[] objects = new Object[args.length + 2]; - - objects[0] = chunk; - objects[1] = nbt; - System.arraycopy(args, 0, objects, 2, args.length); - entity = (Entity) constructor.newInstance(objects); - - } - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - } - - return entity; - } - - public static Entity createEntity(int type, FullChunk chunk, CompoundTag nbt, Object... args) { - return createEntity(String.valueOf(type), chunk, nbt, args); - } - - public static boolean registerEntity(String name, Class clazz) { - return registerEntity(name, clazz, false); - } - - public static boolean registerEntity(String name, Class clazz, boolean force) { - if (clazz == null) { - return false; - } - try { - int networkId = clazz.getField("NETWORK_ID").getInt(null); - knownEntities.put(String.valueOf(networkId), clazz); - } catch (Exception e) { - if (!force) { - return false; - } - } - - knownEntities.put(name, clazz); - shortNames.put(clazz.getSimpleName(), name); - return true; - } - - public static CompoundTag getDefaultNBT(Vector3 pos) { - return getDefaultNBT(pos, null); - } - - public static CompoundTag getDefaultNBT(Vector3 pos, Vector3 motion) { - Location loc = pos instanceof Location ? (Location) pos : null; - - if (loc != null) { - return getDefaultNBT(pos, motion, (float) loc.getYaw(), (float) loc.getPitch()); - } - - return getDefaultNBT(pos, motion, 0, 0); - } - - public static CompoundTag getDefaultNBT(Vector3 pos, Vector3 motion, float yaw, float pitch) { - return new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", pos.x)) - .add(new DoubleTag("", pos.y)) - .add(new DoubleTag("", pos.z))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", motion != null ? motion.x : 0)) - .add(new DoubleTag("", motion != null ? motion.y : 0)) - .add(new DoubleTag("", motion != null ? motion.z : 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", yaw)) - .add(new FloatTag("", pitch))); - } - - public void saveNBT() { - if (!this.isPlayer) { - this.namedTag.putString("id", this.getSaveId()); - if (!this.getNameTag().isEmpty()) { - this.namedTag.putString("CustomName", this.getNameTag()); - this.namedTag.putBoolean("CustomNameVisible", this.isNameTagVisible()); - this.namedTag.putBoolean("CustomNameAlwaysVisible", this.isNameTagAlwaysVisible()); - } else { - this.namedTag.remove("CustomName"); - this.namedTag.remove("CustomNameVisible"); - this.namedTag.remove("CustomNameAlwaysVisible"); - } - } - - this.namedTag.putList(new ListTag("Pos") - .add(new DoubleTag("0", this.x)) - .add(new DoubleTag("1", this.y)) - .add(new DoubleTag("2", this.z)) - ); - - this.namedTag.putList(new ListTag("Motion") - .add(new DoubleTag("0", this.motionX)) - .add(new DoubleTag("1", this.motionY)) - .add(new DoubleTag("2", this.motionZ)) - ); - - this.namedTag.putList(new ListTag("Rotation") - .add(new FloatTag("0", (float) this.yaw)) - .add(new FloatTag("1", (float) this.pitch)) - ); - - this.namedTag.putFloat("FallDistance", this.fallDistance); - this.namedTag.putShort("Fire", this.fireTicks); - this.namedTag.putShort("Air", this.airTicks); - this.namedTag.putBoolean("OnGround", this.onGround); - this.namedTag.putBoolean("Invulnerable", this.invulnerable); - this.namedTag.putFloat("Scale", this.scale); - - if (!this.effects.isEmpty()) { - ListTag list = new ListTag<>("ActiveEffects"); - for (Effect effect : this.effects.values()) { - list.add(new CompoundTag(String.valueOf(effect.getId())) - .putByte("Id", effect.getId()) - .putByte("Amplifier", effect.getAmplifier()) - .putInt("Duration", effect.getDuration()) - .putBoolean("Ambient", false) - .putBoolean("ShowParticles", effect.isVisible()) - ); - } - - this.namedTag.putList(list); - } else { - this.namedTag.remove("ActiveEffects"); - } - } - - public String getName() { - if (this.hasCustomName()) { - return this.getNameTag(); - } else { - return this.getSaveId(); - } - } - - public final String getSaveId() { - return shortNames.getOrDefault(this.getClass().getSimpleName(), ""); - } - - public void spawnTo(Player player) { - if (!init || !initEntity) { - this.server.getLogger().warning("(BUG) Spawned an entity that is not initialized yet: " + this.getName() + " (" + this.id + ')'); - } - - if (!this.hasSpawned.containsKey(player.getLoaderId()) && player.usedChunks.containsKey(Level.chunkHash(this.chunk.getX(), this.chunk.getZ()))) { - player.dataPacket(createAddEntityPacket()); - this.hasSpawned.put(player.getLoaderId(), player); - - if (this.riding != null) { - this.riding.spawnTo(player); - - SetEntityLinkPacket pkk = new SetEntityLinkPacket(); - pkk.vehicleUniqueId = this.riding.id; - pkk.riderUniqueId = this.id; - pkk.type = 1; - pkk.immediate = 1; - - player.dataPacket(pkk); - } - - if (this.server.vanillaBossBar && this instanceof EntityBoss) { - BossEventPacket pkBoss = new BossEventPacket(); - pkBoss.bossEid = this.id; - pkBoss.type = BossEventPacket.TYPE_SHOW; - pkBoss.title = this.getName(); - pkBoss.healthPercent = player.protocol >= 361 ? this.health / 100 : this.health; - player.dataPacket(pkBoss); - } - } - } - - protected DataPacket createAddEntityPacket() { - AddEntityPacket addEntity = new AddEntityPacket(); - addEntity.type = this.getNetworkId(); - addEntity.entityUniqueId = this.id; - addEntity.entityRuntimeId = this.id; - addEntity.yaw = (float) this.yaw; - addEntity.headYaw = (float) this.yaw; - addEntity.pitch = (float) this.pitch; - addEntity.x = (float) this.x; - addEntity.y = (float) this.y; - addEntity.z = (float) this.z; - addEntity.speedX = (float) this.motionX; - addEntity.speedY = (float) this.motionY; - addEntity.speedZ = (float) this.motionZ; - addEntity.metadata = this.dataProperties.clone(); - - addEntity.links = new EntityLink[this.passengers.size()]; - for (int i = 0; i < addEntity.links.length; i++) { - addEntity.links[i] = new EntityLink(this.id, this.passengers.get(i).id, i == 0 ? EntityLink.TYPE_RIDER : TYPE_PASSENGER, false, false); - } - - return addEntity; - } - - public Map getViewers() { - return hasSpawned; - } - - public void sendPotionEffects(Player player) { - for (Effect effect : this.effects.values()) { - MobEffectPacket pk = new MobEffectPacket(); - pk.eid = this.id; - pk.effectId = effect.getId(); - pk.amplifier = effect.getAmplifier(); - pk.particles = effect.isVisible(); - pk.duration = effect.getDuration(); - pk.eventId = MobEffectPacket.EVENT_ADD; - - player.dataPacket(pk); - } - } - - public void sendData(Player player) { - this.sendData(player, null); - } - - public void sendData(Player player, EntityMetadata data) { - SetEntityDataPacket pk = new SetEntityDataPacket(); - pk.eid = this.id; - pk.metadata = data == null ? this.dataProperties.clone() : data; - - //player.dataPacket(pk); - player.batchDataPacket(pk); - } - - public void sendData(Player[] players) { - this.sendData(players, null); - } - - public void sendData(Player[] players, EntityMetadata data) { - SetEntityDataPacket pk = new SetEntityDataPacket(); - pk.eid = this.id; - //pk.metadata = data == null ? this.dataProperties : data; - - for (Player player : players) { - if (player == this) { - continue; - } - pk.metadata = data == null ? this.dataProperties.clone() : data; - //player.dataPacket(pk/*.clone()*/); - player.batchDataPacket(pk.clone()); - } - if (this.isPlayer) { - pk.metadata = data == null ? this.dataProperties.clone() : data; - //((Player) this).dataPacket(pk); - ((Player) this).batchDataPacket(pk); - } - } - - public void despawnFrom(Player player) { - if (this.hasSpawned.containsKey(player.getLoaderId())) { - RemoveEntityPacket pk = new RemoveEntityPacket(); - pk.eid = this.id; - player.dataPacket(pk); - this.hasSpawned.remove(player.getLoaderId()); - } - } - - public boolean attack(EntityDamageEvent source) { - if (hasEffect(Effect.FIRE_RESISTANCE) - && (source.getCause() == DamageCause.FIRE - || source.getCause() == DamageCause.FIRE_TICK - || source.getCause() == DamageCause.LAVA)) { - return false; - } - - server.getPluginManager().callEvent(source); - if (source.isCancelled()) { - return false; - } - - if (source instanceof EntityDamageByEntityEvent) { - // Make fire aspect to set the target in fire before dealing any damage so the target is in fire on death even if killed by the first hit - Enchantment[] enchantments = ((EntityDamageByEntityEvent) source).getWeaponEnchantments(); - if (enchantments != null) { - for (Enchantment enchantment : enchantments) { - enchantment.doAttack(((EntityDamageByEntityEvent) source).getDamager(), this); - } - } - - // Wolf targets - if (source.getEntity() instanceof Player) { - for (Entity entity : source.getEntity().getLevel().getNearbyEntities(source.getEntity().getBoundingBox().grow(17, 17, 17), source.getEntity())) { - if (entity instanceof EntityWolf) { - if (((EntityWolf) entity).hasOwner()) { - ((EntityWolf) entity).isAngryTo = ((EntityDamageByEntityEvent) source).getDamager().getId(); - ((EntityWolf) entity).setAngry(true); - } - } - } - } else if (((EntityDamageByEntityEvent) source).getDamager() instanceof Player) { - for (Entity entity : ((EntityDamageByEntityEvent) source).getDamager().getLevel().getNearbyEntities(((EntityDamageByEntityEvent) source).getDamager().getBoundingBox().grow(17, 17, 17), ((EntityDamageByEntityEvent) source).getDamager())) { - if (entity.getId() != source.getEntity().getId()) { - if (entity instanceof EntityWolf) { - if (((EntityWolf) entity).hasOwner()) { - if (((EntityWolf) entity).getOwner().equals(((EntityDamageByEntityEvent) source).getDamager())) { - ((EntityWolf) entity).isAngryTo = source.getEntity().getId(); - ((EntityWolf) entity).setAngry(true); - } - } - } - } - } - } - } - - if (this.absorption > 0) { // Damage Absorption - this.setAbsorption(Math.max(0, this.absorption + source.getDamage(EntityDamageEvent.DamageModifier.ABSORPTION))); - } - setLastDamageCause(source); - float newHealth = health - source.getFinalDamage(); - if (newHealth < 1 && this.isPlayer) { - if (source.getCause() != DamageCause.VOID && source.getCause() != DamageCause.SUICIDE) { - Player p = (Player) this; - boolean totem = false; - if (p.getOffhandInventory().getItemFast(0).getId() == ItemID.TOTEM) { - p.getOffhandInventory().clear(0); - totem = true; - } else if (p.getInventory().getItemInHandFast().getId() == ItemID.TOTEM) { - p.getInventory().clear(p.getInventory().getHeldItemIndex()); - totem = true; - } - if (totem) { - this.getLevel().addLevelEvent(this, LevelEventPacket.EVENT_SOUND_TOTEM); - this.getLevel().addParticleEffect(this, ParticleEffect.TOTEM); - - this.extinguish(); - this.removeAllEffects(); - this.setHealth(1); - - this.addEffect(Effect.getEffect(Effect.REGENERATION).setDuration(800).setAmplifier(1)); - this.addEffect(Effect.getEffect(Effect.FIRE_RESISTANCE).setDuration(800)); - this.addEffect(Effect.getEffect(Effect.ABSORPTION).setDuration(100).setAmplifier(1)); - - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.CONSUME_TOTEM; - p.dataPacket(pk); - - source.setCancelled(true); - return false; - } - } - } - setHealth(newHealth); - return true; - } - - public boolean attack(float damage) { - return this.attack(new EntityDamageEvent(this, DamageCause.CUSTOM, damage)); - } - - public void heal(EntityRegainHealthEvent source) { - this.server.getPluginManager().callEvent(source); - if (source.isCancelled()) { - return; - } - this.setHealth(this.health + source.getAmount()); - } - - public void heal(float amount) { - this.heal(new EntityRegainHealthEvent(this, amount, EntityRegainHealthEvent.CAUSE_REGEN)); - } - - public float getHealth() { - return health; - } - - public boolean isAlive() { - return this.health >= 1; - } - - public boolean isClosed() { - return closed; - } - - public void setHealth(float health) { - if (this.health == health) { - return; - } - - if (health < 1) { - if (this.isAlive()) { - this.kill(); - } - } else if (health <= this.getMaxHealth() || health < this.health) { - this.health = health; - } else { - this.health = this.getMaxHealth(); - } - - setDataProperty(new IntEntityData(DATA_HEALTH, (int) this.health), this.isPlayer || this instanceof EntityRideable); - } - - public void setLastDamageCause(EntityDamageEvent type) { - this.lastDamageCause = type; - } - - public EntityDamageEvent getLastDamageCause() { - return lastDamageCause; - } - - public int getMaxHealth() { - return maxHealth + (this.hasEffect(Effect.HEALTH_BOOST) ? (this.getEffect(Effect.HEALTH_BOOST).getAmplifier() + 1) << 2 : 0); - } - - public void setMaxHealth(int maxHealth) { - this.maxHealth = maxHealth; - } - - public boolean canCollideWith(Entity entity) { - return !this.justCreated && this != entity; - } - - protected boolean checkObstruction(double x, double y, double z) { - if (this.level.getCollisionCubes(this, this.boundingBox, false).length == 0) { - return false; - } - - int i = NukkitMath.floorDouble(x); - int j = NukkitMath.floorDouble(y); - int k = NukkitMath.floorDouble(z); - - double diffX = x - i; - double diffY = y - j; - double diffZ = z - k; - - if (!Block.transparent[this.level.getBlockIdAt(i, j, k)]) { - boolean flag = Block.transparent[this.level.getBlockIdAt(i - 1, j, k)]; - boolean flag1 = Block.transparent[this.level.getBlockIdAt(i + 1, j, k)]; - boolean flag2 = Block.transparent[this.level.getBlockIdAt(i, j - 1, k)]; - boolean flag3 = Block.transparent[this.level.getBlockIdAt(i, j + 1, k)]; - boolean flag4 = Block.transparent[this.level.getBlockIdAt(i, j, k - 1)]; - boolean flag5 = Block.transparent[this.level.getBlockIdAt(i, j, k + 1)]; - - int direction = -1; - double limit = 9999; - - if (flag) { - limit = diffX; - direction = 0; - } - - if (flag1 && 1 - diffX < limit) { - limit = 1 - diffX; - direction = 1; - } - - if (flag2 && diffY < limit) { - limit = diffY; - direction = 2; - } - - if (flag3 && 1 - diffY < limit) { - limit = 1 - diffY; - direction = 3; - } - - if (flag4 && diffZ < limit) { - limit = diffZ; - direction = 4; - } - - if (flag5 && 1 - diffZ < limit) { - direction = 5; - } - - double force = Utils.random.nextDouble() * 0.2 + 0.1; - - if (direction == 0) { - this.motionX = -force; - - return true; - } - - if (direction == 1) { - this.motionX = force; - - return true; - } - - if (direction == 2) { - this.motionY = -force; - - return true; - } - - if (direction == 3) { - this.motionY = force; - - return true; - } - - if (direction == 4) { - this.motionZ = -force; - - return true; - } - - if (direction == 5) { - this.motionZ = force; - - return true; - } - } - - return false; - } - - public boolean entityBaseTick() { - return this.entityBaseTick(1); - } - - public boolean entityBaseTick(int tickDiff) { - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.startTiming(); - - if (!this.isPlayer) { - //this.blocksAround = null; // Use only when entity moves for better performance - this.collisionBlocks = null; - } - - this.justCreated = false; - - if (!this.isAlive()) { - //this.removeAllEffects(); // Why to remove them if the entity is dead anyways? - this.despawnFromAll(); - if (!this.isPlayer) { - this.close(); - } - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.stopTiming(); - return false; - } - /*if (riding != null && !riding.isAlive() && riding instanceof EntityRideable) { - ((EntityRideable) riding).mountEntity(this); - }*/ - - updatePassengers(); - - if (!this.effects.isEmpty()) { - for (Effect effect : this.effects.values()) { - if (effect.canTick()) { - effect.applyEffect(this); - } - effect.setDuration(effect.getDuration() - tickDiff); - - if (effect.getDuration() <= 0) { - this.removeEffect(effect.getId()); - } - } - } - - boolean hasUpdate = false; - - this.checkBlockCollision(); - - if (this.y <= -16 && this.isAlive()) { - if (this.isPlayer) { - if (((Player) this).getGamemode() != Player.CREATIVE) this.attack(new EntityDamageEvent(this, DamageCause.VOID, 10)); - } else { - this.attack(new EntityDamageEvent(this, DamageCause.VOID, 10)); - hasUpdate = true; - } - } - - if (this.fireTicks > 0) { - if (this.fireProof) { - this.fireTicks -= tickDiff << 2; - if (this.fireTicks < 0) { - this.fireTicks = 0; - } - } else { - if (!this.hasEffect(Effect.FIRE_RESISTANCE) && ((this.fireTicks % 20) == 0 || tickDiff > 20)) { - this.attack(new EntityDamageEvent(this, DamageCause.FIRE_TICK, 1)); - } - this.fireTicks -= tickDiff; - } - if (this.fireTicks <= 0) { - this.extinguish(); - } else if (!this.fireProof && (!this.isPlayer || !((Player) this).isSpectator())) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ONFIRE, true); - hasUpdate = true; - } - } - - if (this.noDamageTicks > 0) { - this.noDamageTicks -= tickDiff; - if (this.noDamageTicks < 0) { - this.noDamageTicks = 0; - } - } - - if (this.inPortalTicks == 80 && Server.getInstance().isNetherAllowed() && this instanceof BaseEntity) { - EntityPortalEnterEvent ev = new EntityPortalEnterEvent(this, EntityPortalEnterEvent.PortalType.NETHER); - this.server.getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - if (this.getLevel().getDimension() == Level.DIMENSION_NETHER) { - this.switchLevel(server.getDefaultLevel()); - } else { - this.switchLevel(server.getNetherWorld(this.level.getName())); - } - } - } - - this.age += tickDiff; - this.ticksLived += tickDiff; - TimingsHistory.activatedEntityTicks++; - - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.stopTiming(); - return hasUpdate; - } - - public void updateMovement() { - double diffPosition = (this.x - this.lastX) * (this.x - this.lastX) + (this.y - this.lastY) * (this.y - this.lastY) + (this.z - this.lastZ) * (this.z - this.lastZ); - double diffRotation = (this.yaw - this.lastYaw) * (this.yaw - this.lastYaw) + (this.pitch - this.lastPitch) * (this.pitch - this.lastPitch); - - double diffMotion = (this.motionX - this.lastMotionX) * (this.motionX - this.lastMotionX) + (this.motionY - this.lastMotionY) * (this.motionY - this.lastMotionY) + (this.motionZ - this.lastMotionZ) * (this.motionZ - this.lastMotionZ); - - if (diffPosition > 0.0001 || diffRotation > 1.0) { //0.2 ** 2, 1.5 ** 2 - this.lastX = this.x; - this.lastY = this.y; - this.lastZ = this.z; - - this.lastYaw = this.yaw; - this.lastPitch = this.pitch; - this.lastHeadYaw = this.headYaw; - - this.addMovement(this.x, this.y + this.getBaseOffset(), this.z, this.yaw, this.pitch, this.yaw); - } - - if (diffMotion > 0.0025 || (diffMotion > 0.0001 && this.getMotion().lengthSquared() <= 0.0001)) { //0.05 ** 2 - this.lastMotionX = this.motionX; - this.lastMotionY = this.motionY; - this.lastMotionZ = this.motionZ; - - this.addMotion(this.motionX, this.motionY, this.motionZ); - } - } - - public void addMovement(double x, double y, double z, double yaw, double pitch, double headYaw) { - this.level.addEntityMovement(this, x, y, z, yaw, pitch, headYaw); - } - - public void addMotion(double motionX, double motionY, double motionZ) { - SetEntityMotionPacket pk = new SetEntityMotionPacket(); - pk.eid = this.id; - pk.motionX = (float) motionX; - pk.motionY = (float) motionY; - pk.motionZ = (float) motionZ; - for (Player p : this.hasSpawned.values()) { - p.batchDataPacket(pk); // Server.broadcastPacket would only use batching for >= 1.16.100 - } - } - - public Vector3 getDirectionVector() { - Vector3 vector = super.getDirectionVector(); - return this.temporalVector.setComponents(vector.x, vector.y, vector.z); - } - - public Vector2 getDirectionPlane() { - return (new Vector2((float) (-Math.cos(FastMath.toRadians(this.yaw) - 1.5707963267948966)), (float) (-Math.sin(FastMath.toRadians(this.yaw) - 1.5707963267948966)))).normalize(); - } - - public BlockFace getHorizontalFacing() { - return BlockFace.fromHorizontalIndex(NukkitMath.floorDouble((this.yaw * 4.0F / 360.0F) + 0.5D) & 3); - } - - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (!this.isAlive()) { - ++this.deadTicks; - if (this.deadTicks >= 10) { - this.despawnFromAll(); - if (!this.isPlayer) { - this.close(); - } - } - return this.deadTicks < 10; - } - - int tickDiff = currentTick - this.lastUpdate; - - if (tickDiff <= 0) { - return false; - } - - this.lastUpdate = currentTick; - - boolean hasUpdate = this.entityBaseTick(tickDiff); - - this.updateMovement(); - - /*if (server.vanillaBB && this instanceof EntityBoss && currentTick % 100 == 0) { //TODO: Figure out why doesn't the boss bar length change - for (Player p : this.hasSpawned.values()) { - BossEventPacket pkBoss = new BossEventPacket(); - pkBoss.bossEid = this.id; - pkBoss.type = BossEventPacket.TYPE_HEALTH_PERCENT; - pkBoss.title = this.getName(); - pkBoss.healthPercent = p.protocol >= 361 ? this.health / 100 : this.health; - p.dataPacket(pkBoss); - } - }*/ - - return hasUpdate; - } - - public boolean mountEntity(Entity entity) { - return mountEntity(entity, TYPE_RIDE); - } - - /** - * Mount or Dismounts an Entity from a/into vehicle - * - * @param entity The target Entity - * @return {@code true} if the mounting successful - */ - public boolean mountEntity(Entity entity, byte mode) { - Objects.requireNonNull(entity, "The target of the mounting entity can't be null"); - - if (entity.riding != null) { - dismountEntity(entity); - } else { - if (isPassenger(entity)) { - return false; - } - // Entity entering a vehicle - EntityVehicleEnterEvent ev = new EntityVehicleEnterEvent(entity, (EntityVehicle) this); - server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - broadcastLinkPacket(entity, mode); - - // Add variables to entity - entity.riding = this; - entity.setDataFlag(DATA_FLAGS, DATA_FLAG_RIDING, true); - passengers.add(entity); - - entity.setSeatPosition(getMountedOffset(entity)); - updatePassengerPosition(entity); - } - return true; - } - - public boolean dismountEntity(Entity entity) { - if (this instanceof EntityVehicle) { - // Run the events - EntityVehicleExitEvent ev = new EntityVehicleExitEvent(entity, (EntityVehicle) this); - server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - } - - broadcastLinkPacket(entity, TYPE_REMOVE); - - // Refurbish the entity - entity.riding = null; - entity.setDataFlag(DATA_FLAGS, DATA_FLAG_RIDING, false); - passengers.remove(entity); - - entity.setSeatPosition(new Vector3f()); - updatePassengerPosition(entity); - - // Avoid issues with anti fly - entity.resetFallDistance(); - return true; - } - - protected void broadcastLinkPacket(Entity rider, byte type) { - SetEntityLinkPacket pk = new SetEntityLinkPacket(); - pk.vehicleUniqueId = id; // To the? - pk.riderUniqueId = rider.id; // From who? - pk.type = type; - - Server.broadcastPacket(this.hasSpawned.values(), pk); - } - - public void updatePassengers() { - if (this.passengers.isEmpty()) { - return; - } - - for (Entity passenger : new ArrayList<>(this.passengers)) { - if (!passenger.isAlive()) { - dismountEntity(passenger); - continue; - } - - updatePassengerPosition(passenger); - } - } - - protected void updatePassengerPosition(Entity passenger) { - passenger.setPosition(this.add(passenger.getSeatPosition().asVector3())); - } - - public void setSeatPosition(Vector3f pos) { - this.setDataProperty(new Vector3fEntityData(DATA_RIDER_SEAT_POSITION, pos)); - } - - public Vector3f getSeatPosition() { - return this.getDataPropertyVector3f(DATA_RIDER_SEAT_POSITION); - } - - public Vector3f getMountedOffset(Entity entity) { - return new Vector3f(0, getHeight() * 0.75f); - } - - public final void scheduleUpdate() { - this.level.updateEntities.put(this.id, this); - } - - public boolean isOnFire() { - return this.fireTicks > 0; - } - - public void setOnFire(int seconds) { - int ticks = seconds * 20; - if (ticks > this.fireTicks) { - this.fireTicks = ticks; - } - } - - public float getAbsorption() { - return absorption; - } - - public void setAbsorption(float absorption) { - if (absorption != this.absorption) { - this.absorption = absorption; - if (this.isPlayer) ((Player) this).setAttribute(Attribute.getAttribute(Attribute.ABSORPTION).setValue(absorption)); - } - } - - public BlockFace getDirection() { - double rotation = this.yaw % 360; - if (rotation < 0) { - rotation += 360.0; - } - if ((0 <= rotation && rotation < 45) || (315 <= rotation && rotation < 360)) { - return BlockFace.SOUTH; - } else if (45 <= rotation && rotation < 135) { - return BlockFace.WEST; - } else if (135 <= rotation && rotation < 225) { - return BlockFace.NORTH; - } else if (225 <= rotation && rotation < 315) { - return BlockFace.EAST; - } else { - return null; - } - } - - public void extinguish() { - this.fireTicks = 0; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ONFIRE, false); - } - - public boolean canTriggerWalking() { - return true; - } - - public void resetFallDistance() { - this.highestPosition = this.y; - } - - protected void updateFallState(boolean onGround) { - if (onGround) { - fallDistance = (float) (this.highestPosition - this.y); - - if (fallDistance > 0) { - // check if we fell into at least 1 block of water - if (this instanceof EntityLiving && !(this.getLevelBlock() instanceof BlockWater) && !(this instanceof EntityFlying)) { - this.fall(fallDistance); - } - this.resetFallDistance(); - } - } - } - - public AxisAlignedBB getBoundingBox() { - return this.boundingBox; - } - - public void fall(float fallDistance) { - if (fallDistance > 0.75) { - if (!this.hasEffect(Effect.SLOW_FALLING)) { - float damage = (float) Math.floor(fallDistance - 3 - (this.hasEffect(Effect.JUMP) ? this.getEffect(Effect.JUMP).getAmplifier() + 1 : 0)); - - Block down = this.level.getBlock(this.floor().down()); - if (down.getId() == BlockID.HAY_BALE) { - damage -= (damage * 0.8f); - } - - if (damage > 0) { - if (!this.isPlayer || level.getGameRules().getBoolean(GameRule.FALL_DAMAGE)) { - this.attack(new EntityDamageEvent(this, DamageCause.FALL, damage)); - } - } - - if (down.getId() == BlockID.FARMLAND) { - Event ev; - - if (this.isPlayer) { - ev = new PlayerInteractEvent((Player) this, null, down, null, Action.PHYSICAL); - } else { - ev = new EntityInteractEvent(this, down); - } - - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return; - } - this.level.setBlock(down, Block.get(BlockID.DIRT), true, true); - } - } - } - } - - public void moveFlying(float strafe, float forward, float friction) { - // This is special for Nukkit! :) - float speed = strafe * strafe + forward * forward; - if (speed >= 1.0E-4F) { - speed = MathHelper.sqrt(speed); - if (speed < 1.0F) { - speed = 1.0F; - } - speed = friction / speed; - strafe *= speed; - forward *= speed; - float nest = MathHelper.sin((float) (this.yaw * 3.1415927F / 180.0F)); - float place = MathHelper.cos((float) (this.yaw * 3.1415927F / 180.0F)); - this.motionX += strafe * place - forward * nest; - this.motionZ += forward * place + strafe * nest; - } - } - - public void applyEntityCollision(Entity entity) { - if (entity.riding != this && !entity.passengers.contains(this)) { - double dx = entity.x - this.x; - double dy = entity.z - this.z; - double dz = NukkitMath.getDirection(dx, dy); - - if (dz >= 0.009999999776482582D) { - dz = MathHelper.sqrt((float) dz); - dx /= dz; - dy /= dz; - double d3 = 1.0D / dz; - - if (d3 > 1.0D) { - d3 = 1.0D; - } - - dx *= d3; - dy *= d3; - dx *= 0.05000000074505806; - dy *= 0.05000000074505806; - dx *= 1F + entityCollisionReduction; - if (this.riding == null) { - motionX -= dx; - motionZ -= dy; - } - } - } - } - - public void onStruckByLightning(Entity entity) { - if (this.attack(new EntityDamageByEntityEvent(entity, this, DamageCause.LIGHTNING, 5))) { - if (this.fireTicks < 160) { - this.setOnFire(8); - } - - if (this instanceof EntityCreeper) { - ((EntityCreeper) this).setPowered(true); - } - } - } - - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - return onInteract(player, item); - } - - public boolean onInteract(Player player, Item item) { - return false; - } - - protected boolean switchLevel(Level targetLevel) { - if (this.closed) { - return false; - } - - if (this.isValid()) { - EntityLevelChangeEvent ev = new EntityLevelChangeEvent(this, this.level, targetLevel); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - - this.level.removeEntity(this); - if (this.chunk != null) { - this.chunk.removeEntity(this); - } - this.despawnFromAll(); - - if (this.isPlayer) { - this.preSwitchLevel(); - } - } - - this.setLevel(targetLevel); - this.level.addEntity(this); - this.chunk = null; - - if (this.isPlayer) { - this.afterSwitchLevel(); - } - return true; - } - - protected void preSwitchLevel() { - // Override in Player - } - - protected void afterSwitchLevel() { - // Override in Player - } - - public Position getPosition() { - return new Position(this.x, this.y, this.z, this.level); - } - - public Location getLocation() { - return new Location(this.x, this.y, this.z, this.yaw, this.pitch, this.headYaw, this.level); - } - - public boolean isSubmerged() { - double y = this.y + this.getBreathableHeight(); - Block block = this.level.getBlock(this.temporalVector.setComponents(NukkitMath.floorDouble(this.x), NukkitMath.floorDouble(y), NukkitMath.floorDouble(this.z))); - - if (block instanceof BlockWater) { - return y < (block.y + 0.9); - } - - return false; - } - - public boolean isInsideOfWater() { - /*Block block = this.level.getBlock(this.temporalVector.setComponents(NukkitMath.floorDouble(this.x), NukkitMath.floorDouble(this.y), NukkitMath.floorDouble(this.z))); - - if (block instanceof BlockWater) { - return this.y < (block.y + 0.9); - } - - return false;*/ - int bid = level.getBlockIdAt(chunk, this.getFloorX(), this.getFloorY(), this.getFloorZ()); - return bid == BlockID.WATER || bid == BlockID.STILL_WATER; - } - - public boolean isInsideOfSolid() { - double y = this.y + this.getBreathableHeight(); - Block block = this.level.getBlock( - this.temporalVector.setComponents( - NukkitMath.floorDouble(this.x), - NukkitMath.floorDouble(y), - NukkitMath.floorDouble(this.z)) - ); - - AxisAlignedBB bb = block.getBoundingBox(); - - return bb != null && block.isSolid() && !block.isTransparent() && bb.intersectsWith(this.boundingBox) && !(block instanceof BlockSlab); // The instanceof BlockSlab check is a hack to fix issues with the solid slab hack - } - - public boolean isInsideOfFire() { - for (Block block : this.getCollisionBlocks()) { - if (block instanceof BlockFire) { - return true; - } - } - - return false; - } - - public boolean fastMove(double dx, double dy, double dz) { - if (!this.isPlayer) { - this.blocksAround = null; - } - - if (dx == 0 && dy == 0 && dz == 0) { - return true; - } - - if (Timings.entityMoveTimer != null) Timings.entityMoveTimer.startTiming(); - - AxisAlignedBB newBB = this.boundingBox.getOffsetBoundingBox(dx, dy, dz); - - if (server.getAllowFlight() || !this.level.hasCollision(this, newBB, false)) { - this.boundingBox = newBB; - } - - this.x = (this.boundingBox.minX + this.boundingBox.maxX) / 2; - this.y = this.boundingBox.minY - this.ySize; - this.z = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2; - - this.checkChunks(); - - if (!this.onGround || dy != 0) { - AxisAlignedBB bb = this.boundingBox.growNoUp(0.1, 0.1, 0.1); - bb.minY -= 0.75; - - this.onGround = this.level.hasCollisionBlocks(bb); - } - this.isCollided = this.onGround; - this.updateFallState(this.onGround); - if (Timings.entityMoveTimer != null) Timings.entityMoveTimer.stopTiming(); - return true; - } - - public boolean move(double dx, double dy, double dz) { - if (dx == 0 && dz == 0 && dy == 0) { - return false; - } - - if (!this.isPlayer) { - this.blocksAround = null; - } - - if (this.keepMovement) { - this.boundingBox.offset(dx, dy, dz); - this.setPosition(this.temporalVector.setComponents((this.boundingBox.minX + this.boundingBox.maxX) / 2, this.boundingBox.minY, (this.boundingBox.minZ + this.boundingBox.maxZ) / 2)); - this.onGround = this.isPlayer; - return true; - } else { - if (Timings.entityMoveTimer != null) Timings.entityMoveTimer.startTiming(); - - this.ySize *= STEP_CLIP_MULTIPLIER; - - double movX = dx; - double movY = dy; - double movZ = dz; - - AxisAlignedBB axisalignedbb = this.boundingBox.clone(); - - AxisAlignedBB[] list = this.level.getCollisionCubes(this, this.boundingBox.addCoord(dx, dy, dz), false); - - for (AxisAlignedBB bb : list) { - dy = bb.calculateYOffset(this.boundingBox, dy); - } - - this.boundingBox.offset(0, dy, 0); - - boolean fallingFlag = (this.onGround || (dy != movY && movY < 0)); - - for (AxisAlignedBB bb : list) { - dx = bb.calculateXOffset(this.boundingBox, dx); - } - - this.boundingBox.offset(dx, 0, 0); - - for (AxisAlignedBB bb : list) { - dz = bb.calculateZOffset(this.boundingBox, dz); - } - - this.boundingBox.offset(0, 0, dz); - - if (this.getStepHeight() > 0 && fallingFlag && (movX != dx || movZ != dz)) { - double cx = dx; - double cy = dy; - double cz = dz; - dx = movX; - dy = this.getStepHeight(); - dz = movZ; - - AxisAlignedBB axisalignedbb1 = this.boundingBox.clone(); - - this.boundingBox.setBB(axisalignedbb); - - list = this.level.getCollisionCubes(this, this.boundingBox.addCoord(dx, dy, dz), false); - - for (AxisAlignedBB bb : list) { - dy = bb.calculateYOffset(this.boundingBox, dy); - } - - this.boundingBox.offset(0, dy, 0); - - for (AxisAlignedBB bb : list) { - dx = bb.calculateXOffset(this.boundingBox, dx); - } - - this.boundingBox.offset(dx, 0, 0); - - for (AxisAlignedBB bb : list) { - dz = bb.calculateZOffset(this.boundingBox, dz); - } - - this.boundingBox.offset(0, 0, dz); - - double reverseDY = -dy; - for (AxisAlignedBB bb : list) { - reverseDY = bb.calculateYOffset(this.boundingBox, reverseDY); - } - dy += reverseDY; - this.boundingBox.offset(0, reverseDY, 0); - - if ((cx * cx + cz * cz) >= (dx * dx + dz * dz)) { - dx = cx; - dy = cy; - dz = cz; - this.boundingBox.setBB(axisalignedbb1); - } else { - this.ySize += dy; - } - } - - this.x = (this.boundingBox.minX + this.boundingBox.maxX) / 2; - this.y = this.boundingBox.minY - this.ySize; - this.z = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2; - - this.checkChunks(); - - this.checkGroundState(movX, movY, movZ, dx, dy, dz); - this.updateFallState(this.onGround); - - if (movX != dx) { - this.motionX = 0; - } - - if (movY != dy) { - this.motionY = 0; - } - - if (movZ != dz) { - this.motionZ = 0; - } - - if (Timings.entityMoveTimer != null) Timings.entityMoveTimer.stopTiming(); - return true; - } - } - - protected void checkGroundState(double movX, double movY, double movZ, double dx, double dy, double dz) { - this.isCollidedVertically = movY != dy; - this.isCollidedHorizontally = (movX != dx || movZ != dz); - this.isCollided = (this.isCollidedHorizontally || this.isCollidedVertically); - this.onGround = (movY != dy && movY < 0); - } - - public List getBlocksAround() { - if (this.blocksAround == null) { - int minX = NukkitMath.floorDouble(this.boundingBox.minX); - int minY = NukkitMath.floorDouble(this.boundingBox.minY); - int minZ = NukkitMath.floorDouble(this.boundingBox.minZ); - int maxX = NukkitMath.ceilDouble(this.boundingBox.maxX); - int maxY = NukkitMath.ceilDouble(this.boundingBox.maxY); - int maxZ = NukkitMath.ceilDouble(this.boundingBox.maxZ); - - this.blocksAround = new ArrayList<>(); - - for (int z = minZ; z <= maxZ; ++z) { - for (int x = minX; x <= maxX; ++x) { - for (int y = minY; y <= maxY; ++y) { - Block block = this.level.getBlock(x, y, z, false); - this.blocksAround.add(block); - } - } - } - } - - return this.blocksAround; - } - - public List getCollisionBlocks() { - if (this.collisionBlocks == null) { - this.collisionBlocks = new ArrayList<>(); - - List bl = this.getBlocksAround(); - for (Block b : bl) { - if (b.collidesWithBB(this.boundingBox, true)) { - this.collisionBlocks.add(b); - } - } - } - - return this.collisionBlocks; - } - - /** - * Returns whether this entity can be moved by currents in liquids. - * - * @return boolean - */ - public boolean canBeMovedByCurrents() { - return true; - } - - protected void checkBlockCollision() { - Vector3 vector = new Vector3(0, 0, 0); - boolean portal = false; - - for (Block block : this.getCollisionBlocks()) { - if (block.getId() == Block.NETHER_PORTAL) { - portal = true; - continue; - } - - block.onEntityCollide(this); - block.addVelocityToEntity(this, vector); - } - - if (portal) { - inPortalTicks++; - } else { - this.inPortalTicks = 0; - } - - if (vector.lengthSquared() > 0) { - vector = vector.normalize(); - double d = 0.014d; - this.motionX += vector.x * d; - this.motionY += vector.y * d; - this.motionZ += vector.z * d; - } - } - - public boolean setPositionAndRotation(Vector3 pos, double yaw, double pitch) { - return this.setPositionAndRotation(pos, yaw, pitch, yaw); - } - - public boolean setPositionAndRotation(Vector3 pos, double yaw, double pitch, double headYaw) { - if (this.setPosition(pos)) { - this.setRotation(yaw, pitch, headYaw); - return true; - } - - return false; - } - - public void setRotation(double yaw, double pitch) { - this.setRotation(yaw, pitch, yaw); - } - - public void setRotation(double yaw, double pitch, double headYaw) { - this.yaw = yaw; - this.pitch = pitch; - this.headYaw = headYaw; - this.scheduleUpdate(); - } - - /** - * Whether the entity can active pressure plates. - * Used for {@link cn.nukkit.entity.passive.EntityBat}s only. - * - * @return triggers pressure plate - */ - public boolean doesTriggerPressurePlate() { - return true; - } - - public boolean canPassThrough() { - return true; - } - - protected void checkChunks() { - int cx = (int) this.x >> 4; - int cz = (int) this.z >> 4; - if (this.chunk == null || (this.chunk.getX() != cx) || this.chunk.getZ() != cz) { - if (this.chunk != null) { - this.chunk.removeEntity(this); - } - this.chunk = this.level.getChunk(cx, cz, true); - - if (!this.justCreated) { - Map newChunk = this.level.getChunkPlayers(cx, cz); - for (Player player : new ArrayList<>(this.hasSpawned.values())) { - if (!newChunk.containsKey(player.getLoaderId())) { - this.despawnFrom(player); - } else { - newChunk.remove(player.getLoaderId()); - } - } - - for (Player player : newChunk.values()) { - this.spawnTo(player); - } - } - - if (this.chunk == null) { - return; - } - - this.chunk.addEntity(this); - } - } - - public boolean setPosition(Vector3 pos) { - if (this.closed) { - return false; - } - - if (pos instanceof Position) { - Level oldLevel = this.level; - Level newLevel = ((Position) pos).level; - - if (newLevel != null && newLevel != oldLevel) { - if (!this.switchLevel(newLevel)) { - return false; - } - - this.x = pos.x; - this.y = pos.y; - this.z = pos.z; - - // Dimension change - if (this.isPlayer && this.server.dimensionsEnabled && newLevel.getDimension() != oldLevel.getDimension()) { - ((Player) this).setDimension(newLevel.getDimension()); - } - } else { - this.x = pos.x; - this.y = pos.y; - this.z = pos.z; - } - } else { - this.x = pos.x; - this.y = pos.y; - this.z = pos.z; - } - - this.recalculateBoundingBox(); - - if (!this.isPlayer) { - this.blocksAround = null; - } - - this.checkChunks(); - - return true; - } - - public Vector3 getMotion() { - return new Vector3(this.motionX, this.motionY, this.motionZ); - } - - public boolean setMotion(Vector3 motion) { - if (server.callEntityMotionEv && !this.justCreated) { - EntityMotionEvent ev = new EntityMotionEvent(this, motion); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - } - - this.motionX = motion.x; - this.motionY = motion.y; - this.motionZ = motion.z; - - if (!this.justCreated) { - this.updateMovement(); - } - - return true; - } - - public boolean isOnGround() { - return onGround; - } - - public void kill() { - this.health = 0; - this.scheduleUpdate(); - - for (Entity passenger : new ArrayList<>(this.passengers)) { - dismountEntity(passenger); - } - } - - public boolean teleport(Vector3 pos) { - return this.teleport(pos, PlayerTeleportEvent.TeleportCause.PLUGIN); - } - - public boolean teleport(Vector3 pos, PlayerTeleportEvent.TeleportCause cause) { - return this.teleport(Location.fromObject(pos, this.level, this.yaw, this.pitch, this.headYaw), cause); - } - - public boolean teleport(Position pos) { - return this.teleport(pos, PlayerTeleportEvent.TeleportCause.PLUGIN); - } - - public boolean teleport(Position pos, PlayerTeleportEvent.TeleportCause cause) { - return this.teleport(Location.fromObject(pos, pos.level, this.yaw, this.pitch, this.headYaw), cause); - } - - public boolean teleport(Location location) { - return this.teleport(location, PlayerTeleportEvent.TeleportCause.PLUGIN); - } - - public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { - double yaw = location.yaw; - double pitch = location.pitch; - - Location from = this.getLocation(); - Location to = location; - if (cause != null) { - EntityTeleportEvent ev = new EntityTeleportEvent(this, from, to); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - to = ev.getTo(); - } - - if (riding != null) { - riding.dismountEntity(this); - } - - this.ySize = 0; - - if (cause != PlayerTeleportEvent.TeleportCause.ENDER_PEARL) { - this.setMotion(this.temporalVector.setComponents(0, 0, 0)); - } - - if (this.setPositionAndRotation(to, yaw, pitch)) { - this.resetFallDistance(); - this.onGround = true; - - this.updateMovement(); - - return true; - } - - return false; - } - - public long getId() { - return this.id; - } - - public void respawnToAll() { - Collection players = new ArrayList<>(this.hasSpawned.values()); - this.hasSpawned.clear(); - - for (Player player : players) { - this.spawnTo(player); - } - } - - public void spawnToAll() { - if (this.chunk == null || this.closed) { - return; - } - - for (Player player : this.level.getChunkPlayers(this.chunk.getX(), this.chunk.getZ()).values()) { - if (player.isOnline()) { - this.spawnTo(player); - } - } - } - - public void despawnFromAll() { - for (Player player : new ArrayList<>(this.hasSpawned.values())) { - this.despawnFrom(player); - } - } - - public void close() { - if (!this.closed) { - this.closed = true; - this.server.getPluginManager().callEvent(new EntityDespawnEvent(this)); - this.despawnFromAll(); - if (this.chunk != null) { - this.chunk.removeEntity(this); - } - - if (this.level != null) { - this.level.removeEntity(this); - } - } - } - - public boolean setDataProperty(EntityData data) { - return this.setDataProperty(data, true); - } - - public boolean setDataProperty(EntityData data, boolean send) { - if (Objects.equals(data, this.dataProperties.get(data.getId()))) { - return false; - } - - this.dataProperties.put(data); - if (send) { - EntityMetadata metadata = new EntityMetadata(); - metadata.put(this.dataProperties.get(data.getId())); - if (data.getId() == DATA_FLAGS2) { - metadata.put(this.dataProperties.get(DATA_FLAGS)); - } - this.sendData(this.hasSpawned.values().toArray(new Player[0]), metadata); - } - return true; - } - - public boolean setDataPropertyAndSendOnlyToSelf(EntityData data) { - if (!Objects.equals(data, this.dataProperties.get(data.getId()))) { - this.dataProperties.put(data); - if (this.isPlayer) { - EntityMetadata d = new EntityMetadata().put(this.dataProperties.get(data.getId())); - SetEntityDataPacket pk = new SetEntityDataPacket(); - pk.eid = this.id; - pk.metadata = d == null ? this.dataProperties.clone() : d; - //((Player) this).dataPacket(pk); - ((Player) this).batchDataPacket(pk); - } - return true; - } - return false; - } - - public EntityMetadata getDataProperties() { - return this.dataProperties; - } - - public EntityData getDataProperty(int id) { - return this.dataProperties.get(id); - } - - public int getDataPropertyInt(int id) { - return this.dataProperties.getInt(id); - } - - public int getDataPropertyShort(int id) { - return this.dataProperties.getShort(id); - } - - public int getDataPropertyByte(int id) { - return this.dataProperties.getByte(id); - } - - public boolean getDataPropertyBoolean(int id) { - return this.dataProperties.getBoolean(id); - } - - public long getDataPropertyLong(int id) { - return this.dataProperties.getLong(id); - } - - public String getDataPropertyString(int id) { - return this.dataProperties.getString(id); - } - - public float getDataPropertyFloat(int id) { - return this.dataProperties.getFloat(id); - } - - public CompoundTag getDataPropertyNBT(int id) { - return this.dataProperties.getNBT(id); - } - - public Vector3 getDataPropertyPos(int id) { - return this.dataProperties.getPosition(id); - } - - public Vector3f getDataPropertyVector3f(int id) { - return this.dataProperties.getFloatPosition(id); - } - - public int getDataPropertyType(int id) { - return this.dataProperties.exists(id) ? this.getDataProperty(id).getType() : -1; - } - - public void setDataFlag(int propertyId, int id) { - this.setDataFlag(propertyId, id, true); - } - - public void setDataFlag(int propertyId, int id, boolean value) { - this.setDataFlag(propertyId, id, value, true); - } - - public void setDataFlag(int propertyId, int id, boolean value, boolean send) { - if (this.getDataFlag(propertyId, id) != value) { - if (propertyId == EntityHuman.DATA_PLAYER_FLAGS) { - byte flags = (byte) this.getDataPropertyByte(propertyId); - flags ^= 1 << id; - this.setDataProperty(new ByteEntityData(propertyId, flags), send); - } else { - long flags = this.getDataPropertyLong(propertyId); - flags ^= 1L << id; - this.setDataProperty(new LongEntityData(propertyId, flags), send); - } - } - } - - public void setDataFlagSelfOnly(int propertyId, int id, boolean value) { - if (this.getDataFlag(propertyId, id) != value) { - if (propertyId == EntityHuman.DATA_PLAYER_FLAGS) { - byte flags = (byte) this.getDataPropertyByte(propertyId); - flags ^= 1 << id; - this.setDataPropertyAndSendOnlyToSelf(new ByteEntityData(propertyId, flags)); - } else { - long flags = this.getDataPropertyLong(propertyId); - flags ^= 1L << id; - this.setDataPropertyAndSendOnlyToSelf(new LongEntityData(propertyId, flags)); - } - } - } - - public boolean getDataFlag(int propertyId, int id) { - return (((propertyId == EntityHuman.DATA_PLAYER_FLAGS ? this.getDataPropertyByte(propertyId) & 0xff : this.getDataPropertyLong(propertyId))) & (1L << id)) > 0; - } - - public void setGenericFlag(int propertyId, boolean value) { - this.setDataFlag(propertyId >= 64 ? DATA_FLAGS2 : DATA_FLAGS, propertyId % 64, value); - } - - public boolean getGenericFlag(int propertyId) { - return this.getDataFlag(propertyId >= 64 ? DATA_FLAGS2 : DATA_FLAGS, propertyId % 64); - } - - @Override - public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { - this.server.getEntityMetadata().setMetadata(this, metadataKey, newMetadataValue); - } - - @Override - public List getMetadata(String metadataKey) { - return this.server.getEntityMetadata().getMetadata(this, metadataKey); - } - - @Override - public boolean hasMetadata(String metadataKey) { - return this.server.getEntityMetadata().hasMetadata(this, metadataKey); - } - - @Override - public void removeMetadata(String metadataKey, Plugin owningPlugin) { - this.server.getEntityMetadata().removeMetadata(this, metadataKey, owningPlugin); - } - - public Server getServer() { - return server; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Entity other = (Entity) obj; - return this.id == other.id; - } - - @Override - public int hashCode() { - return (int) (203 + this.id); - } - - public static Entity create(Object type, Position source, Object... args) { - FullChunk chunk = source.getLevel().getChunk((int) source.x >> 4, (int) source.z >> 4, true); - if (!chunk.isGenerated()) { - chunk.setGenerated(); - } - if (!chunk.isPopulated()) { - chunk.setPopulated(); - } - - CompoundTag nbt = new CompoundTag().putList(new ListTag("Pos").add(new DoubleTag("", source.x)).add(new DoubleTag("", source.y)).add(new DoubleTag("", source.z))) - .putList(new ListTag("Motion").add(new DoubleTag("", 0)).add(new DoubleTag("", 0)).add(new DoubleTag("", 0))) - .putList(new ListTag("Rotation").add(new FloatTag("", source instanceof Location ? (float) ((Location) source).yaw : 0)) - .add(new FloatTag("", source instanceof Location ? (float) ((Location) source).pitch : 0))); - - return Entity.createEntity(type.toString(), chunk, nbt, args); - } - - public boolean isOnLadder() { - int b = this.level.getBlockIdAt(chunk, this.getFloorX(), this.getFloorY(), this.getFloorZ()); - return b == Block.LADDER || b == Block.VINES || b == Block.COBWEB; - } - - public float getMountedYOffset() { - return getHeight() * 0.75F; - } - - /** - * Check whether there is blocks above the entity - * - * @return no blocks above - */ - public boolean canSeeSky() { - int px = this.getFloorX(); - int py = this.getFloorY(); - int pz = this.getFloorZ(); - for (int i = 255; i >= py; i--) { - if (level.getBlockIdAt(chunk, px, i, pz) != 0) { - return false; - } - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityAgeable.java b/src/main/java/cn/nukkit/entity/EntityAgeable.java deleted file mode 100644 index c9191eed9..000000000 --- a/src/main/java/cn/nukkit/entity/EntityAgeable.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.nukkit.entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface EntityAgeable { - - boolean isBaby(); - - void setBaby(boolean baby); -} diff --git a/src/main/java/cn/nukkit/entity/EntityArthropod.java b/src/main/java/cn/nukkit/entity/EntityArthropod.java deleted file mode 100644 index 35ea6532d..000000000 --- a/src/main/java/cn/nukkit/entity/EntityArthropod.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.nukkit.entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface EntityArthropod { -} diff --git a/src/main/java/cn/nukkit/entity/EntityBoss.java b/src/main/java/cn/nukkit/entity/EntityBoss.java deleted file mode 100644 index 9c2127c08..000000000 --- a/src/main/java/cn/nukkit/entity/EntityBoss.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.nukkit.entity; - -public interface EntityBoss { -} diff --git a/src/main/java/cn/nukkit/entity/EntityControllable.java b/src/main/java/cn/nukkit/entity/EntityControllable.java deleted file mode 100644 index e98aa464c..000000000 --- a/src/main/java/cn/nukkit/entity/EntityControllable.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.Player; - -public interface EntityControllable { - - void onPlayerInput(Player player, double strafe, double forward); -} diff --git a/src/main/java/cn/nukkit/entity/EntityCreature.java b/src/main/java/cn/nukkit/entity/EntityCreature.java deleted file mode 100644 index 2324c772f..000000000 --- a/src/main/java/cn/nukkit/entity/EntityCreature.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EntityCreature extends EntityLiving { - - public EntityCreature(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityDamageable.java b/src/main/java/cn/nukkit/entity/EntityDamageable.java deleted file mode 100644 index 9f6bd2520..000000000 --- a/src/main/java/cn/nukkit/entity/EntityDamageable.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.nukkit.entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface EntityDamageable { -} diff --git a/src/main/java/cn/nukkit/entity/EntityExplosive.java b/src/main/java/cn/nukkit/entity/EntityExplosive.java deleted file mode 100644 index f69f05844..000000000 --- a/src/main/java/cn/nukkit/entity/EntityExplosive.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.nukkit.entity; - -/** - * @author Nukkit Project Team - */ -public interface EntityExplosive { - - void explode(); -} diff --git a/src/main/java/cn/nukkit/entity/EntityFlying.java b/src/main/java/cn/nukkit/entity/EntityFlying.java deleted file mode 100644 index d5cf6f5ed..000000000 --- a/src/main/java/cn/nukkit/entity/EntityFlying.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector2; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public abstract class EntityFlying extends BaseEntity { - - public EntityFlying(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - protected void checkTarget() { - if (this.isKnockback()) { - return; - } - - Vector3 target = this.target; - if (!(target instanceof EntityCreature) || (!((EntityCreature) target).closed && !this.targetOption((EntityCreature) target, this.distanceSquared(target))) || !((Entity) target).canBeFollowed()) { - double near = Integer.MAX_VALUE; - for (Entity entity : this.getLevel().getEntities()) { - if (entity == this || !(entity instanceof EntityCreature) || entity.closed || !this.canTarget(entity)) { - continue; - } - - EntityCreature creature = (EntityCreature) entity; - if (creature instanceof BaseEntity && ((BaseEntity) creature).isFriendly() == this.isFriendly()) { - continue; - } - - double distance = this.distanceSquared(creature); - if (distance > near || !this.targetOption(creature, distance)) { - continue; - } - near = distance; - - this.moveTime = 0; - this.target = creature; - } - } - - if (this.target instanceof EntityCreature && ((EntityCreature) this.target).isAlive()) { - return; - } - - int x, y, z; - int maxY = Math.max(this.getLevel().getHighestBlockAt((int) this.x, (int) this.z) + 15, 120); - if (this.stayTime > 0) { - if (Utils.rand(1, 100) > 5) { - return; - } - - x = Utils.rand(10, 30); - z = Utils.rand(10, 30); - if (this.y > maxY) { - y = Utils.rand(-12, -4); - } else { - y = Utils.rand(-10, 10); - } - this.target = this.add(Utils.rand() ? x : -x, y, Utils.rand() ? z : -z); - } else if (Utils.rand(1, 100) == 1) { - x = Utils.rand(10, 30); - z = Utils.rand(10, 30); - if (this.y > maxY) { - y = Utils.rand(-12, -4); - } else { - y = Utils.rand(-10, 10); - } - this.stayTime = Utils.rand(100, 200); - this.target = this.add(Utils.rand() ? x : -x, y, Utils.rand() ? z : -z); - } else if (this.moveTime <= 0 || this.target == null) { - x = Utils.rand(20, 100); - z = Utils.rand(20, 100); - if (this.y > maxY) { - y = Utils.rand(-12, -4); - } else { - y = Utils.rand(-10, 10); - } - this.stayTime = 0; - this.moveTime = Utils.rand(100, 200); - this.target = this.add(Utils.rand() ? x : -x, y, Utils.rand() ? z : -z); - } - } - - @Override - public Vector3 updateMove(int tickDiff) { - if (this.isMovement() && !isImmobile()) { - if (this.isKnockback()) { - this.move(this.motionX, this.motionY, this.motionZ); - this.updateMovement(); - return null; - } - - if (this.followTarget != null && !this.followTarget.closed && this.followTarget.isAlive() && this.followTarget.canBeFollowed()) { - double x = this.followTarget.x - this.x; - double y = this.followTarget.y - this.y; - double z = this.followTarget.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - if (this.stayTime > 0 || this.distance(this.followTarget) <= (this.getWidth() / 2 + 0.05)) { - this.motionX = 0; - this.motionZ = 0; - } else { - this.motionX = this.getSpeed() * 0.15 * (x / diff); - this.motionZ = this.getSpeed() * 0.15 * (z / diff); - this.motionY = this.getSpeed() * 0.27 * (y / diff); - } - if (this.stayTime <= 0 || Utils.rand()) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - } - - Vector3 before = this.target; - this.checkTarget(); - if (this.target instanceof EntityCreature || before != this.target) { - double x = this.target.x - this.x; - double y = this.target.y - this.y; - double z = this.target.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - if (this.stayTime > 0 || this.distance(this.target) <= (this.getWidth() / 2 + 0.05) * nearbyDistanceMultiplier()) { - this.motionX = 0; - this.motionZ = 0; - } else { - this.motionX = this.getSpeed() * 0.15 * (x / diff); - this.motionZ = this.getSpeed() * 0.15 * (z / diff); - this.motionY = this.getSpeed() * 0.27 * (y / diff); - } - if (this.stayTime <= 0 || Utils.rand()) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - } - - double dx = this.motionX; - double dy = this.motionY; - double dz = this.motionZ; - Vector3 target = this.target; - if (this.stayTime > 0) { - this.stayTime -= tickDiff; - this.move(0, dy, 0); - } else { - Vector2 be = new Vector2(this.x + dx, this.z + dz); - this.move(dx, dy, dz); - Vector2 af = new Vector2(this.x, this.z); - - if (be.x != af.x || be.y != af.y) { - this.moveTime -= 90; - } - } - - if (this.isOnGround()) { - this.motionY = Utils.rand(0.15, 0.20); - } else { - this.motionY = Utils.rand(-0.15, 0.15); - } - - this.updateMovement(); - return target; - } - return null; - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityHanging.java b/src/main/java/cn/nukkit/entity/EntityHanging.java deleted file mode 100644 index 8239912ad..000000000 --- a/src/main/java/cn/nukkit/entity/EntityHanging.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EntityHanging extends Entity { - - protected int direction; - - public EntityHanging(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(1); - this.setHealth(1); - - if (this.namedTag.contains("Direction")) { - this.direction = this.namedTag.getByte("Direction"); - } else if (this.namedTag.contains("Dir")) { - int d = this.namedTag.getByte("Dir"); - if (d == 2) { - this.direction = 0; - } else if (d == 0) { - this.direction = 2; - } - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putByte("Direction", this.getDirection().getHorizontalIndex()); - this.namedTag.putInt("TileX", (int) this.x); - this.namedTag.putInt("TileY", (int) this.y); - this.namedTag.putInt("TileZ", (int) this.z); - } - - @Override - public BlockFace getDirection() { - return BlockFace.fromIndex(this.direction); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (!this.isAlive()) { - - this.despawnFromAll(); - if (!this.isPlayer) { - this.close(); - } - - return true; - } - - if (this.lastYaw != this.yaw || this.lastX != this.x || this.lastY != this.y || this.lastZ != this.z) { - this.despawnFromAll(); - - this.direction = (int) (this.yaw / 90); - - this.lastYaw = this.yaw; - this.lastX = this.x; - this.lastY = this.y; - this.lastZ = this.z; - - this.spawnToAll(); - - return true; - } - - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityHuman.java b/src/main/java/cn/nukkit/entity/EntityHuman.java deleted file mode 100644 index 32e1804cc..000000000 --- a/src/main/java/cn/nukkit/entity/EntityHuman.java +++ /dev/null @@ -1,366 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.Player; -import cn.nukkit.entity.data.IntPositionEntityData; -import cn.nukkit.entity.data.Skin; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.StringTag; -import cn.nukkit.network.protocol.AddPlayerPacket; -import cn.nukkit.network.protocol.SetEntityLinkPacket; -import cn.nukkit.utils.*; - -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityHuman extends EntityHumanType { - - public static final int DATA_PLAYER_FLAG_SLEEP = 1; - public static final int DATA_PLAYER_FLAG_DEAD = 2; - - public static final int DATA_PLAYER_FLAGS = 26; - public static final int DATA_PLAYER_BUTTON_TEXT = 40; - - protected UUID uuid; - protected byte[] rawUUID; - - protected Skin skin; - - @Override - public float getWidth() { - return 0.58f; - } - - @Override - public float getLength() { - return 0.58f; - } - - @Override - public float getHeight() { - return isSwimming() || isGliding() ? 0.6f : 1.8f; - } - - @Override - protected double getStepHeight() { - return 0.6f; - } - - @Override - public float getEyeHeight() { - return isSwimming() || isGliding() ? 0.42f : 1.62f; - } - - @Override - protected float getBaseOffset() { - return this.getEyeHeight(); - } - - @Override - public int getNetworkId() { - return -1; - } - - public EntityHuman(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - public Skin getSkin() { - return skin; - } - - public UUID getUniqueId() { - return uuid; - } - - public byte[] getRawUniqueId() { - return rawUUID; - } - - public void setSkin(Skin skin) { - this.skin = skin; - } - - @Override - protected void initEntity() { - this.setDataFlag(DATA_PLAYER_FLAGS, DATA_PLAYER_FLAG_SLEEP, false, false); - this.setDataFlag(DATA_FLAGS, DATA_FLAG_GRAVITY, true, false); - this.setDataProperty(new IntPositionEntityData(DATA_PLAYER_BED_POSITION, 0, 0, 0), false); - - if (!(this instanceof Player)) { - if (this.namedTag.contains("NameTag")) { - this.setNameTag(this.namedTag.getString("NameTag")); - } - - if (this.namedTag.contains("Skin") && this.namedTag.get("Skin") instanceof CompoundTag) { - CompoundTag skinTag = this.namedTag.getCompound("Skin"); - if (!skinTag.contains("Transparent")) { - skinTag.putBoolean("Transparent", false); - } - Skin newSkin = new Skin(); - if (skinTag.contains("ModelId")) { - newSkin.setSkinId(skinTag.getString("ModelId")); - } - if (skinTag.contains("PlayFabID")) { - newSkin.setPlayFabId(skinTag.getString("PlayFabID")); - } - if (skinTag.contains("Data")) { - byte[] data = skinTag.getByteArray("Data"); - if (skinTag.contains("SkinImageWidth") && skinTag.contains("SkinImageHeight")) { - newSkin.setSkinData(new SerializedImage(skinTag.getInt("SkinImageWidth"), skinTag.getInt("SkinImageHeight"), data)); - } else { - newSkin.setSkinData(data); - } - } - if (skinTag.contains("CapeId")) { - newSkin.setCapeId(skinTag.getString("CapeId")); - } - if (skinTag.contains("CapeData")) { - byte[] data = skinTag.getByteArray("CapeData"); - if (skinTag.contains("CapeImageWidth") && skinTag.contains("CapeImageHeight")) { - newSkin.setCapeData(new SerializedImage(skinTag.getInt("CapeImageWidth"), skinTag.getInt("CapeImageHeight"), data)); - } else { - newSkin.setCapeData(data); - } - } - if (skinTag.contains("GeometryName")) { - newSkin.setGeometryName(skinTag.getString("GeometryName")); - } - if (skinTag.contains("SkinResourcePatch")) { - newSkin.setSkinResourcePatch(new String(skinTag.getByteArray("SkinResourcePatch"), StandardCharsets.UTF_8)); - } - if (skinTag.contains("GeometryData")) { - newSkin.setGeometryData(new String(skinTag.getByteArray("GeometryData"), StandardCharsets.UTF_8)); - } - if (skinTag.contains("AnimationData")) { - newSkin.setAnimationData(new String(skinTag.getByteArray("AnimationData"), StandardCharsets.UTF_8)); - } - if (skinTag.contains("PremiumSkin")) { - newSkin.setPremium(skinTag.getBoolean("PremiumSkin")); - } - if (skinTag.contains("PersonaSkin")) { - newSkin.setPersona(skinTag.getBoolean("PersonaSkin")); - } - if (skinTag.contains("CapeOnClassicSkin")) { - newSkin.setCapeOnClassic(skinTag.getBoolean("CapeOnClassicSkin")); - } - if (skinTag.contains("AnimatedImageData")) { - for (CompoundTag animationTag : skinTag.getList("AnimatedImageData", CompoundTag.class).getAll()) { - newSkin.getAnimations().add(new SkinAnimation(new SerializedImage(animationTag.getInt("ImageWidth"), animationTag.getInt("ImageHeight"), animationTag.getByteArray("Image")), animationTag.getInt("Type"), animationTag.getFloat("Frames"), animationTag.getInt("AnimationExpression"))); - } - } - if (skinTag.contains("ArmSize")) { - newSkin.setArmSize(skinTag.getString("ArmSize")); - } - if (skinTag.contains("SkinColor")) { - newSkin.setSkinColor(skinTag.getString("SkinColor")); - } - if (skinTag.contains("PersonaPieces")) { - ListTag pieces = skinTag.getList("PersonaPieces", CompoundTag.class); - for (CompoundTag piece : pieces.getAll()) { - newSkin.getPersonaPieces().add(new PersonaPiece( - piece.getString("PieceId"), - piece.getString("PieceType"), - piece.getString("PackId"), - piece.getBoolean("IsDefault"), - piece.getString("ProductId") - )); - } - } - if (skinTag.contains("PieceTintColors")) { - ListTag tintColors = skinTag.getList("PieceTintColors", CompoundTag.class); - for (CompoundTag tintColor : tintColors.getAll()) { - newSkin.getTintColors().add(new PersonaPieceTint( - tintColor.getString("PieceType"), - tintColor.getList("Colors", StringTag.class).getAll().stream() - .map(stringTag -> stringTag.data).collect(Collectors.toList()) - )); - } - } - if (skinTag.contains("IsTrustedSkin")) { - newSkin.setTrusted(skinTag.getBoolean("IsTrustedSkin")); - } - this.setSkin(newSkin); - } - - this.uuid = Utils.dataToUUID(String.valueOf(this.getId()).getBytes(StandardCharsets.UTF_8), this.skin - .getSkinData().data, this.getNameTag().getBytes(StandardCharsets.UTF_8)); - } else { - // HACK: Fix gravity on 1.2.11 and lower - if (((Player) this).protocol <= 201) { - this.setDataFlag(DATA_FLAGS, 46, true, false); - } - } - - super.initEntity(); - } - - @Override - public String getName() { - return this.getNameTag(); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - if (skin != null) { - CompoundTag skinTag = new CompoundTag() - .putByteArray("Data", this.getSkin().getSkinData().data) - .putInt("SkinImageWidth", this.getSkin().getSkinData().width) - .putInt("SkinImageHeight", this.getSkin().getSkinData().height) - .putString("ModelId", this.skin.getSkinId()) - .putString("CapeId", this.getSkin().getCapeId()) - .putByteArray("CapeData", this.getSkin().getCapeData().data) - .putInt("CapeImageWidth", this.getSkin().getCapeData().width) - .putInt("CapeImageHeight", this.getSkin().getCapeData().height) - .putByteArray("SkinResourcePatch", this.getSkin().getSkinResourcePatch().getBytes(StandardCharsets.UTF_8)) - .putByteArray("GeometryData", this.skin.getGeometryData().getBytes(StandardCharsets.UTF_8)) - .putByteArray("AnimationData", this.getSkin().getAnimationData().getBytes(StandardCharsets.UTF_8)) - .putBoolean("PremiumSkin", this.getSkin().isPremium()) - .putBoolean("PersonaSkin", this.getSkin().isPersona()) - .putBoolean("CapeOnClassicSkin", this.getSkin().isCapeOnClassic()) - .putString("ArmSize", this.getSkin().getArmSize()) - .putString("SkinColor", this.getSkin().getSkinColor()) - .putBoolean("IsTrustedSkin", this.getSkin().isTrusted()); - - List animations = this.getSkin().getAnimations(); - - if (!animations.isEmpty()) { - ListTag animationsTag = new ListTag<>("AnimatedImageData"); - - for (SkinAnimation animation : animations) { - animationsTag.add(new CompoundTag() - .putFloat("Frames", animation.frames) - .putInt("Type", animation.type) - .putInt("ImageWidth", animation.image.width) - .putInt("ImageHeight", animation.image.height) - .putInt("AnimationExpression", animation.expression) - .putByteArray("Image", animation.image.data)); - } - - skinTag.putList(animationsTag); - } - - List personaPieces = this.getSkin().getPersonaPieces(); - if (!personaPieces.isEmpty()) { - ListTag piecesTag = new ListTag<>("PersonaPieces"); - for (PersonaPiece piece : personaPieces) { - piecesTag.add(new CompoundTag().putString("PieceId", piece.id) - .putString("PieceType", piece.type) - .putString("PackId", piece.packId) - .putBoolean("IsDefault", piece.isDefault) - .putString("ProductId", piece.productId)); - } - } - - List tints = this.getSkin().getTintColors(); - if (!tints.isEmpty()) { - ListTag tintsTag = new ListTag<>("PieceTintColors"); - for (PersonaPieceTint tint : tints) { - ListTag colors = new ListTag<>("Colors"); - colors.setAll(tint.colors.stream().map(s -> new StringTag("", s)).collect(Collectors.toList())); - tintsTag.add(new CompoundTag() - .putString("PieceType", tint.pieceType) - .putList(colors)); - } - } - - if (!this.getSkin().getPlayFabId().isEmpty()) { - skinTag.putString("PlayFabID", this.getSkin().getPlayFabId()); - } - - this.namedTag.putCompound("Skin", skinTag); - } - } - - @Override - public void spawnTo(Player player) { - if (this != player && !this.hasSpawned.containsKey(player.getLoaderId())) { - this.hasSpawned.put(player.getLoaderId(), player); - - if (!this.skin.isValid()) { - throw new IllegalStateException(this.getClass().getSimpleName() + " must have a valid skin set"); - } - - if (this.isPlayer) { - this.server.updatePlayerListData(this.uuid, this.getId(), ((Player) this).getDisplayName(), this.skin, ((Player) this).getLoginChainData().getXUID(), new Player[]{player}); - } else { - this.server.updatePlayerListData(this.uuid, this.getId(), this.getName(), this.skin, new Player[]{player}); - } - - AddPlayerPacket pk = new AddPlayerPacket(); - pk.uuid = this.uuid; - pk.username = this.getName(); - pk.entityUniqueId = this.getId(); - pk.entityRuntimeId = this.getId(); - pk.x = (float) this.x; - pk.y = (float) this.y; - pk.z = (float) this.z; - pk.speedX = (float) this.motionX; - pk.speedY = (float) this.motionY; - pk.speedZ = (float) this.motionZ; - pk.yaw = (float) this.yaw; - pk.pitch = (float) this.pitch; - pk.item = this.getInventory().getItemInHand(); - pk.metadata = this.dataProperties.clone(); - player.dataPacket(pk); - - if (this.isPlayer) { - this.inventory.sendArmorContents(player); - } else { - this.inventory.sendArmorContentsIfNotAr(player); - } - this.offhandInventory.sendContents(player); - - if (this.riding != null) { - SetEntityLinkPacket pkk = new SetEntityLinkPacket(); - pkk.vehicleUniqueId = this.riding.getId(); - pkk.riderUniqueId = this.getId(); - pkk.type = 1; - pkk.immediate = 1; - player.dataPacket(pkk); - } - - if (!this.isPlayer) { - this.server.removePlayerListData(this.uuid, player); - } - } - } - - @Override - public void close() { - if (!this.closed) { - if (inventory != null && (!(this instanceof Player) || ((Player) this).loggedIn)) { - for (Player viewer : this.inventory.getViewers()) { - viewer.removeWindow(this.inventory); - } - } - - super.close(); - } - } - - @Override - protected void onBlock(Entity entity, boolean animate, float damage) { - super.onBlock(entity, animate, damage); - Item shieldOffhand = getOffhandInventory().getItem(0); - if (shieldOffhand.getId() == ItemID.SHIELD) { - getOffhandInventory().setItem(0, damageArmor(shieldOffhand, entity, damage, true, null)); - } else { - Item shield = getInventory().getItemInHand(); - if (shield.getId() == ItemID.SHIELD) { - getInventory().setItemInHand(damageArmor(shield, entity, damage, true, null)); - } - } - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityHumanType.java b/src/main/java/cn/nukkit/entity/EntityHumanType.java deleted file mode 100644 index 2ce24e316..000000000 --- a/src/main/java/cn/nukkit/entity/EntityHumanType.java +++ /dev/null @@ -1,260 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.block.BlockID; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.inventory.PlayerEnderChestInventory; -import cn.nukkit.inventory.PlayerInventory; -import cn.nukkit.inventory.PlayerOffhandInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSkull; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public abstract class EntityHumanType extends EntityCreature implements InventoryHolder { - - protected PlayerInventory inventory; - protected PlayerEnderChestInventory enderChestInventory; - protected PlayerOffhandInventory offhandInventory; - - public EntityHumanType(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public PlayerInventory getInventory() { - return inventory; - } - - public PlayerEnderChestInventory getEnderChestInventory() { - return enderChestInventory; - } - - public PlayerOffhandInventory getOffhandInventory() { - return offhandInventory; - } - - @Override - protected void initEntity() { - this.inventory = new PlayerInventory(this); - this.offhandInventory = new PlayerOffhandInventory(this); - - if (this.namedTag.contains("Inventory") && this.namedTag.get("Inventory") instanceof ListTag) { - ListTag inventoryList = this.namedTag.getList("Inventory", CompoundTag.class); - for (CompoundTag item : inventoryList.getAll()) { - int slot = item.getByte("Slot"); - if (slot >= 0 && slot < 9) { - inventoryList.remove(item); - } else if (slot >= 100 && slot < 104) { - this.inventory.setItem(this.inventory.getSize() + slot - 100, NBTIO.getItemHelper(item)); - } else if (slot == -106) { - this.offhandInventory.setItem(0, NBTIO.getItemHelper(item)); - } else { - this.inventory.setItem(slot - 9, NBTIO.getItemHelper(item)); - } - } - } - - this.enderChestInventory = new PlayerEnderChestInventory(this); - - if (this.namedTag.contains("EnderItems") && this.namedTag.get("EnderItems") instanceof ListTag) { - ListTag inventoryList = this.namedTag.getList("EnderItems", CompoundTag.class); - for (CompoundTag item : inventoryList.getAll()) { - this.enderChestInventory.setItem(item.getByte("Slot"), NBTIO.getItemHelper(item)); - } - } - - super.initEntity(); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - ListTag inventoryTag = null; - if (this.inventory != null) { - inventoryTag = new ListTag<>("Inventory"); - this.namedTag.putList(inventoryTag); - - for (int slot = 0; slot < 9; ++slot) { - inventoryTag.add(new CompoundTag() - .putByte("Count", 0) - .putShort("Damage", 0) - .putByte("Slot", slot) - .putByte("TrueSlot", -1) - .putShort("id", 0) - ); - } - - int slotCount = 45; - for (int slot = 9; slot < slotCount; ++slot) { - Item item = this.inventory.getItem(slot - 9); - inventoryTag.add(NBTIO.putItemHelper(item, slot)); - } - - for (int slot = 100; slot < 104; ++slot) { - Item item = this.inventory.getItem(this.inventory.getSize() + slot - 100); - if (item != null && item.getId() != Item.AIR) { - inventoryTag.add(NBTIO.putItemHelper(item, slot)); - } - } - } - - if (this.offhandInventory != null) { - Item item = this.offhandInventory.getItem(0); - if (item.getId() != Item.AIR) { - if (inventoryTag == null) { - inventoryTag = new ListTag<>("Inventory"); - this.namedTag.putList(inventoryTag); - } - inventoryTag.add(NBTIO.putItemHelper(item, -106)); - } - } - - this.namedTag.putList(new ListTag("EnderItems")); - if (this.enderChestInventory != null) { - for (int slot = 0; slot < 27; ++slot) { - Item item = this.enderChestInventory.getItem(slot); - if (item != null && item.getId() != Item.AIR) { - this.namedTag.getList("EnderItems", CompoundTag.class).add(NBTIO.putItemHelper(item, slot)); - } - } - } - } - - @Override - public Item[] getDrops() { - if (this.inventory != null) { - List drops = new ArrayList<>(this.inventory.getContents().values()); - drops.addAll(this.offhandInventory.getContents().values()); - return drops.toArray(new Item[0]); - } - return new Item[0]; - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (!this.isAlive() || closed) { - return false; - } - - if (source.getCause() != DamageCause.VOID && source.getCause() != DamageCause.CUSTOM && source.getCause() != DamageCause.MAGIC) { - int armorPoints = 0; - int epf = 0; - - for (Item armor : inventory.getArmorContents()) { - armorPoints += armor.getArmorPoints(); - epf += calculateEnchantmentProtectionFactor(armor, source); - } - - //float originalDamage = source.getDamage(); - //float r = (source.getDamage(EntityDamageEvent.DamageModifier.ARMOR) - (originalDamage - originalDamage * (1 - Math.max(armorPoints / 5, armorPoints - originalDamage / 2) / 25))); - //originalDamage += r; - //epf = Math.min(20, epf); - //source.setDamage(r, EntityDamageEvent.DamageModifier.ARMOR); - //source.setDamage(source.getDamage(EntityDamageEvent.DamageModifier.ARMOR_ENCHANTMENTS) - (originalDamage - originalDamage * (1 - epf / 25f)), EntityDamageEvent.DamageModifier.ARMOR_ENCHANTMENTS); - - if (source.canBeReducedByArmor()) { - source.setDamage(-source.getFinalDamage() * armorPoints * 0.04f, EntityDamageEvent.DamageModifier.ARMOR); - } - - source.setDamage(-source.getFinalDamage() * Math.min(NukkitMath.ceilFloat(Math.min(epf, 25) * ((float) Utils.random.nextInt(50, 100) / 100)), 20) * 0.04f, - EntityDamageEvent.DamageModifier.ARMOR_ENCHANTMENTS); - - source.setDamage(-Math.min(this.getAbsorption(), source.getFinalDamage()), EntityDamageEvent.DamageModifier.ABSORPTION); - } - - if (super.attack(source)) { - Entity damager = null; - - if (source instanceof EntityDamageByEntityEvent) { - damager = ((EntityDamageByEntityEvent) source).getDamager(); - } - - for (int slot = 0; slot < 4; slot++) { - Item armor = damageArmor(this.inventory.getArmorItem(slot), damager, source.getDamage(), false, source.getCause()); - - inventory.setArmorItem(slot, armor, armor.getId() != BlockID.AIR); - } - - return true; - } else { - return false; - } - } - - protected Item damageArmor(Item armor, Entity damager, float damage, boolean shield, DamageCause cause) { - if (armor.hasEnchantments()) { - if (damager != null && cause != DamageCause.THORNS) { - for (Enchantment enchantment : armor.getEnchantments()) { - enchantment.doPostAttack(damager, this); - } - } - - Enchantment durability = armor.getEnchantment(Enchantment.ID_DURABILITY); - if (durability != null - && durability.getLevel() > 0 - && (100 / (durability.getLevel() + 1)) <= Utils.random.nextInt(100)) { - return armor; - } - } - - if (armor.isUnbreakable() || armor instanceof ItemSkull) { - return armor; - } - - if (shield) { - armor.setDamage(armor.getDamage() + (damage >= 4.0f ? ((int) damage) : 1)); - } else { - armor.setDamage(armor.getDamage() + Math.max((int) (damage / 4), 1)); - } - - if (armor.getDamage() >= armor.getMaxDurability()) { - return Item.get(BlockID.AIR, 0, 0); - } - - return armor; - } - - - protected double calculateEnchantmentProtectionFactor(Item item, EntityDamageEvent source) { - if (!item.hasEnchantments()) { - return 0; - } - - double epf = 0; - - for (Enchantment ench : item.getEnchantments()) { - epf += ench.getProtectionFactor(source); - } - - return epf ; - } - - @Override - public void setOnFire(int seconds) { - int level = 0; - - for (Item armor : this.inventory.getArmorContents()) { - Enchantment fireProtection = armor.getEnchantment(Enchantment.ID_PROTECTION_FIRE); - - if (fireProtection != null && fireProtection.getLevel() > 0) { - level = Math.max(level, fireProtection.getLevel()); - } - } - - seconds = (int) (seconds * (1 - level * 0.15)); - - super.setOnFire(seconds); - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityInteractable.java b/src/main/java/cn/nukkit/entity/EntityInteractable.java deleted file mode 100644 index 94601e4a9..000000000 --- a/src/main/java/cn/nukkit/entity/EntityInteractable.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.nukkit.entity; - -/** - * @author Adam Matthew - */ -public interface EntityInteractable { - - String getInteractButtonText(); - - boolean canDoInteraction(); -} diff --git a/src/main/java/cn/nukkit/entity/EntityJumping.java b/src/main/java/cn/nukkit/entity/EntityJumping.java deleted file mode 100644 index f47d6d7b1..000000000 --- a/src/main/java/cn/nukkit/entity/EntityJumping.java +++ /dev/null @@ -1,195 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.BubbleParticle; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector2; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public abstract class EntityJumping extends BaseEntity { - - public EntityJumping(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - protected void checkTarget() { - if (this.isKnockback()) { - return; - } - - if (this.followTarget != null && !this.followTarget.closed && this.followTarget.isAlive() && this.followTarget.canBeFollowed()) { - return; - } - - Vector3 target = this.target; - if (!(target instanceof EntityCreature) || (!((EntityCreature) target).closed && !this.targetOption((EntityCreature) target, this.distanceSquared(target))) || !((Entity) target).canBeFollowed()) { - double near = Integer.MAX_VALUE; - - for (Entity entity : this.getLevel().getEntities()) { - if (entity == this || !(entity instanceof EntityCreature) || entity.closed || !this.canTarget(entity)) { - continue; - } - - EntityCreature creature = (EntityCreature) entity; - if (creature instanceof BaseEntity && ((BaseEntity) creature).isFriendly() == this.isFriendly()) { - continue; - } - - double distance = this.distanceSquared(creature); - if (distance > near || !this.targetOption(creature, distance)) { - continue; - } - near = distance; - - this.stayTime = 0; - this.moveTime = 0; - this.target = creature; - } - } - - if (this.target instanceof EntityCreature && !((EntityCreature) this.target).closed && ((EntityCreature) this.target).isAlive() && this.targetOption((EntityCreature) this.target, this.distanceSquared(this.target))) { - return; - } - - int x, z; - if (this.stayTime > 0) { - if (Utils.rand(1, 100) > 5) { - return; - } - x = Utils.rand(10, 30); - z = Utils.rand(10, 30); - this.target = this.add(Utils.rand() ? x : -x, Utils.rand(-20.0, 20.0) / 10, Utils.rand() ? z : -z); - } else if (Utils.rand(1, 100) == 1) { - x = Utils.rand(10, 30); - z = Utils.rand(10, 30); - this.stayTime = Utils.rand(100, 200); - this.target = this.add(Utils.rand() ? x : -x, Utils.rand(-20.0, 20.0) / 10, Utils.rand() ? z : -z); - } else if (this.moveTime <= 0 || this.target == null) { - x = Utils.rand(20, 100); - z = Utils.rand(20, 100); - this.stayTime = 0; - this.moveTime = Utils.rand(100, 200); - this.target = this.add(Utils.rand() ? x : -x, 0, Utils.rand() ? z : -z); - } - } - - protected boolean checkJump() { - if (this.motionY == this.getGravity() * 2) { - int b = level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) this.y, NukkitMath.floorDouble(this.z)); - return b == BlockID.WATER || b == BlockID.STILL_WATER; - } else { - int b = level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) (this.y + 0.8), NukkitMath.floorDouble(this.z)); - if (b == BlockID.WATER || b == BlockID.STILL_WATER) { - this.motionY = this.getGravity() * 2; - return true; - } - } - - if (!this.onGround) { - return false; - } - - if (this.motionX > 0 || this.motionZ > 0) { - if (this.motionY <= (this.getGravity() * 5)) { - this.motionY = this.getGravity() * 5; - } else { - this.motionY += this.getGravity() * 0.25; - } - } - - return false; - } - - public Vector3 updateMove(int tickDiff) { - if (this.isMovement() && !isImmobile()) { - if (this.isKnockback()) { - this.move(this.motionX, this.motionY, this.motionZ); - this.motionY -= this.getGravity(); - this.updateMovement(); - return null; - } - - if (this.followTarget != null && !this.followTarget.closed && this.followTarget.isAlive() && this.followTarget.canBeFollowed()) { - double x = this.followTarget.x - this.x; - double z = this.followTarget.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - if (this.stayTime > 0 || this.distance(this.followTarget) <= (this.getWidth() / 2 + 0.05)) { - this.motionX = 0; - this.motionZ = 0; - } else { - if (this.isInsideOfWater()) { - this.motionX = this.getSpeed() * 0.05 * (x / diff); - this.motionZ = this.getSpeed() * 0.05 * (z / diff); - this.level.addParticle(new BubbleParticle(this.add(Utils.rand(-2.0, 2.0), Utils.rand(-0.5, 0), Utils.rand(-2.0, 2.0)))); - } else { - this.motionX = this.getSpeed() * 0.1 * (x / diff); - this.motionZ = this.getSpeed() * 0.1 * (z / diff); - } - } - if (this.stayTime <= 0 || Utils.rand()) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - return this.followTarget; - } - - Vector3 before = this.target; - this.checkTarget(); - if (this.target instanceof EntityCreature || before != this.target) { - double x = this.target.x - this.x; - double z = this.target.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - if (this.stayTime > 0 || (this.distance(this.target) <= (this.getWidth() / 2 + 0.05) * nearbyDistanceMultiplier() && !this.isInsideOfWater())) { - this.motionX = 0; - this.motionZ = 0; - } else { - if (this.isInsideOfWater()) { - this.motionX = this.getSpeed() * 0.05 * (x / diff); - this.motionZ = this.getSpeed() * 0.05 * (z / diff); - this.level.addParticle(new BubbleParticle(this.add(Utils.rand(-2.0, 2.0), Utils.rand(-0.5, 0), Utils.rand(-2.0, 2.0)))); - } else { - this.motionX = this.getSpeed() * 0.15 * (x / diff); - this.motionZ = this.getSpeed() * 0.15 * (z / diff); - } - } - if (this.stayTime <= 0 || Utils.rand()) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - } - - double dx = this.motionX; - double dz = this.motionZ; - boolean isJump = this.checkJump(); - if (this.stayTime > 0) { - this.stayTime -= tickDiff; - this.move(0, this.motionY, 0); - } else { - Vector2 be = new Vector2(this.x + dx, this.z + dz); - this.move(dx, this.motionY, dz); - Vector2 af = new Vector2(this.x, this.z); - - if ((be.x != af.x || be.y != af.y) && !isJump) { - this.moveTime -= 90; - } - } - - if (!isJump) { - if (this.onGround) { - this.motionY = 0; - } else if (this.motionY > -this.getGravity() * 4) { - int b = this.level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) (this.y + 0.8), NukkitMath.floorDouble(this.z)); - if (b != Block.WATER && b != Block.STILL_WATER && b != Block.LAVA && b != Block.STILL_LAVA) { - this.motionY -= this.getGravity(); - } - } else { - this.motionY -= this.getGravity(); - } - } - this.updateMovement(); - return this.target; - } - return null; - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityLiving.java b/src/main/java/cn/nukkit/entity/EntityLiving.java deleted file mode 100644 index cb274b85f..000000000 --- a/src/main/java/cn/nukkit/entity/EntityLiving.java +++ /dev/null @@ -1,554 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityDrowned; -import cn.nukkit.entity.mob.EntityWolf; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.entity.weather.EntityWeather; -import cn.nukkit.event.entity.*; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.inventory.PlayerInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemTurtleShell; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.Sound; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.BubbleParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.network.protocol.AnimatePacket; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.network.protocol.TextPacket; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.BlockIterator; -import co.aikar.timings.Timings; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EntityLiving extends Entity implements EntityDamageable { - - public EntityLiving(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected float getGravity() { - return 0.08f; - } - - @Override - protected float getDrag() { - return 0.02f; - } - - protected int attackTime = 0; - - protected float movementSpeed = 0.1f; - - protected int turtleTicks = 0; - - private boolean blocking = false; - - protected final boolean isDrowned = this instanceof EntityDrowned; - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag.contains("HealF")) { - this.namedTag.putFloat("Health", this.namedTag.getShort("HealF")); - this.namedTag.remove("HealF"); - } - - if (!this.namedTag.contains("Health") || !(this.namedTag.get("Health") instanceof FloatTag)) { - this.namedTag.putFloat("Health", this.getMaxHealth()); - } - - this.health = this.namedTag.getFloat("Health"); - } - - @Override - public void setHealth(float health) { - boolean wasAlive = this.isAlive(); - super.setHealth(health); - if (this.isAlive() && !wasAlive) { - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.RESPAWN; - Server.broadcastPacket(this.hasSpawned.values(), pk); - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putFloat("Health", this.getHealth()); - } - - public boolean hasLineOfSight(Entity entity) { - return true; - } - - public void collidingWith(Entity ent) { - ent.applyEntityCollision(this); - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (this.noDamageTicks > 0) { - return false; - } else if (this.attackTime > 0) { - EntityDamageEvent lastCause = this.getLastDamageCause(); - if (lastCause != null && lastCause.getDamage() >= source.getDamage()) { - return false; - } - } - - if (this.blockedByShield(source)) { - return false; - } - - if (super.attack(source)) { - if (source instanceof EntityDamageByEntityEvent) { - Entity damager = ((EntityDamageByEntityEvent) source).getDamager(); - if (source instanceof EntityDamageByChildEntityEvent) { - damager = ((EntityDamageByChildEntityEvent) source).getChild(); - } - - // Critical hit - if (damager instanceof Player && !damager.onGround) { - AnimatePacket animate = new AnimatePacket(); - animate.action = AnimatePacket.Action.CRITICAL_HIT; - animate.eid = getId(); - - this.getLevel().addChunkPacket(damager.getChunkX(), damager.getChunkZ(), animate); - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_ATTACK_STRONG); - - source.setDamage(source.getDamage() * 1.5f); - } - - if (damager.isOnFire() && !(damager instanceof Player)) { - this.setOnFire(this.server.getDifficulty() << 1); - } - - double deltaX = this.x - damager.x; - double deltaZ = this.z - damager.z; - this.knockBack(damager, source.getDamage(), deltaX, deltaZ, ((EntityDamageByEntityEvent) source).getKnockBack()); - } - - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = this.getHealth() < 1 ? EntityEventPacket.DEATH_ANIMATION : EntityEventPacket.HURT_ANIMATION; - Server.broadcastPacket(this.hasSpawned.values(), pk); - - this.attackTime = source.getAttackCooldown(); - this.scheduleUpdate(); - return true; - } else { - return false; - } - } - - protected boolean blockedByShield(EntityDamageEvent source) { - if (!this.isBlocking()) { - return false; - } - - Entity damager = source instanceof EntityDamageByChildEntityEvent ? ((EntityDamageByChildEntityEvent) source).getChild() : source instanceof EntityDamageByEntityEvent ? ((EntityDamageByEntityEvent) source).getDamager() : null; - if (damager == null || damager instanceof EntityWeather) { - return false; - } - - Vector3 entityPos = damager.getPosition(); - Vector3 direction = this.getDirectionVector(); - Vector3 normalizedVector = this.getPosition().subtract(entityPos).normalize(); - boolean blocked = (normalizedVector.x * direction.x) + (normalizedVector.z * direction.z) < 0.0; - boolean knockBack = !(damager instanceof EntityProjectile); - EntityDamageBlockedEvent event = new EntityDamageBlockedEvent(this, source, knockBack, true); - if (!blocked || !source.canBeReducedByArmor() || damager instanceof EntityProjectile && ((EntityProjectile) damager).piercing > 0) { - event.setCancelled(); - } - - getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return false; - } - - if (event.getKnockBackAttacker() && damager instanceof EntityLiving) { - double deltaX = damager.getX() - this.getX(); - double deltaZ = damager.getZ() - this.getZ(); - ((EntityLiving) damager).attackTime = source.getAttackCooldown(); - ((EntityLiving) damager).knockBack(this, 0, deltaX, deltaZ); - } - - onBlock(damager, event.getAnimation(), source.getDamage()); - return true; - } - - protected void onBlock(Entity entity, boolean animate, float damage) { - if (animate) { - getLevel().addSoundToViewers(this, Sound.ITEM_SHIELD_BLOCK); - } - } - - public void knockBack(Entity attacker, double damage, double x, double z) { - this.knockBack(attacker, damage, x, z, 0.3); - } - - public void knockBack(Entity attacker, double damage, double x, double z, double base) { - double f = Math.sqrt(x * x + z * z); - if (f <= 0) { - return; - } - - f = 1 / f; - - Vector3 motion = new Vector3(this.motionX, this.motionY, this.motionZ); - - motion.x /= 2d; - motion.y /= 2d; - motion.z /= 2d; - motion.x += x * f * base; - motion.y += base; - motion.z += z * f * base; - - if (motion.y > base) { - motion.y = base; - } - - this.resetFallDistance(); - - this.setMotion(motion); - } - - @Override - public void kill() { - if (!this.isAlive()) { - return; - } - super.kill(); - EntityDeathEvent ev = new EntityDeathEvent(this, this.getDrops()); - this.server.getPluginManager().callEvent(ev); - - this.checkTameableEntityDeath(); - - if (this.level.getGameRules().getBoolean(GameRule.DO_MOB_LOOT) && this.lastDamageCause != null && DamageCause.VOID != this.lastDamageCause.getCause()) { - if (ev.getEntity() instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) ev.getEntity(); - if (baseEntity.getLastDamageCause() instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) baseEntity.getLastDamageCause()).getDamager() instanceof Player) { - this.getLevel().dropExpOrb(this, baseEntity.getKillExperience()); - - if (!this.dropsOnNaturalDeath()) { - for (cn.nukkit.item.Item item : ev.getDrops()) { - this.getLevel().dropItem(this, item); - } - } - } - } - } - - if (this.dropsOnNaturalDeath()) { - for (cn.nukkit.item.Item item : ev.getDrops()) { - this.getLevel().dropItem(this, item); - } - } - } - } - - @Override - public boolean entityBaseTick() { - return this.entityBaseTick(1); - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (Timings.livingEntityBaseTickTimer != null) Timings.livingEntityBaseTickTimer.startTiming(); - - boolean inWater = this.isSubmerged(); - - if (this instanceof Player && !this.closed) { - Player p = (Player) this; - boolean isBreathing = !inWater; - - PlayerInventory inv = p.getInventory(); - if (isBreathing && inv != null && inv.getHelmetFast() instanceof ItemTurtleShell) { - turtleTicks = 200; - } else if (turtleTicks > 0) { - isBreathing = true; - turtleTicks--; - } - - if (p.isCreative() || p.isSpectator()) { - isBreathing = true; - } - - // HACK! - if (p.protocol <= 282) { - if (p.protocol <= 201) { - this.setDataFlagSelfOnly(DATA_FLAGS, 33, isBreathing); - } else { - this.setDataFlagSelfOnly(DATA_FLAGS, 34, isBreathing); - } - } else { - this.setDataFlagSelfOnly(DATA_FLAGS, DATA_FLAG_BREATHING, isBreathing); - } - } - - boolean hasUpdate = super.entityBaseTick(tickDiff); - - if (this.isAlive()) { - if (this.isInsideOfSolid()) { - hasUpdate = true; - this.attack(new EntityDamageEvent(this, DamageCause.SUFFOCATION, 1)); - } - - if (this.isOnLadder() || this.hasEffect(Effect.LEVITATION) || this.hasEffect(Effect.SLOW_FALLING)) { - this.resetFallDistance(); - } - - if (inWater && !this.hasEffect(Effect.WATER_BREATHING)) { - if (this instanceof EntitySwimming || this.isDrowned || (this instanceof Player && (((Player) this).isCreative() || ((Player) this).isSpectator()))) { - this.setAirTicks(400); - } else { - if (turtleTicks == 0) { - hasUpdate = true; - int airTicks = this.getAirTicks() - tickDiff; - - if (airTicks <= -20) { - airTicks = 0; - if (!(this instanceof Player) || level.getGameRules().getBoolean(GameRule.DROWNING_DAMAGE)) { - this.attack(new EntityDamageEvent(this, DamageCause.DROWNING, 2)); - } - } - - this.setAirTicks(airTicks); - } - } - } else { - if (this instanceof EntitySwimming) { - hasUpdate = true; - int airTicks = this.getAirTicks() - tickDiff; - - if (airTicks <= -20) { - airTicks = 0; - this.attack(new EntityDamageEvent(this, DamageCause.SUFFOCATION, 2)); - } - - this.setAirTicks(airTicks); - } else { - int airTicks = getAirTicks(); - if (airTicks < 400) { - setAirTicks(Math.min(400, airTicks + tickDiff * 5)); - } - } - } - - // Check collisions with blocks - if (this instanceof Player) { - if (this.age % 5 == 0) { - int block = this.level.getBlockIdAt(chunk, getFloorX(), getFloorY() - 1, getFloorZ()); - if (block == Block.CACTUS) { - Block.get(Block.CACTUS).onEntityCollide(this); - } else if (block == Block.MAGMA) { - Block.get(Block.MAGMA).onEntityCollide(this); - if (this.isInsideOfWater()) { - this.level.addParticle(new BubbleParticle(this)); - this.setMotion(this.getMotion().add(0, -0.3, 0)); - } - } /*else if (block == Block.SOUL_SAND && this.isInsideOfWater()) { - this.level.addParticle(new BubbleParticle(this)); - this.setMotion(this.getMotion().add(0, 0.3, 0)); - }*/ - } - } - - if (this.attackTime > 0) { - this.attackTime -= tickDiff; - hasUpdate = true; - } - - if (this.riding == null) { - Entity[] e = level.getNearbyEntities(this.boundingBox.grow(0.20000000298023224, 0.0D, 0.20000000298023224), this); - for (Entity entity : e) { - if (entity instanceof EntityRideable) { - this.collidingWith(entity); - } - } - } - } - - if (Timings.livingEntityBaseTickTimer != null) Timings.livingEntityBaseTickTimer.stopTiming(); - - return hasUpdate; - } - - public Item[] getDrops() { - return new Item[0]; - } - - public Block[] getLineOfSight(int maxDistance) { - return this.getLineOfSight(maxDistance, 0); - } - - public Block[] getLineOfSight(int maxDistance, int maxLength) { - return this.getLineOfSight(maxDistance, maxLength, new Integer[]{}); - } - - public Block[] getLineOfSight(int maxDistance, int maxLength, Map transparent) { - return this.getLineOfSight(maxDistance, maxLength, transparent.keySet().toArray(new Integer[0])); - } - - public Block[] getLineOfSight(int maxDistance, int maxLength, Integer[] transparent) { - if (maxDistance > 120) { - maxDistance = 120; - } - - if (transparent != null && transparent.length == 0) { - transparent = null; - } - - List blocks = new ArrayList<>(); - - BlockIterator itr = new BlockIterator(this.level, this.getPosition(), this.getDirectionVector(), this.getEyeHeight(), maxDistance); - - while (itr.hasNext()) { - Block block = itr.next(); - blocks.add(block); - - if (maxLength != 0 && blocks.size() > maxLength) { - blocks.remove(0); - } - - int id = block.getId(); - - if (transparent == null) { - if (id != 0) { - break; - } - } else { - if (Arrays.binarySearch(transparent, id) < 0) { - break; - } - } - } - - return blocks.toArray(new Block[0]); - } - - public Block getTargetBlock(int maxDistance) { - return getTargetBlock(maxDistance, new Integer[]{}); - } - - public Block getTargetBlock(int maxDistance, Map transparent) { - return getTargetBlock(maxDistance, transparent.keySet().toArray(new Integer[0])); - } - - public Block getTargetBlock(int maxDistance, Integer[] transparent) { - try { - Block[] blocks = this.getLineOfSight(maxDistance, 1, transparent); - Block block = blocks[0]; - if (block != null) { - if (transparent != null && transparent.length != 0) { - if (Arrays.binarySearch(transparent, block.getId()) < 0) { - return block; - } - } else { - return block; - } - } - } catch (Exception ignored) {} - - return null; - } - - public void setMovementSpeed(float speed) { - this.movementSpeed = speed; - } - - public float getMovementSpeed() { - return this.movementSpeed; - } - - public int getAirTicks() { - return this.airTicks; - } - - public void setAirTicks(int ticks) { - this.airTicks = ticks; - } - - public boolean isBlocking() { - return this.blocking; - } - - public void setBlocking(boolean value) { - this.blocking = value; - this.setDataFlag(DATA_FLAGS_EXTENDED, DATA_FLAG_BLOCKING, value); - } - - public boolean dropsOnNaturalDeath() { - return true; - } - - public boolean isSpinAttack() { - return this.getDataFlag(DATA_FLAGS, DATA_FLAG_SPIN_ATTACK); - } - - public void setSpinAttack(boolean value) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SPIN_ATTACK, value); - } - - private void checkTameableEntityDeath() { - if (this instanceof EntityTameable) { - if (!((EntityTameable) this).hasOwner()) { - return; - } - - if (((EntityTameable) this).getOwner() == null) { - return; - } - - // TODO: More detailed death messages - String killedEntity; - if (this instanceof EntityWolf) { - killedEntity = "%entity.wolf.name"; - } else { - killedEntity = this.getName(); - } - - TranslationContainer deathMessage = new TranslationContainer("death.attack.generic", killedEntity); - if (this.getLastDamageCause() instanceof EntityDamageByEntityEvent) { - Entity damageEntity = ((EntityDamageByEntityEvent) this.getLastDamageCause()).getDamager(); - if (damageEntity instanceof Player) { - deathMessage = new TranslationContainer("death.attack.player", killedEntity, damageEntity.getName()); - } else { - if (damageEntity instanceof EntityWolf) { - ((EntityWolf) damageEntity).setAngry(false); - } - deathMessage = new TranslationContainer("death.attack.mob", killedEntity, damageEntity.getName()); - } - } - - TextPacket tameDeathMessage = new TextPacket(); - tameDeathMessage.type = TextPacket.TYPE_TRANSLATION; - tameDeathMessage.message = deathMessage.getText(); - tameDeathMessage.parameters = deathMessage.getParameters(); - tameDeathMessage.isLocalized = true; - ((EntityTameable) this).getOwner().dataPacket(tameDeathMessage); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityOwnable.java b/src/main/java/cn/nukkit/entity/EntityOwnable.java deleted file mode 100644 index 1408c976c..000000000 --- a/src/main/java/cn/nukkit/entity/EntityOwnable.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.Player; - -/** - * @author BeYkeRYkt - * Nukkit Project - */ -public interface EntityOwnable { - - String getOwnerName(); - - void setOwnerName(String playerName); - - Player getOwner(); -} diff --git a/src/main/java/cn/nukkit/entity/EntityRideable.java b/src/main/java/cn/nukkit/entity/EntityRideable.java deleted file mode 100644 index 8375f0bc0..000000000 --- a/src/main/java/cn/nukkit/entity/EntityRideable.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface EntityRideable { - - /** - * Mount or Dismounts an Entity from a rideable entity - * - * @param entity The target Entity - * @return {@code true} if the mounting successful - */ - boolean mountEntity(Entity entity); - - boolean dismountEntity(Entity entity); -} diff --git a/src/main/java/cn/nukkit/entity/EntitySmite.java b/src/main/java/cn/nukkit/entity/EntitySmite.java deleted file mode 100644 index e97c622ef..000000000 --- a/src/main/java/cn/nukkit/entity/EntitySmite.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.nukkit.entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface EntitySmite { -} diff --git a/src/main/java/cn/nukkit/entity/EntitySwimming.java b/src/main/java/cn/nukkit/entity/EntitySwimming.java deleted file mode 100644 index df6184276..000000000 --- a/src/main/java/cn/nukkit/entity/EntitySwimming.java +++ /dev/null @@ -1,148 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector2; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public abstract class EntitySwimming extends BaseEntity { - - public EntitySwimming(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - protected void checkTarget() { - if (this.isKnockback()) { - return; - } - - if (this.followTarget != null && !this.followTarget.closed && this.followTarget.isAlive() && this.followTarget.canBeFollowed()) { - return; - } - - Vector3 target = this.target; - if (!(target instanceof EntityCreature) || (!((EntityCreature) target).closed && !this.targetOption((EntityCreature) target, this.distanceSquared(target))) || !((Entity) target).canBeFollowed()) { - double near = Integer.MAX_VALUE; - for (Entity entity : this.getLevel().getEntities()) { - if (entity == this || !(entity instanceof EntityCreature) || entity.closed || !this.canTarget(entity)) { - continue; - } - - EntityCreature creature = (EntityCreature) entity; - if (creature instanceof BaseEntity && ((BaseEntity) creature).isFriendly() == this.isFriendly()) { - continue; - } - - double distance = this.distanceSquared(creature); - if (distance > near || !this.targetOption(creature, distance)) { - continue; - } - near = distance; - - this.stayTime = 0; - this.moveTime = 0; - this.target = creature; - } - } - - if (this.target instanceof EntityCreature && !((EntityCreature) this.target).closed && ((EntityCreature) this.target).isAlive() && this.targetOption((EntityCreature) this.target, this.distanceSquared(this.target))) { - return; - } - - int x, z; - if (this.stayTime > 0) { - if (Utils.rand(1, 100) > 5) { - return; - } - x = Utils.rand(10, 30); - z = Utils.rand(10, 30); - this.target = this.add(Utils.rand() ? x : -x, Utils.rand(-20.0, 20.0) / 10, Utils.rand() ? z : -z); - } else if (Utils.rand(1, 100) == 1) { - x = Utils.rand(10, 30); - z = Utils.rand(10, 30); - this.stayTime = Utils.rand(100, 200); - this.target = this.add(Utils.rand() ? x : -x, Utils.rand(-20.0, 20.0) / 10, Utils.rand() ? z : -z); - } else if (this.moveTime <= 0 || this.target == null) { - x = Utils.rand(20, 100); - z = Utils.rand(20, 100); - this.stayTime = 0; - this.moveTime = Utils.rand(100, 200); - this.target = this.add(Utils.rand() ? x : -x, 0, Utils.rand() ? z : -z); - } - } - - public Vector3 updateMove(int tickDiff) { - if (this.isMovement() && !isImmobile()) { - if (this.isKnockback()) { - this.move(this.motionX, this.motionY, this.motionZ); - this.motionY -= this.getGravity(); - this.updateMovement(); - return null; - } - - if (this.followTarget != null && !this.followTarget.closed && this.followTarget.isAlive() && this.followTarget.canBeFollowed()) { - double x = this.followTarget.x - this.x; - double z = this.followTarget.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - if (this.stayTime > 0 || this.distance(this.followTarget) <= (this.getWidth() / 2 + 0.05)) { - this.motionX = 0; - this.motionZ = 0; - } else { - this.motionX = this.getSpeed() * 0.1 * (x / diff); - this.motionZ = this.getSpeed() * 0.1 * (z / diff); - } - if (this.stayTime <= 0 || Utils.rand()) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - return this.followTarget; - } - - Vector3 before = this.target; - this.checkTarget(); - if (this.target instanceof EntityCreature || before != this.target) { - double x = this.target.x - this.x; - double z = this.target.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - if (this.stayTime > 0 || this.distance(this.target) <= (this.getWidth() / 2 + 0.05) * nearbyDistanceMultiplier()) { - this.motionX = 0; - this.motionZ = 0; - } else { - this.motionX = this.getSpeed() * 0.15 * (x / diff); - this.motionZ = this.getSpeed() * 0.15 * (z / diff); - } - if (this.stayTime <= 0 || Utils.rand()) if (this.stayTime <= 0 || Utils.rand()) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - } - - double dx = this.motionX; - double dz = this.motionZ; - - if (this.isInsideOfWater() && (this.motionX > 0 || this.motionZ > 0)) { - this.motionY = Utils.rand(-0.12, 0.12); - } else if (!this.isOnGround() && !isInsideOfWater()) { - this.motionY -= this.getGravity(); - } else { - this.motionY = 0; - } - - if (this.stayTime > 0) { - this.stayTime -= tickDiff; - this.move(0, this.motionY, 0); - } else { - Vector2 be = new Vector2(this.x + dx, this.z + dz); - this.move(dx, this.motionY, dz); - Vector2 af = new Vector2(this.x, this.z); - - if (be.x != af.x || be.y != af.y) { - this.moveTime -= 90; - } - } - - this.updateMovement(); - return this.target; - } - - return null; - } -} diff --git a/src/main/java/cn/nukkit/entity/EntityTameable.java b/src/main/java/cn/nukkit/entity/EntityTameable.java deleted file mode 100644 index f55ff9882..000000000 --- a/src/main/java/cn/nukkit/entity/EntityTameable.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.Player; - -public interface EntityTameable { - - String NAMED_TAG_OWNER = "Owner"; - - String NAMED_TAG_OWNER_UUID = "OwnerUUID"; - - String NAMED_TAG_SITTING = "Sitting"; - - Player getOwner(); - - boolean hasOwner(); - - void setOwner(Player player); - - String getOwnerUUID(); - - void setOwnerUUID(String uuid); - - boolean isSitting(); - - void setSitting(boolean sitting); -} diff --git a/src/main/java/cn/nukkit/entity/EntityWalking.java b/src/main/java/cn/nukkit/entity/EntityWalking.java deleted file mode 100644 index e796e08fc..000000000 --- a/src/main/java/cn/nukkit/entity/EntityWalking.java +++ /dev/null @@ -1,228 +0,0 @@ -package cn.nukkit.entity; - -import cn.nukkit.block.*; -import cn.nukkit.entity.passive.EntityLlama; -import cn.nukkit.entity.passive.EntitySkeletonHorse; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.BubbleParticle; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector2; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public abstract class EntityWalking extends BaseEntity { - - public EntityWalking(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - protected void checkTarget() { - if (this.isKnockback()) { - return; - } - - if (this.followTarget != null && !this.followTarget.closed && this.followTarget.isAlive() && this.followTarget.canBeFollowed()) { - return; - } - - Vector3 target = this.target; - if (!(target instanceof EntityCreature) || (!((EntityCreature) target).closed && !this.targetOption((EntityCreature) target, this.distanceSquared(target))) || !((Entity) target).canBeFollowed()) { - double near = Integer.MAX_VALUE; - - for (Entity entity : this.getLevel().getEntities()) { - if (entity == this || !(entity instanceof EntityCreature) || entity.closed || !this.canTarget(entity)) { - continue; - } - - EntityCreature creature = (EntityCreature) entity; - if (creature instanceof BaseEntity && ((BaseEntity) creature).isFriendly() == this.isFriendly()) { - continue; - } - - double distance = this.distanceSquared(creature); - if (distance > near || !this.targetOption(creature, distance)) { - continue; - } - near = distance; - - this.stayTime = 0; - this.moveTime = 0; - this.target = creature; - } - } - - if (this.target instanceof EntityCreature && !((EntityCreature) this.target).closed && ((EntityCreature) this.target).isAlive() && this.targetOption((EntityCreature) this.target, this.distanceSquared(this.target))) { - return; - } - - int x, z; - if (this.stayTime > 0) { - if (Utils.rand(1, 100) > 5) { - return; - } - x = Utils.rand(10, 30); - z = Utils.rand(10, 30); - this.target = this.add(Utils.rand() ? x : -x, Utils.rand(-20.0, 20.0) / 10, Utils.rand() ? z : -z); - } else if (Utils.rand(1, 100) == 1) { - x = Utils.rand(10, 30); - z = Utils.rand(10, 30); - this.stayTime = Utils.rand(100, 200); - this.target = this.add(Utils.rand() ? x : -x, Utils.rand(-20.0, 20.0) / 10, Utils.rand() ? z : -z); - } else if (this.moveTime <= 0 || this.target == null) { - x = Utils.rand(20, 100); - z = Utils.rand(20, 100); - this.stayTime = 0; - this.moveTime = Utils.rand(100, 200); - this.target = this.add(Utils.rand() ? x : -x, 0, Utils.rand() ? z : -z); - } - } - - protected boolean checkJump(double dx, double dz) { - if (this.motionY == this.getGravity() * 2) { - int b = level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) this.y, NukkitMath.floorDouble(this.z)); - return b == BlockID.WATER || b == BlockID.STILL_WATER; - } else if (!(this instanceof EntitySkeletonHorse)) { - int b = level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) (this.y + 0.8), NukkitMath.floorDouble(this.z)); - if (b == BlockID.WATER || b == BlockID.STILL_WATER) { - if (!this.isDrowned || this.target == null) { - this.motionY = this.getGravity() * 2; - } - return true; - } - } - - if (!this.onGround || this.stayTime > 0) { - return false; - } - - Block that = this.getLevel().getBlock(new Vector3(NukkitMath.floorDouble(this.x + dx), (int) this.y, NukkitMath.floorDouble(this.z + dz))); - /*if (this.getDirection() == null) { - return false; - }*/ - - Block block = that.getSide(this.getHorizontalFacing()); - Block down = block.down(); - if (!down.isSolid() && !block.isSolid() && !down.down().isSolid()) { - this.stayTime = 10; // "hack": try to make mobs not to be so suicidal - } else if (!block.canPassThrough() && block.up().canPassThrough() && that.up(2).canPassThrough()) { - if (block instanceof BlockFence || block instanceof BlockFenceGate) { - this.motionY = this.getGravity(); - } else if (this.motionY <= this.getGravity() * 4) { - this.motionY = this.getGravity() * 4; - } else if (block instanceof BlockStairs) { - this.motionY = this.getGravity() * 4; - } else if (this.motionY <= (this.getGravity() * 8)) { - this.motionY = this.getGravity() * 8; - } else { - this.motionY += this.getGravity() * 0.25; - } - return true; - } - return false; - } - - public Vector3 updateMove(int tickDiff) { - if (this.isMovement() && !isImmobile()) { - if (this.isKnockback()) { - this.move(this.motionX, this.motionY, this.motionZ); - this.motionY -= this.getGravity(); - this.updateMovement(); - return null; - } - - Block levelBlock = getLevelBlock(); - boolean inWater = levelBlock.getId() == 8 || levelBlock.getId() == 9; - int downId = level.getBlockIdAt(chunk, getFloorX(), getFloorY() - 1, getFloorZ()); - if (inWater && (downId == 0 || downId == 8 || downId == 9 || downId == BlockID.LAVA || downId == BlockID.STILL_LAVA || downId == BlockID.SIGN_POST || downId == BlockID.WALL_SIGN)) onGround = false; - if (downId == 0 || downId == BlockID.SIGN_POST || downId == BlockID.WALL_SIGN) onGround = false; - if (this.followTarget != null && !this.followTarget.closed && this.followTarget.isAlive() && this.followTarget.canBeFollowed()) { - double x = this.followTarget.x - this.x; - double z = this.followTarget.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - if (!inWater && (this.stayTime > 0 || this.distance(this.followTarget) <= (this.getWidth() / 2 + 0.05))) { - this.motionX = 0; - this.motionZ = 0; - } else { - if (levelBlock.getId() == BlockID.WATER) { - BlockWater blockWater = (BlockWater) levelBlock; - Vector3 flowVector = blockWater.getFlowVector(); - motionX = flowVector.getX() * .05; - motionZ = flowVector.getZ() * .05; - } else if (levelBlock.getId() == BlockID.STILL_WATER) { - this.motionX = this.getSpeed() * moveMultiplier * 0.05 * (x / diff); - this.motionZ = this.getSpeed() * moveMultiplier * 0.05 * (z / diff); - if (!this.isDrowned) this.level.addParticle(new BubbleParticle(this.add(Utils.rand(-2.0, 2.0), Utils.rand(-0.5, 0), Utils.rand(-2.0, 2.0)))); - } else { - this.motionX = this.getSpeed() * moveMultiplier * 0.1 * (x / diff); - this.motionZ = this.getSpeed() * moveMultiplier * 0.1 * (z / diff); - } - } - if ((this.passengers.isEmpty() || this instanceof EntityLlama) && (this.stayTime <= 0 || Utils.rand())) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - return this.followTarget; - } - - Vector3 before = this.target; - this.checkTarget(); - if (this.target instanceof EntityCreature || before != this.target) { - double x = this.target.x - this.x; - double z = this.target.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - if (!inWater && (this.stayTime > 0 || (this.distance(this.target) <= (this.getWidth() / 2 + 0.05) * nearbyDistanceMultiplier()))) { - this.motionX = 0; - this.motionZ = 0; - } else { - if (levelBlock.getId() == BlockID.WATER) { - BlockWater blockWater = (BlockWater) levelBlock; - Vector3 flowVector = blockWater.getFlowVector(); - motionX = flowVector.getX() * .05; - motionZ = flowVector.getZ() * .05; - } else if (levelBlock.getId() == BlockID.STILL_WATER) { - this.motionX = this.getSpeed() * moveMultiplier * 0.05 * (x / diff); - this.motionZ = this.getSpeed() * moveMultiplier * 0.05 * (z / diff); - if (!this.isDrowned) this.level.addParticle(new BubbleParticle(this.add(Utils.rand(-2.0, 2.0), Utils.rand(-0.5, 0), Utils.rand(-2.0, 2.0)))); - } else { - this.motionX = this.getSpeed() * moveMultiplier * 0.15 * (x / diff); - this.motionZ = this.getSpeed() * moveMultiplier * 0.15 * (z / diff); - } - } - if ((this.passengers.isEmpty() || this instanceof EntityLlama) && (this.stayTime <= 0 || Utils.rand())) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - } - - double dx = this.motionX; - double dz = this.motionZ; - boolean isJump = this.checkJump(dx, dz); - if (this.stayTime > 0 && !inWater) { - this.stayTime -= tickDiff; - this.move(0, this.motionY, 0); - } else { - Vector2 be = new Vector2(this.x + dx, this.z + dz); - this.move(dx, this.motionY, dz); - Vector2 af = new Vector2(this.x, this.z); - - if ((be.x != af.x || be.y != af.y) && !isJump) { - this.moveTime -= 90; - } - } - - if (!isJump) { - if (this.onGround && !inWater) { - this.motionY = 0; - } else if (this.motionY > -this.getGravity() * 4) { - int b = this.level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) (this.y + 0.8), NukkitMath.floorDouble(this.z)); - if (b != Block.WATER && b != Block.STILL_WATER && b != Block.LAVA && b != Block.STILL_LAVA) { - this.motionY -= this.getGravity(); - } - } else { - this.motionY -= this.getGravity(); - } - } - this.updateMovement(); - return this.target; - } - return null; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/ByteEntityData.java b/src/main/java/cn/nukkit/entity/data/ByteEntityData.java deleted file mode 100644 index e2640c3e3..000000000 --- a/src/main/java/cn/nukkit/entity/data/ByteEntityData.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ByteEntityData extends EntityData { - - public int data; - - public ByteEntityData(int id, int data) { - super(id); - this.data = data; - } - - public Integer getData() { - return data; - } - - public void setData(Integer data) { - if (data == null) { - this.data = 0; - } else { - this.data = data; - } - } - - @Override - public int getType() { - return Entity.DATA_TYPE_BYTE; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/EntityData.java b/src/main/java/cn/nukkit/entity/data/EntityData.java deleted file mode 100644 index 37552b1ee..000000000 --- a/src/main/java/cn/nukkit/entity/data/EntityData.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.entity.data; - -import java.util.Objects; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EntityData { - - private int id; - - protected EntityData(int id) { - this.id = id; - } - - public abstract int getType(); - - public abstract T getData(); - - public abstract void setData(T data); - - public int getId() { - return id; - } - - public EntityData setId(int id) { - this.id = id; - return this; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof EntityData && ((EntityData) obj).id == this.id && Objects.equals(((EntityData) obj).getData(), this.getData()); - } -} diff --git a/src/main/java/cn/nukkit/entity/data/EntityMetadata.java b/src/main/java/cn/nukkit/entity/data/EntityMetadata.java deleted file mode 100644 index d114cf0be..000000000 --- a/src/main/java/cn/nukkit/entity/data/EntityMetadata.java +++ /dev/null @@ -1,131 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.item.Item; -import cn.nukkit.math.Vector3; -import cn.nukkit.math.Vector3f; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityMetadata { - - private Map map = new HashMap<>(); - - public EntityData get(int id) { - return this.getOrDefault(id, null); - } - - public EntityData getOrDefault(int id, EntityData defaultValue) { - try { - return this.map.getOrDefault(id, defaultValue).setId(id); - } catch (Exception e) { - if (defaultValue != null) { - return defaultValue.setId(id); - } - return null; - } - } - - public boolean exists(int id) { - return this.map.containsKey(id); - } - - public EntityMetadata put(EntityData data) { - this.map.put(data.getId(), data); - return this; - } - - public int getByte(int id) { - return (int) this.getOrDefault(id, new ByteEntityData(id, 0)).getData() & 0xff; - } - - public int getShort(int id) { - return (int) this.getOrDefault(id, new ShortEntityData(id, 0)).getData(); - } - - public int getInt(int id) { - return (int) this.getOrDefault(id, new IntEntityData(id, 0)).getData(); - } - - public long getLong(int id) { - return (Long) this.getOrDefault(id, new LongEntityData(id, 0)).getData(); - } - - public float getFloat(int id) { - return (float) this.getOrDefault(id, new FloatEntityData(id, 0)).getData(); - } - - public boolean getBoolean(int id) { - return this.getByte(id) == 1; - } - - public CompoundTag getNBT(int id) { - return (CompoundTag) this.getOrDefault(id, new NBTEntityData(id, new CompoundTag())).getData(); - } - - public String getString(int id) { - return (String) this.getOrDefault(id, new StringEntityData(id, "")).getData(); - } - - public Vector3 getPosition(int id) { - return (Vector3) this.getOrDefault(id, new IntPositionEntityData(id, new Vector3())).getData(); - } - - public Vector3f getFloatPosition(int id) { - return (Vector3f) this.getOrDefault(id, new Vector3fEntityData(id, new Vector3f())).getData(); - } - - public EntityMetadata putByte(int id, int value) { - return this.put(new ByteEntityData(id, value)); - } - - public EntityMetadata putShort(int id, int value) { - return this.put(new ShortEntityData(id, value)); - } - - public EntityMetadata putInt(int id, int value) { - return this.put(new IntEntityData(id, value)); - } - - public EntityMetadata putLong(int id, long value) { - return this.put(new LongEntityData(id, value)); - } - - public EntityMetadata putFloat(int id, float value) { - return this.put(new FloatEntityData(id, value)); - } - - public EntityMetadata putBoolean(int id, boolean value) { - return this.putByte(id, value ? 1 : 0); - } - - public EntityMetadata putNBT(int id, CompoundTag tag) { - return this.put(new NBTEntityData(id, tag)); - } - - public EntityMetadata putSlot(int id, Item value) { - return this.put(new NBTEntityData(id, value.getNamedTag())); - } - - public EntityMetadata putString(int id, String value) { - return this.put(new StringEntityData(id, value)); - } - - public Map getMap() { - return new HashMap<>(map); - } - - private EntityMetadata replace(Map map) { - this.map = map; - return this; - } - - public EntityMetadata clone() { - return new EntityMetadata().replace(this.getMap()); - } -} diff --git a/src/main/java/cn/nukkit/entity/data/FloatEntityData.java b/src/main/java/cn/nukkit/entity/data/FloatEntityData.java deleted file mode 100644 index 35a977baa..000000000 --- a/src/main/java/cn/nukkit/entity/data/FloatEntityData.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class FloatEntityData extends EntityData { - - public float data; - - public FloatEntityData(int id, float data) { - super(id); - this.data = data; - } - - public Float getData() { - return data; - } - - public void setData(Float data) { - if (data == null) { - this.data = 0; - } else { - this.data = data; - } - } - - @Override - public int getType() { - return Entity.DATA_TYPE_FLOAT; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/IntEntityData.java b/src/main/java/cn/nukkit/entity/data/IntEntityData.java deleted file mode 100644 index f54ca6990..000000000 --- a/src/main/java/cn/nukkit/entity/data/IntEntityData.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class IntEntityData extends EntityData { - - public int data; - - public IntEntityData(int id, int data) { - super(id); - this.data = data; - } - - public Integer getData() { - return data; - } - - public void setData(Integer data) { - if (data == null) { - this.data = 0; - } else { - this.data = data; - } - } - - @Override - public int getType() { - return Entity.DATA_TYPE_INT; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/IntPositionEntityData.java b/src/main/java/cn/nukkit/entity/data/IntPositionEntityData.java deleted file mode 100644 index 4b27d9428..000000000 --- a/src/main/java/cn/nukkit/entity/data/IntPositionEntityData.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.math.Vector3; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class IntPositionEntityData extends EntityData { - - public int x; - public int y; - public int z; - - public IntPositionEntityData(int id, int x, int y, int z) { - super(id); - this.x = x; - this.y = y; - this.z = z; - } - - public IntPositionEntityData(int id, Vector3 pos) { - this(id, (int) pos.x, (int) pos.y, (int) pos.z); - } - - @Override - public BlockVector3 getData() { - return new BlockVector3(x, y, z); - } - - @Override - public void setData(BlockVector3 data) { - if (data != null) { - this.x = data.x; - this.y = data.y; - this.z = data.z; - } - } - - @Override - public int getType() { - return Entity.DATA_TYPE_POS; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/LongEntityData.java b/src/main/java/cn/nukkit/entity/data/LongEntityData.java deleted file mode 100644 index 63d0b5f58..000000000 --- a/src/main/java/cn/nukkit/entity/data/LongEntityData.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class LongEntityData extends EntityData { - - public long data; - - public LongEntityData(int id, long data) { - super(id); - this.data = data; - } - - public Long getData() { - return data; - } - - public void setData(Long data) { - this.data = data; - } - - @Override - public int getType() { - return Entity.DATA_TYPE_LONG; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/NBTEntityData.java b/src/main/java/cn/nukkit/entity/data/NBTEntityData.java deleted file mode 100644 index b24b3be1e..000000000 --- a/src/main/java/cn/nukkit/entity/data/NBTEntityData.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; -import cn.nukkit.item.Item; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class NBTEntityData extends EntityData { - - public CompoundTag tag; - public Item item; - - public NBTEntityData(int id, CompoundTag tag) { - super(id); - this.tag = tag; - } - - public NBTEntityData(int id, Item item) { - super(id); - this.item = item; - this.tag = item.getNamedTag(); - } - - @Override - public CompoundTag getData() { - return this.tag; - } - - @Override - public void setData(CompoundTag tag) { - this.tag = tag; - } - - @Override - public int getType() { - return Entity.DATA_TYPE_NBT; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/ShortEntityData.java b/src/main/java/cn/nukkit/entity/data/ShortEntityData.java deleted file mode 100644 index ca73db3ba..000000000 --- a/src/main/java/cn/nukkit/entity/data/ShortEntityData.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ShortEntityData extends EntityData { - - public int data; - - public ShortEntityData(int id, int data) { - super(id); - this.data = data; - } - - public Integer getData() { - return data; - } - - public void setData(Integer data) { - if (data == null) { - this.data = 0; - } else { - this.data = data; - } - } - - @Override - public int getType() { - return Entity.DATA_TYPE_SHORT; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/Skin.java b/src/main/java/cn/nukkit/entity/data/Skin.java deleted file mode 100644 index 298dffbae..000000000 --- a/src/main/java/cn/nukkit/entity/data/Skin.java +++ /dev/null @@ -1,328 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.Server; -import cn.nukkit.nbt.stream.FastByteArrayOutputStream; -import cn.nukkit.utils.PersonaPiece; -import cn.nukkit.utils.PersonaPieceTint; -import cn.nukkit.utils.SerializedImage; -import cn.nukkit.utils.SkinAnimation; -import com.google.common.base.Preconditions; -import com.nimbusds.jose.shaded.json.JSONObject; -import com.nimbusds.jose.shaded.json.JSONValue; -import lombok.ToString; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.List; -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class Skin { - - public static final int SINGLE_SKIN_SIZE = 8192; - public static final int DOUBLE_SKIN_SIZE = 16384; - public static final int SKIN_128_64_SIZE = 32768; - public static final int SKIN_128_128_SIZE = 65536; - - private static final int MAX_DATA_SIZE = 262144; - - public static final String GEOMETRY_CUSTOM = convertLegacyGeometryName("geometry.humanoid.custom"); - public static final String GEOMETRY_CUSTOM_SLIM = convertLegacyGeometryName("geometry.humanoid.customSlim"); - - public static final String STEVE_SKIN = "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ll9B/5ZfQf+WX0H/lm9b/6p9Zv+Wb1v/lm9b/4dVO/+WX0H/ll9B/5ZfQf+qfWb/lm9b/6p9Zv+Wb1v/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWScz/VknM/1ZJzP9WScz/KCgo/ygoKP8oKCj/KCgo/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKio/wDMzP8AzMz/AKio/1ExJf9qQDD/UTEl/2pAMP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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"; - public static final String STEVE_GEOMETRY = "{\"geometry.humanoid\":{\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,16]}]},{\"name\":\"waist\",\"neverRender\":true,\"pivot\":[0,12,0]},{\"name\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"hat\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"uv\":[32,0],\"inflate\":0.5}],\"neverRender\":true},{\"name\":\"rightArm\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}]},{\"name\":\"leftArm\",\"pivot\":[5,22,0],\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}],\"mirror\":true},{\"name\":\"rightLeg\",\"pivot\":[-1.9,12,0],\"cubes\":[{\"origin\":[-3.9,0,-2],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leftLeg\",\"pivot\":[1.9,12,0],\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"uv\":[0,16]}],\"mirror\":true}]},\"geometry.cape\":{\"texturewidth\":64,\"textureheight\":32,\"bones\":[{\"name\":\"cape\",\"pivot\":[0,24,-3],\"cubes\":[{\"origin\":[-5,8,-3],\"size\":[10,16,1],\"uv\":[0,0]}],\"material\":\"alpha\"}]},\"geometry.humanoid.custom:geometry.humanoid\":{\"bones\":[{\"name\":\"hat\",\"neverRender\":false,\"material\":\"alpha\",\"pivot\":[0,24,0]},{\"name\":\"leftArm\",\"reset\":true,\"mirror\":false,\"pivot\":[5,22,0],\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[32,48]}]},{\"name\":\"rightArm\",\"reset\":true,\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}]},{\"name\":\"rightItem\",\"pivot\":[-6,15,1],\"neverRender\":true,\"parent\":\"rightArm\"},{\"name\":\"leftSleeve\",\"pivot\":[5,22,0],\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[48,48],\"inflate\":0.25}],\"material\":\"alpha\"},{\"name\":\"rightSleeve\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,32],\"inflate\":0.25}],\"material\":\"alpha\"},{\"name\":\"leftLeg\",\"reset\":true,\"mirror\":false,\"pivot\":[1.9,12,0],\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"uv\":[16,48]}]},{\"name\":\"leftPants\",\"pivot\":[1.9,12,0],\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"uv\":[0,48],\"inflate\":0.25}],\"pos\":[1.9,12,0],\"material\":\"alpha\"},{\"name\":\"rightPants\",\"pivot\":[-1.9,12,0],\"cubes\":[{\"origin\":[-3.9,0,-2],\"size\":[4,12,4],\"uv\":[0,32],\"inflate\":0.25}],\"pos\":[-1.9,12,0],\"material\":\"alpha\"},{\"name\":\"jacket\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,32],\"inflate\":0.25}],\"material\":\"alpha\"}]},\"geometry.humanoid.customSlim:geometry.humanoid\":{\"bones\":[{\"name\":\"hat\",\"neverRender\":false,\"material\":\"alpha\"},{\"name\":\"leftArm\",\"reset\":true,\"mirror\":false,\"pivot\":[5,21.5,0],\"cubes\":[{\"origin\":[4,11.5,-2],\"size\":[3,12,4],\"uv\":[32,48]}]},{\"name\":\"rightArm\",\"reset\":true,\"pivot\":[-5,21.5,0],\"cubes\":[{\"origin\":[-7,11.5,-2],\"size\":[3,12,4],\"uv\":[40,16]}]},{\"pivot\":[-6,14.5,1],\"neverRender\":true,\"name\":\"rightItem\",\"parent\":\"rightArm\"},{\"name\":\"leftSleeve\",\"pivot\":[5,21.5,0],\"cubes\":[{\"origin\":[4,11.5,-2],\"size\":[3,12,4],\"uv\":[48,48],\"inflate\":0.25}],\"material\":\"alpha\"},{\"name\":\"rightSleeve\",\"pivot\":[-5,21.5,0],\"cubes\":[{\"origin\":[-7,11.5,-2],\"size\":[3,12,4],\"uv\":[40,32],\"inflate\":0.25}],\"material\":\"alpha\"},{\"name\":\"leftLeg\",\"reset\":true,\"mirror\":false,\"pivot\":[1.9,12,0],\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"uv\":[16,48]}]},{\"name\":\"leftPants\",\"pivot\":[1.9,12,0],\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"uv\":[0,48],\"inflate\":0.25}],\"material\":\"alpha\"},{\"name\":\"rightPants\",\"pivot\":[-1.9,12,0],\"cubes\":[{\"origin\":[-3.9,0,-2],\"size\":[4,12,4],\"uv\":[0,32],\"inflate\":0.25}],\"material\":\"alpha\"},{\"name\":\"jacket\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,32],\"inflate\":0.25}],\"material\":\"alpha\"}]}}"; - public static Skin NO_PERSONA_SKIN; - static { - Skin skin = new Skin(); - skin.setGeometryData(STEVE_GEOMETRY); - skin.setGeometryName("geometry.humanoid.custom"); - skin.setSkinId("Standard_Custom"); - skin.setSkinData(Base64.getDecoder().decode(Skin.STEVE_SKIN)); - NO_PERSONA_SKIN = skin; - } - - private final String fullSkinId = UUID.randomUUID().toString(); - private String skinId; - private String playFabId = ""; - private String skinResourcePatch = GEOMETRY_CUSTOM; - private SerializedImage skinData; - private final List animations = new ArrayList<>(); - private final List personaPieces = new ArrayList<>(); - private final List tintColors = new ArrayList<>(); - private SerializedImage capeData; - private String geometryData; - private String animationData; - private boolean premium; - private boolean persona; - private boolean capeOnClassic; - private boolean primaryUser = true; - private String capeId; - public boolean isLegacySlim; - private String skinColor = "#0"; - private String armSize = "wide"; - private boolean trusted = true; - private String geometryDataEngineVersion = ""; - - public boolean isValid() { - return isValidSkin() && isValidResourcePatch(); - } - - private boolean isValidSkin() { - return skinId != null && !skinId.trim().isEmpty() && skinData != null && skinData.width >= 64 && skinData.height >= 32 && skinData.data.length >= SINGLE_SKIN_SIZE && (Server.getInstance().doNotLimitSkinGeometry || skinData.data.length <= MAX_DATA_SIZE); - } - - private boolean isValidResourcePatch() { - if (skinResourcePatch == null) { - return false; - } - try { - JSONObject geometry = (JSONObject) ((JSONObject) JSONValue.parse(skinResourcePatch)).get("geometry"); - return geometry.containsKey("default") && geometry.get("default") instanceof String; - } catch (ClassCastException | NullPointerException e) { - return false; - } - } - - public SerializedImage getSkinData() { - if (skinData == null) { - return SerializedImage.EMPTY; - } - return skinData; - } - - public String getSkinId() { - return skinId; - } - - public void setSkinId(String skinId) { - if (skinId == null || skinId.trim().isEmpty()) { - return; - } - this.skinId = skinId; - } - - public void setSkinData(byte[] skinData) { - setSkinData(SerializedImage.fromLegacy(skinData)); - } - - public void setSkinData(BufferedImage image) { - setSkinData(parseBufferedImage(image)); - } - - public void setSkinData(SerializedImage skinData) { - Objects.requireNonNull(skinData, "skinData"); - this.skinData = skinData; - } - - public void setSkinResourcePatch(String skinResourcePatch) { - if (skinResourcePatch == null || skinResourcePatch.trim().isEmpty()) { - this.skinResourcePatch = GEOMETRY_CUSTOM; - return; - } - this.skinResourcePatch = skinResourcePatch; - } - - public void setGeometryName(String geometryName) { - // Hack for slim skins on older versions - if (geometryName.equals("geometry.humanoid.customSlim")) { - this.isLegacySlim = true; - } - - if (geometryName.trim().isEmpty()) { - this.skinResourcePatch = GEOMETRY_CUSTOM; - return; - } - - this.skinResourcePatch = "{\"geometry\" : {\"default\" : \"" + geometryName + "\"}}"; - } - - public String getSkinResourcePatch() { - if (this.skinResourcePatch == null) { - return ""; - } - return skinResourcePatch; - } - - public SerializedImage getCapeData() { - if (capeData == null) { - return SerializedImage.EMPTY; - } - return capeData; - } - - public String getCapeId() { - if (capeId == null) { - return ""; - } - return capeId; - } - - public void setCapeId(String capeId) { - if (capeId == null || capeId.trim().isEmpty()) { - capeId = null; - } - this.capeId = capeId; - } - - public void setCapeData(byte[] capeData) { - Objects.requireNonNull(capeData, "capeData"); - if (capeData.length == SINGLE_SKIN_SIZE) { - setCapeData(new SerializedImage(64, 32, capeData)); - } - } - - public void setCapeData(BufferedImage image) { - setCapeData(parseBufferedImage(image)); - } - - public void setCapeData(SerializedImage capeData) { - Objects.requireNonNull(capeData, "capeData"); - this.capeData = capeData; - } - - public String getGeometryData() { - if (geometryData == null) { - return ""; - } - return geometryData; - } - - public void setGeometryData(String geometryData) { - Preconditions.checkNotNull(geometryData, "geometryData"); - if (!geometryData.equals(this.geometryData)) { - if (Server.getInstance().doNotLimitSkinGeometry || geometryData.getBytes().length < MAX_DATA_SIZE) { - this.geometryData = geometryData; - } - } - } - - public String getAnimationData() { - if (animationData == null) { - return ""; - } - return animationData; - } - - public void setAnimationData(String animationData) { - Preconditions.checkNotNull(animationData, "animationData"); - if (!animationData.equals(this.animationData)) { - if (Server.getInstance().doNotLimitSkinGeometry|| animationData.getBytes().length < MAX_DATA_SIZE) { - this.animationData = animationData; - } - } - } - - public List getAnimations() { - return animations; - } - - public List getPersonaPieces() { - return personaPieces; - } - - public List getTintColors() { - return tintColors; - } - - public boolean isPremium() { - return premium; - } - - public void setPremium(boolean premium) { - this.premium = premium; - } - - public boolean isPersona() { - return persona; - } - - public void setPersona(boolean persona) { - this.persona = persona; - } - - public boolean isCapeOnClassic() { - return capeOnClassic; - } - - public void setCapeOnClassic(boolean capeOnClassic) { - this.capeOnClassic = capeOnClassic; - } - - public void setPrimaryUser(boolean primaryUser) { - this.primaryUser = primaryUser; - } - - public boolean isPrimaryUser() { - return primaryUser; - } - - public void setGeometryDataEngineVersion(String geometryDataEngineVersion) { - this.geometryDataEngineVersion = geometryDataEngineVersion; - } - - public String getGeometryDataEngineVersion() { - return geometryDataEngineVersion; - } - - public boolean isTrusted() { - return trusted; - } - - public void setTrusted(boolean trusted) { - this.trusted = trusted; - } - - public String getSkinColor() { - return skinColor; - } - - public void setSkinColor(String skinColor) { - this.skinColor = skinColor; - } - - public String getArmSize() { - return armSize; - } - - public void setArmSize(String armSize) { - this.armSize = armSize; - } - - public String getFullSkinId() { - return fullSkinId; - } - - public void setPlayFabId(String playFabId) { - this.playFabId = playFabId; - } - - public String getPlayFabId() { - if (this.playFabId == null || this.playFabId.isEmpty()) { - this.playFabId = this.fullSkinId.replace("-", "").substring(16); - } - return this.playFabId; - } - - private static SerializedImage parseBufferedImage(BufferedImage image) { - FastByteArrayOutputStream outputStream = new FastByteArrayOutputStream(); - for (int y = 0; y < image.getHeight(); y++) { - for (int x = 0; x < image.getWidth(); x++) { - Color color = new Color(image.getRGB(x, y), true); - outputStream.write(color.getRed()); - outputStream.write(color.getGreen()); - outputStream.write(color.getBlue()); - outputStream.write(color.getAlpha()); - } - } - image.flush(); - return new SerializedImage(image.getWidth(), image.getHeight(), outputStream.toByteArray()); - } - - private static String convertLegacyGeometryName(String geometryName) { - return "{\"geometry\" : {\"default\" : \"" + geometryName + "\"}}"; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/StringEntityData.java b/src/main/java/cn/nukkit/entity/data/StringEntityData.java deleted file mode 100644 index 80771a36a..000000000 --- a/src/main/java/cn/nukkit/entity/data/StringEntityData.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class StringEntityData extends EntityData { - - public String data; - - public StringEntityData(int id, String data) { - super(id); - this.data = data; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - @Override - public int getType() { - return Entity.DATA_TYPE_STRING; - } - - @Override - public String toString() { - return data; - } -} diff --git a/src/main/java/cn/nukkit/entity/data/Vector3fEntityData.java b/src/main/java/cn/nukkit/entity/data/Vector3fEntityData.java deleted file mode 100644 index 5d769075a..000000000 --- a/src/main/java/cn/nukkit/entity/data/Vector3fEntityData.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.entity.data; - -import cn.nukkit.entity.Entity; -import cn.nukkit.math.Vector3f; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Vector3fEntityData extends EntityData { - - public float x; - public float y; - public float z; - - public Vector3fEntityData(int id, float x, float y, float z) { - super(id); - this.x = x; - this.y = y; - this.z = z; - } - - public Vector3fEntityData(int id, Vector3f pos) { - this(id, pos.x, pos.y, pos.z); - } - - @Override - public Vector3f getData() { - return new Vector3f(x, y, z); - } - - @Override - public void setData(Vector3f data) { - if (data != null) { - this.x = data.x; - this.y = data.y; - this.z = data.z; - } - } - - @Override - public int getType() { - return Entity.DATA_TYPE_VECTOR3F; - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityArmorStand.java b/src/main/java/cn/nukkit/entity/item/EntityArmorStand.java deleted file mode 100644 index e4341990b..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityArmorStand.java +++ /dev/null @@ -1,378 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityInteractable; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.inventory.EntityArmorInventory; -import cn.nukkit.inventory.EntityEquipmentInventory; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemArmor; -import cn.nukkit.item.ItemArmorStand; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.DestroyBlockParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.network.protocol.SetEntityDataPacket; -import cn.nukkit.scheduler.Task; - -import java.util.Collection; - -public class EntityArmorStand extends Entity implements InventoryHolder, EntityInteractable { - - public static final int NETWORK_ID = 61; - - public static final String TAG_MAINHAND = "Mainhand"; - public static final String TAG_OFFHAND = "Offhand"; - public static final String TAG_POSE_INDEX = "PoseIndex"; - public static final String TAG_ARMOR = "Armor"; - - private EntityEquipmentInventory equipmentInventory; - private EntityArmorInventory armorInventory; - - private int vibrateTimer = 0; - private boolean vibrating; - - public EntityArmorStand(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - - if (nbt.contains(TAG_POSE_INDEX)) { - this.setPose(nbt.getInt(TAG_POSE_INDEX)); - } - } - - private static int getArmorSlot(ItemArmor armorItem) { - if (armorItem.canBePutInHelmetSlot()) { - return 0; - } else if (armorItem.isChestplate()) { - return 1; - } else if (armorItem.isLeggings()) { - return 2; - } else { - return 3; - } - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - protected float getGravity() { - return 0.04f; - } - - @Override - public float getHeight() { - return 1.975f; - } - - @Override - public float getWidth() { - return 0.5f; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setHealth(6); - this.setMaxHealth(6); - this.setImmobile(true); - - this.equipmentInventory = new EntityEquipmentInventory(this); - this.armorInventory = new EntityArmorInventory(this); - - if (this.namedTag.contains(TAG_MAINHAND)) { - this.equipmentInventory.setItemInHand(NBTIO.getItemHelper(this.namedTag.getCompound(TAG_MAINHAND)), true); - } - - if (this.namedTag.contains(TAG_OFFHAND)) { - this.equipmentInventory.setOffhandItem(NBTIO.getItemHelper(this.namedTag.getCompound(TAG_OFFHAND)), true); - } - - if (this.namedTag.contains(TAG_ARMOR)) { - ListTag armorList = this.namedTag.getList(TAG_ARMOR, CompoundTag.class); - for (CompoundTag armorTag : armorList.getAll()) { - this.armorInventory.setItem(armorTag.getByte("Slot"), NBTIO.getItemHelper(armorTag)); - } - } - - if (this.namedTag.contains(TAG_POSE_INDEX)) { - this.setPose(this.namedTag.getInt(TAG_POSE_INDEX)); - } - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clicedPos) { - if (player.isSneaking()) { - if (this.getPose() >= 12) { - this.setPose(0); - } else { - this.setPose(this.getPose() + 1); - } - return false; // do not consume item - } - - if (this.isValid() && !player.isSpectator()) { - int i = 0; - boolean flag = !item.isNull(); - boolean isArmorSlot = false; - - if (flag && item instanceof ItemArmor) { - ItemArmor itemArmor = (ItemArmor) item; - i = getArmorSlot(itemArmor); - isArmorSlot = true; - } - - if (flag && (item.getId() == Item.SKULL) || item.getId() == Item.PUMPKIN) { - i = 0; - } - - int j = 0; - double d3 = clicedPos.y - this.y; - boolean flag2 = false; - - if (d3 >= 0.1 && d3 < 0.55 && !this.armorInventory.getItem(EntityArmorInventory.SLOT_FEET).isNull()) { - j = 3; - flag2 = isArmorSlot = true; - } else if (d3 >= 0.9 && d3 < 1.6 && !this.armorInventory.getItem(EntityArmorInventory.SLOT_CHEST).isNull()) { - j = 1; - flag2 = isArmorSlot = true; - } else if (d3 >= 0.4 && d3 < 1.2 && !this.armorInventory.getItem(EntityArmorInventory.SLOT_LEGS).isNull()) { - j = 2; - flag2 = isArmorSlot = true; - } else if (d3 >= 1.6 && !this.armorInventory.getItem(EntityArmorInventory.SLOT_HEAD).isNull()) { - flag2 = isArmorSlot = true; - } else if (!this.equipmentInventory.getItem(j).isNull()) { - flag2 = true; - } - - if (flag) { - this.tryChangeEquipment(player, item, i, isArmorSlot); - } else if (flag2) { - this.tryChangeEquipment(player, item, j, isArmorSlot); - } - - this.equipmentInventory.sendContents(this.getViewers().values()); - this.armorInventory.sendContents(this.getViewers().values()); - return flag || flag2; - } - return false; - } - - private void tryChangeEquipment(Player player, Item handItem, int slot, boolean isArmorSlot) { - Item item = isArmorSlot ? this.armorInventory.getItem(slot) : this.equipmentInventory.getItem(slot); - - if (player.isCreative() && item.isNull() && !handItem.isNull()) { - Item itemClone = handItem.clone(); - itemClone.setCount(1); - if (isArmorSlot) { - this.armorInventory.setItem(slot, itemClone); - } else { - this.equipmentInventory.setItem(slot, itemClone); - } - } else if (!handItem.isNull() && handItem.getCount() > 1) { - if (item.isNull()) { - Item itemClone = handItem.clone(); - itemClone.setCount(1); - if (isArmorSlot) { - this.armorInventory.setItem(slot, itemClone); - } else { - this.equipmentInventory.setItem(slot, itemClone); - } - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - } else { - if (isArmorSlot) { - this.armorInventory.setItem(slot, handItem); - } else { - this.equipmentInventory.setItem(slot, handItem); - } - Server.getInstance().getScheduler().scheduleDelayedTask(new Hack(player, item, player.getInventory().getHeldItemIndex()), 1); - } - } - - private int getPose() { - return this.dataProperties.getInt(Entity.DATA_ARMOR_STAND_POSE_INDEX); - } - - private void setPose(int pose) { - this.dataProperties.putInt(Entity.DATA_ARMOR_STAND_POSE_INDEX, pose); - SetEntityDataPacket setEntityDataPacket = new SetEntityDataPacket(); - setEntityDataPacket.eid = this.getId(); - setEntityDataPacket.metadata = this.getDataProperties().clone(); - getViewers().values().forEach(all -> all.dataPacket(setEntityDataPacket)); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.put(TAG_MAINHAND, NBTIO.putItemHelper(this.equipmentInventory.getItemInHand())); - this.namedTag.put(TAG_OFFHAND, NBTIO.putItemHelper(this.equipmentInventory.getOffHandItem())); - - if (this.armorInventory != null) { - ListTag armorTag = new ListTag<>(TAG_ARMOR); - for (int i = 0; i < 4; i++) { - armorTag.add(NBTIO.putItemHelper(this.armorInventory.getItem(i), i)); - } - this.namedTag.putList(armorTag); - } - - this.namedTag.putInt(TAG_POSE_INDEX, this.getPose()); - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - this.equipmentInventory.sendContents(player); - this.armorInventory.sendContents(player); - } - - @Override - public void spawnToAll() { - if (this.chunk != null && !this.closed) { - Collection chunkPlayers = this.level.getChunkPlayers(this.chunk.getX(), this.chunk.getZ()).values(); - for (Player chunkPlayer : chunkPlayers) { - this.spawnTo(chunkPlayer); - } - } - } - - @Override - public void fall(float fallDistance) { - super.fall(fallDistance); - - this.level.addLevelSoundEvent(this, LevelEventPacket.EVENT_SOUND_ARMOR_STAND_FALL); - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (source.getCause() == EntityDamageEvent.DamageCause.CONTACT) { - source.setCancelled(true); - } - - boolean hasUpdate = super.attack(source); - if (!hasUpdate) { - return false; - } - - if (!source.isCancelled()) { - this.level.addParticle(new DestroyBlockParticle(this, Block.get(Block.WOODEN_PLANKS))); - this.setGenericFlag(Entity.DATA_FLAG_VIBRATING, true); - this.vibrateTimer = 20; - this.vibrating = true; - - if (source instanceof EntityDamageByEntityEvent) { - EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) source; - if (event.getDamager() instanceof Player) { - Player player = (Player) event.getDamager(); - if (player.isCreative()) { - this.close(); - return true; - } - - if (this.level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) { - this.level.dropItem(this, new ItemArmorStand()); - this.equipmentInventory.getContents().values().forEach(items -> this.level.dropItem(this, items)); - this.equipmentInventory.clearAll(); - this.armorInventory.getContents().values().forEach(items -> this.level.dropItem(this, items)); - this.armorInventory.clearAll(); - } - } - } - this.close(); - } - return true; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Armor Stand"; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - boolean hasUpdate = super.entityBaseTick(tickDiff); - - if (this.vibrating && this.vibrateTimer-- <= 0) { - this.setGenericFlag(Entity.DATA_FLAG_VIBRATING, false); - this.vibrating = false; - } - - return hasUpdate; - } - - public EntityEquipmentInventory getEquipmentInventory() { - return this.equipmentInventory; - } - - @Override - public EntityArmorInventory getInventory() { - return this.armorInventory; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - boolean hasUpdate = super.onUpdate(currentTick); - - if (!this.isOnGround()) { - this.motionX = 0; - this.motionY -= getGravity(); - this.motionZ = 0; - } - - if (this.move(this.motionX, this.motionY, this.motionZ)) { - this.updateMovement(); - } - - if (this.timing != null) this.timing.stopTiming(); - - return hasUpdate; - } - - @Override - public String getInteractButtonText() { - return "action.interact.armorstand.equip"; - } - - @Override - public boolean canDoInteraction() { - return true; - } - - private static class Hack extends Task { - - private final Player player; - private final Item item; - private final int index; - - public Hack(Player player, Item item, int index) { - this.player = player; - this.item = item; - this.index = index; - } - - @Override - public void onRun(int i) { - player.getInventory().decreaseCount(index); - player.getInventory().addItem(item); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityBoat.java b/src/main/java/cn/nukkit/entity/item/EntityBoat.java deleted file mode 100644 index 3f458225a..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityBoat.java +++ /dev/null @@ -1,475 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockWater; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.entity.data.ByteEntityData; -import cn.nukkit.entity.data.FloatEntityData; -import cn.nukkit.entity.passive.EntityWaterAnimal; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.vehicle.VehicleMoveEvent; -import cn.nukkit.event.vehicle.VehicleUpdateEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.math.Vector3f; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.AnimatePacket; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.network.protocol.SetEntityLinkPacket; - -import java.util.ArrayList; - -/** - * Created by yescallop on 2016/2/13. - */ -public class EntityBoat extends EntityVehicle { - - public static final int NETWORK_ID = 90; - - public static final int DATA_WOOD_ID = 20; - - public static final Vector3f RIDER_PLAYER_OFFSET = new Vector3f(0, 1.02001f, 0); - public static final Vector3f RIDER_OFFSET = new Vector3f(0, -0.2f, 0); - - public static final Vector3f PASSENGER_OFFSET = new Vector3f(-0.6f); - public static final Vector3f RIDER_PASSENGER_OFFSET = new Vector3f(0.2f); - - public static final int RIDER_INDEX = 0; - public static final int PASSENGER_INDEX = 1; - - public static final double SINKING_DEPTH = 0.07; - public static final double SINKING_SPEED = 0.0005; - public static final double SINKING_MAX_SPEED = 0.005; - - protected boolean sinking = true; - public int woodID; - private boolean inWater; - - public EntityBoat(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - - this.setMaxHealth(40); - this.setHealth(40); - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag.contains("Variant")) { - this.woodID = this.namedTag.getInt("Variant"); - } - this.dataProperties.putInt(DATA_VARIANT, this.woodID); - this.dataProperties.putBoolean(DATA_IS_BUOYANT, true); - this.dataProperties.putString(DATA_BUOYANCY_DATA, "{\"apply_gravity\":true,\"base_buoyancy\":1.0,\"big_wave_probability\":0.02999999932944775,\"big_wave_speed\":10.0,\"drag_down_on_buoyancy_removed\":0.0,\"liquid_blocks\":[\"minecraft:water\",\"minecraft:flowing_water\"],\"simulate_waves\":true}"); - } - - @Override - public float getHeight() { - return 0.455f; - } - - @Override - public float getWidth() { - return 1.4f; - } - - @Override - protected float getDrag() { - return 0.1f; - } - - @Override - protected float getGravity() { - return 0.03999999910593033F; - } - - @Override - public float getBaseOffset() { - return 0.375F; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (invulnerable) { - return false; - } else { - source.setDamage(source.getDamage() * 2); - - boolean attack = super.attack(source); - - if (isAlive()) { - performHurtAnimation(); - } - - return attack; - } - } - - @Override - public void close() { - super.close(); - - for (Entity linkedEntity : this.passengers) { - linkedEntity.riding = null; - } - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - int tickDiff = currentTick - this.lastUpdate; - - if (tickDiff <= 0 && !this.justCreated) { - return true; - } - - this.lastUpdate = currentTick; - - boolean hasUpdate = this.entityBaseTick(tickDiff); - - if (this.isAlive()) { - super.onUpdate(currentTick); - - inWater = false; - double waterDiff = getWaterLevel(); - if (!hasControllingPassenger()) { - if (waterDiff > SINKING_DEPTH && !sinking) { - sinking = true; - } else if (waterDiff < -0.07 && sinking) { - sinking = false; - } - - if (waterDiff < -0.07) { - this.motionY = Math.min(0.05, this.motionY + 0.005); - } else if (waterDiff < 0 || !sinking) { - this.motionY = this.motionY > SINKING_MAX_SPEED ? Math.max(this.motionY - 0.02, SINKING_MAX_SPEED) : this.motionY + SINKING_SPEED; - } - } else if (!inWater && level.getBlockIdAt(chunk, NukkitMath.floorDouble(x), ((int) y) - 1, NukkitMath.floorDouble(z)) == 0) { - this.motionY = -0.5; - } - - if (this.checkObstruction(this.x, this.y, this.z)) { - hasUpdate = true; - } - - //this.move(this.motionX, this.motionY, this.motionZ); - - double friction = 1 - this.getDrag(); - - if (this.onGround && (Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionZ) > 0.00001)) { - friction *= this.getLevel().getBlock(this.temporalVector.setComponents((int) Math.floor(this.x), (int) Math.floor(this.y - 1), (int) Math.floor(this.z) - 1)).getFrictionFactor(); - } - - this.motionX *= friction; - - if (!hasControllingPassenger()) { - if (waterDiff > SINKING_DEPTH || sinking) { - this.motionY = waterDiff > 0.5 ? this.motionY - this.getGravity() : (this.motionY - SINKING_SPEED < -0.005 ? this.motionY : this.motionY - SINKING_SPEED); - } - } - - this.motionZ *= friction; - - Location from = new Location(lastX, lastY, lastZ, lastYaw, lastPitch, level); - Location to = new Location(this.x, this.y, this.z, this.yaw, this.pitch, level); - - this.getServer().getPluginManager().callEvent(new VehicleUpdateEvent(this)); - - if (!from.equals(to)) { - this.getServer().getPluginManager().callEvent(new VehicleMoveEvent(this, from, to)); - } - - this.move(this.motionX, this.motionY, this.motionZ); - - this.updateMovement(); - - if (this.age % 5 == 0) { - int passengersCount = this.passengers.size(); - if (passengersCount > 0) { - Block[] blocks = this.level.getCollisionBlocks(this.getBoundingBox().grow(0.1, 0.3, 0.1)); - for (Block b : blocks) { - if (b.getId() == Block.LILY_PAD) { - this.level.setBlockAt((int) b.x, (int) b.y, (int) b.z, 0, 0); - this.level.dropItem(b, Item.get(Item.LILY_PAD, 0, 1)); - } - } - } - - if (passengersCount < 2) { - Entity[] e = this.level.getCollidingEntities(this.boundingBox.grow(0.20000000298023224, 0.0D, 0.20000000298023224), this); - for (Entity entity : e) { - if (entity.isPlayer && !isPassenger(entity)) { - entity.resetFallDistance(); // Hack: Don't kick players standing on a boat for flying - } - - if (entity.riding != null || !(entity instanceof EntityLiving) || entity instanceof Player || entity instanceof EntityWaterAnimal || isPassenger(entity)) { - continue; - } - - this.mountEntity(entity); - - if (this.passengers.size() >= 2) { - break; - } - } - } - } - } - - return hasUpdate || !this.onGround || Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionY) > 0.00001 || Math.abs(this.motionZ) > 0.00001; - } - - public void updatePassengers() { - updatePassengers(false); - } - - public void updatePassengers(boolean sendLinks) { - if (this.passengers.isEmpty()) { - return; - } - - for (Entity passenger : new ArrayList<>(passengers)) { - if (!passenger.isAlive()) { - dismountEntity(passenger); - } - } - - Entity ent; - - if (passengers.size() == 1) { - (ent = this.passengers.get(0)).setSeatPosition(getMountedOffset(ent)); - super.updatePassengerPosition(ent); - - if (sendLinks) { - broadcastLinkPacket(ent, SetEntityLinkPacket.TYPE_RIDE); - } - } else if (passengers.size() == 2) { - if (!((ent = passengers.get(0)) instanceof Player)) { //swap - Entity passenger2 = passengers.get(1); - - if (passenger2 instanceof Player) { - this.passengers.set(0, passenger2); - this.passengers.set(1, ent); - - ent = passenger2; - } - } - - ent.setSeatPosition(getMountedOffset(ent).add(RIDER_PASSENGER_OFFSET)); - super.updatePassengerPosition(ent); - if (sendLinks) { - broadcastLinkPacket(ent, SetEntityLinkPacket.TYPE_RIDE); - } - - (ent = this.passengers.get(1)).setSeatPosition(getMountedOffset(ent).add(PASSENGER_OFFSET)); - - super.updatePassengerPosition(ent); - - if (sendLinks) { - broadcastLinkPacket(ent, SetEntityLinkPacket.TYPE_PASSENGER); - } - - float yawDiff = ent.getId() % 2 == 0 ? 90 : 270; - ent.setRotation(this.yaw + yawDiff, ent.pitch); - ent.updateMovement(); - } else { - for (Entity passenger : passengers) { - super.updatePassengerPosition(passenger); - } - } - } - - public double getWaterLevel() { - double maxY = this.boundingBox.minY + getBaseOffset(); - AxisAlignedBB.BBConsumer consumer = new AxisAlignedBB.BBConsumer() { - - private double diffY = Double.MAX_VALUE; - - @Override - public void accept(int x, int y, int z) { - Block block = EntityBoat.this.level.getBlock(EntityBoat.this.temporalVector.setComponents(x, y, z)); - - if (block instanceof BlockWater) { - double level = block.getMaxY(); - - diffY = Math.min(maxY - level, diffY); - inWater = true; - } - } - - @Override - public Double get() { - return diffY; - } - }; - - this.boundingBox.forEach(consumer); - - return consumer.get(); - } - - @Override - public boolean mountEntity(Entity entity) { - boolean player = this.passengers.size() >= 1 && this.passengers.get(0) instanceof Player; - byte mode = SetEntityLinkPacket.TYPE_PASSENGER; - - if (!player && (entity instanceof Player || this.passengers.isEmpty())) { - mode = SetEntityLinkPacket.TYPE_RIDE; - } - - boolean r = super.mountEntity(entity, mode); - - if (entity.riding != null) { - updatePassengers(true); - - entity.setDataProperty(new ByteEntityData(DATA_RIDER_ROTATION_LOCKED, 1), !entity.isPlayer); - if (entity.isPlayer) { - entity.setDataProperty(new FloatEntityData(DATA_RIDER_MAX_ROTATION, 90), false); - entity.setDataProperty(new FloatEntityData(DATA_RIDER_MIN_ROTATION, 1), false); - if (((Player) entity).protocol >= ProtocolInfo.v1_16_210) { - entity.setDataProperty(new FloatEntityData(DATA_RIDER_ROTATION_OFFSET, -90), false); - } - entity.sendData(((Player) entity)); - } - } - - return r; - } - - @Override - protected void updatePassengerPosition(Entity passenger) { - updatePassengers(); - } - - @Override - public boolean dismountEntity(Entity entity) { - boolean r = super.dismountEntity(entity); - - if (r) { - updatePassengers(); - if (entity.isPlayer) { - entity.setDataPropertyAndSendOnlyToSelf(new ByteEntityData(DATA_RIDER_ROTATION_LOCKED, 0)); - } else { - entity.setDataProperty(new ByteEntityData(DATA_RIDER_ROTATION_LOCKED, 0), true); - } - } - return r; - } - - @Override - public boolean isControlling(Entity entity) { - return entity instanceof Player && this.passengers.indexOf(entity) == 0; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (this.passengers.size() >= 2 || getWaterLevel() < -SINKING_DEPTH) { - return false; - } - - this.mountEntity(player); - return super.onInteract(player, item, clickedPos); - } - - @Override - public Vector3f getMountedOffset(Entity entity) { - return entity instanceof Player ? RIDER_PLAYER_OFFSET : RIDER_OFFSET; - } - - public void onPaddle(AnimatePacket.Action animation, float value) { - int propertyId = animation == AnimatePacket.Action.ROW_RIGHT ? DATA_PADDLE_TIME_RIGHT : DATA_PADDLE_TIME_LEFT; - - if (getDataPropertyFloat(propertyId) != value) { - this.setDataProperty(new FloatEntityData(propertyId, value)); - } - } - - @Override - public void applyEntityCollision(Entity entity) { - if (this.riding == null && entity.riding != this && !entity.passengers.contains(this)) { - if (!entity.boundingBox.intersectsWith(this.boundingBox.grow(0.20000000298023224, -0.1, 0.20000000298023224)) - || entity instanceof Player && ((Player) entity).getGamemode() == Player.SPECTATOR) { - return; - } - - double diffX = entity.x - this.x; - double diffZ = entity.z - this.z; - - double direction = NukkitMath.getDirection(diffX, diffZ); - - if (direction >= 0.009999999776482582D) { - direction = Math.sqrt(direction); - diffX /= direction; - diffZ /= direction; - - double d3 = Math.min(1 / direction, 1); - - diffX *= d3; - diffZ *= d3; - diffX *= 0.05000000074505806; - diffZ *= 0.05000000074505806; - diffX *= 1 + entityCollisionReduction; - diffZ *= 1 + entityCollisionReduction; - - if (this.riding == null) { - motionX -= diffX; - motionZ -= diffZ; - } - } - } - } - - @Override - public boolean canPassThrough() { - return false; - } - - @Override - public void kill() { - if (!this.isAlive()) { - return; - } - - super.kill(); - - if (level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) { - this.level.dropItem(this, Item.get(ItemID.BOAT, this.woodID)); - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putInt("Variant", this.woodID); - } - - public int getVariant() { - return this.woodID; - } - - public void setVariant(int variant) { - this.woodID = variant; - this.dataProperties.putInt(DATA_VARIANT, variant); - } - - public void onInput(double x, double y, double z, double yaw) { - this.setPositionAndRotation(this.temporalVector.setComponents(x, y - this.getBaseOffset(), z), yaw % 360, 0); - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityEndCrystal.java b/src/main/java/cn/nukkit/entity/item/EntityEndCrystal.java deleted file mode 100644 index ada6e54a8..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityEndCrystal.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.ExplosionPrimeEvent; -import cn.nukkit.level.Explosion; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * Created by PetteriM1 - */ -public class EntityEndCrystal extends Entity implements EntityExplosive { - - public static final int NETWORK_ID = 71; - - protected boolean detonated = false; - - @Override - public float getLength() { - return 1.0f; - } - - @Override - public float getHeight() { - return 1.5f; - } - - @Override - public float getWidth() { - return 1.0f; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityEndCrystal(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag.contains("ShowBottom")) { - this.setShowBase(this.namedTag.getBoolean("ShowBottom")); - } - - this.fireProof = true; - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putBoolean("ShowBottom", this.showBase()); - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (this.closed) { - return false; - } - - if (source.getCause() == EntityDamageEvent.DamageCause.FIRE || source.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK || source.getCause() == EntityDamageEvent.DamageCause.LAVA) { - return false; - } - - this.explode(); - - return true; - } - - @Override - public boolean canCollideWith(Entity entity) { - return true; - } - - public boolean showBase() { - return this.getDataFlag(DATA_FLAGS, DATA_FLAG_SHOWBASE); - } - - public void setShowBase(boolean value) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SHOWBASE, value); - } - - @Override - public void explode() { - this.close(); - if (!detonated && ((level.getServer().suomiCraftPEMode() && this.level.getGameRules().getBoolean(GameRule.TNT_EXPLODES)) || (!level.getServer().suomiCraftPEMode() && this.level.getGameRules().getBoolean(GameRule.MOB_GRIEFING)))) { - this.detonated = true; - ExplosionPrimeEvent ev = new ExplosionPrimeEvent(this, 6); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) return; - Explosion explode = new Explosion(this.add(0, this.getHeight() / 2, 0), (float) ev.getForce(), this); - explode.explodeA(); - explode.explodeB(); - } - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "End Crystal"; - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityExpBottle.java b/src/main/java/cn/nukkit/entity/item/EntityExpBottle.java deleted file mode 100644 index ac8875344..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityExpBottle.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.EnchantParticle; -import cn.nukkit.level.particle.SpellParticle; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -/** - * @author xtypr - */ -public class EntityExpBottle extends EntityProjectile { - - public static final int NETWORK_ID = 68; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - protected float getGravity() { - return 0.1f; - } - - @Override - protected float getDrag() { - return 0.01f; - } - - public EntityExpBottle(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityExpBottle(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - if (this.age > 1200) { - this.close(); - return false; - } - - if (this.isCollided) { - this.dropXp(); - this.close(); - return false; - } - - if (this.timing != null) this.timing.stopTiming(); - - return super.onUpdate(currentTick); - } - - @Override - public void onCollideWithEntity(Entity entity) { - this.dropXp(); - this.close(); - } - - public void dropXp() { - this.getLevel().addParticle(new EnchantParticle(this)); - this.getLevel().addParticle(new SpellParticle(this, 0x00385dc6)); - this.getLevel().dropExpOrb(this, Utils.rand(3, 12)); - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityFallingBlock.java b/src/main/java/cn/nukkit/entity/item/EntityFallingBlock.java deleted file mode 100644 index 2c70e3ff3..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityFallingBlock.java +++ /dev/null @@ -1,252 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockLiquid; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.event.entity.EntityBlockChangeEvent; -import cn.nukkit.event.entity.EntityDamageByBlockEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.item.Item; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.sound.AnvilFallSound; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.AddEntityPacket; - -/** - * @author MagicDroidX - */ -public class EntityFallingBlock extends Entity { - - public static final int NETWORK_ID = 66; - - @Override - public float getWidth() { - return 0.98f; - } - - @Override - public float getLength() { - return 0.98f; - } - - @Override - public float getHeight() { - return 0.98f; - } - - @Override - protected float getGravity() { - return 0.04f; - } - - @Override - protected float getDrag() { - return 0.02f; - } - - @Override - protected float getBaseOffset() { - return 0.49f; - } - - @Override - public boolean canCollide() { - return blockId == BlockID.ANVIL; - } - - protected int blockId; - protected int damage; - - public EntityFallingBlock(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (namedTag != null) { - if (namedTag.contains("TileID")) { - blockId = namedTag.getInt("TileID"); - } else if (namedTag.contains("Tile")) { - blockId = namedTag.getInt("Tile"); - namedTag.putInt("TileID", blockId); - } - - if (namedTag.contains("Data")) { - damage = namedTag.getByte("Data"); - } - } - - if (blockId == 0) { - close(); - return; - } - - this.fireProof = true; - } - - @Override // Multiversion: display correct block - public void spawnTo(Player player) { - if (!this.hasSpawned.containsKey(player.getLoaderId()) && player.usedChunks.containsKey(Level.chunkHash(this.chunk.getX(), this.chunk.getZ()))) { - AddEntityPacket addEntity = new AddEntityPacket(); - addEntity.type = this.getNetworkId(); - addEntity.entityUniqueId = this.id; - addEntity.entityRuntimeId = this.id; - addEntity.yaw = (float) this.yaw; - addEntity.headYaw = (float) this.yaw; - addEntity.pitch = (float) this.pitch; - addEntity.x = (float) this.x; - addEntity.y = (float) this.y; - addEntity.z = (float) this.z; - addEntity.speedX = (float) this.motionX; - addEntity.speedY = (float) this.motionY; - addEntity.speedZ = (float) this.motionZ; - addEntity.metadata = this.dataProperties.clone().put(new IntEntityData(DATA_VARIANT, GlobalBlockPalette.getOrCreateRuntimeId(player.protocol, this.blockId, this.damage))); - player.dataPacket(addEntity); - this.hasSpawned.put(player.getLoaderId(), player); - } - } - - public boolean canCollideWith(Entity entity) { - return blockId == BlockID.ANVIL; - } - - @Override - public boolean attack(EntityDamageEvent source) { - return source.getCause() == DamageCause.VOID && super.attack(source); - } - - @Override - public boolean onUpdate(int currentTick) { - if (closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - int tickDiff = currentTick - lastUpdate; - if (tickDiff <= 0 && !justCreated) { - return true; - } - - lastUpdate = currentTick; - - boolean hasUpdate = entityBaseTick(tickDiff); - - if (isAlive()) { - motionY -= getGravity(); - - move(motionX, motionY, motionZ); - - float friction = 1 - getDrag(); - - motionX *= friction; - motionY *= 1 - getDrag(); - motionZ *= friction; - - Vector3 pos = new Vector3(x - 0.5, y, z - 0.5).round(); - - if (onGround) { - close(); - Block block = level.getBlock(pos); - Block floorBlock = this.level.getBlock(pos); - if (this.getBlock() == Block.SNOW_LAYER && floorBlock.getId() == Block.SNOW_LAYER && (floorBlock.getDamage() & 0x7) != 0x7) { - int mergedHeight = (floorBlock.getDamage() & 0x7) + 1 + (this.getDamage() & 0x7) + 1; - if (mergedHeight > 8) { - EntityBlockChangeEvent event = new EntityBlockChangeEvent(this, floorBlock, Block.get(Block.SNOW_LAYER, 0x7)); - this.server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.level.setBlock(pos, event.getTo(), true); - - Vector3 abovePos = pos.up(); - Block aboveBlock = this.level.getBlock(abovePos); - if (aboveBlock.getId() == Block.AIR) { - EntityBlockChangeEvent event2 = new EntityBlockChangeEvent(this, aboveBlock, Block.get(Block.SNOW_LAYER, mergedHeight - 9)); // -8-1 - this.server.getPluginManager().callEvent(event2); - if (!event2.isCancelled()) { - this.level.setBlock(abovePos, event2.getTo(), true); - } - } - } - } else { - EntityBlockChangeEvent event = new EntityBlockChangeEvent(this, floorBlock, Block.get(Block.SNOW_LAYER, mergedHeight - 1)); - this.server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.level.setBlock(pos, event.getTo(), true); - } - } - } else if ((block.isTransparent() && !block.canBeReplaced() || this.getBlock() == Block.SNOW_LAYER && block instanceof BlockLiquid)) { - if (this.getBlock() != Block.SNOW_LAYER ? this.level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS) : this.level.getGameRules().getBoolean(GameRule.DO_TILE_DROPS)) { - getLevel().dropItem(this, Item.get(this.blockId, this.damage, 1)); - } - } else { - EntityBlockChangeEvent event = new EntityBlockChangeEvent(this, block, Block.get(blockId, damage)); - server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - getLevel().setBlock(pos, event.getTo(), true, true); - getLevel().scheduleUpdate(getLevel().getBlock(pos), 1); - - if (event.getTo().getId() == Item.ANVIL) { - getLevel().addSound(new AnvilFallSound(pos)); - - Entity[] e = level.getCollidingEntities(this.getBoundingBox(), this); - for (Entity entity : e) { - if (entity instanceof EntityLiving && highestPosition > y) { - entity.attack(new EntityDamageByBlockEvent(event.getTo(), entity, DamageCause.CONTACT, (float) Math.min(40, Math.max(0, (highestPosition - y) * 2)))); - } - } - } - } - } - hasUpdate = true; - } - - updateMovement(); - } - - if (this.timing != null) this.timing.stopTiming(); - - return hasUpdate || !onGround || Math.abs(motionX) > 0.00001 || Math.abs(motionY) > 0.00001 || Math.abs(motionZ) > 0.00001; - } - - public int getBlock() { - return blockId; - } - - public int getDamage() { - return damage; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public void saveNBT() { - namedTag.putInt("TileID", blockId); - namedTag.putByte("Data", damage); - } - - @Override - public boolean canBeMovedByCurrents() { - return false; - } - - @Override - public void resetFallDistance() { - if (!this.closed) { // For falling anvil: do not reset fall distance before dealing damage to entities - this.highestPosition = this.y; - } - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityFirework.java b/src/main/java/cn/nukkit/entity/item/EntityFirework.java deleted file mode 100644 index eb22a1812..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityFirework.java +++ /dev/null @@ -1,132 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.data.NBTEntityData; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import org.apache.commons.math3.util.FastMath; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author CreeperFace - */ -public class EntityFirework extends Entity { - - public static final int NETWORK_ID = 72; - - private int lifetime; - private Item firework; - - public EntityFirework(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void initEntity() { - super.initEntity(); - - ThreadLocalRandom rand = ThreadLocalRandom.current(); - this.lifetime = 30 + rand.nextInt(6) + rand.nextInt(7); - - this.motionX = rand.nextGaussian() * 0.001D; - this.motionZ = rand.nextGaussian() * 0.001D; - this.motionY = 0.05D; - - if (namedTag.contains("FireworkItem")) { - firework = NBTIO.getItemHelper(namedTag.getCompound("FireworkItem")); - this.setDataProperty(new NBTEntityData(Entity.DATA_DISPLAY_ITEM, firework)); - } - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - int tickDiff = currentTick - this.lastUpdate; - - if (tickDiff <= 0 && !this.justCreated) { - return true; - } - - this.lastUpdate = currentTick; - - if (this.timing != null) this.timing.startTiming(); - - boolean hasUpdate = this.entityBaseTick(tickDiff); - - if (this.isAlive()) { - - this.motionX *= 1.15D; - this.motionZ *= 1.15D; - this.motionY += 0.04D; - this.move(this.motionX, this.motionY, this.motionZ); - - this.updateMovement(); - - float f = (float) Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.yaw = (float) (FastMath.atan2(this.motionX, this.motionZ) * (57.29577951308232)); - - this.pitch = (float) (FastMath.atan2(this.motionY, f) * (57.29577951308232)); - - if (this.age == 0) { - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_LAUNCH); - } - - if (this.age >= this.lifetime) { - EntityEventPacket pk = new EntityEventPacket(); - pk.event = EntityEventPacket.FIREWORK_EXPLOSION; - pk.eid = this.getId(); - - this.level.addChunkPacket(this.getFloorX() >> 4, this.getFloorZ() >> 4, pk); - - level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_LARGE_BLAST, -1, NETWORK_ID); - - this.kill(); // Using close() here would remove the firework before the explosion is displayed - - hasUpdate = true; - } - } - - if (this.timing != null) this.timing.stopTiming(); - - return hasUpdate || !this.onGround || Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionY) > 0.00001 || Math.abs(this.motionZ) > 0.00001; - } - - @Override - public boolean attack(EntityDamageEvent source) { - return (source.getCause() == DamageCause.VOID || - source.getCause() == DamageCause.FIRE_TICK || - source.getCause() == DamageCause.ENTITY_EXPLOSION || - source.getCause() == DamageCause.BLOCK_EXPLOSION) - && super.attack(source); - } - - public void setFirework(Item item) { - this.firework = item; - this.setDataProperty(new NBTEntityData(Entity.DATA_DISPLAY_ITEM, firework)); - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/entity/item/EntityFishingHook.java b/src/main/java/cn/nukkit/entity/item/EntityFishingHook.java deleted file mode 100644 index 340684f2c..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityFishingHook.java +++ /dev/null @@ -1,325 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.data.LongEntityData; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.entity.EntityDamageByChildEntityEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.ProjectileHitEvent; -import cn.nukkit.event.player.PlayerFishEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBookEnchanted; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.randomitem.Fishing; -import cn.nukkit.level.MovingObjectPosition; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.BubbleParticle; -import cn.nukkit.level.particle.WaterParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.AddEntityPacket; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.utils.Utils; - -import java.util.Collection; -import java.util.concurrent.ThreadLocalRandom; - - -/** - * Created by PetteriM1 - */ -public class EntityFishingHook extends EntityProjectile { - - public static final int NETWORK_ID = 77; - - public int waitChance = 120; - public int waitTimer = 240; - public boolean attracted = false; - public int attractTimer = 0; - public boolean caught = false; - public int caughtTimer = 0; - public boolean canCollide = true; - private long target = 0; - - public Vector3 fish = null; - - public Item rod = null; - - public EntityFishingHook(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityFishingHook(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - protected void initEntity() { - super.initEntity(); - if (this.age > 0) { - this.close(); - } - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.2f; - } - - @Override - public float getLength() { - return 0.2f; - } - - @Override - public float getHeight() { - return 0.2f; - } - - @Override - public float getGravity() { - return 0.07f; - } - - @Override - public float getDrag() { - return 0.05f; - } - - @Override - public boolean onUpdate(int currentTick) { - boolean hasUpdate = super.onUpdate(currentTick); - - if (this.target != 0) { - Entity ent = this.level.getEntity(this.target); - if (ent == null || !ent.isAlive()) { - this.setTarget(0); - } else { - this.setPosition(new Vector3(ent.x, ent.y + (getHeight() * 0.75f), ent.z)); - } - hasUpdate = true; - } - - if (hasUpdate) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - boolean inWater = this.isInsideOfWater(); - if (inWater) { - this.motionX = 0; - this.motionY -= getGravity() * -0.04; - this.motionZ = 0; - hasUpdate = true; - } else if (this.isCollided && this.keepMovement) { - this.motionX = 0; - this.motionY = 0; - this.motionZ = 0; - this.keepMovement = false; - hasUpdate = true; - } - - if (inWater) { - if (this.waitTimer == 240) { - this.waitTimer = this.waitChance << 1; - } else if (this.waitTimer == 360) { - this.waitTimer = this.waitChance * 3; - } - if (!this.attracted) { - if (this.waitTimer > 0) { - --this.waitTimer; - } - if (this.waitTimer == 0) { - if (Utils.random.nextInt(100) < 90) { - this.attractTimer = (Utils.random.nextInt(40) + 20); - this.spawnFish(); - this.caught = false; - this.attracted = true; - } else { - this.waitTimer = this.waitChance; - } - } - } else if (!this.caught) { - if (this.attractFish()) { - this.caughtTimer = (Utils.random.nextInt(20) + 30); - this.fishBites(); - this.caught = true; - } - } else { - if (this.caughtTimer > 0) { - --this.caughtTimer; - } - if (this.caughtTimer == 0) { - this.attracted = false; - this.caught = false; - this.waitTimer = this.waitChance * 3; - } - } - } - - if (this.timing != null) this.timing.stopTiming(); - - return hasUpdate; - } - - public int getWaterHeight() { - for (int y = this.getFloorY(); y < 256; y++) { - int id = this.level.getBlockIdAt(chunk, this.getFloorX(), y, this.getFloorZ()); - if (id == Block.AIR) { - return y; - } - } - return this.getFloorY(); - } - - public void fishBites() { - Collection viewers = this.getViewers().values(); - - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.FISH_HOOK_HOOK; - Server.broadcastPacket(viewers, pk); - - EntityEventPacket bubblePk = new EntityEventPacket(); - bubblePk.eid = this.getId(); - bubblePk.event = EntityEventPacket.FISH_HOOK_BUBBLE; - Server.broadcastPacket(viewers, bubblePk); - - EntityEventPacket teasePk = new EntityEventPacket(); - teasePk.eid = this.getId(); - teasePk.event = EntityEventPacket.FISH_HOOK_TEASE; - Server.broadcastPacket(viewers, teasePk); - - this.level.addParticle(new BubbleParticle(this.setComponents( - this.x + Utils.random.nextDouble() * 0.5 - 0.25, - this.getWaterHeight(), - this.z + Utils.random.nextDouble() * 0.5 - 0.25 - )), null, 5); - } - - public void spawnFish() { - this.fish = new Vector3( - this.x + (Utils.random.nextDouble() * 1.2 + 1) * (Utils.random.nextBoolean() ? -1 : 1), - this.getWaterHeight(), - this.z + (Utils.random.nextDouble() * 1.2 + 1) * (Utils.random.nextBoolean() ? -1 : 1) - ); - } - - public boolean attractFish() { - double multiply = 0.1; - this.fish.setComponents( - this.fish.x + (this.x - this.fish.x) * multiply, - this.fish.y, - this.fish.z + (this.z - this.fish.z) * multiply - ); - if (Utils.random.nextInt(100) < 85) { - this.level.addParticle(new WaterParticle(this.fish)); - } - double dist = Math.abs(Math.sqrt(this.x * this.x + this.z * this.z) - Math.sqrt(this.fish.x * this.fish.x + this.fish.z * this.fish.z)); - return dist < 0.15; - } - - public void reelLine() { - if (this.shootingEntity instanceof Player && this.caught) { - Player player = (Player) this.shootingEntity; - Item item = Fishing.getFishingResult(this.rod); - if (item instanceof ItemBookEnchanted) { - if (!item.hasEnchantments()) { - item = item.clone(); - item.addEnchantment(Enchantment.getEnchantment(Utils.rand(0, 36))); - } - } - int experience = Utils.random.nextInt(3) + 1; - Vector3 motion = player.subtract(this).multiply(0.1); - motion.y += Math.sqrt(player.distance(this)) * 0.08; - - PlayerFishEvent event = new PlayerFishEvent(player, this, item, experience, motion); - this.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - EntityItem itemEntity = new EntityItem( - this.level.getChunk((int) this.x >> 4, (int) this.z >> 4, true), - Entity.getDefaultNBT(new Vector3(this.x, this.getWaterHeight(), this.z), event.getMotion(), ThreadLocalRandom.current().nextFloat() * 360, 0).putShort("Health", 5).putCompound("Item", NBTIO.putItemHelper(event.getLoot())).putShort("PickupDelay", 1)); - - itemEntity.setOwner(player.getName()); - itemEntity.spawnToAll(); - - player.addExperience(event.getExperience()); - } - } - this.close(); - } - - @Override - protected DataPacket createAddEntityPacket() { - AddEntityPacket pk = new AddEntityPacket(); - pk.entityRuntimeId = this.getId(); - pk.entityUniqueId = this.getId(); - pk.type = NETWORK_ID; - pk.x = (float) this.x; - pk.y = (float) this.y; - pk.z = (float) this.z; - pk.speedX = (float) this.motionX; - pk.speedY = (float) this.motionY; - pk.speedZ = (float) this.motionZ; - pk.yaw = (float) this.yaw; - pk.pitch = (float) this.pitch; - - long ownerId = -1; - if (this.shootingEntity != null) { - ownerId = this.shootingEntity.getId(); - } - pk.metadata = this.dataProperties.putLong(DATA_OWNER_EID, ownerId).clone(); - return pk; - } - - @Override - public boolean canCollide() { - return this.canCollide; - } - - @Override - public void onCollideWithEntity(Entity entity) { - this.server.getPluginManager().callEvent(new ProjectileHitEvent(this, MovingObjectPosition.fromEntity(entity))); - float damage = this.getResultDamage(); - - EntityDamageEvent ev; - if (this.shootingEntity == null) { - ev = new EntityDamageByEntityEvent(this, entity, DamageCause.PROJECTILE, damage); - } else { - ev = new EntityDamageByChildEntityEvent(this.shootingEntity, this, entity, DamageCause.PROJECTILE, damage); - } - - if (entity.attack(ev)) { - this.setTarget(entity.getId()); - } - } - - public void checkLure() { - if (rod != null) { - Enchantment ench = rod.getEnchantment(Enchantment.ID_LURE); - if (ench != null) { - this.waitChance = 120 - (25 * ench.getLevel()); - } - } - } - - public void setTarget(long eid) { - this.target = eid; - this.setDataProperty(new LongEntityData(DATA_TARGET_EID, eid)); - this.canCollide = eid == 0; - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityItem.java b/src/main/java/cn/nukkit/entity/item/EntityItem.java deleted file mode 100644 index ae9d717aa..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityItem.java +++ /dev/null @@ -1,375 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.ItemDespawnEvent; -import cn.nukkit.event.entity.ItemSpawnEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.AddItemEntityPacket; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.EntityEventPacket; -import co.aikar.timings.Timings; -import co.aikar.timings.TimingsHistory; - -/** - * @author MagicDroidX - */ -public class EntityItem extends Entity { - - public static final int NETWORK_ID = 64; - protected String owner; - protected String thrower; - protected Item item; - protected int pickupDelay; - - public EntityItem(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - public float getGravity() { - return 0.04f; - } - - @Override - public float getDrag() { - return 0.02f; - } - - @Override - protected float getBaseOffset() { - return 0.125f; - } - - @Override - public boolean canCollide() { - return false; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(5); - this.setHealth(this.namedTag.getShort("Health")); - - if (this.namedTag.contains("Age")) { - this.age = this.namedTag.getShort("Age"); - } - - if (this.namedTag.contains("PickupDelay")) { - this.pickupDelay = this.namedTag.getShort("PickupDelay"); - } - - if (this.namedTag.contains("Owner")) { - this.owner = this.namedTag.getString("Owner"); - } - - if (this.namedTag.contains("Thrower")) { - this.thrower = this.namedTag.getString("Thrower"); - } - - if (!this.namedTag.contains("Item")) { - this.close(); - return; - } - - this.item = NBTIO.getItemHelper(this.namedTag.getCompound("Item")); - - int id = this.item.getId(); - if (id >= Item.NETHERITE_INGOT && id <= Item.NETHERITE_SCRAP) { - this.fireProof = true; // Netherite items are fireproof - } - - this.server.getPluginManager().callEvent(new ItemSpawnEvent(this)); - } - - @Override - public boolean attack(EntityDamageEvent source) { - return (source.getCause() == DamageCause.VOID || - source.getCause() == DamageCause.CONTACT || - source.getCause() == DamageCause.FIRE_TICK || - (source.getCause() == DamageCause.ENTITY_EXPLOSION || - source.getCause() == DamageCause.BLOCK_EXPLOSION) && - !this.isInsideOfWater() && (this.item == null || - this.item.getId() != Item.NETHER_STAR)) && super.attack(source); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - int tickDiff = currentTick - this.lastUpdate; - - if (tickDiff <= 0 && !this.justCreated) { - return true; - } - - this.lastUpdate = currentTick; - - if (this.timing != null) this.timing.startTiming(); - - if (!this.fireProof && this.isInsideOfFire()) { - this.close(); - if (this.timing != null) this.timing.stopTiming(); - return true; - } - - boolean hasUpdate = this.entityBaseTick(tickDiff); - - if (this.isAlive()) { - //Entity[] e = null; - - if (this.pickupDelay > 0 && this.pickupDelay < 32767) { - this.pickupDelay -= tickDiff; - if (this.pickupDelay < 0) { - this.pickupDelay = 0; - } - }/* else { - e = this.getLevel().getNearbyEntities(getBoundingBox().grow(1, 1, 1), this, false); - for (Entity entity : e) { - if (entity.isPlayer) { - if (((Player) entity).pickupEntity(this, true)) { - if (this.timing != null) this.timing.stopTiming(); - return true; - } - } - } - }*/ - - if (this.age > 6000) { - ItemDespawnEvent ev = new ItemDespawnEvent(this); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - this.age = 0; - } else { - this.close(); - if (this.timing != null) this.timing.stopTiming(); - return true; - } - } - - if (this.age % 200 == 0 && this.onGround && this.item != null) { - if (this.item.getCount() < this.item.getMaxStackSize()) { - //if (e == null) { - Entity[] e = this.getLevel().getNearbyEntities(getBoundingBox().grow(1, 1, 1), this, false); - //} - - for (Entity entity : e) { - if (entity instanceof EntityItem) { - if (entity.closed || !entity.isAlive()) { - continue; - } - Item closeItem = ((EntityItem) entity).item; - if (!closeItem.equals(item, true, true)) { - continue; - } - if (!entity.isOnGround()) { - continue; - } - int newAmount = this.item.getCount() + closeItem.getCount(); - if (newAmount > this.item.getMaxStackSize()) { - continue; - } - closeItem.setCount(0); - entity.close(); - this.item.setCount(newAmount); - EntityEventPacket packet = new EntityEventPacket(); - packet.eid = getId(); - packet.data = newAmount; - packet.event = EntityEventPacket.MERGE_ITEMS; - Server.broadcastPacket(this.getViewers().values(), packet); - } - } - } - } - - if (this.isInsideOfWater()) { - this.motionY = this.getGravity() - 0.06; - } else if (!this.isOnGround()) { - this.motionY -= this.getGravity(); - } - - if (this.checkObstruction(this.x, this.y, this.z)) { - hasUpdate = true; - } - - //this.move(this.motionX, this.motionY, this.motionZ); - - double friction = 1 - this.getDrag(); - - if (this.onGround && (Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionZ) > 0.00001)) { - friction *= this.getLevel().getBlock(this.temporalVector.setComponents((int) Math.floor(this.x), (int) Math.floor(this.y - 1), (int) Math.floor(this.z) - 1)).getFrictionFactor(); - } - - this.motionX *= friction; - this.motionY *= 1 - this.getDrag(); - this.motionZ *= friction; - - if (this.onGround) { - this.motionY *= -0.5; - } - - if (this.move(this.motionX, this.motionY, this.motionZ)) this.updateMovement(); - } - - if (this.timing != null) this.timing.stopTiming(); - - return hasUpdate || !this.onGround || Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionY) > 0.00001 || Math.abs(this.motionZ) > 0.00001; - } - - @Override - public void saveNBT() { - super.saveNBT(); - if (this.item != null) { // Yes, a item can be null... I don't know what causes this, but it can happen. - this.namedTag.putCompound("Item", NBTIO.putItemHelper(this.item, -1)); - this.namedTag.putShort("Health", (int) this.getHealth()); - this.namedTag.putShort("Age", this.age); - this.namedTag.putShort("PickupDelay", this.pickupDelay); - if (this.owner != null) { - this.namedTag.putString("Owner", this.owner); - } - - if (this.thrower != null) { - this.namedTag.putString("Thrower", this.thrower); - } - } - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : (this.item.hasCustomName() ? this.item.getCustomName() : this.item.getName()); - } - - public Item getItem() { - return item; - } - - @Override - public boolean canCollideWith(Entity entity) { - return false; - } - - public int getPickupDelay() { - return pickupDelay; - } - - public void setPickupDelay(int pickupDelay) { - this.pickupDelay = pickupDelay; - } - - public String getOwner() { - return owner; - } - - public void setOwner(String owner) { - this.owner = owner; - } - - public String getThrower() { - return thrower; - } - - public void setThrower(String thrower) { - this.thrower = thrower; - } - - @Override - public DataPacket createAddEntityPacket() { - AddItemEntityPacket addEntity = new AddItemEntityPacket(); - addEntity.entityUniqueId = this.getId(); - addEntity.entityRuntimeId = this.getId(); - addEntity.x = (float) this.x; - addEntity.y = (float) this.y; - addEntity.z = (float) this.z; - addEntity.speedX = (float) this.motionX; - addEntity.speedY = (float) this.motionY; - addEntity.speedZ = (float) this.motionZ; - addEntity.metadata = this.dataProperties.clone(); - addEntity.item = this.item; - return addEntity; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.startTiming(); - - this.collisionBlocks = null; - this.justCreated = false; - - if (!this.isAlive()) { - this.despawnFromAll(); - this.close(); - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.stopTiming(); - return false; - } - - boolean hasUpdate = false; - - this.checkBlockCollision(); - - if (this.y <= -16 && this.isAlive()) { - this.attack(new EntityDamageEvent(this, DamageCause.VOID, 10)); - hasUpdate = true; - } - - if (this.fireTicks > 0) { - if (this.fireProof) { - this.fireTicks -= tickDiff << 2; - if (this.fireTicks < 0) { - this.fireTicks = 0; - } - } else { - if ((this.fireTicks % 20) == 0 || tickDiff > 20) { - this.attack(new EntityDamageEvent(this, DamageCause.FIRE_TICK, 1)); - } - this.fireTicks -= tickDiff; - } - if (this.fireTicks <= 0) { - this.extinguish(); - } else if (!this.fireProof) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ONFIRE, true); - hasUpdate = true; - } - } - - if (this.noDamageTicks > 0) { - this.noDamageTicks -= tickDiff; - if (this.noDamageTicks < 0) { - this.noDamageTicks = 0; - } - } - - this.age += tickDiff; - TimingsHistory.activatedEntityTicks++; - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.stopTiming(); - return hasUpdate; - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartAbstract.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartAbstract.java deleted file mode 100644 index 9f6c3da4b..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityMinecartAbstract.java +++ /dev/null @@ -1,824 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockRail; -import cn.nukkit.block.BlockRailActivator; -import cn.nukkit.block.BlockRailPowered; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityControllable; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.entity.data.ByteEntityData; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.vehicle.VehicleMoveEvent; -import cn.nukkit.event.vehicle.VehicleUpdateEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemMinecart; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.MinecartType; -import cn.nukkit.utils.Rail; -import cn.nukkit.utils.Rail.Orientation; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Objects; - -/** - * Created by: larryTheCoder on 2017/6/26. - *

- * Nukkit Project, - * Minecart and Riding Project, - * Package cn.nukkit.entity.item in project Nukkit. - */ -public abstract class EntityMinecartAbstract extends EntityVehicle implements EntityControllable { - - private String entityName; - private static final int[][][] matrix = new int[][][]{ - {{0, 0, -1}, {0, 0, 1}}, - {{-1, 0, 0}, {1, 0, 0}}, - {{-1, -1, 0}, {1, 0, 0}}, - {{-1, 0, 0}, {1, -1, 0}}, - {{0, 0, -1}, {0, -1, 1}}, - {{0, -1, -1}, {0, 0, 1}}, - {{0, 0, 1}, {1, 0, 0}}, - {{0, 0, 1}, {-1, 0, 0}}, - {{0, 0, -1}, {-1, 0, 0}}, - {{0, 0, -1}, {1, 0, 0}} - }; - private double currentSpeed = 0; - private Block blockInside; - // Plugins modifiers - private boolean slowWhenEmpty = true; - private double derailedX = 0.5; - private double derailedY = 0.5; - private double derailedZ = 0.5; - private double flyingX = 0.95; - private double flyingY = 0.95; - private double flyingZ = 0.95; - private double maxSpeed = 0.4D; - - public abstract MinecartType getType(); - - public abstract boolean isRideable(); - - public EntityMinecartAbstract(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - - setMaxHealth(40); - setHealth(40); - } - - @Override - public float getHeight() { - return 0.7F; - } - - @Override - public float getWidth() { - return 0.98F; - } - - @Override - protected float getDrag() { - return 0.1F; - } - - public void setName(String name) { - entityName = name; - } - - @Override - public String getName() { - return entityName; - } - - @Override - public float getBaseOffset() { - return 0.35F; - } - - @Override - public boolean hasCustomName() { - return entityName != null; - } - - @Override - public boolean canDoInteraction() { - return passengers.isEmpty() && this.blockInside == null; - } - - @Override - public void initEntity() { - super.initEntity(); - - prepareDataProperty(); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (!this.isAlive()) { - this.despawnFromAll(); - this.close(); - return false; - } - - int tickDiff = currentTick - this.lastUpdate; - - if (tickDiff <= 0) { - return false; - } - - this.lastUpdate = currentTick; - - if (isAlive()) { - super.onUpdate(currentTick); - - // The damage token - if (getHealth() < 20) { - setHealth(getHealth() + 1); - } - - // Entity variables - lastX = x; - lastY = y; - lastZ = z; - motionY -= 0.03999999910593033D; - int dx = MathHelper.floor(x); - int dy = MathHelper.floor(y); - int dz = MathHelper.floor(z); - - // Some hack to check rails - if (Rail.isRailBlock(level.getBlockIdAt(dx, dy - 1, dz))) { - --dy; - } - - Block block = level.getBlock(new Vector3(dx, dy, dz)); - - // Ensure that the block is a rail - if (Rail.isRailBlock(block)) { - processMovement(dx, dy, dz, (BlockRail) block); - // Activate the minecart/TNT - if (block instanceof BlockRailActivator && ((BlockRailActivator) block).isActive()) { - activate(dx, dy, dz, (block.getDamage() & 0x8) != 0); - } - } else { - setFalling(); - } - checkBlockCollision(); - - // Minecart head - pitch = 0; - double diffX = this.lastX - this.x; - double diffZ = this.lastZ - this.z; - double yawToChange = yaw; - if (diffX * diffX + diffZ * diffZ > 0.001D) { - yawToChange = (FastMath.atan2(diffZ, diffX) * 180 / Math.PI); - } - - // Reverse yaw if yaw is below 0 - if (yawToChange < 0) { - // -90-(-90)-(-90) = 90 - yawToChange -= yawToChange - yawToChange; - } - - setRotation(yawToChange, pitch); - - Location from = new Location(lastX, lastY, lastZ, lastYaw, lastPitch, level); - Location to = new Location(this.x, this.y, this.z, this.yaw, this.pitch, level); - - this.getServer().getPluginManager().callEvent(new VehicleUpdateEvent(this)); - - if (!from.equals(to)) { - this.getServer().getPluginManager().callEvent(new VehicleMoveEvent(this, from, to)); - } - - // Collisions - for (cn.nukkit.entity.Entity entity : level.getNearbyEntities(boundingBox.grow(0.2D, 0, 0.2D), this)) { - if (!passengers.contains(entity) && entity instanceof EntityMinecartAbstract) { - entity.applyEntityCollision(this); - } - } - - Iterator linkedIterator = this.passengers.iterator(); - - while (linkedIterator.hasNext()) { - cn.nukkit.entity.Entity linked = linkedIterator.next(); - - if (!linked.isAlive()) { - if (linked.riding == this) { - linked.riding = null; - } - - linkedIterator.remove(); - } - } - - // No need to onGround or Motion diff! This always have an update - return true; - } - - return false; - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (invulnerable) { - return false; - } else { - source.setDamage(source.getDamage() * 15); - - boolean attack = super.attack(source); - - if (isAlive()) { - performHurtAnimation(); - } - - return attack; - } - } - - public void dropItem() { - level.dropItem(this, new ItemMinecart()); - } - - @Override - public void kill() { - if (!this.isAlive()) { - return; - } - - super.kill(); - - if (level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) { - dropItem(); - } - } - - @Override - public void close() { - super.close(); - - for (Entity passenger : new ArrayList<>(this.passengers)) { - dismountEntity(passenger); - } - } - - @Override - public boolean onInteract(Player p, Item item, Vector3 clickedPos) { - if (!isRideable()) { - return false; - } - - if (!passengers.isEmpty()) { - return false; - } - - if (blockInside == null) { - mountEntity(p); - } - - return super.onInteract(p, item, clickedPos); - } - - @Override - public void applyEntityCollision(cn.nukkit.entity.Entity entity) { - if (entity != riding && !(entity instanceof Player && ((Player) entity).getGamemode() == Player.SPECTATOR)) { - double motiveX = entity.x - x; - double motiveZ = entity.z - z; - double square = motiveX * motiveX + motiveZ * motiveZ; - - if (square >= 9.999999747378752E-5D) { - square = Math.sqrt(square); - motiveX /= square; - motiveZ /= square; - double next = 1 / square; - - if (next > 1) { - next = 1; - } - - motiveX *= next; - motiveZ *= next; - motiveX *= 0.10000000149011612D; - motiveZ *= 0.10000000149011612D; - motiveX *= 1 + entityCollisionReduction; - motiveZ *= 1 + entityCollisionReduction; - motiveX *= 0.5D; - motiveZ *= 0.5D; - if (entity instanceof EntityMinecartAbstract) { - EntityMinecartAbstract mine = (EntityMinecartAbstract) entity; - double desinityX = mine.x - x; - double desinityZ = mine.z - z; - Vector3 vector = new Vector3(desinityX, 0, desinityZ).normalize(); - Vector3 vec = new Vector3(MathHelper.cos((float) yaw * 0.017453292F), 0, MathHelper.sin((float) yaw * 0.017453292F)).normalize(); - double desinityXZ = Math.abs(vector.dot(vec)); - - if (desinityXZ < 0.800000011920929D) { - return; - } - - double motX = mine.motionX + motionX; - double motZ = mine.motionZ + motionZ; - - if (mine.getType().getId() == 2 && getType().getId() != 2) { - motionX *= 0.20000000298023224D; - motionZ *= 0.20000000298023224D; - motionX += mine.motionX - motiveX; - motionZ += mine.motionZ - motiveZ; - mine.motionX *= 0.949999988079071D; - mine.motionZ *= 0.949999988079071D; - } else if (mine.getType().getId() != 2 && getType().getId() == 2) { - mine.motionX *= 0.20000000298023224D; - mine.motionZ *= 0.20000000298023224D; - motionX += mine.motionX + motiveX; - motionZ += mine.motionZ + motiveZ; - motionX *= 0.949999988079071D; - motionZ *= 0.949999988079071D; - } else { - motX /= 2; - motZ /= 2; - motionX *= 0.20000000298023224D; - motionZ *= 0.20000000298023224D; - motionX += motX - motiveX; - motionZ += motZ - motiveZ; - mine.motionX *= 0.20000000298023224D; - mine.motionZ *= 0.20000000298023224D; - mine.motionX += motX + motiveX; - mine.motionZ += motZ + motiveZ; - } - } else { - motionX -= motiveX; - motionZ -= motiveZ; - } - } - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - - saveEntityData(); - } - - public double getMaxSpeed() { - return maxSpeed; - } - - protected void activate(int x, int y, int z, boolean flag) { - } - - private boolean hasUpdated = false; - - private void setFalling() { - motionX = NukkitMath.clamp(motionX, -maxSpeed, maxSpeed); - motionZ = NukkitMath.clamp(motionZ, -maxSpeed, maxSpeed); - - if (!hasUpdated) { - for (cn.nukkit.entity.Entity linked : passengers) { - linked.setSeatPosition(getMountedOffset(linked).add(0, 0.35f)); - updatePassengerPosition(linked); - } - - hasUpdated = true; - } - - if (onGround) { - motionX *= derailedX; - motionY *= derailedY; - motionZ *= derailedZ; - } - - move(motionX, motionY, motionZ); - if (!onGround) { - motionX *= flyingX; - motionY *= flyingY; - motionZ *= flyingZ; - } - } - - private void processMovement(int dx, int dy, int dz, BlockRail block) { - fallDistance = 0.0F; - Vector3 vector = getNextRail(x, y, z); - - y = dy; - boolean isPowered = false; - boolean isSlowed = false; - - if (block instanceof BlockRailPowered) { - isPowered = block.isActive(); - isSlowed = !block.isActive(); - } - - switch (Orientation.byMetadata(block.getRealMeta())) { - case ASCENDING_NORTH: - motionX -= 0.0078125D; - y += 1; - break; - case ASCENDING_SOUTH: - motionX += 0.0078125D; - y += 1; - break; - case ASCENDING_EAST: - motionZ += 0.0078125D; - y += 1; - break; - case ASCENDING_WEST: - motionZ -= 0.0078125D; - y += 1; - break; - } - - int[][] facing = matrix[block.getRealMeta()]; - double facing1 = facing[1][0] - facing[0][0]; - double facing2 = facing[1][2] - facing[0][2]; - double speedOnTurns = Math.sqrt(facing1 * facing1 + facing2 * facing2); - double realFacing = motionX * facing1 + motionZ * facing2; - - if (realFacing < 0) { - facing1 = -facing1; - facing2 = -facing2; - } - - double squareOfFame = Math.sqrt(motionX * motionX + motionZ * motionZ); - - if (squareOfFame > 2) { - squareOfFame = 2; - } - - motionX = squareOfFame * facing1 / speedOnTurns; - motionZ = squareOfFame * facing2 / speedOnTurns; - double expectedSpeed; - double playerYawNeg; // PlayerYawNegative - double playerYawPos; // PlayerYawPositive - double motion; - - cn.nukkit.entity.Entity linked = getPassenger(); - - if (linked instanceof EntityLiving) { - expectedSpeed = currentSpeed; - if (expectedSpeed > 0) { - // This is a trajectory (Angle of elevation) - playerYawNeg = -Math.sin(linked.yaw * Math.PI / 180.0F); - playerYawPos = Math.cos(linked.yaw * Math.PI / 180.0F); - motion = motionX * motionX + motionZ * motionZ; - if (motion < 0.01D) { - motionX += playerYawNeg * 0.1D; - motionZ += playerYawPos * 0.1D; - - isSlowed = false; - } - } - } - - //http://minecraft.gamepedia.com/Powered_Rail#Rail - if (isSlowed) { - expectedSpeed = Math.sqrt(motionX * motionX + motionZ * motionZ); - if (expectedSpeed < 0.03D) { - motionX *= 0; - motionY *= 0; - motionZ *= 0; - } else { - motionX *= 0.5D; - motionY *= 0; - motionZ *= 0.5D; - } - } - - playerYawNeg = (double) dx + 0.5D + (double) facing[0][0] * 0.5D; - playerYawPos = (double) dz + 0.5D + (double) facing[0][2] * 0.5D; - motion = (double) dx + 0.5D + (double) facing[1][0] * 0.5D; - double wallOfFame = (double) dz + 0.5D + (double) facing[1][2] * 0.5D; - - facing1 = motion - playerYawNeg; - facing2 = wallOfFame - playerYawPos; - double motX; - double motZ; - - if (facing1 == 0) { - x = (double) dx + 0.5D; - expectedSpeed = z - (double) dz; - } else if (facing2 == 0) { - z = (double) dz + 0.5D; - expectedSpeed = x - (double) dx; - } else { - motX = x - playerYawNeg; - motZ = z - playerYawPos; - expectedSpeed = (motX * facing1 + motZ * facing2) * 2; - } - - x = playerYawNeg + facing1 * expectedSpeed; - z = playerYawPos + facing2 * expectedSpeed; - setPosition(new Vector3(x, y, z)); - - motX = motionX; - motZ = motionZ; - if (!passengers.isEmpty()) { - motX *= 0.75D; - motZ *= 0.75D; - } - motX = NukkitMath.clamp(motX, -maxSpeed, maxSpeed); - motZ = NukkitMath.clamp(motZ, -maxSpeed, maxSpeed); - - move(motX, 0, motZ); - if (facing[0][1] != 0 && MathHelper.floor(x) - dx == facing[0][0] && MathHelper.floor(z) - dz == facing[0][2]) { - setPosition(new Vector3(x, y + (double) facing[0][1], z)); - } else if (facing[1][1] != 0 && MathHelper.floor(x) - dx == facing[1][0] && MathHelper.floor(z) - dz == facing[1][2]) { - setPosition(new Vector3(x, y + (double) facing[1][1], z)); - } - - applyDrag(); - Vector3 vector1 = getNextRail(x, y, z); - - if (vector1 != null && vector != null) { - double d14 = (vector.y - vector1.y) * 0.05D; - - squareOfFame = Math.sqrt(motionX * motionX + motionZ * motionZ); - if (squareOfFame > 0) { - motionX = motionX / squareOfFame * (squareOfFame + d14); - motionZ = motionZ / squareOfFame * (squareOfFame + d14); - } - - setPosition(new Vector3(x, vector1.y, z)); - } - - int floorX = MathHelper.floor(x); - int floorZ = MathHelper.floor(z); - - if (floorX != dx || floorZ != dz) { - squareOfFame = Math.sqrt(motionX * motionX + motionZ * motionZ); - motionX = squareOfFame * (double) (floorX - dx); - motionZ = squareOfFame * (double) (floorZ - dz); - } - - if (isPowered) { - double newMovie = Math.sqrt(motionX * motionX + motionZ * motionZ); - - if (newMovie > 0.01D) { - double nextMovie = 0.06D; - - motionX += motionX / newMovie * nextMovie; - motionZ += motionZ / newMovie * nextMovie; - } else if (block.getOrientation() == Orientation.STRAIGHT_NORTH_SOUTH) { - if (level.getBlock(new Vector3(dx - 1, dy, dz)).isNormalBlock()) { - motionX = 0.02D; - } else if (level.getBlock(new Vector3(dx + 1, dy, dz)).isNormalBlock()) { - motionX = -0.02; - } - } else if (block.getOrientation() == Orientation.STRAIGHT_EAST_WEST) { - if (level.getBlock(new Vector3(dx, dy, dz - 1)).isNormalBlock()) { - motionZ = 0.02D; - } else if (level.getBlock(new Vector3(dx, dy, dz + 1)).isNormalBlock()) { - motionZ = -0.02; - } - } - } - } - - private void applyDrag() { - if (!passengers.isEmpty() || !slowWhenEmpty) { - motionX *= 0.996999979019165D; - motionY *= 0.0D; - motionZ *= 0.996999979019165D; - } else { - motionX *= 0.9599999785423279D; - motionY *= 0.0D; - motionZ *= 0.9599999785423279D; - } - } - - private Vector3 getNextRail(double dx, double dy, double dz) { - int checkX = MathHelper.floor(dx); - int checkY = MathHelper.floor(dy); - int checkZ = MathHelper.floor(dz); - - if (Rail.isRailBlock(level.getBlockIdAt(checkX, checkY - 1, checkZ))) { - --checkY; - } - - Block block = level.getBlock(new Vector3(checkX, checkY, checkZ)); - - if (Rail.isRailBlock(block)) { - int[][] facing = matrix[((BlockRail) block).getRealMeta()]; - double rail; - // Genisys mistake (Doesn't check surrounding more exactly) - double nextOne = (double) checkX + 0.5D + (double) facing[0][0] * 0.5D; - double nextTwo = (double) checkY + 0.5D + (double) facing[0][1] * 0.5D; - double nextThree = (double) checkZ + 0.5D + (double) facing[0][2] * 0.5D; - double nextFour = (double) checkX + 0.5D + (double) facing[1][0] * 0.5D; - double nextFive = (double) checkY + 0.5D + (double) facing[1][1] * 0.5D; - double nextSix = (double) checkZ + 0.5D + (double) facing[1][2] * 0.5D; - double nextSeven = nextFour - nextOne; - double nextEight = (nextFive - nextTwo) * 2; - double nextMax = nextSix - nextThree; - - if (nextSeven == 0) { - rail = dz - (double) checkZ; - } else if (nextMax == 0) { - rail = dx - (double) checkX; - } else { - double whatOne = dx - nextOne; - double whatTwo = dz - nextThree; - - rail = (whatOne * nextSeven + whatTwo * nextMax) * 2; - } - - dx = nextOne + nextSeven * rail; - dy = nextTwo + nextEight * rail; - dz = nextThree + nextMax * rail; - if (nextEight < 0) { - ++dy; - } - - if (nextEight > 0) { - dy += 0.5D; - } - - return new Vector3(dx, dy, dz); - } else { - return null; - } - } - - @Override - public void onPlayerInput(Player player, double strafe, double forward) { - this.setCurrentSpeed(forward); - } - - /** - * Used to multiply the minecart current speed - * - * @param speed The speed of the minecart that will be calculated - */ - public void setCurrentSpeed(double speed) { - this.currentSpeed = speed; - } - - private void prepareDataProperty() { - setRollingAmplitude(0); - setRollingDirection(1); - if (namedTag.contains("CustomDisplayTile")) { - if (namedTag.getBoolean("CustomDisplayTile")) { - int display = namedTag.getInt("DisplayTile"); - int offSet = namedTag.getInt("DisplayOffset"); - setDataProperty(new ByteEntityData(DATA_HAS_DISPLAY, 1)); - setDataProperty(new IntEntityData(DATA_DISPLAY_ITEM, display)); - setDataProperty(new IntEntityData(DATA_DISPLAY_OFFSET, offSet)); - } - } else { - int display = blockInside == null ? 0 - : blockInside.getId() - | blockInside.getDamage() << 16; - if (display == 0) { - setDataProperty(new ByteEntityData(DATA_HAS_DISPLAY, 0)); - return; - } - setDataProperty(new ByteEntityData(DATA_HAS_DISPLAY, 1)); - setDataProperty(new IntEntityData(DATA_DISPLAY_ITEM, display)); - setDataProperty(new IntEntityData(DATA_DISPLAY_OFFSET, 6)); - } - } - - private void saveEntityData() { - boolean hasDisplay = super.getDataPropertyByte(DATA_HAS_DISPLAY) == 1 - || blockInside != null; - int display; - int offSet; - namedTag.putBoolean("CustomDisplayTile", hasDisplay); - if (hasDisplay) { - display = blockInside.getId() - | blockInside.getDamage() << 16; - offSet = getDataPropertyInt(DATA_DISPLAY_OFFSET); - namedTag.putInt("DisplayTile", display); - namedTag.putInt("DisplayOffset", offSet); - } - } - - /** - * Set the minecart display block - * - * @param block The block that will changed. Set {@code null} for BlockAir - * @return {@code true} if the block is normal block - */ - public boolean setDisplayBlock(Block block) { - return setDisplayBlock(block, true); - } - - /** - * Set the minecart display block - * - * @param block The block that will changed. Set {@code null} for BlockAir - * @param update Do update for the block. (This state changes if you want to show the block) - * @return {@code true} if the block is normal block - */ - public boolean setDisplayBlock(Block block, boolean update) { - if (!update) { - if (block.isNormalBlock()) { - blockInside = block; - } else { - blockInside = null; - } - return true; - } - if (block != null) { - if (block.isNormalBlock()) { - blockInside = block; - int display = blockInside.getId() - | blockInside.getDamage() << 16; - setDataProperty(new ByteEntityData(DATA_HAS_DISPLAY, 1)); - setDataProperty(new IntEntityData(DATA_DISPLAY_ITEM, display)); - setDisplayBlockOffset(6); - } - } else { - // Set block to air (default). - blockInside = null; - setDataProperty(new ByteEntityData(DATA_HAS_DISPLAY, 0)); - setDataProperty(new IntEntityData(DATA_DISPLAY_ITEM, 0)); - setDisplayBlockOffset(0); - } - return true; - } - - /** - * Get the minecart display block - * - * @return Block of minecart display block - */ - public Block getDisplayBlock() { - return blockInside; - } - - /** - * Set the block offset. - * - * @param offset The offset - */ - public void setDisplayBlockOffset(int offset) { - setDataProperty(new IntEntityData(DATA_DISPLAY_OFFSET, offset)); - } - - /** - * Get the block display offset - * - * @return integer - */ - public int getDisplayBlockOffset() { - return super.getDataPropertyInt(DATA_DISPLAY_OFFSET); - } - - /** - * Is the minecart can be slowed when empty? - * - * @return boolean - */ - public boolean isSlowWhenEmpty() { - return slowWhenEmpty; - } - - /** - * Set the minecart slowdown flag - * - * @param slow The slowdown flag - */ - public void setSlowWhenEmpty(boolean slow) { - slowWhenEmpty = slow; - } - - public Vector3 getFlyingVelocityMod() { - return new Vector3(flyingX, flyingY, flyingZ); - } - - public void setFlyingVelocityMod(Vector3 flying) { - Objects.requireNonNull(flying, "Flying velocity modifiers cannot be null"); - flyingX = flying.getX(); - flyingY = flying.getY(); - flyingZ = flying.getZ(); - } - - public Vector3 getDerailedVelocityMod() { - return new Vector3(derailedX, derailedY, derailedZ); - } - - public void setDerailedVelocityMod(Vector3 derailed) { - Objects.requireNonNull(derailed, "Derailed velocity modifiers cannot be null"); - derailedX = derailed.getX(); - derailedY = derailed.getY(); - derailedZ = derailed.getZ(); - } - - public void setMaximumSpeed(double speed) { - maxSpeed = speed; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartChest.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartChest.java deleted file mode 100644 index b8408761c..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityMinecartChest.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.inventory.MinecartChestInventory; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.MinecartType; - -/** - * Created by Snake1999 on 2016/1/30. - * Package cn.nukkit.entity.item in project Nukkit. - */ -public class EntityMinecartChest extends EntityMinecartAbstract implements InventoryHolder { - - public static final int NETWORK_ID = 98; - - protected MinecartChestInventory inventory; - - public EntityMinecartChest(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - setDisplayBlock(Block.get(Block.CHEST), false); - setName("Minecart with Chest"); - } - - @Override - public MinecartType getType() { - return MinecartType.valueOf(1); - } - - @Override - public boolean isRideable() { - return false; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public void dropItem() { - super.dropItem(); - - this.level.dropItem(this, Item.get(Item.CHEST)); - for (Item item : this.inventory.getContents().values()) { - this.level.dropItem(this, item); - } - this.inventory.clearAll(); - } - - @Override - public boolean mountEntity(Entity entity, byte mode) { - return false; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - player.addWindow(this.inventory); - return false; // If true, the count of items player has in hand decreases - } - - @Override - public MinecartChestInventory getInventory() { - return inventory; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.inventory = new MinecartChestInventory(this); - if (this.namedTag.contains("Items") && this.namedTag.get("Items") instanceof ListTag) { - ListTag inventoryList = this.namedTag.getList("Items", CompoundTag.class); - for (CompoundTag item : inventoryList.getAll()) { - this.inventory.setItem(item.getByte("Slot"), NBTIO.getItemHelper(item)); - } - } - - this.dataProperties - .putByte(DATA_CONTAINER_TYPE, 10) - .putInt(DATA_CONTAINER_BASE_SIZE, this.inventory.getSize()) - .putInt(DATA_CONTAINER_EXTRA_SLOTS_PER_STRENGTH, 0); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putList(new ListTag("Items")); - if (this.inventory != null) { - for (int slot = 0; slot < 27; ++slot) { - Item item = this.inventory.getItem(slot); - if (item != null && item.getId() != Item.AIR) { - this.namedTag.getList("Items", CompoundTag.class) - .add(NBTIO.putItemHelper(item, slot)); - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartEmpty.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartEmpty.java deleted file mode 100644 index 006ebc378..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityMinecartEmpty.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.entity.passive.EntityWaterAnimal; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.MinecartType; - -/** - * Created by Snake1999 on 2016/1/30. - * Package cn.nukkit.entity.item in project Nukkit. - */ -public class EntityMinecartEmpty extends EntityMinecartAbstract { - - public static final int NETWORK_ID = 84; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityMinecartEmpty(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - setName("Minecart"); - } - - @Override - public MinecartType getType() { - return MinecartType.valueOf(0); - } - - @Override - public boolean isRideable() { - return true; - } - - @Override - protected void activate(int x, int y, int z, boolean flag) { - if (flag) { - if (this.riding != null) { - mountEntity(riding); - } - } - } - - @Override - public boolean onUpdate(int currentTick) { - boolean update = super.onUpdate(currentTick); - - if (this.passengers.isEmpty()) { - for (Entity entity : this.level.getCollidingEntities(this.boundingBox.grow(0.20000000298023224, 0.0D, 0.20000000298023224), this)) { - if (entity.riding != null || !(entity instanceof EntityLiving) || entity instanceof Player || entity instanceof EntityWaterAnimal) { - continue; - } - - this.mountEntity(entity); - update = true; - break; - } - } - - return update; - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartHopper.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartHopper.java deleted file mode 100644 index e59eef3d1..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityMinecartHopper.java +++ /dev/null @@ -1,103 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.inventory.MinecartHopperInventory; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.MinecartType; - -public class EntityMinecartHopper extends EntityMinecartAbstract implements InventoryHolder { - - public static final int NETWORK_ID = 96; - - protected MinecartHopperInventory inventory; - - public EntityMinecartHopper(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - setDisplayBlock(Block.get(Block.HOPPER_BLOCK), false); - setName("Minecart with Hopper"); - } - - @Override - public MinecartType getType() { - return MinecartType.valueOf(5); - } - - @Override - public boolean isRideable() { - return false; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public void dropItem() { - super.dropItem(); - - this.level.dropItem(this, Item.get(Item.HOPPER)); - for (Item item : this.inventory.getContents().values()) { - this.level.dropItem(this, item); - } - this.inventory.clearAll(); - } - - @Override - public boolean mountEntity(Entity entity, byte mode) { - return false; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - player.addWindow(this.inventory); - return false; // If true, the count of items player has in hand decreases - } - - @Override - public MinecartHopperInventory getInventory() { - return inventory; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.inventory = new MinecartHopperInventory(this); - if (this.namedTag.contains("Items") && this.namedTag.get("Items") instanceof ListTag) { - ListTag inventoryList = this.namedTag.getList("Items", CompoundTag.class); - for (CompoundTag item : inventoryList.getAll()) { - this.inventory.setItem(item.getByte("Slot"), NBTIO.getItemHelper(item)); - } - } - - this.dataProperties - .putByte(DATA_CONTAINER_TYPE, 11) - .putInt(DATA_CONTAINER_BASE_SIZE, this.inventory.getSize()) - .putInt(DATA_CONTAINER_EXTRA_SLOTS_PER_STRENGTH, 0); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putList(new ListTag("Items")); - if (this.inventory != null) { - for (int slot = 0; slot < 5; ++slot) { - Item item = this.inventory.getItem(slot); - if (item != null && item.getId() != Item.AIR) { - this.namedTag.getList("Items", CompoundTag.class) - .add(NBTIO.putItemHelper(item, slot)); - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartTNT.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartTNT.java deleted file mode 100644 index 4e6f367b0..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityMinecartTNT.java +++ /dev/null @@ -1,151 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.event.entity.EntityExplosionPrimeEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemMinecartTNT; -import cn.nukkit.level.Explosion; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.MinecartType; -import cn.nukkit.utils.Utils; - -/** - * @author Adam Matthew [larryTheCoder] - * - * Nukkit Project. - */ -public class EntityMinecartTNT extends EntityMinecartAbstract implements EntityExplosive { - - public static final int NETWORK_ID = 97; - private int fuse; - - public EntityMinecartTNT(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - super.setDisplayBlock(Block.get(BlockID.TNT), false); - setName("Minecart with TNT"); - } - - @Override - public boolean isRideable() { - return false; - } - - @Override - public void initEntity() { - super.initEntity(); - - if (namedTag.contains("TNTFuse")) { - fuse = namedTag.getByte("TNTFuse"); - } else { - fuse = 80; - } - this.setDataFlag(DATA_FLAGS, DATA_FLAG_CHARGED, false); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.timing != null) this.timing.startTiming(); - - if (fuse < 80) { - int tickDiff = currentTick - lastUpdate; - - lastUpdate = currentTick; - - if (fuse % 5 == 0) { - setDataProperty(new IntEntityData(DATA_FUSE_LENGTH, fuse)); - } - - fuse -= tickDiff; - - if (isAlive() && fuse <= 0) { - if (this.level.getGameRules().getBoolean(GameRule.TNT_EXPLODES)) { - this.explode(Utils.random.nextInt(5)); - } - this.close(); - return false; - } - } - - if (this.timing != null) this.timing.stopTiming(); - - return super.onUpdate(currentTick); - } - - @Override - public void activate(int x, int y, int z, boolean flag) { - level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_IGNITE); - this.fuse = 79; - } - - @Override - public void explode() { - explode(0); - } - - public void explode(double square) { - double root = Math.sqrt(square); - - if (root > 5.0D) { - root = 5.0D; - } - - EntityExplosionPrimeEvent event = new EntityExplosionPrimeEvent(this, (4.0D + Utils.random.nextDouble() * 1.5D * root)); - server.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - Explosion explosion = new Explosion(this, event.getForce(), this); - if (event.isBlockBreaking()) { - explosion.explodeA(); - } - explosion.explodeB(); - this.close(); - } - - @Override - public void dropItem() { - level.dropItem(this, new ItemMinecartTNT()); - } - - @Override - public MinecartType getType() { - return MinecartType.valueOf(3); - } - - @Override - public int getNetworkId() { - return EntityMinecartTNT.NETWORK_ID; - } - - @Override - public void saveNBT() { - super.saveNBT(); - - super.namedTag.putInt("TNTFuse", this.fuse); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.FLINT_AND_STEEL || item.getId() == Item.FIRE_CHARGE) { - level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_IGNITE); - this.fuse = 79; - return true; - } - - return super.onInteract(player, item, clickedPos); - } - - @Override - public boolean mountEntity(Entity entity, byte mode) { - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityPainting.java b/src/main/java/cn/nukkit/entity/item/EntityPainting.java deleted file mode 100644 index 6f69eeb1f..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityPainting.java +++ /dev/null @@ -1,138 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityHanging; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.ItemPainting; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.AddPaintingPacket; -import cn.nukkit.network.protocol.DataPacket; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityPainting extends EntityHanging { - - public static final int NETWORK_ID = 83; - - public final static Motive[] motives = Motive.values(); - - private Motive motive; - - public EntityPainting(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - public static Motive getMotive(String name) { - return Motive.BY_NAME.getOrDefault(name, Motive.KEBAB); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - protected void initEntity() { - super.initEntity(); - this.motive = getMotive(this.namedTag.getString("Motive")); - } - - @Override - public DataPacket createAddEntityPacket() { - AddPaintingPacket addPainting = new AddPaintingPacket(); - addPainting.entityUniqueId = this.getId(); - addPainting.entityRuntimeId = this.getId(); - addPainting.x = (float) this.x; - addPainting.y = (float) this.y; - addPainting.z = (float) this.z; - addPainting.direction = this.getDirection().getHorizontalIndex(); - addPainting.title = this.namedTag.getString("Motive"); - return addPainting; - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (super.attack(source)) { - if (source instanceof EntityDamageByEntityEvent) { - Entity damager = ((EntityDamageByEntityEvent) source).getDamager(); - if (damager instanceof Player && ((Player) damager).isSurvival() && this.level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) { - this.level.dropItem(this, new ItemPainting()); - } - } - this.close(); - return true; - } else { - return false; - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putString("Motive", this.motive.title); - } - - public Motive getArt() { - return getMotive(); - } - - public Motive getMotive() { - return Motive.BY_NAME.get(namedTag.getString("Motive")); - } - - public enum Motive { - KEBAB("Kebab", 1, 1), - AZTEC("Aztec", 1, 1), - ALBAN("Alban", 1, 1), - AZTEC2("Aztec2", 1, 1), - BOMB("Bomb", 1, 1), - PLANT("Plant", 1, 1), - WASTELAND("Wasteland", 1, 1), - WANDERER("Wanderer", 1, 2), - GRAHAM("Graham", 1, 2), - POOL("Pool", 2, 1), - COURBET("Courbet", 2, 1), - SUNSET("Sunset", 2, 1), - SEA("Sea", 2, 1), - CREEBET("Creebet", 2, 1), - MATCH("Match", 2, 2), - BUST("Bust", 2, 2), - STAGE("Stage", 2, 2), - VOID("Void", 2, 2), - SKULL_AND_ROSES("SkullAndRoses", 2, 2), - WITHER("Wither", 2, 2), - FIGHTERS("Fighters", 4, 2), - SKELETON("Skeleton", 4, 3), - DONKEY_KONG("DonkeyKong", 4, 3), - POINTER("Pointer", 4, 4), - PIG_SCENE("Pigscene", 4, 4), - FLAMING_SKULL("Flaming Skull", 4, 4); - - public final String title; - public final int width; - public final int height; - - private static final Map BY_NAME = new HashMap<>(); - - static { - for (Motive motive : values()) { - BY_NAME.put(motive.title, motive); - } - } - - Motive(String title, int width, int height) { - this.title = title; - this.width = width; - this.height = height; - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/entity/item/EntityPotion.java b/src/main/java/cn/nukkit/entity/item/EntityPotion.java deleted file mode 100644 index 7e1fe55e8..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityPotion.java +++ /dev/null @@ -1,163 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.potion.PotionCollideEvent; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.Particle; -import cn.nukkit.level.particle.SpellParticle; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.potion.Effect; -import cn.nukkit.potion.Potion; - -/** - * @author xtypr - */ -public class EntityPotion extends EntityProjectile { - - public static final int NETWORK_ID = 86; - - public int potionId; - - public EntityPotion(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - public EntityPotion(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - protected void initEntity() { - super.initEntity(); - - potionId = this.namedTag.getShort("PotionId"); - - this.dataProperties.putShort(DATA_POTION_AUX_VALUE, this.potionId); - - Effect effect = Potion.getEffect(potionId, true); - - if (effect != null) { - int count = 0; - int[] c = effect.getColor(); - count += effect.getAmplifier() + 1; - - int r = ((c[0] * (effect.getAmplifier() + 1)) / count) & 0xff; - int g = ((c[1] * (effect.getAmplifier() + 1)) / count) & 0xff; - int b = ((c[2] * (effect.getAmplifier() + 1)) / count) & 0xff; - - this.setDataProperty(new IntEntityData(Entity.DATA_POTION_COLOR, (r << 16) + (g << 8) + b)); - } - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - protected float getGravity() { - return 0.05f; - } - - @Override - protected float getDrag() { - return 0.01f; - } - - protected void splash(Entity collidedWith) { - Potion potion = Potion.getPotion(this.potionId); - PotionCollideEvent event = new PotionCollideEvent(potion, this); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - this.close(); - - potion = event.getPotion(); - if (potion == null) { - return; - } - - potion.setSplash(true); - - Particle particle; - int r; - int g; - int b; - - Effect effect = Potion.getEffect(potion.getId(), true); - - if (effect == null) { - r = 40; - g = 40; - b = 255; - } else { - int[] colors = effect.getColor(); - r = colors[0]; - g = colors[1]; - b = colors[2]; - } - - particle = new SpellParticle(this, r, g, b); - - this.getLevel().addParticle(particle); - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_GLASS); - - Entity[] entities = this.getLevel().getNearbyEntities(this.getBoundingBox().grow(4.125, 2.125, 4.125)); - for (Entity anEntity : entities) { - double distance = anEntity.distanceSquared(this); - if (distance < 16) { - double d = anEntity.equals(collidedWith) ? 1 : 1 - Math.sqrt(distance) / 4; - potion.applyPotion(anEntity, d); - } - } - } - - @Override - public void onCollideWithEntity(Entity entity) { - this.splash(entity); - this.close(); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - if (this.isCollided) { - this.splash(null); - } - - if (this.age > 1200 || this.isCollided) { - this.close(); - return false; - } - - if (this.timing != null) this.timing.stopTiming(); - - return super.onUpdate(currentTick); - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityPotionLingering.java b/src/main/java/cn/nukkit/entity/item/EntityPotionLingering.java deleted file mode 100644 index 4089ab810..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityPotionLingering.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityPotionLingering extends EntityPotion { - - public static final int NETWORK_ID = 101; - - public EntityPotionLingering(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - public EntityPotionLingering(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityPrimedTNT.java b/src/main/java/cn/nukkit/entity/item/EntityPrimedTNT.java deleted file mode 100644 index 9dc2dd56c..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityPrimedTNT.java +++ /dev/null @@ -1,179 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.EntityExplosionPrimeEvent; -import cn.nukkit.level.Explosion; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -/** - * @author MagicDroidX - */ -public class EntityPrimedTNT extends Entity implements EntityExplosive { - - public static final int NETWORK_ID = 65; - - @Override - public float getWidth() { - return 0.98f; - } - - @Override - public float getLength() { - return 0.98f; - } - - @Override - public float getHeight() { - return 0.98f; - } - - @Override - protected float getGravity() { - return 0.04f; - } - - @Override - protected float getDrag() { - return 0.02f; - } - - @Override - protected float getBaseOffset() { - return 0.49f; - } - - protected int fuse; - - protected Entity source; - - public EntityPrimedTNT(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityPrimedTNT(FullChunk chunk, CompoundTag nbt, Entity source) { - super(chunk, nbt); - this.source = source; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public boolean attack(EntityDamageEvent source) { - return source.getCause() == DamageCause.VOID && super.attack(source); - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (namedTag.contains("Fuse")) { - fuse = namedTag.getByte("Fuse"); - } else { - fuse = 80; - } - - this.setDataFlag(DATA_FLAGS, DATA_FLAG_IGNITED, true); - this.setDataProperty(new IntEntityData(DATA_FUSE_LENGTH, fuse)); - - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_FIZZ); - } - - @Override - public boolean canCollideWith(Entity entity) { - return false; - } - - @Override - public void saveNBT() { - super.saveNBT(); - namedTag.putByte("Fuse", fuse); - } - - @Override - public boolean onUpdate(int currentTick) { - - if (closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - int tickDiff = currentTick - lastUpdate; - - if (tickDiff <= 0 && !justCreated) { - return true; - } - - if (fuse % 5 == 0) { - this.setDataProperty(new IntEntityData(DATA_FUSE_LENGTH, fuse)); - } - - lastUpdate = currentTick; - - boolean hasUpdate = entityBaseTick(tickDiff); - - if (isAlive()) { - - if (!isOnGround()) { - motionY -= getGravity(); - } - - move(motionX, motionY, motionZ); - - float friction = 1 - getDrag(); - - motionX *= friction; - motionY *= friction; - motionZ *= friction; - - updateMovement(); - - if (onGround) { - motionY *= -0.5; - motionX *= 0.7; - motionZ *= 0.7; - } - - fuse -= tickDiff; - - if (fuse <= 0) { - if (this.level.getGameRules().getBoolean(GameRule.TNT_EXPLODES)) { - this.explode(); - } - this.close(); - return false; - } - } - - if (this.timing != null) this.timing.stopTiming(); - - return hasUpdate || fuse >= 0 || Math.abs(motionX) > 0.00001 || Math.abs(motionY) > 0.00001 || Math.abs(motionZ) > 0.00001; - } - - public void explode() { - EntityExplosionPrimeEvent event = new EntityExplosionPrimeEvent(this, 4); - server.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - Explosion explosion = new Explosion(this, event.getForce(), this); - if (event.isBlockBreaking()) { - explosion.explodeA(); - } - explosion.explodeB(); - } - - public Entity getSource() { - return source; - } -} diff --git a/src/main/java/cn/nukkit/entity/item/EntityVehicle.java b/src/main/java/cn/nukkit/entity/item/EntityVehicle.java deleted file mode 100644 index d5836fcee..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityVehicle.java +++ /dev/null @@ -1,123 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityInteractable; -import cn.nukkit.entity.EntityRideable; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.vehicle.VehicleDamageEvent; -import cn.nukkit.event.vehicle.VehicleDestroyEvent; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EntityVehicle extends Entity implements EntityRideable, EntityInteractable { - - private int hurtTime; - private int hurtDirection; - private int damage; - - public EntityVehicle(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - public int getRollingAmplitude() { - return hurtTime; - } - - public void setRollingAmplitude(int time) { - this.hurtTime = time; - this.setDataProperty(new IntEntityData(DATA_HURT_TIME, time)); - } - - public int getRollingDirection() { - return hurtDirection; - } - - public void setRollingDirection(int direction) { - this.hurtDirection = direction; - this.setDataProperty(new IntEntityData(DATA_HURT_DIRECTION, direction)); - } - - public int getDamage() { - return damage; - } - - public void setDamage(int damage) { - this.damage = damage; - this.setDataProperty(new IntEntityData(DATA_HEALTH, damage)); // false data name (should be DATA_DAMAGE_TAKEN) - } - - @Override - public String getInteractButtonText() { - return "action.interact.mount"; - } - - @Override - public boolean canDoInteraction() { - return passengers.isEmpty(); - } - - @Override - public boolean onUpdate(int currentTick) { - if (y < -16) { - this.close(); - } - - if (closed) { - return false; - } - - if (getRollingAmplitude() > 0) { - setRollingAmplitude(getRollingAmplitude() - 1); - } - - updateMovement(); - return true; - } - - protected boolean rollingDirection = true; - - protected boolean performHurtAnimation() { - setRollingAmplitude(9); - setRollingDirection(rollingDirection ? 1 : -1); - rollingDirection = !rollingDirection; - return true; - } - - @Override - public boolean attack(EntityDamageEvent source) { - VehicleDamageEvent event = new VehicleDamageEvent(this, source.getEntity(), source.getFinalDamage()); - getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return false; - } - - boolean instantKill = false; - - if (source instanceof EntityDamageByEntityEvent) { - Entity damager = ((EntityDamageByEntityEvent) source).getDamager(); - instantKill = damager instanceof Player && ((Player) damager).isCreative(); - } - - if (instantKill || getHealth() - source.getFinalDamage() < 1) { - VehicleDestroyEvent event2 = new VehicleDestroyEvent(this, source.getEntity()); - getServer().getPluginManager().callEvent(event2); - - if (event2.isCancelled()) { - return false; - } - } - - if (instantKill) { - source.setDamage(1000); - } - - return super.attack(source); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/entity/item/EntityXPOrb.java b/src/main/java/cn/nukkit/entity/item/EntityXPOrb.java deleted file mode 100644 index b44126420..000000000 --- a/src/main/java/cn/nukkit/entity/item/EntityXPOrb.java +++ /dev/null @@ -1,263 +0,0 @@ -package cn.nukkit.entity.item; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import it.unimi.dsi.fastutil.ints.IntArrayList; - -import java.util.List; - -/** - * Created on 2015/12/26 by xtypr. - * Package cn.nukkit.entity in project Nukkit . - */ -public class EntityXPOrb extends Entity { - - public static final int NETWORK_ID = 69; - - /** - * Split sizes used for dropping experience orbs - */ - public static final int[] ORB_SPLIT_SIZES = {2477, 1237, 617, 307, 149, 73, 37, 17, 7, 3, 1}; // This is indexed biggest to smallest so that we can return as soon as we found the biggest value - public Player closestPlayer = null; - private int pickupDelay; - private int exp; - - public EntityXPOrb(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - /** - * Returns the largest size of normal XP orb that will be spawned for the specified amount of XP. Used to split XP - * up into multiple orbs when an amount of XP is dropped. - */ - public static int getMaxOrbSize(int amount) { - for (int split : ORB_SPLIT_SIZES) { - if (amount >= split) { - return split; - } - } - - return 1; - } - - /** - * Splits the specified amount of XP into an array of acceptable XP orb sizes. - */ - public static List splitIntoOrbSizes(int amount) { - List result = new IntArrayList(); - - while (amount > 0) { - int size = getMaxOrbSize(amount); - result.add(size); - amount -= size; - } - - return result; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.1f; - } - - @Override - public float getLength() { - return 0.1f; - } - - @Override - public float getHeight() { - return 0.1f; - } - - @Override - protected float getGravity() { - return 0.04f; - } - - @Override - protected float getDrag() { - return 0.02f; - } - - @Override - public boolean canCollide() { - return false; - } - - @Override - protected void initEntity() { - super.initEntity(); - - setMaxHealth(5); - - if (namedTag.contains("Health")) { - this.setHealth(namedTag.getShort("Health")); - } else { - this.setHealth(5); - } - - if (namedTag.contains("Age")) { - this.age = namedTag.getShort("Age"); - } - - if (namedTag.contains("PickupDelay")) { - this.pickupDelay = namedTag.getShort("PickupDelay"); - } - - if (namedTag.contains("Value")) { - this.exp = namedTag.getShort("Value"); - } - - if (this.exp <= 0) { - this.exp = 1; - } - - this.dataProperties.putInt(DATA_EXPERIENCE_VALUE, this.exp); - } - - @Override - public boolean attack(EntityDamageEvent source) { - return (source.getCause() == DamageCause.VOID || - source.getCause() == DamageCause.FIRE_TICK || - (source.getCause() == DamageCause.ENTITY_EXPLOSION || - source.getCause() == DamageCause.BLOCK_EXPLOSION) && - !this.isInsideOfWater()) && super.attack(source); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - int tickDiff = currentTick - this.lastUpdate; - if (tickDiff <= 0 && !this.justCreated) { - return true; - } - this.lastUpdate = currentTick; - - if (this.age > 6000) { - this.close(); - return false; - } - - boolean hasUpdate = entityBaseTick(tickDiff); - if (this.isAlive()) { - if (this.pickupDelay > 0) { - this.pickupDelay -= tickDiff; - if (this.pickupDelay < 0) { - this.pickupDelay = 0; - } - }/* else { - Entity[] e = this.level.getCollidingEntities(this.boundingBox, this); - for (Entity entity : e) { - if (entity instanceof Player) { - if (((Player) entity).pickupEntity(this, false)) { - return true; - } - } - } - }*/ - - if (!this.isOnGround()) { - this.motionY -= this.getGravity(); - } - - /*if (this.checkObstruction(this.x, this.y, this.z)) { - hasUpdate = true; - }*/ - - if (this.closestPlayer == null || this.closestPlayer.distanceSquared(this) > 64.0D) { - for (Player p : this.getViewers().values()) { - if (p == this.closestPlayer) continue; // Current closestPlayer is null or too far away - if (!p.isSpectator() && p.distanceSquared(this) <= 64) { - this.closestPlayer = p; - break; - } - } - } - - if (this.closestPlayer != null && (this.closestPlayer.isSpectator() || !this.closestPlayer.canPickupXP())) { - this.closestPlayer = null; - } - - if (this.closestPlayer != null) { - double dX = (this.closestPlayer.x - this.x) / 8.0D; - double dY = (this.closestPlayer.y + (double) this.closestPlayer.getEyeHeight() / 2.0D - this.y) / 8.0D; - double dZ = (this.closestPlayer.z - this.z) / 8.0D; - double d = Math.sqrt(dX * dX + dY * dY + dZ * dZ); - double diff = 1.0D - d; - - if (diff > 0.0D) { - diff = diff * diff; - this.motionX += dX / d * diff * 0.1D; - this.motionY += dY / d * diff * 0.1D; - this.motionZ += dZ / d * diff * 0.1D; - } - } - - this.move(this.motionX, this.motionY, this.motionZ); - - double friction = 1d - this.getDrag(); - - if (this.onGround && (Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionZ) > 0.00001)) { - friction = this.getLevel().getBlock(this.temporalVector.setComponents((int) Math.floor(this.x), (int) Math.floor(this.y - 1), (int) Math.floor(this.z) - 1)).getFrictionFactor() * friction; - } - - this.motionX *= friction; - this.motionY *= 1 - this.getDrag(); - this.motionZ *= friction; - - if (this.onGround) { - this.motionY *= -0.5; - } - - this.updateMovement(); - } - - return hasUpdate || !this.onGround || Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionY) > 0.00001 || Math.abs(this.motionZ) > 0.00001; - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putShort("Health", (int) getHealth()); - this.namedTag.putShort("Age", age); - this.namedTag.putShort("PickupDelay", pickupDelay); - this.namedTag.putShort("Value", exp); - } - - public int getExp() { - return exp; - } - - public void setExp(int exp) { - if (exp <= 0) { - throw new IllegalArgumentException("XP amount must be greater than 0, got " + exp); - } - this.exp = exp; - } - - @Override - public boolean canCollideWith(Entity entity) { - return false; - } - - public int getPickupDelay() { - return pickupDelay; - } - - public void setPickupDelay(int pickupDelay) { - this.pickupDelay = pickupDelay; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/entity/mob/EntityBlaze.java b/src/main/java/cn/nukkit/entity/mob/EntityBlaze.java deleted file mode 100644 index 675bfb4e6..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityBlaze.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.projectile.EntityBlazeFireBall; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public class EntityBlaze extends EntityFlyingMob { - - public static final int NETWORK_ID = 43; - - public EntityBlaze(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.8f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.fireProof = true; - this.setMaxHealth(20); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && Utils.rand(1, 32) < 4 && this.distanceSquared(player) <= 10000) { - this.attackDelay = 0; - - double f = 1.1; - double yaw = this.yaw + Utils.rand(-8.0, 8.0); - double pitch = this.pitch + Utils.rand(-5.0, 5.0); - Location pos = new Location(this.x - Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, this.y + this.getEyeHeight(), - this.z + Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, yaw, pitch, this.level); - - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) != Block.AIR) { - return; - } - - EntityBlazeFireBall fireball = (EntityBlazeFireBall) Entity.createEntity("BlazeFireBall", pos, this); - - fireball.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(fireball); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - fireball.close(); - } else { - fireball.spawnToAll(); - this.level.addLevelEvent(this, LevelEventPacket.EVENT_SOUND_BLAZE_SHOOT); - } - } - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.BLAZE_ROD, 0, Utils.rand(0, 1))}; - } - - @Override - public int getKillExperience() { - return 10; - } - - @Override - public int nearbyDistanceMultiplier() { - return 30; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityCaveSpider.java b/src/main/java/cn/nukkit/entity/mob/EntityCaveSpider.java deleted file mode 100644 index e26373362..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityCaveSpider.java +++ /dev/null @@ -1,103 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityArthropod; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntityCaveSpider extends EntityWalkingMob implements EntityArthropod { - - public static final int NETWORK_ID = 40; - - public EntityCaveSpider(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.7f; - } - - @Override - public float getHeight() { - return 0.5f; - } - - @Override - public double getSpeed() { - return 1.3; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(12); - this.setDamage(new int[] { 0, 2, 3, 3 }); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1.32) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - - EntityDamageByEntityEvent ev = new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage); - - if (player.attack(ev) && !ev.isCancelled() && this.server.getDifficulty() > 0) { - player.addEffect(Effect.getEffect(Effect.POISON).setDuration(this.server.getDifficulty() > 1 ? 300 : 140)); - } - } - } - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - drops.add(Item.get(Item.STRING, 0, Utils.rand(0, 2))); - - for (int i = 0; i < (Utils.rand(0, 2) == 0 ? 1 : 0); i++) { - drops.add(Item.get(Item.SPIDER_EYE, 0, 1)); - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Cave Spider"; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityCreeper.java b/src/main/java/cn/nukkit/entity/mob/EntityCreeper.java deleted file mode 100644 index 26634ab5c..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityCreeper.java +++ /dev/null @@ -1,259 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityExplosionPrimeEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSkull; -import cn.nukkit.level.Explosion; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.sound.TNTPrimeSound; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector2; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.List; - -public class EntityCreeper extends EntityWalkingMob implements EntityExplosive { - - public static final int NETWORK_ID = 33; - - private short bombTime = 0; - private boolean exploding; - - public EntityCreeper(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.7f; - } - - @Override - public double getSpeed() { - return 0.9; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - - if (this.namedTag.contains("powered")) { - this.setPowered(this.namedTag.getBoolean("powered")); - } - } - - public void explode() { - if (this.closed) return; - - EntityExplosionPrimeEvent ev = new EntityExplosionPrimeEvent(this, this.isPowered() ? 6 : 3); - this.server.getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - Explosion explosion = new Explosion(this, (float) ev.getForce(), this); - - if (ev.isBlockBreaking() && this.level.getGameRules().getBoolean(GameRule.MOB_GRIEFING)) { - explosion.explodeA(); - } - - explosion.explodeB(); - } - - this.close(); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.server.getDifficulty() < 1) { - this.close(); - return false; - } - - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - return true; - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - if (!this.isMovement()) { - return true; - } - - if (this.isKnockback()) { - this.move(this.motionX, this.motionY, this.motionZ); - this.motionY -= this.getGravity(); - this.updateMovement(); - return true; - } - - Vector3 before = this.target; - this.checkTarget(); - - if (this.target instanceof EntityCreature || before != this.target) { - double x = this.target.x - this.x; - double z = this.target.z - this.z; - - double diff = Math.abs(x) + Math.abs(z); - double distance = target.distance(this); - if (distance <= 4) { - if (target instanceof EntityCreature) { - if (!exploding) { - if (bombTime == 0) { - this.level.addSound(new TNTPrimeSound(this.add(0, getEyeHeight()))); - this.setDataFlag(DATA_FLAGS, DATA_FLAG_IGNITED, true); - } - this.bombTime += tickDiff; - if (this.bombTime >= 30) { - this.explode(); - return false; - } - } - if (distance <= 1) { - this.stayTime = 10; - } - } - } else { - if (!exploding) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_IGNITED, false); - this.bombTime = 0; - } - - this.motionX = this.getSpeed() * 0.15 * (x / diff); - this.motionZ = this.getSpeed() * 0.15 * (z / diff); - } - if (this.stayTime <= 0 || Utils.rand()) this.yaw = FastMath.toDegrees(-FastMath.atan2(x / diff, z / diff)); - } - - double dx = this.motionX; - double dz = this.motionZ; - boolean isJump = this.checkJump(dx, dz); - if (this.stayTime > 0) { - this.stayTime -= tickDiff; - this.move(0, this.motionY, 0); - } else { - Vector2 be = new Vector2(this.x + dx, this.z + dz); - this.move(dx, this.motionY, dz); - Vector2 af = new Vector2(this.x, this.z); - - if ((be.x != af.x || be.y != af.y) && !isJump) { - this.moveTime -= 90; - } - } - - if (!isJump) { - if (this.onGround) { - this.motionY = 0; - } else if (this.motionY > -this.getGravity() * 4) { - int b = this.level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) (this.y + 0.8), NukkitMath.floorDouble(this.z)); - if (b != BlockID.WATER && b != BlockID.STILL_WATER) { - this.motionY -= this.getGravity(); - } - } else { - this.motionY -= this.getGravity(); - } - } - this.updateMovement(); - return true; - } - - public void attackEntity(Entity player) {} - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.GUNPOWDER, 0, 1)); - } - - if (this.lastDamageCause instanceof EntityDamageByEntityEvent) { - Entity killer = ((EntityDamageByEntityEvent) this.lastDamageCause).getDamager(); - - if (killer instanceof EntitySkeleton || killer instanceof EntityStray) { - drops.add(Item.get(Utils.rand(500, 511), 0, 1)); - } - - if (killer instanceof EntityCreeper) { - if (((EntityCreeper) killer).isPowered()) { - drops.add(Item.get(Item.SKULL, ItemSkull.CREEPER_HEAD, 1)); - } - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.FLINT_AND_STEEL && !exploding) { - this.exploding = true; - level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_IGNITE); - this.setDataFlag(DATA_FLAGS, DATA_FLAG_IGNITED, true); - level.addSound(new TNTPrimeSound(this.add(0, getEyeHeight()))); - level.getServer().getScheduler().scheduleDelayedTask(null, this::explode, 30); - return true; - } - - return super.onInteract(player, item, clickedPos); - } - - public boolean isPowered() { - return this.getDataFlag(DATA_FLAGS, DATA_FLAG_POWERED); - } - - public void setPowered(boolean charged) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_POWERED, charged); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putBoolean("powered", this.isPowered()); - } - - @Override - public void onStruckByLightning(Entity entity) { - if (this.attack(new EntityDamageByEntityEvent(entity, this, EntityDamageEvent.DamageCause.LIGHTNING, 5))) { - if (this.fireTicks < 160) { - this.setOnFire(8); - } - this.setPowered(true); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityDrowned.java b/src/main/java/cn/nukkit/entity/mob/EntityDrowned.java deleted file mode 100644 index 901268aa4..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityDrowned.java +++ /dev/null @@ -1,218 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.entity.projectile.EntityThrownTrident; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityShootBowEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.utils.Utils; -import co.aikar.timings.Timings; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntityDrowned extends EntityWalkingMob implements EntitySmite { - - public static final int NETWORK_ID = 110; - - public Item tool; - - public EntityDrowned(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - this.setDamage(new int[] { 0, 2, 3, 4 }); - - if (this.namedTag.contains("Item")) { - this.tool = NBTIO.getItemHelper(this.namedTag.getCompound("Item")); - } else { - this.setRandomTool(); - } - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && player.distanceSquared(this) <= 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.ARM_SWING; - Server.broadcastPacket(this.getViewers().values(), pk); - } else if (tool != null && tool.getId() == Item.TRIDENT && this.attackDelay > 120 && Utils.rand(1, 32) < 4 && this.distanceSquared(player) <= 55) { - this.attackDelay = 0; - - double f = 1.3; - double yaw = this.yaw; - double pitch = this.pitch; - double yawR = FastMath.toRadians(yaw); - double pitchR = FastMath.toRadians(pitch); - Location pos = new Location(this.x - Math.sin(yawR) * Math.cos(pitchR) * 0.5, this.y + this.getHeight() - 0.18, - this.z + Math.cos(yawR) * Math.cos(pitchR) * 0.5, yaw, pitch, this.level); - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) == Block.AIR) { - Entity k = Entity.createEntity("ThrownTrident", pos, this); - if (!(k instanceof EntityThrownTrident)) { - return; - } - - EntityThrownTrident trident = (EntityThrownTrident) k; - setProjectileMotion(trident, pitch, yawR, pitchR, f); - - EntityShootBowEvent ev = new EntityShootBowEvent(this, Item.get(Item.TRIDENT, 0, 1), trident, f); - this.server.getPluginManager().callEvent(ev); - - EntityProjectile projectile = ev.getProjectile(); - if (ev.isCancelled()) { - projectile.close(); - } else { - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(projectile); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - projectile.close(); - } else { - projectile.spawnToAll(); - ((EntityThrownTrident) projectile).setPickupMode(EntityThrownTrident.PICKUP_NONE); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_ITEM_TRIDENT_THROW); - } - } - } - } - } - - @Override - public boolean entityBaseTick(int tickDiff) { - boolean hasUpdate; - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.startTiming(); - - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - hasUpdate = super.entityBaseTick(tickDiff); - - if (level.shouldMobBurn(this)) { - this.setOnFire(100); - } - - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.stopTiming(); - return hasUpdate; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.ROTTEN_FLESH, 0, 1)); - } - - if (Utils.rand(1, 100) <= 11) { - drops.add(Item.get(Item.GOLD_INGOT, 0, 1)); - } - - if (tool != null && Utils.rand(1, 100) == 50) { - drops.add(tool); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : 5; - } - - private void setRandomTool() { - switch (Utils.rand(1, 3)) { - case 1: - if (Utils.rand(1, 100) <= 15) { - this.tool = Item.get(Item.TRIDENT, Utils.rand(200, 246), 1); - } - return; - case 2: - if (Utils.rand(1, 100) == 50) { - this.tool = Item.get(Item.FISHING_ROD, Utils.rand(51, 61), 1); - } - return; - case 3: - if (Utils.rand(1, 100) <= 8) { - this.tool = Item.get(Item.NAUTILUS_SHELL, 0, 1); - } - } - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - if (this.tool != null) { - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getId(); - pk.hotbarSlot = 0; - pk.item = this.tool; - player.dataPacket(pk); - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - - if (tool != null) { - this.namedTag.put("Item", NBTIO.putItemHelper(tool)); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityElderGuardian.java b/src/main/java/cn/nukkit/entity/mob/EntityElderGuardian.java deleted file mode 100644 index a1cbee8c7..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityElderGuardian.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.BlockSponge; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntityElderGuardian extends EntitySwimmingMob { - - public static final int NETWORK_ID = 50; - - public EntityElderGuardian(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 1.9975f; - } - - @Override - public float getHeight() { - return 1.9975f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(80); - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ELDER, true); - this.setDamage(new int[] { 0, 5, 8, 12 }); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - return false; - } - - @Override - public void attackEntity(Entity player) { - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.PRISMARINE_SHARD, 0, 1)); - } - - if (this.lastDamageCause instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) this.lastDamageCause).getDamager() instanceof Player) { - drops.add(Item.get(Item.SPONGE, BlockSponge.WET, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 10; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Elder Guardian"; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityEnderDragon.java b/src/main/java/cn/nukkit/entity/mob/EntityEnderDragon.java deleted file mode 100644 index 25c5fd301..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityEnderDragon.java +++ /dev/null @@ -1,139 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Attribute; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityBoss; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.item.EntityEndCrystal; -import cn.nukkit.entity.projectile.EntityEnderCharge; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.AddEntityPacket; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public class EntityEnderDragon extends EntityFlyingMob implements EntityBoss { - - public static final int NETWORK_ID = 53; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityEnderDragon(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public float getWidth() { - return 16f; - } - - @Override - public float getHeight() { - return 8f; - } - - @Override - public double getSpeed() { - return 3; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.fireProof = true; - this.setMaxHealth(200); - this.setDataFlag(DATA_FLAGS, DATA_FLAG_FIRE_IMMUNE, true); - } - - @Override - public int getKillExperience() { - for (int i = 0; i < 167;) { - this.level.dropExpOrb(this, 3); - i++; - } - return 0; - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && (player.isSurvival() || player.isAdventure()) && distance <= 800 && distance > 50; - } - return creature.isAlive() && !creature.closed && distance <= 800 && distance > 50; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 60 && Utils.rand(1, 5) < 3 && this.distanceSquared(player) <= 90000) { - this.attackDelay = 0; - double f = 1.1; - double yaw = this.yaw + Utils.rand(-12.0, 12.0); - double pitch = this.pitch + Utils.rand(-7.0, 7.0); - - EntityEnderCharge charge = (EntityEnderCharge) Entity.createEntity("EnderCharge", new Location(this.x + this.getLocation().getDirectionVector().multiply(5.0).x, this.y, this.z + this.getDirectionVector().multiply(5.0).z, this.level), this); - charge.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(charge); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - charge.close(); - } else { - charge.spawnToAll(); - } - } - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (tickDiff % 2 == 0) { - for (Entity e : this.level.entities.values()) { - if (e instanceof EntityEndCrystal) { - if (e.distanceSquared(this) <= 32) { - float health = this.getHealth(); - if (!(health > this.getMaxHealth()) && health != 0) { - this.setHealth(health + 0.2f); - } - } - } - } - } - - return super.entityBaseTick(tickDiff); - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Ender Dragon"; - } - - @Override - protected DataPacket createAddEntityPacket() { - AddEntityPacket addEntity = new AddEntityPacket(); - addEntity.type = NETWORK_ID; - addEntity.entityUniqueId = this.getId(); - addEntity.entityRuntimeId = this.getId(); - addEntity.yaw = (float) this.yaw; - addEntity.headYaw = (float) this.yaw; - addEntity.pitch = (float) this.pitch; - addEntity.x = (float) this.x; - addEntity.y = (float) this.y; - addEntity.z = (float) this.z; - addEntity.speedX = (float) this.motionX; - addEntity.speedY = (float) this.motionY; - addEntity.speedZ = (float) this.motionZ; - addEntity.metadata = this.dataProperties.clone(); - addEntity.attributes = new Attribute[]{Attribute.getAttribute(Attribute.MAX_HEALTH).setMaxValue(200).setValue(200)}; - return addEntity; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityEnderman.java b/src/main/java/cn/nukkit/entity/mob/EntityEnderman.java deleted file mode 100644 index e77bb2933..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityEnderman.java +++ /dev/null @@ -1,186 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.sound.EndermanTeleportSound; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; - -public class EntityEnderman extends EntityWalkingMob { - - public static final int NETWORK_ID = 38; - - private int angry = 0; - - public EntityEnderman(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 2.9f; - } - - @Override - public double getSpeed() { - return this.isAngry() ? 1.4 : 1.21; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(40); - this.setDamage(new int[]{0, 4, 7, 10}); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (!ev.isCancelled()) { - if (ev.getCause() == EntityDamageEvent.DamageCause.ENTITY_ATTACK) { - if (!isAngry()) { - setAngry(2400); - } - } - - if (ev.getCause() == EntityDamageEvent.DamageCause.PROJECTILE) { - if (!isAngry()) { - setAngry(2400); - } - ev.setCancelled(true); - tp(); - return false; - } else if (Utils.rand(1, 10) == 1) { - tp(); - } - } - return true; - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.ENDER_PEARL, 0, Utils.rand(0, 1))}; - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - int b = level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) this.y, NukkitMath.floorDouble(this.z)); - if (b == BlockID.WATER || b == BlockID.STILL_WATER) { - this.attack(new EntityDamageEvent(this, EntityDamageEvent.DamageCause.DROWNING, 2)); - if (isAngry()) { - setAngry(0); - } - tp(); - } else if (Utils.rand(0, 500) == 20) { - tp(); - } - - if (this.level.isRaining() && Utils.rand(1, 5) == 1 && this.canSeeSky()) { - this.attack(new EntityDamageEvent(this, EntityDamageEvent.DamageCause.DROWNING, 1f)); - if (isAngry()) { - setAngry(0); - } - tp(); - } - - if (this.angry > 0) { - this.angry--; - } - - return super.entityBaseTick(tickDiff); - } - - private void tp() { - this.level.addSound(new EndermanTeleportSound(this)); - this.move(Utils.rand(-10, 10), 0, Utils.rand(-10, 10)); - this.level.addSound(new EndermanTeleportSound(this)); - } - - @Override - public boolean canDespawn() { - if (this.getLevel().getDimension() == Level.DIMENSION_THE_END) { - return false; - } - - return super.canDespawn(); - } - - public boolean isAngry() { - return this.angry > 0; - } - - public void setAngry(int val) { - this.angry = val; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ANGRY, val > 0); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (!isAngry()) return false; - if (creature instanceof Player) { - Player player = (Player) creature; - return !player.closed && player.spawned && player.isAlive() && (player.isSurvival() || player.isAdventure()) && distance <= 256; - } - return creature.isAlive() && !creature.closed && distance <= 256; - } - - public void stareToAngry() { - if (!isAngry()) { - setAngry(2400); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityEndermite.java b/src/main/java/cn/nukkit/entity/mob/EntityEndermite.java deleted file mode 100644 index beb58247e..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityEndermite.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityArthropod; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.HashMap; - -public class EntityEndermite extends EntityWalkingMob implements EntityArthropod { - - public static final int NETWORK_ID = 55; - - public EntityEndermite(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.4f; - } - - @Override - public float getHeight() { - return 0.3f; - } - - @Override - public double getSpeed() { - return 1.1; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(8); - this.setDamage(new int[] { 0, 2, 2, 3 }); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public int getKillExperience() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityEvoker.java b/src/main/java/cn/nukkit/entity/mob/EntityEvoker.java deleted file mode 100644 index 020274b30..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityEvoker.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; - -public class EntityEvoker extends EntityWalkingMob { - - public static final int NETWORK_ID = 104; - - public EntityEvoker(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public double getSpeed() { - return 1.1; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(24); - this.setDamage(new int[] { 0, 2, 3, 4 }); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && player.distanceSquared(this) <= 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.EMERALD, 0, Utils.rand(0, 1)), Item.get(Item.TOTEM, 0, 1)}; - } - - @Override - public int getKillExperience() { - return 10; - } - - @Override - public int nearbyDistanceMultiplier() { - return 20; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityFlyingMob.java b/src/main/java/cn/nukkit/entity/mob/EntityFlyingMob.java deleted file mode 100644 index 419206a40..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityFlyingMob.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityFlying; -import cn.nukkit.utils.Utils; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityFlyingMob extends EntityFlying implements EntityMob { - - protected int[] minDamage; - - protected int[] maxDamage; - - protected boolean canAttack = true; - - public EntityFlyingMob(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void setTarget(Entity target) { - this.setTarget(target, true); - } - - public void setTarget(Entity target, boolean attack) { - super.setTarget(target); - this.canAttack = attack; - } - - public int getDamage() { - return getDamage(null); - } - - public int getDamage(Integer difficulty) { - return Utils.rand(this.getMinDamage(difficulty), this.getMaxDamage(difficulty)); - } - - public int getMinDamage() { - return getMinDamage(null); - } - - public int getMinDamage(Integer difficulty) { - if (difficulty == null || difficulty > 3 || difficulty < 0) { - difficulty = Server.getInstance().getDifficulty(); - } - return this.minDamage[difficulty]; - } - - public int getMaxDamage() { - return getMaxDamage(null); - } - - public int getMaxDamage(Integer difficulty) { - if (difficulty == null || difficulty > 3 || difficulty < 0) { - difficulty = Server.getInstance().getDifficulty(); - } - return this.maxDamage[difficulty]; - } - - public void setDamage(int damage) { - this.setDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.minDamage[difficulty] = damage; - this.maxDamage[difficulty] = damage; - } - } - - public void setDamage(int[] damage) { - if (damage.length < 4) { - throw new IllegalArgumentException("Invalid damage array length"); - } - - if (minDamage == null || minDamage.length < 4) { - minDamage = Utils.emptyDamageArray; - } - - if (maxDamage == null || maxDamage.length < 4) { - maxDamage = Utils.emptyDamageArray; - } - - for (int i = 0; i < 4; i++) { - this.minDamage[i] = damage[i]; - this.maxDamage[i] = damage[i]; - } - } - - public void setMinDamage(int[] damage) { - if (damage.length < 4) { - return; - } - - for (int i = 0; i < 4; i++) { - this.setDamage(Math.min(damage[i], this.getMaxDamage(i)), i); - } - } - - public void setMinDamage(int damage) { - this.setDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setMinDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.minDamage[difficulty] = Math.min(damage, this.getMaxDamage(difficulty)); - } - } - - public void setMaxDamage(int[] damage) { - if (damage.length < 4) { - return; - } - - for (int i = 0; i < 4; i++) { - this.setMaxDamage(Math.max(damage[i], this.getMinDamage(i)), i); - } - } - - public void setMaxDamage(int damage) { - setMinDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setMaxDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.maxDamage[difficulty] = Math.max(damage, this.getMinDamage(difficulty)); - } - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.server.getDifficulty() < 1) { - this.close(); - return false; - } - - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - return true; - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - Vector3 target = this.updateMove(tickDiff); - if (this.getServer().getMobAiEnabled() && target instanceof Entity) { - Entity entity = (Entity) target; - if (!entity.closed && (target != this.followTarget || this.canAttack)) { - this.attackEntity(entity); - } - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityGhast.java b/src/main/java/cn/nukkit/entity/mob/EntityGhast.java deleted file mode 100644 index 558eaac19..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityGhast.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.projectile.EntityGhastFireBall; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.List; - -public class EntityGhast extends EntityFlyingMob { - - public static final int NETWORK_ID = 41; - - public EntityGhast(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 4; - } - - @Override - public float getHeight() { - return 4; - } - - @Override - public double getSpeed() { - return 1.2; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.fireProof = true; - this.setMaxHealth(10); - this.setDataFlag(DATA_FLAGS, DATA_FLAG_FIRE_IMMUNE, true); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && (player.isSurvival() || player.isAdventure()) && distance <= 256; - } - return creature.isAlive() && !creature.closed && distance <= 256; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 60 && Utils.rand(1, 32) < 4 && this.distanceSquared(player) <= 10000) { - this.attackDelay = 0; - - double f = 1; - double yaw = this.yaw + Utils.rand(-8.0, 8.0); - double pitch = this.pitch + Utils.rand(-5.0, 5.0); - Location pos = new Location(this.x - Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, this.y + this.getEyeHeight(), - this.z + Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, yaw, pitch, this.level); - - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) != Block.AIR) { - return; - } - - EntityGhastFireBall fireball = (EntityGhastFireBall) Entity.createEntity("GhastFireBall", pos, this); - fireball.setExplode(true); - fireball.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(fireball); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - fireball.close(); - } else { - fireball.spawnToAll(); - this.level.addLevelEvent(this, LevelEventPacket.EVENT_SOUND_GHAST_SHOOT); - } - } - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.GUNPOWDER, 0, 1)); - } - - drops.add(Item.get(Item.GHAST_TEAR, 0, Utils.rand(0, 1))); - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public int nearbyDistanceMultiplier() { - return 30; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityGuardian.java b/src/main/java/cn/nukkit/entity/mob/EntityGuardian.java deleted file mode 100644 index 64b7740fc..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityGuardian.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.data.LongEntityData; -import cn.nukkit.entity.passive.EntitySquid; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; - -public class EntityGuardian extends EntitySwimmingMob { - - public static final int NETWORK_ID = 49; - private int laserChargeTick = 60; - private long laserTargetEid = -1; - - public EntityGuardian(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.85f; - } - - @Override - public float getHeight() { - return 0.85f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(30); - this.setDamage(new int[] { 0, 4, 6, 9 }); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return (!player.closed) && player.spawned && player.isAlive() && (player.isSurvival() || player.isAdventure()) && distance <= 100; - } else if (creature instanceof EntitySquid) { - return creature.isAlive() && this.distanceSquared(creature) <= 80; - } - return false; - } - - @Override - public void attackEntity(Entity player) { - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, 1F); - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - boolean hasUpdate = super.entityBaseTick(tickDiff); - if (followTarget != null) { - if (laserTargetEid != followTarget.getId()) { - this.setDataProperty(new LongEntityData(Entity.DATA_TARGET_EID, laserTargetEid = followTarget.getId())); - laserChargeTick = 60; - } - if (targetOption((EntityCreature) followTarget,this.distanceSquared(followTarget))) { - if (--laserChargeTick < 0) { - if (this.getServer().getMobAiEnabled()) attackEntity(followTarget); - this.setDataProperty(new LongEntityData(Entity.DATA_TARGET_EID, laserTargetEid = -1)); - laserChargeTick = 60; - } - } else { - this.setDataProperty(new LongEntityData(Entity.DATA_TARGET_EID, laserTargetEid = -1)); - laserChargeTick = 60; - } - } - return hasUpdate; - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.PRISMARINE_SHARD, 0, Utils.rand(0, 2))}; - } - - @Override - public int getKillExperience() { - return 10; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityHoglin.java b/src/main/java/cn/nukkit/entity/mob/EntityHoglin.java deleted file mode 100644 index 110aa702e..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityHoglin.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -/** - * @author Erik Miller | EinBexiii - */ -public class EntityHoglin extends EntityWalkingMob { - - public final static int NETWORK_ID = 124; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityHoglin(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getKillExperience() { - return Utils.rand(1, 3); - } - - @Override - protected void initEntity() { - super.initEntity(); - this.setMaxHealth(40); - this.setDamage(new int[]{0, 2, 3, 4}); - } - - @Override - public float getWidth() { - return 0.9f; - } - - @Override - public float getHeight() { - return 0.9f; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 30 && player.distanceSquared(this) <= 1.5) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(2, 4); i++) { - drops.add(Item.get(this.isOnFire() ? Item.COOKED_PORKCHOP : Item.RAW_PORKCHOP, 0, 1)); - } - - if (Utils.rand()) { - drops.add(Item.get(Item.LEATHER)); - } - } - - return drops.toArray(new Item[0]); - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityHusk.java b/src/main/java/cn/nukkit/entity/mob/EntityHusk.java deleted file mode 100644 index c04bf57f5..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityHusk.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -public class EntityHusk extends EntityWalkingMob implements EntitySmite { - - public static final int NETWORK_ID = 47; - - public EntityHusk(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public double getSpeed() { - return 1.1; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - this.setDamage(new int[]{0, 3, 4, 6}); - } - - public void setHealth(int health) { - super.setHealth(health); - - if (this.isAlive()) { - if (15 < this.getHealth()) { - this.setDamage(new int[]{0, 2, 3, 4}); - } else if (10 < this.getHealth()) { - this.setDamage(new int[]{0, 3, 4, 6}); - } else if (5 < this.getHealth()) { - this.setDamage(new int[]{0, 3, 5, 7}); - } else { - this.setDamage(new int[]{0, 4, 6, 9}); - } - } - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && player.distanceSquared(this) <= 1) { - this.attackDelay = 0; - player.attack(new EntityDamageByEntityEvent(this, player, DamageCause.ENTITY_ATTACK, getDamage())); - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.ARM_SWING; - Server.broadcastPacket(this.getViewers().values(), pk); - player.addEffect(Effect.getEffect(Effect.HUNGER).setDuration(140)); - } - } - - @Override - public Item[] getDrops() { - return this.isBaby() ? new Item[0] : new Item[]{Item.get(Item.ROTTEN_FLESH, 0, Utils.rand(0, 2))}; - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : 5; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityJumpingMob.java b/src/main/java/cn/nukkit/entity/mob/EntityJumpingMob.java deleted file mode 100644 index fb5efd297..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityJumpingMob.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityJumping; -import cn.nukkit.utils.Utils; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityJumpingMob extends EntityJumping implements EntityMob { - - protected int[] minDamage; - - protected int[] maxDamage; - - protected boolean canAttack = true; - - public EntityJumpingMob(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void setTarget(Entity target) { - this.setTarget(target, true); - } - - public void setTarget(Entity target, boolean attack) { - super.setTarget(target); - this.canAttack = attack; - } - - public int getDamage() { - return getDamage(null); - } - - public int getDamage(Integer difficulty) { - return Utils.rand(this.getMinDamage(difficulty), this.getMaxDamage(difficulty)); - } - - public int getMinDamage() { - return getMinDamage(null); - } - - public int getMinDamage(Integer difficulty) { - if (difficulty == null || difficulty > 3 || difficulty < 0) { - difficulty = Server.getInstance().getDifficulty(); - } - return this.minDamage[difficulty]; - } - - public int getMaxDamage() { - return getMaxDamage(null); - } - - public int getMaxDamage(Integer difficulty) { - if (difficulty == null || difficulty > 3 || difficulty < 0) { - difficulty = Server.getInstance().getDifficulty(); - } - return this.maxDamage[difficulty]; - } - - public void setDamage(int damage) { - this.setDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.minDamage[difficulty] = damage; - this.maxDamage[difficulty] = damage; - } - } - - public void setDamage(int[] damage) { - if (damage.length < 4) { - throw new IllegalArgumentException("Invalid damage array length"); - } - - if (minDamage == null || minDamage.length < 4) { - minDamage = Utils.emptyDamageArray; - } - - if (maxDamage == null || maxDamage.length < 4) { - maxDamage = Utils.emptyDamageArray; - } - - for (int i = 0; i < 4; i++) { - this.minDamage[i] = damage[i]; - this.maxDamage[i] = damage[i]; - } - } - - public void setMinDamage(int[] damage) { - if (damage.length < 4) { - return; - } - - for (int i = 0; i < 4; i++) { - this.setDamage(Math.min(damage[i], this.getMaxDamage(i)), i); - } - } - - public void setMinDamage(int damage) { - this.setDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setMinDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.minDamage[difficulty] = Math.min(damage, this.getMaxDamage(difficulty)); - } - } - - public void setMaxDamage(int[] damage) { - if (damage.length < 4) { - return; - } - - for (int i = 0; i < 4; i++) { - this.setMaxDamage(Math.max(damage[i], this.getMinDamage(i)), i); - } - } - - public void setMaxDamage(int damage) { - setMinDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setMaxDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.maxDamage[difficulty] = Math.max(damage, this.getMinDamage(difficulty)); - } - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.server.getDifficulty() < 1) { - this.close(); - return false; - } - - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - return true; - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - Vector3 target = this.updateMove(tickDiff); - if (this.getServer().getMobAiEnabled() && target instanceof Entity) { - Entity entity = (Entity) target; - if (!entity.closed && (target != this.followTarget || this.canAttack)) { - this.attackEntity(entity); - } - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityMagmaCube.java b/src/main/java/cn/nukkit/entity/mob/EntityMagmaCube.java deleted file mode 100644 index f08748e76..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityMagmaCube.java +++ /dev/null @@ -1,157 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; - -public class EntityMagmaCube extends EntityJumpingMob { - - public static final int NETWORK_ID = 42; - - public static final int SIZE_SMALL = 1; - public static final int SIZE_MEDIUM = 2; - public static final int SIZE_BIG = 3; - - protected int size = SIZE_BIG; - - public EntityMagmaCube(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.51f + size * 0.51f; - } - - @Override - public float getHeight() { - return 0.51f + size * 0.51f; - } - - @Override - public float getLength() { - return 0.51f + size * 0.51f; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.fireProof = true; - - if (this.namedTag.contains("Size")) { - this.size = this.namedTag.getInt("Size"); - } else { - this.size = Utils.rand(1, 3); - } - - this.setScale(0.51f + size * 0.51f); - - if (size == SIZE_BIG) { - this.setMaxHealth(16); - } else if (size == SIZE_MEDIUM) { - this.setMaxHealth(4); - } else if (size == SIZE_SMALL) { - this.setMaxHealth(1); - } - - if (size == SIZE_BIG) { - this.setDamage(new int[] { 0, 3, 4, 6 }); - } else if (size == SIZE_MEDIUM) { - this.setDamage(new int[] { 0, 2, 2, 3 }); - } else { - this.setDamage(Utils.emptyDamageArray); - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putInt("Size", this.size); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public Item[] getDrops() { - if (this.size == SIZE_BIG) { - CreatureSpawnEvent ev = new CreatureSpawnEvent(NETWORK_ID, this, CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); - level.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return new Item[0]; - } - - EntityMagmaCube entity = (EntityMagmaCube) Entity.createEntity("MagmaCube", this); - entity.size = SIZE_MEDIUM; - entity.setScale(0.51f + entity.size * 0.51f); - entity.spawnToAll(); - - return new Item[0]; - } else if (this.size == SIZE_MEDIUM) { - CreatureSpawnEvent ev = new CreatureSpawnEvent(NETWORK_ID, this, CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); - level.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return new Item[0]; - } - - EntityMagmaCube entity = (EntityMagmaCube) Entity.createEntity("MagmaCube", this); - entity.size = SIZE_SMALL; - entity.setScale(0.51f + entity.size * 0.51f); - entity.spawnToAll(); - - return new Item[0]; - } else { - return new Item[]{Item.get(Item.MAGMA_CREAM, 0, Utils.rand(0, 1))}; - } - } - - @Override - public int getKillExperience() { - if (this.size == SIZE_BIG) return 4; - if (this.size == SIZE_MEDIUM) return 2; - if (this.size == SIZE_SMALL) return 1; - return 0; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Magma Cube"; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityMob.java b/src/main/java/cn/nukkit/entity/mob/EntityMob.java deleted file mode 100644 index bd7d465f8..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityMob.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.entity.Entity; -import cn.nukkit.item.Item; - -import java.util.HashMap; - -public interface EntityMob { - - void attackEntity(Entity player); - - int getDamage(); - - int getDamage(Integer difficulty); - - int getMinDamage(); - - int getMinDamage(Integer difficulty); - - int getMaxDamage(); - - int getMaxDamage(Integer difficulty); - - void setDamage(int damage); - - void setDamage(int[] damage); - - void setDamage(int damage, int difficulty); - - void setMinDamage(int damage); - - void setMinDamage(int[] damage); - - void setMinDamage(int damage, int difficulty); - - void setMaxDamage(int damage); - - void setMaxDamage(int[] damage); - - void setMaxDamage(int damage, int difficulty); - - final class ArmorPoints extends HashMap { - { - put(Item.LEATHER_CAP, 1f); - put(Item.LEATHER_TUNIC, 3f); - put(Item.LEATHER_PANTS, 2f); - put(Item.LEATHER_BOOTS, 1f); - put(Item.CHAIN_HELMET, 1f); - put(Item.CHAIN_CHESTPLATE, 5f); - put(Item.CHAIN_LEGGINGS, 4f); - put(Item.CHAIN_BOOTS, 1f); - put(Item.GOLD_HELMET, 1f); - put(Item.GOLD_CHESTPLATE, 5f); - put(Item.GOLD_LEGGINGS, 3f); - put(Item.GOLD_BOOTS, 1f); - put(Item.IRON_HELMET, 2f); - put(Item.IRON_CHESTPLATE, 6f); - put(Item.IRON_LEGGINGS, 5f); - put(Item.IRON_BOOTS, 2f); - put(Item.DIAMOND_HELMET, 3f); - put(Item.DIAMOND_CHESTPLATE, 8f); - put(Item.DIAMOND_LEGGINGS, 6f); - put(Item.DIAMOND_BOOTS, 3f); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityPhantom.java b/src/main/java/cn/nukkit/entity/mob/EntityPhantom.java deleted file mode 100644 index 4e2011d44..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityPhantom.java +++ /dev/null @@ -1,114 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; - -public class EntityPhantom extends EntityFlyingMob implements EntitySmite { - - public static final int NETWORK_ID = 58; - - public EntityPhantom(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.9f; - } - - @Override - public float getHeight() { - return 0.5f; - } - - @Override - public double getSpeed() { - return 1.8; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - this.setDamage(new int[] { 0, 4, 6, 9 }); - } - - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && (player.isSurvival() || player.isAdventure()) && distance <= 256; - } - return creature.isAlive() && !creature.closed && distance <= 256; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && player.distanceSquared(this) <= 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.PHANTOM_MEMBRANE, 0, Utils.rand(0, 1))}; - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - boolean hasUpdate; - - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - hasUpdate = super.entityBaseTick(tickDiff); - - if (level.shouldMobBurn(this)) { - this.setOnFire(100); - } - - return hasUpdate; - } - - @Override - public boolean dropsOnNaturalDeath() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityPiglin.java b/src/main/java/cn/nukkit/entity/mob/EntityPiglin.java deleted file mode 100644 index d656ce5e7..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityPiglin.java +++ /dev/null @@ -1,110 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.inventory.PlayerInventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.HashMap; - -/** - * @author Erik Miller | EinBexiii - */ -public class EntityPiglin extends EntityWalkingMob { - - public final static int NETWORK_ID = 123; - - private int angry = 0; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityPiglin(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getKillExperience() { - return 0; - } - - @Override - protected void initEntity() { - super.initEntity(); - this.setMaxHealth(16); - this.setDamage(new int[]{0, 3, 5, 7}); - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 30 && player.distanceSquared(this) <= 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - public boolean isAngry() { - return this.angry > 0; - } - - public void setAngry(int val) { - this.angry = val; - } - - private static boolean isWearingGold(Player p) { - PlayerInventory i = p.getInventory(); - return i.getHelmetFast().getId() == ItemID.GOLD_HELMET || i.getChestplateFast().getId() == ItemID.GOLD_CHESTPLATE || i.getLeggingsFast().getId() == ItemID.GOLD_LEGGINGS || i.getBootsFast().getId() == ItemID.GOLD_BOOTS; - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (!ev.isCancelled() && ev instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) ev).getDamager() instanceof Player) { - this.setAngry(600); - } - } - - return true; - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (distance <= 100 && this.isAngry() && creature instanceof EntityPiglin && !((EntityPiglin) creature).isAngry()) { - ((EntityPiglin) creature).setAngry(600); - } - return creature.isPlayer && (this.isAngry() || !isWearingGold((Player) creature)) && super.targetOption(creature, distance); - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityPiglinBrute.java b/src/main/java/cn/nukkit/entity/mob/EntityPiglinBrute.java deleted file mode 100644 index e16fde99a..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityPiglinBrute.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.HashMap; - -public class EntityPiglinBrute extends EntityWalkingMob { - - public static final int NETWORK_ID = 127; - - public EntityPiglinBrute(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - - this.setMaxHealth(50); - this.setDamage(new int[]{0, 3, 7, 10}); // no weapon - //this.setDamage(new int[]{0, 6, 10, 15}); // with weapon - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public int getKillExperience() { - return 10; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1.44) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Piglin Brute"; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityPillager.java b/src/main/java/cn/nukkit/entity/mob/EntityPillager.java deleted file mode 100644 index e7b073ac6..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityPillager.java +++ /dev/null @@ -1,126 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.entity.EntityShootBowEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.List; - -public class EntityPillager extends EntityWalkingMob { - - public static final int NETWORK_ID = 114; - - public EntityPillager(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(24); - this.setDamage(new int[] { 0, 4, 4, 5 }); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 80 && Utils.rand(1, 32) < 4 && this.distanceSquared(player) <= 100) { - this.attackDelay = 0; - - double f = 1.5; - double yaw = this.yaw + Utils.rand(-12.0, 12.0); - double pitch = this.pitch + Utils.rand(-7.0, 7.0); - Location pos = new Location(this.x - Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, this.y + this.getHeight() - 0.18, - this.z + Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, yaw, pitch, this.level); - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) == Block.AIR) { - EntityArrow arrow = (EntityArrow) Entity.createEntity("Arrow", pos, this); - arrow.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - - EntityShootBowEvent ev = new EntityShootBowEvent(this, Item.get(Item.ARROW, 0, 1), arrow, f); - this.server.getPluginManager().callEvent(ev); - - EntityProjectile projectile = ev.getProjectile(); - if (ev.isCancelled()) { - projectile.close(); - } else { - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(projectile); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - projectile.close(); - } else { - projectile.namedTag.putDouble("damage", 4); - projectile.spawnToAll(); - ((EntityArrow) projectile).setPickupMode(EntityArrow.PICKUP_NONE); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_CROSSBOW_SHOOT); - } - } - } - } - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.ARROW, 0, 1)); - } - - if (Utils.rand(1, 12) == 1) { - drops.add(Item.get(Item.CROSSBOW, Utils.rand(300, 380), Utils.rand(0, 1))); - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getId(); - pk.item = Item.get(Item.CROSSBOW, 0, 1); - pk.hotbarSlot = 0; - player.dataPacket(pk); - } - - @Override - public int nearbyDistanceMultiplier() { - return 20; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityRavager.java b/src/main/java/cn/nukkit/entity/mob/EntityRavager.java deleted file mode 100644 index 44c4f22da..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityRavager.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.HashMap; - -public class EntityRavager extends EntityWalkingMob { - - public static final int NETWORK_ID = 59; - - public EntityRavager(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(100); - this.setDamage(new int[] { 0, 7, 12, 18 }); - } - - @Override - public float getHeight() { - return 1.9f; - } - - @Override - public float getWidth() { - return 1.2f; - } - - @Override - public int getKillExperience() { - return 0; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 80 && player.distanceSquared(this) <= 1.5) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/entity/mob/EntityShulker.java b/src/main/java/cn/nukkit/entity/mob/EntityShulker.java deleted file mode 100644 index 6c5cb39eb..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityShulker.java +++ /dev/null @@ -1,118 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.projectile.EntityShulkerBullet; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Location; -import cn.nukkit.level.Sound; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.sound.EndermanTeleportSound; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public class EntityShulker extends EntityWalkingMob { - - public static final int NETWORK_ID = 54; - - public EntityShulker(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 1f; - } - - @Override - public float getHeight() { - return 1f; - } - - @Override - public double getSpeed() { - return 0; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.fireProof = true; - this.setMaxHealth(15); - this.setDamage(Utils.emptyDamageArray); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && Utils.rand(1, 32) < 4 && this.distanceSquared(player) <= 55) { - this.attackDelay = 0; - - double f = 0.5; - double yaw = this.yaw + Utils.rand(-12.0, 12.0); - double pitch = this.pitch + Utils.rand(-7.0, 7.0); - Location pos = new Location(this.x - Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, this.y + this.getHeight() - 0.18, - this.z + Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, yaw, pitch, this.level); - - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) != Block.AIR) { - return; - } - - Entity k = Entity.createEntity("ShulkerBullet", pos, this); - if (!(k instanceof EntityShulkerBullet)) { - return; - } - - EntityShulkerBullet bullet = (EntityShulkerBullet) k; - bullet.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(bullet); - this.server.getPluginManager().callEvent(launch); - - if (launch.isCancelled()) { - bullet.close(); - } else { - bullet.spawnToAll(); - this.level.addSoundToViewers(this, Sound.MOB_SHULKER_SHOOT); - } - } - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (!ev.isCancelled()) { - if (Utils.rand(1, 10) == 1) { - this.level.addSound(new EndermanTeleportSound(this)); - this.move(Utils.rand(-10, 10), 0, Utils.rand(-10, 10)); - } - } - - return true; - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.SHULKER_SHELL, 0, Utils.rand(0, 1))}; - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public void knockBack(Entity attacker, double damage, double x, double z, double base) { - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySilverfish.java b/src/main/java/cn/nukkit/entity/mob/EntitySilverfish.java deleted file mode 100644 index da2052ced..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntitySilverfish.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityArthropod; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.HashMap; - -public class EntitySilverfish extends EntityWalkingMob implements EntityArthropod { - - public static final int NETWORK_ID = 39; - - public EntitySilverfish(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.4f; - } - - @Override - public float getHeight() { - return 0.3f; - } - - @Override - public double getSpeed() { - return 1.4; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(8); - this.setDamage(new int[] { 0, 1, 1, 1 }); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public int getKillExperience() { - return 5; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySkeleton.java b/src/main/java/cn/nukkit/entity/mob/EntitySkeleton.java deleted file mode 100644 index 3590d4172..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntitySkeleton.java +++ /dev/null @@ -1,156 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.entity.EntityShootBowEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBow; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.List; - -public class EntitySkeleton extends EntityWalkingMob implements EntitySmite { - - public static final int NETWORK_ID = 34; - - public EntitySkeleton(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.99f; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && Utils.rand(1, 32) < 4 && this.distanceSquared(player) <= 55) { - this.attackDelay = 0; - - double f = 1.3; - double yaw = this.yaw; - double pitch = this.pitch; - double yawR = FastMath.toRadians(yaw); - double pitchR = FastMath.toRadians(pitch); - Location pos = new Location(this.x - Math.sin(yawR) * Math.cos(pitchR) * 0.5, this.y + this.getHeight() - 0.18, - this.z + Math.cos(yawR) * Math.cos(pitchR) * 0.5, yaw, pitch, this.level); - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) == Block.AIR) { - Entity k = Entity.createEntity("Arrow", pos, this); - if (!(k instanceof EntityArrow)) { - return; - } - - EntityArrow arrow = (EntityArrow) k; - setProjectileMotion(arrow, pitch, yawR, pitchR, f); - - EntityShootBowEvent ev = new EntityShootBowEvent(this, Item.get(Item.ARROW, 0, 1), arrow, f); - this.server.getPluginManager().callEvent(ev); - - EntityProjectile projectile = ev.getProjectile(); - if (ev.isCancelled()) { - projectile.close(); - } else { - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(projectile); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - projectile.close(); - } else { - projectile.spawnToAll(); - ((EntityArrow) projectile).setPickupMode(EntityArrow.PICKUP_NONE); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BOW); - } - } - } - } - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getId(); - pk.item = new ItemBow(); - pk.hotbarSlot = 0; - player.dataPacket(pk); - - /*if (java.time.LocalDate.now().toString().contains("-10-31")) { - MobArmorEquipmentPacket pk2 = new MobArmorEquipmentPacket(); - pk2.eid = this.getId(); - pk2.slots[0] = new ItemBlock(Block.get(Block.PUMPKIN)); - player.dataPacket(pk2); - }*/ - } - - @Override - public boolean entityBaseTick(int tickDiff) { - boolean hasUpdate; - - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - hasUpdate = super.entityBaseTick(tickDiff); - - if (level.shouldMobBurn(this)) { - this.setOnFire(100); - } - - return hasUpdate; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.BONE, 0, 1)); - } - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.ARROW, 0, 1)); - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public int nearbyDistanceMultiplier() { - return 10; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySlime.java b/src/main/java/cn/nukkit/entity/mob/EntitySlime.java deleted file mode 100644 index a9b557287..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntitySlime.java +++ /dev/null @@ -1,164 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntitySlime extends EntityJumpingMob { - - public static final int NETWORK_ID = 37; - - public static final int SIZE_SMALL = 1; - public static final int SIZE_MEDIUM = 2; - public static final int SIZE_BIG = 3; - - protected int size = SIZE_BIG; - - public EntitySlime(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.51f + size * 0.51f; - } - - @Override - public float getHeight() { - return 0.51f + size * 0.51f; - } - - @Override - public float getLength() { - return 0.51f + size * 0.51f; - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag.contains("Size")) { - this.size = this.namedTag.getInt("Size"); - } else { - this.size = Utils.rand(1, 3); - } - - this.setScale(0.51f + size * 0.51f); - - if (size == SIZE_BIG) { - this.setMaxHealth(16); - } else if (size == SIZE_MEDIUM) { - this.setMaxHealth(4); - } else if (size == SIZE_SMALL) { - this.setMaxHealth(1); - } - - if (size == SIZE_BIG) { - this.setDamage(new int[] { 0, 3, 4, 6 }); - } else if (size == SIZE_MEDIUM) { - this.setDamage(new int[] { 0, 2, 2, 3 }); - } else { - this.setDamage(Utils.emptyDamageArray); - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putInt("Size", this.size); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public Item[] getDrops() { - if (this.size == SIZE_BIG) { - CreatureSpawnEvent ev = new CreatureSpawnEvent(NETWORK_ID, this, CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); - level.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return new Item[0]; - } - - EntitySlime entity = (EntitySlime) Entity.createEntity("Slime", this); - - if (entity != null) { - entity.size = SIZE_MEDIUM; - entity.setScale(0.51f + entity.size * 0.51f); - entity.spawnToAll(); - } - - return new Item[0]; - } else if (this.size == SIZE_MEDIUM) { - CreatureSpawnEvent ev = new CreatureSpawnEvent(NETWORK_ID, this, CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); - level.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return new Item[0]; - } - - EntitySlime entity = (EntitySlime) Entity.createEntity("Slime", this); - - if (entity != null) { - entity.size = SIZE_SMALL; - entity.setScale(0.51f + entity.size * 0.51f); - entity.spawnToAll(); - } - - return new Item[0]; - } else { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.SLIMEBALL, 0, 1)); - } - - return drops.toArray(new Item[0]); - } - } - - @Override - public int getKillExperience() { - if (this.size == SIZE_BIG) return 4; - if (this.size == SIZE_MEDIUM) return 2; - if (this.size == SIZE_SMALL) return 1; - return 0; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySpider.java b/src/main/java/cn/nukkit/entity/mob/EntitySpider.java deleted file mode 100644 index 8ffcdd9e9..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntitySpider.java +++ /dev/null @@ -1,171 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityArthropod; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntitySpider extends EntityWalkingMob implements EntityArthropod { - - public static final int NETWORK_ID = 35; - - private int angry = 0; - - public EntitySpider(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 1.4f; - } - - @Override - public float getHeight() { - return 0.9f; - } - - @Override - public double getSpeed() { - return 1.13; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(16); - this.setDamage(new int[] { 0, 2, 2, 3 }); - } - - @Override - protected boolean checkJump(double dx, double dz) { - if (this.motionY == this.getGravity() * 2) { - int b = level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) this.y, NukkitMath.floorDouble(this.z)); - return b == BlockID.WATER || b == BlockID.STILL_WATER; - } else { - int b = level.getBlockIdAt(chunk, NukkitMath.floorDouble(this.x), (int) (this.y + 0.8), NukkitMath.floorDouble(this.z)); - if (b == BlockID.WATER || b == BlockID.STILL_WATER) { - this.motionY = this.getGravity() * 2; - return true; - } - } - - try { - Block block = this.getLevel().getBlock(new Vector3(NukkitMath.floorDouble(this.x + dx), (int) this.y, NukkitMath.floorDouble(this.z + dz))); - Block directionBlock = block.getSide(this.getDirection()); - if (!directionBlock.canPassThrough()) { - this.motionY = this.getGravity() * 3; - return true; - } - } catch (Exception ignore) {} - - return false; - } - - @Override - public void attackEntity(Entity player) { - if (!this.isFriendly() || !(player instanceof Player)) { - if (this.isAngry()) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1.3) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - } - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (!ev.isCancelled() && ev instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) ev).getDamager() instanceof Player) { - this.setAngry(2400); - } - } - - return true; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.STRING, 0, 1)); - } - - for (int i = 0; i < (Utils.rand(0, 2) == 0 ? 1 : 0); i++) { - drops.add(Item.get(Item.SPIDER_EYE, 0, 1)); - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - if (this.angry > 0) { - this.angry--; - } - - return super.entityBaseTick(tickDiff); - } - - public boolean isAngry() { - int time = this.level.getTime() % Level.TIME_FULL; - return this.angry > 0 || (time > 13184 && time < 22800); - } - - public void setAngry(int val) { - this.angry = val; - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - return this.isAngry() && super.targetOption(creature, distance); - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityStray.java b/src/main/java/cn/nukkit/entity/mob/EntityStray.java deleted file mode 100644 index 7c740d915..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityStray.java +++ /dev/null @@ -1,147 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.entity.EntityShootBowEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBow; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.List; - -public class EntityStray extends EntityWalkingMob implements EntitySmite { - - public static final int NETWORK_ID = 46; - - public EntityStray(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.99f; - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getId(); - pk.item = new ItemBow(); - pk.hotbarSlot = 0; - player.dataPacket(pk); - } - - @Override - public boolean entityBaseTick(int tickDiff) { - boolean hasUpdate; - - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - hasUpdate = super.entityBaseTick(tickDiff); - - if (level.shouldMobBurn(this)) { - this.setOnFire(100); - } - - return hasUpdate; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && Utils.rand(1, 32) < 4 && this.distanceSquared(player) <= 55) { - this.attackDelay = 0; - - double f = 1.3; - double yawR = FastMath.toRadians(yaw); - double pitchR = FastMath.toRadians(pitch); - Location pos = new Location(this.x - Math.sin(yawR) * Math.cos(pitchR) * 0.5, this.y + this.getHeight() - 0.18, - this.z + Math.cos(yawR) * Math.cos(pitchR) * 0.5, yaw, pitch, this.level); - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) == Block.AIR) { - EntityArrow arrow = (EntityArrow) Entity.createEntity("Arrow", pos, this); - arrow.isFromStray = true; - setProjectileMotion(arrow, pitch, yawR, pitchR, f); - - EntityShootBowEvent ev = new EntityShootBowEvent(this, Item.get(Item.ARROW, 0, 1), arrow, f); - this.server.getPluginManager().callEvent(ev); - - EntityProjectile projectile = ev.getProjectile(); - if (ev.isCancelled()) { - projectile.close(); - } else { - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(projectile); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - projectile.close(); - } else { - projectile.spawnToAll(); - ((EntityArrow) projectile).setPickupMode(EntityArrow.PICKUP_NONE); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BOW); - } - } - } - } - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.BONE, 0, 1)); - } - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.ARROW, 0, 1)); - } - - if (Utils.rand()) { - drops.add(Item.get(Item.ARROW, 18, 1)); - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public int nearbyDistanceMultiplier() { - return 10; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySwimmingMob.java b/src/main/java/cn/nukkit/entity/mob/EntitySwimmingMob.java deleted file mode 100644 index 6069dd85e..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntitySwimmingMob.java +++ /dev/null @@ -1,165 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.utils.Utils; -import cn.nukkit.entity.EntitySwimming; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntitySwimmingMob extends EntitySwimming implements EntityMob { - - private int[] minDamage; - - private int[] maxDamage; - - private boolean canAttack = true; - - public EntitySwimmingMob(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void setTarget(Entity target) { - this.setTarget(target, true); - } - - public void setTarget(Entity target, boolean attack) { - super.setTarget(target); - this.canAttack = attack; - } - - public int getDamage() { - return getDamage(null); - } - - public int getDamage(Integer difficulty) { - return Utils.rand(this.getMinDamage(difficulty), this.getMaxDamage(difficulty)); - } - - public int getMinDamage() { - return getMinDamage(null); - } - - public int getMinDamage(Integer difficulty) { - if (difficulty == null || difficulty > 3 || difficulty < 0) { - difficulty = Server.getInstance().getDifficulty(); - } - return this.minDamage[difficulty]; - } - - public int getMaxDamage() { - return getMaxDamage(null); - } - - public int getMaxDamage(Integer difficulty) { - if (difficulty == null || difficulty > 3 || difficulty < 0) { - difficulty = Server.getInstance().getDifficulty(); - } - return this.maxDamage[difficulty]; - } - - public void setDamage(int damage) { - this.setDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.minDamage[difficulty] = damage; - this.maxDamage[difficulty] = damage; - } - } - - public void setDamage(int[] damage) { - if (damage.length < 4) { - throw new IllegalArgumentException("Invalid damage array length"); - } - - if (minDamage == null || minDamage.length < 4) { - minDamage = Utils.emptyDamageArray; - } - - if (maxDamage == null || maxDamage.length < 4) { - maxDamage = Utils.emptyDamageArray; - } - - for (int i = 0; i < 4; i++) { - this.minDamage[i] = damage[i]; - this.maxDamage[i] = damage[i]; - } - } - - public void setMinDamage(int[] damage) { - if (damage.length < 4) { - return; - } - - for (int i = 0; i < 4; i++) { - this.setMinDamage(Math.min(damage[i], this.getMaxDamage(i)), i); - } - } - - public void setMinDamage(int damage) { - this.setMinDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setMinDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.minDamage[difficulty] = Math.min(damage, this.getMaxDamage(difficulty)); - } - } - - public void setMaxDamage(int[] damage) { - if (damage.length < 4) - return; - - for (int i = 0; i < 4; i++) { - this.setMaxDamage(Math.max(damage[i], this.getMinDamage(i)), i); - } - } - - public void setMaxDamage(int damage) { - setMinDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setMaxDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.maxDamage[difficulty] = Math.max(damage, this.getMinDamage(difficulty)); - } - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.server.getDifficulty() < 1) { - this.close(); - return false; - } - - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - return true; - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - Vector3 target = this.updateMove(tickDiff); - if (this.getServer().getMobAiEnabled() && (!this.isFriendly() || !(target instanceof Player)) && target instanceof Entity) { - Entity entity = (Entity) target; - if (!entity.closed && (target != this.followTarget || this.canAttack)) { - this.attackEntity(entity); - } - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityTameableMob.java b/src/main/java/cn/nukkit/entity/mob/EntityTameableMob.java deleted file mode 100644 index 2e8556a58..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityTameableMob.java +++ /dev/null @@ -1,127 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityTameable; -import cn.nukkit.entity.data.LongEntityData; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityTameableMob extends EntityWalkingMob implements EntityTameable { - - private Player owner = null; - - private String ownerUUID = ""; - - private boolean sitting = false; - - public EntityTameableMob(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag != null) { - String ownerName = namedTag.getString(NAMED_TAG_OWNER); - if (ownerName != null && !ownerName.isEmpty()) { - Player player = this.getServer().getPlayerExact(ownerName); - if (player != null) { - this.setOwner(player); - } - this.setSitting(namedTag.getBoolean(NAMED_TAG_SITTING)); - } - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - namedTag.putBoolean(NAMED_TAG_SITTING, this.sitting); - if (this.owner != null) { - namedTag.putString(NAMED_TAG_OWNER, this.owner.getName()); - namedTag.putString(NAMED_TAG_OWNER_UUID, owner.getUniqueId().toString()); - } - } - - @Override - public Player getOwner() { - this.checkOwner(); - return this.owner; - } - - @Override - public boolean hasOwner() { - return hasOwner(true); - } - - public boolean hasOwner(boolean checkOnline) { - if (checkOnline) { - this.checkOwner(); - return this.owner != null; - } else { - if (this.namedTag != null) { - String ownerName = namedTag.getString(NAMED_TAG_OWNER); - return ownerName != null && !ownerName.isEmpty(); - } - return false; - } - } - - @Override - public void setOwner(Player player) { - this.owner = player; - this.setDataProperty(new LongEntityData(DATA_OWNER_EID, player.getId())); - this.setTamed(true); - } - - @Override - public boolean isSitting() { - return this.sitting; - } - - @Override - public void setSitting(boolean sit) { - this.sitting = sit; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SITTING, sit); - } - - public void setTamed(boolean tamed) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_TAMED, tamed); - } - - @Override - public String getOwnerUUID() { - return this.ownerUUID; - } - - @Override - public void setOwnerUUID(String ownerUUID) { - this.ownerUUID = ownerUUID; - } - - @Override - public Vector3 updateMove(int tickDiff) { - if (this.sitting) { - return this.target; - } - - return super.updateMove(tickDiff); - } - - /** - * If the owner is online, set owner properly - */ - public void checkOwner() { - if (this.owner == null && this.namedTag != null) { - String ownerName = namedTag.getString(NAMED_TAG_OWNER); - if (ownerName != null && !ownerName.isEmpty()) { - Player player = this.getServer().getPlayerExact(ownerName); - if (player != null) { - this.setOwner(player); - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityVex.java b/src/main/java/cn/nukkit/entity/mob/EntityVex.java deleted file mode 100644 index ce2e9080e..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityVex.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSwordIron; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.MobEquipmentPacket; - -import java.util.HashMap; - -public class EntityVex extends EntityFlyingMob { - - public static final int NETWORK_ID = 105; - - public EntityVex(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.8f; - } - - @Override - public float getHeight() { - return 0.4f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(14); - this.setDamage(new int[] { 0, 5, 9, 13 }); - } - - @Override - public int getKillExperience() { - return 3; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1.44) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getId(); - pk.item = new ItemSwordIron(); - pk.hotbarSlot = 10; - player.dataPacket(pk); - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityVindicator.java b/src/main/java/cn/nukkit/entity/mob/EntityVindicator.java deleted file mode 100644 index 9f976a9d0..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityVindicator.java +++ /dev/null @@ -1,124 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.data.LongEntityData; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; - -public class EntityVindicator extends EntityWalkingMob { - - public static final int NETWORK_ID = 57; - - private boolean angry; - - public EntityVindicator(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public double getSpeed() { - return 1.2; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(24); - this.setDamage(new int[] { 0, 2, 3, 4 }); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && player.distanceSquared(this) <= 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.EMERALD, 0, Utils.rand(0, 1))}; - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - if (this.followTarget != null) { - if (!this.angry) { - this.angry = true; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ANGRY, true); // show the axe - } - if (this.getDataPropertyLong(DATA_TARGET_EID) != this.followTarget.getId()) { - this.setDataProperty(new LongEntityData(DATA_TARGET_EID, this.followTarget.getId())); // raise the axe - } - } else { - if (this.angry) { - this.angry = false; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ANGRY, false); - } - if (this.getDataPropertyLong(DATA_TARGET_EID) != 0) { - this.setDataProperty(new LongEntityData(DATA_TARGET_EID, 0)); - } - } - - return super.entityBaseTick(tickDiff); - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getId(); - pk.item = Item.get(Item.IRON_AXE); - pk.hotbarSlot = 0; - player.dataPacket(pk); - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityWalkingMob.java b/src/main/java/cn/nukkit/entity/mob/EntityWalkingMob.java deleted file mode 100644 index 557af0082..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityWalkingMob.java +++ /dev/null @@ -1,169 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.utils.Utils; -import cn.nukkit.entity.EntityWalking; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityWalkingMob extends EntityWalking implements EntityMob { - - private int[] minDamage; - - private int[] maxDamage; - - private boolean canAttack = true; - - /** - * For golems: entity id of the target - */ - public long isAngryTo = -1; - - public EntityWalkingMob(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void setTarget(Entity target) { - this.setTarget(target, true); - } - - public void setTarget(Entity target, boolean attack) { - super.setTarget(target); - this.canAttack = attack; - } - - public int getDamage() { - return getDamage(null); - } - - public int getDamage(Integer difficulty) { - return Utils.rand(this.getMinDamage(difficulty), this.getMaxDamage(difficulty)); - } - - public int getMinDamage() { - return getMinDamage(null); - } - - public int getMinDamage(Integer difficulty) { - if (difficulty == null || difficulty > 3 || difficulty < 0) { - difficulty = Server.getInstance().getDifficulty(); - } - return this.minDamage[difficulty]; - } - - public int getMaxDamage() { - return getMaxDamage(null); - } - - public int getMaxDamage(Integer difficulty) { - if (difficulty == null || difficulty > 3 || difficulty < 0) { - difficulty = Server.getInstance().getDifficulty(); - } - return this.maxDamage[difficulty]; - } - - public void setDamage(int damage) { - this.setDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.minDamage[difficulty] = damage; - this.maxDamage[difficulty] = damage; - } - } - - public void setDamage(int[] damage) { - if (damage.length < 4) { - throw new IllegalArgumentException("Invalid damage array length"); - } - - if (minDamage == null || minDamage.length < 4) { - minDamage = Utils.emptyDamageArray; - } - - if (maxDamage == null || maxDamage.length < 4) { - maxDamage = Utils.emptyDamageArray; - } - - for (int i = 0; i < 4; i++) { - this.minDamage[i] = damage[i]; - this.maxDamage[i] = damage[i]; - } - } - - public void setMinDamage(int[] damage) { - if (damage.length < 4) { - return; - } - - for (int i = 0; i < 4; i++) { - this.setMinDamage(Math.min(damage[i], this.getMaxDamage(i)), i); - } - } - - public void setMinDamage(int damage) { - this.setMinDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setMinDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.minDamage[difficulty] = Math.min(damage, this.getMaxDamage(difficulty)); - } - } - - public void setMaxDamage(int[] damage) { - if (damage.length < 4) - return; - - for (int i = 0; i < 4; i++) { - this.setMaxDamage(Math.max(damage[i], this.getMinDamage(i)), i); - } - } - - public void setMaxDamage(int damage) { - setMinDamage(damage, Server.getInstance().getDifficulty()); - } - - public void setMaxDamage(int damage, int difficulty) { - if (difficulty >= 1 && difficulty <= 3) { - this.maxDamage[difficulty] = Math.max(damage, this.getMinDamage(difficulty)); - } - } - - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.server.getDifficulty() < 1) { - this.close(); - return false; - } - - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - return true; - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - Vector3 target = this.updateMove(tickDiff); - if (this.getServer().getMobAiEnabled() && target instanceof Entity && (!this.isFriendly() || !(target instanceof Player) || ((Entity) target).getId() == this.isAngryTo)) { - Entity entity = (Entity) target; - if (!entity.closed && (target != this.followTarget || this.canAttack)) { - this.attackEntity(entity); - } - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityWitch.java b/src/main/java/cn/nukkit/entity/mob/EntityWitch.java deleted file mode 100644 index 4783a5485..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityWitch.java +++ /dev/null @@ -1,148 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.item.EntityPotion; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Location; -import cn.nukkit.level.Sound; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.potion.Effect; -import cn.nukkit.potion.Potion; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.List; - -public class EntityWitch extends EntityWalkingMob { - - public static final int NETWORK_ID = 45; - - public EntityWitch(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(26); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return !player.closed && player.spawned && player.isAlive() && (player.isSurvival() || player.isAdventure()) && distance <= 100; - } - return creature.isAlive() && !creature.closed && distance <= 100; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 60 && Utils.rand(1, 3) == 2 && this.distanceSquared(player) <= 60) { - this.attackDelay = 0; - if (player.isAlive() && !player.closed) { - - double f = 1; - double yaw = this.yaw + Utils.rand(-5.0, 5.0); - Location pos = new Location(this.x - Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, this.y + this.getEyeHeight(), - this.z + Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, yaw, pitch, this.level); - - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) != Block.AIR) { - return; - } - - EntityPotion thrownPotion = (EntityPotion) Entity.createEntity("ThrownPotion", pos, this); - - double distance = this.distanceSquared(player); - - if (!player.hasEffect(Effect.SLOWNESS) && distance <= 64) { - thrownPotion.potionId = Potion.SLOWNESS; - } else if (player.getHealth() >= 8) { - thrownPotion.potionId = Potion.POISON; - } else if (!player.hasEffect(Effect.WEAKNESS) && Utils.rand(0, 4) == 0 && distance <= 9) { - thrownPotion.potionId = Potion.WEAKNESS; - } else { - thrownPotion.potionId = Potion.HARMING; - } - - thrownPotion.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(thrownPotion); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - thrownPotion.close(); - } else { - thrownPotion.spawnToAll(); - this.level.addSoundToViewers(this, Sound.MOB_WITCH_THROW); - } - } - } - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (Utils.rand(1, 4) == 1) { - drops.add(Item.get(Item.STICK, 0, Utils.rand(0, 2))); - } - - if (Utils.rand(1, 3) == 1) { - switch (Utils.rand(1, 6)) { - case 1: - drops.add(Item.get(Item.BOTTLE, 0, Utils.rand(0, 2))); - break; - case 2: - drops.add(Item.get(Item.GLOWSTONE_DUST, 0, Utils.rand(0, 2))); - break; - case 3: - drops.add(Item.get(Item.GUNPOWDER, 0, Utils.rand(0, 2))); - break; - case 4: - drops.add(Item.get(Item.REDSTONE, 0, Utils.rand(0, 2))); - break; - case 5: - drops.add(Item.get(Item.SPIDER_EYE, 0, Utils.rand(0, 2))); - break; - case 6: - drops.add(Item.get(Item.SUGAR, 0, Utils.rand(0, 2))); - break; - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public int nearbyDistanceMultiplier() { - return 8; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityWither.java b/src/main/java/cn/nukkit/entity/mob/EntityWither.java deleted file mode 100644 index 1b0893d6c..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityWither.java +++ /dev/null @@ -1,228 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.*; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.entity.projectile.EntityBlueWitherSkull; -import cn.nukkit.entity.projectile.EntityWitherSkull; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityExplosionPrimeEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Explosion; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.Location; -import cn.nukkit.level.Sound; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.AddEntityPacket; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public class EntityWither extends EntityFlyingMob implements EntityBoss, EntitySmite { - - public static final int NETWORK_ID = 52; - - /** - Whether the wither is exploded and dying - */ - private boolean exploded; - - public EntityWither(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.9f; - } - - @Override - public float getHeight() { - return 3.5f; - } - - @Override - public double getSpeed() { - return 1.3; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.fireProof = true; - this.setMaxHealth(witherMaxHealth()); - this.setDamage(new int[]{0, 2, 4, 6}); - if (this.age == 0) { - this.setDataProperty(new IntEntityData(DATA_WITHER_INVULNERABLE_TICKS, 200)); - } - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - if (!player.isSurvival() && !player.isAdventure()) { - return false; - } - } - return creature.isAlive() && !creature.closed && distance <= 256; - } - - @Override - public int getKillExperience() { - return 50; - } - - @Override - public void attackEntity(Entity player) { - if (this.age > 220 && this.attackDelay > 23 && Utils.rand(1, 5) < 3 && this.distanceSquared(player) <= 10000) { - this.attackDelay = 0; - - double f = 1; - double yaw = this.yaw + Utils.rand(-12.0, 12.0); - double pitch = this.pitch + Utils.rand(-7.0, 7.0); - Location pos = new Location(this.x - Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, this.y + this.getEyeHeight(), - this.z + Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, yaw, pitch, this.level); - - if (this.getLevel().getBlockIdAt((int) pos.getX(), (int) pos.getY(), (int) pos.getZ()) != Block.AIR) { - return; - } - - Entity k; - ProjectileLaunchEvent launch; - EntityWitherSkull skull; - if (Utils.rand(0, 200) > 180 || Utils.rand(0, 200) < 20) { - f = 0.8; - k = Entity.createEntity("BlueWitherSkull", pos, this); - skull = (EntityBlueWitherSkull) k; - ((EntityBlueWitherSkull) skull).setExplode(true); - skull.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - launch = new ProjectileLaunchEvent(skull); - } else { - k = Entity.createEntity("WitherSkull", pos, this); - skull = (EntityWitherSkull) k; - skull.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - launch = new ProjectileLaunchEvent(skull); - } - - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - skull.close(); - } else { - skull.spawnToAll(); - this.level.addSoundToViewers(this, Sound.MOB_WITHER_SHOOT); - } - } - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.NETHER_STAR, 0, 1)}; - } - - @Override - protected DataPacket createAddEntityPacket() { - AddEntityPacket addEntity = new AddEntityPacket(); - addEntity.type = NETWORK_ID; - addEntity.entityUniqueId = this.getId(); - addEntity.entityRuntimeId = this.getId(); - addEntity.yaw = (float) this.yaw; - addEntity.headYaw = (float) this.yaw; - addEntity.pitch = (float) this.pitch; - addEntity.x = (float) this.x; - addEntity.y = (float) this.y; - addEntity.z = (float) this.z; - addEntity.speedX = (float) this.motionX; - addEntity.speedY = (float) this.motionY; - addEntity.speedZ = (float) this.motionZ; - addEntity.metadata = this.dataProperties.clone(); - addEntity.attributes = new Attribute[]{Attribute.getAttribute(Attribute.MAX_HEALTH).setMaxValue(witherMaxHealth()).setValue(witherMaxHealth())}; - return addEntity; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - if (this.age == 200) { - this.explode(); - this.setDataProperty(new IntEntityData(DATA_WITHER_INVULNERABLE_TICKS, 0)); - } - - return super.entityBaseTick(tickDiff); - } - - @Override - public int nearbyDistanceMultiplier() { - return 30; - } - - @Override - public void kill() { - if (!this.isAlive()) { - return; - } - - if (!this.exploded && this.lastDamageCause != null && EntityDamageEvent.DamageCause.SUICIDE != this.lastDamageCause.getCause()) { - this.exploded = true; - this.explode(); - } - - super.kill(); - } - - @Override - public boolean attack(EntityDamageEvent ev) { - if (this.age <= 200 && ev.getCause() != EntityDamageEvent.DamageCause.SUICIDE) { - return false; - } - - return super.attack(ev); - } - - private int witherMaxHealth() { - switch (this.getServer().getDifficulty()) { - case 2: - return 450; - case 3: - return 600; - default: - return 300; - } - } - - private void explode() { - EntityExplosionPrimeEvent ev = new EntityExplosionPrimeEvent(this, 7); - this.server.getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - Explosion explosion = new Explosion(this, (float) ev.getForce(), this); - - if (ev.isBlockBreaking() && this.level.getGameRules().getBoolean(GameRule.MOB_GRIEFING)) { - explosion.explodeA(); - } - - explosion.explodeB(); - } - } - - @Override - public boolean canTarget(Entity entity) { - return entity.canBeFollowed(); - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityWitherSkeleton.java b/src/main/java/cn/nukkit/entity/mob/EntityWitherSkeleton.java deleted file mode 100644 index fe8f4e43c..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityWitherSkeleton.java +++ /dev/null @@ -1,115 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSwordStone; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntityWitherSkeleton extends EntityWalkingMob implements EntitySmite { - - public static final int NETWORK_ID = 48; - - public EntityWitherSkeleton(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.fireProof = true; - this.setMaxHealth(20); - this.setDamage(new int[] { 0, 5, 8, 12 }); - } - - @Override - public float getWidth() { - return 0.7f; - } - - @Override - public float getHeight() { - return 2.4f; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && player.distanceSquared(this) <= 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - damage.put(EntityDamageEvent.DamageModifier.ARMOR, (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - if (player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage))) { - player.addEffect(Effect.getEffect(Effect.WITHER).setDuration(200)); - } - } - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getId(); - pk.item = new ItemSwordStone(); - pk.hotbarSlot = 0; - player.dataPacket(pk); - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.BONE, 0, 1)); - } - - if (Utils.rand(1, 3) == 1) { - drops.add(Item.get(Item.COAL, 0, 1)); - } - - if (Utils.rand(1, 40) == 1) { - drops.add(Item.get(Item.SKULL, 1, 1)); - } - - if (Utils.rand(1, 200) <= 17) { - drops.add(Item.get(Item.STONE_SWORD, Utils.rand(0, 131), 1)); - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 5; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Wither Skeleton"; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityWolf.java b/src/main/java/cn/nukkit/entity/mob/EntityWolf.java deleted file mode 100644 index 5ece0f119..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityWolf.java +++ /dev/null @@ -1,411 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.data.ByteEntityData; -import cn.nukkit.entity.passive.EntityFox; -import cn.nukkit.entity.passive.EntityRabbit; -import cn.nukkit.entity.passive.EntitySheep; -import cn.nukkit.entity.passive.EntityTurtle; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDye; -import cn.nukkit.item.ItemID; -import cn.nukkit.level.Sound; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.HeartParticle; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.utils.DyeColor; -import cn.nukkit.utils.Utils; - -import java.rmi.server.Skeleton; -import java.util.HashMap; - -public class EntityWolf extends EntityTameableMob { - - public static final int NETWORK_ID = 14; - - private static final String NBT_KEY_ANGRY = "Angry"; - - private static final String NBT_KEY_COLLAR_COLOR = "CollarColor"; - - private boolean angry; - - private int angryDuration; - - protected int inLoveTicks = 0; - - private DyeColor collarColor = DyeColor.RED; - - private int afterInWater = -1; - - private final Vector3 tempVector = new Vector3(); - - public EntityWolf(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 0.8f; - } - - @Override - public double getSpeed() { - return 1.2; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setFriendly(true); - - if (this.namedTag.contains(NBT_KEY_ANGRY)) { - if (this.namedTag.getByte(NBT_KEY_ANGRY) == 1) { - this.setAngry(true); - } - } - - if (this.namedTag.contains(NBT_KEY_COLLAR_COLOR)) { - this.collarColor = DyeColor.getByDyeData(this.namedTag.getByte(NBT_KEY_COLLAR_COLOR)); - if (this.collarColor == null) { - this.collarColor = DyeColor.RED; - } - } - - this.setMaxHealth(8); - this.setDamage(new int[] { 0, 3, 4, 6 }); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putBoolean(NBT_KEY_ANGRY, this.angry); - this.namedTag.putByte(NBT_KEY_COLLAR_COLOR, this.collarColor.getDyeData()); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (!creature.isAlive() || creature.closed || distance > 256) { - return false; - } - - if (this.isAngry() && this.isAngryTo == creature.getId()) { - return true; - } - - if (creature instanceof Player) { - if (distance <= 64 && this.isBeggingItem(((Player) creature).getInventory().getItemInHandFast())) { - // TODO: Begging - if (distance <= 9) { - stayTime = 40; - } - return true; - } else if (this.hasOwner() && creature.equals(this.getOwner())) { - if (distance <= 4) { - return false; - } else if (distance <= 100) { - return true; - } - } - } - - if (!this.hasOwner() && distance <= 256 && ( - (creature instanceof Skeleton && !creature.isInsideOfWater()) || - creature instanceof EntitySheep || - creature instanceof EntityRabbit || - creature instanceof EntityFox || - (creature instanceof EntityTurtle && ((EntityTurtle) creature).isBaby() && !creature.isInsideOfWater()) - )) { - this.isAngryTo = creature.getId(); - this.setAngry(true); - return true; - } else if (this.hasOwner() && distance <= 256 && creature instanceof Skeleton) { - this.isAngryTo = creature.getId(); - this.setAngry(true); - return true; - } - - return false; - } - - public boolean isAngry() { - return this.angry; - } - - public void setAngry(boolean angry) { - this.angry = angry; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ANGRY, angry); - this.angryDuration = angry ? 500 : 0; - this.setFriendly(!angry); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - int healable = this.getHealableItem(item); - - if (item.getId() == ItemID.BONE) { - if (!this.hasOwner() && !this.isAngry()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - if (Utils.rand(1, 3) == 3) { - EntityEventPacket packet = new EntityEventPacket(); - packet.eid = this.getId(); - packet.event = EntityEventPacket.TAME_SUCCESS; - player.dataPacket(packet); - - this.setMaxHealth(20); - this.setHealth(20); - this.setOwner(player); - this.setCollarColor(DyeColor.RED); - this.saveNBT(); - - this.getLevel().dropExpOrb(this, Utils.rand(1, 7)); - - return true; - } else { - EntityEventPacket packet = new EntityEventPacket(); - packet.eid = this.getId(); - packet.event = EntityEventPacket.TAME_FAIL; - player.dataPacket(packet); - } - } - } else if (item.getId() == Item.DYE) { - if (this.hasOwner() && player.equals(this.getOwner())) { - this.setCollarColor(((ItemDye) item).getDyeColor()); - return true; - } - } else if (this.isBreedingItem(item) || healable != 0) { - this.getLevel().addSound(this, Sound.RANDOM_EAT); - this.getLevel().addParticle(new ItemBreakParticle(this.add(0, this.getMountedYOffset(), 0), Item.get(item.getId(), 0, 1))); - this.setInLove(); - - if (healable != 0) { - this.setHealth(Math.max(this.getMaxHealth(), this.getHealth() + healable)); - } - - return true; - } else if (this.hasOwner() && player.equals(this.getOwner()) && !this.isAngry()) { - this.setSitting(!this.isSitting()); - } - - return super.onInteract(player, item, clickedPos); - } - - @Override - public boolean attack(EntityDamageEvent ev) { - if (super.attack(ev)) { - this.setSitting(false); - if (ev instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) ev).getDamager() instanceof Player) { - Player player = (Player) ((EntityDamageByEntityEvent) ev).getDamager(); - if (!(player.isSurvival() || player.isAdventure()) || (this.hasOwner() && player.equals(this.getOwner()))) { - return true; - } - } - this.isAngryTo = ((EntityDamageByEntityEvent) ev).getDamager().getId(); - this.setAngry(true); - } - return true; - } - - return false; - } - - @Override - public void attackEntity(Entity entity) { - if (entity instanceof Player && ( - (!this.isAngry() && this.isBeggingItem(((Player) entity).getInventory().getItemInHandFast())) || - (this.hasOwner() && entity.equals(this.getOwner())) - )) return; - - if (this.attackDelay > 23 && this.distanceSquared(entity) < 1.5) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (entity instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) entity).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - - this.setMotion(tempVector.setComponents(0, this.getGravity() * 6, 0)); // TODO: Jump before attack - - entity.attack(new EntityDamageByEntityEvent(this, entity, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - @Override - public boolean entityBaseTick(int tickDiff) { - boolean hasUpdate = super.entityBaseTick(tickDiff); - - if (this.angryDuration == 1) { - this.setAngry(false); - } else if (this.angryDuration > 0) { - this.angryDuration--; - } - - if (this.isInLove()) { - this.inLoveTicks -= tickDiff; - if (this.age % 20 == 0) { - for (int i = 0; i < 3; i++) { - this.getLevel().addParticle(new HeartParticle(this.add(Utils.rand(-1.0,1.0), this.getMountedYOffset() + Utils.rand(-1.0,1.0), Utils.rand(-1.0, 1.0)))); - } - } - } - - if (this.isInsideOfWater()) { - afterInWater = 0; - } else if (afterInWater != -1) { - afterInWater++; - } - - if (afterInWater > 60) { - afterInWater = -1; - - this.stayTime = 40; - - EntityEventPacket packet = new EntityEventPacket(); - packet.eid = this.getId(); - packet.event = EntityEventPacket.SHAKE_WET; - Server.broadcastPacket(this.getViewers().values(), packet); - } - - return hasUpdate; - } - - public void setInLove() { - this.inLoveTicks = 600; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_INLOVE); - } - - public boolean isInLove() { - return inLoveTicks > 0; - } - - @Override - protected void checkTarget() { - if (!this.isSitting() && this.hasOwner() && this.distanceSquared(this.getOwner()) > 144) { - this.setAngry(false); - // TODO: Safe teleport (on ground) - this.teleport(this.getOwner()); - this.move(0, 0.0001, 0); // To fix floating problem - return; - } - - super.checkTarget(); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : 3; - } - - public void setCollarColor(DyeColor color) { - this.namedTag.putByte(NBT_KEY_COLLAR_COLOR, color.getDyeData()); - this.setDataProperty(new ByteEntityData(DATA_COLOUR, color.getWoolData())); - this.collarColor = color; - } - - @Override - public boolean canDespawn() { - if (this.hasOwner(false)) return false; - return super.canDespawn(); - } - - public boolean isBeggingItem(Item item) { - return item.getId() == ItemID.BONE || - item.getId() == ItemID.RAW_CHICKEN || - item.getId() == ItemID.COOKED_CHICKEN || - item.getId() == ItemID.RAW_BEEF || - item.getId() == ItemID.COOKED_BEEF || - item.getId() == ItemID.RAW_MUTTON || - item.getId() == ItemID.COOKED_MUTTON || - item.getId() == ItemID.RAW_PORKCHOP || - item.getId() == ItemID.COOKED_PORKCHOP || - item.getId() == ItemID.RAW_RABBIT || - item.getId() == ItemID.COOKED_RABBIT || - item.getId() == ItemID.ROTTEN_FLESH; - } - - public boolean isBreedingItem(Item item) { - return item.getId() == ItemID.RAW_CHICKEN || - item.getId() == ItemID.COOKED_CHICKEN || - item.getId() == ItemID.RAW_BEEF || - item.getId() == ItemID.COOKED_BEEF || - item.getId() == ItemID.RAW_MUTTON || - item.getId() == ItemID.COOKED_MUTTON || - item.getId() == ItemID.RAW_PORKCHOP || - item.getId() == ItemID.COOKED_PORKCHOP || - item.getId() == ItemID.RAW_RABBIT || - item.getId() == ItemID.COOKED_RABBIT || - item.getId() == ItemID.ROTTEN_FLESH; - } - - public int getHealableItem(Item item) { - switch (item.getId()) { - case ItemID.RAW_PORKCHOP: - case ItemID.RAW_BEEF: - case ItemID.RAW_RABBIT: - return 3; - case ItemID.COOKED_PORKCHOP: - case ItemID.COOKED_BEEF: - return 8; - case ItemID.RAW_FISH: - case ItemID.RAW_SALMON: - case ItemID.RAW_CHICKEN: - case ItemID.RAW_MUTTON: - return 2; - case ItemID.CLOWNFISH: - case ItemID.PUFFERFISH: - return 1; - case ItemID.COOKED_FISH: - case ItemID.COOKED_RABBIT: - return 5; - case ItemID.COOKED_SALMON: - case ItemID.COOKED_CHICKEN: - case ItemID.COOKED_MUTTON: - return 6; - case ItemID.ROTTEN_FLESH: - return 4; - case ItemID.RABBIT_STEW: - return 10; - default: - return 0; - } - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Wolf"; - } - - @Override - public boolean canTarget(Entity entity) { - return entity.canBeFollowed(); - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZoglin.java b/src/main/java/cn/nukkit/entity/mob/EntityZoglin.java deleted file mode 100644 index b9022cfe7..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityZoglin.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; - -/** - * @author Erik Miller | EinBexiii - */ -public class EntityZoglin extends EntityWalkingMob implements EntitySmite { - - public final static int NETWORK_ID = 126; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityZoglin(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 1 : Utils.rand(1, 3); - } - - @Override - protected void initEntity() { - super.initEntity(); - this.setMaxHealth(40); - this.setDamage(new int[]{0, 2, 3, 4}); - } - - @Override - public float getWidth() { - return 0.9f; - } - - @Override - public float getHeight() { - return 0.9f; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 30 && player.distanceSquared(this) <= 1.5) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZombie.java b/src/main/java/cn/nukkit/entity/mob/EntityZombie.java deleted file mode 100644 index 92dc26d9b..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityZombie.java +++ /dev/null @@ -1,231 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemShovelIron; -import cn.nukkit.item.ItemSwordIron; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.network.protocol.MobArmorEquipmentPacket; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.utils.Utils; -import co.aikar.timings.Timings; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntityZombie extends EntityWalkingMob implements EntitySmite { - - public static final int NETWORK_ID = 32; - - public Item tool; - - public EntityZombie(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public double getSpeed() { - return 1.1; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setDamage(new int[] { 0, 2, 3, 4 }); - this.setMaxHealth(20); - - this.armor = getRandomArmor(); - - if (this.namedTag.contains("Item")) { - this.tool = NBTIO.getItemHelper(this.namedTag.getCompound("Item")); - if (tool instanceof ItemSwordIron) { - this.setDamage(new int[]{0, 4, 6, 8}); - } else if (tool instanceof ItemShovelIron) { - this.setDamage(new int[]{0, 3, 4, 5}); - } - } else { - this.setRandomTool(); - } - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && player.distanceSquared(this) <= 1) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.ARM_SWING; - Server.broadcastPacket(this.getViewers().values(), pk); - } - } - - @Override - public boolean entityBaseTick(int tickDiff) { - boolean hasUpdate; - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.startTiming(); - - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - hasUpdate = super.entityBaseTick(tickDiff); - - if (level.shouldMobBurn(this)) { - if (this.armor[0] == null) { - this.setOnFire(100); - } else if (this.armor[0].getId() == 0) { - this.setOnFire(100); - } - } - - if (Timings.entityBaseTickTimer != null) Timings.entityBaseTickTimer.stopTiming(); - return hasUpdate; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.ROTTEN_FLESH, 0, 1)); - } - - if (this.tool != null) { - if (tool instanceof ItemSwordIron && Utils.rand(1, 3) == 1) { - drops.add(tool); - } - - if (tool instanceof ItemShovelIron && Utils.rand(1, 3) != 1) { - drops.add(tool); - } - } - - if (Utils.rand(1, 3) == 1) { - switch (Utils.rand(1, 3)) { - case 1: - drops.add(Item.get(Item.IRON_INGOT, 0, Utils.rand(0, 1))); - break; - case 2: - drops.add(Item.get(Item.CARROT, 0, Utils.rand(0, 1))); - break; - case 3: - drops.add(Item.get(Item.POTATO, 0, Utils.rand(0, 1))); - break; - } - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 12 : 5; - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - if (this.armor[0].getId() != 0 || this.armor[1].getId() != 0 || this.armor[2].getId() != 0 || this.armor[3].getId() != 0) { - MobArmorEquipmentPacket pk = new MobArmorEquipmentPacket(); - pk.eid = this.getId(); - pk.slots = this.armor; - - player.dataPacket(pk); - } - - if (this.tool != null) { - MobEquipmentPacket pk2 = new MobEquipmentPacket(); - pk2.eid = this.getId(); - pk2.hotbarSlot = 0; - pk2.item = this.tool; - player.dataPacket(pk2); - } - } - - private void setRandomTool() { - if (Utils.rand(1, 10) == 5) { - if (Utils.rand(1, 3) == 1) { - this.tool = Item.get(Item.IRON_SWORD, Utils.rand(200, 246), 1); - this.setDamage(new int[]{0, 4, 6, 8}); - } else { - this.tool = Item.get(Item.IRON_SHOVEL, Utils.rand(200, 246), 1); - this.setDamage(new int[]{0, 3, 4, 5}); - } - } - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (!ev.isCancelled() && ev.getCause() == EntityDamageEvent.DamageCause.DROWNING && !(this instanceof EntityZombieVillager)) { - CreatureSpawnEvent cse = new CreatureSpawnEvent(EntityDrowned.NETWORK_ID, this, CreatureSpawnEvent.SpawnReason.DROWNED); - level.getServer().getPluginManager().callEvent(cse); - - if (!cse.isCancelled()) { - Entity ent = Entity.createEntity("Drowned", this); - if (ent != null) { - ent.setHealth(this.getHealth()); - this.close(); - ent.spawnToAll(); - } - } - } - - return true; - } - - @Override - public void saveNBT() { - super.saveNBT(); - - if (tool != null) { - this.namedTag.put("Item", NBTIO.putItemHelper(tool)); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZombiePigman.java b/src/main/java/cn/nukkit/entity/mob/EntityZombiePigman.java deleted file mode 100644 index 4a6de98e7..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityZombiePigman.java +++ /dev/null @@ -1,170 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemSwordGold; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntityZombiePigman extends EntityWalkingMob implements EntitySmite { - - public static final int NETWORK_ID = 36; - - private int angry = 0; - - public EntityZombiePigman(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public double getSpeed() { - return 1.15; - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag.contains("Angry")) { - this.angry = this.namedTag.getInt("Angry"); - } - - this.fireProof = true; - this.setMaxHealth(20); - this.setDamage(new int[] { 0, 5, 9, 13 }); - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putInt("Angry", this.angry); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (distance <= 100 && this.isAngry() && creature instanceof EntityZombiePigman && !((EntityZombiePigman) creature).isAngry()) { - ((EntityZombiePigman) creature).setAngry(2400); - } - return this.isAngry() && super.targetOption(creature, distance); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1.44) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - public boolean isAngry() { - return this.angry > 0; - } - - public void setAngry(int val) { - this.angry = val; - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (!ev.isCancelled() && ev instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) ev).getDamager() instanceof Player) { - this.setAngry(2400); - } - } - - return true; - } - - @Override - public void spawnTo(Player player) { - super.spawnTo(player); - - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getId(); - pk.item = new ItemSwordGold(); - pk.inventorySlot = 0; - player.dataPacket(pk); - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - drops.add(Item.get(Item.ROTTEN_FLESH, 0, Utils.rand(0, 1))); - drops.add(Item.get(Item.GOLD_NUGGET, 0, Utils.rand(0, 1))); - - for (int i = 0; i < (Utils.rand(0, 101) <= 9 ? 1 : 0); i++) { - drops.add(Item.get(Item.GOLD_SWORD, Utils.rand(20, 30), 1)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : 5; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Zombie Pigman"; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (getServer().getDifficulty() == 0) { - this.close(); - return true; - } - - if (this.angry > 0) { - this.angry--; - } - - return super.entityBaseTick(tickDiff); - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZombieVillager.java b/src/main/java/cn/nukkit/entity/mob/EntityZombieVillager.java deleted file mode 100644 index 3cf825beb..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityZombieVillager.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityZombieVillager extends EntityZombie { - - public static final int NETWORK_ID = 44; - - public EntityZombieVillager(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Zombie Villager"; - } -} diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZombieVillagerV2.java b/src/main/java/cn/nukkit/entity/mob/EntityZombieVillagerV2.java deleted file mode 100644 index 6826a6913..000000000 --- a/src/main/java/cn/nukkit/entity/mob/EntityZombieVillagerV2.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.entity.mob; - -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityZombieVillagerV2 extends EntityZombieVillager implements EntitySmite { - - public static final int NETWORK_ID = 116; - - public EntityZombieVillagerV2(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityAnimal.java b/src/main/java/cn/nukkit/entity/passive/EntityAnimal.java deleted file mode 100644 index 1be98d238..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityAnimal.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.nukkit.entity.passive; - -public interface EntityAnimal { -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityAxolotl.java b/src/main/java/cn/nukkit/entity/passive/EntityAxolotl.java deleted file mode 100644 index b12557fba..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityAxolotl.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityAxolotl extends EntityFish { - - public static final int NETWORK_ID = 130; - - public EntityAxolotl(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(14); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 1.3f; - } - - @Override - public float getHeight() { - return 0.6f; - } - - @Override - int getBucketMeta() { - return 12; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityBat.java b/src/main/java/cn/nukkit/entity/passive/EntityBat.java deleted file mode 100644 index 1552eda2b..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityBat.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityBat extends EntityFlyingAnimal { - - public static final int NETWORK_ID = 19; - - public EntityBat(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.5f; - } - - @Override - public float getHeight() { - return 0.9f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(6); - } - - @Override - public int getKillExperience() { - return 0; - } - - @Override - public boolean doesTriggerPressurePlate() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityBee.java b/src/main/java/cn/nukkit/entity/passive/EntityBee.java deleted file mode 100644 index ac823fd1b..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityBee.java +++ /dev/null @@ -1,122 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.mob.EntityFlyingMob; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; - -public class EntityBee extends EntityFlyingMob { // A mob because it needs to have an attack behavior - - public static final int NETWORK_ID = 122; - - private boolean angry; - - public EntityBee(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getKillExperience() { - return Utils.rand(1, 3); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.275f; - } - return 0.55f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.25f; - } - return 0.5f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - this.setDamage(new int[]{0, 2, 2, 3}); - } - - @Override - public boolean doesTriggerPressurePlate() { - return false; - } - - @Override - public double getSpeed() { - return 1.2; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1.3) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor( - damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - if (player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage))) { - if (this.getServer().getDifficulty() == 2) { - player.addEffect(Effect.getEffect(Effect.POISON).setDuration(200)); - } else if (this.getServer().getDifficulty() == 3) { - player.addEffect(Effect.getEffect(Effect.POISON).setDuration(360)); - } - } - } - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - return this.isAngry() && super.targetOption(creature, distance); - } - - @Override - public boolean attack(EntityDamageEvent ev) { - if (super.attack(ev)) { - if (ev instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) ev).getDamager() instanceof Player) { - this.setAngry(true); - } - return true; - } - - return false; - } - - public boolean isAngry() { - return this.angry; - } - - public void setAngry(boolean angry) { - this.angry = angry; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_ANGRY, angry); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityCat.java b/src/main/java/cn/nukkit/entity/passive/EntityCat.java deleted file mode 100644 index 0c86541be..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityCat.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntityCat extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 75; - - public EntityCat(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.3f; - } - return 0.6f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.35f; - } - return 0.7f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.STRING, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - int id = player.getInventory().getItemInHandFast().getId(); - return player.spawned && player.isAlive() && !player.closed && (id == Item.RAW_FISH || id == Item.RAW_SALMON) && distance <= 40; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityChicken.java b/src/main/java/cn/nukkit/entity/passive/EntityChicken.java deleted file mode 100644 index e70e69453..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityChicken.java +++ /dev/null @@ -1,186 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntityChicken extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 10; - - private int eggLayTime = getRandomEggLayTime(); - private boolean isChickenJockey = false; - - public EntityChicken(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.2f; - } - return 0.4f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.35f; - } - return 0.7f; - } - - @Override - public float getDrag() { - return 0.2f; - } - - @Override - public float getGravity() { - return 0.08f; //Should be lower but that breaks jumping - } - - @Override - public void initEntity() { - super.initEntity(); - - if (this.namedTag.contains("EggLayTime")) { - this.eggLayTime = this.namedTag.getInt("EggLayTime"); - } else { - this.eggLayTime = getRandomEggLayTime(); - } - if (this.namedTag.contains("IsChickenJockey")) { - this.isChickenJockey = this.namedTag.getBoolean("IsChickenJockey"); - } else { - this.isChickenJockey = false; - } - - this.setMaxHealth(4); - } - - @Override - public boolean entityBaseTick(int tickDiff) { - boolean hasUpdate = super.entityBaseTick(tickDiff); - - if (this.getServer().mobsFromBlocks && !this.isBaby()) { - if (this.eggLayTime > 0) { - eggLayTime -= tickDiff; - } else { - this.level.dropItem(this, Item.get(Item.EGG, 0, 1)); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_PLOP); - this.eggLayTime = getRandomEggLayTime(); - } - } - - return hasUpdate; - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - int id = player.getInventory().getItemInHandFast().getId(); - return player.isAlive() && !player.closed - && (id == Item.SEEDS - || id == Item.BEETROOT_SEEDS - || id == Item.MELON_SEEDS - || id == Item.PUMPKIN_SEEDS) - && distance <= 40; - } - return false; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.SEEDS && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addParticle(new ItemBreakParticle( - this.add(Utils.rand(-0.5, 0.5), this.getMountedYOffset(), Utils.rand(-0.5, 0.5)), - Item.get(Item.SEEDS))); - this.setInLove(); - } else if (item.getId() == Item.BEETROOT_SEEDS && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addParticle(new ItemBreakParticle( - this.add(Utils.rand(-0.5, 0.5), this.getMountedYOffset(), Utils.rand(-0.5, 0.5)), - Item.get(Item.BEETROOT_SEEDS))); - this.setInLove(); - } else if (item.getId() == Item.MELON_SEEDS && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addParticle(new ItemBreakParticle( - this.add(Utils.rand(-0.5, 0.5), this.getMountedYOffset(), Utils.rand(-0.5, 0.5)), - Item.get(Item.MELON_SEEDS))); - this.setInLove(); - } else if (item.getId() == Item.PUMPKIN_SEEDS && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addParticle(new ItemBreakParticle( - this.add(Utils.rand(-0.5, 0.5), this.getMountedYOffset(), Utils.rand(-0.5, 0.5)), - Item.get(Item.PUMPKIN_SEEDS))); - this.setInLove(); - } - return super.onInteract(player, item, clickedPos); - } - - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putInt("EggLayTime", this.eggLayTime); - this.namedTag.putBoolean("IsChickenJockey", this.isChickenJockey); - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.FEATHER, 0, 1)); - } - - drops.add(Item.get(this.isOnFire() ? Item.COOKED_CHICKEN : Item.RAW_CHICKEN, 0, 1)); - } - - return drops.toArray(new Item[0]); - } - - @Override - public boolean attack(EntityDamageEvent ev) { - if (ev.getCause() != EntityDamageEvent.DamageCause.FALL) { - return super.attack(ev); - } - - return false; - } - - private static int getRandomEggLayTime() { - return Utils.rand(6000, 12000); - } - - public boolean isChickenJockey() { - return isChickenJockey; - } - - public void setChickenJockey(boolean chickenJockey) { - isChickenJockey = chickenJockey; - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityCod.java b/src/main/java/cn/nukkit/entity/passive/EntityCod.java deleted file mode 100644 index bb17604d2..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityCod.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -public class EntityCod extends EntityFish { - - public static final int NETWORK_ID = 112; - - public EntityCod(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - int getBucketMeta() { - return 2; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.5f; - } - - @Override - public float getHeight() { - return 0.2f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(3); - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.RAW_FISH, 0, 1), Item.get(Item.BONE, 0, Utils.rand(0, 2))}; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityCow.java b/src/main/java/cn/nukkit/entity/passive/EntityCow.java deleted file mode 100644 index 5452fe507..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityCow.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntityCow extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 11; - - public EntityCow(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.45f; - } - return 0.9f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.7f; - } - return 1.4f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.BUCKET && !this.isBaby()) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - Item newBucket = Item.get(Item.BUCKET, 1, 1); - if (player.getInventory().getItemFast(player.getInventory().getHeldItemIndex()).count > 0) { - if (player.getInventory().canAddItem(newBucket)) { - player.getInventory().addItem(newBucket); - } else { - player.dropItem(newBucket); - } - } else { - player.getInventory().setItemInHand(newBucket); - } - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_MILK); - return false; - } else if (item.getId() == Item.WHEAT && !this.isBaby()) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - this.level.addParticle(new ItemBreakParticle(this.add(0, this.getMountedYOffset(), 0), Item.get(Item.WHEAT))); - this.setInLove(); - return false; - } - - return super.onInteract(player, item, clickedPos); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return player.isAlive() && !player.closed && player.getInventory().getItemInHandFast().getId() == Item.WHEAT && distance <= 40; - } - - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.LEATHER, 0, 1)); - } - - for (int i = 0; i < Utils.rand(1, 3); i++) { - drops.add(Item.get(this.isOnFire() ? Item.STEAK : Item.RAW_BEEF, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityDolphin.java b/src/main/java/cn/nukkit/entity/passive/EntityDolphin.java deleted file mode 100644 index 27fcd091c..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityDolphin.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -public class EntityDolphin extends EntityWaterAnimal { - - public static final int NETWORK_ID = 31; - - public EntityDolphin(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.9f; - } - - @Override - public float getHeight() { - return 0.6f; - } - - @Override - public double getSpeed() { - return 1.2; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.RAW_FISH, 0, Utils.rand(0, 1))}; - } - - @Override - public int getKillExperience() { - return 0; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.RAW_FISH && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_EAT); - this.level.addParticle(new ItemBreakParticle(this.add(0, this.getMountedYOffset(), 0), Item.get(Item.RAW_FISH))); - this.setInLove(); - return true; - } - return super.onInteract(player, item, clickedPos); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - int id = player.getInventory().getItemInHandFast().getId(); - return player.spawned && player.isAlive() && !player.closed && (id == Item.RAW_FISH || id == Item.RAW_SALMON) && distance <= 40; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityDonkey.java b/src/main/java/cn/nukkit/entity/passive/EntityDonkey.java deleted file mode 100644 index c1028da42..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityDonkey.java +++ /dev/null @@ -1,111 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntityDonkey extends EntityHorseBase { - - public static final int NETWORK_ID = 24; - - private boolean chested; - - public EntityDonkey(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.6982f; - } - return 1.3965f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.8f; - } - return 1.6f; - } - - @Override - public void initEntity() { - super.initEntity(); - this.setMaxHealth(15); - - if (this.namedTag.contains("ChestedHorse")) { - this.setChested(this.namedTag.getBoolean("ChestedHorse")); - } - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - boolean canTarget = super.targetOption(creature, distance); - - if (canTarget && (creature instanceof Player)) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && - this.isFeedItem(player.getInventory().getItemInHandFast()) && distance <= 40; - } - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.LEATHER, 0, 1)); - } - - if (this.isChested()) { - drops.add(Item.get(Item.CHEST, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (!this.isBaby() && !this.isChested() && item.getId() == Item.CHEST) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - this.setChested(true); - return false; - } - - return super.onInteract(player, item, clickedPos); - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putBoolean("ChestedHorse", this.isChested()); - } - - public boolean isChested() { - return this.chested; - } - - public void setChested(boolean chested) { - this.chested = chested; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_CHESTED, chested); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityFish.java b/src/main/java/cn/nukkit/entity/passive/EntityFish.java deleted file mode 100644 index 7d933ffe4..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityFish.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -/** - * Created by PetteriM1 - */ -public abstract class EntityFish extends EntityWaterAnimal { - - public EntityFish(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getKillExperience() { - return Utils.rand(1, 3); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.BUCKET && (item.getDamage() == 0 || item.getDamage() == 8) && this.isInsideOfWater()) { - this.close(); - if (item.getCount() <= 1) { - player.getInventory().setItemInHand(Item.get(Item.BUCKET, this.getBucketMeta(), 1)); - return false; - } else { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - player.getInventory().addItem(Item.get(Item.BUCKET, this.getBucketMeta(), 1)); - return true; - } - } - return super.onInteract(player, item, clickedPos); - } - - abstract int getBucketMeta(); -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityFlyingAnimal.java b/src/main/java/cn/nukkit/entity/passive/EntityFlyingAnimal.java deleted file mode 100644 index b91877f52..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityFlyingAnimal.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.entity.EntityFlying; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityFlyingAnimal extends EntityFlying implements EntityAnimal { - - public EntityFlyingAnimal(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public boolean onUpdate(int currentTick) { - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - - return true; - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - Vector3 target = this.updateMove(tickDiff); - - /*if (target instanceof Player) { - if (this.distanceSquared(target) <= 2) { - //this.pitch = 22; - this.x = this.lastX; - this.y = this.lastY; - this.z = this.lastZ; - } - } else if (target != null && this.distanceSquared(target) <= 1) { - this.moveTime = 0; - }*/ - - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityFox.java b/src/main/java/cn/nukkit/entity/passive/EntityFox.java deleted file mode 100644 index 2f75b46fb..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityFox.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -public class EntityFox extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 121; - - public EntityFox(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.7f; - } - - @Override - public float getHeight() { - return 0.6f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 2); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.SWEET_BERRIES && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_EAT); - this.level.addParticle(new ItemBreakParticle(this.add(0, this.getMountedYOffset(), 0), Item.get(Item.SWEET_BERRIES))); - this.setInLove(); - return true; - } - return super.onInteract(player, item, clickedPos); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && distance <= 49 && player.getInventory().getItemInHandFast().getId() == Item.SWEET_BERRIES; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityGlowSquid.java b/src/main/java/cn/nukkit/entity/passive/EntityGlowSquid.java deleted file mode 100644 index ed7e6621e..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityGlowSquid.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityGlowSquid extends EntitySquid { - - public static final int NETWORK_ID = 129; - - public EntityGlowSquid(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityGoat.java b/src/main/java/cn/nukkit/entity/passive/EntityGoat.java deleted file mode 100644 index a86dee34d..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityGoat.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -public class EntityGoat extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 128; - - public EntityGoat(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.65f; - } - return 1.3f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.45f; - } - return 0.9f; - } - - @Override - public int getKillExperience() { - return Utils.rand(1, 3); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public double getSpeed() { - return 1.1; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityHorse.java b/src/main/java/cn/nukkit/entity/passive/EntityHorse.java deleted file mode 100644 index 69cd15ebf..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityHorse.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntityHorse extends EntityHorseBase { - - public static final int NETWORK_ID = 23; - - public int variant; - - private static final int[] VARIANTS = {0, 1, 2, 3, 4, 5, 6, 256, 257, 258, 259, 260, 261, 262, 512, 513, 514, 515, 516, 517, 518, - 768, 769, 770, 771, 772, 773, 774, 1024, 1025, 1026, 1027, 1028, 1029, 1030}; - - public EntityHorse(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.6982f; - } - return 1.3965f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.8f; - } - return 1.6f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(Utils.rand(15, 30)); - - if (this.namedTag.contains("Variant")) { - this.variant = this.namedTag.getInt("Variant"); - } else { - this.variant = getRandomVariant(); - } - - this.setDataProperty(new IntEntityData(DATA_VARIANT, this.variant)); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putInt("Variant", this.variant); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - boolean canTarget = super.targetOption(creature, distance); - - if (canTarget && (creature instanceof Player)) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && - this.isFeedItem(player.getInventory().getItemInHandFast()) && distance <= 40; - } - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.LEATHER, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - private static int getRandomVariant() { - return VARIANTS[Utils.rand(0, VARIANTS.length - 1)]; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityHorseBase.java b/src/main/java/cn/nukkit/entity/passive/EntityHorseBase.java deleted file mode 100644 index de3842e6f..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityHorseBase.java +++ /dev/null @@ -1,207 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityControllable; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntityRideable; -import cn.nukkit.entity.data.Vector3fEntityData; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.math.Vector3f; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Objects; - -import static cn.nukkit.network.protocol.SetEntityLinkPacket.TYPE_RIDE; - -/** - * @author PetteriM1 - */ -public class EntityHorseBase extends EntityWalkingAnimal implements EntityRideable, EntityControllable { - - private boolean saddled; - - public EntityHorseBase(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return -1; - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag.contains("Saddle")) { - this.setSaddled(this.namedTag.getBoolean("Saddle")); - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putBoolean("Saddle", this.isSaddled()); - } - - @Override - public boolean mountEntity(Entity entity) { - Objects.requireNonNull(entity, "The target of the mounting entity can't be null"); - - if (entity.riding != null) { - this.dismountEntity(entity); - this.motionX = 0; - this.motionZ = 0; - this.stayTime = 20; - } else { - if (this.isPassenger(entity)) { - return false; - } - - this.broadcastLinkPacket(entity, TYPE_RIDE); - - entity.riding = this; - entity.setDataFlag(DATA_FLAGS, DATA_FLAG_RIDING, true); - entity.setDataProperty(new Vector3fEntityData(DATA_RIDER_SEAT_POSITION, new Vector3f(0, this instanceof EntityDonkey ? 2.1f : 2.3f, 0))); - this.passengers.add(entity); - } - - return true; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (this.isFeedItem(item)) { - this.level.addParticle(new ItemBreakParticle(this.add(0,this.getMountedYOffset(), 0), Item.get(item.getId(), 0, 1))); - this.setInLove(); - return true; - } else if (this.canBeSaddled() && !this.isSaddled() && item.getId() == Item.SADDLE) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_SADDLE); - this.setSaddled(true); - } else if (this.passengers.isEmpty() && !this.isBaby() && !player.isSneaking() && (!this.canBeSaddled() || this.isSaddled())) { - if (player.riding == null) { - this.mountEntity(player); - } - } - - return super.onInteract(player, item, clickedPos); - } - - public boolean canBeSaddled() { - return !this.isBaby(); - } - - public boolean isSaddled() { - return this.saddled; - } - - public void setSaddled(boolean saddled) { - if (this.canBeSaddled()) { - this.saddled = true; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SADDLED, saddled); - } - } - - public boolean isFeedItem(Item item) { - return item.getId() == Item.WHEAT || - item.getId() == Item.APPLE || - item.getId() == Item.HAY_BALE || - item.getId() == Item.GOLDEN_APPLE || - item.getId() == Item.SUGAR || - item.getId() == Item.BREAD || - item.getId() == Item.GOLDEN_CARROT; - } - - @Override - public boolean onUpdate(int currentTick) { - Iterator linkedIterator = this.passengers.iterator(); - - while (linkedIterator.hasNext()) { - cn.nukkit.entity.Entity linked = linkedIterator.next(); - - if (!linked.isAlive()) { - if (linked.riding == this) { - linked.riding = null; - } - - linkedIterator.remove(); - } - } - - return super.onUpdate(currentTick); - } - - @Override - public void onPlayerInput(Player player, double strafe, double forward) { - this.stayTime = 0; - this.moveTime = 10; - this.yaw = player.yaw; - - strafe *= 0.4; - - double f = strafe * strafe + forward * forward; - double friction = 0.6; - - if (f >= 1.0E-4) { - f = Math.sqrt(f); - - if (f < 1) { - f = 1; - } - - f = friction / f; - strafe = strafe * f; - forward = forward * f; - double f1 = Math.sin(this.yaw * 0.017453292); - double f2 = Math.cos(this.yaw * 0.017453292); - this.motionX = (strafe * f2 - forward * f1); - this.motionZ = (forward * f2 + strafe * f1); - } else { - this.motionX = 0; - this.motionZ = 0; - } - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - return this.passengers.isEmpty(); - } - - @Override - public boolean canDespawn() { - if (this.isSaddled()) { - return false; - } - - return super.canDespawn(); - } - - @Override - public void updatePassengers() { - if (this.passengers.isEmpty()) { - return; - } - - for (Entity passenger : new ArrayList<>(this.passengers)) { - if (!passenger.isAlive() || (this.getNetworkId() != EntitySkeletonHorse.NETWORK_ID && this.isInsideOfWater())) { - this.dismountEntity(passenger); - continue; - } - this.updatePassengerPosition(passenger); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityIronGolem.java b/src/main/java/cn/nukkit/entity/passive/EntityIronGolem.java deleted file mode 100644 index 22cbba5eb..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityIronGolem.java +++ /dev/null @@ -1,136 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.mob.EntityWalkingMob; -import cn.nukkit.entity.mob.EntityWolf; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntityIronGolem extends EntityWalkingMob { - - public static final int NETWORK_ID = 20; - - public EntityIronGolem(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - this.setFriendly(true); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 1.4f; - } - - @Override - public float getHeight() { - return 2.9f; - } - - @Override - public double getSpeed() { - return 0.7; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(100); - this.setDamage(new int[] { 0, 11, 21, 31 }); - this.setMinDamage(new int[] { 0, 4, 7, 11 }); - } - - public void attackEntity(Entity player) { - if (this.attackDelay > 40 && this.distanceSquared(player) < 4) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.ARM_SWING; - Server.broadcastPacket(this.getViewers().values(), pk); - } - } - - public boolean targetOption(EntityCreature creature, double distance) { - return (!(creature instanceof Player) || creature.getId() == this.isAngryTo) && !(creature instanceof EntityWolf) && creature.isAlive() && distance <= 100; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - for (int i = 0; i < Utils.rand(3, 5); i++) { - drops.add(Item.get(Item.IRON_INGOT, 0, 1)); - } - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.POPPY, 0, 1)); - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return 0; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Iron Golem"; - } - - @Override - public boolean canDespawn() { - return false; - } - - @Override - public boolean attack(EntityDamageEvent ev) { - if (super.attack(ev)) { - if (ev instanceof EntityDamageByEntityEvent) { - Entity damager = ((EntityDamageByEntityEvent) ev).getDamager(); - if (!damager.isPlayer || ((Player) damager).isSurvival() || ((Player) damager).isAdventure()) { - this.isAngryTo = damager.getId(); - } - } - return true; - } - - return false; - } - - @Override - public boolean canTarget(Entity entity) { - return entity.canBeFollowed() && entity.getId() == this.isAngryTo; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityJumpingAnimal.java b/src/main/java/cn/nukkit/entity/passive/EntityJumpingAnimal.java deleted file mode 100644 index edf162aee..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityJumpingAnimal.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.entity.EntityJumping; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityJumpingAnimal extends EntityJumping implements EntityAnimal { - - public EntityJumpingAnimal(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public boolean onUpdate(int currentTick) { - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - return true; - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - Vector3 target = this.updateMove(tickDiff); - /*if (target instanceof Player) { - if (this.distanceSquared(target) <= 2) { - //this.pitch = 22; - this.x = this.lastX; - this.y = this.lastY; - this.z = this.lastZ; - } - } else if (target != null && this.distanceSquared(target) <= 1) { - this.moveTime = 0; - }*/ - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityLlama.java b/src/main/java/cn/nukkit/entity/passive/EntityLlama.java deleted file mode 100644 index 5b377fcbe..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityLlama.java +++ /dev/null @@ -1,159 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.entity.projectile.EntityLlamaSpit; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -import java.util.concurrent.atomic.AtomicBoolean; - -public class EntityLlama extends EntityHorseBase { - - public static final int NETWORK_ID = 29; - - public int variant; - - private static final int[] VARIANTS = {0, 1, 2, 3}; - - private final AtomicBoolean delay = new AtomicBoolean(); - - public EntityLlama(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.45f; - } - return 0.9f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.935f; - } - return 1.87f; - } - - @Override - public boolean canBeSaddled() { - return false; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(15); - - if (this.namedTag.contains("Variant")) { - this.variant = this.namedTag.getInt("Variant"); - } else { - this.variant = getRandomVariant(); - } - - this.setDataProperty(new IntEntityData(DATA_VARIANT, this.variant)); - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putInt("Variant", this.variant); - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (ev instanceof EntityDamageByEntityEvent) { - Entity damager = ((EntityDamageByEntityEvent) ev).getDamager(); - if (damager instanceof Player) { - if (this.delay.get()) return true; - this.delay.set(true); - this.server.getScheduler().scheduleDelayedTask(() -> this.delay.compareAndSet(true, false), 40); - - this.getServer().getScheduler().scheduleDelayedTask(null, () -> { - if (this.isAlive()) { - if (this.distanceSquared(damager) < 100) { - this.moveTime = 0; - this.stayTime = 100; - - double f = 2; - double yaw = this.yaw; - double pitch = this.pitch; - Location pos = new Location(this.x - Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, this.y + this.getEyeHeight(), - this.z + Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5, yaw, pitch, this.level); - Entity k = Entity.createEntity("LlamaSpit", pos, this); - if (!(k instanceof EntityLlamaSpit)) return; - - EntityLlamaSpit spit = (EntityLlamaSpit) k; - spit.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, - Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f)); - - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(spit); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - spit.close(); - } else { - spit.spawnToAll(); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_SHOOT, -1, "minecraft:llama", false, false); - } - } - } - }, 30); - } - } - - return true; - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.LEATHER, 0, Utils.rand(0, 2))}; - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - boolean canTarget = super.targetOption(creature, distance); - - if (canTarget && (creature instanceof Player)) { - Player player = (Player) creature; - return player.isAlive() && !player.closed && this.isFeedItem(player.getInventory().getItemInHandFast()) && distance <= 40; - } - - return false; - } - - @Override - public boolean isFeedItem(Item item) { - return item.getId() == Item.WHEAT; - } - - @Override - public void onPlayerInput(Player player, double strafe, double forward) { - // can't be controlled - } - - private static int getRandomVariant() { - return VARIANTS[Utils.rand(0, VARIANTS.length - 1)]; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityMooshroom.java b/src/main/java/cn/nukkit/entity/passive/EntityMooshroom.java deleted file mode 100644 index c3b1d4679..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityMooshroom.java +++ /dev/null @@ -1,145 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.item.Item; -import cn.nukkit.level.Sound; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntityMooshroom extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 16; - - public EntityMooshroom(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.45f; - } - return 0.9f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.7f; - } - return 1.4f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - - if (this.namedTag.contains("Variant")) { - this.setBrown(this.namedTag.getInt("Variant") == 1); - } - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && player.getInventory().getItemInHandFast().getId() == Item.WHEAT && distance <= 40; - } - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.LEATHER, 0, 1)); - } - - for (int i = 0; i < Utils.rand(1, 3); i++) { - drops.add(Item.get(this.isOnFire() ? Item.STEAK : Item.RAW_BEEF, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.BOWL) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - player.getInventory().addItem(Item.get(Item.MUSHROOM_STEW, 0, 1)); - this.level.addSoundToViewers(this, Sound.MOB_MOOSHROOM_SUSPICIOUS_MILK); - return false; - } else if (item.getId() == Item.BUCKET) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - Item newBucket = Item.get(Item.BUCKET, 1, 1); - if (player.getInventory().getItemFast(player.getInventory().getHeldItemIndex()).count > 0) { - if (player.getInventory().canAddItem(newBucket)) { - player.getInventory().addItem(newBucket); - } else { - player.dropItem(newBucket); - } - } else { - player.getInventory().setItemInHand(newBucket); - } - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_MILK); - return false; - } else if (item.getId() == Item.WHEAT && !this.isBaby()) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - this.level.addParticle(new ItemBreakParticle(this.add(0, this.getMountedYOffset(), 0), Item.get(Item.WHEAT))); - this.setInLove(); - return false; - } - return super.onInteract(player, item, clickedPos); - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putInt("Variant", this.isBrown() ? 1 : 0); - } - - @Override - public void onStruckByLightning(Entity entity) { - this.setBrown(!this.isBrown()); - super.onStruckByLightning(entity); - } - - public boolean isBrown() { - return this.getDataPropertyInt(DATA_VARIANT) == 1; - } - - public void setBrown(boolean brown) { - this.setDataProperty(new IntEntityData(DATA_VARIANT, brown ? 1 : 0)); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityMule.java b/src/main/java/cn/nukkit/entity/passive/EntityMule.java deleted file mode 100644 index 63a0dbfa9..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityMule.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.utils.Utils; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.ArrayList; -import java.util.List; - -public class EntityMule extends EntityHorseBase { - - public static final int NETWORK_ID = 25; - - public EntityMule(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.6982f; - } - return 1.3965f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.8f; - } - return 1.6f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(15); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - boolean canTarget = super.targetOption(creature, distance); - - if (canTarget && (creature instanceof Player)) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && - this.isFeedItem(player.getInventory().getItemInHandFast()) && distance <= 40; - } - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.LEATHER, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityNPC.java b/src/main/java/cn/nukkit/entity/passive/EntityNPC.java deleted file mode 100644 index 93c6033d7..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityNPC.java +++ /dev/null @@ -1,7 +0,0 @@ -package cn.nukkit.entity.passive; - -/** - * Created by Pub4Game on 21.06.2016. - */ -public interface EntityNPC { -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityOcelot.java b/src/main/java/cn/nukkit/entity/passive/EntityOcelot.java deleted file mode 100644 index c2591114f..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityOcelot.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.utils.Utils; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityOcelot extends EntityTameableAnimal { - - public static final int NETWORK_ID = 22; - - public EntityOcelot(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.3f; - } - return 0.6f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.35f; - } - return 0.7f; - } - - @Override - public double getSpeed() { - return 1.4; - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - int id = player.getInventory().getItemInHandFast().getId(); - return player.spawned && player.isAlive() && !player.closed && (id == Item.RAW_FISH || id == Item.RAW_SALMON) && distance <= 40; - } - return false; - } - - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityPanda.java b/src/main/java/cn/nukkit/entity/passive/EntityPanda.java deleted file mode 100644 index 0a13936f8..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityPanda.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.utils.Utils; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityPanda extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 113; - - public EntityPanda(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getLength() { - return 1.825f; - } - - @Override - public float getWidth() { - return 1.125f; - } - - @Override - public float getHeight() { - return 1.25f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityParrot.java b/src/main/java/cn/nukkit/entity/passive/EntityParrot.java deleted file mode 100644 index 131d993a1..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityParrot.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.data.IntEntityData; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -public class EntityParrot extends EntityFlyingAnimal { - - public static final int NETWORK_ID = 30; - - public int variant; - - private static final int[] VARIANTS = {0, 1, 2, 3, 4}; - - public EntityParrot(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.5f; - } - - @Override - public float getHeight() { - return 0.9f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(6); - - if (this.namedTag.contains("Variant")) { - this.variant = this.namedTag.getInt("Variant"); - } else { - this.variant = getRandomVariant(); - } - - this.setDataProperty(new IntEntityData(DATA_VARIANT, this.variant)); - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putInt("Variant", this.variant); - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.FEATHER, 0, Utils.rand(1, 2))}; - } - - @Override - public int getKillExperience() { - return Utils.rand(1, 3); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - int id = player.getInventory().getItemInHandFast().getId(); - return player.spawned && player.isAlive() && !player.closed - && (id == Item.SEEDS - || id == Item.BEETROOT_SEEDS - || id == Item.PUMPKIN_SEEDS - || id == Item.MELON_SEEDS) - && distance <= 40; - } - return false; - } - - private static int getRandomVariant() { - return VARIANTS[Utils.rand(0, VARIANTS.length - 1)]; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityPig.java b/src/main/java/cn/nukkit/entity/passive/EntityPig.java deleted file mode 100644 index 727526a4b..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityPig.java +++ /dev/null @@ -1,287 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityControllable; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntityRideable; -import cn.nukkit.entity.data.FloatEntityData; -import cn.nukkit.entity.data.Vector3fEntityData; -import cn.nukkit.entity.mob.EntityZombiePigman; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.math.Vector3f; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; - -import static cn.nukkit.network.protocol.SetEntityLinkPacket.TYPE_RIDE; - -public class EntityPig extends EntityWalkingAnimal implements EntityRideable, EntityControllable { - - public static final int NETWORK_ID = 12; - - private boolean saddled; - - public EntityPig(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.45f; - } - return 0.9f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.45f; - } - return 0.9f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - - if (this.namedTag.contains("Saddle")) { - this.setSaddled(this.namedTag.getBoolean("Saddle")); - } - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - int id = player.getInventory().getItemInHandFast().getId(); - return player.spawned && player.isAlive() && !player.closed - && (id == Item.CARROT - || id == Item.POTATO - || id == Item.CARROT_ON_A_STICK - || id == Item.BEETROOT) - && distance <= 40; - } - return false; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.CARROT && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addParticle(new ItemBreakParticle(this.add(0,this.getMountedYOffset(),0),Item.get(Item.CARROT))); - this.setInLove(); - return true; - } else if (item.getId() == Item.POTATO && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addParticle(new ItemBreakParticle(this.add(0,this.getMountedYOffset(),0),Item.get(Item.POTATO))); - this.setInLove(); - return true; - } else if (item.getId() == Item.BEETROOT && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addParticle(new ItemBreakParticle(this.add(0,this.getMountedYOffset(),0),Item.get(Item.BEETROOT))); - this.setInLove(); - return true; - } else if (item.getId() == Item.SADDLE && !this.isSaddled() && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_SADDLE); - this.setSaddled(true); - } else if (this.isSaddled() && this.passengers.isEmpty() && !this.isBaby() && !player.isSneaking()) { - if (player.riding == null) { - this.mountEntity(player); - } - } - return super.onInteract(player, item, clickedPos); - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(1, 3); i++) { - drops.add(Item.get(this.isOnFire() ? Item.COOKED_PORKCHOP : Item.RAW_PORKCHOP, 0, 1)); - } - - if (this.isSaddled()) { - drops.add(Item.get(Item.SADDLE)); - } - } - - return drops.toArray(new Item[0]); - } - - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } - - public boolean mountEntity(Entity entity, byte mode) { - Objects.requireNonNull(entity, "The target of the mounting entity can't be null"); - - if (entity.riding != null) { - dismountEntity(entity); - this.motionX = 0; - this.motionZ = 0; - this.stayTime = 20; - } else { - if (isPassenger(entity)) { - return false; - } - - broadcastLinkPacket(entity, TYPE_RIDE); - - entity.riding = this; - entity.setDataFlag(DATA_FLAGS, DATA_FLAG_RIDING, true); - entity.setDataProperty(new Vector3fEntityData(DATA_RIDER_SEAT_POSITION, new Vector3f(0, 1.85001f, 0))); - entity.setDataProperty(new FloatEntityData(DATA_RIDER_MAX_ROTATION, 181)); - passengers.add(entity); - } - - return true; - } - - @Override - public boolean onUpdate(int currentTick) { - Iterator linkedIterator = this.passengers.iterator(); - - while (linkedIterator.hasNext()) { - Entity linked = linkedIterator.next(); - - if (!linked.isAlive()) { - if (linked.riding == this) { - linked.riding = null; - } - - linkedIterator.remove(); - } - } - - return super.onUpdate(currentTick); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putBoolean("Saddle", this.isSaddled()); - } - - public boolean isSaddled() { - return this.saddled; - } - - public void setSaddled(boolean saddled) { - this.saddled = saddled; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SADDLED, saddled); - } - - @Override - public void onPlayerInput(Player player, double strafe, double forward) { - if (player.getInventory().getItemInHandFast().getId() == Item.CARROT_ON_A_STICK) { - this.stayTime = 0; - this.moveTime = 10; - this.yaw = player.yaw; - - strafe *= 0.4; - - double f = strafe * strafe + forward * forward; - double friction = 0.3; - - if (f >= 1.0E-4) { - f = Math.sqrt(f); - - if (f < 1) { - f = 1; - } - - f = friction / f; - strafe *= f; - forward *= f; - double f1 = Math.sin(this.yaw * 0.017453292); - double f2 = Math.cos(this.yaw * 0.017453292); - this.motionX = (strafe * f2 - forward * f1); - this.motionZ = (forward * f2 + strafe * f1); - } else { - this.motionX = 0; - this.motionZ = 0; - } - } - } - - @Override - protected void checkTarget() { - if (this.passengers.isEmpty() || !(this.getPassengers().get(0) instanceof Player) || ((Player) this.getPassengers().get(0)).getInventory().getItemInHandFast().getId() != Item.CARROT_ON_A_STICK) { - super.checkTarget(); - } - } - - @Override - public boolean canDespawn() { - if (this.isSaddled()) { - return false; - } - - return super.canDespawn(); - } - - @Override - public void onStruckByLightning(Entity entity) { - Entity ent = Entity.createEntity("ZombiePigman", this); - if (ent != null) { - CreatureSpawnEvent cse = new CreatureSpawnEvent(EntityZombiePigman.NETWORK_ID, this, ent.namedTag, CreatureSpawnEvent.SpawnReason.LIGHTNING); - this.getServer().getPluginManager().callEvent(cse); - - if (cse.isCancelled()) { - ent.close(); - return; - } - - ent.yaw = this.yaw; - ent.pitch = this.pitch; - ent.setImmobile(this.isImmobile()); - if (this.hasCustomName()) { - ent.setNameTag(this.getNameTag()); - ent.setNameTagVisible(this.isNameTagVisible()); - ent.setNameTagAlwaysVisible(this.isNameTagAlwaysVisible()); - } - - this.close(); - ent.spawnToAll(); - } else { - super.onStruckByLightning(entity); - } - } - - @Override - public void updatePassengers() { - if (this.passengers.isEmpty()) { - return; - } - - for (Entity passenger : new ArrayList<>(this.passengers)) { - if (!passenger.isAlive() || this.isInsideOfWater()) { - dismountEntity(passenger); - continue; - } - - updatePassengerPosition(passenger); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityPolarBear.java b/src/main/java/cn/nukkit/entity/passive/EntityPolarBear.java deleted file mode 100644 index 48e5fdf65..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityPolarBear.java +++ /dev/null @@ -1,150 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.mob.EntityWalkingMob; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class EntityPolarBear extends EntityWalkingMob { - - public static final int NETWORK_ID = 28; - - private int angry = 0; - - public EntityPolarBear(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.65f; - } - return 1.3f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.7f; - } - return 1.4f; - } - - @Override - public double getSpeed() { - return 1.25; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(30); - this.setDamage(new int[] { 0, 4, 6, 9 }); - - if (this.namedTag.contains("Angry")) { - this.angry = this.namedTag.getInt("Angry"); - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putInt("Angry", this.angry); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - return this.isAngry() && super.targetOption(creature, distance); - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && this.distanceSquared(player) < 1.44) { - this.attackDelay = 0; - HashMap damage = new HashMap<>(); - damage.put(EntityDamageEvent.DamageModifier.BASE, (float) this.getDamage()); - - if (player instanceof Player) { - HashMap armorValues = new ArmorPoints(); - - float points = 0; - for (Item i : ((Player) player).getInventory().getArmorContents()) { - points += armorValues.getOrDefault(i.getId(), 0f); - } - - damage.put(EntityDamageEvent.DamageModifier.ARMOR, - (float) (damage.getOrDefault(EntityDamageEvent.DamageModifier.ARMOR, 0f) - Math.floor(damage.getOrDefault(EntityDamageEvent.DamageModifier.BASE, 1f) * points * 0.04))); - } - player.attack(new EntityDamageByEntityEvent(this, player, EntityDamageEvent.DamageCause.ENTITY_ATTACK, damage)); - } - } - - public boolean isAngry() { - return this.angry > 0; - } - - public void setAngry(int val) { - this.angry = val; - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (!ev.isCancelled() && ev instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) ev).getDamager() instanceof Player) { - this.setAngry(2400); - } - } - - return true; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - drops.add(Item.get(Item.RAW_FISH, 0, Utils.rand(0, 2))); - drops.add(Item.get(Item.RAW_SALMON, 0, Utils.rand(0, 2))); - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Polar Bear"; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (this.angry > 0) { - this.angry--; - } - - return super.entityBaseTick(tickDiff); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityPufferfish.java b/src/main/java/cn/nukkit/entity/passive/EntityPufferfish.java deleted file mode 100644 index 05136aefc..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityPufferfish.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.data.ByteEntityData; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -public class EntityPufferfish extends EntityFish { - - public static final int NETWORK_ID = 108; - - protected int puffed = 0; - - public EntityPufferfish(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - int getBucketMeta() { - return 5; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.35f; - } - - @Override - public float getHeight() { - return 0.35f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(3); - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.PUFFERFISH, 0, 1), Item.get(Item.BONE, 0, Utils.rand(0, 2))}; - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (ev instanceof EntityDamageByEntityEvent && ev.getCause() == EntityDamageEvent.DamageCause.ENTITY_ATTACK) { - Entity damager = ((EntityDamageByEntityEvent) ev).getDamager(); - if (damager instanceof Player) { - if (this.puffed > 0) return true; - this.puffed = 200; - damager.addEffect(Effect.getEffect(Effect.POISON).setDuration(200)); - this.setDataProperty(new ByteEntityData(DATA_PUFFERFISH_SIZE, 2)); - } - } - - return true; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (puffed == 0) { - if (this.getDataPropertyByte(DATA_PUFFERFISH_SIZE) == 2) { - this.setDataProperty(new ByteEntityData(DATA_PUFFERFISH_SIZE, 0)); - } - } - - if (puffed > 0) { - puffed--; - } - - return super.entityBaseTick(tickDiff); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityRabbit.java b/src/main/java/cn/nukkit/entity/passive/EntityRabbit.java deleted file mode 100644 index 8d0570d01..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityRabbit.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.utils.Utils; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.ArrayList; -import java.util.List; - -public class EntityRabbit extends EntityJumpingAnimal { - - public static final int NETWORK_ID = 18; - - public EntityRabbit(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.2f; - } - return 0.4f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.25f; - } - return 0.5f; - } - - @Override - public double getSpeed() { - return 1.2; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(3); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - int id = player.getInventory().getItemInHandFast().getId(); - return player.spawned && player.isAlive() && !player.closed && (id == Item.CARROT || id == Item.GOLDEN_CARROT) && distance <= 40; - } - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - drops.add(Item.get(Item.RABBIT_HIDE, 0, Utils.rand(0, 1))); - drops.add(Item.get(this.isOnFire() ? Item.COOKED_RABBIT : Item.RAW_RABBIT, 0, Utils.rand(0, 1))); - - for (int i = 0; i < (Utils.rand(0, 101) <= 9 ? 1 : 0); i++) { - drops.add(Item.get(Item.RABBIT_FOOT, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySalmon.java b/src/main/java/cn/nukkit/entity/passive/EntitySalmon.java deleted file mode 100644 index e8645c0fe..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntitySalmon.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -public class EntitySalmon extends EntityFish { - - public static final int NETWORK_ID = 109; - - public EntitySalmon(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - int getBucketMeta() { - return 3; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.7f; - } - - @Override - public float getHeight() { - return 0.4f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(3); - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.RAW_SALMON, 0, 1), Item.get(Item.BONE, 0, Utils.rand(0, 2))}; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySheep.java b/src/main/java/cn/nukkit/entity/passive/EntitySheep.java deleted file mode 100644 index 41120d69a..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntitySheep.java +++ /dev/null @@ -1,185 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.data.ByteEntityData; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDye; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.DyeColor; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntitySheep extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 13; - - public boolean sheared = false; - public int color; - public int unshearTicks = -1; - - public EntitySheep(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.45f; - } - return 0.9f; - } - - @Override - public float getHeight() { - if (isBaby()) { - return 0.65f; - } - return 1.3f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(8); - - if (!this.namedTag.contains("Color")) { - this.setColor(randomColor()); - } else { - this.setColor(this.namedTag.getByte("Color")); - } - - if (!this.namedTag.contains("Sheared")) { - this.namedTag.putBoolean("Sheared", false); - } else if (this.namedTag.getBoolean("Sheared")) { - this.sheared = true; - this.unshearTicks = Utils.rand(2400, 4800); - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SHEARED, true); - } - } - - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putByte("Color", this.color); - this.namedTag.putBoolean("Sheared", this.sheared); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.DYE) { - this.setColor(((ItemDye) item).getDyeColor().getWoolData()); - return true; - } else if (item.getId() == Item.WHEAT && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_EAT); - this.level.addParticle(new ItemBreakParticle(this.add(0, this.getMountedYOffset(), 0), Item.get(Item.WHEAT))); - this.setInLove(); - return true; - } else if (item.getId() == Item.SHEARS && !this.isBaby() && !this.sheared) { - this.shear(true); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_SHEAR); - player.getInventory().getItemInHand().setDamage(item.getDamage() + 1); - return true; - } - return super.onInteract(player, item, clickedPos); - } - - public void shear(boolean shear) { - this.sheared = shear; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SHEARED, shear); - if (shear) { - this.level.dropItem(this, Item.get(Item.WOOL, getColor(), Utils.rand(1, 3))); - this.unshearTicks = Utils.rand(2400, 4800); - } else { - this.unshearTicks = -1; - } - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && player.getInventory().getItemInHandFast().getId() == Item.WHEAT && distance <= 40; - } - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - if (!sheared) drops.add(Item.get(Item.WOOL, this.getColor(), 1)); - - for (int i = 0; i < Utils.rand(1, 2); i++) { - drops.add(Item.get(this.isOnFire() ? Item.COOKED_MUTTON : Item.RAW_MUTTON, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - - public void setColor(int woolColor) { - this.color = woolColor; - this.namedTag.putByte("Color", woolColor); - this.setDataProperty(new ByteEntityData(DATA_COLOUR, woolColor)); - } - - public int getColor() { - return namedTag.getByte("Color"); - } - - private int randomColor() { - int rand = Utils.rand(1, 200); - - if (rand == 1) return DyeColor.PINK.getWoolData(); - else if (rand < 8) return DyeColor.BROWN.getWoolData(); - else if (rand < 18) return DyeColor.GRAY.getWoolData(); - else if (rand < 28) return DyeColor.LIGHT_GRAY.getWoolData(); - else if (rand < 38) return DyeColor.BLACK.getWoolData(); - else return DyeColor.WHITE.getWoolData(); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (this.sheared && this.unshearTicks > 0) { - if (this.unshearTicks == 40) { - if (this.stayTime <= 0) { - this.stayTime = 50; - } - - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.EAT_GRASS_ANIMATION; - Server.broadcastPacket(this.getViewers().values(), pk); - } - - this.unshearTicks--; - } else if (this.sheared && this.unshearTicks == 0) { - shear(false); - } - - return super.entityBaseTick(tickDiff); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySkeletonHorse.java b/src/main/java/cn/nukkit/entity/passive/EntitySkeletonHorse.java deleted file mode 100644 index ca1a216be..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntitySkeletonHorse.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntitySkeletonHorse extends EntityHorseBase implements EntitySmite { - - public static final int NETWORK_ID = 26; - - public EntitySkeletonHorse(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.6982f; - } - return 1.3965f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.8f; - } - return 1.6f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(15); - } - - @Override - public boolean isFeedItem(Item item) { - return false; - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.LEATHER, 0, 1)); - } - - drops.add(Item.get(Item.BONE, 0, Utils.rand(0, 1))); - } - - return drops.toArray(new Item[0]); - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Skeleton Horse"; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySnowGolem.java b/src/main/java/cn/nukkit/entity/passive/EntitySnowGolem.java deleted file mode 100644 index 8be8bb77d..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntitySnowGolem.java +++ /dev/null @@ -1,169 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.mob.EntityWalkingMob; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.entity.projectile.EntitySnowball; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityShootBowEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.Location; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; -import org.apache.commons.math3.util.FastMath; - -public class EntitySnowGolem extends EntityWalkingMob { - - public static final int NETWORK_ID = 21; - - public boolean sheared = false; - - public EntitySnowGolem(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - this.setFriendly(true); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.7f; - } - - @Override - public float getHeight() { - return 1.9f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(4); - - if (this.namedTag.getBoolean("Sheared")) { - this.shear(true); - } - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - return (!(creature instanceof Player) || creature.getId() == this.isAngryTo) && creature.isAlive() && distance <= 100; - } - - @Override - public void attackEntity(Entity player) { - if (this.attackDelay > 23 && Utils.rand(1, 32) < 4 && this.distanceSquared(player) <= 55) { - this.attackDelay = 0; - - double f = 1.2; - double yaw = this.yaw + Utils.rand(-12.0, 12.0); - double pitch = this.pitch + Utils.rand(-7.0, 7.0); - Location location = new Location(this.x + (-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5), this.y + this.getEyeHeight(), - this.z + (Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * 0.5), yaw, pitch, this.level); - Entity k = Entity.createEntity("Snowball", location, this); - if (k == null) { - return; - } - - EntitySnowball snowball = (EntitySnowball) k; - snowball.setMotion(new Vector3(-Math.sin(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f, -Math.sin(FastMath.toRadians(pitch)) * f * f, Math.cos(FastMath.toRadians(yaw)) * Math.cos(FastMath.toRadians(pitch)) * f * f).multiply(f)); - - EntityShootBowEvent ev = new EntityShootBowEvent(this, Item.get(Item.ARROW, 0, 1), snowball, f); - this.server.getPluginManager().callEvent(ev); - - EntityProjectile projectile = ev.getProjectile(); - if (ev.isCancelled()) { - projectile.close(); - } else if (projectile != null) { - ProjectileLaunchEvent launch = new ProjectileLaunchEvent(projectile); - this.server.getPluginManager().callEvent(launch); - if (launch.isCancelled()) { - projectile.close(); - } else { - projectile.spawnToAll(); - } - } - } - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.SNOWBALL, 0, Utils.rand(0, 15))}; - } - - @Override - public int getKillExperience() { - return 0; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Snow Golem"; - } - - @Override - public boolean entityBaseTick(int tickDiff) { - if (this.age % 20 == 0 && (this.level.getDimension() == Level.DIMENSION_NETHER || (this.level.isRaining() && this.canSeeSky()))) { - this.attack(new EntityDamageEvent(this, EntityDamageEvent.DamageCause.FIRE_TICK, 1)); - } - - return super.entityBaseTick(tickDiff); - } - - @Override - public int nearbyDistanceMultiplier() { - return 10; - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.SHEARS && !this.sheared) { - this.shear(true); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_SHEAR); - player.getInventory().getItemInHand().setDamage(item.getDamage() + 1); - return true; - } - - return super.onInteract(player, item, clickedPos); - } - - public void shear(boolean shear) { - this.sheared = shear; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SHEARED, shear); - } - - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putBoolean("Sheared", this.sheared); - } - - @Override - public boolean attack(EntityDamageEvent ev) { - if (super.attack(ev)) { - if (ev instanceof EntityDamageByEntityEvent) { - this.isAngryTo = ((EntityDamageByEntityEvent) ev).getDamager().getId(); - } - return true; - } - - return false; - } - - @Override - public boolean canTarget(Entity entity) { - return entity.canBeFollowed() && entity.getId() == this.isAngryTo; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySquid.java b/src/main/java/cn/nukkit/entity/passive/EntitySquid.java deleted file mode 100644 index 2a0689668..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntitySquid.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemDye; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.EntityEventPacket; -import cn.nukkit.utils.DyeColor; -import cn.nukkit.utils.Utils; - -public class EntitySquid extends EntityWaterAnimal { - - public static final int NETWORK_ID = 17; - - public EntitySquid(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.8f; - } - - @Override - public float getHeight() { - return 0.8f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - } - - @Override - public Item[] getDrops() { - return new Item[]{new ItemDye(DyeColor.BLACK.getDyeData(), Utils.rand(1, 3))}; - } - - @Override - public int getKillExperience() { - return Utils.rand(1, 3); - } - - @Override - public boolean attack(EntityDamageEvent source) { - boolean att = super.attack(source); - if (source.isCancelled()) { - return att; - } - - EntityEventPacket pk = new EntityEventPacket(); - pk.eid = this.getId(); - pk.event = EntityEventPacket.SQUID_INK_CLOUD; - this.level.addChunkPacket(this.getChunkX() >> 4, this.getChunkZ() >> 4, pk); - return att; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityStrider.java b/src/main/java/cn/nukkit/entity/passive/EntityStrider.java deleted file mode 100644 index 67e3d2656..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityStrider.java +++ /dev/null @@ -1,234 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityControllable; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntityRideable; -import cn.nukkit.entity.data.FloatEntityData; -import cn.nukkit.entity.data.Vector3fEntityData; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.math.Vector3f; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; - -import static cn.nukkit.network.protocol.SetEntityLinkPacket.TYPE_RIDE; - -/** - * @author Erik Miller | EinBexiii - */ -public class EntityStrider extends EntityWalkingAnimal implements EntityRideable, EntityControllable { - - public final static int NETWORK_ID = 125; - - private boolean saddled; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityStrider(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } - - @Override - protected void initEntity() { - super.initEntity(); - this.fireProof = true; - this.setMaxHealth(20); - - if (this.namedTag.contains("Saddle")) { - this.setSaddled(this.namedTag.getBoolean("Saddle")); - } - } - - @Override - public float getWidth() { - return 0.9f; - } - - @Override - public float getHeight() { - return 1.7f; - } - - public boolean mountEntity(Entity entity, byte mode) { - Objects.requireNonNull(entity, "The target of the mounting entity can't be null"); - - if (entity.riding != null) { - dismountEntity(entity); - this.motionX = 0; - this.motionZ = 0; - this.stayTime = 20; - } else { - if (isPassenger(entity)) { - return false; - } - - broadcastLinkPacket(entity, TYPE_RIDE); - - entity.riding = this; - entity.setDataFlag(DATA_FLAGS, DATA_FLAG_RIDING, true); - entity.setDataProperty(new Vector3fEntityData(DATA_RIDER_SEAT_POSITION, new Vector3f(0, 2.8f, 0))); - entity.setDataProperty(new FloatEntityData(DATA_RIDER_MAX_ROTATION, 181)); - passengers.add(entity); - } - - return true; - } - - @Override - public boolean onUpdate(int currentTick) { - Iterator linkedIterator = this.passengers.iterator(); - - while (linkedIterator.hasNext()) { - Entity linked = linkedIterator.next(); - - if (!linked.isAlive()) { - if (linked.riding == this) { - linked.riding = null; - } - - linkedIterator.remove(); - } - } - - return super.onUpdate(currentTick); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putBoolean("Saddle", this.isSaddled()); - } - - public boolean isSaddled() { - return this.saddled; - } - - public void setSaddled(boolean saddled) { - this.saddled = saddled; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SADDLED, saddled); - } - - @Override - public void onPlayerInput(Player player, double strafe, double forward) { - if (player.getInventory().getItemInHandFast().getId() == Item.WARPED_FUNGUS_ON_A_STICK) { - this.stayTime = 0; - this.moveTime = 10; - this.yaw = player.yaw; - - strafe *= 0.4; - - double f = strafe * strafe + forward * forward; - double friction = 0.3; - - if (f >= 1.0E-4) { - f = Math.sqrt(f); - - if (f < 1) { - f = 1; - } - - f = friction / f; - strafe *= f; - forward *= f; - double f1 = Math.sin(this.yaw * 0.017453292); - double f2 = Math.cos(this.yaw * 0.017453292); - this.motionX = (strafe * f2 - forward * f1); - this.motionZ = (forward * f2 + strafe * f1); - } else { - this.motionX = 0; - this.motionZ = 0; - } - } - } - - @Override - protected void checkTarget() { - if (this.passengers.isEmpty() || !(this.getPassengers().get(0) instanceof Player) || ((Player) this.getPassengers().get(0)).getInventory().getItemInHandFast().getId() != Item.WARPED_FUNGUS_ON_A_STICK) { - super.checkTarget(); - } - } - - @Override - public boolean canDespawn() { - if (this.isSaddled()) { - return false; - } - - return super.canDespawn(); - } - - @Override - public void updatePassengers() { - if (this.passengers.isEmpty()) { - return; - } - - for (Entity passenger : new ArrayList<>(this.passengers)) { - if (!passenger.isAlive() || this.isInsideOfWater()) { - dismountEntity(passenger); - continue; - } - - updatePassengerPosition(passenger); - } - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(2, 5); i++) { - drops.add(Item.get(Item.STRING, 0, 1)); - } - - if (this.isSaddled()) { - drops.add(Item.get(Item.SADDLE)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public boolean onInteract(Player player, Item item, Vector3 clickedPos) { - if (item.getId() == Item.SADDLE && !this.isSaddled() && !this.isBaby()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_SADDLE); - this.setSaddled(true); - } else if (this.isSaddled() && this.passengers.isEmpty() && !this.isBaby() && !player.isSneaking()) { - if (player.riding == null) { - this.mountEntity(player); - } - } - return super.onInteract(player, item, clickedPos); - } - - @Override - public boolean targetOption(EntityCreature creature, double distance) { - if (creature instanceof Player) { - Player player = (Player) creature; - return player.spawned && player.isAlive() && !player.closed && distance <= 40 - && player.getInventory().getItemInHandFast().getId() == Item.WARPED_FUNGUS_ON_A_STICK; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityTameable.java b/src/main/java/cn/nukkit/entity/passive/EntityTameable.java deleted file mode 100644 index 7f8c4368c..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityTameable.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityOwnable; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityTameable extends EntityWalkingAnimal implements EntityOwnable { - - public EntityTameable(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public String getOwnerName() { - return this.namedTag.getString(cn.nukkit.entity.EntityTameable.NAMED_TAG_OWNER); - } - - @Override - public void setOwnerName(String name) { - this.namedTag.putString(cn.nukkit.entity.EntityTameable.NAMED_TAG_OWNER, name); - } - - @Override - public Player getOwner() { - return this.server.getPlayerExact(this.getOwnerName()); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityTameableAnimal.java b/src/main/java/cn/nukkit/entity/passive/EntityTameableAnimal.java deleted file mode 100644 index 0d269808c..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityTameableAnimal.java +++ /dev/null @@ -1,126 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.data.LongEntityData; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityTameableAnimal extends cn.nukkit.entity.passive.EntityTameable implements cn.nukkit.entity.EntityTameable { - - private Player owner = null; - - private String ownerUUID = ""; - - private boolean sitting = false; - - public EntityTameableAnimal(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initEntity() { - super.initEntity(); - - if (this.namedTag != null) { - String ownerName = namedTag.getString(NAMED_TAG_OWNER); - if (ownerName != null && !ownerName.isEmpty()) { - Player player = this.getServer().getPlayerExact(ownerName); - if (player != null) { - this.setOwner(player); - } - this.setSitting(namedTag.getBoolean(NAMED_TAG_SITTING)); - } - } - } - - @Override - public void saveNBT() { - super.saveNBT(); - namedTag.putBoolean(NAMED_TAG_SITTING, this.sitting); - if (this.owner != null) { - namedTag.putString(NAMED_TAG_OWNER, this.owner.getName()); - namedTag.putString(NAMED_TAG_OWNER_UUID, owner.getUniqueId().toString()); - } - } - - @Override - public Player getOwner() { - this.checkOwner(); - return this.owner; - } - - @Override - public boolean hasOwner() { - return hasOwner(true); - } - - public boolean hasOwner(boolean checkOnline) { - if (checkOnline) { - this.checkOwner(); - return this.owner != null; - } else { - if (this.namedTag != null) { - String ownerName = namedTag.getString(NAMED_TAG_OWNER); - return ownerName != null && !ownerName.isEmpty(); - } - return false; - } - } - - @Override - public void setOwner(Player player) { - this.owner = player; - this.setDataProperty(new LongEntityData(DATA_OWNER_EID, player.getId())); - this.setTamed(true); - } - - @Override - public boolean isSitting() { - return this.sitting; - } - - @Override - public void setSitting(boolean sit) { - this.sitting = sit; - this.setDataFlag(DATA_FLAGS, DATA_FLAG_SITTING, sit); - } - - public void setTamed(boolean tamed) { - this.setDataFlag(DATA_FLAGS, DATA_FLAG_TAMED, tamed); - } - - @Override - public String getOwnerUUID() { - return this.ownerUUID; - } - - @Override - public void setOwnerUUID(String ownerUUID) { - this.ownerUUID = ownerUUID; - } - - @Override - public Vector3 updateMove(int tickDiff) { - if (this.sitting) { - return this.target; - } - - return super.updateMove(tickDiff); - } - - /** - * If the owner is online, set owner properly - */ - public void checkOwner() { - if (this.owner == null && this.namedTag != null) { - String ownerName = namedTag.getString(NAMED_TAG_OWNER); - if (ownerName != null && !ownerName.isEmpty()) { - Player player = this.getServer().getPlayerExact(ownerName); - if (player != null) { - this.setOwner(player); - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityTropicalFish.java b/src/main/java/cn/nukkit/entity/passive/EntityTropicalFish.java deleted file mode 100644 index 4f203897c..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityTropicalFish.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -public class EntityTropicalFish extends EntityFish { - - public static final int NETWORK_ID = 111; - - public EntityTropicalFish(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - int getBucketMeta() { - return 4; - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.5f; - } - - @Override - public float getHeight() { - return 0.4f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(3); - } - - @Override - public Item[] getDrops() { - return new Item[]{Item.get(Item.CLOWNFISH, 0, 1), Item.get(Item.BONE, 0, Utils.rand(0, 2))}; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Tropical Fish"; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityTurtle.java b/src/main/java/cn/nukkit/entity/passive/EntityTurtle.java deleted file mode 100644 index a35f868f2..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityTurtle.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.utils.Utils; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityTurtle extends EntityWaterAnimal { - - public static final int NETWORK_ID = 74; - - public EntityTurtle(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 1.2f; - } - - @Override - public float getHeight() { - return 0.4f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(30); - } - - @Override - public int getKillExperience() { - return this.isBaby() ? 0 : Utils.rand(1, 3); - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityVillager.java b/src/main/java/cn/nukkit/entity/passive/EntityVillager.java deleted file mode 100644 index 3a1228ae8..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityVillager.java +++ /dev/null @@ -1,198 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.mob.EntityWitch; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.inventory.TradeInventory; -import cn.nukkit.inventory.TradeInventoryRecipe; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; - -import java.util.ArrayList; -import java.util.List; - -public class EntityVillager extends EntityWalkingAnimal implements InventoryHolder { - - public static final int PROFESSION_FARMER = 0; - public static final int PROFESSION_LIBRARIAN = 1; - public static final int PROFESSION_PRIEST = 2; - public static final int PROFESSION_BLACKSMITH = 3; - public static final int PROFESSION_BUTCHER = 4; - public static final int PROFESSION_GENERIC = 5; - - public static final int NETWORK_ID = 15; - - private TradeInventory inventory; - private final List recipes = new ArrayList<>(); - private int tradeTier = 0; - private boolean willing = true; - - public EntityVillager(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.3f; - } - return 0.6f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.975f; - } - return 1.95f; - } - - @Override - public double getSpeed() { - return 1.1; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(10); - - this.inventory = new TradeInventory(this); - - try { - CompoundTag offers = this.namedTag.getCompound("Offers"); - if (offers != null) { - ListTag nbtRecipes = offers.getList("Recipes", CompoundTag.class); - for (CompoundTag nbt : nbtRecipes.getAll()) { - recipes.add(TradeInventoryRecipe.toNBT(nbt)); - } - } - } catch (Exception ex) { - server.getLogger().error("Failed to load trade recipes for a villager with entity id " + this.id, ex); - } - - if (!this.namedTag.contains("Profession")) { - this.setProfession(PROFESSION_GENERIC); - } - } - - public int getProfession() { - return this.namedTag.getInt("Profession"); - } - - public void setProfession(int profession) { - this.namedTag.putInt("Profession", profession); - } - - @Override - public int getKillExperience() { - return 0; - } - - @Override - public void onStruckByLightning(Entity entity) { - Entity ent = Entity.createEntity("Witch", this); - if (ent != null) { - CreatureSpawnEvent cse = new CreatureSpawnEvent(EntityWitch.NETWORK_ID, this, ent.namedTag, CreatureSpawnEvent.SpawnReason.LIGHTNING); - this.getServer().getPluginManager().callEvent(cse); - - if (cse.isCancelled()) { - ent.close(); - return; - } - - ent.yaw = this.yaw; - ent.pitch = this.pitch; - ent.setImmobile(this.isImmobile()); - if (this.hasCustomName()) { - ent.setNameTag(this.getNameTag()); - ent.setNameTagVisible(this.isNameTagVisible()); - ent.setNameTagAlwaysVisible(this.isNameTagAlwaysVisible()); - } - - this.close(); - ent.spawnToAll(); - } else { - super.onStruckByLightning(entity); - } - } - - public void setTradeTier(int tier) { - this.tradeTier = tier; - } - - public int getTradeTier() { - return this.tradeTier; - } - - public void setWilling(boolean value) { - this.willing = value; - } - - public boolean isWilling() { - return this.willing; - } - - @Override - public boolean onInteract(Player player, Item item) { - if (recipes.size() > 0) { - player.addWindow(this.getInventory()); - return true; - } - return false; - } - - public void addTradeRecipe(TradeInventoryRecipe recipe) { - this.recipes.add(recipe); - } - - public List getRecipes() { - return this.recipes; - } - - public CompoundTag getOffers() { - CompoundTag nbt = new CompoundTag(); - nbt.putList(recipesToNbt()); - nbt.putList(getDefaultTierExpRequirements()); - return nbt; - } - - private ListTag recipesToNbt() { - ListTag tag = new ListTag<>("Recipes"); - for (TradeInventoryRecipe recipe : this.recipes) { - tag.add(recipe.toNBT()); - } - return tag; - } - - private ListTag getDefaultTierExpRequirements() { - ListTag tag = new ListTag<>("TierExpRequirements"); - tag.add(new CompoundTag().putInt("0", 0)); - tag.add(new CompoundTag().putInt("1", 10)); - tag.add(new CompoundTag().putInt("2", 70)); - tag.add(new CompoundTag().putInt("3", 150)); - tag.add(new CompoundTag().putInt("4", 250)); - return tag; - } - - @Override - public Inventory getInventory() { - return this.inventory; - } - - @Override - public boolean canDespawn() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityVillagerV2.java b/src/main/java/cn/nukkit/entity/passive/EntityVillagerV2.java deleted file mode 100644 index 7faee59cf..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityVillagerV2.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityVillagerV2 extends EntityVillager { - - public static final int NETWORK_ID = 115; - - public EntityVillagerV2(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Villager"; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityWalkingAnimal.java b/src/main/java/cn/nukkit/entity/passive/EntityWalkingAnimal.java deleted file mode 100644 index 8bc7932d8..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityWalkingAnimal.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityWalking; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -public abstract class EntityWalkingAnimal extends EntityWalking implements EntityAnimal { - - public EntityWalkingAnimal(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - private int panicTicks = 0; - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - return true; - } - - if (this.panicTicks > 0) { - this.panicTicks--; - if (panicTicks == 0) { - doPanic(false); - } - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - Vector3 target = this.updateMove(tickDiff); - /*if (target instanceof Player) { - if (this.distanceSquared(target) <= 2) { - //this.pitch = 22; - this.x = this.lastX; - this.y = this.lastY; - this.z = this.lastZ; - } - }*/ - - return true; - } - - public void doPanic(boolean panic) { - if (panic) { - int time = Utils.rand(60, 100); - this.panicTicks = time; - this.stayTime = 0; - this.moveTime = time; - this.moveMultiplier = 1.8f; - } else { - this.moveMultiplier = 1.0f; - } - } - - @Override - public boolean attack(EntityDamageEvent ev) { - super.attack(ev); - - if (!ev.isCancelled() && ev instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) ev).getDamager() instanceof Player) { - this.doPanic(true); - } - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityWanderingTrader.java b/src/main/java/cn/nukkit/entity/passive/EntityWanderingTrader.java deleted file mode 100644 index 3f96c452b..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityWanderingTrader.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityWanderingTrader extends EntityWalkingAnimal { - - public static final int NETWORK_ID = 118; - - public EntityWanderingTrader(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.6f; - } - - @Override - public float getHeight() { - return 1.95f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(20); - } - - @Override - public int getKillExperience() { - return 0; - } - - @Override - public String getName() { - return this.hasCustomName() ? this.getNameTag() : "Wandering Trader"; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityWaterAnimal.java b/src/main/java/cn/nukkit/entity/passive/EntityWaterAnimal.java deleted file mode 100644 index 837085153..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityWaterAnimal.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.entity.EntitySwimming; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; - -public abstract class EntityWaterAnimal extends EntitySwimming implements EntityAnimal { - - public EntityWaterAnimal(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public double getSpeed() { - return 0.8; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (!this.isAlive()) { - if (++this.deadTicks >= 23) { - this.close(); - return false; - } - return true; - } - - int tickDiff = currentTick - this.lastUpdate; - this.lastUpdate = currentTick; - this.entityBaseTick(tickDiff); - - Vector3 target = this.updateMove(tickDiff); - /*if (target instanceof Player) { - if (this.distanceSquared(target) <= 2) { - //this.pitch = 22; - this.x = this.lastX; - this.y = this.lastY; - this.z = this.lastZ; - } - }*/ - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/passive/EntityZombieHorse.java b/src/main/java/cn/nukkit/entity/passive/EntityZombieHorse.java deleted file mode 100644 index 584d49360..000000000 --- a/src/main/java/cn/nukkit/entity/passive/EntityZombieHorse.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit.entity.passive; - -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.item.Item; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class EntityZombieHorse extends EntityHorseBase implements EntitySmite { - - public static final int NETWORK_ID = 27; - - public EntityZombieHorse(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - if (this.isBaby()) { - return 0.6982f; - } - return 1.3965f; - } - - @Override - public float getHeight() { - if (this.isBaby()) { - return 0.8f; - } - return 1.6f; - } - - @Override - public void initEntity() { - super.initEntity(); - - this.setMaxHealth(15); - } - - @Override - public boolean isFeedItem(Item item) { - return false; - } - - @Override - public Item[] getDrops() { - List drops = new ArrayList<>(); - - if (!this.isBaby()) { - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.LEATHER, 0, 1)); - } - - for (int i = 0; i < Utils.rand(0, 2); i++) { - drops.add(Item.get(Item.ROTTEN_FLESH, 0, 1)); - } - } - - return drops.toArray(new Item[0]); - } - - @Override - public String getName() { - return "Zombie Horse"; - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityArrow.java b/src/main/java/cn/nukkit/entity/projectile/EntityArrow.java deleted file mode 100644 index 989e2c042..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityArrow.java +++ /dev/null @@ -1,157 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityArrow extends EntityProjectile { - - public static final int NETWORK_ID = 80; - - public static final int DATA_SOURCE_ID = 17; - - protected int pickupMode; - public boolean isFromStray; - protected boolean critical; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.05f; - } - - @Override - public float getLength() { - return 0.5f; - } - - @Override - public float getHeight() { - return 0.05f; - } - - @Override - public float getGravity() { - return 0.05f; - } - - @Override - public float getDrag() { - return 0.01f; - } - - public EntityArrow(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityArrow(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - this(chunk, nbt, shootingEntity, false); - } - - public EntityArrow(FullChunk chunk, CompoundTag nbt, Entity shootingEntity, boolean critical) { - super(chunk, nbt, shootingEntity); - this.setCritical(critical); - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.pickupMode = namedTag.contains("pickup") ? namedTag.getByte("pickup") : PICKUP_ANY; - } - - public void setCritical() { - this.setCritical(true); - } - - public void setCritical(boolean value) { - //this.setDataFlag(DATA_FLAGS, DATA_FLAG_CRITICAL, value); - this.critical = value; - } - - public boolean isCritical() { - //return this.getDataFlag(DATA_FLAGS, DATA_FLAG_CRITICAL); - return this.critical; - } - - @Override - public int getResultDamage() { - int base = super.getResultDamage(); - - if (this.isCritical()) { - base += Utils.random.nextInt((base >> 1) + 2); - } - - return base; - } - - @Override - protected double getBaseDamage() { - return 2; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - if (this.age > 1200) { - this.close(); - return false; - } - - if (this.onGround || this.hadCollision) { - this.setCritical(false); - } - - if (this.fireTicks > 0 && this.level.isRaining() && this.canSeeSky()) { - this.extinguish(); - } - - if (this.timing != null) this.timing.stopTiming(); - - return super.onUpdate(currentTick); - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.putByte("pickup", this.pickupMode); - } - - public int getPickupMode() { - return this.pickupMode; - } - - public void setPickupMode(int pickupMode) { - this.pickupMode = pickupMode; - } - - @Override - public void onHit() { - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_BOW_HIT); - } - - public void onCollideWithEntity(Entity entity) { - super.onCollideWithEntity(entity); - - if (this.isFromStray) { - entity.addEffect(Effect.getEffect(Effect.SLOWNESS).setDuration(600)); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityBlazeFireBall.java b/src/main/java/cn/nukkit/entity/projectile/EntityBlazeFireBall.java deleted file mode 100644 index 1eb1f73d3..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityBlazeFireBall.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityBlazeFireBall extends EntityProjectile { - - public static final int NETWORK_ID = 94; - - public EntityBlazeFireBall(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityBlazeFireBall(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.3125f; - } - - @Override - public float getHeight() { - return 0.3125f; - } - - @Override - public float getGravity() { - return 0.01f; - } - - @Override - public float getDrag() { - return 0.01f; - } - - @Override - public double getDamage() { - return 5; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 1200 || this.isCollided) { - this.close(); - } - - return super.onUpdate(currentTick); - } - - @Override - public void onCollideWithEntity(Entity entity) { - super.onCollideWithEntity(entity); - this.isCollided = true; - entity.setOnFire(5); - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityBlueWitherSkull.java b/src/main/java/cn/nukkit/entity/projectile/EntityBlueWitherSkull.java deleted file mode 100644 index e52dc3944..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityBlueWitherSkull.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.event.entity.ExplosionPrimeEvent; -import cn.nukkit.level.StrongExplosion; -import cn.nukkit.level.Explosion; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.SmokeParticle; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -public class EntityBlueWitherSkull extends EntityWitherSkull implements EntityExplosive { - - public static final int NETWORK_ID = 91; - - private boolean canExplode; - - public EntityBlueWitherSkull(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityBlueWitherSkull(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - this(chunk, nbt, shootingEntity, false); - } - - public EntityBlueWitherSkull(FullChunk chunk, CompoundTag nbt, Entity shootingEntity, boolean critical) { - super(chunk, nbt, shootingEntity); - } - - public void setExplode(boolean bool) { - this.canExplode = bool; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - if (this.age > 1200 || this.hadCollision) { - if (this.canExplode) { - this.explode(); - } - - this.close(); - } else if (this.age % 4 == 0) { - this.level.addParticle(new SmokeParticle(this.add(this.getWidth() / 2 + Utils.rand(-100.0, 100.0) / 500, this.getHeight() / 2 + Utils.rand(-100.0, 100.0) / 500, this.getWidth() / 2 + Utils.rand(-100.0, 100.0) / 500))); - } - - if (this.timing != null) this.timing.stopTiming(); - - return super.onUpdate(currentTick); - } - - @Override - public void onCollideWithEntity(Entity entity) { - super.onCollideWithEntity(entity); - entity.addEffect(Effect.getEffect(Effect.WITHER).setDuration(200)); - } - - @Override - public void explode() { - ExplosionPrimeEvent ev = new ExplosionPrimeEvent(this, 1.2); - this.server.getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - Explosion explosion = new StrongExplosion(this, (float) ev.getForce(), this.shootingEntity); - if (ev.isBlockBreaking() && this.level.getGameRules().getBoolean(GameRule.MOB_GRIEFING)) { - explosion.explodeA(); - } - - explosion.explodeB(); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityEgg.java b/src/main/java/cn/nukkit/entity/projectile/EntityEgg.java deleted file mode 100644 index b43a0bec7..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityEgg.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.passive.EntityChicken; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.item.ItemEgg; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityEgg extends EntityProjectile { - - public static final int NETWORK_ID = 82; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - protected float getGravity() { - return 0.04f; - } - - @Override - protected float getDrag() { - return 0.01f; - } - - public EntityEgg(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityEgg(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 1200) { - this.close(); - } else if (this.isCollided) { - this.close(); - - if (Server.getInstance().mobsFromBlocks) { - if (Utils.rand(1, 20) == 5) { - CreatureSpawnEvent ev = new CreatureSpawnEvent(NETWORK_ID, CreatureSpawnEvent.SpawnReason.EGG); - level.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return false; - } - - EntityChicken entity = (EntityChicken) Entity.createEntity("Chicken", this.add(0.5, 1, 0.5)); - if (entity != null) { - entity.spawnToAll(); - entity.setBaby(true); - } - } - } - } - - return super.onUpdate(currentTick); - } - - @Override - public void onHit() { - ItemEgg egg = new ItemEgg(); - level.addParticle(new ItemBreakParticle(this, egg), null, 5); - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityEnderCharge.java b/src/main/java/cn/nukkit/entity/projectile/EntityEnderCharge.java deleted file mode 100644 index bc301bb6b..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityEnderCharge.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityEnderCharge extends EntityProjectile { - - public static final int NETWORK_ID = 79; - - public EntityEnderCharge(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityEnderCharge(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - public float getGravity() { - return 0.01f; - } - - @Override - public float getDrag() { - return 0.01f; - } - - @Override - protected double getDamage() { - return 5; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 1200 || this.isCollided) { - this.close(); - } - - return super.onUpdate(currentTick); - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityEnderPearl.java b/src/main/java/cn/nukkit/entity/projectile/EntityEnderPearl.java deleted file mode 100644 index 3da8b27cd..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityEnderPearl.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.player.PlayerTeleportEvent.TeleportCause; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.sound.EndermanTeleportSound; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.Utils; - -import java.util.List; - -public class EntityEnderPearl extends EntityProjectile { - - public static final int NETWORK_ID = 87; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - protected float getGravity() { - return 0.03f; - } - - @Override - protected float getDrag() { - return 0.01f; - } - - public EntityEnderPearl(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityEnderPearl(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - if (this.isCollided && this.shootingEntity instanceof Player) { - List b = this.getCollisionBlocks(); - - boolean portal = false; - for (Block collided : b) { - if (collided.getId() == Block.NETHER_PORTAL) { - portal = true; - } - } - - this.close(); - - if (!portal) { - teleport(); - - if (Server.getInstance().mobsFromBlocks) { - if (Utils.rand(1, 20) == 5) { - CreatureSpawnEvent ev = new CreatureSpawnEvent(NETWORK_ID, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); - level.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return false; - } - - Entity entity = Entity.createEntity("Endermite", this.add(0.5, 1, 0.5)); - if (entity != null) { - entity.spawnToAll(); - } - } - } - } - - return false; - } - - if (this.age > 1200 || this.isCollided) { - this.close(); - } - - if (this.timing != null) this.timing.stopTiming(); - - return super.onUpdate(currentTick); - } - - @Override - public void onCollideWithEntity(Entity entity) { - if (this.shootingEntity instanceof Player) { - teleport(); - } - - super.onCollideWithEntity(entity); - } - - private void teleport() { - if (!this.level.equals(this.shootingEntity.getLevel())) { - return; - } - - this.shootingEntity.teleport(new Vector3(NukkitMath.floorDouble(this.x) + 0.5, this.y, NukkitMath.floorDouble(this.z) + 0.5), TeleportCause.ENDER_PEARL); - - int gamemode = ((Player) this.shootingEntity).getGamemode(); - if (gamemode == 0 || gamemode == 2) { - this.shootingEntity.attack(new EntityDamageByEntityEvent(this, shootingEntity, EntityDamageEvent.DamageCause.FALL, 5f, 0f)); - } - - this.level.addSound(new EndermanTeleportSound(this)); - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityEvocationFangs.java b/src/main/java/cn/nukkit/entity/projectile/EntityEvocationFangs.java deleted file mode 100644 index 295e011be..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityEvocationFangs.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityEvocationFangs extends EntityProjectile { - - public static final int NETWORK_ID = 103; - - public EntityEvocationFangs(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityEvocationFangs(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - public float getGravity() { - return 0.03f; - } - - @Override - public float getDrag() { - return 0.01f; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 1200 || this.isCollided) { - this.close(); - } - - return super.onUpdate(currentTick); - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityGhastFireBall.java b/src/main/java/cn/nukkit/entity/projectile/EntityGhastFireBall.java deleted file mode 100644 index 96ab4049d..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityGhastFireBall.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.ExplosionPrimeEvent; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.WeakExplosion; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityGhastFireBall extends EntityProjectile implements EntityExplosive { - - public static final int NETWORK_ID = 85; - - private boolean canExplode; - - private boolean directionChanged; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.45f; - } - - @Override - public float getHeight() { - return 0.45f; - } - - @Override - public float getGravity() { - return 0.01f; - } - - @Override - public float getDrag() { - return 0.01f; - } - - @Override - public double getDamage() { - return 5; - } - - public EntityGhastFireBall(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityGhastFireBall(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - this(chunk, nbt, shootingEntity, false); - } - - public EntityGhastFireBall(FullChunk chunk, CompoundTag nbt, Entity shootingEntity, boolean critical) { - super(chunk, nbt, shootingEntity); - } - - public void setExplode(boolean bool) { - this.canExplode = bool; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 1200 || this.isCollided) { - if (this.isCollided && this.canExplode) { - this.explode(); - } - this.close(); - } - - return super.onUpdate(currentTick); - } - - @Override - public void onCollideWithEntity(Entity entity) { - this.isCollided = true; - } - - @Override - public boolean attack(EntityDamageEvent source) { - if (!directionChanged && source instanceof EntityDamageByEntityEvent) { - if (((EntityDamageByEntityEvent) source).getDamager() instanceof Player) { - directionChanged = true; - this.setMotion(((EntityDamageByEntityEvent) source).getDamager().getLocation().getDirectionVector()); - } - } - - return true; - } - - @Override - public void explode() { - ExplosionPrimeEvent ev = new ExplosionPrimeEvent(this, 1.2); - this.server.getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - WeakExplosion explosion = new WeakExplosion(this, (float) ev.getForce(), this.shootingEntity); - if (ev.isBlockBreaking() && this.level.getGameRules().getBoolean(GameRule.MOB_GRIEFING)) { - explosion.explodeA(); - } - explosion.explodeB(); - } - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityLlamaSpit.java b/src/main/java/cn/nukkit/entity/projectile/EntityLlamaSpit.java deleted file mode 100644 index 3380880f1..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityLlamaSpit.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; - -public class EntityLlamaSpit extends EntityProjectile { - - public static final int NETWORK_ID = 102; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.3f; - } - - @Override - public float getHeight() { - return 0.3f; - } - - @Override - public float getGravity() { - return 0.01f; - } - - @Override - public float getDrag() { - return 0.01f; - } - - @Override - protected double getDamage() { - return 1; - } - - public EntityLlamaSpit(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityLlamaSpit(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - this(chunk, nbt, shootingEntity, false); - } - - public EntityLlamaSpit(FullChunk chunk, CompoundTag nbt, Entity shootingEntity, boolean critical) { - super(chunk, nbt, shootingEntity); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 100 || this.isCollided) { - this.close(); - } - - return super.onUpdate(currentTick); - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityProjectile.java b/src/main/java/cn/nukkit/entity/projectile/EntityProjectile.java deleted file mode 100644 index 4f7d823d1..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityProjectile.java +++ /dev/null @@ -1,225 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.entity.item.EntityEndCrystal; -import cn.nukkit.entity.mob.EntityBlaze; -import cn.nukkit.event.entity.*; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.level.MovingObjectPosition; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import org.apache.commons.math3.util.FastMath; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EntityProjectile extends Entity { - - public static final int DATA_SHOOTER_ID = 17; - - public static final int PICKUP_NONE = 0; - public static final int PICKUP_ANY = 1; - public static final int PICKUP_CREATIVE = 2; - - public Entity shootingEntity; - - protected double getDamage() { - return namedTag.contains("damage") ? namedTag.getDouble("damage") : getBaseDamage(); - } - - protected double getBaseDamage() { - return 0; - } - - public boolean hadCollision = false; - - public int piercing; - - public EntityProjectile(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityProjectile(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt); - this.shootingEntity = shootingEntity; - /*if (shootingEntity != null) { - this.setDataProperty(new LongEntityData(DATA_SHOOTER_ID, shootingEntity.getId())); - }*/ - } - - public int getResultDamage() { - return NukkitMath.ceilDouble(Math.sqrt(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ) * getDamage()); - } - - public boolean attack(EntityDamageEvent source) { - return source.getCause() == DamageCause.VOID && super.attack(source); - } - - public void onCollideWithEntity(Entity entity) { - this.server.getPluginManager().callEvent(new ProjectileHitEvent(this, MovingObjectPosition.fromEntity(entity))); - float damage = this instanceof EntitySnowball && entity instanceof EntityBlaze ? 3 : this.getResultDamage(); - - EntityDamageEvent ev; - if (this.shootingEntity == null) { - ev = new EntityDamageByEntityEvent(this, entity, DamageCause.PROJECTILE, damage); - } else { - ev = new EntityDamageByChildEntityEvent(this.shootingEntity, this, entity, DamageCause.PROJECTILE, damage); - } - - if (entity.attack(ev)) { - this.hadCollision = true; - - this.onHit(); - - if (this.fireTicks > 0) { - EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this, entity, 5); - this.server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - entity.setOnFire(event.getDuration()); - } - } - } - - this.close(); - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.setMaxHealth(1); - this.setHealth(1); - if (this.namedTag.contains("Age")) { - this.age = this.namedTag.getShort("Age"); - } - } - - @Override - public boolean canCollideWith(Entity entity) { - return (entity instanceof EntityLiving || entity instanceof EntityEndCrystal) && !this.onGround; - } - - @Override - public void saveNBT() { - super.saveNBT(); - this.namedTag.putShort("Age", this.age); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - int tickDiff = currentTick - this.lastUpdate; - if (tickDiff <= 0 && !this.justCreated) { - return true; - } - this.lastUpdate = currentTick; - - boolean hasUpdate = this.entityBaseTick(tickDiff); - - if (this.isAlive()) { - MovingObjectPosition movingObjectPosition = null; - - if (!this.isCollided) { - if (this.isInsideOfWater()) { - this.motionY -= this.getGravity() - (this.getGravity() / 2); - } else { - this.motionY -= this.getGravity(); - } - this.motionX *= 1 - this.getDrag(); - this.motionZ *= 1 - this.getDrag(); - } - - Vector3 moveVector = new Vector3(this.x + this.motionX, this.y + this.motionY, this.z + this.motionZ); - - Entity[] list = this.getLevel().getCollidingEntities(this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1, 1, 1), this); - - double nearDistance = Integer.MAX_VALUE; - Entity nearEntity = null; - - for (Entity entity : list) { - if (/*!entity.canCollideWith(this) || */(entity == this.shootingEntity && this.age < 5) || (entity.isPlayer && ((Player) entity).getGamemode() == Player.SPECTATOR)) { - continue; - } - - AxisAlignedBB axisalignedbb = entity.boundingBox.grow(0.3, 0.3, 0.3); - MovingObjectPosition ob = axisalignedbb.calculateIntercept(this, moveVector); - - if (ob == null) { - continue; - } - - double distance = this.distanceSquared(ob.hitVector); - - if (distance < nearDistance) { - nearDistance = distance; - nearEntity = entity; - } - } - - if (nearEntity != null) { - movingObjectPosition = MovingObjectPosition.fromEntity(nearEntity); - } - - if (movingObjectPosition != null) { - if (movingObjectPosition.entityHit != null) { - onCollideWithEntity(movingObjectPosition.entityHit); - return true; - } - } - - this.move(this.motionX, this.motionY, this.motionZ); - - if (this.isCollided && !this.hadCollision) { //collide with block - this.hadCollision = true; - - this.motionX = 0; - this.motionY = 0; - this.motionZ = 0; - - this.server.getPluginManager().callEvent(new ProjectileHitEvent(this, MovingObjectPosition.fromBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ(), -1, this))); - this.onHit(); - return false; - } else if (!this.isCollided && this.hadCollision) { - this.hadCollision = false; - } - - if (!this.hadCollision || Math.abs(this.motionX) > 0.00001 || Math.abs(this.motionY) > 0.00001 || Math.abs(this.motionZ) > 0.00001) { - updateRotation(); - hasUpdate = true; - } - - this.updateMovement(); - } - - return hasUpdate; - } - - public void updateRotation() { - double f = Math.sqrt((this.motionX * this.motionX) + (this.motionZ * this.motionZ)); - this.yaw = FastMath.atan2(this.motionX, this.motionZ) * 180 / Math.PI; - this.pitch = FastMath.atan2(this.motionY, f) * 180 / Math.PI; - } - - public void inaccurate(float modifier) { - ThreadLocalRandom rand = ThreadLocalRandom.current(); - - this.motionX += rand.nextGaussian() * 0.007499999832361937 * modifier; - this.motionY += rand.nextGaussian() * 0.007499999832361937 * modifier; - this.motionZ += rand.nextGaussian() * 0.007499999832361937 * modifier; - } - - protected void onHit() { - - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityShulkerBullet.java b/src/main/java/cn/nukkit/entity/projectile/EntityShulkerBullet.java deleted file mode 100644 index 4c6494067..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityShulkerBullet.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.level.Sound; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.potion.Effect; - -public class EntityShulkerBullet extends EntityProjectile { - - public static final int NETWORK_ID = 76; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getGravity() { - return 0.001f; - } - - @Override - public float getDrag() { - return 0.001f; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.40f; - } - - @Override - public float getHeight() { - return 0.40f; - } - - @Override - protected double getDamage() { - return 4; - } - - public EntityShulkerBullet(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityShulkerBullet(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 1200 || this.isCollided) { - this.close(); - } - - return super.onUpdate(currentTick); - } - - @Override - public boolean attack(EntityDamageEvent source) { - this.level.addSoundToViewers(this, Sound.MOB_SHULKER_BULLET_HIT); - this.close(); - return true; - } - - @Override - public void onCollideWithEntity(Entity entity) { - super.onCollideWithEntity(entity); - this.level.addSoundToViewers(this, Sound.MOB_SHULKER_BULLET_HIT); - entity.addEffect(Effect.getEffect(Effect.LEVITATION).setDuration(200)); - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntitySnowball.java b/src/main/java/cn/nukkit/entity/projectile/EntitySnowball.java deleted file mode 100644 index f46a2325c..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntitySnowball.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.item.ItemSnowball; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntitySnowball extends EntityProjectile { - - public static final int NETWORK_ID = 81; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - protected float getGravity() { - return 0.03f; - } - - @Override - protected float getDrag() { - return 0.01f; - } - - public EntitySnowball(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntitySnowball(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 1200 || this.isCollided) { - this.close(); - } - - return super.onUpdate(currentTick); - } - - @Override - public void onHit() { - ItemSnowball snowball = new ItemSnowball(); - level.addParticle(new ItemBreakParticle(this, snowball), null, 5); - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityThrownTrident.java b/src/main/java/cn/nukkit/entity/projectile/EntityThrownTrident.java deleted file mode 100644 index aa227950a..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityThrownTrident.java +++ /dev/null @@ -1,165 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.weather.EntityLightning; -import cn.nukkit.event.entity.EntityDamageByChildEntityEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.ProjectileHitEvent; -import cn.nukkit.event.weather.LightningStrikeEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.MovingObjectPosition; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -/** - * Created by PetteriM1 - */ -public class EntityThrownTrident extends EntityProjectile { - - public static final int NETWORK_ID = 73; - - protected Item trident; - - protected int pickupMode; - public boolean alreadyCollided; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.05f; - } - - @Override - public float getLength() { - return 0.5f; - } - - @Override - public float getHeight() { - return 0.05f; - } - - @Override - public float getGravity() { - return 0.05f; - } - - @Override - public float getDrag() { - return 0.01f; - } - - public EntityThrownTrident(FullChunk chunk, CompoundTag nbt) { - this(chunk, nbt, null); - } - - public EntityThrownTrident(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - super(chunk, nbt, shootingEntity); - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.trident = namedTag.contains("Trident") ? NBTIO.getItemHelper(namedTag.getCompound("Trident")) : Item.get(0); - this.pickupMode = namedTag.contains("pickup") ? namedTag.getByte("pickup") : PICKUP_ANY; - } - - @Override - public void saveNBT() { - super.saveNBT(); - - this.namedTag.put("Trident", NBTIO.putItemHelper(this.trident)); - this.namedTag.putByte("pickup", this.pickupMode); - } - - public Item getItem() { - return this.trident != null ? this.trident.clone() : Item.get(0); - } - - public void setItem(Item item) { - this.trident = item.clone(); - } - - @Override - protected double getBaseDamage() { - return 8; - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.age > 6000) { - this.close(); - } - - return super.onUpdate(currentTick); - } - - @Override - public void onCollideWithEntity(Entity entity) { - if (this.alreadyCollided) { - this.move(this.motionX, this.motionY, this.motionZ); - return; - } - - this.server.getPluginManager().callEvent(new ProjectileHitEvent(this, MovingObjectPosition.fromEntity(entity))); - float damage = this.getResultDamage(); - - EntityDamageEvent ev; - if (this.shootingEntity == null) { - ev = new EntityDamageByEntityEvent(this, entity, DamageCause.PROJECTILE, damage); - } else { - ev = new EntityDamageByChildEntityEvent(this.shootingEntity, this, entity, DamageCause.PROJECTILE, damage); - } - entity.attack(ev); - this.hadCollision = true; - this.onHit(); - this.close(); - if (trident != null && level.isThundering() && trident.hasEnchantment(Enchantment.ID_TRIDENT_CHANNELING) && this.canSeeSky()) { - EntityLightning bolt = new EntityLightning(this.getChunk(), getDefaultNBT(this)); - LightningStrikeEvent strikeEvent = new LightningStrikeEvent(level, bolt); - server.getPluginManager().callEvent(strikeEvent); - if (!strikeEvent.isCancelled()) { - bolt.spawnToAll(); - level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_ITEM_TRIDENT_THUNDER); - } else { - bolt.setEffect(false); - } - } - EntityThrownTrident newTrident = (EntityThrownTrident) Entity.createEntity("ThrownTrident", this); - if (this.getServer().suomiCraftPEMode()) { - newTrident.namedTag = this.namedTag.clone(); - } - newTrident.alreadyCollided = true; - newTrident.pickupMode = this.pickupMode; - newTrident.shootingEntity = this.shootingEntity; - newTrident.setItem(this.trident); - newTrident.spawnToAll(); - } - - @Override - public void onHit() { - this.getLevel().addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_ITEM_TRIDENT_HIT); - } - - public int getPickupMode() { - return this.pickupMode; - } - - public void setPickupMode(int pickupMode) { - this.pickupMode = pickupMode; - } -} diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityWitherSkull.java b/src/main/java/cn/nukkit/entity/projectile/EntityWitherSkull.java deleted file mode 100644 index 5673c6a67..000000000 --- a/src/main/java/cn/nukkit/entity/projectile/EntityWitherSkull.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.nukkit.entity.projectile; - -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.particle.SmokeParticle; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -public class EntityWitherSkull extends EntityProjectile { - - public static final int NETWORK_ID = 89; - - public EntityWitherSkull(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - @Override - public float getWidth() { - return 0.25f; - } - - @Override - public float getLength() { - return 0.25f; - } - - @Override - public float getHeight() { - return 0.25f; - } - - @Override - public float getGravity() { - return 0.01f; - } - - @Override - public float getDrag() { - return 0.01f; - } - - @Override - protected double getDamage() { - return 5; - } - - public EntityWitherSkull(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) { - this(chunk, nbt, shootingEntity, false); - } - - public EntityWitherSkull(FullChunk chunk, CompoundTag nbt, Entity shootingEntity, boolean critical) { - super(chunk, nbt, shootingEntity); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - if (this.timing != null) this.timing.startTiming(); - - if (this.age > 1200 || this.isCollided) { - this.close(); - } else { - this.level.addParticle(new SmokeParticle(this.add(this.getWidth() / 2 + Utils.rand(-100.0, 100.0) / 500, this.getHeight() / 2 + Utils.rand(-100.0, 100.0) / 500, this.getWidth() / 2 + Utils.rand(-100.0, 100.0) / 500))); - } - - if (this.timing != null) this.timing.stopTiming(); - - return super.onUpdate(currentTick); - } - - @Override - public void onCollideWithEntity(Entity entity) { - super.onCollideWithEntity(entity); - entity.addEffect(Effect.getEffect(Effect.WITHER).setDuration(200)); - } -} diff --git a/src/main/java/cn/nukkit/entity/weather/EntityLightning.java b/src/main/java/cn/nukkit/entity/weather/EntityLightning.java deleted file mode 100644 index dcc595d4b..000000000 --- a/src/main/java/cn/nukkit/entity/weather/EntityLightning.java +++ /dev/null @@ -1,142 +0,0 @@ -package cn.nukkit.entity.weather; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockFire; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.block.BlockIgniteEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -/** - * Created by boybook on 2016/2/27. - */ -public class EntityLightning extends Entity implements EntityLightningStrike { - - public static final int NETWORK_ID = 93; - - private boolean isEffect = true; - - public int state; - public int liveTime; - - @Override - public int getNetworkId() { - return NETWORK_ID; - } - - public EntityLightning(FullChunk chunk, CompoundTag nbt) { - super(chunk, nbt); - } - - @Override - protected void initEntity() { - super.initEntity(); - - this.state = 2; - this.liveTime = Utils.random.nextInt(3) + 1; - - if (isEffect && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK) && (this.server.getDifficulty() >= 2)) { - Block block = this.getLevelBlock(); - if (block.getId() == 0 || block.getId() == Block.TALL_GRASS) { - BlockFire fire = (BlockFire) Block.get(BlockID.FIRE); - fire.x = block.x; - fire.y = block.y; - fire.z = block.z; - fire.level = level; - this.getLevel().setBlock(fire, fire, true); - if (fire.isBlockTopFacingSurfaceSolid(fire.down()) || fire.canNeighborBurn()) { - - BlockIgniteEvent e = new BlockIgniteEvent(block, null, this, BlockIgniteEvent.BlockIgniteCause.LIGHTNING); - getServer().getPluginManager().callEvent(e); - - if (!e.isCancelled()) { - level.setBlock(fire, fire, true); - level.scheduleUpdate(fire, fire.tickRate() + Utils.random.nextInt(10)); - } - } - } - } - } - - public boolean isEffect() { - return this.isEffect; - } - - public void setEffect(boolean e) { - this.isEffect = e; - } - - @Override - public boolean attack(EntityDamageEvent source) { - source.setDamage(0); - return super.attack(source); - } - - @Override - public boolean onUpdate(int currentTick) { - if (this.closed) { - return false; - } - - int tickDiff = currentTick - this.lastUpdate; - - if (tickDiff <= 0 && !this.justCreated) { - return true; - } - - this.lastUpdate = currentTick; - - this.entityBaseTick(tickDiff); - - if (this.state == 2) { - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_THUNDER); - this.level.addLevelSoundEvent(this, LevelSoundEventPacket.SOUND_EXPLODE); - } - - this.state--; - - if (this.state < 0) { - if (this.liveTime == 0) { - this.close(); - return false; - } else if (this.state < -Utils.random.nextInt(10)) { - this.liveTime--; - this.state = 1; - - if (this.isEffect && this.level.gameRules.getBoolean(GameRule.DO_FIRE_TICK)) { - Block block = this.getLevelBlock(); - - if (block.getId() == Block.AIR || block.getId() == Block.TALL_GRASS) { - BlockIgniteEvent e = new BlockIgniteEvent(block, null, this, BlockIgniteEvent.BlockIgniteCause.LIGHTNING); - getServer().getPluginManager().callEvent(e); - - if (!e.isCancelled()) { - Block fire = Block.get(BlockID.FIRE); - this.level.setBlock(block, fire); - this.getLevel().scheduleUpdate(fire, fire.tickRate()); - } - } - } - } - } - - if (this.state >= 0) { - if (this.isEffect) { - AxisAlignedBB bb = getBoundingBox().grow(3, 3, 3); - bb.maxX += 6; - - for (Entity entity : this.level.getCollidingEntities(bb, this)) { - entity.onStruckByLightning(this); - } - } - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/entity/weather/EntityLightningStrike.java b/src/main/java/cn/nukkit/entity/weather/EntityLightningStrike.java deleted file mode 100644 index 21fd57fc3..000000000 --- a/src/main/java/cn/nukkit/entity/weather/EntityLightningStrike.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.nukkit.entity.weather; - -/** - * Created by funcraft on 2016/2/27. - */ -public interface EntityLightningStrike extends EntityWeather { - - boolean isEffect(); - - void setEffect(boolean e); -} diff --git a/src/main/java/cn/nukkit/entity/weather/EntityWeather.java b/src/main/java/cn/nukkit/entity/weather/EntityWeather.java deleted file mode 100644 index 60da5022f..000000000 --- a/src/main/java/cn/nukkit/entity/weather/EntityWeather.java +++ /dev/null @@ -1,7 +0,0 @@ -package cn.nukkit.entity.weather; - -/** - * Created by boybook on 2016/2/27. - */ -public interface EntityWeather { -} diff --git a/src/main/java/cn/nukkit/event/Cancellable.java b/src/main/java/cn/nukkit/event/Cancellable.java deleted file mode 100644 index 30a47eec3..000000000 --- a/src/main/java/cn/nukkit/event/Cancellable.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.nukkit.event; - -/** - * Created by Nukkit Team. - */ -public interface Cancellable { - - boolean isCancelled(); - - void setCancelled(); - - void setCancelled(boolean forceCancel); -} diff --git a/src/main/java/cn/nukkit/event/Event.java b/src/main/java/cn/nukkit/event/Event.java deleted file mode 100644 index 40c9ed022..000000000 --- a/src/main/java/cn/nukkit/event/Event.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.event; - -import cn.nukkit.utils.EventException; - -/** - * 描述服务器中可能发生的事情的类。
- * Describes things that happens in the server. - * - * 服务器中可能发生的事情称作事件。定义一个需要它在一个事件发生时被运行的过程,这个过程称作监听器
- * Things that happens in the server is called a event. Define a procedure that should be executed - * when a event happens, this procedure is called a listener. - * - * Nukkit调用事件的处理器时,会通过参数的类型判断需要被监听的事件。
- * When Nukkit is calling a handler, the event needed to listen is judged by the type of the parameter. - * - * 关于监听器的实现,参阅:{@link Listener}
- * For the way to implement a listener, see: {@link cn.nukkit.event.Listener} - * - * @author Unknown(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.event.EventHandler - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public abstract class Event { - - protected String eventName = null; - private boolean isCancelled = false; - - final public String getEventName() { - return eventName == null ? getClass().getName() : eventName; - } - - public boolean isCancelled() { - if (!(this instanceof Cancellable)) { - throw new EventException("Event is not Cancellable"); - } - return isCancelled; - } - - public void setCancelled() { - setCancelled(true); - } - - public void setCancelled(boolean value) { - if (!(this instanceof Cancellable)) { - throw new EventException("Event is not Cancellable"); - } - isCancelled = value; - } -} diff --git a/src/main/java/cn/nukkit/event/EventHandler.java b/src/main/java/cn/nukkit/event/EventHandler.java deleted file mode 100644 index ac7cdf877..000000000 --- a/src/main/java/cn/nukkit/event/EventHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.event; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 定义一个事件的处理器的注解。
- * Annotation that defines a handler. - * - * 一个处理器的重要程度被称作处理器的优先级,优先级高的处理器有更多的决定权。参见:{@link #priority()}
- * The importance of a handler is called its priority, handlers with higher priority speaks louder then - * lower ones. See: {@link #priority()} - * - * 处理器可以选择忽略或不忽略被取消的事件,这种特性可以在{@link #ignoreCancelled()}中定义。
- * A handler can choose to ignore a cancelled event or not, that can be defined in {@link #ignoreCancelled()}. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author null(javadoc) @ Nukkit Project - * @see cn.nukkit.event.Listener - * @see cn.nukkit.event.Event - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface EventHandler { - /** - * 定义这个处理器的优先级。
- * Define the priority of the handler. - * - * Nukkit调用处理器时会按照优先级从低到高的顺序调用,这样保证了高优先级的监听器能覆盖低优先级监听器做出的处理。 - * 调用的先后顺序如下:
- * When Nukkit calls all handlers, ones with lower priority is called earlier, - * that make handlers with higher priority can replace the decisions made by lower ones. - * The order that Nukkit call handlers is from the first to the last as: - *

    - *
  1. EventPriority.LOWEST - *
  2. EventPriority.LOW - *
  3. EventPriority.NORMAL - *
  4. EventPriority.HIGH - *
  5. EventPriority.HIGHEST - *
  6. EventPriority.MONITOR - *
- * - * @return 这个处理器的优先级。
The priority of this handler. - */ - EventPriority priority() default EventPriority.NORMAL; - - /** - * 定义这个处理器是否忽略被取消的事件。
- * Define if the handler ignores a cancelled event. - * - * 如果为{@code true}而且事件发生,这个处理器不会被调用,反之相反。
- * If ignoreCancelled is {@code true} and the event is cancelled, the method is - * not called. Otherwise, the method is always called. - * - * @return 这个处理器是否忽略被取消的事件。
Whether cancelled events should be ignored. - */ - boolean ignoreCancelled() default false; -} diff --git a/src/main/java/cn/nukkit/event/EventPriority.java b/src/main/java/cn/nukkit/event/EventPriority.java deleted file mode 100644 index 232c5e8d3..000000000 --- a/src/main/java/cn/nukkit/event/EventPriority.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.event; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public enum EventPriority { - - /** - * Event call is of very low importance and should be ran first, to allow - * other plugins to further customise the outcome - */ - LOWEST(0), - /** - * Event call is of low importance - */ - LOW(1), - /** - * Event call is neither important nor unimportant, and may be ran - * normally - */ - NORMAL(2), - /** - * Event call is of high importance - */ - HIGH(3), - /** - * Event call is critical and must have the final say in what happens - * to the event - */ - HIGHEST(4), - /** - * Event is listened to purely for monitoring the outcome of an event. - * - * No modifications to the event should be made under this priority - */ - MONITOR(5); - - private final int slot; - - EventPriority(int slot) { - this.slot = slot; - } - - public int getSlot() { - return slot; - } -} diff --git a/src/main/java/cn/nukkit/event/HandlerList.java b/src/main/java/cn/nukkit/event/HandlerList.java deleted file mode 100644 index 6c63a2abc..000000000 --- a/src/main/java/cn/nukkit/event/HandlerList.java +++ /dev/null @@ -1,152 +0,0 @@ -package cn.nukkit.event; - -import cn.nukkit.plugin.Plugin; -import cn.nukkit.plugin.RegisteredListener; - -import java.util.*; - -/** - * Created by Nukkit Team. - */ -public class HandlerList { - - private volatile RegisteredListener[] handlers = null; - - private final EnumMap> handlerslots; - - private static final ArrayList allLists = new ArrayList<>(); - - public static void bakeAll() { - synchronized (allLists) { - for (HandlerList h : allLists) { - h.bake(); - } - } - } - - public static void unregisterAll() { - synchronized (allLists) { - for (HandlerList h : allLists) { - synchronized (h) { - for (List list : h.handlerslots.values()) { - list.clear(); - } - h.handlers = null; - } - } - } - } - - public static void unregisterAll(Plugin plugin) { - synchronized (allLists) { - for (HandlerList h : allLists) { - h.unregister(plugin); - } - } - } - - public static void unregisterAll(Listener listener) { - synchronized (allLists) { - for (HandlerList h : allLists) { - h.unregister(listener); - } - } - } - - public HandlerList() { - handlerslots = new EnumMap<>(EventPriority.class); - for (EventPriority o : EventPriority.values()) { - handlerslots.put(o, new ArrayList<>()); - } - synchronized (allLists) { - allLists.add(this); - } - } - - public synchronized void register(RegisteredListener listener) { - if (handlerslots.get(listener.getPriority()).contains(listener)) - throw new IllegalStateException("This listener is already registered to priority " + listener.getPriority().toString()); - handlers = null; - handlerslots.get(listener.getPriority()).add(listener); - } - - public void registerAll(Collection listeners) { - for (RegisteredListener listener : listeners) { - register(listener); - } - } - - public synchronized void unregister(RegisteredListener listener) { - if (handlerslots.get(listener.getPriority()).remove(listener)) { - handlers = null; - } - } - - public synchronized void unregister(Plugin plugin) { - boolean changed = false; - for (List list : handlerslots.values()) { - for (ListIterator i = list.listIterator(); i.hasNext(); ) { - if (i.next().getPlugin().equals(plugin)) { - i.remove(); - changed = true; - } - } - } - if (changed) handlers = null; - } - - public synchronized void unregister(Listener listener) { - boolean changed = false; - for (List list : handlerslots.values()) { - for (ListIterator i = list.listIterator(); i.hasNext(); ) { - if (i.next().getListener().equals(listener)) { - i.remove(); - changed = true; - } - } - } - if (changed) handlers = null; - } - - public synchronized void bake() { - if (handlers != null) return; // don't re-bake when still valid - List entries = new ArrayList<>(); - for (Map.Entry> entry : handlerslots.entrySet()) { - entries.addAll(entry.getValue()); - } - handlers = entries.toArray(new RegisteredListener[0]); - } - - public RegisteredListener[] getRegisteredListeners() { - RegisteredListener[] handlers; - while ((handlers = this.handlers) == null) { - bake(); - } // This prevents fringe cases of returning null - return handlers; - } - - - public static ArrayList getRegisteredListeners(Plugin plugin) { - ArrayList listeners = new ArrayList<>(); - synchronized (allLists) { - for (HandlerList h : allLists) { - synchronized (h) { - for (List list : h.handlerslots.values()) { - for (RegisteredListener listener : list) { - if (listener.getPlugin().equals(plugin)) { - listeners.add(listener); - } - } - } - } - } - } - return listeners; - } - - public static ArrayList getHandlerLists() { - synchronized (allLists) { - return new ArrayList<>(allLists); - } - } -} diff --git a/src/main/java/cn/nukkit/event/Listener.java b/src/main/java/cn/nukkit/event/Listener.java deleted file mode 100644 index bf3006955..000000000 --- a/src/main/java/cn/nukkit/event/Listener.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.event; - -/** - * 所有的监听事件的类必须实现的接口。
- * An interface implemented by all classes that handles events. - * - * 插件要监听事件,需要一个类实现这个接口,在这个类里编写方法来监听。这个类称作监听类。 - * 监听类中监听事件的方法称作事件的处理器。一个监听类可以包含多个不同的事件处理器。 - * 实现监听类后,插件需要在插件管理器中注册这个监听类。
- * If a plugin need to listen events, there must be a class implement this interface. This class is called a listener class. - * Methods with specified parameters should be written in order to listen events. This method is called a handler. - * One listener class could contain many different handlers. - * After implemented the listener class, plugin should register it in plugin manager. - * - * 事件监听器被注册后,Nukkit会在需要监听的事件发生时,使用反射来调用监听类中对应的处理器。
- * After registered, Nukkit will call the handler in the listener classes by reflection when a event happens. - * - * 这是一个编写监听类和处理器的例子。注意的是,标签{@code @EventHandler}和参数的类型是必需的:
- * Here is an example for writing a listener class and a handler method. - * Note that for the handler, tag {@code @EventHandler} and the parameter is required: - *
- * public class ExampleListener implements Listener {
- *    {@code @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = false)}
- *     public void onBlockBreak(BlockBreakEvent event) {
- *          int blockID = event.getBlock().getId();
- *          if (blockID == Block.STONE) {
- *              event.getPlayer().sendMessage("Oops, my ExampleListener won't let you break a stone!")
- *              event.setCancelled(true);
- *          }
- *     }
- * }
- * 
- * - * 关于注册监听类,请看:{@link cn.nukkit.plugin.PluginManager#registerEvents}.
- * For registering listener class, See: {@link cn.nukkit.plugin.PluginManager#registerEvents}. - * - * 关于处理器的优先级和处理器是否忽略被取消的事件,请看:{@link EventHandler}.
- * For the priority of handler and whether the handler ignore cancelled events or not, See: {@link EventHandler}. - * - * @author Unknown(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.event.Event - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface Listener { -} diff --git a/src/main/java/cn/nukkit/event/block/AnvilDamageEvent.java b/src/main/java/cn/nukkit/event/block/AnvilDamageEvent.java deleted file mode 100644 index 0254fdf33..000000000 --- a/src/main/java/cn/nukkit/event/block/AnvilDamageEvent.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class AnvilDamageEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final int oldDamage; - private int newDamage; - private DamageCause cause; - private final Player player; - - /** - * This event is called when an anvil is damaged. - * @param block The block (anvil) that has been damaged. - * @param oldDamage Old damage value. - * @param newDamage New damage value. - * @param cause Cause of the anvil being damaged. - * @param player The player who used the anvil. - */ - public AnvilDamageEvent(Block block, int oldDamage, int newDamage, DamageCause cause, Player player) { - super(block); - this.oldDamage = oldDamage; - this.newDamage = newDamage; - this.cause = cause; - this.player = player; - } - - public int getOldDamage() { - return this.oldDamage; - } - - public int getNewDamage() { - return this.newDamage; - } - - public void setNewDamage(int newDamage) { - this.newDamage = newDamage; - } - - public DamageCause getCause() { - return this.cause; - } - - public Player getPlayer() { - return this.player; - } - - public enum DamageCause { - USE, - FALL - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockBreakEvent.java b/src/main/java/cn/nukkit/event/block/BlockBreakEvent.java deleted file mode 100644 index fdf2bd7c8..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockBreakEvent.java +++ /dev/null @@ -1,102 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; - -/** - * Event for Block being broken. - * @author MagicDroidX - */ -public class BlockBreakEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final Player player; - - protected final Item item; - protected final BlockFace face; - - protected boolean instaBreak; - protected Item[] blockDrops; - protected int blockXP; - - protected boolean fastBreak; - - /** - * This event is called when a block is broken. - * @param player Player who broke the block. - * @param block Block that was broken. - * @param item Item used to break the block. - * @param drops Items dropped by the block. - */ - public BlockBreakEvent(Player player, Block block, Item item, Item[] drops) { - this(player, block, item, drops, false, false); - } - - public BlockBreakEvent(Player player, Block block, Item item, Item[] drops, boolean instaBreak) { - this(player, block, item, drops, instaBreak, false); - } - - public BlockBreakEvent(Player player, Block block, Item item, Item[] drops, boolean instaBreak, boolean fastBreak) { - this(player, block, null, item, drops, instaBreak, fastBreak); - } - - public BlockBreakEvent(Player player, Block block, BlockFace face, Item item, Item[] drops, boolean instaBreak, boolean fastBreak) { - super(block); - this.face = face; - this.item = item; - this.player = player; - this.instaBreak = instaBreak; - this.blockDrops = drops; - this.fastBreak = fastBreak; - this.blockXP = block.getDropExp(); - } - - public Player getPlayer() { - return player; - } - - public BlockFace getFace() { - return face; - } - - public Item getItem() { - return item; - } - - public boolean getInstaBreak() { - return this.instaBreak; - } - - public Item[] getDrops() { - return blockDrops; - } - - public void setDrops(Item[] drops) { - this.blockDrops = drops; - } - - public int getDropExp() { - return this.blockXP; - } - - public void setDropExp(int xp) { - this.blockXP = xp; - } - - public void setInstaBreak(boolean instaBreak) { - this.instaBreak = instaBreak; - } - - public boolean isFastBreak() { - return this.fastBreak; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/block/BlockBurnEvent.java b/src/main/java/cn/nukkit/event/block/BlockBurnEvent.java deleted file mode 100644 index 5710e7181..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockBurnEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block being burned. - * @author MagicDroidX - */ -public class BlockBurnEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - /** - * This event is called when a block is burned. - * @param block Block that is burned. - */ - public BlockBurnEvent(Block block) { - super(block); - } - - public static HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockEvent.java b/src/main/java/cn/nukkit/event/block/BlockEvent.java deleted file mode 100644 index bb1e39abe..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Event; - -/** - * Generic block event. - * @author MagicDroidX - */ -public abstract class BlockEvent extends Event { - - protected final Block block; - - /** - * Generic block event. - * NOTICE: This event isn't meant to be called. - * @param block Block. - */ - public BlockEvent(Block block) { - this.block = block; - } - - public Block getBlock() { - return block; - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockFadeEvent.java b/src/main/java/cn/nukkit/event/block/BlockFadeEvent.java deleted file mode 100644 index 24865a187..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockFadeEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block fading. - */ -public class BlockFadeEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block newState; - - /** - * Currently used when: - * - Snow melts because of block light. - * - Ice melts because of block light. - * - Glowing redstone ore turns to normal redstone ore. - * @param block Block that has faded/melted. - * @param newState New state of the block. - */ - public BlockFadeEvent(Block block, Block newState) { - super(block); - this.newState = newState; - } - - public Block getNewState() { - return newState; - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockFallEvent.java b/src/main/java/cn/nukkit/event/block/BlockFallEvent.java deleted file mode 100644 index d4b5f59d7..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockFallEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block falling - */ -public class BlockFallEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - /** - * This event is called when a block is falling. - * @param block Block that has fallen. - */ - public BlockFallEvent(Block block) { - super(block); - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockFormEvent.java b/src/main/java/cn/nukkit/event/block/BlockFormEvent.java deleted file mode 100644 index 1f631c67f..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockFormEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for forming blocks. - * @author MagicDroidX - */ -public class BlockFormEvent extends BlockGrowEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - /** - * Event for forming blocks. - * NOTICE: This event isn't meant to be called. - * @param block Block affected by the event. - * @param newState New state of the block. - */ - public BlockFormEvent(Block block, Block newState) { - super(block, newState); - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockFromToEvent.java b/src/main/java/cn/nukkit/event/block/BlockFromToEvent.java deleted file mode 100644 index bbb9c9f94..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockFromToEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block change "From To". - */ -public class BlockFromToEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Block to; - - /** - * Event called on block changed from one type to another. E.g Redstone. - * @param block Block that is being replaced. - * @param to The replacement Block - */ - public BlockFromToEvent(Block block, Block to) { - super(block); - this.to = to; - } - - public Block getFrom() { - return getBlock(); - } - - public Block getTo() { - return to; - } - - public void setTo(Block newTo) { - to = newTo; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/block/BlockGrowEvent.java b/src/main/java/cn/nukkit/event/block/BlockGrowEvent.java deleted file mode 100644 index 03a18ba30..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockGrowEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block growth. - * @author MagicDroidX - */ -public class BlockGrowEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block newState; - - /** - * Called on block grow. - * @param block Block affected by event E.g Vine. - * @param newState New state of the affected block. - */ - public BlockGrowEvent(Block block, Block newState) { - super(block); - this.newState = newState; - } - - public Block getNewState() { - return newState; - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockIgniteEvent.java b/src/main/java/cn/nukkit/event/block/BlockIgniteEvent.java deleted file mode 100644 index de85bb22b..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockIgniteEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block fire (ignite). - */ -public class BlockIgniteEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block source; - private final Entity entity; - private final BlockIgniteCause cause; - - /** - * Block ignite event is called when a block is ignited (lit on fire). - * @param block Block that has been ignited. - * @param source Block source of ignition. - * @param entity Entity source of ignition. - * @param cause Cause of the ignition. - */ - public BlockIgniteEvent(Block block, Block source, Entity entity, BlockIgniteCause cause) { - super(block); - this.source = source; - this.entity = entity; - this.cause = cause; - } - - public Block getSource() { - return source; - } - - public Entity getEntity() { - return entity; - } - - public BlockIgniteCause getCause() { - return cause; - } - - public enum BlockIgniteCause { - EXPLOSION, - FIREBALL, - FLINT_AND_STEEL, - LAVA, - LIGHTNING, - SPREAD - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockPistonChangeEvent.java b/src/main/java/cn/nukkit/event/block/BlockPistonChangeEvent.java deleted file mode 100644 index e87b51ada..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockPistonChangeEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block piston change. - * @author CreeperFace on 2.8.2017. - */ -public class BlockPistonChangeEvent extends BlockEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private int oldPower; - private int newPower; - - /** - * This event is called on piston activation/deactivation/change. - * @param block Block (Piston) that is affected. - * @param oldPower Old power (charge) of piston. - * @param newPower New charge (updated) of piston. - */ - public BlockPistonChangeEvent(Block block, int oldPower, int newPower) { - super(block); - this.oldPower = oldPower; - this.newPower = newPower; - } - - public int getOldPower() { - return oldPower; - } - - public int getNewPower() { - return newPower; - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockPlaceEvent.java b/src/main/java/cn/nukkit/event/block/BlockPlaceEvent.java deleted file mode 100644 index 3ada1db81..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockPlaceEvent.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * Event for a block being placed. - * @author MagicDroidX - */ -public class BlockPlaceEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final Player player; - - protected final Item item; - - protected final Block blockReplace; - protected final Block blockAgainst; - - /** - * This event is called when a block is placed. - * @param player Player who placed block. - * @param blockPlace Placed Block. - * @param blockReplace Block replace. - * @param blockAgainst Block against. - * @param item Item that was placed. - */ - public BlockPlaceEvent(Player player, Block blockPlace, Block blockReplace, Block blockAgainst, Item item) { - super(blockPlace); - this.blockReplace = blockReplace; - this.blockAgainst = blockAgainst; - this.item = item; - this.player = player; - } - - public Player getPlayer() { - return player; - } - - public Item getItem() { - return item; - } - - public Block getBlockReplace() { - return blockReplace; - } - - public Block getBlockAgainst() { - return blockAgainst; - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockRedstoneEvent.java b/src/main/java/cn/nukkit/event/block/BlockRedstoneEvent.java deleted file mode 100644 index 49fdb9322..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockRedstoneEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.HandlerList; - -/** - * Event for Redstone Block. - * @author CreeperFace on 12.5.2017. - */ -public class BlockRedstoneEvent extends BlockEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final int oldPower; - private final int newPower; - - /** - * Event called on redstone change. E.g Redstone power. - * @param block Block that is affected. - * @param oldPower Old power of the block. - * @param newPower New power of the block. - */ - public BlockRedstoneEvent(Block block, int oldPower, int newPower) { - super(block); - this.oldPower = oldPower; - this.newPower = newPower; - } - - public int getOldPower() { - return oldPower; - } - - public int getNewPower() { - return newPower; - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockSpreadEvent.java b/src/main/java/cn/nukkit/event/block/BlockSpreadEvent.java deleted file mode 100644 index baad5406c..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockSpreadEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block spread. - * @author MagicDroidX - */ -public class BlockSpreadEvent extends BlockFormEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block source; - - /** - * Event for block spread, such as grass or mycelium. - * @param block Block that is being spread. - * @param source The source block. - * @param newState New state of spread block. - */ - public BlockSpreadEvent(Block block, Block source, Block newState) { - super(block, newState); - this.source = source; - } - - public Block getSource() { - return source; - } -} diff --git a/src/main/java/cn/nukkit/event/block/BlockUpdateEvent.java b/src/main/java/cn/nukkit/event/block/BlockUpdateEvent.java deleted file mode 100644 index 35127f03d..000000000 --- a/src/main/java/cn/nukkit/event/block/BlockUpdateEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Block Update - * @author MagicDroidX - */ -public class BlockUpdateEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - /** - * Event called on a block being updated. - * @param block Block updated. - */ - public BlockUpdateEvent(Block block) { - super(block); - } -} diff --git a/src/main/java/cn/nukkit/event/block/DoorToggleEvent.java b/src/main/java/cn/nukkit/event/block/DoorToggleEvent.java deleted file mode 100644 index 40ec3019f..000000000 --- a/src/main/java/cn/nukkit/event/block/DoorToggleEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for door Interactions. - * @author Snake1999 on 2016/1/22. - */ -public class DoorToggleEvent extends BlockUpdateEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Player player; - - /** - * Event for player door interactions. - * @param block Door block that has been affected by the player. - * @param player Player that is interacting with the door. - */ - public DoorToggleEvent(Block block, Player player) { - super(block); - this.player = player; - } - - public void setPlayer(Player player) { - this.player = player; - } - - public Player getPlayer() { - return player; - } -} diff --git a/src/main/java/cn/nukkit/event/block/ItemFrameDropItemEvent.java b/src/main/java/cn/nukkit/event/block/ItemFrameDropItemEvent.java deleted file mode 100644 index ca9fb143e..000000000 --- a/src/main/java/cn/nukkit/event/block/ItemFrameDropItemEvent.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.blockentity.BlockEntityItemFrame; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * Event for Item Frame drops. - * @author Pub4Game on 03.07.2016. - */ -public class ItemFrameDropItemEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private final Player player; - private final Item item; - private final BlockEntityItemFrame itemFrame; - - /** - * Event for item being dropped from an item frame - * @param player Player related to the event. - * @param block Block (item frame) affected by change. - * @param itemFrame Item frame block entity. - * @param item Item that is dropped/contained in the item frame. - */ - public ItemFrameDropItemEvent(Player player, Block block, BlockEntityItemFrame itemFrame, Item item) { - super(block); - this.player = player; - this.itemFrame = itemFrame; - this.item = item; - } - - public static HandlerList getHandlers() { - return handlers; - } - - public Player getPlayer() { - return player; - } - - public BlockEntityItemFrame getItemFrame() { - return itemFrame; - } - - public Item getItem() { - return item; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/block/LeavesDecayEvent.java b/src/main/java/cn/nukkit/event/block/LeavesDecayEvent.java deleted file mode 100644 index 98050b203..000000000 --- a/src/main/java/cn/nukkit/event/block/LeavesDecayEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for Leaves decay. - * @author MagicDroidX - */ -public class LeavesDecayEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - /** - * Event for leaves decaying / disappearing. - * @param block Leaves block. - */ - public LeavesDecayEvent(Block block) { - super(block); - } -} diff --git a/src/main/java/cn/nukkit/event/block/LiquidFlowEvent.java b/src/main/java/cn/nukkit/event/block/LiquidFlowEvent.java deleted file mode 100644 index d2badb633..000000000 --- a/src/main/java/cn/nukkit/event/block/LiquidFlowEvent.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockLiquid; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for liquid flow. - */ -public class LiquidFlowEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block to; - private final BlockLiquid source; - private final int newFlowDecay; - /** - * Event for liquid flowing (water/lava). - * @param to Flowing from one place to another. - * @param source Source of liquid flow. - * @param newFlowDecay Number for when water stops flowing. - */ - public LiquidFlowEvent(Block to, BlockLiquid source, int newFlowDecay) { - super(to); - this.to = to; - this.source = source; - this.newFlowDecay = newFlowDecay; - } - - public int getNewFlowDecay() { - return this.newFlowDecay; - } - - public BlockLiquid getSource() { - return this.source; - } - - public Block getTo() { - return this.to; - } -} diff --git a/src/main/java/cn/nukkit/event/block/SignChangeEvent.java b/src/main/java/cn/nukkit/event/block/SignChangeEvent.java deleted file mode 100644 index 6cf410290..000000000 --- a/src/main/java/cn/nukkit/event/block/SignChangeEvent.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for sign text change. - * @author MagicDroidX - */ -public class SignChangeEvent extends BlockEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Player player; - - private final String[] lines; - - /** - * This event is called when a sign is being edited. - * @param block Sign block. - * @param player Player that edited the sign. - * @param lines Sign text (String[4]) after the edit. - */ - public SignChangeEvent(Block block, Player player, String[] lines) { - super(block); - this.player = player; - this.lines = lines; - } - - public Player getPlayer() { - return player; - } - - public String[] getLines() { - return lines; - } - - public String getLine(int index) { - return this.lines[index]; - } - - public void setLine(int index, String line) { - this.lines[index] = line; - } -} diff --git a/src/main/java/cn/nukkit/event/block/WaterFrostEvent.java b/src/main/java/cn/nukkit/event/block/WaterFrostEvent.java deleted file mode 100644 index 8e752842e..000000000 --- a/src/main/java/cn/nukkit/event/block/WaterFrostEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.event.block; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Event for water freezing. - */ -public class WaterFrostEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - /** - * Event called on water freezing. - * @param block Block frozen. - */ - public WaterFrostEvent(Block block) { - super(block); - } -} diff --git a/src/main/java/cn/nukkit/event/entity/CreatureSpawnEvent.java b/src/main/java/cn/nukkit/event/entity/CreatureSpawnEvent.java deleted file mode 100644 index 916256115..000000000 --- a/src/main/java/cn/nukkit/event/entity/CreatureSpawnEvent.java +++ /dev/null @@ -1,174 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.Event; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Position; -import cn.nukkit.nbt.tag.CompoundTag; - -public class CreatureSpawnEvent extends Event implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final SpawnReason reason; - private final int entityNetworkId; - private final Position position; - private final CompoundTag compoundTag; - - public CreatureSpawnEvent(int networkId, SpawnReason reason) { - this(networkId, new Position(), new CompoundTag(), reason); - } - - public CreatureSpawnEvent(int networkId, Position position, SpawnReason reason) { - this(networkId, position, new CompoundTag(), reason); - } - - public CreatureSpawnEvent(int networkId, Position position, CompoundTag nbt, SpawnReason reason) { - this.reason = reason; - this.entityNetworkId = networkId; - this.position = position; - this.compoundTag = nbt; - } - - public SpawnReason getReason() { - return reason; - } - - public int getEntityNetworkId() { - return entityNetworkId; - } - - public CompoundTag getCompoundTag() { - return compoundTag; - } - - public Position getPosition() { - return position; - } - - /** - * An enum to specify the type of spawning - */ - public enum SpawnReason { - - /** - * When something spawns from natural means - */ - NATURAL, - /** - * When an entity spawns as a jockey of another entity (mostly spider - * jockeys) - */ - JOCKEY, - /** - * When a creature spawns from a spawner - */ - SPAWNER, - /** - * When a creature spawns from an egg - */ - EGG, - /** - * When a creature spawns from a spawn egg - */ - SPAWN_EGG, - /** - * When a creature spawns because of a lightning strike - */ - LIGHTNING, - /** - * When a snowman is spawned by being built - */ - BUILD_SNOWMAN, - /** - * When an iron golem is spawned by being built - */ - BUILD_IRONGOLEM, - /** - * When a wither boss is spawned by being built - */ - BUILD_WITHER, - /** - * When an iron golem is spawned to defend a village - */ - VILLAGE_DEFENSE, - /** - * When a zombie is spawned to invade a village - */ - VILLAGE_INVASION, - /** - * When an animal breeds to create a child - */ - BREEDING, - /** - * When a slime splits - */ - SLIME_SPLIT, - /** - * When an entity calls for reinforcements - */ - REINFORCEMENTS, - /** - * When a creature is spawned by nether portal - */ - NETHER_PORTAL, - /** - * When a creature is spawned by a dispenser dispensing an egg - */ - DISPENSE_EGG, - /** - * When a zombie infects a villager - */ - INFECTION, - /** - * When a villager is cured from infection - */ - CURED, - /** - * When an ocelot has a baby spawned along with them - */ - OCELOT_BABY, - /** - * When a silverfish spawns from a block - */ - SILVERFISH_BLOCK, - /** - * When an entity spawns as a mount of another entity (mostly chicken - * jockeys) - */ - MOUNT, - /** - * When an entity spawns as a trap for players approaching - */ - TRAP, - /** - * When an entity is spawned as a result of ender pearl usage - */ - ENDER_PEARL, - /** - * When an entity is spawned as a result of the entity it is being - * perched on jumping or being damaged - */ - SHOULDER_ENTITY, - /** - * When a creature is spawned by another entity drowning - */ - DROWNED, - /** - * When an cow is spawned by shearing a mushroom cow - */ - SHEARED, - /** - * When a creature is spawned by plugins - */ - CUSTOM, - /** - * When SpawnReason is missing - */ - DEFAULT - } -} diff --git a/src/main/java/cn/nukkit/event/entity/CreeperPowerEvent.java b/src/main/java/cn/nukkit/event/entity/CreeperPowerEvent.java deleted file mode 100644 index 0be43d60e..000000000 --- a/src/main/java/cn/nukkit/event/entity/CreeperPowerEvent.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.mob.EntityCreeper; -import cn.nukkit.entity.weather.EntityLightningStrike; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class CreeperPowerEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final PowerCause cause; - private EntityLightningStrike bolt; - - public CreeperPowerEvent(final EntityCreeper creeper, final EntityLightningStrike bolt, final PowerCause cause) { - this(creeper, cause); - this.bolt = bolt; - } - - public CreeperPowerEvent(final EntityCreeper creeper, final PowerCause cause) { - this.entity = creeper; - this.cause = cause; - } - - @Override - public EntityCreeper getEntity() { - return (EntityCreeper) super.getEntity(); - } - - /** - * Gets the lightning bolt which is striking the Creeper. - * - * @return The Entity for the lightning bolt which is striking the Creeper - */ - public EntityLightningStrike getLightning() { - return bolt; - } - - /** - * Gets the cause of the creeper being (un)powered. - * - * @return A PowerCause value detailing the cause of change in power. - */ - public PowerCause getCause() { - return cause; - } - - /** - * An enum to specify the cause of the change in power - */ - public enum PowerCause { - - /** - * Power change caused by a lightning bolt - * - * Powered state: true - */ - LIGHTNING, - /** - * Power change caused by something else (probably a plugin) - * - * Powered state: true - */ - SET_ON, - /** - * Power change caused by something else (probably a plugin) - * - * Powered state: false - */ - SET_OFF - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityArmorChangeEvent.java b/src/main/java/cn/nukkit/event/entity/EntityArmorChangeEvent.java deleted file mode 100644 index d2131139c..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityArmorChangeEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityArmorChangeEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Item oldItem; - private Item newItem; - private final int slot; - - public EntityArmorChangeEvent(Entity entity, Item oldItem, Item newItem, int slot) { - this.entity = entity; - this.oldItem = oldItem; - this.newItem = newItem; - this.slot = slot; - } - - public int getSlot() { - return slot; - } - - public Item getNewItem() { - return newItem; - } - - public void setNewItem(Item newItem) { - this.newItem = newItem; - } - - public Item getOldItem() { - return oldItem; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityBlockChangeEvent.java b/src/main/java/cn/nukkit/event/entity/EntityBlockChangeEvent.java deleted file mode 100644 index 507dfcd86..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityBlockChangeEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class EntityBlockChangeEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block from; - private final Block to; - - public EntityBlockChangeEvent(Entity entity, Block from, Block to) { - this.entity = entity; - this.from = from; - this.to = to; - } - - public Block getFrom() { - return from; - } - - public Block getTo() { - return to; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityCombustByBlockEvent.java b/src/main/java/cn/nukkit/event/entity/EntityCombustByBlockEvent.java deleted file mode 100644 index 903430ff1..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityCombustByBlockEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; - -/** - * @author Box - * Nukkit Project - */ -public class EntityCombustByBlockEvent extends EntityCombustEvent { - - protected final Block combuster; - - public EntityCombustByBlockEvent(Block combuster, Entity combustee, int duration) { - super(combustee, duration); - this.combuster = combuster; - } - - public Block getCombuster() { - return combuster; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityCombustByEntityEvent.java b/src/main/java/cn/nukkit/event/entity/EntityCombustByEntityEvent.java deleted file mode 100644 index 6c4477b5b..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityCombustByEntityEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityCombustByEntityEvent extends EntityCombustEvent { - - protected final Entity combuster; - - public EntityCombustByEntityEvent(Entity combuster, Entity combustee, int duration) { - super(combustee, duration); - this.combuster = combuster; - } - - public Entity getCombuster() { - return combuster; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityCombustEvent.java b/src/main/java/cn/nukkit/event/entity/EntityCombustEvent.java deleted file mode 100644 index c125568dd..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityCombustEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityCombustEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected int duration; - - public EntityCombustEvent(Entity combustee, int duration) { - this.entity = combustee; - this.duration = duration; - } - - public int getDuration() { - return duration; - } - - public void setDuration(int duration) { - this.duration = duration; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityDamageBlockedEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDamageBlockedEvent.java deleted file mode 100644 index 8198d237f..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityDamageBlockedEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class EntityDamageBlockedEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final EntityDamageEvent damage; - private final boolean knockBackAttacker; - private final boolean animation; - - public EntityDamageBlockedEvent(Entity entity, EntityDamageEvent damage, boolean knockBack, boolean animation) { - this.entity = entity; - this.damage = damage; - this.knockBackAttacker = knockBack; - this.animation = animation; - } - - public EntityDamageEvent.DamageCause getCause() { - return damage.getCause(); - } - - public Entity getAttacker() { - return damage.getEntity(); - } - - public EntityDamageEvent getDamage() { - return damage; - } - - public boolean getKnockBackAttacker() { - return knockBackAttacker; - } - - public boolean getAnimation() { - return animation; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityDamageByBlockEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDamageByBlockEvent.java deleted file mode 100644 index a193f71d8..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityDamageByBlockEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityDamageByBlockEvent extends EntityDamageEvent { - - private final Block damager; - - public EntityDamageByBlockEvent(Block damager, Entity entity, DamageCause cause, float damage) { - super(entity, cause, damage); - this.damager = damager; - } - - public Block getDamager() { - return damager; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityDamageByChildEntityEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDamageByChildEntityEvent.java deleted file mode 100644 index b5fd5b68f..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityDamageByChildEntityEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityDamageByChildEntityEvent extends EntityDamageByEntityEvent { - - private final Entity childEntity; - - public EntityDamageByChildEntityEvent(Entity damager, Entity childEntity, Entity entity, DamageCause cause, float damage) { - super(damager, entity, cause, damage); - this.childEntity = childEntity; - } - - public Entity getChild() { - return childEntity; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityDamageByEntityEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDamageByEntityEvent.java deleted file mode 100644 index 2f09d063a..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityDamageByEntityEvent.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.potion.Effect; - -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityDamageByEntityEvent extends EntityDamageEvent { - - private final Entity damager; - - private float knockBack; - - private Enchantment[] enchantments; - - public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, float damage) { - this(damager, entity, cause, damage, 0.3f); - } - - public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, Map modifiers) { - this(damager, entity, cause, modifiers, 0.3f); - } - - public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, float damage, float knockBack) { - super(entity, cause, damage); - this.damager = damager; - this.knockBack = knockBack; - this.addAttackerModifiers(damager); - } - - public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, Map modifiers, float knockBack) { - this(damager, entity, cause, modifiers, knockBack, new Enchantment[0]); - } - - public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, Map modifiers, float knockBack, Enchantment[] enchantments) { - super(entity, cause, modifiers); - this.damager = damager; - this.knockBack = knockBack; - this.enchantments = enchantments; - this.addAttackerModifiers(damager); - } - - protected void addAttackerModifiers(Entity damager) { - if (damager.hasEffect(Effect.STRENGTH)) { - this.setDamage((float) (this.getDamage(DamageModifier.BASE) * 0.3 * (damager.getEffect(Effect.STRENGTH).getAmplifier() + 1)), DamageModifier.STRENGTH); - } - - if (damager.hasEffect(Effect.WEAKNESS)) { - this.setDamage(-(float) (this.getDamage(DamageModifier.BASE) * 0.2 * (damager.getEffect(Effect.WEAKNESS).getAmplifier() + 1)), DamageModifier.WEAKNESS); - } - } - - public Entity getDamager() { - return damager; - } - - public float getKnockBack() { - return knockBack; - } - - public void setKnockBack(float knockBack) { - this.knockBack = knockBack; - } - - public Enchantment[] getWeaponEnchantments() { - return enchantments; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java deleted file mode 100644 index 4fcdee151..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java +++ /dev/null @@ -1,242 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.EventException; -import com.google.common.collect.ImmutableMap; - -import java.util.EnumMap; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityDamageEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private int attackCooldown = 10; - - private final DamageCause cause; - - private final Map modifiers; - private final Map originals; - - public EntityDamageEvent(Entity entity, DamageCause cause, float damage) { - this(entity, cause, new DamageModifierFloatEnumMap(damage)); - } - - public EntityDamageEvent(Entity entity, DamageCause cause, Map modifiers) { - this.entity = entity; - this.cause = cause; - this.modifiers = new EnumMap<>(modifiers); - this.originals = ImmutableMap.copyOf(this.modifiers); - - if (!this.modifiers.containsKey(DamageModifier.BASE)) { - throw new EventException("BASE Damage modifier missing"); - } - - if (entity.hasEffect(Effect.DAMAGE_RESISTANCE)) { - this.setDamage((float) -(this.getDamage(DamageModifier.BASE) * 0.20 * (entity.getEffect(Effect.DAMAGE_RESISTANCE).getAmplifier() + 1)), DamageModifier.RESISTANCE); - } - } - - public DamageCause getCause() { - return cause; - } - - public float getOriginalDamage() { - return this.getOriginalDamage(DamageModifier.BASE); - } - - public float getOriginalDamage(DamageModifier type) { - if (this.originals.containsKey(type)) { - return this.originals.get(type); - } - - return 0; - } - - public float getDamage() { - return this.getDamage(DamageModifier.BASE); - } - - public float getDamage(DamageModifier type) { - if (this.modifiers.containsKey(type)) { - return this.modifiers.get(type); - } - - return 0; - } - - public void setDamage(float damage) { - this.setDamage(damage, DamageModifier.BASE); - } - - public void setDamage(float damage, DamageModifier type) { - this.modifiers.put(type, damage); - } - - public boolean isApplicable(DamageModifier type) { - return this.modifiers.containsKey(type); - } - - public float getFinalDamage() { - float damage = 0; - for (Float d : this.modifiers.values()) { - if (d != null) { - damage += d; - } - } - - return damage; - } - - public int getAttackCooldown() { - return this.attackCooldown; - } - - public void setAttackCooldown(int attackCooldown) { - this.attackCooldown = attackCooldown; - } - - public boolean canBeReducedByArmor() { - switch (this.cause) { - case FIRE_TICK: - case SUFFOCATION: - case DROWNING: - case HUNGER: - case FALL: - case VOID: - case MAGIC: - case SUICIDE: - return false; - } - return true; - } - - public enum DamageModifier { - /** - * Raw amount of damage - */ - BASE, - /** - * Damage reduction caused by wearing armor - */ - ARMOR, - /** - * Additional damage caused by damager's Strength potion effect - */ - STRENGTH, - /** - * Damage reduction caused by damager's Weakness potion effect - */ - WEAKNESS, - /** - * Damage reduction caused by the Resistance potion effect - */ - RESISTANCE, - /** - * Damage reduction caused by the Damage absorption effect - */ - ABSORPTION, - /** - * Damage reduction caused by armor's enchantments - */ - ARMOR_ENCHANTMENTS - } - - public enum DamageCause { - /** - * Damage caused by contact with a block such as a Cactus - */ - CONTACT, - /** - * Damage caused by being attacked by another entity - */ - ENTITY_ATTACK, - /** - * Damage caused by being hit by a projectile such as an Arrow - */ - PROJECTILE, - /** - * Damage caused by being put in a block - */ - SUFFOCATION, - /** - * Fall damage - */ - FALL, - /** - * Damage caused by standing in fire - */ - FIRE, - /** - * Burn damage - */ - FIRE_TICK, - /** - * Damage caused by standing in lava - */ - LAVA, - /** - * Damage caused by standing on magma block - */ - MAGMA, - /** - * Damage caused by running out of air underwater - */ - DROWNING, - /** - * Block explosion damage - */ - BLOCK_EXPLOSION, - /** - * Entity explosion damage - */ - ENTITY_EXPLOSION, - /** - * Damage caused by falling into the void - */ - VOID, - /** - * Player commits suicide - */ - SUICIDE, - /** - * Potion or spell damage - */ - MAGIC, - /** - * Plugins - */ - CUSTOM, - /** - * Damage caused by being struck by lightning - */ - LIGHTNING, - /** - * Damage caused by hunger - */ - HUNGER, - /** - * Damage caused by thorns enchantment - */ - THORNS - } - - private static class DamageModifierFloatEnumMap extends EnumMap { - - public DamageModifierFloatEnumMap(float damage) { - super(DamageModifier.class); - put(DamageModifier.BASE, damage); - } - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityDeathEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDeathEvent.java deleted file mode 100644 index 6085eac7d..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityDeathEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityDeathEvent extends EntityEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Item[] drops; - - public EntityDeathEvent(EntityLiving entity) { - this(entity, new Item[0]); - } - - public EntityDeathEvent(EntityLiving entity, Item[] drops) { - this.entity = entity; - this.drops = drops; - } - - public Item[] getDrops() { - return drops; - } - - public void setDrops(Item[] drops) { - if (drops == null) { - drops = new Item[0]; - } - - this.drops = drops; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityDespawnEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDespawnEvent.java deleted file mode 100644 index 3f1e49c95..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityDespawnEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntityHuman; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Position; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityDespawnEvent extends EntityEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final int entityType; - - public EntityDespawnEvent(Entity entity) { - this.entity = entity; - this.entityType = entity.getNetworkId(); - } - - public Position getPosition() { - return this.entity.getPosition(); - } - - public int getType() { - return this.entityType; - } - - public boolean isCreature() { - return this.entity instanceof EntityCreature; - } - - public boolean isHuman() { - return this.entity instanceof EntityHuman; - } - - public boolean isProjectile() { - return this.entity instanceof EntityProjectile; - } - - public boolean isVehicle() { - return this.entity instanceof EntityVehicle; - } - - public boolean isItem() { - return this.entity instanceof EntityItem; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityEvent.java b/src/main/java/cn/nukkit/event/entity/EntityEvent.java deleted file mode 100644 index c96a8c15b..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Event; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EntityEvent extends Event { - - protected Entity entity; - - public Entity getEntity() { - return entity; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityExplodeEvent.java b/src/main/java/cn/nukkit/event/entity/EntityExplodeEvent.java deleted file mode 100644 index cc91fae0d..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityExplodeEvent.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Position; - -import java.util.List; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class EntityExplodeEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final Position position; - protected List blocks; - protected double yield; - - public EntityExplodeEvent(Entity entity, Position position, List blocks, double yield) { - this.entity = entity; - this.position = position; - this.blocks = blocks; - this.yield = yield; - } - - public Position getPosition() { - return this.position; - } - - public List getBlockList() { - return this.blocks; - } - - public void setBlockList(List blocks) { - this.blocks = blocks; - } - - public double getYield() { - return this.yield; - } - - public void setYield(double yield) { - this.yield = yield; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityExplosionPrimeEvent.java b/src/main/java/cn/nukkit/event/entity/EntityExplosionPrimeEvent.java deleted file mode 100644 index 80aea0948..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityExplosionPrimeEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class EntityExplosionPrimeEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private double force; - private boolean blockBreaking; - - public EntityExplosionPrimeEvent(Entity entity, double force) { - this.entity = entity; - this.force = force; - this.blockBreaking = true; - } - - public double getForce() { - return force; - } - - public void setForce(double force) { - this.force = force; - } - - public boolean isBlockBreaking() { - return blockBreaking; - } - - public void setBlockBreaking(boolean blockBreaking) { - this.blockBreaking = blockBreaking; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityInteractEvent.java b/src/main/java/cn/nukkit/event/entity/EntityInteractEvent.java deleted file mode 100644 index 5d198f2e9..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityInteractEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author CreeperFace - */ -public class EntityInteractEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Block block; - - public EntityInteractEvent(Entity entity, Block block) { - this.entity = entity; - this.block = block; - } - - public Block getBlock() { - return block; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityInventoryChangeEvent.java b/src/main/java/cn/nukkit/event/entity/EntityInventoryChangeEvent.java deleted file mode 100644 index a90a6ed84..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityInventoryChangeEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityInventoryChangeEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Item oldItem; - private Item newItem; - private final int slot; - - public EntityInventoryChangeEvent(Entity entity, Item oldItem, Item newItem, int slot) { - this.entity = entity; - this.oldItem = oldItem; - this.newItem = newItem; - this.slot = slot; - } - - public int getSlot() { - return slot; - } - - public Item getNewItem() { - return newItem; - } - - public void setNewItem(Item newItem) { - this.newItem = newItem; - } - - public Item getOldItem() { - return oldItem; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityLevelChangeEvent.java b/src/main/java/cn/nukkit/event/entity/EntityLevelChangeEvent.java deleted file mode 100644 index fbbfb9290..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityLevelChangeEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityLevelChangeEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Level originLevel; - private final Level targetLevel; - - public EntityLevelChangeEvent(Entity entity, Level originLevel, Level targetLevel) { - this.entity = entity; - this.originLevel = originLevel; - this.targetLevel = targetLevel; - } - - public Level getOrigin() { - return originLevel; - } - - public Level getTarget() { - return targetLevel; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityMotionEvent.java b/src/main/java/cn/nukkit/event/entity/EntityMotionEvent.java deleted file mode 100644 index ad4397873..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityMotionEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.math.Vector3; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityMotionEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Vector3 motion; - - public EntityMotionEvent(Entity entity, Vector3 motion) { - this.entity = entity; - this.motion = motion; - } - - public Vector3 getVector() { - return this.motion; - } - - public Vector3 getMotion() { - return this.motion; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityPortalEnterEvent.java b/src/main/java/cn/nukkit/event/entity/EntityPortalEnterEvent.java deleted file mode 100644 index b385ccf61..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityPortalEnterEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class EntityPortalEnterEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - private final PortalType type; - - public static HandlerList getHandlers() { - return handlers; - } - - public EntityPortalEnterEvent(Entity entity, PortalType type) { - this.entity = entity; - this.type = type; - } - - public PortalType getPortalType() { - return type; - } - - public enum PortalType { - NETHER, - END - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityRegainHealthEvent.java b/src/main/java/cn/nukkit/event/entity/EntityRegainHealthEvent.java deleted file mode 100644 index bd7c52e71..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityRegainHealthEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityRegainHealthEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public static final int CAUSE_REGEN = 0; - public static final int CAUSE_EATING = 1; - public static final int CAUSE_MAGIC = 2; - public static final int CAUSE_CUSTOM = 3; - - private float amount; - private final int reason; - - public EntityRegainHealthEvent(Entity entity, float amount, int regainReason) { - this.entity = entity; - this.amount = amount; - this.reason = regainReason; - } - - public float getAmount() { - return amount; - } - - public void setAmount(float amount) { - this.amount = amount; - } - - public int getRegainReason() { - return reason; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityShootBowEvent.java b/src/main/java/cn/nukkit/event/entity/EntityShootBowEvent.java deleted file mode 100644 index 1d6a9a825..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityShootBowEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * @author Box - * Nukkit Project - */ -public class EntityShootBowEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Item bow; - - private EntityProjectile projectile; - - private double force; - - public EntityShootBowEvent(EntityLiving shooter, Item bow, EntityProjectile projectile, double force) { - this.entity = shooter; - this.bow = bow; - this.projectile = projectile; - this.force = force; - } - - @Override - public EntityLiving getEntity() { - return (EntityLiving) this.entity; - } - - - public Item getBow() { - return this.bow; - } - - - public EntityProjectile getProjectile() { - return this.projectile; - } - - public void setProjectile(Entity projectile) { - if (projectile != this.projectile) { - if (this.projectile.getViewers().isEmpty()) { - this.projectile.close(); - } - this.projectile = (EntityProjectile) projectile; - } - } - - public double getForce() { - return this.force; - } - - public void setForce(double force) { - this.force = force; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntitySpawnEvent.java b/src/main/java/cn/nukkit/event/entity/EntitySpawnEvent.java deleted file mode 100644 index 123be58a6..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntitySpawnEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityCreature; -import cn.nukkit.entity.EntityHuman; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Position; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntitySpawnEvent extends EntityEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final int entityType; - - public EntitySpawnEvent(Entity entity) { - this.entity = entity; - this.entityType = entity.getNetworkId(); - } - - public Position getPosition() { - return this.entity.getPosition(); - } - - public int getType() { - return this.entityType; - } - - public boolean isCreature() { - return this.entity instanceof EntityCreature; - } - - public boolean isHuman() { - return this.entity instanceof EntityHuman; - } - - public boolean isProjectile() { - return this.entity instanceof EntityProjectile; - } - - public boolean isVehicle() { - return this.entity instanceof EntityVehicle; - } - - public boolean isItem() { - return this.entity instanceof EntityItem; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityTeleportEvent.java b/src/main/java/cn/nukkit/event/entity/EntityTeleportEvent.java deleted file mode 100644 index 13558a2ea..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityTeleportEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Location; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityTeleportEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Location from; - private Location to; - - public EntityTeleportEvent(Entity entity, Location from, Location to) { - this.entity = entity; - this.from = from; - this.to = to; - } - - public Location getFrom() { - return from; - } - - public void setFrom(Location from) { - this.from = from; - } - - public Location getTo() { - return to; - } - - public void setTo(Location to) { - this.to = to; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityVehicleEnterEvent.java b/src/main/java/cn/nukkit/event/entity/EntityVehicleEnterEvent.java deleted file mode 100644 index 247289b06..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityVehicleEnterEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class EntityVehicleEnterEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final EntityVehicle vehicle; - - public EntityVehicleEnterEvent(Entity entity, EntityVehicle vehicle) { - this.entity = entity; - this.vehicle = vehicle; - } - - public EntityVehicle getVehicle() { - return vehicle; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/EntityVehicleExitEvent.java b/src/main/java/cn/nukkit/event/entity/EntityVehicleExitEvent.java deleted file mode 100644 index 68cf50ac9..000000000 --- a/src/main/java/cn/nukkit/event/entity/EntityVehicleExitEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class EntityVehicleExitEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final EntityVehicle vehicle; - - public EntityVehicleExitEvent(Entity entity, EntityVehicle vehicle) { - this.entity = entity; - this.vehicle = vehicle; - } - - public EntityVehicle getVehicle() { - return vehicle; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/ExplosionPrimeEvent.java b/src/main/java/cn/nukkit/event/entity/ExplosionPrimeEvent.java deleted file mode 100644 index 8e6cf585c..000000000 --- a/src/main/java/cn/nukkit/event/entity/ExplosionPrimeEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author Box - * Nukkit Project - * - * Called when a entity decides to explode - */ -public class ExplosionPrimeEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected double force; - private boolean blockBreaking; - - public ExplosionPrimeEvent(Entity entity, double force) { - this.entity = entity; - this.force = force; - this.blockBreaking = true; - } - - public double getForce() { - return this.force; - } - - public void setForce(double force) { - this.force = force; - } - - public boolean isBlockBreaking() { - return this.blockBreaking; - } - - - public void setBlockBreaking(boolean affectsBlocks) { - this.blockBreaking = affectsBlocks; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/ItemDespawnEvent.java b/src/main/java/cn/nukkit/event/entity/ItemDespawnEvent.java deleted file mode 100644 index b871ff990..000000000 --- a/src/main/java/cn/nukkit/event/entity/ItemDespawnEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemDespawnEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public ItemDespawnEvent(EntityItem item) { - this.entity = item; - } - - @Override - public EntityItem getEntity() { - return (EntityItem) this.entity; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/ItemSpawnEvent.java b/src/main/java/cn/nukkit/event/entity/ItemSpawnEvent.java deleted file mode 100644 index 3d4547458..000000000 --- a/src/main/java/cn/nukkit/event/entity/ItemSpawnEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.event.HandlerList; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSpawnEvent extends EntityEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public ItemSpawnEvent(EntityItem item) { - this.entity = item; - } - - @Override - public EntityItem getEntity() { - return (EntityItem) this.entity; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/ProjectileHitEvent.java b/src/main/java/cn/nukkit/event/entity/ProjectileHitEvent.java deleted file mode 100644 index 9e4dbdb62..000000000 --- a/src/main/java/cn/nukkit/event/entity/ProjectileHitEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.MovingObjectPosition; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ProjectileHitEvent extends EntityEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private MovingObjectPosition movingObjectPosition; - - public ProjectileHitEvent(EntityProjectile entity) { - this(entity, null); - } - - public ProjectileHitEvent(EntityProjectile entity, MovingObjectPosition movingObjectPosition) { - this.entity = entity; - this.movingObjectPosition = movingObjectPosition; - } - - public MovingObjectPosition getMovingObjectPosition() { - return movingObjectPosition; - } - - public void setMovingObjectPosition(MovingObjectPosition movingObjectPosition) { - this.movingObjectPosition = movingObjectPosition; - } -} diff --git a/src/main/java/cn/nukkit/event/entity/ProjectileLaunchEvent.java b/src/main/java/cn/nukkit/event/entity/ProjectileLaunchEvent.java deleted file mode 100644 index 8b9b08c60..000000000 --- a/src/main/java/cn/nukkit/event/entity/ProjectileLaunchEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.entity; - -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class ProjectileLaunchEvent extends EntityEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public ProjectileLaunchEvent(EntityProjectile entity) { - this.entity = entity; - } - - public EntityProjectile getEntity() { - return (EntityProjectile) this.entity; - } -} diff --git a/src/main/java/cn/nukkit/event/inventory/BrewEvent.java b/src/main/java/cn/nukkit/event/inventory/BrewEvent.java deleted file mode 100644 index e4d5875f7..000000000 --- a/src/main/java/cn/nukkit/event/inventory/BrewEvent.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.blockentity.BlockEntityBrewingStand; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - */ -public class BrewEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final BlockEntityBrewingStand brewingStand; - private final Item ingredient; - private final Item[] potions; - private final int fuel; - - public BrewEvent(BlockEntityBrewingStand blockEntity) { - super(blockEntity.getInventory()); - this.brewingStand = blockEntity; - this.fuel = blockEntity.fuelAmount; - - this.ingredient = blockEntity.getInventory().getIngredient(); - - this.potions = new Item[3]; - for (int i = 0; i < 3; i++) { - this.potions[i] = blockEntity.getInventory().getItem(i); - } - } - - public BlockEntityBrewingStand getBrewingStand() { - return brewingStand; - } - - public Item getIngredient() { - return ingredient; - } - - public Item[] getPotions() { - return potions; - } - - /** - * @param index Potion index in range 0 - 2 - * @return potion - */ - public Item getPotion(int index) { - return this.potions[index]; - } - - public int getFuel() { - return fuel; - } -} diff --git a/src/main/java/cn/nukkit/event/inventory/CraftItemEvent.java b/src/main/java/cn/nukkit/event/inventory/CraftItemEvent.java deleted file mode 100644 index 9861017e1..000000000 --- a/src/main/java/cn/nukkit/event/inventory/CraftItemEvent.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.Event; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.Recipe; -import cn.nukkit.inventory.transaction.CraftingTransaction; -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class CraftItemEvent extends Event implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Item[] input; - - private final Recipe recipe; - - private final Player player; - - private CraftingTransaction transaction; - - public CraftItemEvent(CraftingTransaction transaction) { - this.transaction = transaction; - this.player = transaction.getSource(); - this.input = transaction.getInputList().toArray(new Item[0]); - this.recipe = transaction.getRecipe(); - } - - public CraftItemEvent(Player player, Item[] input, Recipe recipe) { - this.player = player; - this.input = input; - this.recipe = recipe; - } - - public CraftingTransaction getTransaction() { - return transaction; - } - - public Item[] getInput() { - return input; - } - - public Recipe getRecipe() { - return recipe; - } - - public Player getPlayer() { - return this.player; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/inventory/EnchantItemEvent.java b/src/main/java/cn/nukkit/event/inventory/EnchantItemEvent.java deleted file mode 100644 index 004e20ae8..000000000 --- a/src/main/java/cn/nukkit/event/inventory/EnchantItemEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.EnchantInventory; -import cn.nukkit.item.Item; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class EnchantItemEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Item oldItem; - private Item newItem; - private int xpCost; - private Player enchanter; - - public EnchantItemEvent(EnchantInventory inventory, Item oldItem, Item newItem, int cost, Player p) { - super(inventory); - this.oldItem = oldItem; - this.newItem = newItem; - this.xpCost = cost; - this.enchanter = p; - } -} diff --git a/src/main/java/cn/nukkit/event/inventory/FurnaceBurnEvent.java b/src/main/java/cn/nukkit/event/inventory/FurnaceBurnEvent.java deleted file mode 100644 index cae483128..000000000 --- a/src/main/java/cn/nukkit/event/inventory/FurnaceBurnEvent.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.blockentity.BlockEntityFurnace; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.event.block.BlockEvent; -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class FurnaceBurnEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final BlockEntityFurnace furnace; - private final Item fuel; - private short burnTime; - private boolean burning = true; - - public FurnaceBurnEvent(BlockEntityFurnace furnace, Item fuel, short burnTime) { - super(furnace.getBlock()); - this.fuel = fuel; - this.burnTime = burnTime; - this.furnace = furnace; - } - - public BlockEntityFurnace getFurnace() { - return furnace; - } - - public Item getFuel() { - return fuel; - } - - public short getBurnTime() { - return burnTime; - } - - public void setBurnTime(short burnTime) { - this.burnTime = burnTime; - } - - public boolean isBurning() { - return burning; - } - - public void setBurning(boolean burning) { - this.burning = burning; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/inventory/FurnaceSmeltEvent.java b/src/main/java/cn/nukkit/event/inventory/FurnaceSmeltEvent.java deleted file mode 100644 index 19623f44e..000000000 --- a/src/main/java/cn/nukkit/event/inventory/FurnaceSmeltEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.blockentity.BlockEntityFurnace; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.event.block.BlockEvent; -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class FurnaceSmeltEvent extends BlockEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final BlockEntityFurnace furnace; - private final Item source; - private Item result; - - public FurnaceSmeltEvent(BlockEntityFurnace furnace, Item source, Item result) { - super(furnace.getBlock()); - this.source = source.clone(); - this.source.setCount(1); - this.result = result; - this.furnace = furnace; - } - - public BlockEntityFurnace getFurnace() { - return furnace; - } - - public Item getSource() { - return source; - } - - public Item getResult() { - return result; - } - - public void setResult(Item result) { - this.result = result; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryClickEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryClickEvent.java deleted file mode 100644 index 91f97312a..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryClickEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.item.Item; - -/** - * @author boybook - * Nukkit Project - */ -public class InventoryClickEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final int slot; - private final Item sourceItem; - private final Item heldItem; - private final Player player; - - public InventoryClickEvent(Player who, Inventory inventory, int slot, Item sourceItem, Item heldItem) { - super(inventory); - this.slot = slot; - this.sourceItem = sourceItem; - this.heldItem = heldItem; - this.player = who; - } - - public int getSlot() { - return slot; - } - - public Item getSourceItem() { - return sourceItem; - } - - public Item getHeldItem() { - return heldItem; - } - - public Player getPlayer() { - return player; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryCloseEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryCloseEvent.java deleted file mode 100644 index 9b8de2211..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryCloseEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.Player; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.Inventory; - -/** - * @author Box - * Nukkit Project - */ -public class InventoryCloseEvent extends InventoryEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Player who; - - public InventoryCloseEvent(Inventory inventory, Player who) { - super(inventory); - this.who = who; - } - - public Player getPlayer() { - return this.who; - } -} diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryEvent.java deleted file mode 100644 index d11adb185..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.Player; -import cn.nukkit.event.Event; -import cn.nukkit.inventory.Inventory; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class InventoryEvent extends Event { - - protected final Inventory inventory; - - public InventoryEvent(Inventory inventory) { - this.inventory = inventory; - } - - public Inventory getInventory() { - return inventory; - } - - public Player[] getViewers() { - return this.inventory.getViewers().toArray(new Player[0]); - } -} diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryMoveItemEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryMoveItemEvent.java deleted file mode 100644 index 1d56ce310..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryMoveItemEvent.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - *

- * Called when inventory transaction is not caused by a player - */ -public class InventoryMoveItemEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Inventory targetInventory; - private final InventoryHolder source; - - private Item item; - - private final Action action; - - public InventoryMoveItemEvent(Inventory from, Inventory targetInventory, InventoryHolder source, Item item, Action action) { - super(from); - this.targetInventory = targetInventory; - this.source = source; - this.item = item; - this.action = action; - } - - public Inventory getTargetInventory() { - return targetInventory; - } - - public InventoryHolder getSource() { - return source; - } - - public Item getItem() { - return item; - } - - public void setItem(Item item) { - this.item = item; - } - - public Action getAction() { - return action; - } - - public enum Action { - SLOT_CHANGE, //transaction between 2 inventories - PICKUP, - DROP, - DISPENSE - } -} diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryOpenEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryOpenEvent.java deleted file mode 100644 index ce78783f6..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryOpenEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.Inventory; - -/** - * @author Box - * Nukkit Project - */ -public class InventoryOpenEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Player who; - - public InventoryOpenEvent(Inventory inventory, Player who) { - super(inventory); - this.who = who; - } - - public Player getPlayer() { - return this.who; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryPickupArrowEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryPickupArrowEvent.java deleted file mode 100644 index 585c48d36..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryPickupArrowEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.Inventory; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class InventoryPickupArrowEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final EntityArrow arrow; - - public InventoryPickupArrowEvent(Inventory inventory, EntityArrow arrow) { - super(inventory); - this.arrow = arrow; - } - - public EntityArrow getArrow() { - return arrow; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryPickupItemEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryPickupItemEvent.java deleted file mode 100644 index b064b09d7..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryPickupItemEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.Inventory; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class InventoryPickupItemEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final EntityItem item; - - public InventoryPickupItemEvent(Inventory inventory, EntityItem item) { - super(inventory); - this.item = item; - } - - public EntityItem getItem() { - return item; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryPickupTridentEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryPickupTridentEvent.java deleted file mode 100644 index 8514d04c8..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryPickupTridentEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.entity.projectile.EntityThrownTrident; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.Inventory; - -public class InventoryPickupTridentEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final EntityThrownTrident trident; - - public InventoryPickupTridentEvent(Inventory inventory, EntityThrownTrident trident) { - super(inventory); - this.trident = trident; - } - - public EntityThrownTrident getTrident() { - return trident; - } -} diff --git a/src/main/java/cn/nukkit/event/inventory/InventoryTransactionEvent.java b/src/main/java/cn/nukkit/event/inventory/InventoryTransactionEvent.java deleted file mode 100644 index c0e6ce46d..000000000 --- a/src/main/java/cn/nukkit/event/inventory/InventoryTransactionEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.Event; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.transaction.InventoryTransaction; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class InventoryTransactionEvent extends Event implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final InventoryTransaction transaction; - - public InventoryTransactionEvent(InventoryTransaction transaction) { - this.transaction = transaction; - } - - public InventoryTransaction getTransaction() { - return transaction; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/inventory/StartBrewEvent.java b/src/main/java/cn/nukkit/event/inventory/StartBrewEvent.java deleted file mode 100644 index 6becd86b4..000000000 --- a/src/main/java/cn/nukkit/event/inventory/StartBrewEvent.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.blockentity.BlockEntityBrewingStand; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - */ -public class StartBrewEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final BlockEntityBrewingStand brewingStand; - private final Item ingredient; - private final Item[] potions; - - public StartBrewEvent(BlockEntityBrewingStand blockEntity) { - super(blockEntity.getInventory()); - this.brewingStand = blockEntity; - - this.ingredient = blockEntity.getInventory().getIngredient(); - - this.potions = new Item[3]; - for (int i = 0; i < 3; i++) { - this.potions[i] = blockEntity.getInventory().getItem(i); - } - } - - public BlockEntityBrewingStand getBrewingStand() { - return brewingStand; - } - - public Item getIngredient() { - return ingredient; - } - - public Item[] getPotions() { - return potions; - } - - /** - * @param index Potion index in range 0 - 2 - * @return potion - */ - public Item getPotion(int index) { - return this.potions[index]; - } -} diff --git a/src/main/java/cn/nukkit/event/level/ChunkEvent.java b/src/main/java/cn/nukkit/event/level/ChunkEvent.java deleted file mode 100644 index 7b932a35d..000000000 --- a/src/main/java/cn/nukkit/event/level/ChunkEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.level.format.FullChunk; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class ChunkEvent extends LevelEvent { - - private final FullChunk chunk; - - public ChunkEvent(FullChunk chunk) { - super(chunk.getProvider().getLevel()); - this.chunk = chunk; - } - - public FullChunk getChunk() { - return chunk; - } -} diff --git a/src/main/java/cn/nukkit/event/level/ChunkLoadEvent.java b/src/main/java/cn/nukkit/event/level/ChunkLoadEvent.java deleted file mode 100644 index 23520f4ed..000000000 --- a/src/main/java/cn/nukkit/event/level/ChunkLoadEvent.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.format.FullChunk; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ChunkLoadEvent extends ChunkEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final boolean newChunk; - - public ChunkLoadEvent(FullChunk chunk, boolean newChunk) { - super(chunk); - this.newChunk = newChunk; - } - - public boolean isNewChunk() { - return newChunk; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/level/ChunkPopulateEvent.java b/src/main/java/cn/nukkit/event/level/ChunkPopulateEvent.java deleted file mode 100644 index 4694bca35..000000000 --- a/src/main/java/cn/nukkit/event/level/ChunkPopulateEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.format.FullChunk; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ChunkPopulateEvent extends ChunkEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public ChunkPopulateEvent(FullChunk chunk) { - super(chunk); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/level/ChunkUnloadEvent.java b/src/main/java/cn/nukkit/event/level/ChunkUnloadEvent.java deleted file mode 100644 index b557169ce..000000000 --- a/src/main/java/cn/nukkit/event/level/ChunkUnloadEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.format.FullChunk; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ChunkUnloadEvent extends ChunkEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public ChunkUnloadEvent(FullChunk chunk) { - super(chunk); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/level/LevelEvent.java b/src/main/java/cn/nukkit/event/level/LevelEvent.java deleted file mode 100644 index 9fcc47076..000000000 --- a/src/main/java/cn/nukkit/event/level/LevelEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.Event; -import cn.nukkit.level.Level; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class LevelEvent extends Event { - - private final Level level; - - public LevelEvent(Level level) { - this.level = level; - } - - public Level getLevel() { - return level; - } -} diff --git a/src/main/java/cn/nukkit/event/level/LevelInitEvent.java b/src/main/java/cn/nukkit/event/level/LevelInitEvent.java deleted file mode 100644 index 03d76e5d7..000000000 --- a/src/main/java/cn/nukkit/event/level/LevelInitEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class LevelInitEvent extends LevelEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public LevelInitEvent(Level level) { - super(level); - } -} diff --git a/src/main/java/cn/nukkit/event/level/LevelLoadEvent.java b/src/main/java/cn/nukkit/event/level/LevelLoadEvent.java deleted file mode 100644 index 3a54164f0..000000000 --- a/src/main/java/cn/nukkit/event/level/LevelLoadEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class LevelLoadEvent extends LevelEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public LevelLoadEvent(Level level) { - super(level); - } -} diff --git a/src/main/java/cn/nukkit/event/level/LevelSaveEvent.java b/src/main/java/cn/nukkit/event/level/LevelSaveEvent.java deleted file mode 100644 index 4e18629b2..000000000 --- a/src/main/java/cn/nukkit/event/level/LevelSaveEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class LevelSaveEvent extends LevelEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public LevelSaveEvent(Level level) { - super(level); - } -} diff --git a/src/main/java/cn/nukkit/event/level/LevelUnloadEvent.java b/src/main/java/cn/nukkit/event/level/LevelUnloadEvent.java deleted file mode 100644 index 8dd81f9c3..000000000 --- a/src/main/java/cn/nukkit/event/level/LevelUnloadEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class LevelUnloadEvent extends LevelEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public LevelUnloadEvent(Level level) { - super(level); - } -} diff --git a/src/main/java/cn/nukkit/event/level/SpawnChangeEvent.java b/src/main/java/cn/nukkit/event/level/SpawnChangeEvent.java deleted file mode 100644 index 78781f75e..000000000 --- a/src/main/java/cn/nukkit/event/level/SpawnChangeEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class SpawnChangeEvent extends LevelEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Position previousSpawn; - - public SpawnChangeEvent(Level level, Position previousSpawn) { - super(level); - this.previousSpawn = previousSpawn; - } - - public Position getPreviousSpawn() { - return previousSpawn; - } -} diff --git a/src/main/java/cn/nukkit/event/level/StructureGrowEvent.java b/src/main/java/cn/nukkit/event/level/StructureGrowEvent.java deleted file mode 100644 index ed7d87fde..000000000 --- a/src/main/java/cn/nukkit/event/level/StructureGrowEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -import java.util.List; -import java.util.Objects; - -/** - * @author KCodeYT (Nukkit Project) - */ -public class StructureGrowEvent extends LevelEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block block; - private final List blocks; - - public StructureGrowEvent(Block block, List blocks) { - super(Objects.requireNonNull(block.getLevel())); - this.block = block; - this.blocks = blocks; - } - - public Block getBlock() { - return this.block; - } - - public List getBlockList() { - return this.blocks; - } - - public void setBlockList(List blocks) { - this.blocks.clear(); - if (blocks != null) { - this.blocks.addAll(blocks); - } - } -} diff --git a/src/main/java/cn/nukkit/event/level/ThunderChangeEvent.java b/src/main/java/cn/nukkit/event/level/ThunderChangeEvent.java deleted file mode 100644 index 36497d120..000000000 --- a/src/main/java/cn/nukkit/event/level/ThunderChangeEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; - -/** - * @author funcraft - * Nukkit Project - */ -public class ThunderChangeEvent extends WeatherEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private final boolean to; - - public static HandlerList getHandlers() { - return handlers; - } - - public ThunderChangeEvent(Level level, boolean to) { - super(level); - this.to = to; - } - - /** - * Gets the state of thunder that the world is being set to - * - * @return true if the thunder is being set to start, false otherwise - */ - public boolean toThunderState() { - return to; - } -} diff --git a/src/main/java/cn/nukkit/event/level/WeatherChangeEvent.java b/src/main/java/cn/nukkit/event/level/WeatherChangeEvent.java deleted file mode 100644 index 7d9e80a7b..000000000 --- a/src/main/java/cn/nukkit/event/level/WeatherChangeEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; - -/** - * @author funcraft - * Nukkit Project - */ -public class WeatherChangeEvent extends WeatherEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private final boolean to; - - public static HandlerList getHandlers() { - return handlers; - } - - public WeatherChangeEvent(Level level, boolean to) { - super(level); - this.to = to; - } - - /** - * Gets the state of weather that the world is being set to - * - * @return true if the weather is being set to raining, false otherwise - */ - public boolean toWeatherState() { - return to; - } -} diff --git a/src/main/java/cn/nukkit/event/level/WeatherEvent.java b/src/main/java/cn/nukkit/event/level/WeatherEvent.java deleted file mode 100644 index 634fa7950..000000000 --- a/src/main/java/cn/nukkit/event/level/WeatherEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.level; - -import cn.nukkit.event.Event; -import cn.nukkit.level.Level; - -/** - * @author funcraft - * Nukkit Project - */ -public abstract class WeatherEvent extends Event { - - private final Level level; - - public WeatherEvent(Level level) { - this.level = level; - } - - public Level getLevel() { - return level; - } -} diff --git a/src/main/java/cn/nukkit/event/player/CraftingTableOpenEvent.java b/src/main/java/cn/nukkit/event/player/CraftingTableOpenEvent.java deleted file mode 100644 index 43fc42e43..000000000 --- a/src/main/java/cn/nukkit/event/player/CraftingTableOpenEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class CraftingTableOpenEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block craftingTable; - - public CraftingTableOpenEvent(Player player, Block craftingTable) { - this.player = player; - this.craftingTable = craftingTable; - } - - public Block getCraftingTable() { - return this.craftingTable; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerAchievementAwardedEvent.java b/src/main/java/cn/nukkit/event/player/PlayerAchievementAwardedEvent.java deleted file mode 100644 index 35a943de1..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerAchievementAwardedEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerAchievementAwardedEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final String achievement; - - public PlayerAchievementAwardedEvent(Player player, String achievementId) { - this.player = player; - this.achievement = achievementId; - } - - public String getAchievement() { - return this.achievement; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerAnimationEvent.java b/src/main/java/cn/nukkit/event/player/PlayerAnimationEvent.java deleted file mode 100644 index c0500366b..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerAnimationEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.network.protocol.AnimatePacket; - -public class PlayerAnimationEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final AnimatePacket.Action animationType; - - public PlayerAnimationEvent(Player player) { - this(player, AnimatePacket.Action.SWING_ARM); - } - - public PlayerAnimationEvent(Player player, AnimatePacket.Action animation) { - this.player = player; - this.animationType = animation; - } - - public AnimatePacket.Action getAnimationType() { - return this.animationType; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerAsyncPreLoginEvent.java b/src/main/java/cn/nukkit/event/player/PlayerAsyncPreLoginEvent.java deleted file mode 100644 index 2c3c95724..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerAsyncPreLoginEvent.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Server; -import cn.nukkit.entity.data.Skin; -import cn.nukkit.event.HandlerList; -import cn.nukkit.utils.LoginChainData; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import java.util.function.Consumer; - -/** - * This event is called asynchronously - * - * @author CreeperFace - */ -public class PlayerAsyncPreLoginEvent extends PlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final String name; - private final UUID uuid; - private final LoginChainData chainData; - private Skin skin; - private final String address; - private final int port; - - private LoginResult loginResult = LoginResult.SUCCESS; - private String kickMessage = "Plugin Reason"; - - private final List> scheduledActions = new ArrayList<>(); - - public PlayerAsyncPreLoginEvent(String name, UUID uuid, LoginChainData chainData, Skin skin, String address, int port) { - this.name = name; - this.uuid = uuid; - this.chainData = chainData; - this.skin = skin; - this.address = address; - this.port = port; - } - - public String getName() { - return this.name; - } - - public UUID getUuid() { - return this.uuid; - } - - public LoginChainData getChainData() { - return this.chainData; - } - - public String getXuid() { - return this.chainData.getXUID(); - } - - public Skin getSkin() { - return this.skin; - } - - public void setSkin(Skin skin) { - this.skin = skin; - } - - public String getAddress() { - return this.address; - } - - public int getPort() { - return this.port; - } - - public LoginResult getLoginResult() { - return loginResult; - } - - public void setLoginResult(LoginResult loginResult) { - this.loginResult = loginResult; - } - - public String getKickMessage() { - return kickMessage; - } - - public void setKickMessage(String kickMessage) { - this.kickMessage = kickMessage; - } - - public void scheduleSyncAction(Consumer action) { - this.scheduledActions.add(action); - } - - public List> getScheduledActions() { - return new ArrayList<>(scheduledActions); - } - - public void allow() { - this.loginResult = LoginResult.SUCCESS; - } - - public void disAllow(String message) { - this.loginResult = LoginResult.KICK; - this.kickMessage = message; - } - - public enum LoginResult { - SUCCESS, - KICK - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/player/PlayerBedEnterEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBedEnterEvent.java deleted file mode 100644 index 8c1eaf149..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerBedEnterEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerBedEnterEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block bed; - - public PlayerBedEnterEvent(Player player, Block bed) { - this.player = player; - this.bed = bed; - } - - public Block getBed() { - return bed; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerBedLeaveEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBedLeaveEvent.java deleted file mode 100644 index 321834bc9..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerBedLeaveEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.HandlerList; - -public class PlayerBedLeaveEvent extends PlayerEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block bed; - - public PlayerBedLeaveEvent(Player player, Block bed) { - this.player = player; - this.bed = bed; - } - - public Block getBed() { - return bed; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerBlockPickEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBlockPickEvent.java deleted file mode 100644 index bbca5b106..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerBlockPickEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - */ -public class PlayerBlockPickEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Block blockClicked; - private Item item; - - public PlayerBlockPickEvent(Player player, Block blockClicked, Item item) { - this.blockClicked = blockClicked; - this.item = item; - this.player = player; - } - - public Item getItem() { - return item; - } - - public void setItem(Item item) { - this.item = item; - } - - public Block getBlockClicked() { - return blockClicked; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerBucketEmptyEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBucketEmptyEvent.java deleted file mode 100644 index ba15fb660..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerBucketEmptyEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; - -public class PlayerBucketEmptyEvent extends PlayerBucketEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public PlayerBucketEmptyEvent(Player who, Block blockClicked, BlockFace blockFace, Item bucket, Item itemInHand) { - super(who, blockClicked, blockFace, bucket, itemInHand); - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerBucketEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBucketEvent.java deleted file mode 100644 index 8121d133f..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerBucketEvent.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; - -abstract class PlayerBucketEvent extends PlayerEvent implements Cancellable { - - private final Block blockClicked; - - private final BlockFace blockFace; - - private final Item bucket; - - private Item item; - - - public PlayerBucketEvent(Player who, Block blockClicked, BlockFace blockFace, Item bucket, Item itemInHand) { - this.player = who; - this.blockClicked = blockClicked; - this.blockFace = blockFace; - this.item = itemInHand; - this.bucket = bucket; - } - - /** - * Returns the bucket used in this event - * @return bucket - */ - public Item getBucket() { - return this.bucket; - } - - /** - * Returns the item in hand after the event - * @return item - */ - public Item getItem() { - return this.item; - } - - public void setItem(Item item) { - this.item = item; - } - - public Block getBlockClicked() { - return this.blockClicked; - } - - public BlockFace getBlockFace() { - return this.blockFace; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerBucketFillEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBucketFillEvent.java deleted file mode 100644 index 9f10e52ac..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerBucketFillEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; - -public class PlayerBucketFillEvent extends PlayerBucketEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public PlayerBucketFillEvent(Player who, Block blockClicked, BlockFace blockFace, Item bucket, Item itemInHand) { - super(who, blockClicked, blockFace, bucket, itemInHand); - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerChangeSkinEvent.java b/src/main/java/cn/nukkit/event/player/PlayerChangeSkinEvent.java deleted file mode 100644 index 4a32d4ea8..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerChangeSkinEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.entity.data.Skin; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author KCodeYT - * Nukkit Project - */ -public class PlayerChangeSkinEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Skin skin; - - public PlayerChangeSkinEvent(Player player, Skin skin) { - this.player = player; - this.skin = skin; - } - - public Skin getSkin() { - return this.skin; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerChatEvent.java b/src/main/java/cn/nukkit/event/player/PlayerChatEvent.java deleted file mode 100644 index 69565d799..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerChatEvent.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.command.CommandSender; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.permission.Permissible; - -import java.util.HashSet; -import java.util.Set; - -public class PlayerChatEvent extends PlayerMessageEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected String format; - - protected Set recipients = new HashSet<>(); - - public PlayerChatEvent(Player player, String message) { - this(player, message, "chat.type.text", null); - } - - public PlayerChatEvent(Player player, String message, String format, Set recipients) { - this.player = player; - this.message = message; - - this.format = format; - - if (recipients == null) { - for (Permissible permissible : Server.getInstance().getPluginManager().getPermissionSubscriptions(Server.BROADCAST_CHANNEL_USERS)) { - if (permissible instanceof CommandSender) { - this.recipients.add((CommandSender) permissible); - } - } - } else { - this.recipients = recipients; - } - } - - /** - * Changes the player that is sending the message - * - * @param player messenger - */ - public void setPlayer(Player player) { - this.player = player; - } - - public String getFormat() { - return this.format; - } - - public void setFormat(String format) { - this.format = format; - } - - public Set getRecipients() { - return this.recipients; - } - - public void setRecipients(Set recipients) { - this.recipients = recipients; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerChunkRequestEvent.java b/src/main/java/cn/nukkit/event/player/PlayerChunkRequestEvent.java deleted file mode 100644 index 41db6f766..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerChunkRequestEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerChunkRequestEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final int chunkX; - private final int chunkZ; - - public PlayerChunkRequestEvent(Player player, int chunkX, int chunkZ) { - this.player = player; - this.chunkX = chunkX; - this.chunkZ = chunkZ; - } - - public int getChunkX() { - return chunkX; - } - - public int getChunkZ() { - return chunkZ; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerCommandPreprocessEvent.java b/src/main/java/cn/nukkit/event/player/PlayerCommandPreprocessEvent.java deleted file mode 100644 index e8c5b7f88..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerCommandPreprocessEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerCommandPreprocessEvent extends PlayerMessageEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public PlayerCommandPreprocessEvent(Player player, String message) { - this.player = player; - this.message = message; - } - - public void setPlayer(Player player) { - this.player = player; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerCreationEvent.java b/src/main/java/cn/nukkit/event/player/PlayerCreationEvent.java deleted file mode 100644 index 91431fa7e..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerCreationEvent.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Event; -import cn.nukkit.event.HandlerList; -import cn.nukkit.network.SourceInterface; - -import java.net.InetSocketAddress; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PlayerCreationEvent extends Event { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final SourceInterface interfaz; - - private final Long clientId; - - private final InetSocketAddress socketAddress; - - private Class baseClass; - - private Class playerClass; - - public PlayerCreationEvent(SourceInterface interfaz, Class baseClass, Class playerClass, Long clientId, InetSocketAddress socketAddress) { - this.interfaz = interfaz; - this.clientId = clientId; - this.socketAddress = socketAddress; - - this.baseClass = baseClass; - this.playerClass = playerClass; - } - - public SourceInterface getInterface() { - return interfaz; - } - - public String getAddress() { - return this.socketAddress.getAddress().toString(); - } - - public int getPort() { - return this.socketAddress.getPort(); - } - - public InetSocketAddress getSocketAddress() { - return socketAddress; - } - - public Long getClientId() { - return clientId; - } - - public Class getBaseClass() { - return baseClass; - } - - public void setBaseClass(Class baseClass) { - this.baseClass = baseClass; - } - - public Class getPlayerClass() { - return playerClass; - } - - public void setPlayerClass(Class playerClass) { - this.playerClass = playerClass; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerDeathEvent.java b/src/main/java/cn/nukkit/event/player/PlayerDeathEvent.java deleted file mode 100644 index 47fcb8785..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerDeathEvent.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.event.entity.EntityDeathEvent; -import cn.nukkit.item.Item; -import cn.nukkit.lang.TextContainer; - -public class PlayerDeathEvent extends EntityDeathEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private TextContainer deathMessage; - private boolean keepInventory = false; - private boolean keepExperience = false; - private int experience; - - public PlayerDeathEvent(Player player, Item[] drops, TextContainer deathMessage, int experience) { - super(player, drops); - this.deathMessage = deathMessage; - this.experience = experience; - } - - public PlayerDeathEvent(Player player, Item[] drops, String deathMessage, int experience) { - this(player, drops, new TextContainer(deathMessage), experience); - } - - @Override - public Player getEntity() { - return (Player) super.getEntity(); - } - - public TextContainer getDeathMessage() { - return deathMessage; - } - - public void setDeathMessage(TextContainer deathMessage) { - this.deathMessage = deathMessage; - } - - public void setDeathMessage(String deathMessage) { - this.deathMessage = new TextContainer(deathMessage); - } - - public boolean getKeepInventory() { - return keepInventory; - } - - public void setKeepInventory(boolean keepInventory) { - this.keepInventory = keepInventory; - } - - public boolean getKeepExperience() { - return keepExperience; - } - - public void setKeepExperience(boolean keepExperience) { - this.keepExperience = keepExperience; - } - - public int getExperience() { - return experience; - } - - public void setExperience(int experience) { - this.experience = experience; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerDropItemEvent.java b/src/main/java/cn/nukkit/event/player/PlayerDropItemEvent.java deleted file mode 100644 index 3b0858fe2..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerDropItemEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -public class PlayerDropItemEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Item drop; - - public PlayerDropItemEvent(Player player, Item drop) { - this.player = player; - this.drop = drop; - } - - public Item getItem() { - return this.drop; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerEatFoodEvent.java b/src/main/java/cn/nukkit/event/player/PlayerEatFoodEvent.java deleted file mode 100644 index 3a5ed0211..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerEatFoodEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.food.Food; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.event.player in project nukkit. - */ -public class PlayerEatFoodEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - private Food food; - - public static HandlerList getHandlers() { - return handlers; - } - - public PlayerEatFoodEvent(Player player, Food food) { - this.player = player; - this.food = food; - } - - public Food getFood() { - return food; - } - - public void setFood(Food food) { - this.food = food; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerEditBookEvent.java b/src/main/java/cn/nukkit/event/player/PlayerEditBookEvent.java deleted file mode 100644 index 150804fd0..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerEditBookEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; -import cn.nukkit.network.protocol.BookEditPacket; - -public class PlayerEditBookEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Item oldBook; - private final BookEditPacket.Action action; - private Item newBook; - - public PlayerEditBookEvent(Player player, Item oldBook, Item newBook, BookEditPacket.Action action) { - this.player = player; - this.oldBook = oldBook; - this.newBook = newBook; - this.action = action; - } - - public BookEditPacket.Action getAction() { - return this.action; - } - - public Item getOldBook() { - return this.oldBook; - } - - public Item getNewBook() { - return this.newBook; - } - - public void setNewBook(Item book) { - this.newBook = book; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerEvent.java b/src/main/java/cn/nukkit/event/player/PlayerEvent.java deleted file mode 100644 index f19ba2ce6..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Event; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class PlayerEvent extends Event { - - protected Player player; - - public Player getPlayer() { - return player; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerFishEvent.java b/src/main/java/cn/nukkit/event/player/PlayerFishEvent.java deleted file mode 100644 index 9130b885e..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerFishEvent.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.entity.item.EntityFishingHook; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; -import cn.nukkit.math.Vector3; - -/** - * An event that is called when player catches a fish - * - * @author PetteriM1 - */ -public class PlayerFishEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final EntityFishingHook hook; - private Item loot; - private int experience; - private Vector3 motion; - - public PlayerFishEvent(Player player, EntityFishingHook hook, Item loot, int experience, Vector3 motion) { - this.player = player; - this.hook = hook; - this.loot = loot; - this.experience = experience; - this.motion = motion; - } - - public EntityFishingHook getHook() { - return hook; - } - - public Item getLoot() { - return loot; - } - - public void setLoot(Item loot) { - this.loot = loot; - } - - public int getExperience() { - return experience; - } - - public void setExperience(int experience) { - this.experience = experience; - } - - public Vector3 getMotion() { - return motion; - } - - public void setMotion(Vector3 motion) { - this.motion = motion; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerFoodLevelChangeEvent.java b/src/main/java/cn/nukkit/event/player/PlayerFoodLevelChangeEvent.java deleted file mode 100644 index 28299972d..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerFoodLevelChangeEvent.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerFoodLevelChangeEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected int foodLevel; - protected float foodSaturationLevel; - - public PlayerFoodLevelChangeEvent(Player player, int foodLevel, float foodSaturationLevel) { - this.player = player; - this.foodLevel = foodLevel; - this.foodSaturationLevel = foodSaturationLevel; - } - - public int getFoodLevel() { - return this.foodLevel; - } - - public void setFoodLevel(int foodLevel) { - this.foodLevel = foodLevel; - } - - public float getFoodSaturationLevel() { - return foodSaturationLevel; - } - - public void setFoodSaturationLevel(float foodSaturationLevel) { - this.foodSaturationLevel = foodSaturationLevel; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerFormRespondedEvent.java b/src/main/java/cn/nukkit/event/player/PlayerFormRespondedEvent.java deleted file mode 100644 index b94320428..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerFormRespondedEvent.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.HandlerList; -import cn.nukkit.form.response.FormResponse; -import cn.nukkit.form.window.FormWindow; - -public class PlayerFormRespondedEvent extends PlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected int formID; - protected FormWindow window; - - public PlayerFormRespondedEvent(Player player, int formID, FormWindow window) { - this.player = player; - this.formID = formID; - this.window = window; - } - - public int getFormID() { - return this.formID; - } - - public FormWindow getWindow() { - return window; - } - - /** - * Can be null if player closed the window instead of submitting it - * - * @return response - */ - public FormResponse getResponse() { - return window.getResponse(); - } - - /** - * Defines if player closed the window or submitted it - * - * @return form closed - */ - public boolean wasClosed() { - return window.wasClosed(); - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerGameModeChangeEvent.java b/src/main/java/cn/nukkit/event/player/PlayerGameModeChangeEvent.java deleted file mode 100644 index 297d96660..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerGameModeChangeEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.AdventureSettings; -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerGameModeChangeEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final int gamemode; - - protected AdventureSettings newAdventureSettings; - - public PlayerGameModeChangeEvent(Player player, int newGameMode, AdventureSettings newAdventureSettings) { - this.player = player; - this.gamemode = newGameMode; - this.newAdventureSettings = newAdventureSettings; - } - - public int getNewGamemode() { - return gamemode; - } - - public AdventureSettings getNewAdventureSettings() { - return newAdventureSettings; - } - - public void setNewAdventureSettings(AdventureSettings newAdventureSettings) { - this.newAdventureSettings = newAdventureSettings; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerGlassBottleFillEvent.java b/src/main/java/cn/nukkit/event/player/PlayerGlassBottleFillEvent.java deleted file mode 100644 index f2b7d2d47..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerGlassBottleFillEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.item.Item; - -public class PlayerGlassBottleFillEvent extends PlayerEvent implements Cancellable { - - protected final Item item; - protected final Block target; - - public PlayerGlassBottleFillEvent(Player player, Block target, Item item) { - this.player = player; - this.target = target; - this.item = item.clone(); - } - - public Item getItem() { - return item; - } - - public Block getBlock() { - return target; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerInitializedEvent.java b/src/main/java/cn/nukkit/event/player/PlayerInitializedEvent.java deleted file mode 100644 index 645129542..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerInitializedEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.HandlerList; - -public class PlayerInitializedEvent extends PlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public PlayerInitializedEvent(Player player) { - this.player = player; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerInteractEntityEvent.java b/src/main/java/cn/nukkit/event/player/PlayerInteractEntityEvent.java deleted file mode 100644 index 0d0cab773..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerInteractEntityEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; -import cn.nukkit.math.Vector3; - -/** - * Created by CreeperFace on 1. 1. 2017. - */ -public class PlayerInteractEntityEvent extends PlayerEvent implements Cancellable { - - - private static final HandlerList handlers = new HandlerList(); - - protected final Entity entity; - protected final Item item; - protected final Vector3 clickedPos; - - public PlayerInteractEntityEvent(Player player, Entity entity, Item item, Vector3 clickedPos) { - this.player = player; - this.entity = entity; - this.item = item; - this.clickedPos = clickedPos; - } - - public Entity getEntity() { - return this.entity; - } - - public Item getItem() { - return this.item; - } - - public Vector3 getClickedPos() { - return clickedPos; - } - - public static HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerInteractEvent.java b/src/main/java/cn/nukkit/event/player/PlayerInteractEvent.java deleted file mode 100644 index 524dca091..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerInteractEvent.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; -import cn.nukkit.level.Position; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PlayerInteractEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final Block blockTouched; - - protected final Vector3 touchVector; - - protected final BlockFace blockFace; - - protected final Item item; - - protected final Action action; - - public PlayerInteractEvent(Player player, Item item, Vector3 block, BlockFace face) { - this(player, item, block, face, Action.RIGHT_CLICK_BLOCK); - } - - public PlayerInteractEvent(Player player, Item item, Vector3 block, BlockFace face, Action action) { - if (block instanceof Block) { - this.blockTouched = (Block) block; - this.touchVector = new Vector3(0, 0, 0); - } else { - this.touchVector = block; - this.blockTouched = Block.get(Block.AIR, 0, new Position(0, 0, 0, player.level)); - } - - this.player = player; - this.item = item; - this.blockFace = face; - this.action = action; - } - - public Action getAction() { - return action; - } - - public Item getItem() { - return item; - } - - public Block getBlock() { - return blockTouched; - } - - public Vector3 getTouchVector() { - return touchVector; - } - - public BlockFace getFace() { - return blockFace; - } - - public enum Action { - LEFT_CLICK_BLOCK, - RIGHT_CLICK_BLOCK, - LEFT_CLICK_AIR, - RIGHT_CLICK_AIR, - PHYSICAL - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerInvalidMoveEvent.java b/src/main/java/cn/nukkit/event/player/PlayerInvalidMoveEvent.java deleted file mode 100644 index 59f334cff..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerInvalidMoveEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * call when a player moves wrongly - * - * @author WilliamGao - */ - -public class PlayerInvalidMoveEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private boolean revert; - - public static HandlerList getHandlers() { - return handlers; - } - - public PlayerInvalidMoveEvent(Player player, boolean revert) { - this.player = player; - this.revert = revert; - } - - public boolean isRevert() { - return this.revert; - } - - public void setRevert(boolean revert) { - this.revert = revert; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerItemConsumeEvent.java b/src/main/java/cn/nukkit/event/player/PlayerItemConsumeEvent.java deleted file mode 100644 index d9be38a5f..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerItemConsumeEvent.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * Called when a player eats something - */ -public class PlayerItemConsumeEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Item item; - - public PlayerItemConsumeEvent(Player player, Item item) { - this.player = player; - this.item = item; - } - - public Item getItem() { - return this.item.clone(); - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerItemHeldEvent.java b/src/main/java/cn/nukkit/event/player/PlayerItemHeldEvent.java deleted file mode 100644 index d082825ff..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerItemHeldEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PlayerItemHeldEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Item item; - private final int hotbarSlot; - - public PlayerItemHeldEvent(Player player, Item item, int hotbarSlot) { - this.player = player; - this.item = item; - this.hotbarSlot = hotbarSlot; - } - - public int getSlot() { - return this.hotbarSlot; - } - - public int getInventorySlot() { - return hotbarSlot; - } - - public Item getItem() { - return item; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerJoinEvent.java b/src/main/java/cn/nukkit/event/player/PlayerJoinEvent.java deleted file mode 100644 index 57baa19b8..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerJoinEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.HandlerList; -import cn.nukkit.lang.TextContainer; - -public class PlayerJoinEvent extends PlayerEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected TextContainer joinMessage; - - public PlayerJoinEvent(Player player, TextContainer joinMessage) { - this.player = player; - this.joinMessage = joinMessage; - } - - public PlayerJoinEvent(Player player, String joinMessage) { - this.player = player; - this.joinMessage = new TextContainer(joinMessage); - } - - public TextContainer getJoinMessage() { - return joinMessage; - } - - public void setJoinMessage(TextContainer joinMessage) { - this.joinMessage = joinMessage; - } - - public void setJoinMessage(String joinMessage) { - this.setJoinMessage(new TextContainer(joinMessage)); - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerJumpEvent.java b/src/main/java/cn/nukkit/event/player/PlayerJumpEvent.java deleted file mode 100644 index b308655eb..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerJumpEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.HandlerList; - -public class PlayerJumpEvent extends PlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public PlayerJumpEvent(Player player) { - this.player = player; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerKickEvent.java b/src/main/java/cn/nukkit/event/player/PlayerKickEvent.java deleted file mode 100644 index cda21bac0..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerKickEvent.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.lang.TextContainer; - -public class PlayerKickEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public enum Reason { - NEW_CONNECTION, - KICKED_BY_ADMIN, - NOT_WHITELISTED, - IP_BANNED, - NAME_BANNED, - INVALID_PVE, - INVALID_PVP, - LOGIN_TIMEOUT, - SERVER_FULL, - FLYING_DISABLED, - INVALID_PACKET, - UNKNOWN; - - @Override - public String toString() { - return this.name(); - } - } - - public static HandlerList getHandlers() { - return handlers; - } - - protected TextContainer quitMessage; - - protected final Reason reason; - protected final String reasonString; - - private final String extraData; - - public PlayerKickEvent(Player player, String reason, String quitMessage) { - this(player, Reason.UNKNOWN, reason, new TextContainer(quitMessage)); - } - - public PlayerKickEvent(Player player, String reason, TextContainer quitMessage) { - this(player, Reason.UNKNOWN, reason, quitMessage); - } - - public PlayerKickEvent(Player player, Reason reason, TextContainer quitMessage) { - this(player, reason, reason.toString(), quitMessage); - } - - public PlayerKickEvent(Player player, Reason reason, String quitMessage) { - this(player, reason, new TextContainer(quitMessage)); - } - - public PlayerKickEvent(Player player, Reason reason, String reasonString, TextContainer quitMessage) { - this(player, reason, reasonString, quitMessage, ""); - } - - public PlayerKickEvent(Player player, Reason reason, String reasonString, TextContainer quitMessage, String extraData) { - this.player = player; - this.quitMessage = quitMessage; - this.reason = reason; - this.reasonString = reason.name(); - this.extraData = extraData; - } - - public String getReason() { - return reasonString; - } - - public Reason getReasonEnum() { - return this.reason; - } - - public TextContainer getQuitMessage() { - return quitMessage; - } - - public void setQuitMessage(TextContainer quitMessage) { - this.quitMessage = quitMessage; - } - - public void setQuitMessage(String joinMessage) { - this.setQuitMessage(new TextContainer(joinMessage)); - } - - public String getExtraData() { - return extraData; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerLocallyInitializedEvent.java b/src/main/java/cn/nukkit/event/player/PlayerLocallyInitializedEvent.java deleted file mode 100644 index 02a09be32..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerLocallyInitializedEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.HandlerList; - -/** - * @author Extollite - * Nukkit Project - */ -public class PlayerLocallyInitializedEvent extends PlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public PlayerLocallyInitializedEvent(Player player) { - this.player = player; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerLoginEvent.java b/src/main/java/cn/nukkit/event/player/PlayerLoginEvent.java deleted file mode 100644 index 01663fe3c..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerLoginEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerLoginEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected String kickMessage; - - - public PlayerLoginEvent(Player player, String kickMessage) { - this.player = player; - this.kickMessage = kickMessage; - } - - public String getKickMessage() { - return kickMessage; - } - - public void setKickMessage(String kickMessage) { - this.kickMessage = kickMessage; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerMapInfoRequestEvent.java b/src/main/java/cn/nukkit/event/player/PlayerMapInfoRequestEvent.java deleted file mode 100644 index 7fa30baa6..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerMapInfoRequestEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.item.Item; - -/** - * Created by CreeperFace on 18.3.2017. - */ -public class PlayerMapInfoRequestEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private Item item; - - public PlayerMapInfoRequestEvent(Player p, Item item) { - this.player = p; - this.item = item; - } - - public Item getMap() { - return item; - } - - public static HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerMessageEvent.java b/src/main/java/cn/nukkit/event/player/PlayerMessageEvent.java deleted file mode 100644 index aae13fcac..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerMessageEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.event.player; - -/** - * Created on 2015/12/23 by xtypr. - * Package cn.nukkit.event.player in project Nukkit . - */ -public abstract class PlayerMessageEvent extends PlayerEvent { - - protected String message; - - public String getMessage() { - return this.message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerMouseOverEntityEvent.java b/src/main/java/cn/nukkit/event/player/PlayerMouseOverEntityEvent.java deleted file mode 100644 index 1c2146fb2..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerMouseOverEntityEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.HandlerList; - -public class PlayerMouseOverEntityEvent extends PlayerEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Entity entity; - - public PlayerMouseOverEntityEvent(Player player, Entity entity) { - this.player = player; - this.entity = entity; - } - - public Entity getEntity() { - return entity; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerMoveEvent.java b/src/main/java/cn/nukkit/event/player/PlayerMoveEvent.java deleted file mode 100644 index 8c1866614..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerMoveEvent.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Location; - -public class PlayerMoveEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Location from; - private Location to; - - private boolean resetBlocksAround; - - public PlayerMoveEvent(Player player, Location from, Location to) { - this(player, from, to, true); - } - - public PlayerMoveEvent(Player player, Location from, Location to, boolean resetBlocks) { - this.player = player; - this.from = from; - this.to = to; - this.resetBlocksAround = resetBlocks; - } - - public Location getFrom() { - return from; - } - - public void setFrom(Location from) { - this.from = from; - } - - public Location getTo() { - return to; - } - - public void setTo(Location to) { - this.to = to; - } - - public boolean isResetBlocksAround() { - return resetBlocksAround; - } - - public void setResetBlocksAround(boolean value) { - this.resetBlocksAround = value; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerPreLoginEvent.java b/src/main/java/cn/nukkit/event/player/PlayerPreLoginEvent.java deleted file mode 100644 index 7ed8fd3fc..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerPreLoginEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * Called when the player logs in, before things have been set up - */ -public class PlayerPreLoginEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected String kickMessage; - - public PlayerPreLoginEvent(Player player, String kickMessage) { - this.player = player; - this.kickMessage = kickMessage; - } - - public void setKickMessage(String kickMessage) { - this.kickMessage = kickMessage; - } - - public String getKickMessage() { - return this.kickMessage; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerQuitEvent.java b/src/main/java/cn/nukkit/event/player/PlayerQuitEvent.java deleted file mode 100644 index ca3fb7054..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerQuitEvent.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.HandlerList; -import cn.nukkit.lang.TextContainer; - -public class PlayerQuitEvent extends PlayerEvent { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected TextContainer quitMessage; - protected boolean autoSave; - protected String reason; - - public PlayerQuitEvent(Player player, TextContainer quitMessage, String reason) { - this(player, quitMessage, true, reason); - } - - public PlayerQuitEvent(Player player, TextContainer quitMessage) { - this(player, quitMessage, true); - } - - public PlayerQuitEvent(Player player, String quitMessage, String reason) { - this(player, quitMessage, true, reason); - } - - public PlayerQuitEvent(Player player, String quitMessage) { - this(player, quitMessage, true); - } - - public PlayerQuitEvent(Player player, String quitMessage, boolean autoSave, String reason) { - this(player, new TextContainer(quitMessage), autoSave, reason); - } - - public PlayerQuitEvent(Player player, String quitMessage, boolean autoSave) { - this(player, new TextContainer(quitMessage), autoSave); - } - - public PlayerQuitEvent(Player player, TextContainer quitMessage, boolean autoSave) { - this(player, quitMessage, autoSave, "No reason"); - } - - public PlayerQuitEvent(Player player, TextContainer quitMessage, boolean autoSave, String reason) { - this.player = player; - this.quitMessage = quitMessage; - this.autoSave = autoSave; - this.reason = reason; - } - - public TextContainer getQuitMessage() { - return quitMessage; - } - - public void setQuitMessage(TextContainer quitMessage) { - this.quitMessage = quitMessage; - } - - public void setQuitMessage(String quitMessage) { - this.setQuitMessage(new TextContainer(quitMessage)); - } - - public boolean getAutoSave() { - return this.autoSave; - } - - public void setAutoSave() { - this.setAutoSave(true); - } - - public void setAutoSave(boolean autoSave) { - this.autoSave = autoSave; - } - - public String getReason() { - return reason; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerRespawnEvent.java b/src/main/java/cn/nukkit/event/player/PlayerRespawnEvent.java deleted file mode 100644 index 9d7ac8fae..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerRespawnEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Position; - -public class PlayerRespawnEvent extends PlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Position position; - - private final boolean firstSpawn; - - public PlayerRespawnEvent(Player player, Position position) { - this(player, position, false); - } - - public PlayerRespawnEvent(Player player, Position position, boolean firstSpawn) { - this.player = player; - this.position = position; - this.firstSpawn = firstSpawn; - } - - public Position getRespawnPosition() { - return position; - } - - public void setRespawnPosition(Position position) { - this.position = position; - } - - public boolean isFirstSpawn() { - return firstSpawn; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/player/PlayerServerSettingsRequestEvent.java b/src/main/java/cn/nukkit/event/player/PlayerServerSettingsRequestEvent.java deleted file mode 100644 index 400dd347e..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerServerSettingsRequestEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.form.window.FormWindow; - -import java.util.Map; - -/** - * @author CreeperFace - */ -public class PlayerServerSettingsRequestEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Map settings; - - public PlayerServerSettingsRequestEvent(Player player, Map settings) { - this.player = player; - this.settings = settings; - } - - public Map getSettings() { - return settings; - } - - public void setSettings(Map settings) { - this.settings = settings; - } - - public void setSettings(int id, FormWindow window) { - this.settings.put(id, window); - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerSettingsRespondedEvent.java b/src/main/java/cn/nukkit/event/player/PlayerSettingsRespondedEvent.java deleted file mode 100644 index 133a7a867..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerSettingsRespondedEvent.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.form.response.FormResponse; -import cn.nukkit.form.window.FormWindow; - -public class PlayerSettingsRespondedEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected int formID; - protected FormWindow window; - - public PlayerSettingsRespondedEvent(Player player, int formID, FormWindow window) { - this.player = player; - this.formID = formID; - this.window = window; - } - - public int getFormID() { - return this.formID; - } - - public FormWindow getWindow() { - return window; - } - - /** - * Can be null if player closed the window instead of submitting it - */ - public FormResponse getResponse() { - return window.getResponse(); - } - - /** - * Defines if player closed the window or submitted it - */ - public boolean wasClosed() { - return window.wasClosed(); - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerTeleportEvent.java b/src/main/java/cn/nukkit/event/player/PlayerTeleportEvent.java deleted file mode 100644 index 5afe00beb..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerTeleportEvent.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Level; -import cn.nukkit.level.Location; -import cn.nukkit.level.Position; -import cn.nukkit.math.Vector3; - -public class PlayerTeleportEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private TeleportCause cause; - private Location from; - private Location to; - - private PlayerTeleportEvent(Player player) { - this.player = player; - } - - public PlayerTeleportEvent(Player player, Location from, Location to, TeleportCause cause) { - this(player); - this.from = from; - this.to = to; - this.cause = cause; - } - - public PlayerTeleportEvent(Player player, Vector3 from, Vector3 to, TeleportCause cause) { - this(player); - this.from = vectorToLocation(player.getLevel(), from); - this.from = vectorToLocation(player.getLevel(), to); - this.cause = cause; - } - - public Location getFrom() { - return from; - } - - public Location getTo() { - return to; - } - - public TeleportCause getCause() { - return cause; - } - - private static Location vectorToLocation(Level baseLevel, Vector3 vector) { - if (vector instanceof Location) return (Location) vector; - if (vector instanceof Position) return ((Position) vector).getLocation(); - return new Location(vector.getX(), vector.getY(), vector.getZ(), 0, 0, baseLevel); - } - - - public enum TeleportCause { - COMMAND, // For Nukkit tp command only - PLUGIN, // Every plugin - NETHER_PORTAL, // Teleport using nether portal - END_PORTAL, // Teleport using end portal - ENDER_PEARL, // Teleport by ender pearl - CHORUS_FRUIT, // Teleport by chorus fruit - UNKNOWN // Unknown cause - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerToggleFlightEvent.java b/src/main/java/cn/nukkit/event/player/PlayerToggleFlightEvent.java deleted file mode 100644 index 57db82c8b..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerToggleFlightEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerToggleFlightEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final boolean isFlying; - - public PlayerToggleFlightEvent(Player player, boolean isFlying) { - this.player = player; - this.isFlying = isFlying; - } - - public boolean isFlying() { - return this.isFlying; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerToggleGlideEvent.java b/src/main/java/cn/nukkit/event/player/PlayerToggleGlideEvent.java deleted file mode 100644 index 8ddde896a..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerToggleGlideEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerToggleGlideEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final boolean isGliding; - - public PlayerToggleGlideEvent(Player player, boolean isSneaking) { - this.player = player; - this.isGliding = isSneaking; - } - - public boolean isGliding() { - return this.isGliding; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerToggleSneakEvent.java b/src/main/java/cn/nukkit/event/player/PlayerToggleSneakEvent.java deleted file mode 100644 index 4329714e2..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerToggleSneakEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerToggleSneakEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final boolean isSneaking; - - public PlayerToggleSneakEvent(Player player, boolean isSneaking) { - this.player = player; - this.isSneaking = isSneaking; - } - - public boolean isSneaking() { - return this.isSneaking; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerToggleSprintEvent.java b/src/main/java/cn/nukkit/event/player/PlayerToggleSprintEvent.java deleted file mode 100644 index d59261102..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerToggleSprintEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class PlayerToggleSprintEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - protected final boolean isSprinting; - - public PlayerToggleSprintEvent(Player player, boolean isSprinting) { - this.player = player; - this.isSprinting = isSprinting; - } - - public boolean isSprinting() { - return this.isSprinting; - } -} diff --git a/src/main/java/cn/nukkit/event/player/PlayerToggleSwimEvent.java b/src/main/java/cn/nukkit/event/player/PlayerToggleSwimEvent.java deleted file mode 100644 index 76c2752d9..000000000 --- a/src/main/java/cn/nukkit/event/player/PlayerToggleSwimEvent.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.event.player; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author CreeperFace - */ -public class PlayerToggleSwimEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final boolean isSwimming; - - public PlayerToggleSwimEvent(Player player, boolean isSwimming) { - this.player = player; - this.isSwimming = isSwimming; - } - - public boolean isSwimming() { - return this.isSwimming; - } -} diff --git a/src/main/java/cn/nukkit/event/player/RepairItemEvent.java b/src/main/java/cn/nukkit/event/player/RepairItemEvent.java deleted file mode 100644 index dd7acdc3d..000000000 --- a/src/main/java/cn/nukkit/event/player/RepairItemEvent.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.event.inventory; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.inventory.AnvilInventory; -import cn.nukkit.item.Item; - -public class RepairItemEvent extends InventoryEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Item oldItem; - private Item newItem; - private Item materialItem; - private int cost; - private Player player; - - public RepairItemEvent(AnvilInventory inventory, Item oldItem, Item newItem, Item materialItem, int cost, Player player) { - super(inventory); - this.oldItem = oldItem; - this.newItem = newItem; - this.materialItem = materialItem; - this.cost = cost; - this.player = player; - } - - public Item getOldItem() { - return this.oldItem; - } - - public Item getNewItem() { - return this.newItem; - } - - public Item getMaterialItem() { - return this.materialItem; - } - - public int getCost() { - return this.cost; - } - - public void setCost(int cost) { - this.cost = cost; - } - - public Player getPlayer() { - return this.player; - } -} diff --git a/src/main/java/cn/nukkit/event/plugin/PluginDisableEvent.java b/src/main/java/cn/nukkit/event/plugin/PluginDisableEvent.java deleted file mode 100644 index c13a909e3..000000000 --- a/src/main/java/cn/nukkit/event/plugin/PluginDisableEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.event.plugin; - -import cn.nukkit.plugin.Plugin; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PluginDisableEvent extends PluginEvent { - - public PluginDisableEvent(Plugin plugin) { - super(plugin); - } -} diff --git a/src/main/java/cn/nukkit/event/plugin/PluginEnableEvent.java b/src/main/java/cn/nukkit/event/plugin/PluginEnableEvent.java deleted file mode 100644 index 478f1d1a6..000000000 --- a/src/main/java/cn/nukkit/event/plugin/PluginEnableEvent.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.event.plugin; - -import cn.nukkit.plugin.Plugin; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PluginEnableEvent extends PluginEvent { - - public PluginEnableEvent(Plugin plugin) { - super(plugin); - } -} diff --git a/src/main/java/cn/nukkit/event/plugin/PluginEvent.java b/src/main/java/cn/nukkit/event/plugin/PluginEvent.java deleted file mode 100644 index f298aac59..000000000 --- a/src/main/java/cn/nukkit/event/plugin/PluginEvent.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.event.plugin; - -import cn.nukkit.event.Event; -import cn.nukkit.event.HandlerList; -import cn.nukkit.plugin.Plugin; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PluginEvent extends Event { - - private static final HandlerList handlers = new HandlerList(); - - private final Plugin plugin; - - public PluginEvent(Plugin plugin) { - this.plugin = plugin; - } - - public static HandlerList getHandlers() { - return handlers; - } - - public Plugin getPlugin() { - return plugin; - } -} diff --git a/src/main/java/cn/nukkit/event/potion/PotionApplyEvent.java b/src/main/java/cn/nukkit/event/potion/PotionApplyEvent.java deleted file mode 100644 index f1f4b0b00..000000000 --- a/src/main/java/cn/nukkit/event/potion/PotionApplyEvent.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.event.potion; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.potion.Effect; -import cn.nukkit.potion.Potion; - -/** - * Created by Snake1999 on 2016/1/12. - * Package cn.nukkit.event.potion in project nukkit - */ -public class PotionApplyEvent extends PotionEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Effect applyEffect; - - private final Entity entity; - - public PotionApplyEvent(Potion potion, Effect applyEffect, Entity entity) { - super(potion); - this.applyEffect = applyEffect; - this.entity = entity; - } - - public Entity getEntity() { - return entity; - } - - public Effect getApplyEffect() { - return applyEffect; - } - - public void setApplyEffect(Effect applyEffect) { - this.applyEffect = applyEffect; - } -} diff --git a/src/main/java/cn/nukkit/event/potion/PotionCollideEvent.java b/src/main/java/cn/nukkit/event/potion/PotionCollideEvent.java deleted file mode 100644 index c5c41b682..000000000 --- a/src/main/java/cn/nukkit/event/potion/PotionCollideEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.event.potion; - -import cn.nukkit.entity.item.EntityPotion; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.potion.Potion; - -/** - * Created by Snake1999 on 2016/1/12. - * Package cn.nukkit.event.potion in project nukkit - */ -public class PotionCollideEvent extends PotionEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final EntityPotion thrownPotion; - - public PotionCollideEvent(Potion potion, EntityPotion thrownPotion) { - super(potion); - this.thrownPotion = thrownPotion; - } - - public EntityPotion getThrownPotion() { - return thrownPotion; - } -} diff --git a/src/main/java/cn/nukkit/event/potion/PotionEvent.java b/src/main/java/cn/nukkit/event/potion/PotionEvent.java deleted file mode 100644 index 02fd96523..000000000 --- a/src/main/java/cn/nukkit/event/potion/PotionEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.event.potion; - -import cn.nukkit.event.Event; -import cn.nukkit.potion.Potion; - -/** - * Created by Snake1999 on 2016/1/12. - * Package cn.nukkit.event.potion in project nukkit - */ -public abstract class PotionEvent extends Event { - - private Potion potion; - - public PotionEvent(Potion potion) { - this.potion = potion; - } - - public Potion getPotion() { - return potion; - } - - public void setPotion(Potion potion) { - this.potion = potion; - } -} diff --git a/src/main/java/cn/nukkit/event/redstone/RedstoneUpdateEvent.java b/src/main/java/cn/nukkit/event/redstone/RedstoneUpdateEvent.java deleted file mode 100644 index 09926dc2c..000000000 --- a/src/main/java/cn/nukkit/event/redstone/RedstoneUpdateEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.redstone; - -import cn.nukkit.block.Block; -import cn.nukkit.event.HandlerList; -import cn.nukkit.event.block.BlockUpdateEvent; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class RedstoneUpdateEvent extends BlockUpdateEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public RedstoneUpdateEvent(Block source) { - super(source); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/event/server/BatchPacketsEvent.java b/src/main/java/cn/nukkit/event/server/BatchPacketsEvent.java deleted file mode 100644 index 06aa7c620..000000000 --- a/src/main/java/cn/nukkit/event/server/BatchPacketsEvent.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.network.protocol.DataPacket; - -public class BatchPacketsEvent extends ServerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private Player[] players; - private DataPacket[] packets; - - private boolean forceSync; - - public BatchPacketsEvent(Player[] players, DataPacket[] packets, boolean forceSync) { - this.players = players; - this.packets = packets; - this.forceSync = forceSync; - } - - public Player[] getPlayers() { - return players; - } - - public DataPacket[] getPackets() { - return packets; - } - - public boolean isForceSync() { - return forceSync; - } -} diff --git a/src/main/java/cn/nukkit/event/server/DataPacketReceiveEvent.java b/src/main/java/cn/nukkit/event/server/DataPacketReceiveEvent.java deleted file mode 100644 index 3190f5393..000000000 --- a/src/main/java/cn/nukkit/event/server/DataPacketReceiveEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.network.protocol.DataPacket; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class DataPacketReceiveEvent extends ServerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private final DataPacket packet; - private final Player player; - - public DataPacketReceiveEvent(Player player, DataPacket packet) { - this.packet = packet; - this.player = player; - } - - public DataPacket getPacket() { - return packet; - } - - public Player getPlayer() { - return player; - } - - public static HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/cn/nukkit/event/server/DataPacketSendEvent.java b/src/main/java/cn/nukkit/event/server/DataPacketSendEvent.java deleted file mode 100644 index 7f09a0628..000000000 --- a/src/main/java/cn/nukkit/event/server/DataPacketSendEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.Player; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.network.protocol.DataPacket; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class DataPacketSendEvent extends ServerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final DataPacket packet; - private final Player player; - - public DataPacketSendEvent(Player player, DataPacket packet) { - this.packet = packet; - this.player = player; - } - - public Player getPlayer() { - return player; - } - - public DataPacket getPacket() { - return packet; - } -} diff --git a/src/main/java/cn/nukkit/event/server/PlayerDataSerializeEvent.java b/src/main/java/cn/nukkit/event/server/PlayerDataSerializeEvent.java deleted file mode 100644 index 4cf00bb20..000000000 --- a/src/main/java/cn/nukkit/event/server/PlayerDataSerializeEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.event.HandlerList; -import cn.nukkit.utils.PlayerDataSerializer; -import com.google.common.base.Preconditions; - -import java.util.Optional; -import java.util.UUID; - -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") -public class PlayerDataSerializeEvent extends ServerEvent { - - private static HandlerList handlers = new HandlerList(); - - private final Optional name; - private final Optional uuid; - private PlayerDataSerializer serializer; - - public PlayerDataSerializeEvent(String name, PlayerDataSerializer serializer) { - Preconditions.checkNotNull(name); - this.serializer = Preconditions.checkNotNull(serializer); - UUID uuid = null; - try { - uuid = UUID.fromString(name); - } catch (Exception ignored) {} - this.uuid = Optional.ofNullable(uuid); - this.name = this.uuid.isPresent() ? Optional.empty() : Optional.of(name); - } - - public Optional getName() { - return name; - } - - public Optional getUuid() { - return uuid; - } - - public PlayerDataSerializer getSerializer() { - return serializer; - } - - public void setSerializer(PlayerDataSerializer serializer) { - this.serializer = Preconditions.checkNotNull(serializer, "serializer"); - } - - public static HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/cn/nukkit/event/server/QueryRegenerateEvent.java b/src/main/java/cn/nukkit/event/server/QueryRegenerateEvent.java deleted file mode 100644 index cecba4b2e..000000000 --- a/src/main/java/cn/nukkit/event/server/QueryRegenerateEvent.java +++ /dev/null @@ -1,191 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.Nukkit; -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.HandlerList; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.plugin.PluginDescription; -import cn.nukkit.utils.Binary; - -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class QueryRegenerateEvent extends ServerEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private int timeout; - private String serverName; - private boolean listPlugins; - private Plugin[] plugins; - private Player[] players; - private final String gameType; - private final String version; - private String map; - private int numPlayers; - private int maxPlayers; - private final String whitelist; - private final int port; - private final String ip; - - public QueryRegenerateEvent(Server server) { - this(server, 5); - } - - public QueryRegenerateEvent(Server server, int timeout) { - this.timeout = timeout; - this.serverName = server.getMotd(); - this.listPlugins = server.queryPlugins; - this.plugins = server.getPluginManager().getPlugins().values().toArray(new Plugin[0]); - this.players = server.getOnlinePlayers().values().toArray(new Player[0]); - this.gameType = server.getGamemode() == 1 ? "CMP" : "SMP"; - this.version = server.getVersion(); - this.map = server.getDefaultLevel() == null ? "unknown" : server.getDefaultLevel().getName(); - this.numPlayers = this.players.length; - this.maxPlayers = server.getMaxPlayers(); - this.whitelist = server.hasWhitelist() ? "on" : "off"; - this.port = server.getPort(); - this.ip = server.getIp(); - } - - public int getTimeout() { - return timeout; - } - - public void setTimeout(int timeout) { - this.timeout = timeout; - } - - public String getServerName() { - return serverName; - } - - public void setServerName(String serverName) { - this.serverName = serverName; - } - - public boolean canListPlugins() { - return this.listPlugins; - } - - public void setListPlugins(boolean listPlugins) { - this.listPlugins = listPlugins; - } - - public Plugin[] getPlugins() { - return plugins; - } - - public void setPlugins(Plugin[] plugins) { - this.plugins = plugins; - } - - public Player[] getPlayerList() { - return players; - } - - public void setPlayerList(Player[] players) { - this.players = players; - } - - public int getPlayerCount() { - return this.numPlayers; - } - - public void setPlayerCount(int count) { - this.numPlayers = count; - } - - public int getMaxPlayerCount() { - return this.maxPlayers; - } - - public void setMaxPlayerCount(int count) { - this.maxPlayers = count; - } - - public String getWorld() { - return map; - } - - public void setWorld(String world) { - this.map = world; - } - - public byte[] getLongQuery() { - ByteBuffer query = ByteBuffer.allocate(65536); - StringBuilder plist = new StringBuilder(Nukkit.NUKKIT); - if (this.listPlugins && this.plugins.length > 0) { - plist.append(':'); - for (Plugin p : this.plugins) { - PluginDescription d = p.getDescription(); - plist.append(' ').append(d.getName().replace(";", "").replace(":", "").replace(" ", "_")).append(' ').append(d.getVersion().replace(";", "").replace(":", "").replace(" ", "_")).append(';'); - } - plist = new StringBuilder(plist.substring(0, plist.length() - 2)); - } - - query.put("splitnum".getBytes()); - query.put((byte) 0x00); - query.put((byte) 128); - query.put((byte) 0x00); - - LinkedHashMap KVdata = new LinkedHashMap<>(); - KVdata.put("hostname", this.serverName); - KVdata.put("gametype", this.gameType); - KVdata.put("game_id", "MINECRAFTPE"); - KVdata.put("version", this.version); - KVdata.put("server_engine", Nukkit.NUKKIT); - KVdata.put("plugins", plist.toString()); - KVdata.put("map", this.map); - KVdata.put("numplayers", String.valueOf(this.numPlayers)); - KVdata.put("maxplayers", String.valueOf(this.maxPlayers)); - KVdata.put("whitelist", this.whitelist); - KVdata.put("hostip", this.ip); - KVdata.put("hostport", String.valueOf(this.port)); - - for (Map.Entry entry : KVdata.entrySet()) { - query.put(entry.getKey().getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - query.put(entry.getValue().getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - } - - query.put(new byte[]{0x00, 0x01}).put("player_".getBytes()).put(new byte[]{0x00, 0x00}); - - for (Player player : this.players) { - query.put(player.getName().getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - } - - query.put((byte) 0x00); - return Arrays.copyOf(query.array(), query.position()); - } - - public byte[] getShortQuery() { - ByteBuffer query = ByteBuffer.allocate(65536); - query.put(this.serverName.getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - query.put(this.gameType.getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - query.put(this.map.getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - query.put(String.valueOf(this.numPlayers).getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - query.put(String.valueOf(this.maxPlayers).getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - query.put(Binary.writeLShort(this.port)); - query.put(this.ip.getBytes(StandardCharsets.UTF_8)); - query.put((byte) 0x00); - return Arrays.copyOf(query.array(), query.position()); - } -} diff --git a/src/main/java/cn/nukkit/event/server/RemoteServerCommandEvent.java b/src/main/java/cn/nukkit/event/server/RemoteServerCommandEvent.java deleted file mode 100644 index 58be9956c..000000000 --- a/src/main/java/cn/nukkit/event/server/RemoteServerCommandEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.command.CommandSender; -import cn.nukkit.event.HandlerList; - -/** - * Called when an RCON command is executed. - * - * @author Tee7even - */ -public class RemoteServerCommandEvent extends ServerCommandEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public RemoteServerCommandEvent(CommandSender sender, String command) { - super(sender, command); - } -} diff --git a/src/main/java/cn/nukkit/event/server/ServerCommandEvent.java b/src/main/java/cn/nukkit/event/server/ServerCommandEvent.java deleted file mode 100644 index 4d4ab50d0..000000000 --- a/src/main/java/cn/nukkit/event/server/ServerCommandEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.command.CommandSender; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ServerCommandEvent extends ServerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - protected String command; - - protected final CommandSender sender; - - public ServerCommandEvent(CommandSender sender, String command) { - this.sender = sender; - this.command = command; - } - - public CommandSender getSender() { - return sender; - } - - public String getCommand() { - return command; - } - - public void setCommand(String command) { - this.command = command; - } - - public static HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/cn/nukkit/event/server/ServerEvent.java b/src/main/java/cn/nukkit/event/server/ServerEvent.java deleted file mode 100644 index a90a329cd..000000000 --- a/src/main/java/cn/nukkit/event/server/ServerEvent.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.event.Event; - -/** - * @author MagicDroidX - * Nukkit Project - */ -abstract public class ServerEvent extends Event { -} diff --git a/src/main/java/cn/nukkit/event/server/ServerStopEvent.java b/src/main/java/cn/nukkit/event/server/ServerStopEvent.java deleted file mode 100644 index 8b80ff244..000000000 --- a/src/main/java/cn/nukkit/event/server/ServerStopEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.event.server; - -import cn.nukkit.event.HandlerList; - -/** - * @author NycuRO - * NukkitX Project - */ -public class ServerStopEvent extends ServerEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/cn/nukkit/event/vehicle/EntityEnterVehicleEvent.java b/src/main/java/cn/nukkit/event/vehicle/EntityEnterVehicleEvent.java deleted file mode 100644 index 370f4b94c..000000000 --- a/src/main/java/cn/nukkit/event/vehicle/EntityEnterVehicleEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.event.vehicle; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class EntityEnterVehicleEvent extends VehicleEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Entity riding; - - public EntityEnterVehicleEvent(Entity riding, EntityVehicle vehicle) { - super(vehicle); - this.riding = riding; - } - - public Entity getEntity() { - return riding; - } - - public boolean isPlayer() { - return riding instanceof Player; - } -} diff --git a/src/main/java/cn/nukkit/event/vehicle/EntityExitVehicleEvent.java b/src/main/java/cn/nukkit/event/vehicle/EntityExitVehicleEvent.java deleted file mode 100644 index b120373db..000000000 --- a/src/main/java/cn/nukkit/event/vehicle/EntityExitVehicleEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.event.vehicle; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class EntityExitVehicleEvent extends VehicleEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Entity riding; - - public EntityExitVehicleEvent(Entity riding, EntityVehicle vehicle) { - super(vehicle); - this.riding = riding; - } - - public Entity getEntity() { - return riding; - } - - public boolean isPlayer() { - return riding instanceof Player; - } -} diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleCreateEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleCreateEvent.java deleted file mode 100644 index 15d4cf94a..000000000 --- a/src/main/java/cn/nukkit/event/vehicle/VehicleCreateEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.event.vehicle; - -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class VehicleCreateEvent extends VehicleEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public VehicleCreateEvent(EntityVehicle vehicle) { - super(vehicle); - } -} diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleDamageEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleDamageEvent.java deleted file mode 100644 index f9c40d890..000000000 --- a/src/main/java/cn/nukkit/event/vehicle/VehicleDamageEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.event.vehicle; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class VehicleDamageEvent extends VehicleEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Entity attacker; - private double damage; - - public VehicleDamageEvent(EntityVehicle vehicle, Entity attacker, double damage) { - super(vehicle); - this.attacker = attacker; - this.damage = damage; - } - - public Entity getAttacker() { - return attacker; - } - - public double getDamage() { - return damage; - } - - public void setDamage(double damage) { - this.damage = damage; - } -} diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyEvent.java deleted file mode 100644 index ebb2fc1c3..000000000 --- a/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.event.vehicle; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; - -public class VehicleDestroyEvent extends VehicleEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Entity attacker; - - public VehicleDestroyEvent(EntityVehicle vehicle, Entity attacker) { - super(vehicle); - this.attacker = attacker; - } - - public Entity getAttacker() { - return attacker; - } -} diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleEvent.java deleted file mode 100644 index a04071b80..000000000 --- a/src/main/java/cn/nukkit/event/vehicle/VehicleEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.event.vehicle; - -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.Event; - -/** - * Created by larryTheCoder at 7/5/2017. - * - * Nukkit Project - */ -public abstract class VehicleEvent extends Event { - - private final EntityVehicle vehicle; - - public VehicleEvent(EntityVehicle vehicle) { - this.vehicle = vehicle; - } - - public EntityVehicle getVehicle() { - return vehicle; - } -} diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleMoveEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleMoveEvent.java deleted file mode 100644 index 0cf898755..000000000 --- a/src/main/java/cn/nukkit/event/vehicle/VehicleMoveEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.event.vehicle; - -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.HandlerList; -import cn.nukkit.level.Location; - -public class VehicleMoveEvent extends VehicleEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - private final Location from; - private final Location to; - - public VehicleMoveEvent(EntityVehicle vehicle, Location from, Location to) { - super(vehicle); - this.from = from; - this.to = to; - } - - public Location getFrom() { - return from; - } - - public Location getTo() { - return to; - } -} diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleUpdateEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleUpdateEvent.java deleted file mode 100644 index 4f56750f4..000000000 --- a/src/main/java/cn/nukkit/event/vehicle/VehicleUpdateEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.event.vehicle; - -import cn.nukkit.entity.item.EntityVehicle; -import cn.nukkit.event.HandlerList; - -public class VehicleUpdateEvent extends VehicleEvent { - - private static final HandlerList handlers = new HandlerList(); - - public static HandlerList getHandlers() { - return handlers; - } - - public VehicleUpdateEvent(EntityVehicle vehicle) { - super(vehicle); - } -} diff --git a/src/main/java/cn/nukkit/event/weather/LightningStrikeEvent.java b/src/main/java/cn/nukkit/event/weather/LightningStrikeEvent.java deleted file mode 100644 index d667d5608..000000000 --- a/src/main/java/cn/nukkit/event/weather/LightningStrikeEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.event.weather; - -import cn.nukkit.entity.weather.EntityLightningStrike; -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.HandlerList; -import cn.nukkit.event.level.WeatherEvent; -import cn.nukkit.level.Level; - -/** - * @author funcraft - * Nukkit Project - */ -public class LightningStrikeEvent extends WeatherEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private final EntityLightningStrike bolt; - - public static HandlerList getHandlers() { - return handlers; - } - - public LightningStrikeEvent(Level level, final EntityLightningStrike bolt) { - super(level); - this.bolt = bolt; - } - - /** - * Gets the bolt which is striking the earth. - * @return lightning entity - */ - public EntityLightningStrike getLightning() { - return bolt; - } -} diff --git a/src/main/java/cn/nukkit/form/element/Element.java b/src/main/java/cn/nukkit/form/element/Element.java deleted file mode 100644 index 0bb96a433..000000000 --- a/src/main/java/cn/nukkit/form/element/Element.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.nukkit.form.element; - -public abstract class Element { -} diff --git a/src/main/java/cn/nukkit/form/element/ElementButton.java b/src/main/java/cn/nukkit/form/element/ElementButton.java deleted file mode 100644 index 9126cc1ec..000000000 --- a/src/main/java/cn/nukkit/form/element/ElementButton.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.form.element; - -public class ElementButton { - - private String text = ""; - private ElementButtonImageData image; - - public ElementButton(String text) { - this.text = text; - } - - public ElementButton(String text, ElementButtonImageData image) { - this.text = text; - if (!image.getData().isEmpty() && !image.getType().isEmpty()) this.image = image; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public ElementButtonImageData getImage() { - return image; - } - - public void addImage(ElementButtonImageData image) { - if (!image.getData().isEmpty() && !image.getType().isEmpty()) this.image = image; - } -} diff --git a/src/main/java/cn/nukkit/form/element/ElementButtonImageData.java b/src/main/java/cn/nukkit/form/element/ElementButtonImageData.java deleted file mode 100644 index e3d0fa4e4..000000000 --- a/src/main/java/cn/nukkit/form/element/ElementButtonImageData.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.form.element; - -public class ElementButtonImageData { - - public static final String IMAGE_DATA_TYPE_PATH = "path"; - public static final String IMAGE_DATA_TYPE_URL = "url"; - - private String type; - private String data; - - public ElementButtonImageData(String type, String data) { - if (!type.equals(IMAGE_DATA_TYPE_URL) && !type.equals(IMAGE_DATA_TYPE_PATH)) return; - this.type = type; - this.data = data; - } - - public String getType() { - return type; - } - - public String getData() { - return data; - } - - public void setType(String type) { - this.type = type; - } - - public void setData(String data) { - this.data = data; - } -} diff --git a/src/main/java/cn/nukkit/form/element/ElementDropdown.java b/src/main/java/cn/nukkit/form/element/ElementDropdown.java deleted file mode 100644 index c69e0a8fe..000000000 --- a/src/main/java/cn/nukkit/form/element/ElementDropdown.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.form.element; - -import com.google.gson.annotations.SerializedName; - -import java.util.ArrayList; -import java.util.List; - -public class ElementDropdown extends Element { - - @SuppressWarnings("unused") - private final String type = "dropdown"; - private String text = ""; - private List options; - @SerializedName("default") - private int defaultOptionIndex = 0; - - public ElementDropdown(String text) { - this(text, new ArrayList<>()); - } - - public ElementDropdown(String text, List options) { - this(text, options, 0); - } - - public ElementDropdown(String text, List options, int defaultOption) { - this.text = text; - this.options = options; - this.defaultOptionIndex = defaultOption; - } - - public int getDefaultOptionIndex() { - return defaultOptionIndex; - } - - public void setDefaultOptionIndex(int index) { - if (index >= options.size()) return; - this.defaultOptionIndex = index; - } - - public List getOptions() { - return options; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public void addOption(String option) { - addOption(option, false); - } - - public void addOption(String option, boolean isDefault) { - options.add(option); - if (isDefault) this.defaultOptionIndex = options.size() - 1; - } -} diff --git a/src/main/java/cn/nukkit/form/element/ElementInput.java b/src/main/java/cn/nukkit/form/element/ElementInput.java deleted file mode 100644 index c5a330436..000000000 --- a/src/main/java/cn/nukkit/form/element/ElementInput.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.form.element; - -import com.google.gson.annotations.SerializedName; - -public class ElementInput extends Element { - - @SuppressWarnings("unused") - private final String type = "input"; - private String text = ""; - private String placeholder = ""; - @SerializedName("default") - private String defaultText = ""; - - public ElementInput(String text) { - this(text, ""); - } - - public ElementInput(String text, String placeholder) { - this(text, placeholder, ""); - } - - public ElementInput(String text, String placeholder, String defaultText) { - this.text = text; - this.placeholder = placeholder; - this.defaultText = defaultText; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public String getPlaceHolder() { - return placeholder; - } - - public void setPlaceHolder(String placeholder) { - this.placeholder = placeholder; - } - - public String getDefaultText() { - return defaultText; - } - - public void setDefaultText(String defaultText) { - this.defaultText = defaultText; - } -} diff --git a/src/main/java/cn/nukkit/form/element/ElementLabel.java b/src/main/java/cn/nukkit/form/element/ElementLabel.java deleted file mode 100644 index 2f3a165fe..000000000 --- a/src/main/java/cn/nukkit/form/element/ElementLabel.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.form.element; - -public class ElementLabel extends Element { - - @SuppressWarnings("unused") - private final String type = "label"; - private String text = ""; - - public ElementLabel(String text) { - this.text = text; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } -} diff --git a/src/main/java/cn/nukkit/form/element/ElementSlider.java b/src/main/java/cn/nukkit/form/element/ElementSlider.java deleted file mode 100644 index 3b11f376c..000000000 --- a/src/main/java/cn/nukkit/form/element/ElementSlider.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.nukkit.form.element; - -import com.google.gson.annotations.SerializedName; - -public class ElementSlider extends Element { - - @SuppressWarnings("unused") - private final String type = "slider"; - private String text = ""; - private float min = 0f; - private float max = 100f; - private int step; - @SerializedName("default") - private float defaultValue; - - public ElementSlider(String text, float min, float max) { - this(text, min, max, -1); - } - - public ElementSlider(String text, float min, float max, int step) { - this(text, min, max, step, -1); - } - - public ElementSlider(String text, float min, float max, int step, float defaultValue) { - this.text = text; - this.min = Math.max(min, 0f); - this.max = Math.max(max, this.min); - if (step != -1.0f && step > 0) this.step = step; - if (defaultValue != -1.0f) this.defaultValue = defaultValue; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public float getMin() { - return min; - } - - public void setMin(float min) { - this.min = min; - } - - public float getMax() { - return max; - } - - public void setMax(float max) { - this.max = max; - } - - public int getStep() { - return step; - } - - public void setStep(int step) { - this.step = step; - } - - public float getDefaultValue() { - return defaultValue; - } - - public void setDefaultValue(float defaultValue) { - this.defaultValue = defaultValue; - } -} diff --git a/src/main/java/cn/nukkit/form/element/ElementStepSlider.java b/src/main/java/cn/nukkit/form/element/ElementStepSlider.java deleted file mode 100644 index 7075b5a0c..000000000 --- a/src/main/java/cn/nukkit/form/element/ElementStepSlider.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.form.element; - -import com.google.gson.annotations.SerializedName; - -import java.util.ArrayList; -import java.util.List; - -public class ElementStepSlider extends Element { - - @SuppressWarnings("unused") - private final String type = "step_slider"; - private String text = ""; - private List steps; - @SerializedName("default") - private int defaultStepIndex = 0; - - public ElementStepSlider(String text) { - this(text, new ArrayList<>()); - } - - public ElementStepSlider(String text, List steps) { - this(text, steps, 0); - } - - public ElementStepSlider(String text, List steps, int defaultStep) { - this.text = text; - this.steps = steps; - this.defaultStepIndex = defaultStep; - } - - public int getDefaultStepIndex() { - return defaultStepIndex; - } - - public void setDefaultOptionIndex(int index) { - if (index >= steps.size()) return; - this.defaultStepIndex = index; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public List getSteps() { - return steps; - } - - public void addStep(String step) { - addStep(step, false); - } - - public void addStep(String step, boolean isDefault) { - steps.add(step); - if (isDefault) this.defaultStepIndex = steps.size() - 1; - } -} diff --git a/src/main/java/cn/nukkit/form/element/ElementToggle.java b/src/main/java/cn/nukkit/form/element/ElementToggle.java deleted file mode 100644 index c2fc4f557..000000000 --- a/src/main/java/cn/nukkit/form/element/ElementToggle.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.form.element; - -import com.google.gson.annotations.SerializedName; - -public class ElementToggle extends Element { - - @SuppressWarnings("unused") - private final String type = "toggle"; - private String text; - @SerializedName("default") - private boolean defaultValue; - - public ElementToggle(String text) { - this(text, false); - } - - public ElementToggle(String text, boolean defaultValue) { - this.text = text; - this.defaultValue = defaultValue; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public boolean isDefaultValue() { - return defaultValue; - } - - public void setDefaultValue(boolean defaultValue) { - this.defaultValue = defaultValue; - } -} diff --git a/src/main/java/cn/nukkit/form/response/FormResponse.java b/src/main/java/cn/nukkit/form/response/FormResponse.java deleted file mode 100644 index 8f83c5892..000000000 --- a/src/main/java/cn/nukkit/form/response/FormResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.nukkit.form.response; - -public abstract class FormResponse { -} diff --git a/src/main/java/cn/nukkit/form/response/FormResponseCustom.java b/src/main/java/cn/nukkit/form/response/FormResponseCustom.java deleted file mode 100644 index da0d2f4e3..000000000 --- a/src/main/java/cn/nukkit/form/response/FormResponseCustom.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.form.response; - -import java.util.HashMap; - -public class FormResponseCustom extends FormResponse { - - private final HashMap responses; - private final HashMap dropdownResponses; - private final HashMap inputResponses; - private final HashMap sliderResponses; - private final HashMap stepSliderResponses; - private final HashMap toggleResponses; - private final HashMap labelResponses; - - public FormResponseCustom(HashMap responses, HashMap dropdownResponses, - HashMap inputResponses, HashMap sliderResponses, - HashMap stepSliderResponses, - HashMap toggleResponses, - HashMap labelResponses) { - this.responses = responses; - this.dropdownResponses = dropdownResponses; - this.inputResponses = inputResponses; - this.sliderResponses = sliderResponses; - this.stepSliderResponses = stepSliderResponses; - this.toggleResponses = toggleResponses; - this.labelResponses = labelResponses; - } - - public HashMap getResponses() { - return responses; - } - - public Object getResponse(int id) { - return responses.get(id); - } - - public FormResponseData getDropdownResponse(int id) { - return dropdownResponses.get(id); - } - - public String getInputResponse(int id) { - return inputResponses.get(id); - } - - public float getSliderResponse(int id) { - return sliderResponses.get(id); - } - - public FormResponseData getStepSliderResponse(int id) { - return stepSliderResponses.get(id); - } - - public boolean getToggleResponse(int id) { - return toggleResponses.get(id); - } - - public String getLabelResponse(int id) { - return labelResponses.get(id); - } -} diff --git a/src/main/java/cn/nukkit/form/response/FormResponseData.java b/src/main/java/cn/nukkit/form/response/FormResponseData.java deleted file mode 100644 index 6a96cda04..000000000 --- a/src/main/java/cn/nukkit/form/response/FormResponseData.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.form.response; - -public class FormResponseData { - - private final int elementID; - private final String elementContent; - - public FormResponseData(int id, String content) { - this.elementID = id; - this.elementContent = content; - } - - public int getElementID() { - return elementID; - } - - public String getElementContent() { - return elementContent; - } -} diff --git a/src/main/java/cn/nukkit/form/response/FormResponseModal.java b/src/main/java/cn/nukkit/form/response/FormResponseModal.java deleted file mode 100644 index 6b610096d..000000000 --- a/src/main/java/cn/nukkit/form/response/FormResponseModal.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.form.response; - -public class FormResponseModal extends FormResponse { - - private final int clickedButtonId; - private final String clickedButtonText; - - public FormResponseModal(int clickedButtonId, String clickedButtonText) { - this.clickedButtonId = clickedButtonId; - this.clickedButtonText = clickedButtonText; - } - - public int getClickedButtonId() { - return clickedButtonId; - } - - public String getClickedButtonText() { - return clickedButtonText; - } -} diff --git a/src/main/java/cn/nukkit/form/response/FormResponseSimple.java b/src/main/java/cn/nukkit/form/response/FormResponseSimple.java deleted file mode 100644 index 1e3084159..000000000 --- a/src/main/java/cn/nukkit/form/response/FormResponseSimple.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.form.response; - -import cn.nukkit.form.element.ElementButton; - -public class FormResponseSimple extends FormResponse { - - private final int clickedButtonId; - private final ElementButton clickedButton; - - public FormResponseSimple(int clickedButtonId, ElementButton clickedButton) { - this.clickedButtonId = clickedButtonId; - this.clickedButton = clickedButton; - } - - public int getClickedButtonId() { - return clickedButtonId; - } - - public ElementButton getClickedButton() { - return clickedButton; - } -} diff --git a/src/main/java/cn/nukkit/form/window/FormWindow.java b/src/main/java/cn/nukkit/form/window/FormWindow.java deleted file mode 100644 index 619309198..000000000 --- a/src/main/java/cn/nukkit/form/window/FormWindow.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.form.window; - -import cn.nukkit.form.response.FormResponse; -import com.google.gson.Gson; - -public abstract class FormWindow { - - static final Gson GSON = new Gson(); - - protected boolean closed = false; - - public String getJSONData() { - return FormWindow.GSON.toJson(this); - } - - public abstract void setResponse(String data); - - public abstract FormResponse getResponse(); - - public boolean wasClosed() { - return closed; - } -} diff --git a/src/main/java/cn/nukkit/form/window/FormWindowCustom.java b/src/main/java/cn/nukkit/form/window/FormWindowCustom.java deleted file mode 100644 index f48d652a5..000000000 --- a/src/main/java/cn/nukkit/form/window/FormWindowCustom.java +++ /dev/null @@ -1,154 +0,0 @@ -package cn.nukkit.form.window; - -import cn.nukkit.form.element.*; -import cn.nukkit.form.response.FormResponseCustom; -import cn.nukkit.form.response.FormResponseData; -import com.google.gson.reflect.TypeToken; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class FormWindowCustom extends FormWindow { - - @SuppressWarnings("unused") - private final String type = "custom_form"; - private String title = ""; - private ElementButtonImageData icon; - private List content; - - private FormResponseCustom response; - - public FormWindowCustom(String title) { - this(title, new ArrayList<>()); - } - - public FormWindowCustom(String title, List contents) { - this(title, contents, (ElementButtonImageData) null); - } - - public FormWindowCustom(String title, List contents, String icon) { - this(title, contents, icon.isEmpty() ? null : new ElementButtonImageData(ElementButtonImageData.IMAGE_DATA_TYPE_URL, icon)); - } - - public FormWindowCustom(String title, List contents, ElementButtonImageData icon) { - this.title = title; - this.content = contents; - this.icon = icon; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public List getElements() { - return content; - } - - public void addElement(Element element) { - content.add(element); - } - - public ElementButtonImageData getIcon() { - return icon; - } - - public void setIcon(String icon) { - if (!icon.isEmpty()) this.icon = new ElementButtonImageData(ElementButtonImageData.IMAGE_DATA_TYPE_URL, icon); - } - - public void setIcon(ElementButtonImageData icon) { - this.icon = icon; - } - - public FormResponseCustom getResponse() { - return response; - } - - public void setResponse(String data) { - if (data.equals("null")) { - this.closed = true; - return; - } - - List elementResponses = GSON.fromJson(data, new ListTypeToken().getType()); - - int i = 0; - - HashMap dropdownResponses = new HashMap<>(); - HashMap inputResponses = new HashMap<>(); - HashMap sliderResponses = new HashMap<>(); - HashMap stepSliderResponses = new HashMap<>(); - HashMap toggleResponses = new HashMap<>(); - HashMap responses = new HashMap<>(); - HashMap labelResponses = new HashMap<>(); - - for (String elementData : elementResponses) { - if (i >= content.size()) { - break; - } - - Element e = content.get(i); - if (e == null) break; - if (e instanceof ElementLabel) { - labelResponses.put(i, ((ElementLabel) e).getText()); - responses.put(i, ((ElementLabel) e).getText()); - } else if (e instanceof ElementDropdown) { - String answer = ((ElementDropdown) e).getOptions().get(Integer.parseInt(elementData)); - dropdownResponses.put(i, new FormResponseData(Integer.parseInt(elementData), answer)); - responses.put(i, answer); - } else if (e instanceof ElementInput) { - inputResponses.put(i, elementData); - responses.put(i, elementData); - } else if (e instanceof ElementSlider) { - Float answer = Float.parseFloat(elementData); - sliderResponses.put(i, answer); - responses.put(i, answer); - } else if (e instanceof ElementStepSlider) { - String answer = ((ElementStepSlider) e).getSteps().get(Integer.parseInt(elementData)); - stepSliderResponses.put(i, new FormResponseData(Integer.parseInt(elementData), answer)); - responses.put(i, answer); - } else if (e instanceof ElementToggle) { - Boolean answer = Boolean.parseBoolean(elementData); - toggleResponses.put(i, answer); - responses.put(i, answer); - } - i++; - } - - this.response = new FormResponseCustom(responses, dropdownResponses, inputResponses, - sliderResponses, stepSliderResponses, toggleResponses, labelResponses); - } - - /** - * Set Elements from Response - * Used on ServerSettings Form Response. After players set settings, we need to sync these settings to the server. - */ - public void setElementsFromResponse() { - if (this.response != null) { - this.response.getResponses().forEach((i, response) -> { - Element e = content.get(i); - if (e != null) { - if (e instanceof ElementDropdown) { - ((ElementDropdown) e).setDefaultOptionIndex(((ElementDropdown) e).getOptions().indexOf(response)); - } else if (e instanceof ElementInput) { - ((ElementInput) e).setDefaultText((String)response); - } else if (e instanceof ElementSlider) { - ((ElementSlider) e).setDefaultValue((Float)response); - } else if (e instanceof ElementStepSlider) { - ((ElementStepSlider) e).setDefaultOptionIndex(((ElementStepSlider) e).getSteps().indexOf(response)); - } else if (e instanceof ElementToggle) { - ((ElementToggle) e).setDefaultValue((Boolean)response); - } - } - }); - } - } - - private static class ListTypeToken extends TypeToken> { - } -} diff --git a/src/main/java/cn/nukkit/form/window/FormWindowModal.java b/src/main/java/cn/nukkit/form/window/FormWindowModal.java deleted file mode 100644 index cb58679c9..000000000 --- a/src/main/java/cn/nukkit/form/window/FormWindowModal.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.form.window; - -import cn.nukkit.form.response.FormResponseModal; - -public class FormWindowModal extends FormWindow { - - @SuppressWarnings("unused") - private final String type = "modal"; - private String title = ""; - private String content = ""; - private String button1 = ""; - private String button2 = ""; - - private FormResponseModal response = null; - - public FormWindowModal(String title, String content, String trueButtonText, String falseButtonText) { - this.title = title; - this.content = content; - this.button1 = trueButtonText; - this.button2 = falseButtonText; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public String getButton1() { - return button1; - } - - public void setButton1(String button1) { - this.button1 = button1; - } - - public String getButton2() { - return button2; - } - - public void setButton2(String button2) { - this.button2 = button2; - } - - public FormResponseModal getResponse() { - return response; - } - - public void setResponse(String data) { - if (data.equals("null")) { - closed = true; - return; - } - if (data.equals("true")) response = new FormResponseModal(0, button1); - else response = new FormResponseModal(1, button2); - } -} diff --git a/src/main/java/cn/nukkit/form/window/FormWindowSimple.java b/src/main/java/cn/nukkit/form/window/FormWindowSimple.java deleted file mode 100644 index 6d488870a..000000000 --- a/src/main/java/cn/nukkit/form/window/FormWindowSimple.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit.form.window; - -import cn.nukkit.form.element.ElementButton; -import cn.nukkit.form.response.FormResponseSimple; - -import java.util.ArrayList; -import java.util.List; - -public class FormWindowSimple extends FormWindow { - - @SuppressWarnings("unused") - private final String type = "form"; - private String title = ""; - private String content = ""; - private List buttons; - - private FormResponseSimple response = null; - - public FormWindowSimple(String title, String content) { - this(title, content, new ArrayList<>()); - } - - public FormWindowSimple(String title, String content, List buttons) { - this.title = title; - this.content = content; - this.buttons = buttons; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public List getButtons() { - return buttons; - } - - public void addButton(ElementButton button) { - this.buttons.add(button); - } - - public FormResponseSimple getResponse() { - return response; - } - - public void setResponse(String data) { - if (data.equals("null")) { - this.closed = true; - return; - } - int buttonID; - try { - buttonID = Integer.parseInt(data); - } catch (Exception e) { - return; - } - if (buttonID >= this.buttons.size()) { - this.response = new FormResponseSimple(buttonID, null); - return; - } - this.response = new FormResponseSimple(buttonID, buttons.get(buttonID)); - } -} diff --git a/src/main/java/cn/nukkit/inventory/AnvilInventory.java b/src/main/java/cn/nukkit/inventory/AnvilInventory.java deleted file mode 100644 index 503ad82b8..000000000 --- a/src/main/java/cn/nukkit/inventory/AnvilInventory.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Position; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class AnvilInventory extends FakeBlockUIComponent { - - public static final int ANVIL_INPUT_UI_SLOT = 1; - public static final int ANVIL_MATERIAL_UI_SLOT = 2; - public static final int ANVIL_OUTPUT_UI_SLOT = CREATED_ITEM_OUTPUT_UI_SLOT; - - public static final int TARGET = 0; - public static final int SACRIFICE = 1; - public static final int RESULT = ANVIL_OUTPUT_UI_SLOT - 1; //1: offset - - private int cost; - - public AnvilInventory(PlayerUIInventory playerUI, Position position) { - super(playerUI, InventoryType.ANVIL, 1, position); - } - - @Override - public void onClose(Player who) { - super.onClose(who); - who.craftingType = Player.CRAFTING_SMALL; - who.resetCraftingGridType(); - - for (int i = 0; i < 2; ++i) { - this.getHolder().getLevel().dropItem(this.getHolder().add(0.5, 0.5, 0.5), this.getItem(i)); - this.clear(i); - } - } - - @Override - public void onOpen(Player who) { - super.onOpen(who); - who.craftingType = Player.CRAFTING_ANVIL; - } - - public Item getInputSlot() { - return this.getItem(TARGET); - } - - public Item getMaterialSlot() { - return this.getItem(SACRIFICE); - } - - public Item getOutputSlot() { - return this.getItem(RESULT); - } - - public int getCost() { - return this.cost; - } - - public void setCost(int cost) { - this.cost = cost; - } -} diff --git a/src/main/java/cn/nukkit/inventory/BaseInventory.java b/src/main/java/cn/nukkit/inventory/BaseInventory.java deleted file mode 100644 index 692a615fd..000000000 --- a/src/main/java/cn/nukkit/inventory/BaseInventory.java +++ /dev/null @@ -1,591 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityInventoryChangeEvent; -import cn.nukkit.event.inventory.InventoryOpenEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.network.protocol.InventoryContentPacket; -import cn.nukkit.network.protocol.InventorySlotPacket; - -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BaseInventory implements Inventory { - - protected final InventoryType type; - - protected int maxStackSize = Inventory.MAX_STACK; - - protected int size; - - protected final String name; - - protected final String title; - - public final Map slots = new HashMap<>(); - - protected final Set viewers = new HashSet<>(); - - protected InventoryHolder holder; - - public boolean destroyed = false; - - final Item air; - - public BaseInventory(InventoryHolder holder, InventoryType type) { - this(holder, type, new HashMap<>()); - } - - public BaseInventory(InventoryHolder holder, InventoryType type, Map items) { - this(holder, type, items, null); - } - - public BaseInventory(InventoryHolder holder, InventoryType type, Map items, Integer overrideSize) { - this(holder, type, items, overrideSize, null); - } - - public BaseInventory(InventoryHolder holder, InventoryType type, Map items, Integer overrideSize, String overrideTitle) { - air = new ItemBlock(Block.get(BlockID.AIR, null), 0, 0); - - this.holder = holder; - - this.type = type; - - if (overrideSize != null) { - this.size = overrideSize; - } else { - this.size = this.type.getDefaultSize(); - } - - if (overrideTitle != null) { - this.title = overrideTitle; - } else { - this.title = this.type.getDefaultTitle(); - } - - this.name = this.type.getDefaultTitle(); - - if (!(this instanceof DoubleChestInventory)) { - this.setContents(items); - } - } - - @Override - public int getSize() { - return size; - } - - public void setSize(int size) { - this.size = size; - } - - @Override - public int getMaxStackSize() { - return maxStackSize; - } - - @Override - public String getName() { - return name; - } - - @Override - public String getTitle() { - return title; - } - - @Override - public Item getItem(int index) { - return this.slots.containsKey(index) ? this.slots.get(index).clone() : new ItemBlock(Block.get(BlockID.AIR), null, 0); - } - - public Item getItemFast(int index) { - return this.slots.containsKey(index) ? this.slots.get(index) : air; - } - - @Override - public Map getContents() { - return new HashMap<>(this.slots); - } - - @Override - public void setContents(Map items) { - if (items.size() > this.size) { - TreeMap newItems = new TreeMap<>(); - for (Map.Entry entry : items.entrySet()) { - newItems.put(entry.getKey(), entry.getValue()); - } - items = newItems; - newItems = new TreeMap<>(); - int i = 0; - for (Map.Entry entry : items.entrySet()) { - newItems.put(entry.getKey(), entry.getValue()); - i++; - if (i >= this.size) { - break; - } - } - items = newItems; - } - - for (int i = 0; i < this.size; ++i) { - if (!items.containsKey(i)) { - if (this.slots.containsKey(i)) { - this.clear(i); - } - } else { - if (!this.setItem(i, items.get(i))) { - this.clear(i); - } - } - } - } - - @Override - public boolean setItem(int index, Item item, boolean send) { - //item = item.clone(); - if (index < 0 || index >= this.size || !this.allowedToAdd(item)) { - return false; - } else if (item.getId() == 0 || item.getCount() <= 0) { - return this.clear(index, send); - } - - InventoryHolder holder = this.getHolder(); - if (holder instanceof Entity) { - EntityInventoryChangeEvent ev = new EntityInventoryChangeEvent((Entity) holder, this.getItem(index), item, index); - Server.getInstance().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - this.sendSlot(index, this.getViewers()); - return false; - } - - item = ev.getNewItem(); - } - - if (holder instanceof BlockEntity) { - ((BlockEntity) holder).setDirty(); - } - - Item old = this.getItem(index); - this.slots.put(index, item.clone()); - this.onSlotChange(index, old, send); - return true; - } - - @Override - public boolean contains(Item item) { - int count = Math.max(1, item.getCount()); - boolean checkDamage = item.hasMeta() && item.getDamage() >= 0; - boolean checkTag = item.getCompoundTag() != null; - for (Item i : this.getContents().values()) { - if (item.equals(i, checkDamage, checkTag)) { - count -= i.getCount(); - if (count <= 0) { - return true; - } - } - } - - return false; - } - - @Override - public Map all(Item item) { - Map slots = new HashMap<>(); - boolean checkDamage = item.hasMeta() && item.getDamage() >= 0; - boolean checkTag = item.getCompoundTag() != null; - for (Map.Entry entry : this.getContents().entrySet()) { - if (item.equals(entry.getValue(), checkDamage, checkTag)) { - slots.put(entry.getKey(), entry.getValue()); - } - } - - return slots; - } - - @Override - public void remove(Item item) { - boolean checkDamage = item.hasMeta(); - boolean checkTag = item.getCompoundTag() != null; - for (Map.Entry entry : this.getContents().entrySet()) { - if (item.equals(entry.getValue(), checkDamage, checkTag)) { - this.clear(entry.getKey()); - } - } - } - - @Override - public int first(Item item, boolean exact) { - int count = Math.max(1, item.getCount()); - boolean checkDamage = item.hasMeta(); - boolean checkTag = item.getCompoundTag() != null; - for (Map.Entry entry : this.getContents().entrySet()) { - if (item.equals(entry.getValue(), checkDamage, checkTag) && (entry.getValue().getCount() == count || (!exact && entry.getValue().getCount() > count))) { - return entry.getKey(); - } - } - - return -1; - } - - @Override - public int firstEmpty(Item item) { - for (int i = 0; i < this.size; ++i) { - if (this.getItem(i).getId() == Item.AIR) { - return i; - } - } - - return -1; - } - - @Override - public void decreaseCount(int slot) { - Item item = this.getItem(slot); - - if (item.getCount() > 0) { - item.count--; - this.setItem(slot, item); - } - } - - @Override - public boolean canAddItem(Item item) { - int count = item.getCount(); - boolean checkDamage = item.hasMeta(); - boolean checkTag = item.getCompoundTag() != null; - int i1 = this.getSize(); - for (int i = 0; i < i1; ++i) { - Item slot = this.getItemFast(i); - if (item.equals(slot, checkDamage, checkTag)) { - int diff; - if ((diff = slot.getMaxStackSize() - slot.getCount()) > 0) { - count -= diff; - } - } else if (slot.getId() == Item.AIR) { - count -= this.getMaxStackSize(); - } - - if (count <= 0) { - return true; - } - } - - return false; - } - - @Override - public boolean allowedToAdd(Item item) { - return true; - } - - @Override - public Item[] addItem(Item... slots) { - List itemSlots = new ArrayList<>(); - for (Item slot : slots) { - if (slot.getId() != 0 && slot.getCount() > 0) { - itemSlots.add(slot.clone()); - } - } - - List emptySlots = new ArrayList<>(); - - for (int i = 0; i < this.getSize(); ++i) { - Item item = this.getItem(i); - if (item.getId() == Item.AIR || item.getCount() <= 0) { - emptySlots.add(i); - } - - for (Item slot : new ArrayList<>(itemSlots)) { - if (slot.equals(item) && item.getCount() < item.getMaxStackSize()) { - int amount = Math.min(item.getMaxStackSize() - item.getCount(), slot.getCount()); - amount = Math.min(amount, this.maxStackSize); - if (amount > 0) { - slot.setCount(slot.getCount() - amount); - item.setCount(item.getCount() + amount); - this.setItem(i, item); - if (slot.getCount() <= 0) { - itemSlots.remove(slot); - } - } - } - } - if (itemSlots.isEmpty()) { - break; - } - } - - if (!itemSlots.isEmpty() && !emptySlots.isEmpty()) { - for (int slotIndex : emptySlots) { - if (!itemSlots.isEmpty()) { - Item slot = itemSlots.get(0); - int amount = Math.min(slot.getMaxStackSize(), slot.getCount()); - amount = Math.min(amount, this.maxStackSize); - slot.setCount(slot.getCount() - amount); - Item item = slot.clone(); - item.setCount(amount); - this.setItem(slotIndex, item); - if (slot.getCount() <= 0) { - itemSlots.remove(slot); - } - } - } - } - - return itemSlots.toArray(new Item[0]); - } - - @Override - public Item[] removeItem(Item... slots) { - List itemSlots = new ArrayList<>(); - for (Item slot : slots) { - if (slot.getId() != 0 && slot.getCount() > 0) { - itemSlots.add(slot.clone()); - } - } - - for (int i = 0; i < this.size; ++i) { - Item item = this.getItem(i); - if (item.getId() == Item.AIR || item.getCount() <= 0) { - continue; - } - - for (Item slot : new ArrayList<>(itemSlots)) { - if (slot.equals(item, item.hasMeta(), item.getCompoundTag() != null)) { - int amount = Math.min(item.getCount(), slot.getCount()); - slot.setCount(slot.getCount() - amount); - item.setCount(item.getCount() - amount); - this.setItem(i, item); - if (slot.getCount() <= 0) { - itemSlots.remove(slot); - } - } - } - - if (itemSlots.isEmpty()) { - break; - } - } - - return itemSlots.toArray(new Item[0]); - } - - @Override - public boolean clear(int index, boolean send) { - if (this.slots.containsKey(index)) { - Item item = new ItemBlock(Block.get(BlockID.AIR), null, 0); - Item old = this.slots.get(index); - InventoryHolder holder = this.getHolder(); - if (holder instanceof Entity) { - EntityInventoryChangeEvent ev = new EntityInventoryChangeEvent((Entity) holder, old, item, index); - Server.getInstance().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - this.sendSlot(index, this.getViewers()); - return false; - } - item = ev.getNewItem(); - } - - if (holder instanceof BlockEntity) { - ((BlockEntity) holder).setDirty(); - } - - if (item.getId() != Item.AIR) { - this.slots.put(index, item.clone()); - } else { - this.slots.remove(index); - } - - this.onSlotChange(index, old, send); - } - - return true; - } - - @Override - public void clearAll() { - for (Integer index : this.getContents().keySet()) { - this.clear(index); - } - } - - @Override - public Set getViewers() { - return viewers; - } - - @Override - public InventoryHolder getHolder() { - return holder; - } - - @Override - public void setMaxStackSize(int maxStackSize) { - this.maxStackSize = maxStackSize; - } - - @Override - public boolean open(Player who) { - InventoryOpenEvent ev = new InventoryOpenEvent(this, who); - who.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - this.onOpen(who); - - return true; - } - - @Override - public void close(Player who) { - this.onClose(who); - } - - @Override - public void onOpen(Player who) { - this.viewers.add(who); - } - - @Override - public void onClose(Player who) { - this.viewers.remove(who); - } - - @Override - public void onSlotChange(int index, Item before, boolean send) { - if (send) { - this.sendSlot(index, this.getViewers()); - } - } - - @Override - public void sendContents(Player player) { - this.sendContents(new Player[]{player}); - } - - @Override - public void sendContents(Player... players) { - InventoryContentPacket pk = new InventoryContentPacket(); - pk.slots = new Item[this.getSize()]; - for (int i = 0; i < this.getSize(); ++i) { - pk.slots[i] = this.getItem(i); - } - - for (Player player : players) { - int id = player.getWindowId(this); - if (id == -1) { - this.close(player); - continue; - } - pk.inventoryId = id; - player.dataPacket(pk); - } - } - - @Override - public boolean isFull() { - if (this.slots.size() < this.getSize()) { - return false; - } - - for (Item item : this.slots.values()) { - if (item == null || item.getId() == 0 || item.getCount() < item.getMaxStackSize() || item.getCount() < this.maxStackSize) { - return false; - } - } - - return true; - } - - @Override - public boolean isEmpty() { - if (this.maxStackSize <= 0) { - return false; - } - - for (Item item : this.slots.values()) { - if (item != null && item.getId() != 0 && item.getCount() > 0) { - return false; - } - } - - return true; - } - - public int getFreeSpace(Item item) { - int maxStackSize = Math.min(item.getMaxStackSize(), this.maxStackSize); - int space = (this.getSize() - this.slots.size()) * maxStackSize; - - for (Item slot : this.getContents().values()) { - if (slot == null || slot.getId() == 0) { - space += maxStackSize; - continue; - } - - if (slot.equals(item, true, true)) { - space += maxStackSize - slot.getCount(); - } - } - - return space; - } - - @Override - public void sendContents(Collection players) { - this.sendContents(players.toArray(new Player[0])); - } - - @Override - public void sendSlot(int index, Player player) { - this.sendSlotTo(index, player); - } - - private void sendSlotTo(int index, Player player) { - InventorySlotPacket pk = new InventorySlotPacket(); - pk.slot = index; - pk.item = this.getItem(index).clone(); - int id = player.getWindowId(this); - if (id == -1) { - this.close(player); - return; - } - pk.inventoryId = id; - player.dataPacket(pk); - } - - @Override - public void sendSlot(int index, Player... players) { - InventorySlotPacket pk = new InventorySlotPacket(); - pk.slot = index; - pk.item = this.getItem(index).clone(); - - for (Player player : players) { - int id = player.getWindowId(this); - if (id == -1) { - this.close(player); - continue; - } - pk.inventoryId = id; - player.dataPacket(pk); - } - } - - @Override - public void sendSlot(int index, Collection players) { - this.sendSlot(index, players.toArray(new Player[0])); - } - - @Override - public InventoryType getType() { - return type; - } -} diff --git a/src/main/java/cn/nukkit/inventory/BeaconInventory.java b/src/main/java/cn/nukkit/inventory/BeaconInventory.java deleted file mode 100644 index ccc6bfc01..000000000 --- a/src/main/java/cn/nukkit/inventory/BeaconInventory.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.level.Position; - -/** - * @author Rover656 - */ -public class BeaconInventory extends FakeBlockUIComponent { - - public BeaconInventory(PlayerUIInventory playerUI, Position position) { - super(playerUI, InventoryType.BEACON, 27, position); - } - - @Override - public void onClose(Player who) { - super.onClose(who); - - // Drop item in slot if client doesn't automatically move it to player's inventory - if (!who.isConnected()) { - this.getHolder().getLevel().dropItem(this.getHolder().add(0.5, 0.5, 0.5), this.getItem(0)); - } - this.clear(0); - } -} diff --git a/src/main/java/cn/nukkit/inventory/BigCraftingGrid.java b/src/main/java/cn/nukkit/inventory/BigCraftingGrid.java deleted file mode 100644 index 9cc4fed1a..000000000 --- a/src/main/java/cn/nukkit/inventory/BigCraftingGrid.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.nukkit.inventory; - -/** - * @author CreeperFace - */ -public class BigCraftingGrid extends CraftingGrid { - - BigCraftingGrid(PlayerUIInventory playerUI) { - super(playerUI, 32, 9); - } -} diff --git a/src/main/java/cn/nukkit/inventory/BrewingInventory.java b/src/main/java/cn/nukkit/inventory/BrewingInventory.java deleted file mode 100644 index e7ca34011..000000000 --- a/src/main/java/cn/nukkit/inventory/BrewingInventory.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.inventory; - - -import cn.nukkit.blockentity.BlockEntityBrewingStand; -import cn.nukkit.item.Item; - -public class BrewingInventory extends ContainerInventory { - - public BrewingInventory(BlockEntityBrewingStand brewingStand) { - super(brewingStand, InventoryType.BREWING_STAND); - } - - @Override - public BlockEntityBrewingStand getHolder() { - return (BlockEntityBrewingStand) this.holder; - } - - public Item getIngredient() { - return getItem(0); - } - - public void setIngredient(Item item) { - setItem(0, item); - } - - public void setFuel(Item fuel) { - setItem(4, fuel); - } - - public Item getFuel() { - return getItem(4); - } - - @Override - public void onSlotChange(int index, Item before, boolean send) { - super.onSlotChange(index, before, send); - - if (index >= 1 && index <= 3) { - this.getHolder().updateBlock(); - } - - this.getHolder().scheduleUpdate(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/BrewingRecipe.java b/src/main/java/cn/nukkit/inventory/BrewingRecipe.java deleted file mode 100644 index 6b14f7655..000000000 --- a/src/main/java/cn/nukkit/inventory/BrewingRecipe.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.inventory; - - -import cn.nukkit.item.Item; - -public class BrewingRecipe extends MixRecipe { - - public BrewingRecipe(Item input, Item ingredient, Item output) { - super(input, ingredient, output); - } - - @Override - public void registerToCraftingManager(CraftingManager manager) { - manager.registerBrewingRecipe(this); - } - - @Override - public RecipeType getType() { - throw new UnsupportedOperationException(); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/inventory/ChestInventory.java b/src/main/java/cn/nukkit/inventory/ChestInventory.java deleted file mode 100644 index 03d2bcfd5..000000000 --- a/src/main/java/cn/nukkit/inventory/ChestInventory.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntityChest; -import cn.nukkit.level.Level; -import cn.nukkit.network.protocol.BlockEventPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ChestInventory extends ContainerInventory { - - protected DoubleChestInventory doubleInventory; - - public ChestInventory(BlockEntityChest chest) { - super(chest, InventoryType.CHEST); - } - - @Override - public BlockEntityChest getHolder() { - return (BlockEntityChest) this.holder; - } - - @Override - public void onOpen(Player who) { - super.onOpen(who); - - if (this.getViewers().size() == 1) { - BlockEventPacket pk = new BlockEventPacket(); - pk.x = (int) this.getHolder().getX(); - pk.y = (int) this.getHolder().getY(); - pk.z = (int) this.getHolder().getZ(); - pk.case1 = 1; - pk.case2 = 2; - - Level level = this.getHolder().getLevel(); - if (level != null) { - level.addLevelSoundEvent(this.getHolder().add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_CHEST_OPEN); - level.addChunkPacket((int) this.getHolder().getX() >> 4, (int) this.getHolder().getZ() >> 4, pk); - } - } - } - - @Override - public void onClose(Player who) { - if (this.getViewers().size() == 1) { - BlockEventPacket pk = new BlockEventPacket(); - pk.x = (int) this.getHolder().getX(); - pk.y = (int) this.getHolder().getY(); - pk.z = (int) this.getHolder().getZ(); - pk.case1 = 1; - pk.case2 = 0; - - Level level = this.getHolder().getLevel(); - if (level != null) { - level.addLevelSoundEvent(this.getHolder().add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_CHEST_CLOSED); - level.addChunkPacket((int) this.getHolder().getX() >> 4, (int) this.getHolder().getZ() >> 4, pk); - } - } - - super.onClose(who); - } - - public void setDoubleInventory(DoubleChestInventory doubleInventory) { - this.doubleInventory = doubleInventory; - } - - public DoubleChestInventory getDoubleInventory() { - return doubleInventory; - } - - @Override - public void sendSlot(int index, Player... players) { - if (this.doubleInventory != null) { - this.doubleInventory.sendSlot(this, index, players); - } else { - super.sendSlot(index, players); - } - } -} diff --git a/src/main/java/cn/nukkit/inventory/ContainerInventory.java b/src/main/java/cn/nukkit/inventory/ContainerInventory.java deleted file mode 100644 index 99a4787f9..000000000 --- a/src/main/java/cn/nukkit/inventory/ContainerInventory.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.item.Item; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.ContainerClosePacket; -import cn.nukkit.network.protocol.ContainerOpenPacket; - -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class ContainerInventory extends BaseInventory { - public ContainerInventory(InventoryHolder holder, InventoryType type) { - super(holder, type); - } - - public ContainerInventory(InventoryHolder holder, InventoryType type, Map items) { - super(holder, type, items); - } - - public ContainerInventory(InventoryHolder holder, InventoryType type, Map items, Integer overrideSize) { - super(holder, type, items, overrideSize); - } - - public ContainerInventory(InventoryHolder holder, InventoryType type, Map items, Integer overrideSize, String overrideTitle) { - super(holder, type, items, overrideSize, overrideTitle); - } - - @Override - public void onOpen(Player who) { - super.onOpen(who); - ContainerOpenPacket pk = new ContainerOpenPacket(); - pk.windowId = who.getWindowId(this); - pk.type = this.getType().getNetworkType(); - InventoryHolder holder = this.getHolder(); - if (holder instanceof Vector3) { - pk.x = (int) ((Vector3) holder).getX(); - pk.y = (int) ((Vector3) holder).getY(); - pk.z = (int) ((Vector3) holder).getZ(); - } else { - pk.x = pk.y = pk.z = 0; - } - - if (holder instanceof Entity) { - pk.entityId = ((Entity) holder).getId(); - } - - who.dataPacket(pk); - - this.sendContents(who); - } - - @Override - public void onClose(Player who) { - ContainerClosePacket pk = new ContainerClosePacket(); - pk.windowId = who.getWindowId(this); - pk.wasServerInitiated = who.getClosingWindowId() != pk.windowId; - who.dataPacket(pk); - super.onClose(who); - } - - public static int calculateRedstone(Inventory inv) { - if (inv == null) { - return 0; - } else { - int itemCount = 0; - float averageCount = 0; - - for (int slot = 0; slot < inv.getSize(); ++slot) { - Item item = inv.getItem(slot); - - if (item.getId() != 0) { - averageCount += (float) item.getCount() / (float) Math.min(inv.getMaxStackSize(), item.getMaxStackSize()); - ++itemCount; - } - } - - averageCount = averageCount / (float) inv.getSize(); - return NukkitMath.floorFloat(averageCount * 14) + (itemCount > 0 ? 1 : 0); - } - } -} diff --git a/src/main/java/cn/nukkit/inventory/ContainerRecipe.java b/src/main/java/cn/nukkit/inventory/ContainerRecipe.java deleted file mode 100644 index 72226dfb7..000000000 --- a/src/main/java/cn/nukkit/inventory/ContainerRecipe.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; - -public class ContainerRecipe extends MixRecipe { - - public ContainerRecipe(Item input, Item ingredient, Item output) { - super(input, ingredient, output); - } - - @Override - public void registerToCraftingManager(CraftingManager manager) { - manager.registerContainerRecipe(this); - } - - @Override - public RecipeType getType() { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/CraftingGrid.java b/src/main/java/cn/nukkit/inventory/CraftingGrid.java deleted file mode 100644 index 125176071..000000000 --- a/src/main/java/cn/nukkit/inventory/CraftingGrid.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.inventory; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class CraftingGrid extends PlayerUIComponent { - - CraftingGrid(PlayerUIInventory playerUI) { - this(playerUI, 28, 4); - } - - CraftingGrid(PlayerUIInventory playerUI, int offset, int size) { - super(playerUI, offset, size); - } -} diff --git a/src/main/java/cn/nukkit/inventory/CraftingManager.java b/src/main/java/cn/nukkit/inventory/CraftingManager.java deleted file mode 100644 index 516174ec5..000000000 --- a/src/main/java/cn/nukkit/inventory/CraftingManager.java +++ /dev/null @@ -1,675 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Server; -import cn.nukkit.block.BlockID; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.network.protocol.BatchPacket; -import cn.nukkit.network.protocol.CraftingDataPacket; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.utils.BinaryStream; -import cn.nukkit.utils.Config; -import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.Utils; -import io.netty.util.collection.CharObjectHashMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; - -import java.util.*; -import java.util.zip.Deflater; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class CraftingManager { - - private final Collection recipes313 = new ArrayDeque<>(); - private final Collection recipes332 = new ArrayDeque<>(); - public final Collection recipes = new ArrayDeque<>(); - - public static BatchPacket packet313; - public static BatchPacket packet340; - public static BatchPacket packet361; - public static BatchPacket packet354; - public static BatchPacket packet388; - public static BatchPacket packet407; - public static DataPacket packet419; - public static DataPacket packet431; - public static DataPacket packet440; - public static DataPacket packet448; - public static DataPacket packet465; - public static DataPacket packet471; - - private final Map> shapedRecipes313 = new Int2ObjectOpenHashMap<>(); - private final Map> shapedRecipes332 = new Int2ObjectOpenHashMap<>(); - protected final Map> shapedRecipes = new Int2ObjectOpenHashMap<>(); - - private final Map> shapelessRecipes313 = new Int2ObjectOpenHashMap<>(); - private final Map> shapelessRecipes332 = new Int2ObjectOpenHashMap<>(); - protected final Map> shapelessRecipes = new Int2ObjectOpenHashMap<>(); - - public final Map multiRecipes = new HashMap<>(); - public final Map furnaceRecipes = new Int2ObjectOpenHashMap<>(); - private final Map furnaceRecipesOld = new Int2ObjectOpenHashMap<>(); - public final Map brewingRecipes = new Int2ObjectOpenHashMap<>(); - private final Map brewingRecipesOld = new Int2ObjectOpenHashMap<>(); - public final Map containerRecipes = new Int2ObjectOpenHashMap<>(); - private final Map containerRecipesOld = new Int2ObjectOpenHashMap<>(); - - private static int RECIPE_COUNT = 0; - static int NEXT_NETWORK_ID = 0; - - // Torch with charcoal recipe fix for 1.16.100+ - private static ShapedRecipe charcoalTorchRecipe419; - - public static final Comparator recipeComparator = (i1, i2) -> { - if (i1.getId() > i2.getId()) { - return 1; - } else if (i1.getId() < i2.getId()) { - return -1; - } else if (i1.getDamage() > i2.getDamage()) { - return 1; - } else if (i1.getDamage() < i2.getDamage()) { - return -1; - } else return Integer.compare(i1.getCount(), i2.getCount()); - }; - - @SuppressWarnings("unchecked") - public CraftingManager() { - MainLogger.getLogger().debug("Loading recipes..."); - List recipes_388 = new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("recipes388.json")).getRootSection().getMapList("recipes"); - List recipes_332 = new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("recipes332.json")).getMapList("recipes"); - List recipes_313 = new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("recipes313.json")).getMapList("recipes"); - - for (Map recipe : recipes_388) { - try { - switch (Utils.toInt(recipe.get("type"))) { - case 0: - String craftingBlock = (String) recipe.get("block"); - if (!"crafting_table".equals(craftingBlock)) { - // Ignore other recipes than crafting table ones - continue; - } - List outputs = ((List) recipe.get("output")); - if (outputs.size() > 1) { - continue; - } - Map first = outputs.get(0); - List sorted = new ArrayList<>(); - for (Map ingredient : ((List) recipe.get("input"))) { - sorted.add(Item.fromJson(ingredient)); - } - sorted.sort(recipeComparator); - - String recipeId = (String) recipe.get("id"); - int priority = Utils.toInt(recipe.get("priority")); - - ShapelessRecipe result = new ShapelessRecipe(recipeId, priority, Item.fromJson(first), sorted); - - this.registerRecipe(result); - break; - case 1: - craftingBlock = (String) recipe.get("block"); - if (!"crafting_table".equals(craftingBlock)) { - // Ignore other recipes than crafting table ones - continue; - } - outputs = (List) recipe.get("output"); - - first = outputs.remove(0); - String[] shape = ((List) recipe.get("shape")).toArray(new String[0]); - Map ingredients = new CharObjectHashMap<>(); - List extraResults = new ArrayList<>(); - - Map> input = (Map) recipe.get("input"); - for (Map.Entry> ingredientEntry : input.entrySet()) { - char ingredientChar = ingredientEntry.getKey().charAt(0); - Item ingredient = Item.fromJson(ingredientEntry.getValue()); - - ingredients.put(ingredientChar, ingredient); - } - - for (Map data : outputs) { - extraResults.add(Item.fromJson(data)); - } - - recipeId = (String) recipe.get("id"); - priority = Utils.toInt(recipe.get("priority")); - - this.registerRecipe(new ShapedRecipe(recipeId, priority, Item.fromJson(first), shape, ingredients, extraResults)); - break; - case 2: - case 3: - craftingBlock = (String) recipe.get("block"); - if (!"furnace".equals(craftingBlock)) { - // Ignore other recipes than furnaces - continue; - } - Map resultMap = (Map) recipe.get("output"); - Item resultItem = Item.fromJson(resultMap); - Item inputItem; - try { - Map inputMap = (Map) recipe.get("input"); - inputItem = Item.fromJson(inputMap); - } catch (Exception old) { - inputItem = Item.get(Utils.toInt(recipe.get("inputId")), recipe.containsKey("inputDamage") ? Utils.toInt(recipe.get("inputDamage")) : -1, 1); - } - this.registerRecipe(new FurnaceRecipe(resultItem, inputItem)); - break; - /*case 4: - this.registerRecipe(new MultiRecipe(UUID.fromString((String) recipe.get("uuid")))); - break;*/ - default: - break; - } - } catch (Exception e) { - MainLogger.getLogger().error("Exception during registering (protocol 388) recipe", e); - } - } - - for (Map recipe : recipes_313) { - try { - switch (Utils.toInt(recipe.get("type"))) { - case 0: - Map first = ((List) recipe.get("output")).get(0); - List sorted = new ArrayList<>(); - for (Map ingredient : ((List) recipe.get("input"))) { - sorted.add(Item.fromJsonOld(ingredient)); - } - sorted.sort(recipeComparator); - ShapelessRecipe recipe_ = new ShapelessRecipe(Item.fromJsonOld(first), sorted); - recipes313.add(recipe_); - this.registerShapelessRecipe(313, recipe_); - break; - case 1: - List output = (List) recipe.get("output"); - first = output.remove(0); - String[] shape = ((List) recipe.get("shape")).toArray(new String[0]); - Map ingredients = new CharObjectHashMap<>(); - List extraResults = new ArrayList<>(); - Map> input = (Map) recipe.get("input"); - for (Map.Entry> ingredientEntry : input.entrySet()) { - char ingredientChar = ingredientEntry.getKey().charAt(0); - Item ingredient = Item.fromJsonOld(ingredientEntry.getValue()); - ingredients.put(ingredientChar, ingredient); - } - for (Map data : output) { - extraResults.add(Item.fromJsonOld(data)); - } - ShapedRecipe recipe__ = new ShapedRecipe(Item.fromJsonOld(first), shape, ingredients, extraResults); - recipes313.add(recipe__); - this.registerShapedRecipe(313, recipe__); - break; - case 2: - case 3: - Map resultMap = (Map) recipe.get("output"); - Item resultItem = Item.fromJsonOld(resultMap); - Item inputItem; - try { - Map inputMap = (Map) recipe.get("input"); - inputItem = Item.fromJsonOld(inputMap); - } catch (Exception old) { - inputItem = Item.get(Utils.toInt(recipe.get("inputId")), recipe.containsKey("inputDamage") ? Utils.toInt(recipe.get("inputDamage")) : -1, 1); - } - this.furnaceRecipesOld.put(getItemHash(inputItem), new FurnaceRecipe(resultItem, inputItem)); - break; - default: - break; - } - } catch (Exception e) { - MainLogger.getLogger().error("Exception during registering (protocol 313) recipe", e); - } - } - - for (Map recipe : recipes_332) { - try { - switch (Utils.toInt(recipe.get("type"))) { - case 0: - Map first = ((List) recipe.get("output")).get(0); - List sorted = new ArrayList<>(); - for (Map ingredient : ((List) recipe.get("input"))) { - sorted.add(Item.fromJsonOld(ingredient)); - } - sorted.sort(recipeComparator); - ShapelessRecipe recipe_ = new ShapelessRecipe(Item.fromJsonOld(first), sorted); - recipes332.add(recipe_); - this.registerShapelessRecipe(332, recipe_); - break; - case 1: - List output = (List) recipe.get("output"); - first = output.remove(0); - String[] shape = ((List) recipe.get("shape")).toArray(new String[0]); - Map ingredients = new CharObjectHashMap<>(); - List extraResults = new ArrayList<>(); - Map> input = (Map) recipe.get("input"); - for (Map.Entry> ingredientEntry : input.entrySet()) { - char ingredientChar = ingredientEntry.getKey().charAt(0); - Item ingredient = Item.fromJsonOld(ingredientEntry.getValue()); - ingredients.put(ingredientChar, ingredient); - } - for (Map data : output) { - extraResults.add(Item.fromJsonOld(data)); - } - ShapedRecipe recipe__ = new ShapedRecipe(Item.fromJsonOld(first), shape, ingredients, extraResults); - recipes332.add(recipe__); - this.registerShapedRecipe(332, recipe__); - break; - default: - break; - } - } catch (Exception e) { - MainLogger.getLogger().error("Exception during registering (protocol 332) recipe", e); - } - } - - Config extras = new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("recipes388.json")); - List potionMixes = extras.getMapList("potionMixes"); - for (Map potionMix : potionMixes) { - int fromPotionId = ((Number) potionMix.get("fromPotionId")).intValue(); - int ingredient = ((Number) potionMix.get("ingredient")).intValue(); - int toPotionId = ((Number) potionMix.get("toPotionId")).intValue(); - registerBrewingRecipeOld(new BrewingRecipe(Item.get(ItemID.POTION, fromPotionId), Item.get(ingredient), Item.get(ItemID.POTION, toPotionId))); - } - - List containerMixes = extras.getMapList("containerMixes"); - for (Map containerMix : containerMixes) { - int fromItemId = ((Number) containerMix.get("fromItemId")).intValue(); - int ingredient = ((Number) containerMix.get("ingredient")).intValue(); - int toItemId = ((Number) containerMix.get("toItemId")).intValue(); - registerContainerRecipeOld(new ContainerRecipe(Item.get(fromItemId), Item.get(ingredient), Item.get(toItemId))); - } - - Config extras407 = new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("extras_407.json")); - List potionMixes407 = extras407.getMapList("potionMixes"); - for (Map potionMix : potionMixes407) { - int fromPotionId = ((Number) potionMix.get("inputId")).intValue(); - int fromPotionMeta = ((Number) potionMix.get("inputMeta")).intValue(); - int ingredient = ((Number) potionMix.get("reagentId")).intValue(); - int ingredientMeta = ((Number) potionMix.get("reagentMeta")).intValue(); - int toPotionId = ((Number) potionMix.get("outputId")).intValue(); - int toPotionMeta = ((Number) potionMix.get("outputMeta")).intValue(); - registerBrewingRecipe(new BrewingRecipe(Item.get(fromPotionId, fromPotionMeta), Item.get(ingredient, ingredientMeta), Item.get(toPotionId, toPotionMeta))); - } - - List containerMixes407 = extras407.getMapList("containerMixes"); - for (Map containerMix : containerMixes407) { - int fromItemId = ((Number) containerMix.get("inputId")).intValue(); - int ingredient = ((Number) containerMix.get("reagentId")).intValue(); - int toItemId = ((Number) containerMix.get("outputId")).intValue(); - registerContainerRecipe(new ContainerRecipe(Item.get(fromItemId), Item.get(ingredient), Item.get(toItemId))); - } - - // Torch with charcoal recipe fix for 1.16.100+ - // TODO: Update recipes for 1.16+ - Map ingredients = new HashMap<>(); - ingredients.put('A', Item.get(ItemID.COAL, 1)); // Make sure it's charcoal after converting to runtime ids - ingredients.put('B', Item.get(ItemID.STICK, -1)); - charcoalTorchRecipe419 = new ShapedRecipe("Torch_from_charcoal_recipeId", 50, Item.get(BlockID.TORCH, 0, 4), new String[]{"A", "B"}, ingredients, new ArrayList<>()); - - this.rebuildPacket(); - MainLogger.getLogger().debug("Loaded " + this.recipes.size() + " recipes"); - } - - private CraftingDataPacket packetFor(int protocol) { - CraftingDataPacket pk = new CraftingDataPacket(); - pk.protocol = protocol; - for (Recipe recipe : this.recipes) { - if (recipe instanceof ShapedRecipe) { - pk.addShapedRecipe((ShapedRecipe) recipe); - } else if (recipe instanceof ShapelessRecipe) { - pk.addShapelessRecipe((ShapelessRecipe) recipe); - } - } - // Torch with charcoal recipe fix for 1.16.100+ - pk.addShapedRecipe(charcoalTorchRecipe419); - for (FurnaceRecipe recipe : this.furnaceRecipes.values()) { - pk.addFurnaceRecipe(recipe); - } - for (MultiRecipe recipe : this.multiRecipes.values()) { - pk.addMultiRecipe(recipe); - } - for (BrewingRecipe recipe : brewingRecipes.values()) { - pk.addBrewingRecipe(recipe); - } - for (ContainerRecipe recipe : containerRecipes.values()) { - pk.addContainerRecipe(recipe); - } - pk.tryEncode(); - return pk; - } - - public void rebuildPacket() { - packet471 = packetFor(471); - packet465 = packetFor(465); - packet448 = packetFor(448); - packet440 = packetFor(440); - packet431 = packetFor(431); - packet419 = packetFor(419); - CraftingDataPacket pk407 = new CraftingDataPacket(); - pk407.protocol = 407; - for (Recipe recipe : this.recipes) { - if (recipe instanceof ShapedRecipe) { - pk407.addShapedRecipe((ShapedRecipe) recipe); - } else if (recipe instanceof ShapelessRecipe) { - pk407.addShapelessRecipe((ShapelessRecipe) recipe); - } - } - for (FurnaceRecipe recipe : this.furnaceRecipes.values()) { - pk407.addFurnaceRecipe(recipe); - } - for (BrewingRecipe recipe : brewingRecipes.values()) { - pk407.addBrewingRecipe(recipe); - } - for (ContainerRecipe recipe : containerRecipes.values()) { - pk407.addContainerRecipe(recipe); - } - pk407.tryEncode(); - packet407 = pk407.compress(Deflater.BEST_COMPRESSION); - // 388 - CraftingDataPacket pk388 = new CraftingDataPacket(); - pk388.protocol = 388; - for (Recipe recipe : this.recipes) { - if (recipe instanceof ShapedRecipe) { - pk388.addShapedRecipe((ShapedRecipe) recipe); - } else if (recipe instanceof ShapelessRecipe) { - pk388.addShapelessRecipe((ShapelessRecipe) recipe); - } - } - for (FurnaceRecipe recipe : this.furnaceRecipes.values()) { - pk388.addFurnaceRecipe(recipe); - } - for (BrewingRecipe recipe : brewingRecipesOld.values()) { - pk388.addBrewingRecipe(recipe); - } - for (ContainerRecipe recipe : containerRecipesOld.values()) { - pk388.addContainerRecipe(recipe); - } - pk388.tryEncode(); - packet388 = pk388.compress(Deflater.BEST_COMPRESSION); - // 361 - CraftingDataPacket pk361 = new CraftingDataPacket(); - pk361.protocol = 361; - for (Recipe recipe : this.recipes) { - if (recipe instanceof ShapedRecipe) { - pk361.addShapedRecipe((ShapedRecipe) recipe); - } else if (recipe instanceof ShapelessRecipe) { - pk361.addShapelessRecipe((ShapelessRecipe) recipe); - } - } - for (FurnaceRecipe recipe : this.furnaceRecipes.values()) { - pk361.addFurnaceRecipe(recipe); - } - pk361.tryEncode(); - packet361 = pk361.compress(Deflater.BEST_COMPRESSION); - // 354 - CraftingDataPacket pk354 = new CraftingDataPacket(); - pk354.protocol = 354; - for (Recipe recipe : this.recipes) { - if (recipe instanceof ShapedRecipe) { - pk354.addShapedRecipe((ShapedRecipe) recipe); - } else if (recipe instanceof ShapelessRecipe) { - pk354.addShapelessRecipe((ShapelessRecipe) recipe); - } - } - for (FurnaceRecipe recipe : this.furnaceRecipes.values()) { - pk354.addFurnaceRecipe(recipe); - } - pk354.tryEncode(); - packet354 = pk354.compress(Deflater.BEST_COMPRESSION); - // 340 - CraftingDataPacket pk340 = new CraftingDataPacket(); - pk340.protocol = 340; - for (Recipe recipe : this.recipes332) { - if (recipe instanceof ShapedRecipe) { - pk340.addShapedRecipe((ShapedRecipe) recipe); - } else if (recipe instanceof ShapelessRecipe) { - pk340.addShapelessRecipe((ShapelessRecipe) recipe); - } - } - for (FurnaceRecipe recipe : this.furnaceRecipes.values()) { - pk340.addFurnaceRecipe(recipe); - } - pk340.tryEncode(); - packet340 = pk340.compress(Deflater.BEST_COMPRESSION); - // 313 - CraftingDataPacket pk313 = new CraftingDataPacket(); - pk313.protocol = 313; - for (Recipe recipe : this.recipes313) { - if (recipe instanceof ShapedRecipe) { - pk313.addShapedRecipe((ShapedRecipe) recipe); - } else if (recipe instanceof ShapelessRecipe) { - pk313.addShapelessRecipe((ShapelessRecipe) recipe); - } - } - for (FurnaceRecipe recipe : this.furnaceRecipesOld.values()) { - pk313.addFurnaceRecipe(recipe); - } - pk313.tryEncode(); - packet313 = pk313.compress(Deflater.BEST_COMPRESSION); - } - - public Collection getRecipes() { - return recipes; - } - - public Map getFurnaceRecipes() { - return furnaceRecipes; - } - - public FurnaceRecipe matchFurnaceRecipe(Item input) { - FurnaceRecipe recipe = this.furnaceRecipes.get(getItemHash(input)); - if (recipe == null) recipe = this.furnaceRecipes.get(getItemHash(input.getId(), 0)); - return recipe; - } - - private static UUID getMultiItemHash(Collection items) { - BinaryStream stream = new BinaryStream(); - for (Item item : items) { - stream.putVarInt(getFullItemHash(item)); - } - return UUID.nameUUIDFromBytes(stream.getBuffer()); - } - - private static int getFullItemHash(Item item) { - return 31 * getItemHash(item) + item.getCount(); - } - - public void registerFurnaceRecipe(FurnaceRecipe recipe) { - this.furnaceRecipes.put(getItemHash(recipe.getInput()), recipe); - } - - private static int getItemHash(Item item) { - return getItemHash(item.getId(), item.getDamage()); - } - - private static int getItemHash(int id, int meta) { - return (id << 4) | (meta & 0xf); - } - - public void registerShapedRecipe(ShapedRecipe recipe) { - Server.mvw("CraftingManager#registerShapedRecipe(ShapedRecipe)"); - this.registerShapedRecipe(388, recipe); - } - - public void registerShapedRecipe(int protocol, ShapedRecipe recipe) { - int resultHash = getItemHash(recipe.getResult()); - Map map; - switch (protocol) { - case 313: - map = shapedRecipes313.computeIfAbsent(resultHash, k -> new HashMap<>()); - break; - case 332: - map = shapedRecipes332.computeIfAbsent(resultHash, k -> new HashMap<>()); - break; - case 388: - map = shapedRecipes.computeIfAbsent(resultHash, k -> new HashMap<>()); - break; - default: - throw new IllegalArgumentException("Tried to register a shaped recipe for unsupported protocol version: " + protocol); - } - map.put(getMultiItemHash(new LinkedList<>(recipe.getIngredientsAggregate())), recipe); - } - - public void registerRecipe(Recipe recipe) { - if (recipe instanceof CraftingRecipe) { - UUID id = Utils.dataToUUID(String.valueOf(++RECIPE_COUNT), String.valueOf(recipe.getResult().getId()), String.valueOf(recipe.getResult().getDamage()), String.valueOf(recipe.getResult().getCount()), Arrays.toString(recipe.getResult().getCompoundTag())); - ((CraftingRecipe) recipe).setId(id); - this.recipes.add(recipe); - } - recipe.registerToCraftingManager(this); - } - - public void registerShapelessRecipe(ShapelessRecipe recipe) { - Server.mvw("CraftingManager#registerShapelessRecipe(ShapelessRecipe)"); - this.registerShapelessRecipe(388, recipe); - } - - public void registerShapelessRecipe(int protocol, ShapelessRecipe recipe) { - List list = recipe.getIngredientsAggregate(); - UUID hash = getMultiItemHash(list); - int resultHash = getItemHash(recipe.getResult()); - Map map; - switch (protocol) { - case 313: - map = shapelessRecipes313.computeIfAbsent(resultHash, k -> new HashMap<>()); - break; - case 332: - map = shapelessRecipes332.computeIfAbsent(resultHash, k -> new HashMap<>()); - break; - case 388: - map = shapelessRecipes.computeIfAbsent(resultHash, k -> new HashMap<>()); - break; - default: - throw new IllegalArgumentException("Tried to register a shapeless recipe for unsupported protocol version: " + protocol); - } - map.put(hash, recipe); - } - - private static int getPotionHash(Item ingredient, Item potion) { - int ingredientHash = ((ingredient.getId() & 0x3FF) << 6) | (ingredient.getDamage() & 0x3F); - int potionHash = ((potion.getId() & 0x3FF) << 6) | (potion.getDamage() & 0x3F); - return ingredientHash << 16 | potionHash; - } - - private static int getPotionHashOld(int ingredientId, int potionType) { - return (ingredientId << 6) | potionType; - } - - private static int getContainerHash(int ingredientId, int containerId) { - return (ingredientId << 9) | containerId; - } - - public void registerBrewingRecipe(BrewingRecipe recipe) { - Item input = recipe.getIngredient(); - Item potion = recipe.getInput(); - int potionHash = getPotionHash(input, potion); - this.brewingRecipes.put(potionHash, recipe); - } - - public void registerBrewingRecipeOld(BrewingRecipe recipe) { - Item input = recipe.getIngredient(); - Item potion = recipe.getInput(); - this.brewingRecipesOld.put(getPotionHashOld(input.getId(), potion.getDamage()), recipe); - } - - public void registerContainerRecipe(ContainerRecipe recipe) { - Item input = recipe.getIngredient(); - Item potion = recipe.getInput(); - this.containerRecipes.put(getContainerHash(input.getId(), potion.getId()), recipe); - } - - public void registerContainerRecipeOld(ContainerRecipe recipe) { - Item input = recipe.getIngredient(); - Item potion = recipe.getInput(); - this.containerRecipesOld.put(getContainerHash(input.getId(), potion.getId()), recipe); - } - - public BrewingRecipe matchBrewingRecipe(Item input, Item potion) { - return this.brewingRecipes.get(getPotionHash(input, potion)); - } - - public ContainerRecipe matchContainerRecipe(Item input, Item potion) { - return this.containerRecipes.get(getContainerHash(input.getId(), potion.getId())); - } - - public CraftingRecipe matchRecipe(List inputList, Item primaryOutput, List extraOutputList) { - int outputHash = getItemHash(primaryOutput); - if (this.shapedRecipes.containsKey(outputHash)) { - inputList.sort(recipeComparator); - - UUID inputHash = getMultiItemHash(inputList); - - Map recipeMap = shapedRecipes.get(outputHash); - - if (recipeMap != null) { - ShapedRecipe recipe = recipeMap.get(inputHash); - - if (recipe != null && (recipe.matchItems(inputList, extraOutputList) || matchItemsAccumulation(recipe, inputList, primaryOutput, extraOutputList))) { - return recipe; - } - - for (ShapedRecipe shapedRecipe : recipeMap.values()) { - if (shapedRecipe.matchItems(inputList, extraOutputList) || matchItemsAccumulation(shapedRecipe, inputList, primaryOutput, extraOutputList)) { - return shapedRecipe; - } - } - } - } - - if (shapelessRecipes.containsKey(outputHash)) { - inputList.sort(recipeComparator); - - Map recipes = shapelessRecipes.get(outputHash); - - if (recipes == null) { - return null; - } - - UUID inputHash = getMultiItemHash(inputList); - ShapelessRecipe recipe = recipes.get(inputHash); - - if (recipe != null && (recipe.matchItems(inputList, extraOutputList) || matchItemsAccumulation(recipe, inputList, primaryOutput, extraOutputList))) { - return recipe; - } - - for (ShapelessRecipe shapelessRecipe : recipes.values()) { - if (shapelessRecipe.matchItems(inputList, extraOutputList) || matchItemsAccumulation(shapelessRecipe, inputList, primaryOutput, extraOutputList)) { - return shapelessRecipe; - } - } - } - - return null; - } - - private static boolean matchItemsAccumulation(CraftingRecipe recipe, List inputList, Item primaryOutput, List extraOutputList) { - Item recipeResult = recipe.getResult(); - if (primaryOutput.equals(recipeResult, recipeResult.hasMeta(), recipeResult.hasCompoundTag()) && primaryOutput.getCount() % recipeResult.getCount() == 0) { - int multiplier = primaryOutput.getCount() / recipeResult.getCount(); - return recipe.matchItems(inputList, extraOutputList, multiplier); - } - return false; - } - - public void registerMultiRecipe(MultiRecipe recipe) { - this.multiRecipes.put(recipe.getId(), recipe); - } - - public static class Entry { - final int resultItemId; - final int resultMeta; - final int ingredientItemId; - final int ingredientMeta; - final String recipeShape; - final int resultAmount; - - public Entry(int resultItemId, int resultMeta, int ingredientItemId, int ingredientMeta, String recipeShape, int resultAmount) { - this.resultItemId = resultItemId; - this.resultMeta = resultMeta; - this.ingredientItemId = ingredientItemId; - this.ingredientMeta = ingredientMeta; - this.recipeShape = recipeShape; - this.resultAmount = resultAmount; - } - } -} diff --git a/src/main/java/cn/nukkit/inventory/CraftingRecipe.java b/src/main/java/cn/nukkit/inventory/CraftingRecipe.java deleted file mode 100644 index 550c1010a..000000000 --- a/src/main/java/cn/nukkit/inventory/CraftingRecipe.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; - -import java.util.List; -import java.util.UUID; - -/** - * @author CreeperFace - */ -public interface CraftingRecipe extends Recipe { - - String getRecipeId(); - - UUID getId(); - - void setId(UUID id); - - boolean requiresCraftingTable(); - - List getExtraResults(); - - List getAllResults(); - - int getPriority(); - - /** - * Returns whether the specified list of crafting grid inputs and outputs matches this recipe. Outputs DO NOT - * include the primary result item. - * - * @param inputList list of items taken from the crafting grid - * @param extraOutputList list of items put back into the crafting grid (secondary results) - * @return bool - */ - boolean matchItems(List inputList, List extraOutputList); - - boolean matchItems(List inputList, List extraOutputList, int multiplier); - - List getIngredientsAggregate(); -} diff --git a/src/main/java/cn/nukkit/inventory/CustomInventory.java b/src/main/java/cn/nukkit/inventory/CustomInventory.java deleted file mode 100644 index 0caed17a7..000000000 --- a/src/main/java/cn/nukkit/inventory/CustomInventory.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; - -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class CustomInventory extends ContainerInventory { - - public CustomInventory(InventoryHolder holder, InventoryType type) { - super(holder, type); - } - - public CustomInventory(InventoryHolder holder, InventoryType type, Map items) { - super(holder, type, items); - } - - public CustomInventory(InventoryHolder holder, InventoryType type, Map items, Integer overrideSize) { - super(holder, type, items, overrideSize); - } - - public CustomInventory(InventoryHolder holder, InventoryType type, Map items, Integer overrideSize, String overrideTitle) { - super(holder, type, items, overrideSize, overrideTitle); - } -} diff --git a/src/main/java/cn/nukkit/inventory/DispenserInventory.java b/src/main/java/cn/nukkit/inventory/DispenserInventory.java deleted file mode 100644 index dae681b5f..000000000 --- a/src/main/java/cn/nukkit/inventory/DispenserInventory.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.blockentity.BlockEntityDispenser; - -/** - * Created by PetteriM1 - */ -public class DispenserInventory extends ContainerInventory { - - public DispenserInventory(BlockEntityDispenser dispenser) { - super(dispenser, InventoryType.DISPENSER); - } - - @Override - public BlockEntityDispenser getHolder() { - return (BlockEntityDispenser) super.getHolder(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/DoubleChestInventory.java b/src/main/java/cn/nukkit/inventory/DoubleChestInventory.java deleted file mode 100644 index 17e709483..000000000 --- a/src/main/java/cn/nukkit/inventory/DoubleChestInventory.java +++ /dev/null @@ -1,194 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntityChest; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.network.protocol.BlockEventPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.network.protocol.InventorySlotPacket; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class DoubleChestInventory extends ContainerInventory implements InventoryHolder { - - private final ChestInventory left; - private final ChestInventory right; - - public DoubleChestInventory(BlockEntityChest left, BlockEntityChest right) { - super(null, InventoryType.DOUBLE_CHEST); - this.holder = this; - - this.left = left.getRealInventory(); - this.left.setDoubleInventory(this); - - this.right = right.getRealInventory(); - this.right.setDoubleInventory(this); - - Map items = new HashMap<>(); - // First we add the items from the left chest - for (int idx = 0; idx < this.left.getSize(); idx++) { - if (this.left.getContents().containsKey(idx)) { // Don't forget to skip empty slots! - items.put(idx, this.left.getContents().get(idx)); - } - } - // And them the items from the right chest - for (int idx = 0; idx < this.right.getSize(); idx++) { - if (this.right.getContents().containsKey(idx)) { // Don't forget to skip empty slots! - items.put(idx + this.left.getSize(), this.right.getContents().get(idx)); // idx + this.left.getSize() so we don't overlap left chest items - } - } - - this.setContents(items); - } - - @Override - public Inventory getInventory() { - return this; - } - - @Override - public BlockEntityChest getHolder() { - return this.left.getHolder(); - } - - @Override - public Item getItem(int index) { - return index < this.left.getSize() ? this.left.getItem(index) : this.right.getItem(index - this.right.getSize()); - } - - @Override - public boolean setItem(int index, Item item, boolean send) { - return index < this.left.getSize() ? this.left.setItem(index, item, send) : this.right.setItem(index - this.right.getSize(), item, send); - } - - @Override - public boolean clear(int index) { - return index < this.left.getSize() ? this.left.clear(index) : this.right.clear(index - this.right.getSize()); - } - - @Override - public Map getContents() { - Map contents = new HashMap<>(); - - for (int i = 0; i < this.getSize(); ++i) { - contents.put(i, this.getItem(i)); - } - - return contents; - } - - @Override - public void setContents(Map items) { - if (items.size() > this.size) { - Map newItems = new HashMap<>(); - for (int i = 0; i < this.size; i++) { - newItems.put(i, items.get(i)); - } - items = newItems; - } - - for (int i = 0; i < this.size; i++) { - if (!items.containsKey(i)) { - if (i < this.left.size) { - if (this.left.slots.containsKey(i)) { - this.clear(i); - } - } else if (this.right.slots.containsKey(i - this.left.size)) { - this.clear(i); - } - } else if (!this.setItem(i, items.get(i))) { - this.clear(i); - } - } - } - - @Override - public void onOpen(Player who) { - super.onOpen(who); - this.left.viewers.add(who); - this.right.viewers.add(who); - - if (this.getViewers().size() == 1) { - Level level = this.left.getHolder().getLevel(); - if (level != null) { - BlockEventPacket pk1 = new BlockEventPacket(); - pk1.x = (int) this.left.getHolder().getX(); - pk1.y = (int) this.left.getHolder().getY(); - pk1.z = (int) this.left.getHolder().getZ(); - pk1.case1 = 1; - pk1.case2 = 2; - - BlockEventPacket pk2 = new BlockEventPacket(); - pk2.x = (int) this.right.getHolder().getX(); - pk2.y = (int) this.right.getHolder().getY(); - pk2.z = (int) this.right.getHolder().getZ(); - pk2.case1 = 1; - pk2.case2 = 2; - - level.addLevelSoundEvent(this.left.getHolder().add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_CHEST_OPEN); - level.addChunkPacket((int) this.left.getHolder().getX() >> 4, (int) this.left.getHolder().getZ() >> 4, pk1); - level.addChunkPacket((int) this.right.getHolder().getX() >> 4, (int) this.right.getHolder().getZ() >> 4, pk2); - } - } - } - - @Override - public void onClose(Player who) { - if (this.getViewers().size() == 1) { - Level level = this.right.getHolder().getLevel(); - if (level != null) { - BlockEventPacket pk1 = new BlockEventPacket(); - pk1.x = (int) this.right.getHolder().getX(); - pk1.y = (int) this.right.getHolder().getY(); - pk1.z = (int) this.right.getHolder().getZ(); - pk1.case1 = 1; - pk1.case2 = 0; - - BlockEventPacket pk2 = new BlockEventPacket(); - pk2.x = (int) this.left.getHolder().getX(); - pk2.y = (int) this.left.getHolder().getY(); - pk2.z = (int) this.left.getHolder().getZ(); - pk2.case1 = 1; - pk2.case2 = 0; - - level.addLevelSoundEvent(this.left.getHolder().add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_CHEST_CLOSED); - level.addChunkPacket((int) this.right.getHolder().getX() >> 4, (int) this.right.getHolder().getZ() >> 4, pk1); - level.addChunkPacket((int) this.left.getHolder().getX() >> 4, (int) this.left.getHolder().getZ() >> 4, pk2); - } - } - - this.left.viewers.remove(who); - this.right.viewers.remove(who); - super.onClose(who); - } - - public ChestInventory getLeftSide() { - return this.left; - } - - public ChestInventory getRightSide() { - return this.right; - } - - public void sendSlot(Inventory inv, int index, Player... players) { - InventorySlotPacket pk = new InventorySlotPacket(); - pk.slot = inv == this.right ? this.left.getSize() + index : index; - pk.item = inv.getItem(index).clone(); - - for (Player player : players) { - int id = player.getWindowId(this); - if (id == -1) { - this.close(player); - continue; - } - pk.inventoryId = id; - player.dataPacket(pk); - } - } -} diff --git a/src/main/java/cn/nukkit/inventory/DropperInventory.java b/src/main/java/cn/nukkit/inventory/DropperInventory.java deleted file mode 100644 index ca6006046..000000000 --- a/src/main/java/cn/nukkit/inventory/DropperInventory.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.blockentity.BlockEntityDropper; - -/** - * Created by PetteriM1 - */ -public class DropperInventory extends ContainerInventory { - - public DropperInventory(BlockEntityDropper dropper) { - super(dropper, InventoryType.DROPPER); - } - - @Override - public BlockEntityDropper getHolder() { - return (BlockEntityDropper) super.getHolder(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/EnchantInventory.java b/src/main/java/cn/nukkit/inventory/EnchantInventory.java deleted file mode 100644 index 2fcb0c75d..000000000 --- a/src/main/java/cn/nukkit/inventory/EnchantInventory.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.level.Position; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantInventory extends FakeBlockUIComponent { - - public static final int ENCHANT_INPUT_ITEM_UI_SLOT = 14; - public static final int ENCHANT_REAGENT_UI_SLOT = 15; - - public EnchantInventory(PlayerUIInventory playerUI, Position position) { - super(playerUI, InventoryType.ENCHANT_TABLE, 14, position); - } - - @Override - public void onOpen(Player who) { - super.onOpen(who); - who.craftingType = Player.CRAFTING_ENCHANT; - } - - @Override - public void onClose(Player who) { - super.onClose(who); - if (this.getViewers().isEmpty()) { - for (int i = 0; i < 2; ++i) { - who.getInventory().addItem(this.getItem(i)); - this.clear(i); - } - } - who.craftingType = Player.CRAFTING_SMALL; - who.resetCraftingGridType(); - } - - public Item getInputSlot() { - return this.getItem(0); - } - - public Item getOutputSlot() { - return this.getItem(0); - } - - public Item getReagentSlot() { - return this.getItem(1); - } -} diff --git a/src/main/java/cn/nukkit/inventory/EntityArmorInventory.java b/src/main/java/cn/nukkit/inventory/EntityArmorInventory.java deleted file mode 100644 index ade5e72d4..000000000 --- a/src/main/java/cn/nukkit/inventory/EntityArmorInventory.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.entity.item.EntityArmorStand; -import cn.nukkit.item.Item; -import cn.nukkit.network.protocol.InventoryContentPacket; -import cn.nukkit.network.protocol.InventorySlotPacket; -import cn.nukkit.network.protocol.MobArmorEquipmentPacket; - -import java.util.HashSet; -import java.util.Set; - -public class EntityArmorInventory extends BaseInventory { - - private EntityArmorStand entityLiving; - - private final Set viewers = new HashSet<>(); - - public static final int SLOT_HEAD = 0; - public static final int SLOT_CHEST = 1; - public static final int SLOT_LEGS = 2; - public static final int SLOT_FEET = 3; - - public EntityArmorInventory(EntityArmorStand entity) { - super(entity, InventoryType.ENTITY_ARMOR); - this.entityLiving = entity; - } - - @Override - public InventoryHolder getHolder() { - return this.holder; - } - - @Override - public String getName() { - return "Entity Armor"; - } - - @Override - public int getSize() { - return 4; - } - - public Item getHelmet() { - return this.getItem(SLOT_HEAD); - } - - public Item getChestplate() { - return this.getItem(SLOT_CHEST); - } - - public Item getLeggings() { - return this.getItem(SLOT_LEGS); - } - - public Item getBoots() { - return this.getItem(SLOT_FEET); - } - - public void setHelmet(Item item) { - this.setItem(SLOT_CHEST, item); - } - - public void setChestplate(Item item) { - this.setItem(SLOT_CHEST, item); - } - - public void setLeggings(Item item) { - this.setItem(SLOT_LEGS, item); - } - - public void setBoots(Item item) { - this.setItem(SLOT_FEET, item); - } - - @Override - public void sendSlot(int index, Player... players) { - for (Player player : players) { - this.sendSlot(index, player); - } - } - - @Override - public void sendSlot(int index, Player player) { - MobArmorEquipmentPacket mobArmorEquipmentPacket = new MobArmorEquipmentPacket(); - mobArmorEquipmentPacket.eid = this.entityLiving.getId(); - mobArmorEquipmentPacket.slots = new Item[]{this.getHelmet(), this.getChestplate(), this.getLeggings(), this.getBoots()}; - - if (player == this.holder) { - InventorySlotPacket inventorySlotPacket = new InventorySlotPacket(); - inventorySlotPacket.inventoryId = player.getWindowId(this); - inventorySlotPacket.slot = index; - inventorySlotPacket.item = this.getItem(index); - player.dataPacket(inventorySlotPacket); - } else { - player.dataPacket(mobArmorEquipmentPacket); - } - } - - @Override - public void sendContents(Player... players) { - for (Player player : players) { - this.sendContents(player); - } - } - - @Override - public void sendContents(Player player) { - MobArmorEquipmentPacket mobArmorEquipmentPacket = new MobArmorEquipmentPacket(); - mobArmorEquipmentPacket.eid = this.entityLiving.getId(); - mobArmorEquipmentPacket.slots = new Item[]{this.getHelmet(), this.getChestplate(), this.getLeggings(), this.getBoots()}; - - if (player == this.holder) { - InventoryContentPacket inventoryContentPacket = new InventoryContentPacket(); - inventoryContentPacket.inventoryId = player.getWindowId(this); - inventoryContentPacket.slots = new Item[]{this.getHelmet(), this.getChestplate(), this.getLeggings(), this.getBoots()}; - player.dataPacket(inventoryContentPacket); - } else { - player.dataPacket(mobArmorEquipmentPacket); - } - } - - @Override - public void onOpen(Player who) { - this.viewers.add(who); - } - - @Override - public void onClose(Player who) { - this.viewers.remove(who); - } - - @Override - public Set getViewers() { - return this.viewers; - } -} diff --git a/src/main/java/cn/nukkit/inventory/EntityEquipmentInventory.java b/src/main/java/cn/nukkit/inventory/EntityEquipmentInventory.java deleted file mode 100644 index 9db43e517..000000000 --- a/src/main/java/cn/nukkit/inventory/EntityEquipmentInventory.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.entity.item.EntityArmorStand; -import cn.nukkit.item.Item; -import cn.nukkit.network.protocol.MobEquipmentPacket; - -import java.util.HashSet; -import java.util.Set; - -public class EntityEquipmentInventory extends BaseInventory { - - private EntityArmorStand entityLiving; - private final Set viewers = new HashSet<>(); - - private static final int MAINHAND = 0; - private static final int OFFHAND = 1; - - public EntityEquipmentInventory(EntityArmorStand entity) { - super(entity, InventoryType.ENTITY_EQUIPMENT); - this.entityLiving = entity; - } - - - @Override - public String getName() { - return "Entity Equipment"; - } - - @Override - public int getSize() { - return 2; - } - - @Override - public InventoryHolder getHolder() { - return this.holder; - } - - @Override - public void sendSlot(int index, Player... players) { - for (Player player : players) { - this.sendSlot(index, player); - } - } - - @Override - public void sendSlot(int index, Player player) { - MobEquipmentPacket mobEquipmentPacket = new MobEquipmentPacket(); - mobEquipmentPacket.eid = this.entityLiving.getId(); - mobEquipmentPacket.inventorySlot = mobEquipmentPacket.hotbarSlot = index; - mobEquipmentPacket.item = this.getItem(index); - player.dataPacket(mobEquipmentPacket); - } - - @Override - public Set getViewers() { - return this.viewers; - } - - @Override - public boolean open(Player who) { - return this.viewers.add(who); - } - - @Override - public void onClose(Player who) { - this.viewers.remove(who); - } - - public Item getItemInHand() { - return this.getItem(MAINHAND); - } - - public Item getOffHandItem() { - return this.getItem(OFFHAND); - } - - public boolean setItemInHand(Item item, boolean send) { - return this.setItem(MAINHAND, item, send); - } - - public boolean setOffhandItem(Item item, boolean send) { - return this.setItem(OFFHAND, item, send); - } - - @Override - public void sendContents(Player target) { - this.sendSlot(MAINHAND, target); - this.sendSlot(OFFHAND, target); - } - - @Override - public void sendContents(Player... target) { - for (Player player : target) { - this.sendContents(player); - } - } -} diff --git a/src/main/java/cn/nukkit/inventory/FakeBlockMenu.java b/src/main/java/cn/nukkit/inventory/FakeBlockMenu.java deleted file mode 100644 index 574c75e5f..000000000 --- a/src/main/java/cn/nukkit/inventory/FakeBlockMenu.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.level.Position; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class FakeBlockMenu extends Position implements InventoryHolder { - - private final Inventory inventory; - - public FakeBlockMenu(Inventory inventory, Position pos) { - super(pos.x, pos.y, pos.z, pos.level); - this.inventory = inventory; - } - - @Override - public Inventory getInventory() { - return inventory; - } -} diff --git a/src/main/java/cn/nukkit/inventory/FakeBlockUIComponent.java b/src/main/java/cn/nukkit/inventory/FakeBlockUIComponent.java deleted file mode 100644 index 666d3b87f..000000000 --- a/src/main/java/cn/nukkit/inventory/FakeBlockUIComponent.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.event.inventory.InventoryCloseEvent; -import cn.nukkit.event.inventory.InventoryOpenEvent; -import cn.nukkit.level.Position; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.ContainerClosePacket; -import cn.nukkit.network.protocol.ContainerOpenPacket; - -public class FakeBlockUIComponent extends PlayerUIComponent { - - private final InventoryType type; - - FakeBlockUIComponent(PlayerUIInventory playerUI, InventoryType type, int offset, Position position) { - super(playerUI, offset, type.getDefaultSize()); - this.type = type; - this.holder = new FakeBlockMenu(this, position); - } - - - @Override - public FakeBlockMenu getHolder() { - return (FakeBlockMenu) this.holder; - } - - @Override - public boolean open(Player who) { - InventoryOpenEvent ev = new InventoryOpenEvent(this, who); - who.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } - this.onOpen(who); - - return true; - } - - @Override - public void onOpen(Player who) { - super.onOpen(who); - ContainerOpenPacket pk = new ContainerOpenPacket(); - pk.windowId = who.getWindowId(this); - pk.type = type.getNetworkType(); - InventoryHolder holder = this.getHolder(); - if (holder != null) { - pk.x = (int) ((Vector3) holder).getX(); - pk.y = (int) ((Vector3) holder).getY(); - pk.z = (int) ((Vector3) holder).getZ(); - } else { - pk.x = pk.y = pk.z = 0; - } - - who.dataPacket(pk); - - this.sendContents(who); - } - - @Override - public void onClose(Player who) { - ContainerClosePacket pk = new ContainerClosePacket(); - pk.windowId = who.getWindowId(this); - pk.wasServerInitiated = who.getClosingWindowId() != pk.windowId; - who.dataPacket(pk); - super.onClose(who); - } - - @Override - public void close(Player who) { - InventoryCloseEvent ev = new InventoryCloseEvent(this, who); - who.getServer().getPluginManager().callEvent(ev); - this.onClose(who); - } -} diff --git a/src/main/java/cn/nukkit/inventory/Fuel.java b/src/main/java/cn/nukkit/inventory/Fuel.java deleted file mode 100644 index e7bcbd60a..000000000 --- a/src/main/java/cn/nukkit/inventory/Fuel.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; - -import java.util.Map; -import java.util.TreeMap; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Fuel { - - public static final Map duration = new TreeMap<>(); - - static { - duration.put(Item.COAL, (short) 1600); - duration.put(Item.COAL_BLOCK, (short) 16000); - duration.put(Item.TRUNK, (short) 300); - duration.put(Item.WOODEN_PLANKS, (short) 300); - duration.put(Item.SAPLING, (short) 100); - duration.put(Item.WOODEN_AXE, (short) 200); - duration.put(Item.WOODEN_PICKAXE, (short) 200); - duration.put(Item.WOODEN_SWORD, (short) 200); - duration.put(Item.WOODEN_SHOVEL, (short) 200); - duration.put(Item.WOODEN_HOE, (short) 200); - duration.put(Item.STICK, (short) 100); - duration.put(Item.FENCE, (short) 300); - duration.put(Item.FENCE_GATE, (short) 300); - duration.put(Item.FENCE_GATE_SPRUCE, (short) 300); - duration.put(Item.FENCE_GATE_BIRCH, (short) 300); - duration.put(Item.FENCE_GATE_JUNGLE, (short) 300); - duration.put(Item.FENCE_GATE_ACACIA, (short) 300); - duration.put(Item.FENCE_GATE_DARK_OAK, (short) 300); - duration.put(Item.WOODEN_STAIRS, (short) 300); - duration.put(Item.SPRUCE_WOOD_STAIRS, (short) 300); - duration.put(Item.BIRCH_WOOD_STAIRS, (short) 300); - duration.put(Item.JUNGLE_WOOD_STAIRS, (short) 300); - duration.put(Item.TRAPDOOR, (short) 300); - duration.put(Item.WORKBENCH, (short) 300); - duration.put(Item.BOOKSHELF, (short) 300); - duration.put(Item.CHEST, (short) 300); - duration.put(Item.BUCKET, (short) 20000); - duration.put(Item.LADDER, (short) 300); - duration.put(Item.BOW, (short) 200); - duration.put(Item.BOWL, (short) 200); - duration.put(Item.WOOD2, (short) 300); - duration.put(Item.WOODEN_PRESSURE_PLATE, (short) 300); - duration.put(Item.ACACIA_WOOD_STAIRS, (short) 300); - duration.put(Item.DARK_OAK_WOOD_STAIRS, (short) 300); - duration.put(Item.TRAPPED_CHEST, (short) 300); - duration.put(Item.DAYLIGHT_DETECTOR, (short) 300); - duration.put(Item.DAYLIGHT_DETECTOR_INVERTED, (short) 300); - duration.put(Item.JUKEBOX, (short) 300); - duration.put(Item.NOTEBLOCK, (short) 300); - duration.put(Item.WOOD_SLAB, (short) 300); - duration.put(Item.DOUBLE_WOOD_SLAB, (short) 300); - duration.put(Item.BOAT, (short) 1200); - duration.put(Item.BLAZE_ROD, (short) 2400); - duration.put(Item.BROWN_MUSHROOM_BLOCK, (short) 300); - duration.put(Item.RED_MUSHROOM_BLOCK, (short) 300); - duration.put(Item.FISHING_ROD, (short) 300); - duration.put(Item.WOODEN_BUTTON, (short) 300); - duration.put(Item.WOODEN_DOOR, (short) 200); - duration.put(Item.SPRUCE_DOOR, (short) 200); - duration.put(Item.BIRCH_DOOR, (short) 200); - duration.put(Item.JUNGLE_DOOR, (short) 200); - duration.put(Item.ACACIA_DOOR, (short) 200); - duration.put(Item.DARK_OAK_DOOR, (short) 200); - duration.put(Item.BANNER, (short) 300); - duration.put(Item.CROSSBOW, (short) 200); - duration.put(Item.DEAD_BUSH, (short) 100); - duration.put(Item.SIGN, (short) 200); - } -} diff --git a/src/main/java/cn/nukkit/inventory/FurnaceInventory.java b/src/main/java/cn/nukkit/inventory/FurnaceInventory.java deleted file mode 100644 index 0ffcc3859..000000000 --- a/src/main/java/cn/nukkit/inventory/FurnaceInventory.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.blockentity.BlockEntityFurnace; -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class FurnaceInventory extends ContainerInventory { - - public FurnaceInventory(BlockEntityFurnace furnace) { - super(furnace, InventoryType.FURNACE); - } - - @Override - public BlockEntityFurnace getHolder() { - return (BlockEntityFurnace) this.holder; - } - - public Item getResult() { - return this.getItem(2); - } - - public Item getFuel() { - return this.getItem(1); - } - - public Item getSmelting() { - return this.getItem(0); - } - - public boolean setResult(Item item) { - return this.setItem(2, item); - } - - public boolean setFuel(Item item) { - return this.setItem(1, item); - } - - public boolean setSmelting(Item item) { - return this.setItem(0, item); - } - - @Override - public void onSlotChange(int index, Item before, boolean send) { - super.onSlotChange(index, before, send); - - this.getHolder().scheduleUpdate(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/FurnaceRecipe.java b/src/main/java/cn/nukkit/inventory/FurnaceRecipe.java deleted file mode 100644 index a0e1e2e2d..000000000 --- a/src/main/java/cn/nukkit/inventory/FurnaceRecipe.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class FurnaceRecipe implements Recipe { - - private final Item output; - - private Item ingredient; - - public FurnaceRecipe(Item result, Item ingredient) { - this.output = result.clone(); - this.ingredient = ingredient.clone(); - } - - public void setInput(Item item) { - this.ingredient = item.clone(); - } - - public Item getInput() { - return this.ingredient.clone(); - } - - @Override - public Item getResult() { - return this.output.clone(); - } - - @Override - public void registerToCraftingManager(CraftingManager manager) { - manager.registerFurnaceRecipe(this); - } - - @Override - public RecipeType getType() { - return this.ingredient.hasMeta() ? RecipeType.FURNACE_DATA : RecipeType.FURNACE; - } -} diff --git a/src/main/java/cn/nukkit/inventory/HopperInventory.java b/src/main/java/cn/nukkit/inventory/HopperInventory.java deleted file mode 100644 index 531c74ff0..000000000 --- a/src/main/java/cn/nukkit/inventory/HopperInventory.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.blockentity.BlockEntityHopper; - -/** - * Created by CreeperFace on 8.5.2017. - */ -public class HopperInventory extends ContainerInventory { - - public HopperInventory(BlockEntityHopper hopper) { - super(hopper, InventoryType.HOPPER); - } - - @Override - public BlockEntityHopper getHolder() { - return (BlockEntityHopper) super.getHolder(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/Inventory.java b/src/main/java/cn/nukkit/inventory/Inventory.java deleted file mode 100644 index 93810d4d3..000000000 --- a/src/main/java/cn/nukkit/inventory/Inventory.java +++ /dev/null @@ -1,103 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface Inventory { - - int MAX_STACK = 64; - - int getSize(); - - int getMaxStackSize(); - - void setMaxStackSize(int size); - - String getName(); - - String getTitle(); - - Item getItem(int index); - - default boolean setItem(int index, Item item) { - return setItem(index, item, true); - } - - boolean setItem(int index, Item item, boolean send); - - Item[] addItem(Item... slots); - - boolean canAddItem(Item item); - - boolean allowedToAdd(Item item); - - Item[] removeItem(Item... slots); - - Map getContents(); - - void setContents(Map items); - - void sendContents(Player player); - - void sendContents(Player... players); - - void sendContents(Collection players); - - void sendSlot(int index, Player player); - - void sendSlot(int index, Player... players); - - void sendSlot(int index, Collection players); - - boolean contains(Item item); - - Map all(Item item); - - default int first(Item item) { - return first(item, false); - } - - int first(Item item, boolean exact); - - int firstEmpty(Item item); - - void decreaseCount(int slot); - - void remove(Item item); - - default boolean clear(int index) { - return clear(index, true); - } - - boolean clear(int index, boolean send); - - void clearAll(); - - boolean isFull(); - - boolean isEmpty(); - - Set getViewers(); - - InventoryType getType(); - - InventoryHolder getHolder(); - - void onOpen(Player who); - - boolean open(Player who); - - void close(Player who); - - void onClose(Player who); - - void onSlotChange(int index, Item before, boolean send); -} diff --git a/src/main/java/cn/nukkit/inventory/InventoryHolder.java b/src/main/java/cn/nukkit/inventory/InventoryHolder.java deleted file mode 100644 index a55aa4efb..000000000 --- a/src/main/java/cn/nukkit/inventory/InventoryHolder.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.nukkit.inventory; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface InventoryHolder { - - Inventory getInventory(); -} diff --git a/src/main/java/cn/nukkit/inventory/InventoryType.java b/src/main/java/cn/nukkit/inventory/InventoryType.java deleted file mode 100644 index d7dcd459a..000000000 --- a/src/main/java/cn/nukkit/inventory/InventoryType.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.inventory; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public enum InventoryType { - - CHEST(27, "Chest", 0), //27 CONTAINER - ENDER_CHEST(27, "Ender Chest", 0), //27 CONTAINER - DOUBLE_CHEST(54, "Double Chest", 0), //27 + 27 CONTAINER - PLAYER(40, "Player", -1), //36 CONTAINER, 4 ARMOR - FURNACE(3, "Furnace", 2), //1 INPUT/OUTPUT, 1 FUEL - CRAFTING(5, "Crafting", 1), //4 CRAFTING SLOTS, 1 RESULT - WORKBENCH(10, "Crafting", 1), //9 CRAFTING SLOTS, 1 RESULT - BREWING_STAND(5, "Brewing", 4), //1 INPUT, 3 POTION, 1 FUEL - ANVIL(3, "Anvil", 5), //2 INPUT, 1 OUTPUT - ENCHANT_TABLE(2, "Enchantment Table", 3), //1 INPUT/OUTPUT, 1 LAPIS - DISPENSER(9, "Dispenser", 6), //9 CONTAINER - DROPPER(9, "Dropper", 7), //9 CONTAINER - HOPPER(5, "Hopper", 8), //5 CONTAINER - UI(1, "UI", -1), //1 CONTAINER - SHULKER_BOX(27, "Shulker Box", 0), //27 CONTAINER - BEACON(1, "Beacon", 13), //1 INPUT - ENTITY_ARMOR(4, "Entity Armor", -1), //4 ARMOR - ENTITY_EQUIPMENT(36, "Entity Equipment", -1), //36 CONTAINER - MINECART_CHEST(27, "Minecart with Chest", 0), //27 CONTAINER - MINECART_HOPPER(5, "Minecart with Hopper", 8), //5 CONTAINER - OFFHAND(1, "Offhand", -1), //1 CONTAINER - TRADING(3, "Villager Trade", 15); //3 CONTAINER - - private final int size; - private final String title; - private final int typeId; - - InventoryType(int defaultSize, String defaultBlockEntity, int typeId) { - this.size = defaultSize; - this.title = defaultBlockEntity; - this.typeId = typeId; - } - - public int getDefaultSize() { - return size; - } - - public String getDefaultTitle() { - return title; - } - - public int getNetworkType() { - return typeId; - } -} diff --git a/src/main/java/cn/nukkit/inventory/MinecartChestInventory.java b/src/main/java/cn/nukkit/inventory/MinecartChestInventory.java deleted file mode 100644 index 3eb60cfa8..000000000 --- a/src/main/java/cn/nukkit/inventory/MinecartChestInventory.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.entity.item.EntityMinecartChest; - -public class MinecartChestInventory extends ContainerInventory { - - public MinecartChestInventory(EntityMinecartChest minecart) { - super(minecart, InventoryType.MINECART_CHEST); - } - - @Override - public EntityMinecartChest getHolder() { - return (EntityMinecartChest) this.holder; - } -} diff --git a/src/main/java/cn/nukkit/inventory/MinecartHopperInventory.java b/src/main/java/cn/nukkit/inventory/MinecartHopperInventory.java deleted file mode 100644 index e33d229af..000000000 --- a/src/main/java/cn/nukkit/inventory/MinecartHopperInventory.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.entity.item.EntityMinecartHopper; - -public class MinecartHopperInventory extends ContainerInventory { - - public MinecartHopperInventory(EntityMinecartHopper minecart) { - super(minecart, InventoryType.MINECART_HOPPER); - } - - @Override - public EntityMinecartHopper getHolder() { - return (EntityMinecartHopper) super.getHolder(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/MixRecipe.java b/src/main/java/cn/nukkit/inventory/MixRecipe.java deleted file mode 100644 index fa5ebdde4..000000000 --- a/src/main/java/cn/nukkit/inventory/MixRecipe.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; -import lombok.ToString; - -@ToString -public abstract class MixRecipe implements Recipe { - - private final Item input; - private final Item ingredient; - private final Item output; - - public MixRecipe(Item input, Item ingredient, Item output) { - this.input = input.clone(); - this.ingredient = ingredient.clone(); - this.output = output.clone(); - } - - public Item getIngredient() { - return ingredient.clone(); - } - - public Item getInput() { - return input.clone(); - } - - @Override - public Item getResult() { - return output.clone(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/MultiRecipe.java b/src/main/java/cn/nukkit/inventory/MultiRecipe.java deleted file mode 100644 index dd9834e05..000000000 --- a/src/main/java/cn/nukkit/inventory/MultiRecipe.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; - -import java.util.UUID; - -public class MultiRecipe implements Recipe { - - private final UUID id; - - private final int networkId; - - public MultiRecipe(UUID id) { - this.id = id; - this.networkId = ++CraftingManager.NEXT_NETWORK_ID; - } - - @Override - public Item getResult() { - throw new UnsupportedOperationException(); - } - - @Override - public void registerToCraftingManager(CraftingManager manager) { - manager.registerMultiRecipe(this); - } - - @Override - public RecipeType getType() { - return RecipeType.MULTI; - } - - public UUID getId() { - return this.id; - } - - public int getNetworkId() { - return this.networkId; - } -} diff --git a/src/main/java/cn/nukkit/inventory/PlayerCursorInventory.java b/src/main/java/cn/nukkit/inventory/PlayerCursorInventory.java deleted file mode 100644 index 38d85d987..000000000 --- a/src/main/java/cn/nukkit/inventory/PlayerCursorInventory.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; - -/** - * @author CreeperFace - */ -public class PlayerCursorInventory extends PlayerUIComponent { - - private final PlayerUIInventory playerUI; - - PlayerCursorInventory(PlayerUIInventory playerUI) { - super(playerUI, 0, 1); - this.playerUI = playerUI; - } - - /** - * This override is here for documentation and code completion purposes only. - * - * @return Player - */ - @Override - public Player getHolder() { - return playerUI.getHolder(); - } -} diff --git a/src/main/java/cn/nukkit/inventory/PlayerEnderChestInventory.java b/src/main/java/cn/nukkit/inventory/PlayerEnderChestInventory.java deleted file mode 100644 index faf894b73..000000000 --- a/src/main/java/cn/nukkit/inventory/PlayerEnderChestInventory.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.block.BlockEnderChest; -import cn.nukkit.entity.EntityHuman; -import cn.nukkit.entity.EntityHumanType; -import cn.nukkit.level.Level; -import cn.nukkit.network.protocol.BlockEventPacket; -import cn.nukkit.network.protocol.ContainerClosePacket; -import cn.nukkit.network.protocol.ContainerOpenPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -public class PlayerEnderChestInventory extends BaseInventory { - - public PlayerEnderChestInventory(EntityHumanType player) { - super(player, InventoryType.ENDER_CHEST); - } - - @Override - public EntityHuman getHolder() { - return (EntityHuman) this.holder; - } - - @Override - public void onOpen(Player who) { - if (who != this.getHolder()) { - return; - } - super.onOpen(who); - ContainerOpenPacket containerOpenPacket = new ContainerOpenPacket(); - containerOpenPacket.windowId = who.getWindowId(this); - containerOpenPacket.type = this.getType().getNetworkType(); - BlockEnderChest chest = who.getViewingEnderChest(); - if (chest != null) { - containerOpenPacket.x = (int) chest.getX(); - containerOpenPacket.y = (int) chest.getY(); - containerOpenPacket.z = (int) chest.getZ(); - } else { - containerOpenPacket.x = containerOpenPacket.y = containerOpenPacket.z = 0; - } - - who.dataPacket(containerOpenPacket); - - this.sendContents(who); - - if (chest != null && chest.getViewers().size() == 1) { - BlockEventPacket blockEventPacket = new BlockEventPacket(); - blockEventPacket.x = (int) chest.getX(); - blockEventPacket.y = (int) chest.getY(); - blockEventPacket.z = (int) chest.getZ(); - blockEventPacket.case1 = 1; - blockEventPacket.case2 = 2; - - Level level = this.getHolder().getLevel(); - if (level != null) { - level.addLevelSoundEvent(this.getHolder().add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_ENDERCHEST_OPEN); - level.addChunkPacket((int) this.getHolder().getX() >> 4, (int) this.getHolder().getZ() >> 4, blockEventPacket); - } - } - } - - @Override - public void onClose(Player who) { - ContainerClosePacket containerClosePacket = new ContainerClosePacket(); - containerClosePacket.windowId = who.getWindowId(this); - containerClosePacket.wasServerInitiated = who.getClosingWindowId() != containerClosePacket.windowId; - who.dataPacket(containerClosePacket); - super.onClose(who); - - BlockEnderChest chest = who.getViewingEnderChest(); - if (chest != null && chest.getViewers().size() == 1) { - BlockEventPacket blockEventPacket = new BlockEventPacket(); - blockEventPacket.x = (int) chest.getX(); - blockEventPacket.y = (int) chest.getY(); - blockEventPacket.z = (int) chest.getZ(); - blockEventPacket.case1 = 1; - blockEventPacket.case2 = 0; - - Level level = this.getHolder().getLevel(); - if (level != null) { - level.addLevelSoundEvent(this.getHolder().add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_ENDERCHEST_CLOSED); - level.addChunkPacket((int) this.getHolder().getX() >> 4, (int) this.getHolder().getZ() >> 4, blockEventPacket); - } - - who.setViewingEnderChest(null); - } - - super.onClose(who); - } -} diff --git a/src/main/java/cn/nukkit/inventory/PlayerInventory.java b/src/main/java/cn/nukkit/inventory/PlayerInventory.java deleted file mode 100644 index de9d12dc9..000000000 --- a/src/main/java/cn/nukkit/inventory/PlayerInventory.java +++ /dev/null @@ -1,560 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.EntityHuman; -import cn.nukkit.entity.EntityHumanType; -import cn.nukkit.event.entity.EntityArmorChangeEvent; -import cn.nukkit.event.entity.EntityInventoryChangeEvent; -import cn.nukkit.event.player.PlayerItemHeldEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.network.protocol.*; -import cn.nukkit.network.protocol.types.ContainerIds; - -import java.util.Collection; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PlayerInventory extends BaseInventory { - - protected int itemInHandIndex = 0; - - public PlayerInventory(EntityHumanType player) { - super(player, InventoryType.PLAYER); - } - - @Override - public int getSize() { - return super.getSize() - 4; - } - - @Override - public void setSize(int size) { - super.setSize(size + 4); - this.sendContents(this.getViewers()); - } - - /** - * Called when a client equips a hotbar inventorySlot. This method should not be used by plugins. - * This method will call PlayerItemHeldEvent. - * - * @param slot hotbar slot Number of the hotbar slot to equip. - * @return boolean if the equipment change was successful, false if not. - */ - public boolean equipItem(int slot) { - if (!isHotbarSlot(slot)) { - this.sendContents((Player) this.getHolder()); - return false; - } - - if (this.getHolder() instanceof Player) { - Player player = (Player) this.getHolder(); - PlayerItemHeldEvent ev = new PlayerItemHeldEvent(player, this.getItem(slot), slot); - this.getHolder().getLevel().getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - this.sendContents(this.getViewers()); - return false; - } - - if (player.fishing != null) { - if (!(this.getItem(slot).equals(player.fishing.rod))) { - player.stopFishing(false); - } - } - } - - this.setHeldItemIndex(slot, false); - return true; - } - - private boolean isHotbarSlot(int slot) { - return slot >= 0 && slot <= this.getHotbarSize(); - } - - public int getHotbarSlotIndex(int index) { - return index; - } - - public void setHotbarSlotIndex(int index, int slot) { - } - - public int getHeldItemIndex() { - return this.itemInHandIndex; - } - - public void setHeldItemIndex(int index) { - setHeldItemIndex(index, true); - } - - public void setHeldItemIndex(int index, boolean send) { - if (index >= 0 && index < this.getHotbarSize()) { - this.itemInHandIndex = index; - - if (this.getHolder() instanceof Player && send) { - this.sendHeldItem((Player) this.getHolder()); - } - - this.sendHeldItem(this.getHolder().getViewers().values()); - } - } - - public Item getItemInHand() { - Item item = this.getItem(this.itemInHandIndex); - if (item != null) { - return item; - } else { - return new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } - } - - public Item getItemInHandFast() { - Item item = this.getItemFast(this.getHeldItemIndex()); - if (item != null) { - return item; - } else { - return air; - } - } - - public boolean setItemInHand(Item item) { - return this.setItem(this.itemInHandIndex, item); - } - - public int getHeldItemSlot() { - return this.itemInHandIndex; - } - - public void setHeldItemSlot(int slot) { - if (!isHotbarSlot(slot)) { - return; - } - - this.itemInHandIndex = slot; - - if (this.getHolder() instanceof Player) { - this.sendHeldItem((Player) this.getHolder()); - } - - this.sendHeldItem(this.getViewers()); - } - - public void sendHeldItem(Player... players) { - Item item = this.getItemInHand(); - - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.item = item; - pk.inventorySlot = pk.hotbarSlot = this.itemInHandIndex; - - for (Player player : players) { - pk.eid = this.getHolder().getId(); - if (player.equals(this.getHolder())) { - pk.eid = player.getId(); - this.sendSlot(this.itemInHandIndex, player); - } - - player.dataPacket(pk); - } - } - - public void sendHeldItemIfNotAir(Player player) { - Item item = this.getItemInHand(); - if (item.getId() != 0) { - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.item = item; - pk.inventorySlot = pk.hotbarSlot = this.itemInHandIndex; - pk.eid = player.getId(); - this.sendSlot(this.itemInHandIndex, player); - player.dataPacket(pk); - } - } - - public void sendHeldItem(Collection players) { - this.sendHeldItem(players.toArray(new Player[0])); - } - - @Override - public void onSlotChange(int index, Item before, boolean send) { - EntityHuman holder = this.getHolder(); - if (holder instanceof Player && !((Player) holder).spawned) { - return; - } - - if (index >= this.getSize()) { - this.sendArmorSlot(index, this.getViewers()); - this.sendArmorSlot(index, this.getHolder().getViewers().values()); - } else { - super.onSlotChange(index, before, send); - } - } - - public int getHotbarSize() { - return 9; - } - - public Item getArmorItem(int index) { - return this.getItem(this.getSize() + index); - } - - public boolean setArmorItem(int index, Item item) { - return this.setArmorItem(index, item, false); - } - - public boolean setArmorItem(int index, Item item, boolean ignoreArmorEvents) { - return this.setItem(this.getSize() + index, item, ignoreArmorEvents); - } - - public Item getHelmet() { - return this.getItem(this.getSize()); - } - - public Item getHelmetFast() { - return this.getItemFast(36); - } - - public Item getChestplate() { - return this.getItem(this.getSize() + 1); - } - - public Item getChestplateFast() { - return this.getItemFast(37); - } - - public Item getLeggings() { - return this.getItem(this.getSize() + 2); - } - - public Item getLeggingsFast() { - return this.getItemFast(38); - } - - public Item getBoots() { - return this.getItem(this.getSize() + 3); - } - - public Item getBootsFast() { - return this.getItemFast(39); - } - - public boolean setHelmet(Item helmet) { - return this.setItem(this.getSize(), helmet); - } - - public boolean setChestplate(Item chestplate) { - return this.setItem(this.getSize() + 1, chestplate); - } - - public boolean setLeggings(Item leggings) { - return this.setItem(this.getSize() + 2, leggings); - } - - public boolean setBoots(Item boots) { - return this.setItem(this.getSize() + 3, boots); - } - - @Override - public boolean setItem(int index, Item item) { - return setItem(index, item, true); - } - - @Override - public boolean setItem(int index, Item item, boolean send) { - if (index < 0 || index >= this.size) { - return false; - } else if (item.getId() == 0 || item.getCount() <= 0) { - return this.clear(index, send); - } - - if (index >= this.getSize()) { // Armor change - EntityArmorChangeEvent ev = new EntityArmorChangeEvent(this.getHolder(), this.getItem(index), item, index); - Server.getInstance().getPluginManager().callEvent(ev); - if (ev.isCancelled() && this.getHolder() != null) { - this.sendArmorSlot(index, this.getViewers()); - return false; - } - item = ev.getNewItem(); - } else { - EntityInventoryChangeEvent ev = new EntityInventoryChangeEvent(this.getHolder(), this.getItem(index), item, index); - Server.getInstance().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - this.sendSlot(index, this.getViewers()); - return false; - } - item = ev.getNewItem(); - } - - Item old = this.getItem(index); - this.slots.put(index, item.clone()); - this.onSlotChange(index, old, send); - return true; - } - - @Override - public boolean clear(int index, boolean send) { - if (this.slots.containsKey(index)) { - Item item = new ItemBlock(Block.get(BlockID.AIR), null, 0); - Item old = this.slots.get(index); - if (index >= this.getSize() && index < this.size) { - EntityArmorChangeEvent ev = new EntityArmorChangeEvent(this.getHolder(), old, item, index); - Server.getInstance().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - if (index >= this.size) { - this.sendArmorSlot(index, this.getViewers()); - } else { - this.sendSlot(index, this.getViewers()); - } - return false; - } - item = ev.getNewItem(); - } else { - EntityInventoryChangeEvent ev = new EntityInventoryChangeEvent(this.getHolder(), old, item, index); - Server.getInstance().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - if (index >= this.size) { - this.sendArmorSlot(index, this.getViewers()); - } else { - this.sendSlot(index, this.getViewers()); - } - return false; - } - item = ev.getNewItem(); - } - - if (item.getId() != Item.AIR) { - this.slots.put(index, item.clone()); - } else { - this.slots.remove(index); - } - - this.onSlotChange(index, old, send); - } - - return true; - } - - public Item[] getArmorContents() { - Item[] armor = new Item[4]; - for (int i = 0; i < 4; i++) { - armor[i] = this.getItem(this.getSize() + i); - } - - return armor; - } - - @Override - public void clearAll() { - int limit = this.getSize() + 4; - for (int index = 0; index < limit; ++index) { - this.clear(index); - } - getHolder().getOffhandInventory().clearAll(); - } - - public void sendArmorContents(Player player) { - this.sendArmorContents(new Player[]{player}); - } - - public void sendArmorContents(Player[] players) { - Item[] armor = this.getArmorContents(); - - MobArmorEquipmentPacket pk = new MobArmorEquipmentPacket(); - pk.eid = this.getHolder().getId(); - pk.slots = armor; - - for (Player player : players) { - if (player.equals(this.getHolder())) { - InventoryContentPacket pk2 = new InventoryContentPacket(); - pk2.inventoryId = InventoryContentPacket.SPECIAL_ARMOR; - pk2.slots = armor; - player.dataPacket(pk2); - } else { - player.dataPacket(pk); - } - } - } - - public void sendArmorContentsIfNotAr(Player player) { - Item[] armor = this.getArmorContents(); - if (armor[0].getId() != 0 || armor[1].getId() != 0 || armor[2].getId() != 0 || armor[3].getId() != 0) { - MobArmorEquipmentPacket pk = new MobArmorEquipmentPacket(); - pk.eid = this.getHolder().getId(); - pk.slots = armor; - player.dataPacket(pk); - } - } - - public void setArmorContents(Item[] items) { - if (items.length < 4) { - Item[] newItems = new Item[4]; - System.arraycopy(items, 0, newItems, 0, items.length); - items = newItems; - } - - for (int i = 0; i < 4; ++i) { - if (items[i] == null) { - items[i] = new ItemBlock(Block.get(BlockID.AIR), null, 0); - } - - if (items[i].getId() == Item.AIR) { - this.clear(this.getSize() + i); - } else { - this.setItem(this.getSize() + i, items[i]); - } - } - } - - public void sendArmorContents(Collection players) { - this.sendArmorContents(players.toArray(new Player[0])); - } - - public void sendArmorSlot(int index, Player player) { - this.sendArmorSlot(index, new Player[]{player}); - } - - public void sendArmorSlot(int index, Player[] players) { - Item[] armor = this.getArmorContents(); - - MobArmorEquipmentPacket pk = new MobArmorEquipmentPacket(); - pk.eid = this.getHolder().getId(); - pk.slots = armor; - - for (Player player : players) { - if (player.equals(this.getHolder())) { - InventorySlotPacket pk2 = new InventorySlotPacket(); - pk2.inventoryId = InventoryContentPacket.SPECIAL_ARMOR; - pk2.slot = index - this.getSize(); - pk2.item = this.getItem(index); - player.dataPacket(pk2); - } else { - player.dataPacket(pk); - } - } - } - - public void sendArmorSlot(int index, Collection players) { - this.sendArmorSlot(index, players.toArray(new Player[0])); - } - - @Override - public void sendContents(Player player) { - this.sendContents(new Player[]{player}); - } - - @Override - public void sendContents(Collection players) { - this.sendContents(players.toArray(new Player[0])); - } - - @Override - public void sendContents(Player[] players) { - InventoryContentPacket pk = new InventoryContentPacket(); - pk.slots = new Item[this.getSize()]; - for (int i = 0; i < this.getSize(); ++i) { - pk.slots[i] = this.getItem(i); - } - - for (Player player : players) { - int id = player.getWindowId(this); - if (id == -1) { - if (this.getHolder() != player) this.close(player); - continue; - } - pk.inventoryId = id; - player.dataPacket(pk.clone()); - } - } - - @Override - public void sendSlot(int index, Player player) { - this.sendSlot(index, new Player[]{player}); - } - - @Override - public void sendSlot(int index, Collection players) { - this.sendSlot(index, players.toArray(new Player[0])); - } - - @Override - public void sendSlot(int index, Player... players) { - if (players.length == 0 && this.getHolder() instanceof Player) { - Player p = (Player) this.getHolder(); - if (p.protocol >= 407) { - players = new Player[]{p}; - } - } - - InventorySlotPacket pk = new InventorySlotPacket(); - pk.slot = index; - pk.item = this.getItem(index).clone(); - - for (Player player : players) { - if (player.equals(this.getHolder())) { - pk.inventoryId = ContainerIds.INVENTORY; - player.dataPacket(pk); - } else { - int id = player.getWindowId(this); - if (id == -1) { - this.close(player); - continue; - } - pk.inventoryId = id; - player.dataPacket(pk.clone()); - } - } - } - - public void sendCreativeContents() { - if (!(this.getHolder() instanceof Player)) { - return; - } - Player p = (Player) this.getHolder(); - - if (p.protocol < 407) { - InventoryContentPacket pk = new InventoryContentPacket(); - pk.inventoryId = ContainerIds.CREATIVE; - if (!p.isSpectator()) { //fill it for all gamemodes except spectator - pk.slots = Item.getCreativeItems(p.protocol).toArray(new Item[0]); - } - p.dataPacket(pk); - } else { - CreativeContentPacket pk = new CreativeContentPacket(); - pk.entries = p.isSpectator() ? new Item[0] : Item.getCreativeItems(p.protocol).toArray(new Item[0]); - p.dataPacket(pk); - } - } - - @Override - public EntityHuman getHolder() { - return (EntityHuman) super.getHolder(); - } - - @Override - public void onOpen(Player who) { - super.onOpen(who); - ContainerOpenPacket pk = new ContainerOpenPacket(); - pk.windowId = who.getWindowId(this); - pk.type = this.getType().getNetworkType(); - pk.x = who.getFloorX(); - pk.y = who.getFloorY(); - pk.z = who.getFloorZ(); - pk.entityId = who.getId(); - who.dataPacket(pk); - } - - @Override - public void onClose(Player who) { - ContainerClosePacket pk = new ContainerClosePacket(); - pk.windowId = who.getWindowId(this); - pk.wasServerInitiated = who.getClosingWindowId() != pk.windowId; - who.dataPacket(pk); - // Player can never stop viewing their own inventory - if (who != holder) { - super.onClose(who); - } - } -} diff --git a/src/main/java/cn/nukkit/inventory/PlayerOffhandInventory.java b/src/main/java/cn/nukkit/inventory/PlayerOffhandInventory.java deleted file mode 100644 index 43c22e8d0..000000000 --- a/src/main/java/cn/nukkit/inventory/PlayerOffhandInventory.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.entity.EntityHuman; -import cn.nukkit.entity.EntityHumanType; -import cn.nukkit.item.Item; -import cn.nukkit.network.protocol.InventoryContentPacket; -import cn.nukkit.network.protocol.InventorySlotPacket; -import cn.nukkit.network.protocol.MobEquipmentPacket; -import cn.nukkit.network.protocol.types.ContainerIds; - -public class PlayerOffhandInventory extends BaseInventory { - - /** - * Items that can be put to offhand inventory on Bedrock Edition - */ - //private static final IntSet OFFHAND_ITEMS = new IntOpenHashSet(Arrays.asList(ItemID.SHIELD, ItemID.ARROW, ItemID.TOTEM, ItemID.MAP, ItemID.FIREWORKS, ItemID.NAUTILUS_SHELL, ItemID.SPARKLER)); - - public PlayerOffhandInventory(EntityHumanType holder) { - super(holder, InventoryType.OFFHAND); - } - - @Override - public void setSize(int size) { - throw new UnsupportedOperationException("Offhand can only carry one item at a time"); - } - - @Override - public void onSlotChange(int index, Item before, boolean send) { - EntityHuman holder = this.getHolder(); - if (holder instanceof Player && !((Player) holder).spawned) { - return; - } - - this.sendContents(this.getViewers()); - this.sendContents(holder.getViewers().values()); - } - - @Override - public void sendContents(Player... players) { - Item item = this.getItem(0); - MobEquipmentPacket pk = this.createMobEquipmentPacket(item); - - for (Player player : players) { - if (player == this.getHolder()) { - InventoryContentPacket pk2 = new InventoryContentPacket(); - pk2.inventoryId = ContainerIds.OFFHAND; - pk2.slots = new Item[]{item}; - player.dataPacket(pk2); - } else { - player.dataPacket(pk); - } - } - } - - @Override - public void sendSlot(int index, Player... players) { - Item item = this.getItem(0); - MobEquipmentPacket pk = this.createMobEquipmentPacket(item); - - for (Player player : players) { - if (player == this.getHolder()) { - InventorySlotPacket pk2 = new InventorySlotPacket(); - pk2.inventoryId = ContainerIds.OFFHAND; - pk2.item = item; - player.dataPacket(pk2); - } else { - player.dataPacket(pk); - } - } - } - - private MobEquipmentPacket createMobEquipmentPacket(Item item) { - MobEquipmentPacket pk = new MobEquipmentPacket(); - pk.eid = this.getHolder().getId(); - pk.item = item; - pk.inventorySlot = 1; - pk.windowId = ContainerIds.OFFHAND; - return pk; - } - - @Override - public EntityHuman getHolder() { - return (EntityHuman) super.getHolder(); - } - - @Override - public boolean allowedToAdd(Item item) { - //return OFFHAND_ITEMS.contains(item.getId()); - return true; - } -} diff --git a/src/main/java/cn/nukkit/inventory/PlayerUIComponent.java b/src/main/java/cn/nukkit/inventory/PlayerUIComponent.java deleted file mode 100644 index f7804c2af..000000000 --- a/src/main/java/cn/nukkit/inventory/PlayerUIComponent.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; - -import java.util.Collections; -import java.util.Map; -import java.util.Set; - -public class PlayerUIComponent extends BaseInventory { - - public static final int CREATED_ITEM_OUTPUT_UI_SLOT = 50; - - private final PlayerUIInventory playerUI; - private final int offset; - private final int size; - - PlayerUIComponent(PlayerUIInventory playerUI, int offset, int size) { - super(playerUI.holder, InventoryType.UI, Collections.emptyMap(), size); - this.playerUI = playerUI; - this.offset = offset; - this.size = size; - } - - @Override - public int getSize() { - return size; - } - - @Override - public int getMaxStackSize() { - return 64; - } - - @Override - public void setMaxStackSize(int size) { - throw new UnsupportedOperationException(); - } - - - @Override - public String getTitle() { - throw new UnsupportedOperationException(); - } - - @Override - public Item getItem(int index) { - return this.playerUI.getItem(index + this.offset); - } - - @Override - public boolean setItem(int index, Item item, boolean send) { - return this.playerUI.setItem(index + this.offset, item, send); - } - - @Override - public Map getContents() { - Map contents = playerUI.getContents(); - contents.keySet().removeIf(slot -> slot < offset || slot > offset + size); - return contents; - } - - - @Override - public void sendContents(Player... players) { - this.playerUI.sendContents(players); - } - - @Override - public void sendSlot(int index, Player... players) { - playerUI.sendSlot(index + this.offset, players); - } - - @Override - public Set getViewers() { - return playerUI.viewers; - } - - @Override - public InventoryType getType() { - return playerUI.type; - } - - @Override - public void onOpen(Player who) { - - } - - @Override - public boolean open(Player who) { - return false; - } - - @Override - public void close(Player who) { - - } - - @Override - public void onClose(Player who) { - - } - - @Override - public void onSlotChange(int index, Item before, boolean send) { - this.playerUI.onSlotChange(index + this.offset, before, send); - } -} diff --git a/src/main/java/cn/nukkit/inventory/PlayerUIInventory.java b/src/main/java/cn/nukkit/inventory/PlayerUIInventory.java deleted file mode 100644 index 0121b4347..000000000 --- a/src/main/java/cn/nukkit/inventory/PlayerUIInventory.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import cn.nukkit.network.protocol.InventoryContentPacket; -import cn.nukkit.network.protocol.InventorySlotPacket; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.network.protocol.types.ContainerIds; - -import java.util.HashMap; - -public class PlayerUIInventory extends BaseInventory { - - private final Player player; - - private final PlayerCursorInventory cursorInventory; - private final CraftingGrid craftingGrid; - private final BigCraftingGrid bigCraftingGrid; - - public PlayerUIInventory(Player player) { - super(player, InventoryType.UI, new HashMap<>(), 51); - this.player = player; - - this.cursorInventory = new PlayerCursorInventory(this); - this.craftingGrid = new CraftingGrid(this); - this.bigCraftingGrid = new BigCraftingGrid(this); - } - - public PlayerCursorInventory getCursorInventory() { - return cursorInventory; - } - - public CraftingGrid getCraftingGrid() { - return craftingGrid; - } - - public BigCraftingGrid getBigCraftingGrid() { - return bigCraftingGrid; - } - - @Override - public void setSize(int size) { - throw new UnsupportedOperationException("UI size is immutable"); - } - - @Override - public void sendSlot(int index, Player... target) { - InventorySlotPacket pk = new InventorySlotPacket(); - pk.slot = index; - pk.item = this.getItem(index); - - for (Player p : target) { - if (p == this.getHolder()) { - pk.inventoryId = ContainerIds.UI; - if (p.protocol < ProtocolInfo.v1_16_0) { - p.dataPacket(pk); - } - } else { - int id; - - if ((id = p.getWindowId(this)) == ContainerIds.NONE) { - this.close(p); - continue; - } - pk.inventoryId = id; - if (p.protocol < ProtocolInfo.v1_16_0) { - p.dataPacket(pk); - } - } - if (p.protocol >= ProtocolInfo.v1_16_0) { - p.dataPacket(pk); - } - } - } - - @Override - public void sendContents(Player... target) { - //sendSlot(0, target); //update cursor slot - - InventoryContentPacket pk = new InventoryContentPacket(); - pk.slots = new Item[this.getSize()]; - for (int i = 0; i < this.getSize(); ++i) { - pk.slots[i] = this.getItem(i); - } - - for (Player p : target) { - if (p == this.getHolder()) { - pk.inventoryId = ContainerIds.UI; - if (p.protocol < ProtocolInfo.v1_16_0) { - p.dataPacket(pk); - } - } else { - int id; - - if ((id = p.getWindowId(this)) == ContainerIds.NONE) { - this.close(p); - continue; - } - pk.inventoryId = id; - if (p.protocol < ProtocolInfo.v1_16_0) { - p.dataPacket(pk); - } - } - /*if (p.protocol >= ProtocolInfo.v1_16_0) { - p.dataPacket(pk); - }*/ - //https://github.com/CloudburstMC/Nukkit/commit/f96ce6eb90d47ab99ced368dd7129601f14c0b2b - } - } - - @Override - public int getSize() { - return 51; - } - - @Override - public Player getHolder() { - return player; - } -} diff --git a/src/main/java/cn/nukkit/inventory/Recipe.java b/src/main/java/cn/nukkit/inventory/Recipe.java deleted file mode 100644 index 033c5c59c..000000000 --- a/src/main/java/cn/nukkit/inventory/Recipe.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface Recipe { - - Item getResult(); - - void registerToCraftingManager(CraftingManager manager); - - RecipeType getType(); -} diff --git a/src/main/java/cn/nukkit/inventory/RecipeType.java b/src/main/java/cn/nukkit/inventory/RecipeType.java deleted file mode 100644 index 67b9ea65a..000000000 --- a/src/main/java/cn/nukkit/inventory/RecipeType.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.inventory; - -public enum RecipeType { - - SHAPELESS, - SHAPED, - FURNACE, - FURNACE_DATA, - MULTI, - SHULKER_BOX, - SHAPELESS_CHEMISTRY, - SHAPED_CHEMISTRY, - REPAIR -} diff --git a/src/main/java/cn/nukkit/inventory/ShapedRecipe.java b/src/main/java/cn/nukkit/inventory/ShapedRecipe.java deleted file mode 100644 index ecd0919e0..000000000 --- a/src/main/java/cn/nukkit/inventory/ShapedRecipe.java +++ /dev/null @@ -1,340 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; -import io.netty.util.collection.CharObjectHashMap; - -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ShapedRecipe implements CraftingRecipe { - - private String recipeId; - private final Item primaryResult; - private final List extraResults = new ArrayList<>(); - - private final List ingredientsAggregate; - - private long least, most; - - private final String[] shape; - private final int priority; - - private final CharObjectHashMap ingredients = new CharObjectHashMap<>(); - - private final int networkId; - - public ShapedRecipe(Item primaryResult, String[] shape, Map ingredients, List extraResults) { - this(null, 1, primaryResult, shape, ingredients, extraResults); - } - - public ShapedRecipe(String recipeId, int priority, Item primaryResult, String[] shape, Map ingredients, List extraResults) { - this(recipeId, priority, primaryResult, shape, ingredients, extraResults, null); - } - - /** - * Constructs a ShapedRecipe instance. - * - * @param primaryResult Primary result of the recipe - * @param shape
Array of 1, 2, or 3 strings representing the rows of the recipe. - * This accepts an array of 1, 2 or 3 strings. Each string should be of the same length and must be at most 3 - * characters long. Each character represents a unique type of ingredient. Spaces are interpreted as air. - * @param ingredients
Char => Item map of items to be set into the shape. - * This accepts an array of Items, indexed by character. Every unique character (except space) in the shape - * array MUST have a corresponding item in this list. Space character is automatically treated as air. - * @param extraResults
List of additional result items to leave in the crafting grid afterwards. Used for things like cake recipe - * empty buckets. - * @param networkId Unique network id of this recipe. If null, a new networkId will be assigned to this recipe. - * - * Note: Recipes **do not** need to be square. Do NOT add padding for empty rows/columns. - */ - public ShapedRecipe(String recipeId, int priority, Item primaryResult, String[] shape, Map ingredients, List extraResults, Integer networkId) { - this.recipeId = recipeId; - this.priority = priority; - int rowCount = shape.length; - if (rowCount > 3 || rowCount <= 0) { - throw new RuntimeException("Shaped recipes may only have 1, 2 or 3 rows, not " + rowCount); - } - - int columnCount = shape[0].length(); - if (columnCount > 3 || columnCount <= 0) { - throw new RuntimeException("Shaped recipes may only have 1, 2 or 3 columns, not " + columnCount); - } - - - for (String row : shape) { - if (row.length() != columnCount) { - throw new RuntimeException("Shaped recipe rows must all have the same length (expected " + columnCount + ", got " + row.length() + ')'); - } - - for (int x = 0; x < columnCount; ++x) { - char c = row.charAt(x); - - if (c != ' ' && !ingredients.containsKey(c)) { - throw new RuntimeException("No item specified for symbol '" + c + '\''); - } - } - } - - this.primaryResult = primaryResult.clone(); - this.extraResults.addAll(extraResults); - - this.shape = shape; - - for (Map.Entry entry : ingredients.entrySet()) { - this.setIngredient(entry.getKey(), entry.getValue()); - } - - this.ingredientsAggregate = new ArrayList<>(); - for (char c : String.join("", this.shape).toCharArray()) { - if (c == ' ') - continue; - Item ingredient = this.ingredients.get(c).clone(); - for (Item existingIngredient : this.ingredientsAggregate) { - if (existingIngredient.equals(ingredient, ingredient.hasMeta(), ingredient.hasCompoundTag())) { - existingIngredient.setCount(existingIngredient.getCount() + ingredient.getCount()); - ingredient = null; - break; - } - } - if (ingredient != null) - this.ingredientsAggregate.add(ingredient); - } - this.ingredientsAggregate.sort(CraftingManager.recipeComparator); - this.networkId = networkId != null ? networkId : ++CraftingManager.NEXT_NETWORK_ID; - } - - public int getWidth() { - return this.shape[0].length(); - } - - public int getHeight() { - return this.shape.length; - } - - @Override - public Item getResult() { - return this.primaryResult; - } - - @Override - public String getRecipeId() { - return this.recipeId; - } - - @Override - public UUID getId() { - return new UUID(least, most); - } - - @Override - public void setId(UUID uuid) { - this.least = uuid.getLeastSignificantBits(); - this.most = uuid.getMostSignificantBits(); - - if (this.recipeId == null) { - this.recipeId = getId().toString(); - } - } - - public ShapedRecipe setIngredient(String key, Item item) { - return this.setIngredient(key.charAt(0), item); - } - - public ShapedRecipe setIngredient(char key, Item item) { - if (String.join("", this.shape).indexOf(key) < 0) { - throw new RuntimeException("Symbol does not appear in the shape: " + key); - } - - this.ingredients.put(key, item); - return this; - } - - public List getIngredientList() { - List items = new ArrayList<>(); - for (int y = 0, y2 = getHeight(); y < y2; ++y) { - for (int x = 0, x2 = getWidth(); x < x2; ++x) { - items.add(getIngredient(x, y)); - } - } - return items; - } - - public Map> getIngredientMap() { - Map> ingredients = new LinkedHashMap<>(); - - for (int y = 0, y2 = getHeight(); y < y2; ++y) { - Map m = new LinkedHashMap<>(); - - for (int x = 0, x2 = getWidth(); x < x2; ++x) { - m.put(x, getIngredient(x, y)); - } - - ingredients.put(y, m); - } - - return ingredients; - } - - public Item getIngredient(int x, int y) { - Item item = this.ingredients.get(this.shape[y].charAt(x)); - - return item != null ? item.clone() : Item.get(Item.AIR); - } - - public String[] getShape() { - return shape; - } - - @Override - public void registerToCraftingManager(CraftingManager manager) { - manager.registerShapedRecipe(388, this); - } - - @Override - public RecipeType getType() { - return RecipeType.SHAPED; - } - - @Override - public List getExtraResults() { - return extraResults; - } - - @Override - public List getAllResults() { - List list = new ArrayList<>(); - list.add(primaryResult); - list.addAll(extraResults); - - return list; - } - - @Override - public int getPriority() { - return this.priority; - } - - public boolean matchItems(List inputList, List extraOutputList, int multiplier) { - List haveInputs = new ArrayList<>(); - for (Item item : inputList) { - if (item.isNull()) - continue; - haveInputs.add(item.clone()); - } - List needInputs = new ArrayList<>(); - if (multiplier != 1) { - for (Item item : ingredientsAggregate) { - if (item.isNull()) - continue; - Item itemClone = item.clone(); - itemClone.setCount(itemClone.getCount() * multiplier); - needInputs.add(itemClone); - } - } else { - for (Item item : ingredientsAggregate) { - if (item.isNull()) - continue; - needInputs.add(item.clone()); - } - } - - if (!matchItemList(haveInputs, needInputs)) { - return false; - } - - List haveOutputs = new ArrayList<>(); - for (Item item : extraOutputList) { - if (item.isNull()) - continue; - haveOutputs.add(item.clone()); - } - haveOutputs.sort(CraftingManager.recipeComparator); - List needOutputs = new ArrayList<>(); - if (multiplier != 1) { - for (Item item : getExtraResults()) { - if (item.isNull()) - continue; - Item itemClone = item.clone(); - itemClone.setCount(itemClone.getCount() * multiplier); - needOutputs.add(itemClone); - } - } else { - for (Item item : getExtraResults()) { - if (item.isNull()) - continue; - needOutputs.add(item.clone()); - } - } - needOutputs.sort(CraftingManager.recipeComparator); - - return matchItemList(haveOutputs, needOutputs); - } - - /** - * Returns whether the specified list of crafting grid inputs and outputs matches this recipe. Outputs DO NOT - * include the primary result item. - * - * @param inputList list of items taken from the crafting grid - * @param extraOutputList list of items put back into the crafting grid (secondary results) - * @return bool - */ - @Override - public boolean matchItems(List inputList, List extraOutputList) { - return matchItems(inputList, extraOutputList, 1); - } - - private static boolean matchItemList(List haveItems, List needItems) { - for (Item needItem : new ArrayList<>(needItems)) { - for (Item haveItem : new ArrayList<>(haveItems)) { - if (needItem.equals(haveItem, needItem.hasMeta(), needItem.hasCompoundTag())) { - int amount = Math.min(haveItem.getCount(), needItem.getCount()); - needItem.setCount(needItem.getCount() - amount); - haveItem.setCount(haveItem.getCount() - amount); - if (haveItem.getCount() == 0) { - haveItems.remove(haveItem); - } - if (needItem.getCount() == 0) { - needItems.remove(needItem); - break; - } - } - } - } - return haveItems.isEmpty() && needItems.isEmpty(); - } - - @Override - public String toString() { - StringJoiner joiner = new StringJoiner(", "); - - ingredients.forEach((character, item) -> joiner.add(item.getName() + ':' + item.getDamage())); - return joiner.toString(); - } - - @Override - public boolean requiresCraftingTable() { - return this.getHeight() > 2 || this.getWidth() > 2; - } - - @Override - public List getIngredientsAggregate() { - return ingredientsAggregate; - } - - public int getNetworkId() { - return this.networkId; - } - - public static class Entry { - public final int x; - public final int y; - - public Entry(int x, int y) { - this.x = x; - this.y = y; - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/inventory/ShapelessRecipe.java b/src/main/java/cn/nukkit/inventory/ShapelessRecipe.java deleted file mode 100644 index 68584b598..000000000 --- a/src/main/java/cn/nukkit/inventory/ShapelessRecipe.java +++ /dev/null @@ -1,231 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; - -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ShapelessRecipe implements CraftingRecipe { - - private String recipeId; - - private final Item output; - - private long least, most; - - private final List ingredients; - private final List ingredientsAggregate; - - private final int priority; - - private final int networkId; - - public ShapelessRecipe(Item result, Collection ingredients) { - this(null, 10, result, ingredients); - } - - public ShapelessRecipe(String recipeId, int priority, Item result, Collection ingredients) { - this(recipeId, priority, result, ingredients, null); - } - - public ShapelessRecipe(String recipeId, int priority, Item result, Collection ingredients, Integer networkId) { - this.recipeId = recipeId; - this.priority = priority; - this.output = result.clone(); - if (ingredients.size() > 9) { - throw new IllegalArgumentException("Shapeless recipes cannot have more than 9 ingredients"); - } - - this.ingredients = new ArrayList<>(); - this.ingredientsAggregate = new ArrayList<>(); - - for (Item item : ingredients) { - if (item.getCount() < 1) { - throw new IllegalArgumentException("Recipe '" + recipeId + "' Ingredient amount was not 1 (value: " + item.getCount() + ')'); - } - boolean found = false; - for (Item existingIngredient : this.ingredientsAggregate) { - if (existingIngredient.equals(item, item.hasMeta(), item.hasCompoundTag())) { - existingIngredient.setCount(existingIngredient.getCount() + item.getCount()); - found = true; - break; - } - } - if (!found) - this.ingredientsAggregate.add(item.clone()); - this.ingredients.add(item.clone()); - } - - this.ingredientsAggregate.sort(CraftingManager.recipeComparator); - this.networkId = networkId != null ? networkId : ++CraftingManager.NEXT_NETWORK_ID; - } - - @Override - public Item getResult() { - return this.output.clone(); - } - - @Override - public String getRecipeId() { - return this.recipeId; - } - - @Override - public UUID getId() { - return new UUID(least, most); - } - - @Override - public void setId(UUID uuid) { - this.least = uuid.getLeastSignificantBits(); - this.most = uuid.getMostSignificantBits(); - - if (this.recipeId == null) { - this.recipeId = this.getId().toString(); - } - } - - public List getIngredientList() { - List ingredients = new ArrayList<>(); - for (Item ingredient : this.ingredients) { - ingredients.add(ingredient.clone()); - } - - return ingredients; - } - - public int getIngredientCount() { - return ingredients.size(); - } - - @Override - public void registerToCraftingManager(CraftingManager manager) { - manager.registerShapelessRecipe(388, this); - } - - @Override - public RecipeType getType() { - return RecipeType.SHAPELESS; - } - - @Override - public boolean requiresCraftingTable() { - return this.ingredients.size() > 4; - } - - @Override - public List getExtraResults() { - return new ArrayList<>(); - } - - @Override - public List getAllResults() { - return null; - } - - @Override - public int getPriority() { - return this.priority; - } - - public boolean matchItems(List inputList, List extraOutputList, int multiplier) { - List haveInputs = new ArrayList<>(); - for (Item item : inputList) { - if (item.isNull()) - continue; - haveInputs.add(item.clone()); - } - List needInputs = new ArrayList<>(); - if (multiplier != 1) { - for (Item item : ingredientsAggregate) { - if (item.isNull()) - continue; - Item itemClone = item.clone(); - itemClone.setCount(itemClone.getCount() * multiplier); - needInputs.add(itemClone); - } - } else { - for (Item item : ingredientsAggregate) { - if (item.isNull()) - continue; - needInputs.add(item.clone()); - } - } - - if (!matchItemList(haveInputs, needInputs)) { - return false; - } - - List haveOutputs = new ArrayList<>(); - for (Item item : extraOutputList) { - if (item.isNull()) - continue; - haveOutputs.add(item.clone()); - } - haveOutputs.sort(CraftingManager.recipeComparator); - List needOutputs = new ArrayList<>(); - if (multiplier != 1) { - for (Item item : getExtraResults()) { - if (item.isNull()) - continue; - Item itemClone = item.clone(); - itemClone.setCount(itemClone.getCount() * multiplier); - needOutputs.add(itemClone); - } - } else { - for (Item item : getExtraResults()) { - if (item.isNull()) - continue; - needOutputs.add(item.clone()); - } - } - needOutputs.sort(CraftingManager.recipeComparator); - - return matchItemList(haveOutputs, needOutputs); - } - - /** - * Returns whether the specified list of crafting grid inputs and outputs matches this recipe. Outputs DO NOT - * include the primary result item. - * - * @param inputList list of items taken from the crafting grid - * @param extraOutputList list of items put back into the crafting grid (secondary results) - * @return bool - */ - @Override - public boolean matchItems(List inputList, List extraOutputList) { - return matchItems(inputList, extraOutputList, 1); - } - - private static boolean matchItemList(List haveItems, List needItems) { - for (Item needItem : new ArrayList<>(needItems)) { - for (Item haveItem : new ArrayList<>(haveItems)) { - if (needItem.equals(haveItem, needItem.hasMeta(), needItem.hasCompoundTag())) { - int amount = Math.min(haveItem.getCount(), needItem.getCount()); - needItem.setCount(needItem.getCount() - amount); - haveItem.setCount(haveItem.getCount() - amount); - if (haveItem.getCount() == 0) { - haveItems.remove(haveItem); - } - if (needItem.getCount() == 0) { - needItems.remove(needItem); - break; - } - } - } - } - return haveItems.isEmpty() && needItems.isEmpty(); - } - - @Override - public List getIngredientsAggregate() { - return ingredientsAggregate; - } - - public int getNetworkId() { - return this.networkId; - } -} diff --git a/src/main/java/cn/nukkit/inventory/ShulkerBoxInventory.java b/src/main/java/cn/nukkit/inventory/ShulkerBoxInventory.java deleted file mode 100644 index ff30a389a..000000000 --- a/src/main/java/cn/nukkit/inventory/ShulkerBoxInventory.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.block.BlockID; -import cn.nukkit.blockentity.BlockEntityShulkerBox; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.network.protocol.BlockEventPacket; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -public class ShulkerBoxInventory extends ContainerInventory { - - public ShulkerBoxInventory(BlockEntityShulkerBox box) { - super(box, InventoryType.SHULKER_BOX); - } - - @Override - public BlockEntityShulkerBox getHolder() { - return (BlockEntityShulkerBox) this.holder; - } - - @Override - public void onOpen(Player who) { - super.onOpen(who); - - if (this.getViewers().size() == 1) { - BlockEventPacket pk = new BlockEventPacket(); - pk.x = (int) this.getHolder().getX(); - pk.y = (int) this.getHolder().getY(); - pk.z = (int) this.getHolder().getZ(); - pk.case1 = 1; - pk.case2 = 2; - - Level level = this.getHolder().getLevel(); - if (level != null) { - level.addLevelSoundEvent(this.getHolder().add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_SHULKERBOX_OPEN); - level.addChunkPacket((int) this.getHolder().getX() >> 4, (int) this.getHolder().getZ() >> 4, pk); - } - } - } - - @Override - public void onClose(Player who) { - if (this.getViewers().size() == 1) { - BlockEventPacket pk = new BlockEventPacket(); - pk.x = (int) this.getHolder().getX(); - pk.y = (int) this.getHolder().getY(); - pk.z = (int) this.getHolder().getZ(); - pk.case1 = 1; - pk.case2 = 0; - - Level level = this.getHolder().getLevel(); - if (level != null) { - level.addLevelSoundEvent(this.getHolder().add(0.5, 0.5, 0.5), LevelSoundEventPacket.SOUND_SHULKERBOX_CLOSED); - level.addChunkPacket((int) this.getHolder().getX() >> 4, (int) this.getHolder().getZ() >> 4, pk); - } - } - - super.onClose(who); - } - - @Override - public boolean canAddItem(Item item) { - return allowedToAdd(item) && super.canAddItem(item); - } - - @Override - public boolean allowedToAdd(Item item) { - // Do not allow nested shulker boxes - return item.getId() != BlockID.SHULKER_BOX && item.getId() != BlockID.UNDYED_SHULKER_BOX; - } -} diff --git a/src/main/java/cn/nukkit/inventory/TradeInventory.java b/src/main/java/cn/nukkit/inventory/TradeInventory.java deleted file mode 100644 index 18396c4dc..000000000 --- a/src/main/java/cn/nukkit/inventory/TradeInventory.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.Player; -import cn.nukkit.entity.passive.EntityVillager; -import cn.nukkit.item.Item; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.network.protocol.UpdateTradePacket; - -import java.io.IOException; -import java.nio.ByteOrder; - -public class TradeInventory extends BaseInventory { - - public TradeInventory(InventoryHolder holder) { - super(holder, InventoryType.TRADING); - } - - public void onOpen(Player who) { - super.onOpen(who); - - UpdateTradePacket pk = new UpdateTradePacket(); - pk.windowId = (byte) who.getWindowId(this); - pk.windowType = (byte) InventoryType.TRADING.getNetworkType(); - pk.isWilling = this.getHolder().isWilling(); - pk.screen2 = true; - pk.trader = this.getHolder().getId(); - pk.tradeTier = this.getHolder().getTradeTier(); - pk.player = who.getId(); - try { - pk.offers = NBTIO.write(this.getHolder().getOffers(),ByteOrder.LITTLE_ENDIAN); - } catch(IOException ignored) {} - - who.dataPacket(pk); - } - - public void onClose(Player who) { - for (int i = 0; i <= 1; i++) { - Item item = getItem(i); - if (who.getInventory().canAddItem(item)) { - who.getInventory().addItem(item); - } else { - who.dropItem(item); - } - this.clear(i); - } - - super.onClose(who); - } - - public EntityVillager getHolder() { - return (EntityVillager) this.holder; - } -} diff --git a/src/main/java/cn/nukkit/inventory/TradeInventoryRecipe.java b/src/main/java/cn/nukkit/inventory/TradeInventoryRecipe.java deleted file mode 100644 index 3d4fafe5c..000000000 --- a/src/main/java/cn/nukkit/inventory/TradeInventoryRecipe.java +++ /dev/null @@ -1,114 +0,0 @@ -package cn.nukkit.inventory; - -import cn.nukkit.item.Item; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import lombok.Getter; - -public class TradeInventoryRecipe { - - public static int A_ITEM = 0; - public static int B_ITEM = 1; - @Getter - private Item sellItem; - @Getter - private Item buyItem; - @Getter - private Item secondBuyItem; - - private int tier = -1; - private int maxUses = 999; - private int buyCountA = 0; - private int buyCountB = 0; - private int uses = 0; - private int demand = 0; - private int rewardsExp = 0; - private int traderExp = 0; - private float priceMultiplierA = 0F; - private float priceMultiplierB = 0F; - - public TradeInventoryRecipe(Item sellItem, Item buyItem) { - this(sellItem, buyItem, Item.get(0)); - } - - public TradeInventoryRecipe(Item sellItem, Item buyItem, Item secondBuyItem) { - this.sellItem = sellItem; - this.buyItem = buyItem; - this.secondBuyItem = secondBuyItem; - } - - public TradeInventoryRecipe setTier(int tier) { - this.tier = tier; - return this; - } - - public TradeInventoryRecipe setMaxUses(int maxUses) { - this.maxUses = maxUses; - return this; - } - - public TradeInventoryRecipe setBuyCount(int count, int type) { - switch (type) { - case 0: - this.buyCountA = count; - break; - case 1: - this.buyCountB = count; - break; - } - this.buyCountA = count; - return this; - } - - public TradeInventoryRecipe setDemand(int demand) { - this.demand = demand; - return this; - } - - public TradeInventoryRecipe setMultiplier(float multiplier, int type) { - switch (type) { - case 0: - this.priceMultiplierA = multiplier; - break; - case 1: - this.priceMultiplierB = multiplier; - break; - } - return this; - } - - public TradeInventoryRecipe setRewardExp(int reward) { - this.rewardsExp = reward; - return this; - } - - public CompoundTag toNBT() { - CompoundTag nbt = new CompoundTag(); - nbt.putCompound("buyA", NBTIO.putItemHelper(buyItem, -1)); - nbt.putCompound("buyB", NBTIO.putItemHelper(secondBuyItem,-1)); - nbt.putCompound("sell", NBTIO.putItemHelper(sellItem, -1)); - nbt.putInt("tier", tier); - nbt.putInt("buyCountA", buyCountA); - nbt.putInt("buyCountB", buyCountB); - nbt.putInt("uses", uses); - nbt.putInt("maxUses", maxUses); - nbt.putInt("rewardExp", rewardsExp); - nbt.putInt("demand", demand); - nbt.putInt("traderExp", traderExp); - nbt.putFloat("priceMultiplierA", priceMultiplierA); - nbt.putFloat("priceMultiplierB", priceMultiplierB); - return nbt; - } - - public static TradeInventoryRecipe toNBT(CompoundTag nbt) { - return new TradeInventoryRecipe(NBTIO.getItemHelper(nbt.getCompound("sell")), NBTIO.getItemHelper(nbt.getCompound("buyA")), NBTIO.getItemHelper(nbt.getCompound("buyB"))) - .setTier(nbt.getInt("tier")) - .setBuyCount(nbt.getInt("buyCountA"), A_ITEM) - .setBuyCount(nbt.getInt("buyCountB"), B_ITEM) - .setMaxUses(nbt.getInt("maxUses")) - .setMultiplier(nbt.getInt("priceMultiplierA"), A_ITEM) - .setMultiplier(nbt.getInt("priceMultiplierB"), B_ITEM) - .setDemand(nbt.getInt("demand")) - .setRewardExp(nbt.getInt("rewardExp")); - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/CraftingTransaction.java b/src/main/java/cn/nukkit/inventory/transaction/CraftingTransaction.java deleted file mode 100644 index 1a917df23..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/CraftingTransaction.java +++ /dev/null @@ -1,191 +0,0 @@ -package cn.nukkit.inventory.transaction; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.inventory.CraftItemEvent; -import cn.nukkit.inventory.BigCraftingGrid; -import cn.nukkit.inventory.CraftingRecipe; -import cn.nukkit.inventory.InventoryType; -import cn.nukkit.inventory.transaction.action.InventoryAction; -import cn.nukkit.inventory.transaction.action.SlotChangeAction; -import cn.nukkit.item.Item; -import cn.nukkit.network.protocol.ContainerClosePacket; -import cn.nukkit.network.protocol.types.ContainerIds; -import cn.nukkit.scheduler.Task; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author CreeperFace - */ -public class CraftingTransaction extends InventoryTransaction { - - protected int gridSize; - - protected List inputs; - - protected List secondaryOutputs; - - protected Item primaryOutput; - - protected CraftingRecipe recipe; - - public CraftingTransaction(Player source, List actions) { - super(source, actions, false); - - this.gridSize = (source.getCraftingGrid() instanceof BigCraftingGrid) ? 3 : 2; - - this.inputs = new ArrayList<>(); - - this.secondaryOutputs = new ArrayList<>(); - - init(source, actions); - } - - public void setInput(Item item) { - if (inputs.size() < gridSize * gridSize) { - for (Item existingInput : this.inputs) { - if (existingInput.equals(item, item.hasMeta(), item.hasCompoundTag())) { - existingInput.setCount(existingInput.getCount() + item.getCount()); - return; - } - } - inputs.add(item.clone()); - } else { - if (!Server.getInstance().suomiCraftPEMode()) throw new RuntimeException("Input list is full can't add " + item); - } - } - - public List getInputList() { - return inputs; - } - - public void setExtraOutput(Item item) { - if (secondaryOutputs.size() < gridSize * gridSize) { - secondaryOutputs.add(item.clone()); - } else { - if (!Server.getInstance().suomiCraftPEMode()) throw new RuntimeException("Output list is full can't add " + item); - } - } - - public Item getPrimaryOutput() { - return primaryOutput; - } - - public void setPrimaryOutput(Item item) { - if (primaryOutput == null) { - primaryOutput = item.clone(); - } else if (!primaryOutput.equals(item)) { - if (!Server.getInstance().suomiCraftPEMode()) throw new RuntimeException("Primary result item has already been set and does not match the current item (expected " + primaryOutput + ", got " + item + ')'); - } - } - - public CraftingRecipe getRecipe() { - return recipe; - } - - public boolean canExecute() { - recipe = source.getServer().getCraftingManager().matchRecipe(inputs, this.primaryOutput, this.secondaryOutputs); - return this.recipe != null && super.canExecute(); - } - - protected boolean callExecuteEvent() { - CraftItemEvent ev; - - this.source.getServer().getPluginManager().callEvent(ev = new CraftItemEvent(this)); - return !ev.isCancelled(); - } - - protected void sendInventories() { - super.sendInventories(); - - /* - * TODO: HACK! - * we can't resend the contents of the crafting window, so we force the client to close it instead. - * So people don't whine about messy desync issues when someone cancels CraftItemEvent, or when a crafting - * transaction goes wrong. - */ - ContainerClosePacket pk = new ContainerClosePacket(); - pk.windowId = ContainerIds.NONE; - pk.wasServerInitiated = true; - source.getServer().getScheduler().scheduleDelayedTask(new Task() { - @Override - public void onRun(int currentTick) { - source.dataPacket(pk); - } - }, 10); - - this.source.resetCraftingGridType(); - } - - public boolean execute() { - if (super.execute()) { - switch (this.primaryOutput.getId()) { - case Item.CRAFTING_TABLE: - source.awardAchievement("buildWorkBench"); - break; - case Item.WOODEN_PICKAXE: - source.awardAchievement("buildPickaxe"); - break; - case Item.FURNACE: - source.awardAchievement("buildFurnace"); - break; - case Item.WOODEN_HOE: - source.awardAchievement("buildHoe"); - break; - case Item.BREAD: - source.awardAchievement("makeBread"); - break; - case Item.CAKE: - source.awardAchievement("bakeCake"); - break; - case Item.STONE_PICKAXE: - case Item.GOLDEN_PICKAXE: - case Item.IRON_PICKAXE: - case Item.DIAMOND_PICKAXE: - source.awardAchievement("buildBetterPickaxe"); - break; - case Item.WOODEN_SWORD: - source.awardAchievement("buildSword"); - break; - case Item.DIAMOND: - source.awardAchievement("diamond"); - break; - } - - return true; - } - - return false; - } - - public boolean checkForCraftingPart(List actions) { - for (InventoryAction action : actions) { - if (action instanceof SlotChangeAction) { - SlotChangeAction slotChangeAction = (SlotChangeAction) action; - if (slotChangeAction.getInventory().getType() == InventoryType.UI) { - if (slotChangeAction.getSlot() == 50) { - if (!slotChangeAction.getSourceItem().equals(slotChangeAction.getTargetItem())) { - return true; - } else { - Server.getInstance().getLogger().debug("Source equals target"); - return false; - } - } else { - Server.getInstance().getLogger().debug("Invalid slot: " + slotChangeAction.getSlot()); - return false; - } - } else { - Server.getInstance().getLogger().debug("Invalid action type: " + slotChangeAction.getInventory().getType()); - return false; - } - } else { - Server.getInstance().getLogger().debug("SlotChangeAction expected, got " + action); - return false; - } - } - Server.getInstance().getLogger().debug("No actions on the list"); - return false; - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/EnchantTransaction.java b/src/main/java/cn/nukkit/inventory/transaction/EnchantTransaction.java deleted file mode 100644 index 05d235317..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/EnchantTransaction.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.nukkit.inventory.transaction; - -import cn.nukkit.Player; -import cn.nukkit.event.inventory.EnchantItemEvent; -import cn.nukkit.inventory.EnchantInventory; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.inventory.transaction.action.EnchantingAction; -import cn.nukkit.inventory.transaction.action.InventoryAction; -import cn.nukkit.item.Item; -import cn.nukkit.network.protocol.types.NetworkInventoryAction; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class EnchantTransaction extends InventoryTransaction { - - private Item inputItem; - private Item outputItem; - private int cost = -1; - - public EnchantTransaction(Player source, List actions) { - super(source, actions); - } - - @Override - public boolean canExecute() { - Inventory inv = getSource().getWindowById(Player.ENCHANT_WINDOW_ID); - if (inv == null) return false; - EnchantInventory eInv = (EnchantInventory) inv; - if (!getSource().isCreative()) { - if (cost == -1 || !eInv.getReagentSlot().equals(Item.get(Item.DYE, 4), true, false) || eInv.getReagentSlot().count < cost) - return false; - } - return (inputItem != null && outputItem != null && inputItem.equals(eInv.getInputSlot(), true, true)); - } - - @Override - public boolean execute() { - // This will validate the enchant conditions - if (this.hasExecuted || !this.canExecute()) { - source.removeAllWindows(false); - this.sendInventories(); - return false; - } - EnchantInventory inv = (EnchantInventory) getSource().getWindowById(Player.ENCHANT_WINDOW_ID); - EnchantItemEvent ev = new EnchantItemEvent(inv, inputItem, outputItem, cost, source); - source.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - source.removeAllWindows(false); - this.sendInventories(); - // Cancelled by plugin, means handled OK - return true; - } - // This will process all the slot changes - for (InventoryAction a : this.actions) { - if (a.execute(source)) { - a.onExecuteSuccess(source); - } else { - a.onExecuteFail(source); - } - } - - if (!ev.getNewItem().equals(this.outputItem, true, true)) { - // Plugin changed item, so the previous slot change is going to be invalid - // Send the replaced item to the enchant inventory manually - inv.setItem(0, ev.getNewItem(), true); - } - - if (!source.isCreative()) { - source.setExperience(source.getExperience(), source.getExperienceLevel() - ev.getXpCost()); - } - return true; - } - - @Override - public void addAction(InventoryAction action) { - super.addAction(action); - if (action instanceof EnchantingAction) { - switch (((EnchantingAction) action).getType()) { - case NetworkInventoryAction.SOURCE_TYPE_ENCHANT_INPUT: - this.inputItem = action.getTargetItem(); // Input sent as newItem - break; - case NetworkInventoryAction.SOURCE_TYPE_ENCHANT_OUTPUT: - this.outputItem = action.getSourceItem(); // Output sent as oldItem - break; - case NetworkInventoryAction.SOURCE_TYPE_ENCHANT_MATERIAL: - if (action.getTargetItem().equals(Item.get(Item.AIR), false, false)) { - this.cost = action.getSourceItem().count; - } else { - this.cost = action.getSourceItem().count - action.getTargetItem().count; - } - break; - } - - } - } - - public boolean checkForEnchantPart(List actions) { - for (InventoryAction action : actions) { - if (action instanceof EnchantingAction) return true; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/InventoryTransaction.java b/src/main/java/cn/nukkit/inventory/transaction/InventoryTransaction.java deleted file mode 100644 index 0b9e85ec5..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/InventoryTransaction.java +++ /dev/null @@ -1,278 +0,0 @@ -package cn.nukkit.inventory.transaction; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.BlockID; -import cn.nukkit.event.inventory.InventoryClickEvent; -import cn.nukkit.event.inventory.InventoryTransactionEvent; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.inventory.PlayerInventory; -import cn.nukkit.inventory.ShulkerBoxInventory; -import cn.nukkit.inventory.transaction.action.InventoryAction; -import cn.nukkit.inventory.transaction.action.SlotChangeAction; -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.network.protocol.ProtocolInfo; - -import java.util.*; - -/** - * @author CreeperFace - */ -public class InventoryTransaction { - - private boolean invalid; - protected boolean hasExecuted; - - protected Player source; - - protected Set inventories = new HashSet<>(); - - protected List actions = new ArrayList<>(); - - public InventoryTransaction(Player source, List actions) { - this(source, actions, true); - } - - public InventoryTransaction(Player source, List actions, boolean init) { - if (init) { - init(source, actions); - } - } - - protected void init(Player source, List actions) { - //creationTime = System.currentTimeMillis(); - this.source = source; - - for (InventoryAction action : actions) { - this.addAction(action); - } - } - - public Player getSource() { - return source; - } - - public long getCreationTime() { - return 0; // unused - } - - public Set getInventories() { - return inventories; - } - - public List getActionList() { - return actions; - } - - public Set getActions() { - return new HashSet<>(actions); - } - - public void addAction(InventoryAction action) { - if (invalid) { - Server.getInstance().getLogger().debug("Failed to add InventoryAction for " + source.getName() + ": previous run was marked as invalid"); - return; - } - - if (action instanceof SlotChangeAction) { - SlotChangeAction slotChangeAction = (SlotChangeAction)action; - - Item targetItem = slotChangeAction.getTargetItem(); - Item sourceItem = slotChangeAction.getSourceItem(); - if (targetItem.getCount() > targetItem.getMaxStackSize() || sourceItem.getCount() > sourceItem.getMaxStackSize()) { - invalid = true; - return; - } - - ListIterator iterator = this.actions.listIterator(); - - while (iterator.hasNext()) { - InventoryAction existingAction = iterator.next(); - if (existingAction instanceof SlotChangeAction) { - if (slotChangeAction.getInventory() instanceof ShulkerBoxInventory && (targetItem.getId() == BlockID.SHULKER_BOX || targetItem.getId() == BlockID.UNDYED_SHULKER_BOX)) { - invalid = true; - return; - } - SlotChangeAction existingSlotChangeAction = (SlotChangeAction) existingAction; - if (!existingSlotChangeAction.getInventory().equals(slotChangeAction.getInventory())) - continue; - Item existingSource = existingSlotChangeAction.getSourceItem(); - Item existingTarget = existingSlotChangeAction.getTargetItem(); - if (existingSlotChangeAction.getSlot() == slotChangeAction.getSlot() && slotChangeAction.getSourceItem().equals(existingTarget, existingTarget.hasMeta(), existingTarget.hasCompoundTag())) { - iterator.set(new SlotChangeAction(existingSlotChangeAction.getInventory(), existingSlotChangeAction.getSlot(), existingSlotChangeAction.getSourceItem(), slotChangeAction.getTargetItem())); - action.onAddToTransaction(this); - return; - } else if (existingSlotChangeAction.getSlot() == slotChangeAction.getSlot() - && slotChangeAction.getSourceItem().equals(existingSource, existingSource.hasMeta(), existingSource.hasCompoundTag()) - && slotChangeAction.getTargetItem().equals(existingTarget, existingTarget.hasMeta(), existingTarget.hasCompoundTag())) { - existingSource.setCount(existingSource.getCount() + slotChangeAction.getSourceItem().getCount()); - existingTarget.setCount(existingTarget.getCount() + slotChangeAction.getTargetItem().getCount()); - iterator.set(new SlotChangeAction(existingSlotChangeAction.getInventory(), existingSlotChangeAction.getSlot(), existingSource, existingTarget)); - return; - } - } - } - } - - this.actions.add(action); - action.onAddToTransaction(this); - } - - /** - * This method should not be used by plugins, it's used to add tracked inventories for InventoryActions - * involving inventories. - * - * @param inventory to add - */ - public void addInventory(Inventory inventory) { - this.inventories.add(inventory); - } - - protected boolean matchItems(List needItems, List haveItems) { - for (InventoryAction action : this.actions) { - if (action.getTargetItem().getId() != Item.AIR) { - needItems.add(action.getTargetItem()); - } - - if (!action.isValid(this.source)) { - invalid = true; - return false; - } - - if (action.getSourceItem().getId() != Item.AIR) { - haveItems.add(action.getSourceItem()); - } - } - - for (Item needItem : new ArrayList<>(needItems)) { - for (Item haveItem : new ArrayList<>(haveItems)) { - if (needItem.equals(haveItem)) { - int amount = Math.min(haveItem.getCount(), needItem.getCount()); - needItem.setCount(needItem.getCount() - amount); - haveItem.setCount(haveItem.getCount() - amount); - if (haveItem.getCount() == 0) { - haveItems.remove(haveItem); - } - if (needItem.getCount() == 0) { - needItems.remove(needItem); - break; - } - } - } - } - - return haveItems.isEmpty() && needItems.isEmpty(); - } - - protected void sendInventories() { - if (this.getSource().protocol >= ProtocolInfo.v1_16_0) { - for (InventoryAction action : this.actions) { - if (action instanceof SlotChangeAction) { - SlotChangeAction sca = (SlotChangeAction) action; - sca.getInventory().sendSlot(sca.getSlot(), this.source); - } - } - } else { - for (Inventory inventory : this.inventories) { - inventory.sendContents(this.source); - if (inventory instanceof PlayerInventory) { - ((PlayerInventory) inventory).sendArmorContents(this.source); - } - } - } - } - - public boolean canExecute() { - List haveItems = new ArrayList<>(); - List needItems = new ArrayList<>(); - return matchItems(needItems, haveItems) && !this.actions.isEmpty() && haveItems.isEmpty() && needItems.isEmpty(); - } - - protected boolean callExecuteEvent() { - InventoryTransactionEvent ev = new InventoryTransactionEvent(this); - this.source.getServer().getPluginManager().callEvent(ev); - - SlotChangeAction from = null; - SlotChangeAction to = null; - Player who = null; - - for (InventoryAction action : this.actions) { - if (!(action instanceof SlotChangeAction)) { - continue; - } - SlotChangeAction slotChange = (SlotChangeAction) action; - - if (slotChange.getInventory().getHolder() instanceof Player) { - who = (Player) slotChange.getInventory().getHolder(); - } - - if (from == null) { - from = slotChange; - } else { - to = slotChange; - } - } - - if (who != null && to != null) { - if (from.getTargetItem().getCount() > from.getSourceItem().getCount()) { - from = to; - } - - InventoryClickEvent ev2 = new InventoryClickEvent(who, from.getInventory(), from.getSlot(), from.getSourceItem(), from.getTargetItem()); - this.source.getServer().getPluginManager().callEvent(ev2); - - if (ev2.isCancelled()) { - return false; - } - } - - return !ev.isCancelled(); - } - - public boolean execute() { - if (this.hasExecuted() || !this.canExecute()) { - this.sendInventories(); - return false; - } - - - if (!callExecuteEvent()) { - this.sendInventories(); - return true; - } - - for (InventoryAction action : this.actions) { - if (!action.onPreExecute(this.source)) { - this.sendInventories(); - return true; - } - if (action instanceof SlotChangeAction) { - if (!source.isCreative()) { - int slot = ((SlotChangeAction) action).getSlot(); - if (slot == 36 || slot == 37 || slot == 38 || slot == 39) { - if (action.getSourceItem().hasEnchantment(Enchantment.ID_BINDING_CURSE)) { - this.sendInventories(); - return false; - } - } - } - } - } - - for (InventoryAction action : this.actions) { - if (action.execute(this.source)) { - action.onExecuteSuccess(this.source); - } else { - action.onExecuteFail(this.source); - } - } - - this.hasExecuted = true; - return true; - } - - public boolean hasExecuted() { - return this.hasExecuted; - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/RepairItemTransaction.java b/src/main/java/cn/nukkit/inventory/transaction/RepairItemTransaction.java deleted file mode 100644 index 05a500eb5..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/RepairItemTransaction.java +++ /dev/null @@ -1,396 +0,0 @@ -package cn.nukkit.inventory.transaction; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.block.AnvilDamageEvent; -import cn.nukkit.event.block.AnvilDamageEvent.DamageCause; -import cn.nukkit.event.inventory.RepairItemEvent; -import cn.nukkit.inventory.AnvilInventory; -import cn.nukkit.inventory.FakeBlockMenu; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.inventory.transaction.action.RepairItemAction; -import cn.nukkit.inventory.transaction.action.InventoryAction; -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.network.protocol.types.NetworkInventoryAction; -import it.unimi.dsi.fastutil.ints.Int2IntMap; -import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; - -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -public class RepairItemTransaction extends InventoryTransaction { - - private Item inputItem; - private Item materialItem; - private Item outputItem; - - private int cost; - - public RepairItemTransaction(Player source, List actions) { - super(source, actions); - } - - @Override - public boolean canExecute() { - Inventory inventory = getSource().getWindowById(Player.ANVIL_WINDOW_ID); - if (inventory == null) { - return false; - } - AnvilInventory anvilInventory = (AnvilInventory) inventory; - return this.inputItem != null && this.outputItem != null && this.inputItem.equals(anvilInventory.getInputSlot(), true, true) - && (!this.hasMaterial() || this.materialItem.equals(anvilInventory.getMaterialSlot(), true, true)) - && this.checkRecipeValid(); - } - - @Override - public boolean execute() { - if (this.hasExecuted() || !this.canExecute()) { - this.source.removeAllWindows(false); - this.sendInventories(); - return false; - } - AnvilInventory inventory = (AnvilInventory) getSource().getWindowById(Player.ANVIL_WINDOW_ID); - - if (inventory.getCost() != this.cost && !this.source.isCreative()) { - this.source.getServer().getLogger().debug("Got unexpected cost " + inventory.getCost() + " from " + this.source.getName() + "(expected " + this.cost + ')'); - } - - RepairItemEvent event = new RepairItemEvent(inventory, this.inputItem, this.outputItem, this.materialItem, this.cost, this.source); - this.source.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.source.removeAllWindows(false); - this.sendInventories(); - return true; - } - - for (InventoryAction action : this.actions) { - if (action.execute(this.source)) { - action.onExecuteSuccess(this.source); - } else { - action.onExecuteFail(this.source); - } - } - - FakeBlockMenu holder = inventory.getHolder(); - Block block = this.source.level.getBlock(holder.getFloorX(), holder.getFloorY(), holder.getFloorZ()); - if (block.getId() == Block.ANVIL) { - int oldDamage = block.getDamage() >= 8 ? 2 : block.getDamage() >= 4 ? 1 : 0; - int newDamage = !this.source.isCreative() && ThreadLocalRandom.current().nextInt(100) < 12 ? oldDamage + 1 : oldDamage; - - AnvilDamageEvent ev = new AnvilDamageEvent(block, oldDamage, newDamage, DamageCause.USE, this.source); - ev.setCancelled(oldDamage == newDamage); - this.source.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - newDamage = ev.getNewDamage(); - if (newDamage > 2) { - this.source.level.setBlock(block, Block.get(Block.AIR), true); - this.source.level.addLevelEvent(block, LevelEventPacket.EVENT_SOUND_ANVIL_BREAK); - } else { - if (newDamage < 0) { - newDamage = 0; - } - if (newDamage != oldDamage) { - block.setDamage((newDamage << 2) | (block.getDamage() & 0x3)); - this.source.level.setBlock(block, block, true); - } - this.source.level.addLevelEvent(block, LevelEventPacket.EVENT_SOUND_ANVIL_USE); - } - } else { - this.source.level.addLevelEvent(block, LevelEventPacket.EVENT_SOUND_ANVIL_USE); - } - } - - if (!this.source.isCreative()) { - this.source.setExperience(this.source.getExperience(), this.source.getExperienceLevel() - event.getCost()); - } - return true; - } - - @Override - public void addAction(InventoryAction action) { - super.addAction(action); - if (action instanceof RepairItemAction) { - switch (((RepairItemAction) action).getType()) { - case NetworkInventoryAction.SOURCE_TYPE_ANVIL_INPUT: - this.inputItem = action.getTargetItem(); - break; - case NetworkInventoryAction.SOURCE_TYPE_ANVIL_RESULT: - this.outputItem = action.getSourceItem(); - break; - case NetworkInventoryAction.SOURCE_TYPE_ANVIL_MATERIAL: - this.materialItem = action.getTargetItem(); - break; - } - } - } - - private boolean checkRecipeValid() { - int cost = 0; - int baseRepairCost = this.inputItem.getRepairCost(); - - if (this.isMapRecipe()) { - if (!this.matchMapRecipe()) { - return false; - } - baseRepairCost = 0; - } else if (this.hasMaterial()) { - baseRepairCost += this.materialItem.getRepairCost(); - - if (this.inputItem.getMaxDurability() != -1 && this.matchRepairItem()) { - int maxRepairDamage = this.inputItem.getMaxDurability() / 4; - int repairDamage = Math.min(this.inputItem.getDamage(), maxRepairDamage); - if (repairDamage <= 0) { - return false; - } - - int damage = this.inputItem.getDamage(); - for (; repairDamage > 0 && cost < this.materialItem.getCount(); cost++) { - damage = damage - repairDamage; - repairDamage = Math.min(damage, maxRepairDamage); - } - if (this.outputItem.getDamage() != damage) { - return false; - } - } else { - boolean consumeEnchantedBook = this.materialItem.getId() == Item.ENCHANTED_BOOK && this.materialItem.hasEnchantments(); - if (!consumeEnchantedBook && (this.inputItem.getMaxDurability() == -1 || this.inputItem.getId() != this.materialItem.getId())) { - return false; - } - - if (!consumeEnchantedBook && this.inputItem.getMaxDurability() != -1) { - int damage = this.inputItem.getDamage() - this.inputItem.getMaxDurability() + this.materialItem.getDamage() - this.inputItem.getMaxDurability() * 12 / 100 + 1; - if (damage < 0) { - damage = 0; - } - - if (damage < this.inputItem.getDamage()) { - if (this.outputItem.getDamage() != damage) { - return false; - } - cost += 2; - } - } - - Int2IntMap enchantments = new Int2IntOpenHashMap(); - enchantments.defaultReturnValue(-1); - for (Enchantment enchantment : this.inputItem.getEnchantments()) { - enchantments.put(enchantment.getId(), enchantment.getLevel()); - } - - boolean hasCompatibleEnchantments = false; - boolean hasIncompatibleEnchantments = false; - for (Enchantment materialEnchantment : this.materialItem.getEnchantments()) { - Enchantment enchantment = this.inputItem.getEnchantment(materialEnchantment.getId()); - int inputLevel = enchantment != null ? enchantment.getLevel() : 0; - int materialLevel = materialEnchantment.getLevel(); - int outputLevel = inputLevel == materialLevel ? materialLevel + 1 : Math.max(materialLevel, inputLevel); - - boolean canEnchant = materialEnchantment.canEnchant(this.inputItem) || this.inputItem.getId() == Item.ENCHANTED_BOOK; - for (Enchantment inputEnchantment : this.inputItem.getEnchantments()) { - if (inputEnchantment.getId() != materialEnchantment.getId() && !materialEnchantment.isCompatibleWith(inputEnchantment)) { - canEnchant = false; - cost++; - } - } - - if (!canEnchant) { - hasIncompatibleEnchantments = true; - } else { - hasCompatibleEnchantments = true; - if (outputLevel > materialEnchantment.getMaxLevel()) { - outputLevel = materialEnchantment.getMaxLevel(); - } - - enchantments.put(materialEnchantment.getId(), outputLevel); - int rarityFactor; - switch (materialEnchantment.getRarity()) { - case COMMON: - rarityFactor = 1; - break; - case UNCOMMON: - rarityFactor = 2; - break; - case RARE: - rarityFactor = 4; - break; - case VERY_RARE: - default: - rarityFactor = 8; - break; - } - - if (consumeEnchantedBook) { - rarityFactor = Math.max(1, rarityFactor / 2); - } - - cost += rarityFactor * Math.max(0, outputLevel - inputLevel); - if (this.inputItem.getCount() > 1) { - cost = 40; - } - } - } - - Enchantment[] outputEnchantments = this.outputItem.getEnchantments(); - if (hasIncompatibleEnchantments && !hasCompatibleEnchantments || enchantments.size() != outputEnchantments.length) { - return false; - } - - for (Enchantment enchantment : outputEnchantments) { - if (enchantments.get(enchantment.getId()) != enchantment.getLevel()) { - return false; - } - } - } - } - - int renameCost = 0; - if (!this.inputItem.getCustomName().equals(this.outputItem.getCustomName())) { - if (this.outputItem.getCustomName().length() > 30) { - return false; - } - renameCost = 1; - cost += renameCost; - } - - this.cost = baseRepairCost + cost; - if (renameCost == cost && renameCost > 0 && this.cost >= 40) { - this.cost = 39; - } - if (baseRepairCost < 0 || cost < 0 || cost == 0 && !this.isMapRecipe() || this.cost > 39 && !this.source.isCreative()) { - return false; - } - - int nextBaseRepairCost = this.inputItem.getRepairCost(); - if (!this.isMapRecipe()) { - if (this.hasMaterial() && nextBaseRepairCost < this.materialItem.getRepairCost()) { - nextBaseRepairCost = this.materialItem.getRepairCost(); - } - if (renameCost == 0 || renameCost != cost) { - nextBaseRepairCost = 2 * nextBaseRepairCost + 1; - } - } - if (this.outputItem.getRepairCost() != nextBaseRepairCost) { - this.source.getServer().getLogger().debug("Got unexpected base cost " + this.outputItem.getRepairCost() + " from " + this.source.getName() + "(expected " + nextBaseRepairCost + ')'); - return false; - } - - return true; - } - - private boolean hasMaterial() { - return this.materialItem != null && !this.materialItem.isNull(); - } - - private boolean isMapRecipe() { - return this.hasMaterial() && (this.inputItem.getId() == Item.MAP || this.inputItem.getId() == Item.EMPTY_MAP) - && (this.materialItem.getId() == Item.EMPTY_MAP || this.materialItem.getId() == Item.PAPER || this.materialItem.getId() == Item.COMPASS); - } - - private boolean matchMapRecipe() { - if (this.inputItem.getId() == Item.EMPTY_MAP) { - return this.inputItem.getDamage() != 2 && this.materialItem.getId() == Item.COMPASS // locator - && this.outputItem.getId() == Item.EMPTY_MAP && this.outputItem.getDamage() == 2 && this.outputItem.getCount() == 1; - } else if (this.inputItem.getId() == Item.MAP && this.outputItem.getDamage() == this.inputItem.getDamage()) { - if (this.materialItem.getId() == Item.COMPASS) { // locator - return this.inputItem.getDamage() != 2 && this.outputItem.getId() == Item.MAP && this.outputItem.getCount() == 1; - } else if (this.materialItem.getId() == Item.EMPTY_MAP) { // clone - return this.outputItem.getId() == Item.MAP && this.outputItem.getCount() == 2; - } else if (this.materialItem.getId() == Item.PAPER && this.materialItem.getCount() >= 8) { // zoom out - return this.inputItem.getDamage() < 3 && this.outputItem.getId() == Item.MAP && this.outputItem.getCount() == 1; - } - } - return false; - } - - private boolean matchRepairItem() { - switch (this.inputItem.getId()) { - case Item.LEATHER_CAP: - case Item.LEATHER_TUNIC: - case Item.LEATHER_PANTS: - case Item.LEATHER_BOOTS: - return this.materialItem.getId() == Item.LEATHER; - case Item.WOODEN_SWORD: - case Item.WOODEN_PICKAXE: - case Item.WOODEN_SHOVEL: - case Item.WOODEN_AXE: - case Item.WOODEN_HOE: - return this.materialItem.getId() == Item.PLANKS; - case Item.IRON_SWORD: - case Item.IRON_PICKAXE: - case Item.IRON_SHOVEL: - case Item.IRON_AXE: - case Item.IRON_HOE: - case Item.IRON_HELMET: - case Item.IRON_CHESTPLATE: - case Item.IRON_LEGGINGS: - case Item.IRON_BOOTS: - case Item.CHAIN_HELMET: - case Item.CHAIN_CHESTPLATE: - case Item.CHAIN_LEGGINGS: - case Item.CHAIN_BOOTS: - return this.materialItem.getId() == Item.IRON_INGOT; - case Item.GOLD_SWORD: - case Item.GOLD_PICKAXE: - case Item.GOLD_SHOVEL: - case Item.GOLD_AXE: - case Item.GOLD_HOE: - case Item.GOLD_HELMET: - case Item.GOLD_CHESTPLATE: - case Item.GOLD_LEGGINGS: - case Item.GOLD_BOOTS: - return this.materialItem.getId() == Item.GOLD_INGOT; - case Item.DIAMOND_SWORD: - case Item.DIAMOND_PICKAXE: - case Item.DIAMOND_SHOVEL: - case Item.DIAMOND_AXE: - case Item.DIAMOND_HOE: - case Item.DIAMOND_HELMET: - case Item.DIAMOND_CHESTPLATE: - case Item.DIAMOND_LEGGINGS: - case Item.DIAMOND_BOOTS: - return this.materialItem.getId() == Item.DIAMOND; - case Item.NETHERITE_SWORD: - case Item.NETHERITE_PICKAXE: - case Item.NETHERITE_SHOVEL: - case Item.NETHERITE_AXE: - case Item.NETHERITE_HOE: - case Item.NETHERITE_HELMET: - case Item.NETHERITE_CHESTPLATE: - case Item.NETHERITE_LEGGINGS: - case Item.NETHERITE_BOOTS: - return this.materialItem.getId() == Item.NETHERITE_INGOT; - case Item.TURTLE_SHELL: - return this.materialItem.getId() == Item.SCUTE; - case Item.ELYTRA: - return this.materialItem.getId() == Item.PHANTOM_MEMBRANE; - } - return false; - } - - public Item getInputItem() { - return this.inputItem; - } - - public Item getMaterialItem() { - return this.materialItem; - } - - public Item getOutputItem() { - return this.outputItem; - } - - public int getCost() { - return this.cost; - } - - public static boolean checkForRepairItemPart(List actions) { - for (InventoryAction action : actions) { - if (action instanceof RepairItemAction) { - return true; - } - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/action/CraftingTakeResultAction.java b/src/main/java/cn/nukkit/inventory/transaction/action/CraftingTakeResultAction.java deleted file mode 100644 index b1484827c..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/action/CraftingTakeResultAction.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.inventory.transaction.action; - -import cn.nukkit.Player; -import cn.nukkit.inventory.transaction.CraftingTransaction; -import cn.nukkit.inventory.transaction.InventoryTransaction; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - */ -public class CraftingTakeResultAction extends InventoryAction { - - public CraftingTakeResultAction(Item sourceItem, Item targetItem) { - super(sourceItem, targetItem); - } - - public void onAddToTransaction(InventoryTransaction transaction) { - if (transaction instanceof CraftingTransaction) { - ((CraftingTransaction) transaction).setPrimaryOutput(this.getSourceItem()); - } else { - throw new RuntimeException(getClass().getName() + " can only be added to CraftingTransactions"); - } - } - - @Override - public boolean isValid(Player source) { - return true; - } - - @Override - public boolean execute(Player source) { - return true; - } - - @Override - public void onExecuteSuccess(Player $source) { - } - - @Override - public void onExecuteFail(Player source) { - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/action/CraftingTransferMaterialAction.java b/src/main/java/cn/nukkit/inventory/transaction/action/CraftingTransferMaterialAction.java deleted file mode 100644 index 46fc91701..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/action/CraftingTransferMaterialAction.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.inventory.transaction.action; - -import cn.nukkit.Player; -import cn.nukkit.inventory.transaction.CraftingTransaction; -import cn.nukkit.inventory.transaction.InventoryTransaction; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - */ -public class CraftingTransferMaterialAction extends InventoryAction { - - //private int slot; - - public CraftingTransferMaterialAction(Item sourceItem, Item targetItem, int slot) { - super(sourceItem, targetItem); - - //this.slot = slot; - } - - @Override - public void onAddToTransaction(InventoryTransaction transaction) { - if (transaction instanceof CraftingTransaction) { - if (this.sourceItem.isNull()) { - ((CraftingTransaction) transaction).setInput(this.targetItem); - } else if (this.targetItem.isNull()) { - ((CraftingTransaction) transaction).setExtraOutput(this.sourceItem); - } else { - throw new RuntimeException("Invalid " + getClass().getName() + ", either source or target item must be air, got source: " + this.sourceItem + ", target: " + this.targetItem); - } - } else { - throw new RuntimeException(getClass().getName() + " can only be added to CraftingTransactions"); - } - } - - @Override - public boolean isValid(Player source) { - return true; - } - - @Override - public boolean execute(Player source) { - return true; - } - - @Override - public void onExecuteSuccess(Player $source) { - } - - @Override - public void onExecuteFail(Player source) { - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/action/CreativeInventoryAction.java b/src/main/java/cn/nukkit/inventory/transaction/action/CreativeInventoryAction.java deleted file mode 100644 index 804923111..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/action/CreativeInventoryAction.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.inventory.transaction.action; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - */ -public class CreativeInventoryAction extends InventoryAction { - /** - * Player put an item into the creative window to destroy it. - */ - public static final int TYPE_DELETE_ITEM = 0; - /** - * Player took an item from the creative window. - */ - public static final int TYPE_CREATE_ITEM = 1; - - protected int actionType; - - public CreativeInventoryAction(Item source, Item target, int action) { - super(source, target); - } - - /** - * Checks that the player is in creative, and (if creating an item) that the item exists in the creative inventory. - * - * @param source player - * @return valid - */ - public boolean isValid(Player source) { - return source.isCreative() && - (this.actionType == TYPE_DELETE_ITEM || Item.getCreativeItemIndex(this.sourceItem) != -1); - } - - /** - * Returns the type of the action. - * - * @return action type - */ - public int getActionType() { - return actionType; - } - - /** - * No need to do anything extra here: this type just provides a place for items to disappear or appear from. - * - * @param source playere - * @return successfully executed - */ - public boolean execute(Player source) { - return true; - } - - public void onExecuteSuccess(Player source) { - } - - public void onExecuteFail(Player source) { - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/action/DropItemAction.java b/src/main/java/cn/nukkit/inventory/transaction/action/DropItemAction.java deleted file mode 100644 index 3dbe469fd..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/action/DropItemAction.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.inventory.transaction.action; - -import cn.nukkit.Player; -import cn.nukkit.event.player.PlayerDropItemEvent; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - */ -public class DropItemAction extends InventoryAction { - - public DropItemAction(Item source, Item target) { - super(source, target); - } - - /** - * Verifies that the source item of a drop-item action must be air. This is not strictly necessary, just a sanity - * check. - */ - public boolean isValid(Player source) { - return this.sourceItem.isNull(); - } - - @Override - public boolean onPreExecute(Player source) { - PlayerDropItemEvent ev; - source.getServer().getPluginManager().callEvent(ev = new PlayerDropItemEvent(source, this.targetItem)); - return !ev.isCancelled(); - } - - /** - * Drops the target item in front of the player. - */ - public boolean execute(Player source) { - return source.dropItem(this.targetItem); - } - - public void onExecuteSuccess(Player source) { - } - - public void onExecuteFail(Player source) { - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/action/EnchantingAction.java b/src/main/java/cn/nukkit/inventory/transaction/action/EnchantingAction.java deleted file mode 100644 index b41cfb7f4..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/action/EnchantingAction.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.inventory.transaction.action; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; -import lombok.Getter; - -public class EnchantingAction extends InventoryAction { - - @Getter - private int type; - - public EnchantingAction(Item source, Item target, int type) { - super(source, target); - this.type = type; - } - - @Override - public boolean isValid(Player source) { - return source.getWindowById(Player.ENCHANT_WINDOW_ID) != null; - } - - @Override - public boolean execute(Player source) { - return true; - } - - @Override - public void onExecuteSuccess(Player source) { - } - - @Override - public void onExecuteFail(Player source) { - - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/action/InventoryAction.java b/src/main/java/cn/nukkit/inventory/transaction/action/InventoryAction.java deleted file mode 100644 index 0b76063df..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/action/InventoryAction.java +++ /dev/null @@ -1,97 +0,0 @@ -package cn.nukkit.inventory.transaction.action; - -import cn.nukkit.Player; -import cn.nukkit.inventory.transaction.InventoryTransaction; -import cn.nukkit.item.Item; - -/** - * @author CreeperFace - */ -public abstract class InventoryAction { - - //private long creationTime; - - protected Item sourceItem; - - protected Item targetItem; - - public InventoryAction(Item sourceItem, Item targetItem) { - this.sourceItem = sourceItem; - this.targetItem = targetItem; - - //this.creationTime = System.currentTimeMillis(); - } - - public long getCreationTime() { - return 0; //creationTime; - } - - /** - * Returns the item that was present before the action took place. - * - * @return source item - */ - public Item getSourceItem() { - return sourceItem.clone(); - } - - /** - * Returns the item that the action attempted to replace the source item with. - * - * @return target item - */ - public Item getTargetItem() { - return targetItem.clone(); - } - - /** - * Called by inventory transactions before any actions are processed. If this returns false, the transaction will - * be cancelled. - * - * @param source player - * @return cancelled - */ - public boolean onPreExecute(Player source) { - return true; - } - - /** - * Returns whether this action is currently valid. This should perform any necessary sanity checks. - * - * @param source player - * @return valid - */ - abstract public boolean isValid(Player source); - - /** - * Called when the action is added to the specified InventoryTransaction. - * - * @param transaction to add - */ - public void onAddToTransaction(InventoryTransaction transaction) { - } - - /** - * Performs actions needed to complete the inventory-action server-side. Returns if it was successful. Will return - * false if plugins cancelled events. This will only be called if the transaction which it is part of is considered - * valid. - * - * @param source player - * @return successfully executed - */ - abstract public boolean execute(Player source); - - /** - * Performs additional actions when this inventory-action completed successfully. - * - * @param source player - */ - abstract public void onExecuteSuccess(Player source); - - /** - * Performs additional actions when this inventory-action did not complete successfully. - * - * @param source player - */ - abstract public void onExecuteFail(Player source); -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/action/RepairItemAction.java b/src/main/java/cn/nukkit/inventory/transaction/action/RepairItemAction.java deleted file mode 100644 index b126b2b25..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/action/RepairItemAction.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.inventory.transaction.action; - -import cn.nukkit.Player; -import cn.nukkit.item.Item; - -public class RepairItemAction extends InventoryAction { - - private int type; - - public RepairItemAction(Item sourceItem, Item targetItem, int type) { - super(sourceItem, targetItem); - this.type = type; - } - - @Override - public boolean isValid(Player source) { - return source.getWindowById(Player.ANVIL_WINDOW_ID) != null; - } - - @Override - public boolean execute(Player source) { - return true; - } - - @Override - public void onExecuteSuccess(Player source) { - - } - - @Override - public void onExecuteFail(Player source) { - - } - - public int getType() { - return this.type; - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/action/SlotChangeAction.java b/src/main/java/cn/nukkit/inventory/transaction/action/SlotChangeAction.java deleted file mode 100644 index feb0d873c..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/action/SlotChangeAction.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.nukkit.inventory.transaction.action; - -import cn.nukkit.Player; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.inventory.transaction.InventoryTransaction; -import cn.nukkit.item.Item; - -import java.util.HashSet; -import java.util.Set; - -/** - * @author CreeperFace - */ -public class SlotChangeAction extends InventoryAction { - - protected Inventory inventory; - private final int inventorySlot; - - public SlotChangeAction(Inventory inventory, int inventorySlot, Item sourceItem, Item targetItem) { - super(sourceItem, targetItem); - this.inventory = inventory; - this.inventorySlot = inventorySlot; - } - - /** - * Returns the inventory involved in this action. - * - * @return inventory - */ - public Inventory getInventory() { - return this.inventory; - } - - /** - * Returns the inventorySlot in the inventory which this action modified. - * - * @return slot - */ - public int getSlot() { - return inventorySlot; - } - - /** - * Checks if the item in the inventory at the specified inventorySlot is the same as this action's source item. - * - * @param source player - * @return valid - */ - public boolean isValid(Player source) { - Item check = inventory.getItem(this.inventorySlot); - - return check.equalsExact(this.sourceItem); - } - - /** - * Sets the item into the target inventory. - * - * @param source player - * @return successfully executed - */ - public boolean execute(Player source) { - return this.inventory.setItem(this.inventorySlot, this.targetItem, false); - } - - /** - * Sends inventorySlot changes to other viewers of the inventory. This will not send any change back to the source Player. - * - * @param source player - */ - public void onExecuteSuccess(Player source) { - Set viewers = new HashSet<>(this.inventory.getViewers()); - viewers.remove(source); - - this.inventory.sendSlot(this.inventorySlot, viewers); - } - - /** - * Sends the original inventorySlot contents to the source player to revert the action. - * - * @param source player - */ - public void onExecuteFail(Player source) { - this.inventory.sendSlot(this.inventorySlot, source); - } - - @Override - public void onAddToTransaction(InventoryTransaction transaction) { - transaction.addInventory(this.inventory); - } -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/data/ReleaseItemData.java b/src/main/java/cn/nukkit/inventory/transaction/data/ReleaseItemData.java deleted file mode 100644 index 9ad8db103..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/data/ReleaseItemData.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.inventory.transaction.data; - -import cn.nukkit.item.Item; -import cn.nukkit.math.Vector3; - -/** - * @author CreeperFace - */ -public class ReleaseItemData implements TransactionData { - - public int actionType; - public int hotbarSlot; - public Item itemInHand; - public Vector3 headRot; -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/data/TransactionData.java b/src/main/java/cn/nukkit/inventory/transaction/data/TransactionData.java deleted file mode 100644 index f594453b9..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/data/TransactionData.java +++ /dev/null @@ -1,7 +0,0 @@ -package cn.nukkit.inventory.transaction.data; - -/** - * @author CreeperFace - */ -public interface TransactionData { -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/data/UseItemData.java b/src/main/java/cn/nukkit/inventory/transaction/data/UseItemData.java deleted file mode 100644 index 6355b055f..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/data/UseItemData.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.inventory.transaction.data; - -import cn.nukkit.item.Item; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.math.Vector3; -import cn.nukkit.math.Vector3f; - -/** - * @author CreeperFace - */ -public class UseItemData implements TransactionData { - - public int actionType; - public BlockVector3 blockPos; - public BlockFace face; - public int hotbarSlot; - public Item itemInHand; - public Vector3 playerPos; - public Vector3f clickPos; - public int blockRuntimeId; -} diff --git a/src/main/java/cn/nukkit/inventory/transaction/data/UseItemOnEntityData.java b/src/main/java/cn/nukkit/inventory/transaction/data/UseItemOnEntityData.java deleted file mode 100644 index ff959c679..000000000 --- a/src/main/java/cn/nukkit/inventory/transaction/data/UseItemOnEntityData.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.inventory.transaction.data; - -import cn.nukkit.item.Item; -import cn.nukkit.math.Vector3; - -/** - * @author CreeperFace - */ -public class UseItemOnEntityData implements TransactionData { - - public long entityRuntimeId; - public int actionType; - public int hotbarSlot; - public Item itemInHand; - public Vector3 playerPos; - public Vector3 clickPos; -} diff --git a/src/main/java/cn/nukkit/item/Item.java b/src/main/java/cn/nukkit/item/Item.java deleted file mode 100644 index 8c7ffae86..000000000 --- a/src/main/java/cn/nukkit/item/Item.java +++ /dev/null @@ -1,1358 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.entity.Entity; -import cn.nukkit.inventory.Fuel; -import cn.nukkit.item.RuntimeItemMapping.RuntimeEntry; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.*; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.Binary; -import cn.nukkit.utils.Config; -import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.Utils; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.regex.Pattern; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Item implements Cloneable, BlockID, ItemID, ProtocolInfo { - - protected static final String UNKNOWN_STR = "Unknown"; - public static Class[] list = null; - - protected Block block = null; - protected final int id; - protected int meta; - protected boolean hasMeta = true; - private byte[] tags = new byte[0]; - private CompoundTag cachedNBT = null; - public int count; - protected String name; - - public Item(int id) { - this(id, 0, 1, UNKNOWN_STR); - } - - public Item(int id, Integer meta) { - this(id, meta, 1, UNKNOWN_STR); - } - - public Item(int id, Integer meta, int count) { - this(id, meta, count, UNKNOWN_STR); - } - - public Item(int id, Integer meta, int count, String name) { - this.id = id & 0xffff; - if (meta != null && meta >= 0) { - this.meta = meta & 0xffff; - } else { - this.hasMeta = false; - } - this.count = count; - this.name = name; - } - - public boolean hasMeta() { - return hasMeta; - } - - public boolean canBeActivated() { - return false; - } - - public static void init() { - if (list == null) { - list = new Class[65535]; - list[LADDER] = ItemLadder.class; //65 - list[RAIL] = ItemRail.class; //66 - list[CACTUS] = ItemCactus.class; //81 - list[IRON_SHOVEL] = ItemShovelIron.class; //256 - list[IRON_PICKAXE] = ItemPickaxeIron.class; //257 - list[IRON_AXE] = ItemAxeIron.class; //258 - list[FLINT_AND_STEEL] = ItemFlintSteel.class; //259 - list[APPLE] = ItemApple.class; //260 - list[BOW] = ItemBow.class; //261 - list[ARROW] = ItemArrow.class; //262 - list[COAL] = ItemCoal.class; //263 - list[DIAMOND] = ItemDiamond.class; //264 - list[IRON_INGOT] = ItemIngotIron.class; //265 - list[GOLD_INGOT] = ItemIngotGold.class; //266 - list[IRON_SWORD] = ItemSwordIron.class; //267 - list[WOODEN_SWORD] = ItemSwordWood.class; //268 - list[WOODEN_SHOVEL] = ItemShovelWood.class; //269 - list[WOODEN_PICKAXE] = ItemPickaxeWood.class; //270 - list[WOODEN_AXE] = ItemAxeWood.class; //271 - list[STONE_SWORD] = ItemSwordStone.class; //272 - list[STONE_SHOVEL] = ItemShovelStone.class; //273 - list[STONE_PICKAXE] = ItemPickaxeStone.class; //274 - list[STONE_AXE] = ItemAxeStone.class; //275 - list[DIAMOND_SWORD] = ItemSwordDiamond.class; //276 - list[DIAMOND_SHOVEL] = ItemShovelDiamond.class; //277 - list[DIAMOND_PICKAXE] = ItemPickaxeDiamond.class; //278 - list[DIAMOND_AXE] = ItemAxeDiamond.class; //279 - list[STICK] = ItemStick.class; //280 - list[BOWL] = ItemBowl.class; //281 - list[MUSHROOM_STEW] = ItemMushroomStew.class; //282 - list[GOLD_SWORD] = ItemSwordGold.class; //283 - list[GOLD_SHOVEL] = ItemShovelGold.class; //284 - list[GOLD_PICKAXE] = ItemPickaxeGold.class; //285 - list[GOLD_AXE] = ItemAxeGold.class; //286 - list[STRING] = ItemString.class; //287 - list[FEATHER] = ItemFeather.class; //288 - list[GUNPOWDER] = ItemGunpowder.class; //289 - list[WOODEN_HOE] = ItemHoeWood.class; //290 - list[STONE_HOE] = ItemHoeStone.class; //291 - list[IRON_HOE] = ItemHoeIron.class; //292 - list[DIAMOND_HOE] = ItemHoeDiamond.class; //293 - list[GOLD_HOE] = ItemHoeGold.class; //294 - list[WHEAT_SEEDS] = ItemSeedsWheat.class; //295 - list[WHEAT] = ItemWheat.class; //296 - list[BREAD] = ItemBread.class; //297 - list[LEATHER_CAP] = ItemHelmetLeather.class; //298 - list[LEATHER_TUNIC] = ItemChestplateLeather.class; //299 - list[LEATHER_PANTS] = ItemLeggingsLeather.class; //300 - list[LEATHER_BOOTS] = ItemBootsLeather.class; //301 - list[CHAIN_HELMET] = ItemHelmetChain.class; //302 - list[CHAIN_CHESTPLATE] = ItemChestplateChain.class; //303 - list[CHAIN_LEGGINGS] = ItemLeggingsChain.class; //304 - list[CHAIN_BOOTS] = ItemBootsChain.class; //305 - list[IRON_HELMET] = ItemHelmetIron.class; //306 - list[IRON_CHESTPLATE] = ItemChestplateIron.class; //307 - list[IRON_LEGGINGS] = ItemLeggingsIron.class; //308 - list[IRON_BOOTS] = ItemBootsIron.class; //309 - list[DIAMOND_HELMET] = ItemHelmetDiamond.class; //310 - list[DIAMOND_CHESTPLATE] = ItemChestplateDiamond.class; //311 - list[DIAMOND_LEGGINGS] = ItemLeggingsDiamond.class; //312 - list[DIAMOND_BOOTS] = ItemBootsDiamond.class; //313 - list[GOLD_HELMET] = ItemHelmetGold.class; //314 - list[GOLD_CHESTPLATE] = ItemChestplateGold.class; //315 - list[GOLD_LEGGINGS] = ItemLeggingsGold.class; //316 - list[GOLD_BOOTS] = ItemBootsGold.class; //317 - list[FLINT] = ItemFlint.class; //318 - list[RAW_PORKCHOP] = ItemPorkchopRaw.class; //319 - list[COOKED_PORKCHOP] = ItemPorkchopCooked.class; //320 - list[PAINTING] = ItemPainting.class; //321 - list[GOLDEN_APPLE] = ItemAppleGold.class; //322 - list[SIGN] = ItemSign.class; //323 - list[WOODEN_DOOR] = ItemDoorWood.class; //324 - list[BUCKET] = ItemBucket.class; //325 - list[MINECART] = ItemMinecart.class; //328 - list[SADDLE] = ItemSaddle.class; //329 - list[IRON_DOOR] = ItemDoorIron.class; //330 - list[REDSTONE] = ItemRedstone.class; //331 - list[SNOWBALL] = ItemSnowball.class; //332 - list[BOAT] = ItemBoat.class; //333 - list[LEATHER] = ItemLeather.class; //334 - list[BRICK] = ItemBrick.class; //336 - list[CLAY] = ItemClay.class; //337 - list[SUGARCANE] = ItemSugarcane.class; //338 - list[PAPER] = ItemPaper.class; //339 - list[BOOK] = ItemBook.class; //340 - list[SLIMEBALL] = ItemSlimeball.class; //341 - list[MINECART_WITH_CHEST] = ItemMinecartChest.class; //342 - list[EGG] = ItemEgg.class; //344 - list[COMPASS] = ItemCompass.class; //345 - list[FISHING_ROD] = ItemFishingRod.class; //346 - list[CLOCK] = ItemClock.class; //347 - list[GLOWSTONE_DUST] = ItemGlowstoneDust.class; //348 - list[RAW_FISH] = ItemFish.class; //349 - list[COOKED_FISH] = ItemFishCooked.class; //350 - list[DYE] = ItemDye.class; //351 - list[BONE] = ItemBone.class; //352 - list[SUGAR] = ItemSugar.class; //353 - list[CAKE] = ItemCake.class; //354 - list[BED] = ItemBed.class; //355 - list[REPEATER] = ItemRedstoneRepeater.class; //356 - list[COOKIE] = ItemCookie.class; //357 - list[MAP] = ItemMap.class; //358 - list[SHEARS] = ItemShears.class; //359 - list[MELON] = ItemMelon.class; //360 - list[PUMPKIN_SEEDS] = ItemSeedsPumpkin.class; //361 - list[MELON_SEEDS] = ItemSeedsMelon.class; //362 - list[RAW_BEEF] = ItemBeefRaw.class; //363 - list[STEAK] = ItemSteak.class; //364 - list[RAW_CHICKEN] = ItemChickenRaw.class; //365 - list[COOKED_CHICKEN] = ItemChickenCooked.class; //366 - list[ROTTEN_FLESH] = ItemRottenFlesh.class; //367 - list[ENDER_PEARL] = ItemEnderPearl.class; //368 - list[BLAZE_ROD] = ItemBlazeRod.class; //369 - list[GHAST_TEAR] = ItemGhastTear.class; //370 - list[GOLD_NUGGET] = ItemNuggetGold.class; //371 - list[NETHER_WART] = ItemNetherWart.class; //372 - list[POTION] = ItemPotion.class; //373 - list[GLASS_BOTTLE] = ItemGlassBottle.class; //374 - list[SPIDER_EYE] = ItemSpiderEye.class; //375 - list[FERMENTED_SPIDER_EYE] = ItemSpiderEyeFermented.class; //376 - list[BLAZE_POWDER] = ItemBlazePowder.class; //377 - list[MAGMA_CREAM] = ItemMagmaCream.class; //378 - list[BREWING_STAND] = ItemBrewingStand.class; //379 - list[CAULDRON] = ItemCauldron.class; //380 - list[ENDER_EYE] = ItemEnderEye.class; //381 - list[GLISTERING_MELON] = ItemMelonGlistering.class; //382 - list[SPAWN_EGG] = ItemSpawnEgg.class; //383 - list[EXPERIENCE_BOTTLE] = ItemExpBottle.class; //384 - list[FIRE_CHARGE] = ItemFireCharge.class; //385 - list[BOOK_AND_QUILL] = ItemBookAndQuill.class; //386 - list[WRITTEN_BOOK] = ItemBookWritten.class; //387 - list[EMERALD] = ItemEmerald.class; //388 - list[ITEM_FRAME] = ItemItemFrame.class; //389 - list[FLOWER_POT] = ItemFlowerPot.class; //390 - list[CARROT] = ItemCarrot.class; //391 - list[POTATO] = ItemPotato.class; //392 - list[BAKED_POTATO] = ItemPotatoBaked.class; //393 - list[POISONOUS_POTATO] = ItemPotatoPoisonous.class; //394 - list[EMPTY_MAP] = ItemEmptyMap.class; //395 - list[GOLDEN_CARROT] = ItemCarrotGolden.class; //396 - list[SKULL] = ItemSkull.class; //397 - list[CARROT_ON_A_STICK] = ItemCarrotOnAStick.class; //398 - list[NETHER_STAR] = ItemNetherStar.class; //399 - list[PUMPKIN_PIE] = ItemPumpkinPie.class; //400 - list[FIREWORKS] = ItemFirework.class; //401 - list[FIREWORKSCHARGE] = ItemFireworkStar.class; //402 - list[ENCHANTED_BOOK] = ItemBookEnchanted.class; //403 - list[COMPARATOR] = ItemRedstoneComparator.class; //404 - list[NETHER_BRICK] = ItemNetherBrick.class; //405 - list[QUARTZ] = ItemQuartz.class; //406 - list[MINECART_WITH_TNT] = ItemMinecartTNT.class; //407 - list[MINECART_WITH_HOPPER] = ItemMinecartHopper.class; //408 - list[PRISMARINE_SHARD] = ItemPrismarineShard.class; //409 - list[HOPPER] = ItemHopper.class; - list[RAW_RABBIT] = ItemRabbitRaw.class; //411 - list[COOKED_RABBIT] = ItemRabbitCooked.class; //412 - list[RABBIT_STEW] = ItemRabbitStew.class; //413 - list[RABBIT_FOOT] = ItemRabbitFoot.class; //414 - list[RABBIT_HIDE] = ItemRabbitHide.class; //415 - list[LEATHER_HORSE_ARMOR] = ItemHorseArmorLeather.class; //416 - list[IRON_HORSE_ARMOR] = ItemHorseArmorIron.class; //417 - list[GOLD_HORSE_ARMOR] = ItemHorseArmorGold.class; //418 - list[DIAMOND_HORSE_ARMOR] = ItemHorseArmorDiamond.class; //419 - list[LEAD] = ItemLead.class; //420 - list[NAME_TAG] = ItemNameTag.class; //421 - list[PRISMARINE_CRYSTALS] = ItemPrismarineCrystals.class; //422 - list[RAW_MUTTON] = ItemMuttonRaw.class; //423 - list[COOKED_MUTTON] = ItemMuttonCooked.class; //424 - list[ARMOR_STAND] = ItemArmorStand.class; //425 - list[END_CRYSTAL] = ItemEndCrystal.class; //426 - list[SPRUCE_DOOR] = ItemDoorSpruce.class; //427 - list[BIRCH_DOOR] = ItemDoorBirch.class; //428 - list[JUNGLE_DOOR] = ItemDoorJungle.class; //429 - list[ACACIA_DOOR] = ItemDoorAcacia.class; //430 - list[DARK_OAK_DOOR] = ItemDoorDarkOak.class; //431 - list[CHORUS_FRUIT] = ItemChorusFruit.class; //432 - list[POPPED_CHORUS_FRUIT] = ItemChorusFruitPopped.class; //433 - list[BANNER_PATTERN] = ItemBannerPattern.class; //434 - list[DRAGON_BREATH] = ItemDragonBreath.class; //437 - list[SPLASH_POTION] = ItemPotionSplash.class; //438 - list[LINGERING_POTION] = ItemPotionLingering.class; //441 - list[ELYTRA] = ItemElytra.class; //444 - list[SHULKER_SHELL] = ItemShulkerShell.class; //445 - list[BANNER] = ItemBanner.class; //446 - list[TOTEM] = ItemTotem.class; //450 - list[IRON_NUGGET] = ItemNuggetIron.class; //452 - list[TRIDENT] = ItemTrident.class; //455 - list[BEETROOT] = ItemBeetroot.class; //457 - list[BEETROOT_SEEDS] = ItemSeedsBeetroot.class; //458 - list[BEETROOT_SOUP] = ItemBeetrootSoup.class; //459 - list[RAW_SALMON] = ItemSalmon.class; //460 - list[CLOWNFISH] = ItemClownfish.class; //461 - list[PUFFERFISH] = ItemPufferfish.class; //462 - list[COOKED_SALMON] = ItemSalmonCooked.class; //463 - list[DRIED_KELP] = ItemDriedKelp.class; //464 - list[NAUTILUS_SHELL] = ItemNautilusShell.class; //465 - list[GOLDEN_APPLE_ENCHANTED] = ItemAppleGoldEnchanted.class; //466 - list[HEART_OF_THE_SEA] = ItemHeartOfTheSea.class; //467 - list[SCUTE] = ItemScute.class; //468 - list[TURTLE_SHELL] = ItemTurtleShell.class; //469 - list[PHANTOM_MEMBRANE] = ItemPhantomMembrane.class; //470 - list[CROSSBOW] = ItemCrossbow.class; //471 - list[SWEET_BERRIES] = ItemSweetBerries.class; //477 - list[RECORD_11] = ItemRecord11.class; //510 - list[RECORD_CAT] = ItemRecordCat.class; //501 - list[RECORD_13] = ItemRecord13.class; //500 - list[RECORD_BLOCKS] = ItemRecordBlocks.class; //502 - list[RECORD_CHIRP] = ItemRecordChirp.class; //503 - list[RECORD_FAR] = ItemRecordFar.class; //504 - list[RECORD_WARD] = ItemRecordWard.class; //509 - list[RECORD_MALL] = ItemRecordMall.class; //505 - list[RECORD_MELLOHI] = ItemRecordMellohi.class; //506 - list[RECORD_STAL] = ItemRecordStal.class; //507 - list[RECORD_STRAD] = ItemRecordStrad.class; //508 - list[RECORD_WAIT] = ItemRecordWait.class; //511 - list[SHIELD] = ItemShield.class; //513 - list[SUSPICIOUS_STEW] = ItemSuspiciousStew.class; //734 - list[HONEYCOMB] = ItemHoneycomb.class; //736 - list[HONEY_BOTTLE] = ItemHoneyBottle.class; //737 - list[NETHERITE_INGOT] = ItemIngotNetherite.class; //742 - list[NETHERITE_SWORD] = ItemSwordNetherite.class; //743 - list[NETHERITE_SHOVEL] = ItemShovelNetherite.class; //744 - list[NETHERITE_PICKAXE] = ItemPickaxeNetherite.class; //745 - list[NETHERITE_AXE] = ItemAxeNetherite.class; //746 - list[NETHERITE_HOE] = ItemHoeNetherite.class; //747 - list[NETHERITE_HELMET] = ItemHelmetNetherite.class; //748 - list[NETHERITE_CHESTPLATE] = ItemChestplateNetherite.class; //749 - list[NETHERITE_LEGGINGS] = ItemLeggingsNetherite.class; //750 - list[NETHERITE_BOOTS] = ItemBootsNetherite.class; //751 - list[NETHERITE_SCRAP] = ItemScrapNetherite.class; //752 - list[WARPED_FUNGUS_ON_A_STICK] = ItemWarpedFungusOnAStick.class; //757 - list[RECORD_PIGSTEP] = ItemRecordPigstep.class; //759 - list[SPYGLASS] = ItemSpyglass.class; //772 - - for (int i = 0; i < 256; ++i) { - if (Block.list[i] != null) { - list[i] = Block.list[i]; - } - } - } - - initCreativeItems(); - } - - private static final List creative137 = new ObjectArrayList<>(); - private static final List creative274 = new ObjectArrayList<>(); - private static final List creative291 = new ObjectArrayList<>(); - private static final List creative313 = new ObjectArrayList<>(); - private static final List creative332 = new ObjectArrayList<>(); - private static final List creative340 = new ObjectArrayList<>(); - private static final List creative354 = new ObjectArrayList<>(); - private static final List creative389 = new ObjectArrayList<>(); - private static final List creative407 = new ObjectArrayList<>(); - private static final List creative440 = new ObjectArrayList<>(); - private static final List creative448 = new ObjectArrayList<>(); - private static final List creative465 = new ObjectArrayList<>(); - private static final List creative471 = new ObjectArrayList<>(); - - @SuppressWarnings("unchecked") - private static void initCreativeItems() { - Server.getInstance().getLogger().debug("Loading creative items..."); - clearCreativeItems(); - - // Creative inventory for oldest versions - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems137.json")).getMapList("items")) { - try { - addCreativeItem(v1_2_0, fromJson(map)); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // Creative inventory for 274 - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems274.json")).getMapList("items")) { - try { - addCreativeItem(v1_5_0, fromJson(map)); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // Creative inventory for 291 - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems291.json")).getMapList("items")) { - try { - addCreativeItem(v1_7_0, fromJson(map)); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // Creative inventory for 313 - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems313.json")).getMapList("items")) { - try { - addCreativeItem(v1_8_0, fromJson(map)); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // Creative inventory for 332 - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems332.json")).getMapList("items")) { - try { - addCreativeItem(v1_9_0, fromJson(map)); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // Creative inventory for 340 - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems340.json")).getMapList("items")) { - try { - addCreativeItem(v1_10_0, fromJson(map)); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // Creative inventory for 354, 361, 388 - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems354.json")).getMapList("items")) { - try { - addCreativeItem(v1_11_0, fromJson(map)); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // Creative inventory for 389, 390 - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems389.json")).getMapList("items")) { - try { - addCreativeItem(v1_14_0, fromJson(map)); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // Creative inventory for 407+ - for (Map map : new Config(Config.YAML).loadFromStream(Server.class.getClassLoader().getResourceAsStream("creativeitems407.json")).getMapList("items")) { - try { - Item item = fromJson(map); - Item newItem = Item.get(item.getId(), item.getDamage(), item.getCount()); - newItem.setCompoundTag(item.getCompoundTag()); - addCreativeItem(v1_16_0, newItem); - } catch (Exception e) { - MainLogger.getLogger().logException(e); - } - } - - // New creative items mapping - registerCreativeItemsNew(ProtocolInfo.v1_17_0, ProtocolInfo.v1_17_0, creative440); - registerCreativeItemsNew(ProtocolInfo.v1_17_10, ProtocolInfo.v1_17_10, creative448); - registerCreativeItemsNew(ProtocolInfo.v1_17_30, ProtocolInfo.v1_17_30, creative465); - registerCreativeItemsNew(ProtocolInfo.v1_17_30, ProtocolInfo.v1_17_40, creative471); //TODO - } - - private static void registerCreativeItemsNew(int protocol, int blockPaletteProtocol, List creativeItems) { - JsonArray itemsArray; - try (InputStream stream = Server.class.getClassLoader().getResourceAsStream("creativeitems" + protocol + ".json")) { - itemsArray = JsonParser.parseReader(new InputStreamReader(stream, StandardCharsets.UTF_8)).getAsJsonObject().getAsJsonArray("items"); - } catch (Exception e) { - throw new AssertionError("Error loading required block states!", e); - } - - for (JsonElement element : itemsArray) { - Item item = RuntimeItems.getMapping(protocol).parseCreativeItem(element.getAsJsonObject(), true, blockPaletteProtocol); - if (item != null && !item.getName().equals(UNKNOWN_STR)) { - // Add only implemented items - creativeItems.add(item.clone()); - } - } - } - - public static void clearCreativeItems() { - Item.creative137.clear(); - Item.creative274.clear(); - Item.creative291.clear(); - Item.creative313.clear(); - Item.creative332.clear(); - Item.creative340.clear(); - Item.creative354.clear(); - Item.creative389.clear(); - Item.creative407.clear(); - Item.creative440.clear(); - Item.creative448.clear(); - Item.creative465.clear(); - Item.creative471.clear(); - } - - public static ArrayList getCreativeItems() { - Server.mvw("Item#getCreativeItems()"); - return getCreativeItems(CURRENT_PROTOCOL); - } - - public static ArrayList getCreativeItems(int protocol) { - switch (protocol) { - case v1_2_0: - case v1_2_5_11: - case v1_2_5: - case v1_2_6: - case v1_2_7: - case v1_2_10: - case v1_2_13: - case v1_2_13_11: - case v1_4_0: - return new ArrayList<>(Item.creative137); - case v1_5_0: - return new ArrayList<>(Item.creative274); - case v1_6_0_5: - case v1_6_0: - case v1_7_0: - return new ArrayList<>(Item.creative291); - case v1_8_0: - return new ArrayList<>(Item.creative313); - case v1_9_0: - return new ArrayList<>(Item.creative332); - case v1_10_0: - return new ArrayList<>(Item.creative340); - case v1_11_0: - case v1_12_0: - case v1_13_0: - return new ArrayList<>(Item.creative354); - case v1_14_0: - case v1_14_60: - return new ArrayList<>(Item.creative389); - case v1_16_0: - case v1_16_20: - case v1_16_100_0: - case v1_16_100_51: - case v1_16_100_52: - case v1_16_100: - case v1_16_200_51: - case v1_16_200: - case v1_16_210_50: - case v1_16_210_53: - case v1_16_210: - case v1_16_220: - case v1_16_230_50: - case v1_16_230: - case v1_16_230_54: - return new ArrayList<>(Item.creative407); - case v1_17_0: - return new ArrayList<>(Item.creative440); - case v1_17_10: - case v1_17_20_20: - return new ArrayList<>(Item.creative448); - case v1_17_30: - return new ArrayList<>(Item.creative465); - case v1_17_40: - return new ArrayList<>(Item.creative471); - default: - throw new IllegalArgumentException("Tried to get creative items for unsupported protocol version: " + protocol); - } - } - - public static void addCreativeItem(Item item) { - Server.mvw("Item#addCreativeItem(Item)"); - addCreativeItem(v1_16_0, item); - } - - public static void addCreativeItem(int protocol, Item item) { - switch (protocol) { // NOTE: Not all versions are supposed to be here - case v1_2_0: - Item.creative137.add(item.clone()); - case v1_5_0: - Item.creative274.add(item.clone()); - case v1_7_0: - Item.creative291.add(item.clone()); - break; - case v1_8_0: - Item.creative313.add(item.clone()); - break; - case v1_9_0: - Item.creative332.add(item.clone()); - break; - case v1_10_0: - Item.creative340.add(item.clone()); - break; - case v1_11_0: - Item.creative354.add(item.clone()); - break; - case v1_14_0: - Item.creative389.add(item.clone()); - break; - case v1_16_0: - Item.creative407.add(item.clone()); - break; - case v1_17_0: - Item.creative440.add(item.clone()); - break; - case v1_17_10: - Item.creative448.add(item.clone()); - break; - case v1_17_30: - Item.creative465.add(item.clone()); - break; - case v1_17_40: - Item.creative471.add(item.clone()); - break; - default: - throw new IllegalArgumentException("Tried to register creative items for unsupported protocol version: " + protocol); - } - } - - public static void removeCreativeItem(Item item) { - int index = getCreativeItemIndex(item); - if (index != -1) { - Item.creative407.remove(index); - } - } - - public static boolean isCreativeItem(Item item) { - for (Item aCreative : Item.creative407) { - if (item.equals(aCreative, !item.isTool())) { - return true; - } - } - return false; - } - - public static Item getCreativeItem(int index) { - return (index >= 0 && index < Item.creative407.size()) ? Item.creative407.get(index) : null; - } - - public static int getCreativeItemIndex(Item item) { - for (int i = 0; i < Item.creative407.size(); i++) { - if (item.equals(Item.creative407.get(i), !item.isTool())) { - return i; - } - } - return -1; - } - - public static Item get(int id) { - return get(id, 0); - } - - public static Item get(int id, Integer meta) { - return get(id, meta, 1); - } - - public static Item get(int id, Integer meta, int count) { - return get(id, meta, count, new byte[0]); - } - - public static Item get(int id, Integer meta, int count, byte[] tags) { - try { - Class c = list[id]; - Item item; - - if (c == null) { - item = new Item(id, meta, count); - } else if (id < 256) { - if (meta >= 0) { - item = new ItemBlock(Block.get(id, meta), meta, count); - } else { - item = new ItemBlock(Block.get(id), meta, count); - } - } else { - item = ((Item) c.getConstructor(Integer.class, int.class).newInstance(meta, count)); - } - - if (tags.length != 0) { - item.setCompoundTag(tags); - } - - return item; - } catch (Exception e) { - return new Item(id, meta, count).setCompoundTag(tags); - } - } - - public static Item fromString(String str) { - String[] b = str.trim().replace(' ', '_').replace("minecraft:", "").split(":"); - - int id = 0; - int meta = 0; - - Pattern integerPattern = Pattern.compile("^[1-9]\\d*$"); - if (integerPattern.matcher(b[0]).matches()) { - id = Integer.parseInt(b[0]); - } else { - try { - id = Item.class.getField(b[0].toUpperCase()).getInt(null); - } catch (Exception ignore) { - } - } - - id = id & 0xFFFF; - if (b.length != 1) meta = Integer.parseInt(b[1]) & 0xFFFF; - - return get(id, meta); - } - - public static Item fromJson(Map data) { - String nbt = (String) data.get("nbt_b64"); - byte[] nbtBytes; - if (nbt != null) { - nbtBytes = Base64.getDecoder().decode(nbt); - } else { // Support old format for backwards compatibility - nbt = (String) data.getOrDefault("nbt_hex", null); - if (nbt == null) { - nbtBytes = new byte[0]; - } else { - nbtBytes = Utils.parseHexBinary(nbt); - } - } - - return get(Utils.toInt(data.get("id")), Utils.toInt(data.getOrDefault("damage", 0)), Utils.toInt(data.getOrDefault("count", 1)), nbtBytes); - } - - public static Item fromJsonOld(Map data) { - String nbt = (String) data.getOrDefault("nbt_hex", ""); - return get(Utils.toInt(data.get("id")), Utils.toInt(data.getOrDefault("damage", 0)), Utils.toInt(data.getOrDefault("count", 1)), nbt.isEmpty() ? new byte[0] : Utils.parseHexBinary(nbt)); - } - - public static Item[] fromStringMultiple(String str) { - String[] b = str.split(","); - Item[] items = new Item[b.length - 1]; - for (int i = 0; i < b.length; i++) { - items[i] = fromString(b[i]); - } - return items; - } - - public Item setCompoundTag(CompoundTag tag) { - this.setNamedTag(tag); - return this; - } - - public Item setCompoundTag(byte[] tags) { - this.tags = tags; - this.cachedNBT = null; - return this; - } - - public byte[] getCompoundTag() { - return tags; - } - - public boolean hasCompoundTag() { - return this.tags != null && this.tags.length > 0; - } - - public boolean hasCustomBlockData() { - if (!this.hasCompoundTag()) { - return false; - } - - CompoundTag tag = this.getNamedTag(); - return tag.contains("BlockEntityTag") && tag.get("BlockEntityTag") instanceof CompoundTag; - - } - - public Item clearCustomBlockData() { - if (!this.hasCompoundTag()) { - return this; - } - CompoundTag tag = this.getNamedTag(); - - if (tag.contains("BlockEntityTag") && tag.get("BlockEntityTag") instanceof CompoundTag) { - tag.remove("BlockEntityTag"); - this.setNamedTag(tag); - } - - return this; - } - - public Item setCustomBlockData(CompoundTag compoundTag) { - CompoundTag tags = compoundTag.copy(); - tags.setName("BlockEntityTag"); - - CompoundTag tag; - if (!this.hasCompoundTag()) { - tag = new CompoundTag(); - } else { - tag = this.getNamedTag(); - } - - tag.putCompound("BlockEntityTag", tags); - this.setNamedTag(tag); - - return this; - } - - public CompoundTag getCustomBlockData() { - if (!this.hasCompoundTag()) { - return null; - } - - CompoundTag tag = this.getNamedTag(); - - if (tag.contains("BlockEntityTag")) { - Tag bet = tag.get("BlockEntityTag"); - if (bet instanceof CompoundTag) { - return (CompoundTag) bet; - } - } - - return null; - } - - public boolean hasEnchantments() { - if (!this.hasCompoundTag()) { - return false; - } - - CompoundTag tag = this.getNamedTag(); - - if (tag.contains("ench")) { - Tag enchTag = tag.get("ench"); - return enchTag instanceof ListTag; - } - - return false; - } - - public Enchantment getEnchantment(int id) { - return getEnchantment((short) (id & 0xffff)); - } - - public Enchantment getEnchantment(short id) { - if (!this.hasEnchantments()) { - return null; - } - - for (CompoundTag entry : this.getNamedTag().getList("ench", CompoundTag.class).getAll()) { - if (entry.getShort("id") == id) { - Enchantment e = Enchantment.getEnchantment(entry.getShort("id")); - if (e != null) { - e.setLevel(entry.getShort("lvl")); - return e; - } - } - } - - return null; - } - - public void addEnchantment(Enchantment... enchantments) { - CompoundTag tag; - if (!this.hasCompoundTag()) { - tag = new CompoundTag(); - } else { - tag = this.getNamedTag(); - } - - ListTag ench; - if (!tag.contains("ench")) { - ench = new ListTag<>("ench"); - tag.putList(ench); - } else { - ench = tag.getList("ench", CompoundTag.class); - } - - for (Enchantment enchantment : enchantments) { - boolean found = false; - - for (int k = 0; k < ench.size(); k++) { - CompoundTag entry = ench.get(k); - if (entry.getShort("id") == enchantment.getId()) { - ench.add(k, new CompoundTag() - .putShort("id", enchantment.getId()) - .putShort("lvl", enchantment.getLevel()) - ); - found = true; - break; - } - } - - if (!found) { - ench.add(new CompoundTag() - .putShort("id", enchantment.getId()) - .putShort("lvl", enchantment.getLevel()) - ); - } - } - - this.setNamedTag(tag); - } - - public Enchantment[] getEnchantments() { - if (!this.hasEnchantments()) { - return new Enchantment[0]; - } - - List enchantments = new ArrayList<>(); - - ListTag ench = this.getNamedTag().getList("ench", CompoundTag.class); - for (CompoundTag entry : ench.getAll()) { - Enchantment e = Enchantment.getEnchantment(entry.getShort("id")); - if (e != null) { - e.setLevel(entry.getShort("lvl")); - enchantments.add(e); - } - } - - return enchantments.toArray(new Enchantment[0]); - } - - public boolean hasEnchantment(int id) { - Enchantment e = this.getEnchantment(id); - return e != null && e.getLevel() > 0; - } - - public boolean hasEnchantment(short id) { - return this.getEnchantment(id) != null; - } - - public boolean hasCustomName() { - if (!this.hasCompoundTag()) { - return false; - } - - CompoundTag tag = this.getNamedTag(); - if (tag.contains("display")) { - Tag tag1 = tag.get("display"); - return tag1 instanceof CompoundTag && ((CompoundTag) tag1).contains("Name") && ((CompoundTag) tag1).get("Name") instanceof StringTag; - } - - return false; - } - - public String getCustomName() { - if (!this.hasCompoundTag()) { - return ""; - } - - CompoundTag tag = this.getNamedTag(); - if (tag.contains("display")) { - Tag tag1 = tag.get("display"); - if (tag1 instanceof CompoundTag && ((CompoundTag) tag1).contains("Name") && ((CompoundTag) tag1).get("Name") instanceof StringTag) { - return ((CompoundTag) tag1).getString("Name"); - } - } - - return ""; - } - - public Item setCustomName(String name) { - if (name == null || name.isEmpty()) { - this.clearCustomName(); - return this; - } - - if (name.length() > 100) { - name = name.substring(0, 100); - } - - CompoundTag tag; - if (!this.hasCompoundTag()) { - tag = new CompoundTag(); - } else { - tag = this.getNamedTag(); - } - if (tag.contains("display") && tag.get("display") instanceof CompoundTag) { - tag.getCompound("display").putString("Name", name); - } else { - tag.putCompound("display", new CompoundTag("display") - .putString("Name", name) - ); - } - this.setNamedTag(tag); - return this; - } - - public Item clearCustomName() { - if (!this.hasCompoundTag()) { - return this; - } - - CompoundTag tag = this.getNamedTag(); - - if (tag.contains("display") && tag.get("display") instanceof CompoundTag) { - tag.getCompound("display").remove("Name"); - if (tag.getCompound("display").isEmpty()) { - tag.remove("display"); - } - - this.setNamedTag(tag); - } - - return this; - } - - public String[] getLore() { - Tag tag = this.getNamedTagEntry("display"); - ArrayList lines = new ArrayList<>(); - - if (tag instanceof CompoundTag) { - CompoundTag nbt = (CompoundTag) tag; - ListTag lore = nbt.getList("Lore", StringTag.class); - - if (lore.size() > 0) { - for (StringTag stringTag : lore.getAll()) { - lines.add(stringTag.data); - } - } - } - - return lines.toArray(new String[0]); - } - - public Item setLore(String... lines) { - CompoundTag tag; - if (!this.hasCompoundTag()) { - tag = new CompoundTag(); - } else { - tag = this.getNamedTag(); - } - ListTag lore = new ListTag<>("Lore"); - - for (String line : lines) { - lore.add(new StringTag("", line)); - } - - if (!tag.contains("display")) { - tag.putCompound("display", new CompoundTag("display").putList(lore)); - } else { - tag.getCompound("display").putList(lore); - } - - this.setNamedTag(tag); - return this; - } - - public Tag getNamedTagEntry(String name) { - CompoundTag tag = this.getNamedTag(); - if (tag != null) { - return tag.contains(name) ? tag.get(name) : null; - } - - return null; - } - - public CompoundTag getNamedTag() { - if (!this.hasCompoundTag()) { - return null; - } - - if (this.cachedNBT == null) { - this.cachedNBT = parseCompoundTag(this.tags); - } - - this.cachedNBT.setName(""); - - return this.cachedNBT; - } - - public Item setNamedTag(CompoundTag tag) { - if (tag.isEmpty()) { - return this.clearNamedTag(); - } - tag.setName(null); - - this.cachedNBT = tag; - this.tags = writeCompoundTag(tag); - - return this; - } - - public Item clearNamedTag() { - return this.setCompoundTag(new byte[0]); - } - - public static CompoundTag parseCompoundTag(byte[] tag) { - try { - return NBTIO.read(tag, ByteOrder.LITTLE_ENDIAN); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public byte[] writeCompoundTag(CompoundTag tag) { - try { - tag.setName(""); - return NBTIO.write(tag, ByteOrder.LITTLE_ENDIAN); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public boolean isNull() { - return this.count <= 0 || this.id == AIR; - } - - final public String getName() { - return this.hasCustomName() ? this.getCustomName() : this.name; - } - - final public boolean canBePlaced() { - return ((this.block != null) && this.block.canBePlaced()); - } - - public Block getBlock() { - if (this.block != null) { - return this.block.clone(); - } else { - return Block.get(BlockID.AIR); - } - } - - public Block getBlockUnsafe() { - return this.block; - } - - public int getBlockId() { - return block == null ? 0 : block.getId(); - } - - public int getId() { - return id; - } - - public int getDamage() { - return meta == 0xffff ? 0 : meta; - } - - public void setDamage(Integer meta) { - if (meta != null) { - this.meta = meta & 0xffff; - } else { - this.hasMeta = false; - } - } - - public int getMaxStackSize() { - return 64; - } - - final public Short getFuelTime() { - if (!Fuel.duration.containsKey(id)) { - return null; - } - if (this.id != BUCKET || this.meta == 10) { - return Fuel.duration.get(this.id); - } - return null; - } - - public boolean useOn(Entity entity) { - return false; - } - - public boolean useOn(Block block) { - return false; - } - - public boolean isTool() { - return false; - } - - public int getMaxDurability() { - return -1; - } - - public int getTier() { - return 0; - } - - public boolean isPickaxe() { - return false; - } - - public boolean isAxe() { - return false; - } - - public boolean isSword() { - return false; - } - - public boolean isShovel() { - return false; - } - - public boolean isHoe() { - return false; - } - - public boolean isShears() { - return false; - } - - public boolean isArmor() { - return false; - } - - public boolean isHelmet() { - return false; - } - - public boolean canBePutInHelmetSlot() { - return false; - } - - public boolean isChestplate() { - return false; - } - - public boolean isLeggings() { - return false; - } - - public boolean isBoots() { - return false; - } - - public int getEnchantAbility() { - return 0; - } - - public int getAttackDamage() { - return 1; - } - - public int getArmorPoints() { - return 0; - } - - public int getToughness() { - return 0; - } - - public boolean isUnbreakable() { - return false; - } - - public boolean onUse(Player player, int ticksUsed) { - return false; - } - - public boolean onRelease(Player player, int ticksUsed) { - return false; - } - - @Override - final public String toString() { - return "Item " + this.name + " (" + this.id + ':' + (!this.hasMeta ? "?" : this.meta) + ")x" + this.count + (this.hasCompoundTag() ? " tags:0x" + Binary.bytesToHexString(this.getCompoundTag()) : ""); - } - - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - return false; - } - - /** - * Called when a player uses the item on air, for example throwing a projectile. - * Returns whether the item was changed, for example count decrease or durability change. - * - * @param player player - * @param directionVector direction - * @return item changed - */ - public boolean onClickAir(Player player, Vector3 directionVector) { - return false; - } - - @Override - public final boolean equals(Object item) { - return item instanceof Item && this.equals((Item) item, true); - } - - public final boolean equals(Item item, boolean checkDamage) { - return equals(item, checkDamage, true); - } - - public final boolean equals(Item item, boolean checkDamage, boolean checkCompound) { - if (this.id == item.id && (!checkDamage || this.meta == item.meta)) { - if (checkCompound) { - if (Arrays.equals(this.getCompoundTag(), item.getCompoundTag())) { - return true; - } else if (this.hasCompoundTag() && item.hasCompoundTag()) { - return this.getNamedTag().equals(item.getNamedTag()); - } - } else { - return true; - } - } - - return false; - } - - /** - * Returns whether the specified item stack has the same ID, damage, NBT and count as this item stack. - * - * @param other item - * @return equal - */ - public final boolean equalsExact(Item other) { - return this.equals(other, true, true) && this.count == other.count; - } - - public final boolean equalsFast(Item other) { - return other != null && other.id == this.id && other.meta == this.meta; - } - - public final boolean deepEquals(Item item) { - return equals(item, true); - } - - public final boolean deepEquals(Item item, boolean checkDamage) { - return equals(item, checkDamage, true); - } - - public final boolean deepEquals(Item item, boolean checkDamage, boolean checkCompound) { - return equals(item, checkDamage, checkCompound); - } - - public int getRepairCost() { - if (this.hasCompoundTag()) { - CompoundTag tag = this.getNamedTag(); - if (tag.contains("RepairCost")) { - Tag repairCost = tag.get("RepairCost"); - if (repairCost instanceof IntTag) { - return ((IntTag) repairCost).data; - } - } - } - return 0; - } - - public Item setRepairCost(int cost) { - if (cost <= 0 && this.hasCompoundTag()) { - return this.setNamedTag(this.getNamedTag().remove("RepairCost")); - } - - CompoundTag tag; - if (!this.hasCompoundTag()) { - tag = new CompoundTag(); - } else { - tag = this.getNamedTag(); - } - return this.setNamedTag(tag.putInt("RepairCost", cost)); - } - - @Override - public Item clone() { - try { - Item item = (Item) super.clone(); - item.tags = this.tags.clone(); - return item; - } catch (CloneNotSupportedException e) { - return null; - } - } - - public final RuntimeEntry getRuntimeEntry() { - Server.mvw("Item#getRuntimeEntry()"); - return this.getRuntimeEntry(ProtocolInfo.CURRENT_PROTOCOL); - } - - public final RuntimeEntry getRuntimeEntry(int protocolId) { - return RuntimeItems.getMapping(protocolId).toRuntime(this.getId(), this.getDamage()); - } - - public final int getNetworkId() { - Server.mvw("Item#getNetworkId()"); - return this.getNetworkId(ProtocolInfo.CURRENT_PROTOCOL); - } - - public final int getNetworkId(int protocolId) { - if (protocolId < ProtocolInfo.v1_16_100) { - return getId(); - } - return this.getRuntimeEntry(protocolId).getRuntimeId(); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemApple.java b/src/main/java/cn/nukkit/item/ItemApple.java deleted file mode 100644 index 0823f6159..000000000 --- a/src/main/java/cn/nukkit/item/ItemApple.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemApple extends ItemEdible { - - public ItemApple() { - this(0, 1); - } - - public ItemApple(Integer meta) { - this(meta, 1); - } - - public ItemApple(Integer meta, int count) { - super(APPLE, 0, count, "Apple"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemAppleGold.java b/src/main/java/cn/nukkit/item/ItemAppleGold.java deleted file mode 100644 index 5be2aa53c..000000000 --- a/src/main/java/cn/nukkit/item/ItemAppleGold.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.math.Vector3; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemAppleGold extends ItemEdible { - - public ItemAppleGold() { - this(0, 1); - } - - public ItemAppleGold(Integer meta) { - this(meta, 1); - } - - public ItemAppleGold(Integer meta, int count) { - super(GOLDEN_APPLE, meta, count, "Golden Apple"); - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemAppleGoldEnchanted.java b/src/main/java/cn/nukkit/item/ItemAppleGoldEnchanted.java deleted file mode 100644 index 00b8b1e5b..000000000 --- a/src/main/java/cn/nukkit/item/ItemAppleGoldEnchanted.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.math.Vector3; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemAppleGoldEnchanted extends ItemEdible { - - public ItemAppleGoldEnchanted() { - this(0, 1); - } - - public ItemAppleGoldEnchanted(Integer meta) { - this(meta, 1); - } - - public ItemAppleGoldEnchanted(Integer meta, int count) { - super(GOLDEN_APPLE_ENCHANTED, meta, count, "Enchanted Apple"); - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemArmor.java b/src/main/java/cn/nukkit/item/ItemArmor.java deleted file mode 100644 index 16f277a3e..000000000 --- a/src/main/java/cn/nukkit/item/ItemArmor.java +++ /dev/null @@ -1,134 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.level.Sound; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.ByteTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -/** - * @author MagicDroidX - * Nukkit Project - */ -abstract public class ItemArmor extends Item implements ItemDurable { - - public static final int TIER_LEATHER = 1; - public static final int TIER_IRON = 2; - public static final int TIER_CHAIN = 3; - public static final int TIER_GOLD = 4; - public static final int TIER_DIAMOND = 5; - public static final int TIER_NETHERITE = 6; - public static final int TIER_OTHER = 7; - - public ItemArmor(int id) { - super(id); - } - - public ItemArmor(int id, Integer meta) { - super(id, meta); - } - - public ItemArmor(int id, Integer meta, int count) { - super(id, meta, count); - } - - public ItemArmor(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } - - @Override - public int getMaxStackSize() { - return 1; - } - - @Override - public boolean isArmor() { - return true; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - boolean equip = false; - Item oldSlotItem = Item.get(AIR); - if (this.isHelmet()) { - oldSlotItem = player.getInventory().getHelmet(); - if (player.getInventory().setHelmet(this)) { - equip = true; - } - } else if (this.isChestplate()) { - oldSlotItem = player.getInventory().getChestplate(); - if (player.getInventory().setChestplate(this)) { - equip = true; - } - } else if (this.isLeggings()) { - oldSlotItem = player.getInventory().getLeggings(); - if (player.getInventory().setLeggings(this)) { - equip = true; - } - } else if (this.isBoots()) { - oldSlotItem = player.getInventory().getBoots(); - if (player.getInventory().setBoots(this)) { - equip = true; - } - } - if (equip) { - player.getInventory().setItem(player.getInventory().getHeldItemIndex(), oldSlotItem); - switch (this.getTier()) { - case TIER_CHAIN: - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_ARMOR_EQUIP_CHAIN); - break; - case TIER_DIAMOND: - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_ARMOR_EQUIP_DIAMOND); - break; - case TIER_GOLD: - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_ARMOR_EQUIP_GOLD); - break; - case TIER_IRON: - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_ARMOR_EQUIP_IRON); - break; - case TIER_LEATHER: - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_ARMOR_EQUIP_LEATHER); - break; - case TIER_NETHERITE: - player.getLevel().addSoundToViewers(player, Sound.ARMOR_EQUIP_NETHERITE); - case TIER_OTHER: - default: - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_ARMOR_EQUIP_GENERIC); - } - } - - return this.getCount() == 0; - } - - @Override - public int getEnchantAbility() { - switch (this.getTier()) { - case TIER_CHAIN: - return 12; - case TIER_LEATHER: - return 15; - case TIER_DIAMOND: - return 10; - case TIER_GOLD: - return 25; - case TIER_IRON: - return 9; - case TIER_NETHERITE: - return 10; //TODO - } - - return 0; - } - - @Override - public boolean isUnbreakable() { - Tag tag = this.getNamedTagEntry("Unbreakable"); - return tag instanceof ByteTag && ((ByteTag) tag).data > 0; - } - - @Override - public boolean canBePutInHelmetSlot() { - return this.isHelmet(); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemArmorStand.java b/src/main/java/cn/nukkit/item/ItemArmorStand.java deleted file mode 100644 index c563e25d2..000000000 --- a/src/main/java/cn/nukkit/item/ItemArmorStand.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityArmorStand; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.LevelEventPacket; - -public class ItemArmorStand extends Item { - - public ItemArmorStand() { - this(0); - } - - public ItemArmorStand(Integer meta) { - this(meta, 1); - } - - public ItemArmorStand(Integer meta, int count) { - super(ARMOR_STAND, meta, count, "Armor Stand"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - FullChunk chunk = level.getChunk((int) block.getX() >> 4, (int) block.getZ() >> 4); - - if (chunk == null) { - return false; - } - - for (Entity e : chunk.getEntities().values()) { - if (e instanceof EntityArmorStand) { - if (e.getY() == block.getY() && e.getX() == (block.getX() + 0.5) && e.getZ() == (block.getZ() + 0.5)) { - return false; - } - } - } - - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", block.getX() + 0.5)) - .add(new DoubleTag("", block.getY())) - .add(new DoubleTag("", block.getZ() + 0.5))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", getDirection((float) player.getYaw()))) - .add(new FloatTag("", 0))); - - if (this.hasCustomName()) { - nbt.putString("CustomName", this.getCustomName()); - } - - Entity entity = Entity.createEntity("ArmorStand", chunk, nbt); - - if (entity != null) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - entity.spawnToAll(); - player.getLevel().addLevelSoundEvent(entity, LevelEventPacket.EVENT_SOUND_ARMOR_STAND_PLACE); - return true; - } - return false; - } - - public static float getDirection(float yaw) { - return (Math.round(yaw / 22.5f / 2) * 45) - 180; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemArrow.java b/src/main/java/cn/nukkit/item/ItemArrow.java deleted file mode 100644 index f2d5b7fc4..000000000 --- a/src/main/java/cn/nukkit/item/ItemArrow.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemArrow extends Item { - - public ItemArrow() { - this(0, 1); - } - - public ItemArrow(Integer meta) { - this(meta, 1); - } - - public ItemArrow(Integer meta, int count) { - super(ARROW, meta, count, "Arrow"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemAxeDiamond.java b/src/main/java/cn/nukkit/item/ItemAxeDiamond.java deleted file mode 100644 index cbe1bdfa9..000000000 --- a/src/main/java/cn/nukkit/item/ItemAxeDiamond.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemAxeDiamond extends ItemTool { - - public ItemAxeDiamond() { - this(0, 1); - } - - public ItemAxeDiamond(Integer meta) { - this(meta, 1); - } - - public ItemAxeDiamond(Integer meta, int count) { - super(DIAMOND_AXE, meta, count, "Diamond Axe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_DIAMOND; - } - - @Override - public boolean isAxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_DIAMOND; - } - - @Override - public int getAttackDamage() { - return 6; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemAxeGold.java b/src/main/java/cn/nukkit/item/ItemAxeGold.java deleted file mode 100644 index 0007ac16c..000000000 --- a/src/main/java/cn/nukkit/item/ItemAxeGold.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemAxeGold extends ItemTool { - - public ItemAxeGold() { - this(0, 1); - } - - public ItemAxeGold(Integer meta) { - this(meta, 1); - } - - public ItemAxeGold(Integer meta, int count) { - super(GOLD_AXE, meta, count, "Golden Axe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_GOLD; - } - - @Override - public boolean isAxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_GOLD; - } - - @Override - public int getAttackDamage() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemAxeIron.java b/src/main/java/cn/nukkit/item/ItemAxeIron.java deleted file mode 100644 index 8e60ab2d1..000000000 --- a/src/main/java/cn/nukkit/item/ItemAxeIron.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemAxeIron extends ItemTool { - - public ItemAxeIron() { - this(0, 1); - } - - public ItemAxeIron(Integer meta) { - this(meta, 1); - } - - public ItemAxeIron(Integer meta, int count) { - super(IRON_AXE, meta, count, "Iron Axe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_IRON; - } - - @Override - public boolean isAxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_IRON; - } - - @Override - public int getAttackDamage() { - return 5; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemAxeNetherite.java b/src/main/java/cn/nukkit/item/ItemAxeNetherite.java deleted file mode 100644 index d1060ad86..000000000 --- a/src/main/java/cn/nukkit/item/ItemAxeNetherite.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.item; - -public class ItemAxeNetherite extends ItemTool { - - public ItemAxeNetherite() { - this(0, 1); - } - - public ItemAxeNetherite(Integer meta) { - this(meta, 1); - } - - public ItemAxeNetherite(Integer meta, int count) { - super(NETHERITE_AXE, meta, count, "Netherite Axe"); - } - - @Override - public boolean isAxe() { - return true; - } - - @Override - public int getAttackDamage() { - return 7; - } - - @Override - public int getTier() { - return ItemTool.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_NETHERITE; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemAxeStone.java b/src/main/java/cn/nukkit/item/ItemAxeStone.java deleted file mode 100644 index 7275ebdf0..000000000 --- a/src/main/java/cn/nukkit/item/ItemAxeStone.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemAxeStone extends ItemTool { - - public ItemAxeStone() { - this(0, 1); - } - - public ItemAxeStone(Integer meta) { - this(meta, 1); - } - - public ItemAxeStone(Integer meta, int count) { - super(STONE_AXE, meta, count, "Stone Axe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_STONE; - } - - @Override - public boolean isAxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_STONE; - } - - @Override - public int getAttackDamage() { - return 4; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemAxeWood.java b/src/main/java/cn/nukkit/item/ItemAxeWood.java deleted file mode 100644 index 1225cafc5..000000000 --- a/src/main/java/cn/nukkit/item/ItemAxeWood.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemAxeWood extends ItemTool { - - public ItemAxeWood() { - this(0, 1); - } - - public ItemAxeWood(Integer meta) { - this(meta, 1); - } - - public ItemAxeWood(Integer meta, int count) { - super(WOODEN_AXE, meta, count, "Wooden Axe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_WOODEN; - } - - @Override - public boolean isAxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_WOODEN; - } - - @Override - public int getAttackDamage() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBanner.java b/src/main/java/cn/nukkit/item/ItemBanner.java deleted file mode 100644 index a595c5e40..000000000 --- a/src/main/java/cn/nukkit/item/ItemBanner.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.BannerPattern; -import cn.nukkit.utils.DyeColor; - -/** - * Created by PetteriM1 - */ -public class ItemBanner extends Item { - - public ItemBanner() { - this(0); - } - - public ItemBanner(Integer meta) { - this(meta, 1); - } - - public ItemBanner(Integer meta, int count) { - super(BANNER, meta, count, "Banner"); - this.block = Block.get(Block.STANDING_BANNER); - } - - @Override - public int getMaxStackSize() { - return 16; - } - - public int getBaseColor() { - return this.getDamage() & 0x0f; - } - - public void setBaseColor(DyeColor color) { - this.setDamage(color.getDyeData() & 0x0f); - } - - public int getType() { - return this.getNamedTag().getInt("Type"); - } - - public void setType(int type) { - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - tag.putInt("Type", type); - this.setNamedTag(tag); - } - - public void addPattern(BannerPattern pattern) { - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - ListTag patterns = tag.getList("Patterns", CompoundTag.class); - patterns.add(new CompoundTag(""). - putInt("Color", pattern.getColor().getDyeData() & 0x0f). - putString("Pattern", pattern.getType().getName())); - tag.putList(patterns); - this.setNamedTag(tag); - } - - public BannerPattern getPattern(int index) { - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - return BannerPattern.fromCompoundTag(tag.getList("Patterns").size() > index && index >= 0 ? tag.getList("Patterns", CompoundTag.class).get(index) : new CompoundTag()); - } - - public void removePattern(int index) { - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - ListTag patterns = tag.getList("Patterns", CompoundTag.class); - if (patterns.size() > index && index >= 0) { - patterns.remove(index); - } - this.setNamedTag(tag); - } - - public int getPatternsSize() { - return (this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag()).getList("Patterns").size(); - } - - public boolean hasPattern() { - return (this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag()).contains("Patterns"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBannerPattern.java b/src/main/java/cn/nukkit/item/ItemBannerPattern.java deleted file mode 100644 index 12e8295e2..000000000 --- a/src/main/java/cn/nukkit/item/ItemBannerPattern.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemBannerPattern extends Item { - - public ItemBannerPattern() { - this(0, 1); - } - - public ItemBannerPattern(Integer meta) { - this(meta, 1); - } - - public ItemBannerPattern(Integer meta, int count) { - super(BANNER_PATTERN, meta, count, "Banner Pattern"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBed.java b/src/main/java/cn/nukkit/item/ItemBed.java deleted file mode 100644 index eb41df272..000000000 --- a/src/main/java/cn/nukkit/item/ItemBed.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; -import cn.nukkit.utils.DyeColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBed extends Item { - - public ItemBed() { - this(0, 1); - } - - public ItemBed(Integer meta) { - this(meta, 1); - } - - public ItemBed(Integer meta, int count) { - super(BED, meta, count, DyeColor.getByWoolData(meta).getName() + " Bed"); - this.block = Block.get(BED_BLOCK); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBeefRaw.java b/src/main/java/cn/nukkit/item/ItemBeefRaw.java deleted file mode 100644 index 435e8c3d0..000000000 --- a/src/main/java/cn/nukkit/item/ItemBeefRaw.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBeefRaw extends ItemEdible { - - public ItemBeefRaw() { - this(0, 1); - } - - public ItemBeefRaw(Integer meta) { - this(meta, 1); - } - - public ItemBeefRaw(Integer meta, int count) { - super(RAW_BEEF, meta, count, "Raw Beef"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBeetroot.java b/src/main/java/cn/nukkit/item/ItemBeetroot.java deleted file mode 100644 index 92ffd89c6..000000000 --- a/src/main/java/cn/nukkit/item/ItemBeetroot.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBeetroot extends ItemEdible { - - public ItemBeetroot() { - this(0, 1); - } - - public ItemBeetroot(Integer meta) { - this(meta, 1); - } - - public ItemBeetroot(Integer meta, int count) { - super(BEETROOT, meta, count, "Beetroot"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBeetrootSoup.java b/src/main/java/cn/nukkit/item/ItemBeetrootSoup.java deleted file mode 100644 index e0c365d92..000000000 --- a/src/main/java/cn/nukkit/item/ItemBeetrootSoup.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBeetrootSoup extends ItemEdible { - - public ItemBeetrootSoup() { - this(0, 1); - } - - public ItemBeetrootSoup(Integer meta) { - this(meta, 1); - } - - public ItemBeetrootSoup(Integer meta, int count) { - super(BEETROOT_SOUP, 0, count, "Beetroot Soup"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBlazePowder.java b/src/main/java/cn/nukkit/item/ItemBlazePowder.java deleted file mode 100644 index 348d3e1aa..000000000 --- a/src/main/java/cn/nukkit/item/ItemBlazePowder.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemBlazePowder extends Item { - - public ItemBlazePowder() { - this(0, 1); - } - - public ItemBlazePowder(Integer meta) { - this(meta, 1); - } - - public ItemBlazePowder(Integer meta, int count) { - super(BLAZE_POWDER, 0, count, "Blaze Powder"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBlazeRod.java b/src/main/java/cn/nukkit/item/ItemBlazeRod.java deleted file mode 100644 index 2e50243b1..000000000 --- a/src/main/java/cn/nukkit/item/ItemBlazeRod.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by lion on 21.03.17. - */ -public class ItemBlazeRod extends Item { - - public ItemBlazeRod() { - this(0, 1); - } - - public ItemBlazeRod(Integer meta) { - this(meta, 1); - } - - public ItemBlazeRod(Integer meta, int count) { - super(BLAZE_ROD, meta, count, "Blaze Rod"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBlock.java b/src/main/java/cn/nukkit/item/ItemBlock.java deleted file mode 100644 index aea8f313f..000000000 --- a/src/main/java/cn/nukkit/item/ItemBlock.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBlock extends Item { - - public ItemBlock(Block block) { - this(block, 0, 1); - } - - public ItemBlock(Block block, Integer meta) { - this(block, meta, 1); - } - - public ItemBlock(Block block, Integer meta, int count) { - super(block.getId(), meta, count, block.getName()); - this.block = block; - } - - public void setDamage(Integer meta) { - if (meta != null) { - this.meta = meta & 0xffff; - } else { - this.hasMeta = false; - } - this.block.setDamage(meta); - } - - @Override - public ItemBlock clone() { - ItemBlock block = (ItemBlock) super.clone(); - block.block = this.block.clone(); - return block; - } - - public Block getBlock() { - return this.block; - } - - @Override - public int getMaxStackSize() { - if (this.block.getId() == Block.SHULKER_BOX || this.block.getId() == Block.UNDYED_SHULKER_BOX) { - return 1; - } - - return super.getMaxStackSize(); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBoat.java b/src/main/java/cn/nukkit/item/ItemBoat.java deleted file mode 100644 index e2bbded95..000000000 --- a/src/main/java/cn/nukkit/item/ItemBoat.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockWater; -import cn.nukkit.entity.item.EntityBoat; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; - -/** - * Created by yescallop on 2016/2/13. - */ -public class ItemBoat extends Item { - - public ItemBoat() { - this(0, 1); - } - - public ItemBoat(Integer meta) { - this(meta, 1); - } - - public ItemBoat(Integer meta, int count) { - super(BOAT, meta, count, "Boat"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (face != BlockFace.UP) return false; - EntityBoat boat = new EntityBoat( - level.getChunk(block.getFloorX() >> 4, block.getFloorZ() >> 4), new CompoundTag("") - .putList(new ListTag("Pos") - .add(new DoubleTag("", block.getX() + 0.5)) - .add(new DoubleTag("", block.getY() - (target instanceof BlockWater ? 0.1 : 0))) - .add(new DoubleTag("", block.getZ() + 0.5))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", (float) ((player.yaw + 90f) % 360))) - .add(new FloatTag("", 0))) - .putInt("Variant", this.getDamage()) - ); - - if (!player.isCreative()) { - this.count--; - } - - boat.spawnToAll(); - return true; - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBone.java b/src/main/java/cn/nukkit/item/ItemBone.java deleted file mode 100644 index 2786ab21e..000000000 --- a/src/main/java/cn/nukkit/item/ItemBone.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBone extends Item { - - public ItemBone() { - this(0, 1); - } - - public ItemBone(Integer meta) { - this(meta, 1); - } - - public ItemBone(Integer meta, int count) { - super(BONE, meta, count, "Bone"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBook.java b/src/main/java/cn/nukkit/item/ItemBook.java deleted file mode 100644 index 3c9eb643d..000000000 --- a/src/main/java/cn/nukkit/item/ItemBook.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBook extends Item { - - public ItemBook() { - this(0, 1); - } - - public ItemBook(Integer meta) { - this(meta, 1); - } - - public ItemBook(Integer meta, int count) { - super(BOOK, meta, count, "Book"); - } - - @Override - public int getEnchantAbility() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBookAndQuill.java b/src/main/java/cn/nukkit/item/ItemBookAndQuill.java deleted file mode 100644 index 22976bf71..000000000 --- a/src/main/java/cn/nukkit/item/ItemBookAndQuill.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item; - -public class ItemBookAndQuill extends ItemBookWritable { - - public ItemBookAndQuill() { - this(0, 1); - } - - public ItemBookAndQuill(Integer meta) { - this(meta, 1); - } - - public ItemBookAndQuill(Integer meta, int count) { - super(Item.BOOK_AND_QUILL, 0, count, "Book & Quill"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBookEnchanted.java b/src/main/java/cn/nukkit/item/ItemBookEnchanted.java deleted file mode 100644 index fb5279aa8..000000000 --- a/src/main/java/cn/nukkit/item/ItemBookEnchanted.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBookEnchanted extends Item { - - public ItemBookEnchanted() { - this(0, 1); - } - - public ItemBookEnchanted(Integer meta) { - this(meta, 1); - } - - public ItemBookEnchanted(Integer meta, int count) { - super(ENCHANTED_BOOK, meta, count, "Enchanted Book"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBookWritable.java b/src/main/java/cn/nukkit/item/ItemBookWritable.java deleted file mode 100644 index 6c9ea824a..000000000 --- a/src/main/java/cn/nukkit/item/ItemBookWritable.java +++ /dev/null @@ -1,214 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import com.google.common.base.Preconditions; - -import java.util.List; - -public abstract class ItemBookWritable extends Item { - - protected ItemBookWritable(int id) { - super(id); - } - - protected ItemBookWritable(int id, Integer meta) { - super(id, meta); - } - - protected ItemBookWritable(int id, Integer meta, int count) { - super(id, meta, count); - } - - protected ItemBookWritable(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } - - /** - * Returns whether the given page exists in this book. - */ - public boolean pageExists(int pageId) { - Preconditions.checkArgument(pageId >= 0 && pageId < 50, "Page number " + pageId + " is out of range"); - if (this.hasCompoundTag()) { - CompoundTag tag = this.getNamedTag(); - if (tag.contains("pages") && tag.get("pages") instanceof ListTag) { - return tag.getList("pages", CompoundTag.class).size() > pageId; - } - } - return false; - } - - /** - * Returns a string containing the content of a page (which could be empty), or null if the page doesn't exist. - */ - public String getPageText(int pageId) { - Preconditions.checkArgument(pageId >= 0 && pageId < 50, "Page number " + pageId + " is out of range"); - if (this.hasCompoundTag()) { - CompoundTag tag = this.getNamedTag(); - if (tag.contains("pages") && tag.get("pages") instanceof ListTag) { - ListTag pages = tag.getList("pages", CompoundTag.class); - if (pages.size() > pageId) { - return pages.get(pageId).getString("text"); - } - } - } - return null; - } - - /** - * Sets the text of a page in the book. Adds the page if the page does not yet exist. - * @return boolean indicating success - */ - public boolean setPageText(int pageId, String pageText) { - Preconditions.checkArgument(pageId >= 0 && pageId < 50, "Page number " + pageId + " is out of range"); - CompoundTag tag; - if (this.hasCompoundTag()) { - tag = this.getNamedTag(); - } else if (pageText.isEmpty()) { - return false; - } else { - tag = new CompoundTag(); - } - ListTag pages; - if (!tag.contains("pages") || !(tag.get("pages") instanceof ListTag)) { - pages = new ListTag<>("pages"); - tag.putList(pages); - } else { - pages = tag.getList("pages", CompoundTag.class); - } - if (pages.size() <= pageId) { - for (int current = pages.size(); current <= pageId; current++) { - pages.add(createPageTag()); - } - } - - pages.get(pageId).putString("text", pageText); - this.setCompoundTag(tag); - return true; - } - - /** - * Adds a new page with the given page ID. - * Creates a new page for every page between the given ID and existing pages that doesn't yet exist. - * @return boolean indicating success - */ - public boolean addPage(int pageId) { - Preconditions.checkArgument(pageId >= 0 && pageId < 50, "Page number " + pageId + " is out of range"); - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - ListTag pages; - if (!tag.contains("pages") || !(tag.get("pages") instanceof ListTag)) { - pages = new ListTag<>("pages"); - tag.putList(pages); - } else { - pages = tag.getList("pages", CompoundTag.class); - } - - for (int current = pages.size(); current <= pageId; current++) { - pages.add(createPageTag()); - } - this.setCompoundTag(tag); - return true; - } - - /** - * Deletes an existing page with the given page ID. - * @return boolean indicating success - */ - public boolean deletePage(int pageId) { - Preconditions.checkArgument(pageId >= 0 && pageId < 50, "Page number " + pageId + " is out of range"); - if (this.hasCompoundTag()) { - CompoundTag tag = this.getNamedTag(); - if (tag.contains("pages") && tag.get("pages") instanceof ListTag) { - ListTag pages = tag.getList("pages", CompoundTag.class); - if (pages.size() > pageId) { - pages.remove(pageId); - this.setCompoundTag(tag); - } - } - } - return true; - } - - /** - * Inserts a new page with the given text and moves other pages upwards. - * @return boolean indicating success - */ - public boolean insertPage(int pageId) { - return this.insertPage(pageId, ""); - } - - /** - * Inserts a new page with the given text and moves other pages upwards. - * @return boolean indicating success - */ - public boolean insertPage(int pageId, String pageText) { - Preconditions.checkArgument(pageId >= 0 && pageId < 50, "Page number " + pageId + " is out of range"); - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - ListTag pages; - if (!tag.contains("pages") || !(tag.get("pages") instanceof ListTag)) { - pages = new ListTag<>("pages"); - tag.putList(pages); - } else { - pages = tag.getList("pages", CompoundTag.class); - } - - if (pages.size() <= pageId) { - for (int current = pages.size(); current <= pageId; current++) { - pages.add(createPageTag()); - } - pages.get(pageId).putString("text", pageText); - } else { - pages.add(pageId, createPageTag(pageText)); - } - this.setCompoundTag(tag); - return true; - } - - /** - * Switches the text of two pages with each other. - * @return boolean indicating success - */ - public boolean swapPages(int pageId1, int pageId2) { - Preconditions.checkArgument(pageId1 >= 0 && pageId1 < 50, "Page number " + pageId1 + " is out of range"); - Preconditions.checkArgument(pageId2 >= 0 && pageId2 < 50, "Page number " + pageId2 + " is out of range"); - if (this.hasCompoundTag()) { - CompoundTag tag = this.getNamedTag(); - if (tag.contains("pages") && tag.get("pages") instanceof ListTag) { - ListTag pages = tag.getList("pages", CompoundTag.class); - if (pages.size() > pageId1 && pages.size() > pageId2) { - String pageContents1 = pages.get(pageId1).getString("text"); - String pageContents2 = pages.get(pageId2).getString("text"); - pages.get(pageId1).putString("text", pageContents2); - pages.get(pageId2).putString("text", pageContents1); - return true; - } - } - } - return false; - } - - /** - * Returns an list containing all pages of this book. - */ - public List getPages() { - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - ListTag pages; - if (!tag.contains("pages") || !(tag.get("pages") instanceof ListTag)) { - pages = new ListTag<>("pages"); - tag.putList(pages); - } else { - pages = tag.getList("pages", CompoundTag.class); - } - return pages.parseValue(); - } - - protected static CompoundTag createPageTag() { - return createPageTag(""); - } - - protected static CompoundTag createPageTag(String pageText) { - return new CompoundTag() - .putString("text", pageText) - .putString("photoname", ""); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBookWritten.java b/src/main/java/cn/nukkit/item/ItemBookWritten.java deleted file mode 100644 index 1bca82907..000000000 --- a/src/main/java/cn/nukkit/item/ItemBookWritten.java +++ /dev/null @@ -1,119 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; - -public class ItemBookWritten extends ItemBookWritable { - - public static final int GENERATION_ORIGINAL = 0; - public static final int GENERATION_COPY = 1; - public static final int GENERATION_COPY_OF_COPY = 2; - public static final int GENERATION_TATTERED = 3; - - public ItemBookWritten() { - this(0, 1); - } - - public ItemBookWritten(Integer meta) { - this(meta, 1); - } - - public ItemBookWritten(Integer meta, int count) { - super(Item.WRITTEN_BOOK, 0, count, "Written Book"); - } - - @Override - public int getMaxStackSize() { - return 16; - } - - public Item writeBook(String author, String title, String[] pages) { - ListTag pageList = new ListTag<>("pages"); - for (String page : pages) { - pageList.add(createPageTag(page)); - } - return writeBook(author, title, pageList); - } - - public Item writeBook(String author, String title, ListTag pages) { - if (pages.size() > 50 || pages.size() <= 0) return this; // Minecraft does not support more than 50 pages - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - - tag.putString("author", author); - tag.putString("title", title); - tag.putList(pages); - - tag.putInt("generation", GENERATION_ORIGINAL); - tag.putString("xuid", ""); - - return this.setNamedTag(tag); - } - - public boolean signBook(String title, String author, String xuid, int generation) { - this.setNamedTag((this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag()) - .putString("title", title) - .putString("author", author) - .putInt("generation", generation) - .putString("xuid", xuid)); - return true; - } - - /** - * Returns the generation of the book. - * Generations higher than 1 can not be copied. - */ - public int getGeneration() { - return this.hasCompoundTag() ? this.getNamedTag().getInt("generation") : -1; - } - - /** - * Sets the generation of a book. - */ - public void setGeneration(int generation) { - this.setNamedTag((this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag()).putInt("generation", generation)); - } - - /** - * Returns the author of this book. - * This is not a reliable way to get the name of the player who signed this book. - * The author can be set to anything when signing a book. - */ - public String getAuthor() { - return this.hasCompoundTag() ? this.getNamedTag().getString("author") : ""; - } - - /** - * Sets the author of this book. - */ - public void setAuthor(String author) { - this.setNamedTag((this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag()).putString("author", author)); - } - - /** - * Returns the title of this book. - */ - public String getTitle() { - return this.hasCompoundTag() ? this.getNamedTag().getString("title") : "Written Book"; - } - - /** - * Sets the title of this book. - */ - public void setTitle(String title) { - this.setNamedTag((this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag()).putString("title", title)); - } - - /** - * Returns the author's XUID of this book. - */ - public String getXUID() { - return this.hasCompoundTag() ? this.getNamedTag().getString("xuid") : ""; - } - - /** - * Sets the author's XUID of this book. - */ - public void setXUID(String title) { - this.setNamedTag((this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag()).putString("xuid", title)); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBootsChain.java b/src/main/java/cn/nukkit/item/ItemBootsChain.java deleted file mode 100644 index 82048cacc..000000000 --- a/src/main/java/cn/nukkit/item/ItemBootsChain.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBootsChain extends ItemArmor { - - public ItemBootsChain() { - this(0, 1); - } - - public ItemBootsChain(Integer meta) { - this(meta, 1); - } - - public ItemBootsChain(Integer meta, int count) { - super(CHAIN_BOOTS, meta, count, "Chainmail Boots"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_CHAIN; - } - - @Override - public boolean isBoots() { - return true; - } - - @Override - public int getArmorPoints() { - return 1; - } - - @Override - public int getMaxDurability() { - return 196; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBootsDiamond.java b/src/main/java/cn/nukkit/item/ItemBootsDiamond.java deleted file mode 100644 index 6a16233c5..000000000 --- a/src/main/java/cn/nukkit/item/ItemBootsDiamond.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBootsDiamond extends ItemArmor { - - public ItemBootsDiamond() { - this(0, 1); - } - - public ItemBootsDiamond(Integer meta) { - this(meta, 1); - } - - public ItemBootsDiamond(Integer meta, int count) { - super(DIAMOND_BOOTS, meta, count, "Diamond Boots"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_DIAMOND; - } - - @Override - public boolean isBoots() { - return true; - } - - @Override - public int getArmorPoints() { - return 3; - } - - @Override - public int getMaxDurability() { - return 430; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBootsGold.java b/src/main/java/cn/nukkit/item/ItemBootsGold.java deleted file mode 100644 index 9df6d08c6..000000000 --- a/src/main/java/cn/nukkit/item/ItemBootsGold.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBootsGold extends ItemArmor { - - public ItemBootsGold() { - this(0, 1); - } - - public ItemBootsGold(Integer meta) { - this(meta, 1); - } - - public ItemBootsGold(Integer meta, int count) { - super(GOLD_BOOTS, meta, count, "Golden Boots"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_GOLD; - } - - @Override - public boolean isBoots() { - return true; - } - - @Override - public int getArmorPoints() { - return 1; - } - - @Override - public int getMaxDurability() { - return 92; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBootsIron.java b/src/main/java/cn/nukkit/item/ItemBootsIron.java deleted file mode 100644 index 4d00db5a2..000000000 --- a/src/main/java/cn/nukkit/item/ItemBootsIron.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBootsIron extends ItemArmor { - - public ItemBootsIron() { - this(0, 1); - } - - public ItemBootsIron(Integer meta) { - this(meta, 1); - } - - public ItemBootsIron(Integer meta, int count) { - super(IRON_BOOTS, meta, count, "Iron Boots"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_IRON; - } - - @Override - public boolean isBoots() { - return true; - } - - @Override - public int getArmorPoints() { - return 2; - } - - @Override - public int getMaxDurability() { - return 196; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBootsLeather.java b/src/main/java/cn/nukkit/item/ItemBootsLeather.java deleted file mode 100644 index 3c33510fc..000000000 --- a/src/main/java/cn/nukkit/item/ItemBootsLeather.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBootsLeather extends ItemColorArmor { - - public ItemBootsLeather() { - this(0, 1); - } - - public ItemBootsLeather(Integer meta) { - this(meta, 1); - } - - public ItemBootsLeather(Integer meta, int count) { - super(LEATHER_BOOTS, meta, count, "Leather Boots"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_LEATHER; - } - - @Override - public boolean isBoots() { - return true; - } - - @Override - public int getArmorPoints() { - return 1; - } - - @Override - public int getMaxDurability() { - return 66; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBootsNetherite.java b/src/main/java/cn/nukkit/item/ItemBootsNetherite.java deleted file mode 100644 index 6761c3a26..000000000 --- a/src/main/java/cn/nukkit/item/ItemBootsNetherite.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.item; - -public class ItemBootsNetherite extends ItemArmor { - - public ItemBootsNetherite() { - this(0, 1); - } - - public ItemBootsNetherite(Integer meta) { - this(meta, 1); - } - - public ItemBootsNetherite(Integer meta, int count) { - super(NETHERITE_BOOTS, meta, count, "Netherite Boots"); - } - - @Override - public boolean isBoots() { - return true; - } - - @Override - public int getTier() { - return ItemArmor.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return 481; - } - - @Override - public int getArmorPoints() { - return 3; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBow.java b/src/main/java/cn/nukkit/item/ItemBow.java deleted file mode 100644 index 34b1e16ad..000000000 --- a/src/main/java/cn/nukkit/item/ItemBow.java +++ /dev/null @@ -1,146 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.entity.EntityShootBowEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBow extends ItemTool { - - public ItemBow() { - this(0, 1); - } - - public ItemBow(Integer meta) { - this(meta, 1); - } - - public ItemBow(Integer meta, int count) { - this(BOW, meta, count, "Bow"); - } - - public ItemBow(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_BOW; - } - - @Override - public int getEnchantAbility() { - return 1; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return player.getInventory().contains(Item.get(ItemID.ARROW)) || player.isCreative(); - } - - @Override - public boolean onRelease(Player player, int ticksUsed) { - Item itemArrow = Item.get(Item.ARROW, 0, 1); - - Inventory inventory = player.getOffhandInventory(); - - if (!inventory.contains(itemArrow) && !(inventory = player.getInventory()).contains(itemArrow) && player.isSurvival()) { - player.getOffhandInventory().sendContents(player); - inventory.sendContents(player); - return false; - } - - double damage = 2; - Enchantment bowDamage = this.getEnchantment(Enchantment.ID_BOW_POWER); - if (bowDamage != null && bowDamage.getLevel() > 0) { - damage += (double) bowDamage.getLevel() * 0.5 + 0.5; - } - - Enchantment flameEnchant = this.getEnchantment(Enchantment.ID_BOW_FLAME); - boolean flame = flameEnchant != null && flameEnchant.getLevel() > 0; - - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", player.x)) - .add(new DoubleTag("", player.y + player.getEyeHeight())) - .add(new DoubleTag("", player.z))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", -Math.sin(player.yaw / 180 * Math.PI) * Math.cos(player.pitch / 180 * Math.PI))) - .add(new DoubleTag("", -Math.sin(player.pitch / 180 * Math.PI))) - .add(new DoubleTag("", Math.cos(player.yaw / 180 * Math.PI) * Math.cos(player.pitch / 180 * Math.PI)))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", (player.yaw > 180 ? 360 : 0) - (float) player.yaw)) - .add(new FloatTag("", (float) -player.pitch))) - .putShort("Fire", flame ? 2700 : 0) - .putDouble("damage", damage); - - double p = (double) ticksUsed / 20; - - double f = Math.min((p * p + p * 2) / 3, 1) * 2.8; - EntityShootBowEvent entityShootBowEvent = new EntityShootBowEvent(player, this, new EntityArrow(player.chunk, nbt, player, f == 2), f); - - if (f < 0.1 || ticksUsed < 3) { - entityShootBowEvent.setCancelled(); - } - - Server.getInstance().getPluginManager().callEvent(entityShootBowEvent); - if (entityShootBowEvent.isCancelled()) { - entityShootBowEvent.getProjectile().close(); - player.getInventory().sendContents(player); - player.getOffhandInventory().sendContents(player); - } else { - entityShootBowEvent.getProjectile().setMotion(entityShootBowEvent.getProjectile().getMotion().multiply(entityShootBowEvent.getForce())); - Enchantment infinityEnchant = this.getEnchantment(Enchantment.ID_BOW_INFINITY); - boolean infinity = infinityEnchant != null && infinityEnchant.getLevel() > 0; - EntityProjectile projectile; - if (infinity && (projectile = entityShootBowEvent.getProjectile()) instanceof EntityArrow) { - ((EntityArrow) projectile).setPickupMode(EntityArrow.PICKUP_CREATIVE); - } - if (!player.isCreative()) { - if (!infinity || itemArrow.getDamage() != 0) { - inventory.removeItem(itemArrow); - } - - if (!this.isUnbreakable()) { - Enchantment durability = this.getEnchantment(Enchantment.ID_DURABILITY); - if (!(durability != null && durability.getLevel() > 0 && (100 / (durability.getLevel() + 1)) <= Utils.random.nextInt(100))) { - this.setDamage(this.getDamage() + 2); - if (this.getDamage() >= getMaxDurability()) { - this.count--; - } - player.getInventory().setItemInHand(this); - } - } - } - - if (entityShootBowEvent.getProjectile() != null) { - EntityProjectile proj = entityShootBowEvent.getProjectile(); - ProjectileLaunchEvent projectev = new ProjectileLaunchEvent(proj); - Server.getInstance().getPluginManager().callEvent(projectev); - if (projectev.isCancelled()) { - proj.close(); - } else { - proj.spawnToAll(); - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_BOW); - } - } - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBowl.java b/src/main/java/cn/nukkit/item/ItemBowl.java deleted file mode 100644 index ea866c81c..000000000 --- a/src/main/java/cn/nukkit/item/ItemBowl.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBowl extends Item { - - public ItemBowl() { - this(0, 1); - } - - public ItemBowl(Integer meta) { - this(meta, 1); - } - - public ItemBowl(Integer meta, int count) { - super(BOWL, 0, count, "Bowl"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBread.java b/src/main/java/cn/nukkit/item/ItemBread.java deleted file mode 100644 index 1334d4503..000000000 --- a/src/main/java/cn/nukkit/item/ItemBread.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBread extends ItemEdible { - - public ItemBread() { - this(0, 1); - } - - public ItemBread(Integer meta) { - this(meta, 1); - } - - public ItemBread(Integer meta, int count) { - super(BREAD, meta, count, "Bread"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBrewingStand.java b/src/main/java/cn/nukkit/item/ItemBrewingStand.java deleted file mode 100644 index aeadd0ca4..000000000 --- a/src/main/java/cn/nukkit/item/ItemBrewingStand.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -public class ItemBrewingStand extends Item { - - public ItemBrewingStand() { - this(0, 1); - } - - public ItemBrewingStand(Integer meta) { - this(meta, 1); - } - - public ItemBrewingStand(Integer meta, int count) { - super(BREWING_STAND, 0, count, "Brewing Stand"); - this.block = Block.get(BREWING_STAND_BLOCK); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/item/ItemBrick.java b/src/main/java/cn/nukkit/item/ItemBrick.java deleted file mode 100644 index 0339d287d..000000000 --- a/src/main/java/cn/nukkit/item/ItemBrick.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBrick extends Item { - - public ItemBrick() { - this(0, 1); - } - - public ItemBrick(Integer meta) { - this(meta, 1); - } - - public ItemBrick(Integer meta, int count) { - super(BRICK, 0, count, "Brick"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemBucket.java b/src/main/java/cn/nukkit/item/ItemBucket.java deleted file mode 100644 index 0541cbdce..000000000 --- a/src/main/java/cn/nukkit/item/ItemBucket.java +++ /dev/null @@ -1,238 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.*; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.player.PlayerBucketEmptyEvent; -import cn.nukkit.event.player.PlayerBucketFillEvent; -import cn.nukkit.event.player.PlayerItemConsumeEvent; -import cn.nukkit.level.Level; -import cn.nukkit.level.particle.ExplodeParticle; -import cn.nukkit.level.sound.FizzSound; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockFace.Plane; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemBucket extends Item { - - public ItemBucket() { - this(0, 1); - } - - public ItemBucket(Integer meta) { - this(meta, 1); - } - - public ItemBucket(Integer meta, int count) { - super(BUCKET, meta, count, getName(meta)); - } - - protected static String getName(int meta) { - switch (meta) { - case 1: - return "Milk"; - case 2: - return "Bucket of Cod"; - case 3: - return "Bucket of Salmon"; - case 4: - return "Bucket of Tropical Fish"; - case 5: - return "Bucket of Pufferfish"; - case 8: - return "Water Bucket"; - case 10: - return "Lava Bucket"; - default: - return "Bucket"; - } - } - - public static int getDamageByTarget(int target) { - switch (target) { - case 2: - case 3: - case 4: - case 5: - case 8: - case 9: - return 8; - case 10: - case 11: - return 10; - default: - return 0; - } - } - - @Override - public int getMaxStackSize() { - return this.meta == 0 ? 16 : 1; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (player.isAdventure()) { - return false; - } - - Block targetBlock = Block.get(getDamageByTarget(this.meta)); - - if (targetBlock instanceof BlockAir) { - if (target instanceof BlockLiquid && target.getDamage() == 0) { - Item result = Item.get(BUCKET, getDamageByTarget(target.getId()), 1); - PlayerBucketFillEvent ev; - player.getServer().getPluginManager().callEvent(ev = new PlayerBucketFillEvent(player, block, face, this, result)); - if (!ev.isCancelled()) { - player.getLevel().setBlock(target, Block.get(BlockID.AIR), true, true); - - // When water is removed ensure any adjacent still water is - // replaced with water that can flow. - for (BlockFace side : Plane.HORIZONTAL) { - Block b = target.getSide(side); - if (b.getId() == STILL_WATER) { - level.setBlock(b, Block.get(BlockID.WATER)); - } - } - - if (player.isSurvival()) { - if (this.getCount() - 1 <= 0) { - player.getInventory().setItemInHand(ev.getItem()); - } else { - Item clone = this.clone(); - clone.setCount(this.getCount() - 1); - player.getInventory().setItemInHand(clone); - if (player.getInventory().canAddItem(ev.getItem())) { - player.getInventory().addItem(ev.getItem()); - } else { - player.dropItem(ev.getItem()); - } - } - } - - if (target instanceof BlockLava) { - level.addLevelSoundEvent(block, LevelSoundEventPacket.SOUND_BUCKET_FILL_LAVA); - } else { - level.addLevelSoundEvent(block, LevelSoundEventPacket.SOUND_BUCKET_FILL_WATER); - } - - return true; - } else { - player.getInventory().sendContents(player); - } - } - } else if (targetBlock instanceof BlockLiquid) { - Item result = Item.get(BUCKET, 0, 1); - PlayerBucketEmptyEvent ev = new PlayerBucketEmptyEvent(player, block, face, this, result); - if (!block.canBeFlowedInto()) { - ev.setCancelled(true); - } - - boolean nether = false; - if (player.getLevel().getDimension() == Level.DIMENSION_NETHER && this.getDamage() != 10) { - ev.setCancelled(true); - nether = true; - } - - player.getServer().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - player.getLevel().setBlock(block, targetBlock, true, true); - if (player.isSurvival()) { - if (this.getCount() - 1 <= 0) { - player.getInventory().setItemInHand(ev.getItem()); - } else { - Item clone = this.clone(); - clone.setCount(this.getCount() - 1); - player.getInventory().setItemInHand(clone); - if (player.getInventory().canAddItem(ev.getItem())) { - player.getInventory().addItem(ev.getItem()); - } else { - player.dropItem(ev.getItem()); - } - } - } - - if (this.getDamage() == 10) { - level.addLevelSoundEvent(block, LevelSoundEventPacket.SOUND_BUCKET_EMPTY_LAVA); - } else { - level.addLevelSoundEvent(block, LevelSoundEventPacket.SOUND_BUCKET_EMPTY_WATER); - } - - if (Server.getInstance().mobsFromBlocks) { - switch (this.getDamage()) { - case 2: - Entity e2 = Entity.createEntity("Cod", block); - if (e2 != null) e2.spawnToAll(); - break; - case 3: - Entity e3 = Entity.createEntity("Salmon", block); - if (e3 != null) e3.spawnToAll(); - break; - case 4: - Entity e4 = Entity.createEntity("TropicalFish", block); - if (e4 != null) e4.spawnToAll(); - break; - case 5: - Entity e5 = Entity.createEntity("Pufferfish", block); - if (e5 != null) e5.spawnToAll(); - break; - } - } - - return true; - } else if (nether) { - if (!player.isCreative()) { - this.setDamage(0); // Empty bucket - player.getInventory().setItemInHand(this); - } - player.getLevel().addSound(new FizzSound(target, 2.6F + (ThreadLocalRandom.current().nextFloat() - ThreadLocalRandom.current().nextFloat()) * 0.8F)); - player.getLevel().addParticle(new ExplodeParticle(target.add(0.5, 1, 0.5))); - } else { - player.getInventory().sendContents(player); - } - } - - return false; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return this.getDamage() == 1; // Milk - } - - @Override - public boolean onUse(Player player, int ticksUsed) { - if (player.isSpectator() || this.getDamage() != 1) { - return false; - } - - PlayerItemConsumeEvent consumeEvent = new PlayerItemConsumeEvent(player, this); - - player.getServer().getPluginManager().callEvent(consumeEvent); - if (consumeEvent.isCancelled()) { - player.getInventory().sendContents(player); - return false; - } - - if (!player.isCreative()) { - player.getInventory().setItemInHand(new ItemBucket()); - } - - player.removeAllEffects(); - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCactus.java b/src/main/java/cn/nukkit/item/ItemCactus.java deleted file mode 100644 index 866710864..000000000 --- a/src/main/java/cn/nukkit/item/ItemCactus.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemCactus extends Item { - - public ItemCactus() { - this(0, 1); - } - - public ItemCactus(Integer meta) { - this(meta, 1); - } - - public ItemCactus(Integer meta, int count) { - super(CACTUS, 0, count, "Cactus"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCake.java b/src/main/java/cn/nukkit/item/ItemCake.java deleted file mode 100644 index 0d7037c3b..000000000 --- a/src/main/java/cn/nukkit/item/ItemCake.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemCake extends Item { - - public ItemCake() { - this(0, 1); - } - - public ItemCake(Integer meta) { - this(meta, 1); - } - - public ItemCake(Integer meta, int count) { - super(CAKE, 0, count, "Cake"); - this.block = Block.get(CAKE_BLOCK); - } - - @Override - public int getMaxStackSize() { - return 64; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCarrot.java b/src/main/java/cn/nukkit/item/ItemCarrot.java deleted file mode 100644 index 19ceefcd6..000000000 --- a/src/main/java/cn/nukkit/item/ItemCarrot.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemCarrot extends ItemEdible { - - public ItemCarrot() { - this(0, 1); - } - - public ItemCarrot(Integer meta) { - this(meta, 1); - } - - public ItemCarrot(Integer meta, int count) { - super(CARROT, 0, count, "Carrot"); - this.block = Block.get(CARROT_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCarrotGolden.java b/src/main/java/cn/nukkit/item/ItemCarrotGolden.java deleted file mode 100644 index 176e1b3af..000000000 --- a/src/main/java/cn/nukkit/item/ItemCarrotGolden.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemCarrotGolden extends ItemEdible { - - public ItemCarrotGolden() { - this(0, 1); - } - - public ItemCarrotGolden(Integer meta) { - this(meta, 1); - } - - public ItemCarrotGolden(Integer meta, int count) { - super(GOLDEN_CARROT, 0, count, "Golden Carrot"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCarrotOnAStick.java b/src/main/java/cn/nukkit/item/ItemCarrotOnAStick.java deleted file mode 100644 index acbf6ce5f..000000000 --- a/src/main/java/cn/nukkit/item/ItemCarrotOnAStick.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by lion on 21.03.17. - */ -public class ItemCarrotOnAStick extends ItemTool { - - public ItemCarrotOnAStick() { - this(0, 1); - } - - public ItemCarrotOnAStick(Integer meta) { - this(meta, 1); - } - - public ItemCarrotOnAStick(Integer meta, int count) { - super(CARROT_ON_A_STICK, meta, count, "Carrot on a stick"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_CARROT_ON_A_STICK; - } - - @Override - public boolean noDamageOnAttack() { - return true; - } - - @Override - public boolean noDamageOnBreak() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCauldron.java b/src/main/java/cn/nukkit/item/ItemCauldron.java deleted file mode 100644 index e53d41633..000000000 --- a/src/main/java/cn/nukkit/item/ItemCauldron.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author CreeperFace - * Nukkit Project - */ -public class ItemCauldron extends Item { - - public ItemCauldron() { - this(0, 1); - } - - public ItemCauldron(Integer meta) { - this(meta, 1); - } - - public ItemCauldron(Integer meta, int count) { - super(CAULDRON, meta, count, "Cauldron"); - this.block = Block.get(CAULDRON_BLOCK); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/item/ItemChestplateChain.java b/src/main/java/cn/nukkit/item/ItemChestplateChain.java deleted file mode 100644 index 609a364ec..000000000 --- a/src/main/java/cn/nukkit/item/ItemChestplateChain.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemChestplateChain extends ItemArmor { - - public ItemChestplateChain() { - this(0, 1); - } - - public ItemChestplateChain(Integer meta) { - this(meta, 1); - } - - public ItemChestplateChain(Integer meta, int count) { - super(CHAIN_CHESTPLATE, meta, count, "Chain Chestplate"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_CHAIN; - } - - @Override - public boolean isChestplate() { - return true; - } - - @Override - public int getArmorPoints() { - return 5; - } - - @Override - public int getMaxDurability() { - return 241; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChestplateDiamond.java b/src/main/java/cn/nukkit/item/ItemChestplateDiamond.java deleted file mode 100644 index 55e0fe9f9..000000000 --- a/src/main/java/cn/nukkit/item/ItemChestplateDiamond.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemChestplateDiamond extends ItemArmor { - - public ItemChestplateDiamond() { - this(0, 1); - } - - public ItemChestplateDiamond(Integer meta) { - this(meta, 1); - } - - public ItemChestplateDiamond(Integer meta, int count) { - super(DIAMOND_CHESTPLATE, meta, count, "Diamond Chestplate"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_DIAMOND; - } - - @Override - public boolean isChestplate() { - return true; - } - - @Override - public int getArmorPoints() { - return 8; - } - - @Override - public int getMaxDurability() { - return 529; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChestplateGold.java b/src/main/java/cn/nukkit/item/ItemChestplateGold.java deleted file mode 100644 index cc91d7af6..000000000 --- a/src/main/java/cn/nukkit/item/ItemChestplateGold.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemChestplateGold extends ItemArmor { - - public ItemChestplateGold() { - this(0, 1); - } - - public ItemChestplateGold(Integer meta) { - this(meta, 1); - } - - public ItemChestplateGold(Integer meta, int count) { - super(GOLD_CHESTPLATE, meta, count, "Golden Chestplate"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_GOLD; - } - - @Override - public boolean isChestplate() { - return true; - } - - @Override - public int getArmorPoints() { - return 5; - } - - @Override - public int getMaxDurability() { - return 113; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChestplateIron.java b/src/main/java/cn/nukkit/item/ItemChestplateIron.java deleted file mode 100644 index 3aefbe3f0..000000000 --- a/src/main/java/cn/nukkit/item/ItemChestplateIron.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemChestplateIron extends ItemArmor { - - public ItemChestplateIron() { - this(0, 1); - } - - public ItemChestplateIron(Integer meta) { - this(meta, 1); - } - - public ItemChestplateIron(Integer meta, int count) { - super(IRON_CHESTPLATE, meta, count, "Iron Chestplate"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_IRON; - } - - @Override - public boolean isChestplate() { - return true; - } - - @Override - public int getArmorPoints() { - return 6; - } - - @Override - public int getMaxDurability() { - return 241; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChestplateLeather.java b/src/main/java/cn/nukkit/item/ItemChestplateLeather.java deleted file mode 100644 index 561c221f1..000000000 --- a/src/main/java/cn/nukkit/item/ItemChestplateLeather.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemChestplateLeather extends ItemColorArmor { - - public ItemChestplateLeather() { - this(0, 1); - } - - public ItemChestplateLeather(Integer meta) { - this(meta, 1); - } - - public ItemChestplateLeather(Integer meta, int count) { - super(LEATHER_TUNIC, meta, count, "Leather Tunic"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_LEATHER; - } - - @Override - public boolean isChestplate() { - return true; - } - - @Override - public int getArmorPoints() { - return 3; - } - - @Override - public int getMaxDurability() { - return 81; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChestplateNetherite.java b/src/main/java/cn/nukkit/item/ItemChestplateNetherite.java deleted file mode 100644 index 09674778a..000000000 --- a/src/main/java/cn/nukkit/item/ItemChestplateNetherite.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.item; - -public class ItemChestplateNetherite extends ItemArmor { - - public ItemChestplateNetherite() { - this(0, 1); - } - - public ItemChestplateNetherite(Integer meta) { - this(meta, 1); - } - - public ItemChestplateNetherite(Integer meta, int count) { - super(NETHERITE_CHESTPLATE, meta, count, "Netherite Chestplate"); - } - - @Override - public boolean isChestplate() { - return true; - } - - @Override - public int getTier() { - return ItemArmor.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return 592; - } - - @Override - public int getArmorPoints() { - return 8; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChickenCooked.java b/src/main/java/cn/nukkit/item/ItemChickenCooked.java deleted file mode 100644 index 7571fa947..000000000 --- a/src/main/java/cn/nukkit/item/ItemChickenCooked.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemChickenCooked extends ItemEdible { - - public ItemChickenCooked() { - this(0, 1); - } - - public ItemChickenCooked(Integer meta) { - this(meta, 1); - } - - public ItemChickenCooked(Integer meta, int count) { - super(COOKED_CHICKEN, meta, count, "Cooked Chicken"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChickenRaw.java b/src/main/java/cn/nukkit/item/ItemChickenRaw.java deleted file mode 100644 index 685565db5..000000000 --- a/src/main/java/cn/nukkit/item/ItemChickenRaw.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemChickenRaw extends ItemEdible { - - public ItemChickenRaw() { - this(0, 1); - } - - public ItemChickenRaw(Integer meta) { - this(meta, 1); - } - - public ItemChickenRaw(Integer meta, int count) { - super(RAW_CHICKEN, meta, count, "Raw Chicken"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChorusFruit.java b/src/main/java/cn/nukkit/item/ItemChorusFruit.java deleted file mode 100644 index 1406cd975..000000000 --- a/src/main/java/cn/nukkit/item/ItemChorusFruit.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.math.Vector3; - -public class ItemChorusFruit extends ItemEdible { - - public ItemChorusFruit() { - this(0, 1); - } - - public ItemChorusFruit(Integer meta) { - this(meta, 1); - } - - public ItemChorusFruit(Integer meta, int count) { - super(CHORUS_FRUIT, 0, count, "Chorus Fruit"); - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return player.getServer().getTick() - player.getLastChorusFruitTeleport() >= 20; - } - - @Override - public boolean onUse(Player player, int ticksUsed) { - if (ticksUsed < 10) return false; - boolean successful = super.onUse(player, ticksUsed); - if (successful) { - player.onChorusFruitTeleport(); - } - return successful; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemChorusFruitPopped.java b/src/main/java/cn/nukkit/item/ItemChorusFruitPopped.java deleted file mode 100644 index 11d835afe..000000000 --- a/src/main/java/cn/nukkit/item/ItemChorusFruitPopped.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemChorusFruitPopped extends Item { - - public ItemChorusFruitPopped() { - this(0, 1); - } - - public ItemChorusFruitPopped(Integer meta) { - this(meta, 1); - } - - public ItemChorusFruitPopped(Integer meta, int count) { - super(POPPED_CHORUS_FRUIT, 0, count, "Popped Chorus Fruit"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemClay.java b/src/main/java/cn/nukkit/item/ItemClay.java deleted file mode 100644 index a2d3763a3..000000000 --- a/src/main/java/cn/nukkit/item/ItemClay.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemClay extends Item { - - public ItemClay() { - this(0, 1); - } - - public ItemClay(Integer meta) { - this(meta, 1); - } - - public ItemClay(Integer meta, int count) { - super(CLAY, meta, count, "Clay"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemClock.java b/src/main/java/cn/nukkit/item/ItemClock.java deleted file mode 100644 index 5234e5bc8..000000000 --- a/src/main/java/cn/nukkit/item/ItemClock.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemClock extends Item { - - public ItemClock() { - this(0, 1); - } - - public ItemClock(Integer meta) { - this(meta, 1); - } - - public ItemClock(Integer meta, int count) { - super(CLOCK, meta, count, "Clock"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemClownfish.java b/src/main/java/cn/nukkit/item/ItemClownfish.java deleted file mode 100644 index 55aa9d880..000000000 --- a/src/main/java/cn/nukkit/item/ItemClownfish.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemClownfish extends ItemFish { - - public ItemClownfish() { - this(0, 1); - } - - public ItemClownfish(Integer meta) { - this(meta, 1); - } - - public ItemClownfish(Integer meta, int count) { - super(CLOWNFISH, meta, count, "Tropical Fish"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCoal.java b/src/main/java/cn/nukkit/item/ItemCoal.java deleted file mode 100644 index 46bf7064d..000000000 --- a/src/main/java/cn/nukkit/item/ItemCoal.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemCoal extends Item { - - public ItemCoal() { - this(0, 1); - } - - public ItemCoal(Integer meta) { - this(meta, 1); - } - - public ItemCoal(Integer meta, int count) { - super(COAL, meta, count, "Coal"); - if (this.meta == 1) { - this.name = "Charcoal"; - } - } -} diff --git a/src/main/java/cn/nukkit/item/ItemColorArmor.java b/src/main/java/cn/nukkit/item/ItemColorArmor.java deleted file mode 100644 index 692c49812..000000000 --- a/src/main/java/cn/nukkit/item/ItemColorArmor.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * Created by fromgate on 27.03.2016. - */ -abstract public class ItemColorArmor extends ItemArmor { - - public ItemColorArmor(int id) { - super(id); - } - - public ItemColorArmor(int id, Integer meta) { - super(id, meta); - } - - public ItemColorArmor(int id, Integer meta, int count) { - super(id, meta, count); - } - - public ItemColorArmor(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } - - /** - * Set leather armor color - * - * @param dyeColor - Dye color data value - * @return - Return colored item - */ - public ItemColorArmor setColor(int dyeColor) { - BlockColor blockColor = DyeColor.getByDyeData(dyeColor).getColor(); - return setColor(blockColor.getRed(), blockColor.getGreen(), blockColor.getBlue()); - } - - /** - * Set leather armor color - * - * @param dyeColor - DyeColor object - * @return - Return colored item - */ - public ItemColorArmor setColor(DyeColor dyeColor) { - BlockColor blockColor = dyeColor.getColor(); - return setColor(blockColor.getRed(), blockColor.getGreen(), blockColor.getBlue()); - } - - /** - * Set leather armor color - * - * @param color - BlockColor object - * @return - Return colored item - */ - public ItemColorArmor setColor(BlockColor color) { - return setColor(color.getRed(), color.getGreen(), color.getBlue()); - } - - /** - * Set leather armor color - * - * @param r - red - * @param g - green - * @param b - blue - * @return - Return colored item - */ - public ItemColorArmor setColor(int r, int g, int b) { - int rgb = r << 16 | g << 8 | b; - CompoundTag tag = this.hasCompoundTag() ? this.getNamedTag() : new CompoundTag(); - tag.putInt("customColor", rgb); - this.setNamedTag(tag); - return this; - } - - /** - * Get color of Leather Item - * - * @return - BlockColor, or null if item has no color - */ - public BlockColor getColor() { - if (!this.hasCompoundTag()) return null; - CompoundTag tag = this.getNamedTag(); - if (!tag.exist("customColor")) return null; - int rgb = tag.getInt("customColor"); - return new BlockColor(rgb); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCompass.java b/src/main/java/cn/nukkit/item/ItemCompass.java deleted file mode 100644 index 626935709..000000000 --- a/src/main/java/cn/nukkit/item/ItemCompass.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemCompass extends Item { - - public ItemCompass() { - this(0, 1); - } - - public ItemCompass(Integer meta) { - this(meta, 1); - } - - public ItemCompass(Integer meta, int count) { - super(COMPASS, meta, count, "Compass"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCookie.java b/src/main/java/cn/nukkit/item/ItemCookie.java deleted file mode 100644 index 5088daced..000000000 --- a/src/main/java/cn/nukkit/item/ItemCookie.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemCookie extends ItemEdible { - - public ItemCookie() { - this(0, 1); - } - - public ItemCookie(Integer meta) { - this(meta, 1); - } - - public ItemCookie(Integer meta, int count) { - super(COOKIE, meta, count, "Cookie"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemCrossbow.java b/src/main/java/cn/nukkit/item/ItemCrossbow.java deleted file mode 100644 index a298eb9f6..000000000 --- a/src/main/java/cn/nukkit/item/ItemCrossbow.java +++ /dev/null @@ -1,169 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.entity.EntityShootBowEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.*; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -public class ItemCrossbow extends ItemBow { - - private int loadTick = 0; //TODO Improve this - - public ItemCrossbow() { - this(0, 1); - } - - public ItemCrossbow(Integer meta) { - this(meta, 1); - } - - public ItemCrossbow(Integer meta, int count) { - super(CROSSBOW, meta, count, "Crossbow"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_CROSSBOW; - } - - @Override - public boolean onUse(Player player, int ticksUsed) { - int needTickUsed = 20; - Enchantment enchantment = this.getEnchantment(Enchantment.ID_CROSSBOW_QUICK_CHARGE); - if (enchantment != null) { - needTickUsed -= enchantment.getLevel() * 5; //0.25s - } - - if (ticksUsed < needTickUsed) { - return true; - } - - Item itemArrow = Item.get(Item.ARROW, 0, 1); - - Inventory inventory = player.getOffhandInventory(); - - if (!inventory.contains(itemArrow) && !(inventory = player.getInventory()).contains(itemArrow) && player.isSurvival()) { - player.getOffhandInventory().sendContents(player); - inventory.sendContents(player); - return true; - } - - if (!this.isLoaded()) { - if (!player.isCreative()) { - if (!this.isUnbreakable()) { - Enchantment durability = this.getEnchantment(Enchantment.ID_DURABILITY); - if (!(durability != null && durability.getLevel() > 0 && (100 / (durability.getLevel() + 1)) <= Utils.random.nextInt(100))) { - this.setDamage(this.getDamage() + 2); - if (this.getDamage() >= DURABILITY_CROSSBOW) { - this.count--; - } - player.getInventory().setItemInHand(this); - } - } - - inventory.removeItem(itemArrow); - } - - this.loadArrow(player, itemArrow); - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_CROSSBOW_LOADING_END); - } - - return true; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return !this.launchArrow(player); - } - - @Override - public boolean onRelease(Player player, int ticksUsed) { - return true; - } - - public void loadArrow(Player player, Item arrow) { - if (arrow == null) return; - CompoundTag tag = this.getNamedTag() == null ? new CompoundTag() : this.getNamedTag(); - tag.putBoolean("Charged", true) - .putCompound("chargedItem", new CompoundTag("chargedItem") - .putByte("Count", arrow.getCount()) - .putShort("Damage", arrow.getDamage()) - .putString("Name", "minecraft:arrow")); - this.setCompoundTag(tag); - this.loadTick = Server.getInstance().getTick(); - player.getInventory().setItemInHand(this); - } - - public void useArrow(Player player) { - this.setCompoundTag(this.getNamedTag().putBoolean("Charged", false).remove("chargedItem")); - player.getInventory().setItemInHand(this); - } - - public boolean isLoaded() { - Tag itemInfo = this.getNamedTagEntry("chargedItem"); - if (itemInfo != null) { - CompoundTag tag = (CompoundTag) itemInfo; - return tag.getByte("Count") > 0 && tag.getString("Name") != null; - } - - return false; - } - - public boolean launchArrow(Player player) { - if (this.isLoaded() && Server.getInstance().getTick() - this.loadTick > 20) { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", player.x)) - .add(new DoubleTag("", player.y + player.getEyeHeight())) - .add(new DoubleTag("", player.z))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", -Math.sin(player.yaw / 180 * Math.PI) * Math.cos(player.pitch / 180 * Math.PI))) - .add(new DoubleTag("", -Math.sin(player.pitch / 180 * Math.PI))) - .add(new DoubleTag("", Math.cos(player.yaw / 180 * Math.PI) * Math.cos(player.pitch / 180 * Math.PI)))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", (player.yaw > 180 ? 360 : 0) - (float) player.yaw)) - .add(new FloatTag("", (float) -player.pitch))); - - EntityArrow arrow = new EntityArrow(player.chunk, nbt, player, false); - if (this.hasEnchantment(Enchantment.ID_CROSSBOW_PIERCING)) { - arrow.piercing = 1; - } - - EntityShootBowEvent entityShootBowEvent = new EntityShootBowEvent(player, this, arrow, 3.5); - Server.getInstance().getPluginManager().callEvent(entityShootBowEvent); - if (entityShootBowEvent.isCancelled()) { - entityShootBowEvent.getProjectile().close(); - player.getInventory().sendContents(player); - } else { - entityShootBowEvent.getProjectile().setMotion(entityShootBowEvent.getProjectile().getMotion().multiply(entityShootBowEvent.getForce())); - if (entityShootBowEvent.getProjectile() != null) { - EntityProjectile proj = entityShootBowEvent.getProjectile(); - ProjectileLaunchEvent projectev = new ProjectileLaunchEvent(proj); - Server.getInstance().getPluginManager().callEvent(projectev); - if (projectev.isCancelled()) { - proj.close(); - } else { - proj.spawnToAll(); - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_CROSSBOW_SHOOT); - this.useArrow(player); - } - } - } - return true; - } - return false; - } - - @Override - public int getEnchantAbility() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDiamond.java b/src/main/java/cn/nukkit/item/ItemDiamond.java deleted file mode 100644 index aa6c1e4a5..000000000 --- a/src/main/java/cn/nukkit/item/ItemDiamond.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemDiamond extends Item { - - public ItemDiamond() { - this(0, 1); - } - - public ItemDiamond(Integer meta) { - this(meta, 1); - } - - public ItemDiamond(Integer meta, int count) { - super(DIAMOND, 0, count, "Diamond"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDoorAcacia.java b/src/main/java/cn/nukkit/item/ItemDoorAcacia.java deleted file mode 100644 index 69175e8b0..000000000 --- a/src/main/java/cn/nukkit/item/ItemDoorAcacia.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -public class ItemDoorAcacia extends Item { - - public ItemDoorAcacia() { - this(0, 1); - } - - public ItemDoorAcacia(Integer meta) { - this(meta, 1); - } - - public ItemDoorAcacia(Integer meta, int count) { - super(ACACIA_DOOR, 0, count, "Acacia Door"); - this.block = Block.get(ACACIA_DOOR_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDoorBirch.java b/src/main/java/cn/nukkit/item/ItemDoorBirch.java deleted file mode 100644 index 9e0f5d522..000000000 --- a/src/main/java/cn/nukkit/item/ItemDoorBirch.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -public class ItemDoorBirch extends Item { - - public ItemDoorBirch() { - this(0, 1); - } - - public ItemDoorBirch(Integer meta) { - this(meta, 1); - } - - public ItemDoorBirch(Integer meta, int count) { - super(BIRCH_DOOR, 0, count, "Birch Door"); - this.block = Block.get(BIRCH_DOOR_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDoorDarkOak.java b/src/main/java/cn/nukkit/item/ItemDoorDarkOak.java deleted file mode 100644 index a89a23be1..000000000 --- a/src/main/java/cn/nukkit/item/ItemDoorDarkOak.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -public class ItemDoorDarkOak extends Item { - - public ItemDoorDarkOak() { - this(0, 1); - } - - public ItemDoorDarkOak(Integer meta) { - this(meta, 1); - } - - public ItemDoorDarkOak(Integer meta, int count) { - super(DARK_OAK_DOOR, 0, count, "Dark Oak Door"); - this.block = Block.get(DARK_OAK_DOOR_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDoorIron.java b/src/main/java/cn/nukkit/item/ItemDoorIron.java deleted file mode 100644 index a8af1ee0f..000000000 --- a/src/main/java/cn/nukkit/item/ItemDoorIron.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemDoorIron extends Item { - - public ItemDoorIron() { - this(0, 1); - } - - public ItemDoorIron(Integer meta) { - this(meta, 1); - } - - public ItemDoorIron(Integer meta, int count) { - super(IRON_DOOR, 0, count, "Iron Door"); - this.block = Block.get(IRON_DOOR_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDoorJungle.java b/src/main/java/cn/nukkit/item/ItemDoorJungle.java deleted file mode 100644 index 1e6bdeb7f..000000000 --- a/src/main/java/cn/nukkit/item/ItemDoorJungle.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -public class ItemDoorJungle extends Item { - - public ItemDoorJungle() { - this(0, 1); - } - - public ItemDoorJungle(Integer meta) { - this(meta, 1); - } - - public ItemDoorJungle(Integer meta, int count) { - super(JUNGLE_DOOR, 0, count, "Jungle Door"); - this.block = Block.get(JUNGLE_DOOR_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDoorSpruce.java b/src/main/java/cn/nukkit/item/ItemDoorSpruce.java deleted file mode 100644 index 541ed4aed..000000000 --- a/src/main/java/cn/nukkit/item/ItemDoorSpruce.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -public class ItemDoorSpruce extends Item { - - public ItemDoorSpruce() { - this(0, 1); - } - - public ItemDoorSpruce(Integer meta) { - this(meta, 1); - } - - public ItemDoorSpruce(Integer meta, int count) { - super(SPRUCE_DOOR, 0, count, "Spruce Door"); - this.block = Block.get(SPRUCE_DOOR_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDoorWood.java b/src/main/java/cn/nukkit/item/ItemDoorWood.java deleted file mode 100644 index 0ff0bd09f..000000000 --- a/src/main/java/cn/nukkit/item/ItemDoorWood.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemDoorWood extends Item { - - public ItemDoorWood() { - this(0, 1); - } - - public ItemDoorWood(Integer meta) { - this(meta, 1); - } - - public ItemDoorWood(Integer meta, int count) { - super(WOODEN_DOOR, 0, count, "Oak Door"); - this.block = Block.get(WOODEN_DOOR_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDragonBreath.java b/src/main/java/cn/nukkit/item/ItemDragonBreath.java deleted file mode 100644 index 3a33fe281..000000000 --- a/src/main/java/cn/nukkit/item/ItemDragonBreath.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemDragonBreath extends Item { - - public ItemDragonBreath() { - this(0, 1); - } - - public ItemDragonBreath(Integer meta) { - this(meta, 1); - } - - public ItemDragonBreath(Integer meta, int count) { - super(DRAGON_BREATH, 0, count, "Dragon Breath"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDriedKelp.java b/src/main/java/cn/nukkit/item/ItemDriedKelp.java deleted file mode 100644 index d31f7cc76..000000000 --- a/src/main/java/cn/nukkit/item/ItemDriedKelp.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by PetteriM1 - */ -public class ItemDriedKelp extends ItemEdible { - - public ItemDriedKelp() { - this(0, 1); - } - - public ItemDriedKelp(Integer meta) { - this(meta, 1); - } - - public ItemDriedKelp(Integer meta, int count) { - super(DRIED_KELP, 0, count, "Dried Kelp"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemDurable.java b/src/main/java/cn/nukkit/item/ItemDurable.java deleted file mode 100644 index cbce7bad9..000000000 --- a/src/main/java/cn/nukkit/item/ItemDurable.java +++ /dev/null @@ -1,7 +0,0 @@ -package cn.nukkit.item; - -/** - * Items that implement this interface can take damage and break. - */ -public interface ItemDurable { -} diff --git a/src/main/java/cn/nukkit/item/ItemDye.java b/src/main/java/cn/nukkit/item/ItemDye.java deleted file mode 100644 index f5fc027d1..000000000 --- a/src/main/java/cn/nukkit/item/ItemDye.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.utils.BlockColor; -import cn.nukkit.utils.DyeColor; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemDye extends Item { - - public static final int WHITE = DyeColor.WHITE.getDyeData(); - public static final int ORANGE = DyeColor.ORANGE.getDyeData(); - public static final int MAGENTA = DyeColor.MAGENTA.getDyeData(); - public static final int LIGHT_BLUE = DyeColor.LIGHT_BLUE.getDyeData(); - public static final int YELLOW = DyeColor.YELLOW.getDyeData(); - public static final int LIME = DyeColor.LIME.getDyeData(); - public static final int PINK = DyeColor.PINK.getDyeData(); - public static final int GRAY = DyeColor.GRAY.getDyeData(); - public static final int LIGHT_GRAY = DyeColor.LIGHT_GRAY.getDyeData(); - public static final int CYAN = DyeColor.CYAN.getDyeData(); - public static final int PURPLE = DyeColor.PURPLE.getDyeData(); - public static final int BLUE = DyeColor.BLUE.getDyeData(); - public static final int BROWN = DyeColor.BROWN.getDyeData(); - public static final int GREEN = DyeColor.GREEN.getDyeData(); - public static final int RED = DyeColor.RED.getDyeData(); - public static final int BLACK = DyeColor.BLACK.getDyeData(); - - public ItemDye() { - this(0, 1); - } - - public ItemDye(Integer meta) { - this(meta, 1); - } - - public ItemDye(DyeColor dyeColor) { - this(dyeColor.getDyeData(), 1); - } - - public ItemDye(DyeColor dyeColor, int amount) { - this(dyeColor.getDyeData(), amount); - } - - public ItemDye(Integer meta, int amount) { - super(DYE, meta, amount, "Dye"); - - if (this.meta == DyeColor.BROWN.getDyeData()) { - this.block = Block.get(BlockID.COCOA_BLOCK); - } - } - - public static BlockColor getColor(int meta) { - return DyeColor.getByDyeData(meta).getColor(); - } - - public DyeColor getDyeColor() { - return DyeColor.getByDyeData(meta); - } - - public static String getColorName(int meta) { - return DyeColor.getByDyeData(meta).getName(); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemEdible.java b/src/main/java/cn/nukkit/item/ItemEdible.java deleted file mode 100644 index 3a70988fc..000000000 --- a/src/main/java/cn/nukkit/item/ItemEdible.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.event.player.PlayerItemConsumeEvent; -import cn.nukkit.item.food.Food; -import cn.nukkit.level.Sound; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.ProtocolInfo; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class ItemEdible extends Item { - - public ItemEdible(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } - - public ItemEdible(int id) { - super(id); - } - - public ItemEdible(int id, Integer meta) { - super(id, meta); - } - - public ItemEdible(int id, Integer meta, int count) { - super(id, meta, count); - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - if (player.getFoodData().getLevel() < player.getFoodData().getMaxLevel() || player.isCreative()) { - return true; - } - if (player.protocol > ProtocolInfo.v1_12_0) { - player.getFoodData().sendFoodLevel(); - } - return false; - } - - @Override - public boolean onUse(Player player, int ticksUsed) { - if (ticksUsed < 10) return false; - PlayerItemConsumeEvent consumeEvent = new PlayerItemConsumeEvent(player, this); - - player.getServer().getPluginManager().callEvent(consumeEvent); - if (consumeEvent.isCancelled()) { - return false; // Inventory#sendContents is called in Player - } - - Food food = Food.getByRelative(this); - if (food != null && food.eatenBy(player)) { - player.getLevel().addSoundToViewers(player, Sound.RANDOM_BURP); - if (!player.isCreative() && !player.isSpectator()) { - --this.count; - player.getInventory().setItemInHand(this); - } - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemEgg.java b/src/main/java/cn/nukkit/item/ItemEgg.java deleted file mode 100644 index 52c180674..000000000 --- a/src/main/java/cn/nukkit/item/ItemEgg.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemEgg extends ProjectileItem { - - public ItemEgg() { - this(0, 1); - } - - public ItemEgg(Integer meta) { - this(meta, 1); - } - - public ItemEgg(Integer meta, int count) { - super(EGG, meta, count, "Egg"); - } - - @Override - public String getProjectileEntityType() { - return "Egg"; - } - - @Override - public float getThrowForce() { - return 1.5f; - } - - @Override - public int getMaxStackSize() { - return 16; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemElytra.java b/src/main/java/cn/nukkit/item/ItemElytra.java deleted file mode 100644 index 948b31556..000000000 --- a/src/main/java/cn/nukkit/item/ItemElytra.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemElytra extends ItemArmor { - - public ItemElytra() { - this(0, 1); - } - - public ItemElytra(Integer meta) { - this(meta, 1); - } - - public ItemElytra(Integer meta, int count) { - super(ELYTRA, meta, count, "Elytra"); - } - - @Override - public int getMaxDurability() { - return 431; - } - - @Override - public boolean isChestplate() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemEmerald.java b/src/main/java/cn/nukkit/item/ItemEmerald.java deleted file mode 100644 index 204ffcc76..000000000 --- a/src/main/java/cn/nukkit/item/ItemEmerald.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemEmerald extends Item { - - public ItemEmerald() { - this(0, 1); - } - - public ItemEmerald(Integer meta) { - this(meta, 1); - } - - public ItemEmerald(Integer meta, int count) { - super(EMERALD, meta, count, "Emerald"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemEmptyMap.java b/src/main/java/cn/nukkit/item/ItemEmptyMap.java deleted file mode 100644 index f43bc6ccb..000000000 --- a/src/main/java/cn/nukkit/item/ItemEmptyMap.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; - -public class ItemEmptyMap extends Item { - - public ItemEmptyMap() { - this(0, 1); - } - - public ItemEmptyMap(Integer meta) { - this(meta, 1); - } - - public ItemEmptyMap(Integer meta, int count) { - super(EMPTY_MAP, meta, count, "Empty Map"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (!player.isCreative()) { - this.count--; - } - player.getInventory().addItem(new ItemMap()); - return true; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - if (!player.isCreative()) { - this.count--; - } - player.getInventory().addItem(new ItemMap()); - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemEndCrystal.java b/src/main/java/cn/nukkit/item/ItemEndCrystal.java deleted file mode 100644 index 043d39bd0..000000000 --- a/src/main/java/cn/nukkit/item/ItemEndCrystal.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockBedrock; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockObsidian; -import cn.nukkit.entity.Entity; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; - -import java.util.concurrent.ThreadLocalRandom; - -public class ItemEndCrystal extends Item { - - public ItemEndCrystal() { - this(0, 1); - } - - public ItemEndCrystal(Integer meta) { - this(meta, 1); - } - - public ItemEndCrystal(Integer meta, int count) { - super(END_CRYSTAL, meta, count, "End Crystal"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (!(target instanceof BlockBedrock) && !(target instanceof BlockObsidian)) return false; - FullChunk chunk = level.getChunk((int) block.getX() >> 4, (int) block.getZ() >> 4); - if (chunk == null) { - return false; - } - - Block up = target.up(); - if (up.getId() != BlockID.AIR || up.up().getId() != BlockID.AIR) { - return false; - } - - Entity[] entities = level.getCollidingEntities(new AxisAlignedBB(target.x, target.y, target.z, target.x + 1, target.y + 2, target.z + 1)); - if (entities.length != 0) { - return false; - } - - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", target.x + 0.5)) - .add(new DoubleTag("", up.y)) - .add(new DoubleTag("", target.z + 0.5))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", ThreadLocalRandom.current().nextFloat() * 360)) - .add(new FloatTag("", 0))); - - if (this.hasCustomName()) { - nbt.putString("CustomName", this.getCustomName()); - } - - Entity entity = Entity.createEntity("EndCrystal", chunk, nbt); - - if (entity != null) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - - entity.spawnToAll(); - return true; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemEnderEye.java b/src/main/java/cn/nukkit/item/ItemEnderEye.java deleted file mode 100644 index 0c1e55cc9..000000000 --- a/src/main/java/cn/nukkit/item/ItemEnderEye.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemEnderEye extends Item { - - public ItemEnderEye() { - this(0, 1); - } - - public ItemEnderEye(Integer meta) { - this(meta, 1); - } - - public ItemEnderEye(Integer meta, int count) { - super(ENDER_EYE, meta, count, "Ender Eye"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemEnderPearl.java b/src/main/java/cn/nukkit/item/ItemEnderPearl.java deleted file mode 100644 index 138de386a..000000000 --- a/src/main/java/cn/nukkit/item/ItemEnderPearl.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.item; - -public class ItemEnderPearl extends ProjectileItem { - - public ItemEnderPearl() { - this(0, 1); - } - - public ItemEnderPearl(Integer meta) { - this(meta, 1); - } - - public ItemEnderPearl(Integer meta, int count) { - super(ENDER_PEARL, 0, count, "Ender Pearl"); - } - - @Override - public int getMaxStackSize() { - return 16; - } - - @Override - public String getProjectileEntityType() { - return "EnderPearl"; - } - - @Override - public float getThrowForce() { - return 1.5f; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemExpBottle.java b/src/main/java/cn/nukkit/item/ItemExpBottle.java deleted file mode 100644 index 6957e9162..000000000 --- a/src/main/java/cn/nukkit/item/ItemExpBottle.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.item; - -/** - * Created on 2015/12/25 by xtypr. - * Package cn.nukkit.item in project Nukkit . - */ -public class ItemExpBottle extends ProjectileItem { - - public ItemExpBottle() { - this(0, 1); - } - - public ItemExpBottle(Integer meta) { - this(meta, 1); - } - - public ItemExpBottle(Integer meta, int count) { - super(EXPERIENCE_BOTTLE, meta, count, "Bottle o' Enchanting"); - } - - @Override - public String getProjectileEntityType() { - return "ThrownExpBottle"; - } - - @Override - public float getThrowForce() { - return 1f; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFeather.java b/src/main/java/cn/nukkit/item/ItemFeather.java deleted file mode 100644 index d63b4187d..000000000 --- a/src/main/java/cn/nukkit/item/ItemFeather.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemFeather extends Item { - - public ItemFeather() { - this(0, 1); - } - - public ItemFeather(Integer meta) { - this(meta, 1); - } - - public ItemFeather(Integer meta, int count) { - super(FEATHER, 0, count, "Feather"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFireCharge.java b/src/main/java/cn/nukkit/item/ItemFireCharge.java deleted file mode 100644 index a19563cc7..000000000 --- a/src/main/java/cn/nukkit/item/ItemFireCharge.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.*; -import cn.nukkit.event.block.BlockIgniteEvent; -import cn.nukkit.level.Level; -import cn.nukkit.level.Sound; -import cn.nukkit.math.BlockFace; -import cn.nukkit.utils.Utils; - -/** - * Created by PetteriM1 - */ -public class ItemFireCharge extends Item { - - public ItemFireCharge() { - this(0, 1); - } - - public ItemFireCharge(Integer meta) { - this(meta, 1); - } - - public ItemFireCharge(Integer meta, int count) { - super(FIRE_CHARGE, 0, count, "Fire Charge"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (block.getId() == AIR && (target instanceof BlockSolid || target instanceof BlockSolidMeta || target instanceof BlockLeaves)) { - if (target.getId() == OBSIDIAN) { - if (level.createPortal(target, true)) { - return true; - } - } - - BlockFire fire = (BlockFire) Block.get(BlockID.FIRE); - fire.x = block.x; - fire.y = block.y; - fire.z = block.z; - fire.level = level; - - if (fire.isBlockTopFacingSurfaceSolid(fire.down()) || fire.canNeighborBurn()) { - BlockIgniteEvent e = new BlockIgniteEvent(block, null, player, BlockIgniteEvent.BlockIgniteCause.FIREBALL); - block.getLevel().getServer().getPluginManager().callEvent(e); - - if (!e.isCancelled()) { - level.setBlock(fire, fire, true); - level.scheduleUpdate(fire, Server.getInstance().suomiCraftPEMode() ? Utils.rand(200, 400) : (fire.tickRate() + Utils.random.nextInt(10))); - level.addSoundToViewers(block, Sound.MOB_GHAST_FIREBALL); - - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - } - return true; - } - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFirework.java b/src/main/java/cn/nukkit/item/ItemFirework.java deleted file mode 100644 index 57abba4e1..000000000 --- a/src/main/java/cn/nukkit/item/ItemFirework.java +++ /dev/null @@ -1,210 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.item.EntityFirework; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.DyeColor; -import org.apache.commons.math3.util.FastMath; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author CreeperFace - */ -public class ItemFirework extends Item { - - public ItemFirework() { - this(0); - } - - public ItemFirework(Integer meta) { - this(meta, 1); - } - - public ItemFirework(Integer meta, int count) { - super(FIREWORKS, meta, count, "Fireworks"); - - if (!hasCompoundTag() || !this.getNamedTag().contains("Fireworks")) { - CompoundTag tag = getNamedTag(); - if (tag == null) { - tag = new CompoundTag(); - - CompoundTag ex = new CompoundTag() - .putByteArray("FireworkColor", new byte[]{(byte) DyeColor.BLACK.getDyeData()}) - .putByteArray("FireworkFade", new byte[]{}) - .putBoolean("FireworkFlicker", false) - .putBoolean("FireworkTrail", false) - .putByte("FireworkType", FireworkExplosion.ExplosionType.CREEPER_SHAPED.ordinal()); - - tag.putCompound("Fireworks", new CompoundTag("Fireworks") - .putList(new ListTag("Explosions").add(ex)) - .putByte("Flight", 1) - ); - - this.setNamedTag(tag); - } - } - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (block.canPassThrough()) { - this.spawnFirework(level, block); - - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - - return true; - } - - return false; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - if (player.getInventory().getChestplateFast() instanceof ItemElytra && player.isGliding()) { - this.spawnFirework(player.getLevel(), player); - - if (!player.isCreative()) { - this.count--; - } - - player.setMotion(new Vector3( - -Math.sin(FastMath.toRadians(player.yaw)) * Math.cos(FastMath.toRadians(player.pitch)) * 2, - -Math.sin(FastMath.toRadians(player.pitch)) * 2, - Math.cos(FastMath.toRadians(player.yaw)) * Math.cos(FastMath.toRadians(player.pitch)) * 2)); - - return true; - } - - return false; - } - - public void addExplosion(FireworkExplosion explosion) { - List colors = explosion.getColors(); - List fades = explosion.getFades(); - - if (colors.isEmpty()) { - return; - } - byte[] clrs = new byte[colors.size()]; - for (int i = 0; i < clrs.length; i++) { - clrs[i] = (byte) colors.get(i).getDyeData(); - } - - byte[] fds = new byte[fades.size()]; - for (int i = 0; i < fds.length; i++) { - fds[i] = (byte) fades.get(i).getDyeData(); - } - - ListTag explosions = this.getNamedTag().getCompound("Fireworks").getList("Explosions", CompoundTag.class); - CompoundTag tag = new CompoundTag() - .putByteArray("FireworkColor", clrs) - .putByteArray("FireworkFade", fds) - .putBoolean("FireworkFlicker", explosion.flicker) - .putBoolean("FireworkTrail", explosion.trail) - .putByte("FireworkType", explosion.type.ordinal()); - - explosions.add(tag); - } - - public void clearExplosions() { - this.getNamedTag().getCompound("Fireworks").putList(new ListTag("Explosions")); - } - - private void spawnFirework(Level level, Vector3 pos) { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", pos.x + 0.5)) - .add(new DoubleTag("", pos.y + 0.5)) - .add(new DoubleTag("", pos.z + 0.5))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - .putCompound("FireworkItem", NBTIO.putItemHelper(this)); - - EntityFirework entity = new EntityFirework(level.getChunk(pos.getFloorX() >> 4, pos.getFloorZ() >> 4), nbt); - entity.spawnToAll(); - } - - public static class FireworkExplosion { - - private final List colors = new ArrayList<>(); - private final List fades = new ArrayList<>(); - private boolean flicker = false; - private boolean trail = false; - private ExplosionType type = ExplosionType.CREEPER_SHAPED; - - public List getColors() { - return this.colors; - } - - public List getFades() { - return this.fades; - } - - public boolean hasFlicker() { - return this.flicker; - } - - public boolean hasTrail() { - return this.trail; - } - - public ExplosionType getType() { - return this.type; - } - - public FireworkExplosion setFlicker(boolean flicker) { - this.flicker = flicker; - return this; - } - - public FireworkExplosion setTrail(boolean trail) { - this.trail = trail; - return this; - } - - public FireworkExplosion type(ExplosionType type) { - this.type = type; - return this; - } - - public FireworkExplosion addColor(DyeColor color) { - colors.add(color); - return this; - } - - public FireworkExplosion addFade(DyeColor fade) { - fades.add(fade); - return this; - } - - public enum ExplosionType { - SMALL_BALL, - LARGE_BALL, - STAR_SHAPED, - CREEPER_SHAPED, - BURST - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/item/ItemFireworkStar.java b/src/main/java/cn/nukkit/item/ItemFireworkStar.java deleted file mode 100644 index d78189f7d..000000000 --- a/src/main/java/cn/nukkit/item/ItemFireworkStar.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemFireworkStar extends Item { - - public ItemFireworkStar() { - this(0, 1); - } - - public ItemFireworkStar(Integer meta) { - this(meta, 1); - } - - public ItemFireworkStar(Integer meta, int count) { - super(FIREWORKSCHARGE, meta, count, "Firework Star"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFish.java b/src/main/java/cn/nukkit/item/ItemFish.java deleted file mode 100644 index f9c7c380a..000000000 --- a/src/main/java/cn/nukkit/item/ItemFish.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemFish extends ItemEdible { - - public ItemFish() { - this(0, 1); - } - - public ItemFish(Integer meta) { - this(meta, 1); - } - - public ItemFish(Integer meta, int count) { - super(RAW_FISH, meta, count, "Raw Fish"); - } - - protected ItemFish(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFishCooked.java b/src/main/java/cn/nukkit/item/ItemFishCooked.java deleted file mode 100644 index fe4a29c3f..000000000 --- a/src/main/java/cn/nukkit/item/ItemFishCooked.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemFishCooked extends ItemFish { - - public ItemFishCooked() { - this(0, 1); - } - - public ItemFishCooked(Integer meta) { - this(meta, 1); - } - - public ItemFishCooked(Integer meta, int count) { - super(COOKED_FISH, meta, count, "Cooked Fish"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFishingRod.java b/src/main/java/cn/nukkit/item/ItemFishingRod.java deleted file mode 100644 index a7fc6649d..000000000 --- a/src/main/java/cn/nukkit/item/ItemFishingRod.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.math.Vector3; - -public class ItemFishingRod extends ItemTool { - - public ItemFishingRod() { - this(0, 1); - } - - public ItemFishingRod(Integer meta) { - this(meta, 1); - } - - public ItemFishingRod(Integer meta, int count) { - super(FISHING_ROD, meta, count, "Fishing Rod"); - } - - @Override - public int getEnchantAbility() { - return 1; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - if (player.fishing != null) { - player.stopFishing(true); - } else { - player.startFishing(this); - this.meta++; - } - return true; - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_FISHING_ROD; - } - - @Override - public boolean noDamageOnAttack() { - return true; - } - - @Override - public boolean noDamageOnBreak() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFlint.java b/src/main/java/cn/nukkit/item/ItemFlint.java deleted file mode 100644 index c78a7444d..000000000 --- a/src/main/java/cn/nukkit/item/ItemFlint.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemFlint extends Item { - - public ItemFlint() { - this(0, 1); - } - - public ItemFlint(Integer meta) { - this(meta, 1); - } - - public ItemFlint(Integer meta, int count) { - super(FLINT, meta, count, "Flint"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFlintSteel.java b/src/main/java/cn/nukkit/item/ItemFlintSteel.java deleted file mode 100644 index 1b627cd28..000000000 --- a/src/main/java/cn/nukkit/item/ItemFlintSteel.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.*; -import cn.nukkit.event.block.BlockIgniteEvent; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemFlintSteel extends ItemTool { - - public ItemFlintSteel() { - this(0, 1); - } - - public ItemFlintSteel(Integer meta) { - this(meta, 1); - } - - public ItemFlintSteel(Integer meta, int count) { - super(FLINT_STEEL, meta, count, "Flint and Steel"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (player.isAdventure()) { - return false; - } - - if (block.getId() == AIR && (target instanceof BlockSolid || target instanceof BlockSolidMeta || target instanceof BlockLeaves)) { - if (target.getId() == OBSIDIAN) { - if (level.createPortal(target, false)) { - return true; - } - } - - BlockFire fire = (BlockFire) Block.get(BlockID.FIRE); - fire.x = block.x; - fire.y = block.y; - fire.z = block.z; - fire.level = level; - - if (fire.isBlockTopFacingSurfaceSolid(fire.down()) || fire.canNeighborBurn()) { - BlockIgniteEvent e = new BlockIgniteEvent(block, null, player, BlockIgniteEvent.BlockIgniteCause.FLINT_AND_STEEL); - block.getLevel().getServer().getPluginManager().callEvent(e); - - if (!e.isCancelled()) { - level.setBlock(fire, fire, true); - level.scheduleUpdate(fire, Server.getInstance().suomiCraftPEMode() ? Utils.rand(200, 400) : (fire.tickRate() + Utils.random.nextInt(10))); - level.addLevelSoundEvent(block, LevelSoundEventPacket.SOUND_IGNITE); - - if (!player.isCreative()) { - this.useOn(block); - if (this.getDamage() >= DURABILITY_FLINT_STEEL) { - this.count = 0; - } - player.getInventory().setItemInHand(this); - } - } - } - return true; - } - return false; - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_FLINT_STEEL; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemFlowerPot.java b/src/main/java/cn/nukkit/item/ItemFlowerPot.java deleted file mode 100644 index 7e84f8186..000000000 --- a/src/main/java/cn/nukkit/item/ItemFlowerPot.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * Created by Snake1999 on 2016/2/4. - * Package cn.nukkit.item in project Nukkit. - */ -public class ItemFlowerPot extends Item { - - public ItemFlowerPot() { - this(0, 1); - } - - public ItemFlowerPot(Integer meta) { - this(meta, 1); - } - - public ItemFlowerPot(Integer meta, int count) { - super(FLOWER_POT, meta, count, "Flower Pot"); - this.block = Block.get(Block.FLOWER_POT_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemGhastTear.java b/src/main/java/cn/nukkit/item/ItemGhastTear.java deleted file mode 100644 index b754438ca..000000000 --- a/src/main/java/cn/nukkit/item/ItemGhastTear.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemGhastTear extends Item { - - public ItemGhastTear() { - this(0, 1); - } - - public ItemGhastTear(Integer meta) { - this(meta, 1); - } - - public ItemGhastTear(Integer meta, int count) { - super(GHAST_TEAR, 0, count, "Ghast Tear"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemGlassBottle.java b/src/main/java/cn/nukkit/item/ItemGlassBottle.java deleted file mode 100644 index d73db93b8..000000000 --- a/src/main/java/cn/nukkit/item/ItemGlassBottle.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.item; - - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; - -public class ItemGlassBottle extends Item { - - public ItemGlassBottle() { - this(0, 1); - } - - public ItemGlassBottle(Integer meta) { - this(meta, 1); - } - - public ItemGlassBottle(Integer meta, int count) { - super(GLASS_BOTTLE, meta, count, "Glass Bottle"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (target.getId() == WATER || target.getId() == STILL_WATER) { - Item potion = new ItemPotion(); - - if (this.count == 1) { - player.getInventory().setItemInHand(potion); - } else if (this.count > 1) { - this.count--; - player.getInventory().setItemInHand(this); - if (player.getInventory().canAddItem(potion)) { - player.getInventory().addItem(potion); - } else { - player.getLevel().dropItem(player.add(0, 1.3, 0), potion, player.getDirectionVector().multiply(0.4)); - } - } - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemGlowstoneDust.java b/src/main/java/cn/nukkit/item/ItemGlowstoneDust.java deleted file mode 100644 index ae23ef502..000000000 --- a/src/main/java/cn/nukkit/item/ItemGlowstoneDust.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemGlowstoneDust extends Item { - - public ItemGlowstoneDust() { - this(0, 1); - } - - public ItemGlowstoneDust(Integer meta) { - this(meta, 1); - } - - public ItemGlowstoneDust(Integer meta, int count) { - super(GLOWSTONE_DUST, meta, count, "Glowstone Dust"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemGunpowder.java b/src/main/java/cn/nukkit/item/ItemGunpowder.java deleted file mode 100644 index a2225cfc3..000000000 --- a/src/main/java/cn/nukkit/item/ItemGunpowder.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemGunpowder extends Item { - - public ItemGunpowder() { - this(0, 1); - } - - public ItemGunpowder(Integer meta) { - this(meta, 1); - } - - public ItemGunpowder(Integer meta, int count) { - super(GUNPOWDER, meta, count, "Gunpowder"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHeartOfTheSea.java b/src/main/java/cn/nukkit/item/ItemHeartOfTheSea.java deleted file mode 100644 index 9a6ce93a6..000000000 --- a/src/main/java/cn/nukkit/item/ItemHeartOfTheSea.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemHeartOfTheSea extends Item { - - public ItemHeartOfTheSea() { - this(0, 1); - } - - public ItemHeartOfTheSea(Integer meta) { - this(meta, 1); - } - - public ItemHeartOfTheSea(Integer meta, int count) { - super(HEART_OF_THE_SEA, meta, count, "Heart Of The Sea"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHelmetChain.java b/src/main/java/cn/nukkit/item/ItemHelmetChain.java deleted file mode 100644 index c1b5abdcb..000000000 --- a/src/main/java/cn/nukkit/item/ItemHelmetChain.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHelmetChain extends ItemArmor { - - public ItemHelmetChain() { - this(0, 1); - } - - public ItemHelmetChain(Integer meta) { - this(meta, 1); - } - - public ItemHelmetChain(Integer meta, int count) { - super(CHAIN_HELMET, meta, count, "Chain Helmet"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_CHAIN; - } - - @Override - public boolean isHelmet() { - return true; - } - - @Override - public int getArmorPoints() { - return 2; - } - - @Override - public int getMaxDurability() { - return 166; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHelmetDiamond.java b/src/main/java/cn/nukkit/item/ItemHelmetDiamond.java deleted file mode 100644 index ba759c055..000000000 --- a/src/main/java/cn/nukkit/item/ItemHelmetDiamond.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHelmetDiamond extends ItemArmor { - - public ItemHelmetDiamond() { - this(0, 1); - } - - public ItemHelmetDiamond(Integer meta) { - this(meta, 1); - } - - public ItemHelmetDiamond(Integer meta, int count) { - super(DIAMOND_HELMET, meta, count, "Diamond Helmet"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_DIAMOND; - } - - @Override - public boolean isHelmet() { - return true; - } - - @Override - public int getArmorPoints() { - return 3; - } - - @Override - public int getMaxDurability() { - return 364; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHelmetGold.java b/src/main/java/cn/nukkit/item/ItemHelmetGold.java deleted file mode 100644 index b08e69e4d..000000000 --- a/src/main/java/cn/nukkit/item/ItemHelmetGold.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHelmetGold extends ItemArmor { - - public ItemHelmetGold() { - this(0, 1); - } - - public ItemHelmetGold(Integer meta) { - this(meta, 1); - } - - public ItemHelmetGold(Integer meta, int count) { - super(GOLD_HELMET, meta, count, "Golden Helmet"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_GOLD; - } - - @Override - public boolean isHelmet() { - return true; - } - - @Override - public int getArmorPoints() { - return 2; - } - - @Override - public int getMaxDurability() { - return 78; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHelmetIron.java b/src/main/java/cn/nukkit/item/ItemHelmetIron.java deleted file mode 100644 index aad54957f..000000000 --- a/src/main/java/cn/nukkit/item/ItemHelmetIron.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHelmetIron extends ItemArmor { - - public ItemHelmetIron() { - this(0, 1); - } - - public ItemHelmetIron(Integer meta) { - this(meta, 1); - } - - public ItemHelmetIron(Integer meta, int count) { - super(IRON_HELMET, meta, count, "Iron Helmet"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_IRON; - } - - @Override - public boolean isHelmet() { - return true; - } - - @Override - public int getArmorPoints() { - return 2; - } - - @Override - public int getMaxDurability() { - return 166; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHelmetLeather.java b/src/main/java/cn/nukkit/item/ItemHelmetLeather.java deleted file mode 100644 index e3ed24f71..000000000 --- a/src/main/java/cn/nukkit/item/ItemHelmetLeather.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHelmetLeather extends ItemColorArmor { - - public ItemHelmetLeather() { - this(0, 1); - } - - public ItemHelmetLeather(Integer meta) { - this(meta, 1); - } - - public ItemHelmetLeather(Integer meta, int count) { - super(LEATHER_CAP, meta, count, "Leather Cap"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_LEATHER; - } - - @Override - public boolean isHelmet() { - return true; - } - - @Override - public int getArmorPoints() { - return 1; - } - - @Override - public int getMaxDurability() { - return 56; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHelmetNetherite.java b/src/main/java/cn/nukkit/item/ItemHelmetNetherite.java deleted file mode 100644 index 4f6b45146..000000000 --- a/src/main/java/cn/nukkit/item/ItemHelmetNetherite.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.item; - -public class ItemHelmetNetherite extends ItemArmor { - - public ItemHelmetNetherite() { - this(0, 1); - } - - public ItemHelmetNetherite(Integer meta) { - this(meta, 1); - } - - public ItemHelmetNetherite(Integer meta, int count) { - super(NETHERITE_HELMET, meta, count, "Netherite Helmet"); - } - - @Override - public boolean isHelmet() { - return true; - } - - @Override - public int getTier() { - return ItemArmor.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return 407; - } - - @Override - public int getArmorPoints() { - return 3; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHoeDiamond.java b/src/main/java/cn/nukkit/item/ItemHoeDiamond.java deleted file mode 100644 index 0f117442e..000000000 --- a/src/main/java/cn/nukkit/item/ItemHoeDiamond.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHoeDiamond extends ItemTool { - - public ItemHoeDiamond() { - this(0, 1); - } - - public ItemHoeDiamond(Integer meta) { - this(meta, 1); - } - - public ItemHoeDiamond(Integer meta, int count) { - super(DIAMOND_HOE, meta, count, "Diamond Hoe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_DIAMOND; - } - - @Override - public boolean isHoe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_DIAMOND; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHoeGold.java b/src/main/java/cn/nukkit/item/ItemHoeGold.java deleted file mode 100644 index ade2b243e..000000000 --- a/src/main/java/cn/nukkit/item/ItemHoeGold.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHoeGold extends ItemTool { - - public ItemHoeGold() { - this(0, 1); - } - - public ItemHoeGold(Integer meta) { - this(meta, 1); - } - - public ItemHoeGold(Integer meta, int count) { - super(GOLD_HOE, meta, count, "Golden Hoe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_GOLD; - } - - @Override - public boolean isHoe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_GOLD; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHoeIron.java b/src/main/java/cn/nukkit/item/ItemHoeIron.java deleted file mode 100644 index 0411990f0..000000000 --- a/src/main/java/cn/nukkit/item/ItemHoeIron.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHoeIron extends ItemTool { - - public ItemHoeIron() { - this(0, 1); - } - - public ItemHoeIron(Integer meta) { - this(meta, 1); - } - - public ItemHoeIron(Integer meta, int count) { - super(IRON_HOE, meta, count, "Iron Hoe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_IRON; - } - - @Override - public boolean isHoe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_IRON; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHoeNetherite.java b/src/main/java/cn/nukkit/item/ItemHoeNetherite.java deleted file mode 100644 index 69de33522..000000000 --- a/src/main/java/cn/nukkit/item/ItemHoeNetherite.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.item; - -public class ItemHoeNetherite extends ItemTool { - - public ItemHoeNetherite() { - this(0, 1); - } - - public ItemHoeNetherite(Integer meta) { - this(meta, 1); - } - - public ItemHoeNetherite(Integer meta, int count) { - super(NETHERITE_HOE, meta, count, "Netherite Hoe"); - } - - @Override - public boolean isHoe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_NETHERITE; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHoeStone.java b/src/main/java/cn/nukkit/item/ItemHoeStone.java deleted file mode 100644 index ea195ed0d..000000000 --- a/src/main/java/cn/nukkit/item/ItemHoeStone.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHoeStone extends ItemTool { - - public ItemHoeStone() { - this(0, 1); - } - - public ItemHoeStone(Integer meta) { - this(meta, 1); - } - - public ItemHoeStone(Integer meta, int count) { - super(STONE_HOE, meta, count, "Stone Hoe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_STONE; - } - - @Override - public boolean isHoe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_STONE; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHoeWood.java b/src/main/java/cn/nukkit/item/ItemHoeWood.java deleted file mode 100644 index 98c30e01a..000000000 --- a/src/main/java/cn/nukkit/item/ItemHoeWood.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemHoeWood extends ItemTool { - - public ItemHoeWood() { - this(0, 1); - } - - public ItemHoeWood(Integer meta) { - this(meta, 1); - } - - public ItemHoeWood(Integer meta, int count) { - super(WOODEN_HOE, meta, count, "Wooden Hoe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_WOODEN; - } - - @Override - public boolean isHoe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_WOODEN; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHoneyBottle.java b/src/main/java/cn/nukkit/item/ItemHoneyBottle.java deleted file mode 100644 index 292515ae2..000000000 --- a/src/main/java/cn/nukkit/item/ItemHoneyBottle.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.math.Vector3; -import cn.nukkit.potion.Effect; - -public class ItemHoneyBottle extends ItemEdible { - - public ItemHoneyBottle() { - this(0, 1); - } - - public ItemHoneyBottle(Integer meta) { - this(meta, 1); - } - - public ItemHoneyBottle(Integer meta, int count) { - super(HONEY_BOTTLE, meta, count, "Honey Bottle"); - } - - @Override - public int getMaxStackSize() { - return 16; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return true; - } - - @Override - public boolean onUse(Player player, int ticksUsed) { - if (ticksUsed < 10) return false; - super.onUse(player, ticksUsed); - - if (player.hasEffect(Effect.POISON)) { - player.removeEffect(Effect.POISON); - } - - if (!player.isCreative()) { - this.count--; - player.getInventory().setItemInHand(this); - player.getInventory().addItem(Item.get(ItemID.BOTTLE, 0, 1)); - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHoneycomb.java b/src/main/java/cn/nukkit/item/ItemHoneycomb.java deleted file mode 100644 index 99c633abd..000000000 --- a/src/main/java/cn/nukkit/item/ItemHoneycomb.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemHoneycomb extends Item { - - public ItemHoneycomb() { - this(0, 1); - } - - public ItemHoneycomb(Integer meta) { - this(meta, 1); - } - - public ItemHoneycomb(Integer meta, int count) { - super(HONEYCOMB, meta, count, "Honeycomb"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHopper.java b/src/main/java/cn/nukkit/item/ItemHopper.java deleted file mode 100644 index 95c76cbc7..000000000 --- a/src/main/java/cn/nukkit/item/ItemHopper.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * Created by CreeperFace on 13.5.2017. - */ -public class ItemHopper extends Item { - - public ItemHopper() { - this(0); - } - - public ItemHopper(Integer meta) { - this(meta, 1); - } - - public ItemHopper(Integer meta, int count) { - super(HOPPER, 0, count, "Hopper"); - this.block = Block.get(HOPPER_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHorseArmorDiamond.java b/src/main/java/cn/nukkit/item/ItemHorseArmorDiamond.java deleted file mode 100644 index adc81255e..000000000 --- a/src/main/java/cn/nukkit/item/ItemHorseArmorDiamond.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item; - -public class ItemHorseArmorDiamond extends Item { - - public ItemHorseArmorDiamond() { - this(0, 0); - } - - public ItemHorseArmorDiamond(Integer meta) { - this(meta, 0); - } - - public ItemHorseArmorDiamond(Integer meta, int count) { - super(DIAMOND_HORSE_ARMOR, meta, count, "Diamond Horse Armor"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHorseArmorGold.java b/src/main/java/cn/nukkit/item/ItemHorseArmorGold.java deleted file mode 100644 index dfbf50396..000000000 --- a/src/main/java/cn/nukkit/item/ItemHorseArmorGold.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item; - -public class ItemHorseArmorGold extends Item { - - public ItemHorseArmorGold() { - this(0, 0); - } - - public ItemHorseArmorGold(Integer meta) { - this(meta, 0); - } - - public ItemHorseArmorGold(Integer meta, int count) { - super(GOLD_HORSE_ARMOR, meta, count, "Golden Horse Armor"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHorseArmorIron.java b/src/main/java/cn/nukkit/item/ItemHorseArmorIron.java deleted file mode 100644 index 90d31071a..000000000 --- a/src/main/java/cn/nukkit/item/ItemHorseArmorIron.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item; - -public class ItemHorseArmorIron extends Item { - - public ItemHorseArmorIron() { - this(0, 0); - } - - public ItemHorseArmorIron(Integer meta) { - this(meta, 0); - } - - public ItemHorseArmorIron(Integer meta, int count) { - super(IRON_HORSE_ARMOR, meta, count, "Iron Horse Armor"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemHorseArmorLeather.java b/src/main/java/cn/nukkit/item/ItemHorseArmorLeather.java deleted file mode 100644 index 99c0437f3..000000000 --- a/src/main/java/cn/nukkit/item/ItemHorseArmorLeather.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item; - -public class ItemHorseArmorLeather extends Item { - - public ItemHorseArmorLeather() { - this(0, 1); - } - - public ItemHorseArmorLeather(Integer meta) { - this(meta, 1); - } - - public ItemHorseArmorLeather(Integer meta, int count) { - super(LEATHER_HORSE_ARMOR, meta, count, "Leather Horse Armor"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemID.java b/src/main/java/cn/nukkit/item/ItemID.java deleted file mode 100644 index d28c7876c..000000000 --- a/src/main/java/cn/nukkit/item/ItemID.java +++ /dev/null @@ -1,304 +0,0 @@ -package cn.nukkit.item; - -/** - * List of item IDs - */ -public interface ItemID { - - int IRON_SHOVEL = 256; - int IRON_PICKAXE = 257; - int IRON_AXE = 258; - int FLINT_STEEL = 259; - int FLINT_AND_STEEL = 259; - int APPLE = 260; - int BOW = 261; - int ARROW = 262; - int COAL = 263; - int DIAMOND = 264; - int IRON_INGOT = 265; - int GOLD_INGOT = 266; - int IRON_SWORD = 267; - int WOODEN_SWORD = 268; - int WOODEN_SHOVEL = 269; - int WOODEN_PICKAXE = 270; - int WOODEN_AXE = 271; - int STONE_SWORD = 272; - int STONE_SHOVEL = 273; - int STONE_PICKAXE = 274; - int STONE_AXE = 275; - int DIAMOND_SWORD = 276; - int DIAMOND_SHOVEL = 277; - int DIAMOND_PICKAXE = 278; - int DIAMOND_AXE = 279; - int STICK = 280; - int STICKS = 280; - int BOWL = 281; - int MUSHROOM_STEW = 282; - int GOLD_SWORD = 283; - int GOLDEN_SWORD = 283; - int GOLD_SHOVEL = 284; - int GOLDEN_SHOVEL = 284; - int GOLD_PICKAXE = 285; - int GOLDEN_PICKAXE = 285; - int GOLD_AXE = 286; - int GOLDEN_AXE = 286; - int STRING = 287; - int FEATHER = 288; - int GUNPOWDER = 289; - int WOODEN_HOE = 290; - int STONE_HOE = 291; - int IRON_HOE = 292; - int DIAMOND_HOE = 293; - int GOLD_HOE = 294; - int GOLDEN_HOE = 294; - int SEEDS = 295; - int WHEAT_SEEDS = 295; - int WHEAT = 296; - int BREAD = 297; - int LEATHER_CAP = 298; - int LEATHER_HELMET = 298; - int LEATHER_TUNIC = 299; - int LEATHER_CHESTPLATE = 299; - int LEATHER_PANTS = 300; - int LEATHER_LEGGINGS = 300; - int LEATHER_BOOTS = 301; - int CHAIN_HELMET = 302; - int CHAIN_CHESTPLATE = 303; - int CHAIN_LEGGINGS = 304; - int CHAIN_BOOTS = 305; - int IRON_HELMET = 306; - int IRON_CHESTPLATE = 307; - int IRON_LEGGINGS = 308; - int IRON_BOOTS = 309; - int DIAMOND_HELMET = 310; - int DIAMOND_CHESTPLATE = 311; - int DIAMOND_LEGGINGS = 312; - int DIAMOND_BOOTS = 313; - int GOLD_HELMET = 314; - int GOLDEN_HELMET = 314; - int GOLD_CHESTPLATE = 315; - int GOLDEN_CHESTPLATE = 315; - int GOLD_LEGGINGS = 316; - int GOLDEN_LEGGINGS = 316; - int GOLD_BOOTS = 317; - int GOLDEN_BOOTS = 317; - int FLINT = 318; - int RAW_PORKCHOP = 319; - int COOKED_PORKCHOP = 320; - int PAINTING = 321; - int GOLDEN_APPLE = 322; - int SIGN = 323; - int WOODEN_DOOR = 324; - int BUCKET = 325; - // 326 - 327 not yet in Minecraft - int MINECART = 328; - int SADDLE = 329; - int IRON_DOOR = 330; - int REDSTONE = 331; - int REDSTONE_DUST = 331; - int SNOWBALL = 332; - int BOAT = 333; - int LEATHER = 334; - int KELP = 335; - int BRICK = 336; - int CLAY = 337; - int CLAY_BALL = 337; - int SUGARCANE = 338; - int SUGAR_CANE = 338; - int SUGAR_CANES = 338; - int PAPER = 339; - int BOOK = 340; - int SLIMEBALL = 341; - int MINECART_WITH_CHEST = 342; - // 343 not yet in Minecraft - int EGG = 344; - int COMPASS = 345; - int FISHING_ROD = 346; - int CLOCK = 347; - int GLOWSTONE_DUST = 348; - int RAW_FISH = 349; - int COOKED_FISH = 350; - int DYE = 351; - int BONE = 352; - int SUGAR = 353; - int CAKE = 354; - int BED = 355; - int REPEATER = 356; - int COOKIE = 357; - int MAP = 358; - int SHEARS = 359; - int MELON = 360; - int MELON_SLICE = 360; - int PUMPKIN_SEEDS = 361; - int MELON_SEEDS = 362; - int RAW_BEEF = 363; - int STEAK = 364; - int COOKED_BEEF = 364; - int RAW_CHICKEN = 365; - int COOKED_CHICKEN = 366; - int ROTTEN_FLESH = 367; - int ENDER_PEARL = 368; - int BLAZE_ROD = 369; - int GHAST_TEAR = 370; - int GOLD_NUGGET = 371; - int GOLDEN_NUGGET = 371; - int NETHER_WART = 372; - int POTION = 373; - int GLASS_BOTTLE = 374; - int BOTTLE = 374; - int SPIDER_EYE = 375; - int FERMENTED_SPIDER_EYE = 376; - int BLAZE_POWDER = 377; - int MAGMA_CREAM = 378; - int BREWING_STAND = 379; - int BREWING = 379; - int CAULDRON = 380; - int ENDER_EYE = 381; - int GLISTERING_MELON = 382; - int SPAWN_EGG = 383; - int EXPERIENCE_BOTTLE = 384; - int FIRE_CHARGE = 385; - int BOOK_AND_QUILL = 386; - int WRITTEN_BOOK = 387; - int EMERALD = 388; - int ITEM_FRAME = 389; - int FRAME = 389; - int FLOWER_POT = 390; - int CARROT = 391; - int CARROTS = 391; - int POTATO = 392; - int POTATOES = 392; - int BAKED_POTATO = 393; - int BAKED_POTATOES = 393; - int POISONOUS_POTATO = 394; - int EMPTY_MAP = 395; - int EMPTYMAP = 395; - int GOLDEN_CARROT = 396; - int SKULL = 397; - int CARROTONASTICK = 398; - int CARROT_ON_A_STICK = 398; - int NETHER_STAR = 399; - int PUMPKIN_PIE = 400; - int FIREWORKS = 401; - int FIREWORKSCHARGE = 402; - int ENCHANTED_BOOK = 403; - int ENCHANT_BOOK = 403; - int COMPARATOR = 404; - int NETHER_BRICK = 405; - int QUARTZ = 406; - int NETHER_QUARTZ = 406; - int MINECART_WITH_TNT = 407; - int MINECART_WITH_HOPPER = 408; - int PRISMARINE_SHARD = 409; - int HOPPER = 410; - int RAW_RABBIT = 411; - int COOKED_RABBIT = 412; - int RABBIT_STEW = 413; - int RABBIT_FOOT = 414; - int RABBIT_HIDE = 415; - int LEATHER_HORSE_ARMOR = 416; - int IRON_HORSE_ARMOR = 417; - int GOLD_HORSE_ARMOR = 418; - int GOLDEN_HORSE_ARMOR = 418; - int DIAMOND_HORSE_ARMOR = 419; - int LEAD = 420; - int NAME_TAG = 421; - int PRISMARINE_CRYSTALS = 422; - int RAW_MUTTON = 423; - int COOKED_MUTTON = 424; - int ARMOR_STAND = 425; - int END_CRYSTAL = 426; - int SPRUCE_DOOR = 427; - int BIRCH_DOOR = 428; - int JUNGLE_DOOR = 429; - int ACACIA_DOOR = 430; - int DARK_OAK_DOOR = 431; - int CHORUS_FRUIT = 432; - int POPPED_CHORUS_FRUIT = 433; - int BANNER_PATTERN = 434; - // 435 - 436 not yet in Minecraft - int DRAGON_BREATH = 437; - int SPLASH_POTION = 438; - // 439 - 440 not yet in Minecraft - int LINGERING_POTION = 441; - int SPARKLER = 442; - int COMMAND_BLOCK_MINECART = 443; - int ELYTRA = 444; - int SHULKER_SHELL = 445; - int BANNER = 446; - int EYE_DROP = 447; - int BALLOON = 448; - int SUPER_FERTILIZER = 449; - int TOTEM = 450; - int BLEACH = 451; - int IRON_NUGGET = 452; - int ICE_BOMB = 453; - // 454 not yet in Minecraft - int TRIDENT = 455; - // 456 not yet in Minecraft - int BEETROOT = 457; - int BEETROOT_SEEDS = 458; - int BEETROOT_SEED = 458; - int BEETROOT_SOUP = 459; - int RAW_SALMON = 460; - int CLOWNFISH = 461; - int PUFFERFISH = 462; - int COOKED_SALMON = 463; - int DRIED_KELP = 464; - int NAUTILUS_SHELL = 465; - int GOLDEN_APPLE_ENCHANTED = 466; - int HEART_OF_THE_SEA = 467; - int SCUTE = 468; - int TURTLE_SHELL = 469; - int TURTLE_HELMET = 469; - int PHANTOM_MEMBRANE = 470; - int CROSSBOW = 471; - int SPRUCE_SIGN = 472; - int BIRCH_SIGN = 473; - int JUNGLE_SIGN = 474; - int ACACIA_SIGN = 475; - int DARKOAK_SIGN = 476; - int SWEET_BERRIES = 477; - // 478 - 497 not yet in Minecraft - int CAMERA = 498; - int COMPOUND = 499; - int RECORD_13 = 500; - int RECORD_CAT = 501; - int RECORD_BLOCKS = 502; - int RECORD_CHIRP = 503; - int RECORD_FAR = 504; - int RECORD_MALL = 505; - int RECORD_MELLOHI = 506; - int RECORD_STAL = 507; - int RECORD_STRAD = 508; - int RECORD_WARD = 509; - int RECORD_11 = 510; - int RECORD_WAIT = 511; - // 512 not yet in Minecraft - int SHIELD = 513; - // 514 - 733 not yet in Minecraft - int SUSPICIOUS_STEW = 734; - // 735 not yet in Minecraft - int HONEYCOMB = 736; - int HONEY_BOTTLE = 737; - // 738 - 740 not yet in Minecraft - int LODESTONECOMPASS = 741; - int LODESTONE_COMPASS = 741; - int NETHERITE_INGOT = 742; - int NETHERITE_SWORD = 743; - int NETHERITE_SHOVEL = 744; - int NETHERITE_PICKAXE = 745; - int NETHERITE_AXE = 746; - int NETHERITE_HOE = 747; - int NETHERITE_HELMET = 748; - int NETHERITE_CHESTPLATE = 749; - int NETHERITE_LEGGINGS = 750; - int NETHERITE_BOOTS = 751; - int NETHERITE_SCRAP = 752; - // - int WARPED_FUNGUS_ON_A_STICK = 757; - // - int RECORD_PIGSTEP = 759; - // - int SPYGLASS = 772; -} diff --git a/src/main/java/cn/nukkit/item/ItemIngotGold.java b/src/main/java/cn/nukkit/item/ItemIngotGold.java deleted file mode 100644 index bb0ade3ab..000000000 --- a/src/main/java/cn/nukkit/item/ItemIngotGold.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemIngotGold extends Item { - - public ItemIngotGold() { - this(0, 1); - } - - public ItemIngotGold(Integer meta) { - this(meta, 1); - } - - public ItemIngotGold(Integer meta, int count) { - super(GOLD_INGOT, 0, count, "Gold Ingot"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemIngotIron.java b/src/main/java/cn/nukkit/item/ItemIngotIron.java deleted file mode 100644 index f1fc33a77..000000000 --- a/src/main/java/cn/nukkit/item/ItemIngotIron.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemIngotIron extends Item { - - public ItemIngotIron() { - this(0, 1); - } - - public ItemIngotIron(Integer meta) { - this(meta, 1); - } - - public ItemIngotIron(Integer meta, int count) { - super(IRON_INGOT, 0, count, "Iron Ingot"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemIngotNetherite.java b/src/main/java/cn/nukkit/item/ItemIngotNetherite.java deleted file mode 100644 index e7bf8de4c..000000000 --- a/src/main/java/cn/nukkit/item/ItemIngotNetherite.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemIngotNetherite extends Item { - - public ItemIngotNetherite() { - this(0, 1); - } - - public ItemIngotNetherite(Integer meta) { - this(meta, 1); - } - - public ItemIngotNetherite(Integer meta, int count) { - super(NETHERITE_INGOT, 0, count, "Netherite Ingot"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemItemFrame.java b/src/main/java/cn/nukkit/item/ItemItemFrame.java deleted file mode 100644 index b32df6747..000000000 --- a/src/main/java/cn/nukkit/item/ItemItemFrame.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * Created by Pub4Game on 03.07.2016. - */ -public class ItemItemFrame extends Item { - - public ItemItemFrame() { - this(0, 1); - } - - public ItemItemFrame(Integer meta) { - this(meta, 1); - } - - public ItemItemFrame(Integer meta, int count) { - super(ITEM_FRAME, meta, count, "Item Frame"); - this.block = Block.get(ITEM_FRAME_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLadder.java b/src/main/java/cn/nukkit/item/ItemLadder.java deleted file mode 100644 index 96a338fad..000000000 --- a/src/main/java/cn/nukkit/item/ItemLadder.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemLadder extends Item { - - public ItemLadder() { - this(0, 1); - } - - public ItemLadder(Integer meta) { - this(meta, 1); - } - - public ItemLadder(Integer meta, int count) { - super(LADDER, 0, count, "Ladder"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLead.java b/src/main/java/cn/nukkit/item/ItemLead.java deleted file mode 100644 index dd32343f9..000000000 --- a/src/main/java/cn/nukkit/item/ItemLead.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemLead extends Item { - - public ItemLead() { - this(0, 1); - } - - public ItemLead(Integer meta) { - this(meta, 1); - } - - public ItemLead(Integer meta, int count) { - super(LEAD, 0, count, "Lead"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLeather.java b/src/main/java/cn/nukkit/item/ItemLeather.java deleted file mode 100644 index 8addfb1ad..000000000 --- a/src/main/java/cn/nukkit/item/ItemLeather.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemLeather extends Item { - - public ItemLeather() { - this(0, 1); - } - - public ItemLeather(Integer meta) { - this(meta, 1); - } - - public ItemLeather(Integer meta, int count) { - super(LEATHER, meta, count, "Leather"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLeggingsChain.java b/src/main/java/cn/nukkit/item/ItemLeggingsChain.java deleted file mode 100644 index 7ba791071..000000000 --- a/src/main/java/cn/nukkit/item/ItemLeggingsChain.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemLeggingsChain extends ItemArmor { - - public ItemLeggingsChain() { - this(0, 1); - } - - public ItemLeggingsChain(Integer meta) { - this(meta, 1); - } - - public ItemLeggingsChain(Integer meta, int count) { - super(CHAIN_LEGGINGS, meta, count, "Chain Leggings"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_CHAIN; - } - - @Override - public boolean isLeggings() { - return true; - } - - @Override - public int getArmorPoints() { - return 4; - } - - @Override - public int getMaxDurability() { - return 226; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLeggingsDiamond.java b/src/main/java/cn/nukkit/item/ItemLeggingsDiamond.java deleted file mode 100644 index d7648af67..000000000 --- a/src/main/java/cn/nukkit/item/ItemLeggingsDiamond.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemLeggingsDiamond extends ItemArmor { - - public ItemLeggingsDiamond() { - this(0, 1); - } - - public ItemLeggingsDiamond(Integer meta) { - this(meta, 1); - } - - public ItemLeggingsDiamond(Integer meta, int count) { - super(DIAMOND_LEGGINGS, meta, count, "Diamond Leggings"); - } - - @Override - public boolean isLeggings() { - return true; - } - - @Override - public int getTier() { - return ItemArmor.TIER_DIAMOND; - } - - @Override - public int getArmorPoints() { - return 6; - } - - @Override - public int getMaxDurability() { - return 496; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLeggingsGold.java b/src/main/java/cn/nukkit/item/ItemLeggingsGold.java deleted file mode 100644 index b653688be..000000000 --- a/src/main/java/cn/nukkit/item/ItemLeggingsGold.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemLeggingsGold extends ItemArmor { - - public ItemLeggingsGold() { - this(0, 1); - } - - public ItemLeggingsGold(Integer meta) { - this(meta, 1); - } - - public ItemLeggingsGold(Integer meta, int count) { - super(GOLD_LEGGINGS, meta, count, "Golden Leggings"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_GOLD; - } - - @Override - public boolean isLeggings() { - return true; - } - - @Override - public int getArmorPoints() { - return 3; - } - - @Override - public int getMaxDurability() { - return 106; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLeggingsIron.java b/src/main/java/cn/nukkit/item/ItemLeggingsIron.java deleted file mode 100644 index 3c591e629..000000000 --- a/src/main/java/cn/nukkit/item/ItemLeggingsIron.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemLeggingsIron extends ItemArmor { - - public ItemLeggingsIron() { - this(0, 1); - } - - public ItemLeggingsIron(Integer meta) { - this(meta, 1); - } - - public ItemLeggingsIron(Integer meta, int count) { - super(IRON_LEGGINGS, meta, count, "Iron Leggings"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_IRON; - } - - @Override - public boolean isLeggings() { - return true; - } - - @Override - public int getArmorPoints() { - return 5; - } - - @Override - public int getMaxDurability() { - return 226; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLeggingsLeather.java b/src/main/java/cn/nukkit/item/ItemLeggingsLeather.java deleted file mode 100644 index d107fb1b5..000000000 --- a/src/main/java/cn/nukkit/item/ItemLeggingsLeather.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemLeggingsLeather extends ItemColorArmor { - - public ItemLeggingsLeather() { - this(0, 1); - } - - public ItemLeggingsLeather(Integer meta) { - this(meta, 1); - } - - public ItemLeggingsLeather(Integer meta, int count) { - super(LEATHER_PANTS, meta, count, "Leather Pants"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_LEATHER; - } - - @Override - public boolean isLeggings() { - return true; - } - - @Override - public int getArmorPoints() { - return 2; - } - - @Override - public int getMaxDurability() { - return 76; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemLeggingsNetherite.java b/src/main/java/cn/nukkit/item/ItemLeggingsNetherite.java deleted file mode 100644 index a7e0298fe..000000000 --- a/src/main/java/cn/nukkit/item/ItemLeggingsNetherite.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.item; - -public class ItemLeggingsNetherite extends ItemArmor { - - public ItemLeggingsNetherite() { - this(0, 1); - } - - public ItemLeggingsNetherite(Integer meta) { - this(meta, 1); - } - - public ItemLeggingsNetherite(Integer meta, int count) { - super(NETHERITE_LEGGINGS, meta, count, "Netherite Leggings"); - } - - @Override - public boolean isLeggings() { - return true; - } - - @Override - public int getTier() { - return ItemArmor.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return 555; - } - - @Override - public int getArmorPoints() { - return 6; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMagmaCream.java b/src/main/java/cn/nukkit/item/ItemMagmaCream.java deleted file mode 100644 index 63a74fa16..000000000 --- a/src/main/java/cn/nukkit/item/ItemMagmaCream.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemMagmaCream extends Item { - - public ItemMagmaCream() { - this(0, 1); - } - - public ItemMagmaCream(Integer meta) { - this(meta, 1); - } - - public ItemMagmaCream(Integer meta, int count) { - super(MAGMA_CREAM, 0, count, "Magma Cream"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMap.java b/src/main/java/cn/nukkit/item/ItemMap.java deleted file mode 100644 index e647b2925..000000000 --- a/src/main/java/cn/nukkit/item/ItemMap.java +++ /dev/null @@ -1,126 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.ClientboundMapItemDataPacket; -import cn.nukkit.utils.MainLogger; - -import javax.imageio.ImageIO; -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; - -/** - * Created by CreeperFace on 18.3.2017. - */ -public class ItemMap extends Item { - - public static int mapCount = 0; - - private BufferedImage image; - - public ItemMap() { - this(0, 1); - } - - public ItemMap(Integer meta) { - this(meta, 1); - } - - public ItemMap(Integer meta, int count) { - super(MAP, meta, count, "Map"); - - if (!hasCompoundTag() || !getNamedTag().contains("map_uuid")) { - CompoundTag tag = new CompoundTag(); - tag.putLong("map_uuid", mapCount++); - this.setNamedTag(tag); - } - } - - public void setImage(File file) throws IOException { - setImage(ImageIO.read(file)); - } - - public void setImage(BufferedImage image) { - try { - if (image.getHeight() != 128 || image.getWidth() != 128) { - this.image = new BufferedImage(128, 128, image.getType()); - Graphics2D g = this.image.createGraphics(); - g.drawImage(image, 0, 0, 128, 128, null); - g.dispose(); - } else { - this.image = image; - } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(this.image, "png", baos); - - this.setNamedTag(this.getNamedTag().putByteArray("Colors", baos.toByteArray())); - baos.close(); - } catch (IOException e) { - MainLogger.getLogger().logException(e); - } - } - - protected BufferedImage loadImageFromNBT() { - try { - byte[] data = getNamedTag().getByteArray("Colors"); - image = ImageIO.read(new ByteArrayInputStream(data)); - return image; - } catch (IOException e) { - MainLogger.getLogger().logException(e); - } - - return null; - } - - public long getMapId() { - return getNamedTag().getLong("map_uuid"); - } - - public void sendImage(Player p) { - // Don't load the image from NBT if it has been done before - BufferedImage image = this.image != null ? this.image : loadImageFromNBT(); - - ClientboundMapItemDataPacket pk = new ClientboundMapItemDataPacket(); - pk.mapId = getMapId(); - pk.update = 2; - pk.scale = 0; - pk.width = 128; - pk.height = 128; - pk.offsetX = 0; - pk.offsetZ = 0; - pk.image = image; - - p.dataPacket(pk); - } - - public boolean trySendImage(Player p) { - BufferedImage image = this.image != null ? this.image : loadImageFromNBT(); - if (image == null) return false; - ClientboundMapItemDataPacket pk = new ClientboundMapItemDataPacket(); - pk.mapId = getMapId(); - pk.update = 2; - pk.scale = 0; - pk.width = 128; - pk.height = 128; - pk.offsetX = 0; - pk.offsetZ = 0; - pk.image = image; - p.dataPacket(pk); - return true; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMelon.java b/src/main/java/cn/nukkit/item/ItemMelon.java deleted file mode 100644 index cfcc63bad..000000000 --- a/src/main/java/cn/nukkit/item/ItemMelon.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemMelon extends ItemEdible { - - public ItemMelon() { - this(0, 1); - } - - public ItemMelon(Integer meta) { - this(meta, 1); - } - - public ItemMelon(Integer meta, int count) { - super(MELON, meta, count, "Melon"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMelonGlistering.java b/src/main/java/cn/nukkit/item/ItemMelonGlistering.java deleted file mode 100644 index 461bdfab7..000000000 --- a/src/main/java/cn/nukkit/item/ItemMelonGlistering.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemMelonGlistering extends Item { - - public ItemMelonGlistering() { - this(0, 1); - } - - public ItemMelonGlistering(Integer meta) { - this(meta, 1); - } - - public ItemMelonGlistering(Integer meta, int count) { - super(GLISTERING_MELON, 0, count, "Glistering Melon"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMinecart.java b/src/main/java/cn/nukkit/item/ItemMinecart.java deleted file mode 100644 index 8de7015f2..000000000 --- a/src/main/java/cn/nukkit/item/ItemMinecart.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockRail; -import cn.nukkit.entity.item.EntityMinecartEmpty; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.Rail; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemMinecart extends Item { - - public ItemMinecart() { - this(0, 1); - } - - public ItemMinecart(Integer meta) { - this(meta, 1); - } - - public ItemMinecart(Integer meta, int count) { - super(MINECART, meta, count, "Minecart"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (Rail.isRailBlock(target)) { - Rail.Orientation type = ((BlockRail) target).getOrientation(); - double adjacent = 0.0D; - if (type.isAscending()) { - adjacent = 0.5D; - } - EntityMinecartEmpty minecart = new EntityMinecartEmpty( - level.getChunk(target.getFloorX() >> 4, target.getFloorZ() >> 4), new CompoundTag("") - .putList(new ListTag<>("Pos") - .add(new DoubleTag("", target.getX() + 0.5)) - .add(new DoubleTag("", target.getY() + 0.0625D + adjacent)) - .add(new DoubleTag("", target.getZ() + 0.5))) - .putList(new ListTag<>("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag<>("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - ); - minecart.spawnToAll(); - count -= 1; - return true; - } - return false; - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMinecartChest.java b/src/main/java/cn/nukkit/item/ItemMinecartChest.java deleted file mode 100644 index fdee794e6..000000000 --- a/src/main/java/cn/nukkit/item/ItemMinecartChest.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockRail; -import cn.nukkit.entity.item.EntityMinecartChest; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.Rail; - -public class ItemMinecartChest extends Item { - - public ItemMinecartChest() { - this(0, 1); - } - - public ItemMinecartChest(Integer meta) { - this(meta, 1); - } - - public ItemMinecartChest(Integer meta, int count) { - super(MINECART_WITH_CHEST, meta, count, "Minecart with Chest"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (Rail.isRailBlock(target)) { - Rail.Orientation type = ((BlockRail) target).getOrientation(); - double adjacent = 0.0D; - if (type.isAscending()) { - adjacent = 0.5D; - } - EntityMinecartChest minecart = new EntityMinecartChest( - level.getChunk(target.getFloorX() >> 4, target.getFloorZ() >> 4), new CompoundTag("") - .putList(new ListTag<>("Pos") - .add(new DoubleTag("", target.getX() + 0.5)) - .add(new DoubleTag("", target.getY() + 0.0625D + adjacent)) - .add(new DoubleTag("", target.getZ() + 0.5))) - .putList(new ListTag<>("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag<>("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - ); - minecart.spawnToAll(); - count -= 1; - return true; - } - return false; - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMinecartHopper.java b/src/main/java/cn/nukkit/item/ItemMinecartHopper.java deleted file mode 100644 index 46b9d2865..000000000 --- a/src/main/java/cn/nukkit/item/ItemMinecartHopper.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockRail; -import cn.nukkit.entity.item.EntityMinecartHopper; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.Rail; - -public class ItemMinecartHopper extends Item { - - public ItemMinecartHopper() { - this(0, 1); - } - - public ItemMinecartHopper(Integer meta) { - this(meta, 1); - } - - public ItemMinecartHopper(Integer meta, int count) { - super(MINECART_WITH_HOPPER, meta, count, "Minecart with Hopper"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (Rail.isRailBlock(target)) { - Rail.Orientation type = ((BlockRail) target).getOrientation(); - double adjacent = 0.0D; - if (type.isAscending()) { - adjacent = 0.5D; - } - EntityMinecartHopper minecart = new EntityMinecartHopper( - level.getChunk(target.getFloorX() >> 4, target.getFloorZ() >> 4), new CompoundTag("") - .putList(new ListTag<>("Pos") - .add(new DoubleTag("", target.getX() + 0.5)) - .add(new DoubleTag("", target.getY() + 0.0625D + adjacent)) - .add(new DoubleTag("", target.getZ() + 0.5))) - .putList(new ListTag<>("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag<>("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - ); - minecart.spawnToAll(); - count -= 1; - return true; - } - return false; - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMinecartTNT.java b/src/main/java/cn/nukkit/item/ItemMinecartTNT.java deleted file mode 100644 index 51a9d1c93..000000000 --- a/src/main/java/cn/nukkit/item/ItemMinecartTNT.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockRail; -import cn.nukkit.entity.item.EntityMinecartTNT; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.Rail; - -public class ItemMinecartTNT extends Item { - - public ItemMinecartTNT() { - this(0, 1); - } - - public ItemMinecartTNT(Integer meta) { - this(meta, 1); - } - - public ItemMinecartTNT(Integer meta, int count) { - super(MINECART_WITH_TNT, meta, count, "Minecart with TNT"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (Rail.isRailBlock(target)) { - Rail.Orientation type = ((BlockRail) target).getOrientation(); - double adjacent = 0.0D; - if (type.isAscending()) { - adjacent = 0.5D; - } - EntityMinecartTNT minecart = new EntityMinecartTNT( - level.getChunk(target.getFloorX() >> 4, target.getFloorZ() >> 4), new CompoundTag("") - .putList(new ListTag<>("Pos") - .add(new DoubleTag("", target.getX() + 0.5)) - .add(new DoubleTag("", target.getY() + 0.0625D + adjacent)) - .add(new DoubleTag("", target.getZ() + 0.5))) - .putList(new ListTag<>("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag<>("Rotation") - .add(new FloatTag("", 0)) - .add(new FloatTag("", 0))) - ); - minecart.spawnToAll(); - count -= 1; - return true; - } - return false; - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMushroomStew.java b/src/main/java/cn/nukkit/item/ItemMushroomStew.java deleted file mode 100644 index 579c190ba..000000000 --- a/src/main/java/cn/nukkit/item/ItemMushroomStew.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemMushroomStew extends ItemEdible { - - public ItemMushroomStew() { - this(0, 1); - } - - public ItemMushroomStew(Integer meta) { - this(meta, 1); - } - - public ItemMushroomStew(Integer meta, int count) { - super(MUSHROOM_STEW, 0, count, "Mushroom Stew"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMuttonCooked.java b/src/main/java/cn/nukkit/item/ItemMuttonCooked.java deleted file mode 100644 index 803984a19..000000000 --- a/src/main/java/cn/nukkit/item/ItemMuttonCooked.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemMuttonCooked extends ItemEdible { - - public ItemMuttonCooked() { - this(0, 1); - } - - public ItemMuttonCooked(Integer meta) { - this(meta, 1); - } - - public ItemMuttonCooked(Integer meta, int count) { - super(COOKED_MUTTON, meta, count, "Cooked Mutton"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemMuttonRaw.java b/src/main/java/cn/nukkit/item/ItemMuttonRaw.java deleted file mode 100644 index b66d0b1b3..000000000 --- a/src/main/java/cn/nukkit/item/ItemMuttonRaw.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemMuttonRaw extends ItemEdible { - - public ItemMuttonRaw() { - this(0, 1); - } - - public ItemMuttonRaw(Integer meta) { - this(meta, 1); - } - - public ItemMuttonRaw(Integer meta, int count) { - super(RAW_MUTTON, meta, count, "Raw Mutton"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemNameTag.java b/src/main/java/cn/nukkit/item/ItemNameTag.java deleted file mode 100644 index 917cfff3c..000000000 --- a/src/main/java/cn/nukkit/item/ItemNameTag.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemNameTag extends Item { - - public ItemNameTag() { - this(0, 1); - } - - public ItemNameTag(Integer meta) { - this(meta, 1); - } - - public ItemNameTag(Integer meta, int count) { - super(NAME_TAG, 0, count, "Name Tag"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemNautilusShell.java b/src/main/java/cn/nukkit/item/ItemNautilusShell.java deleted file mode 100644 index 60da5bfa3..000000000 --- a/src/main/java/cn/nukkit/item/ItemNautilusShell.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemNautilusShell extends Item { - - public ItemNautilusShell() { - this(0, 1); - } - - public ItemNautilusShell(Integer meta) { - this(meta, 1); - } - - public ItemNautilusShell(Integer meta, int count) { - super(NAUTILUS_SHELL, meta, count, "Nautilus Shell"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemNetherBrick.java b/src/main/java/cn/nukkit/item/ItemNetherBrick.java deleted file mode 100644 index b3facadd8..000000000 --- a/src/main/java/cn/nukkit/item/ItemNetherBrick.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemNetherBrick extends Item { - - public ItemNetherBrick() { - this(0, 1); - } - - public ItemNetherBrick(Integer meta) { - this(meta, 1); - } - - public ItemNetherBrick(Integer meta, int count) { - super(NETHER_BRICK, meta, count, "Nether Brick"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemNetherStar.java b/src/main/java/cn/nukkit/item/ItemNetherStar.java deleted file mode 100644 index 345a349e2..000000000 --- a/src/main/java/cn/nukkit/item/ItemNetherStar.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemNetherStar extends Item { - - public ItemNetherStar() { - this(0, 1); - } - - public ItemNetherStar(Integer meta) { - this(meta, 1); - } - - public ItemNetherStar(Integer meta, int count) { - super(NETHER_STAR, 0, count, "Nether Star"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemNetherWart.java b/src/main/java/cn/nukkit/item/ItemNetherWart.java deleted file mode 100644 index fecf4d918..000000000 --- a/src/main/java/cn/nukkit/item/ItemNetherWart.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * Created by Leonidius20 on 22.03.17. - */ -public class ItemNetherWart extends Item { - - public ItemNetherWart() { - this(0, 1); - } - - public ItemNetherWart(Integer meta) { - this(meta, 1); - } - - public ItemNetherWart(Integer meta, int count) { - super(NETHER_WART, meta, count, "Nether Wart"); - this.block = Block.get(NETHER_WART_BLOCK, meta); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemNuggetGold.java b/src/main/java/cn/nukkit/item/ItemNuggetGold.java deleted file mode 100644 index ec7819572..000000000 --- a/src/main/java/cn/nukkit/item/ItemNuggetGold.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemNuggetGold extends Item { - - public ItemNuggetGold() { - this(0, 1); - } - - public ItemNuggetGold(Integer meta) { - this(meta, 1); - } - - public ItemNuggetGold(Integer meta, int count) { - super(GOLD_NUGGET, meta, count, "Gold Nugget"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemNuggetIron.java b/src/main/java/cn/nukkit/item/ItemNuggetIron.java deleted file mode 100644 index f144d5b2c..000000000 --- a/src/main/java/cn/nukkit/item/ItemNuggetIron.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemNuggetIron extends Item { - - public ItemNuggetIron() { - this(0, 1); - } - - public ItemNuggetIron(Integer meta) { - this(meta, 1); - } - - public ItemNuggetIron(Integer meta, int count) { - super(IRON_NUGGET, meta, count, "Iron Nugget"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPainting.java b/src/main/java/cn/nukkit/item/ItemPainting.java deleted file mode 100644 index 11730b69e..000000000 --- a/src/main/java/cn/nukkit/item/ItemPainting.java +++ /dev/null @@ -1,129 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.item.EntityPainting; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPainting extends Item { - - private static final int[] DIRECTION = {2, 3, 4, 5}; - private static final int[] RIGHT = {4, 5, 3, 2}; - private static final double OFFSET = 0.53125; - - public ItemPainting() { - this(0, 1); - } - - public ItemPainting(Integer meta) { - this(meta, 1); - } - - public ItemPainting(Integer meta, int count) { - super(PAINTING, 0, count, "Painting"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (player.isAdventure() || target.isTransparent() || face.getHorizontalIndex() == -1 || block.isSolid()) { - return false; - } - - FullChunk chunk = level.getChunk((int) block.getX() >> 4, (int) block.getZ() >> 4); - if (chunk == null) { - return false; - } - - List validMotives = new ArrayList<>(); - for (EntityPainting.Motive motive : EntityPainting.motives) { - boolean valid = true; - for (int x = 0; x < motive.width && valid; x++) { - for (int z = 0; z < motive.height && valid; z++) { - if (target.getSide(BlockFace.fromIndex(RIGHT[face.getIndex() - 2]), x).isTransparent() || - target.up(z).isTransparent() || - block.getSide(BlockFace.fromIndex(RIGHT[face.getIndex() - 2]), x).isSolid() || - block.up(z).isSolid()) { - valid = false; - } - } - } - - if (valid) { - validMotives.add(motive); - } - } - int direction = DIRECTION[face.getIndex() - 2]; - EntityPainting.Motive motive = validMotives.get(Utils.random.nextInt(validMotives.size())); - - Vector3 position = new Vector3(target.x + 0.5, target.y + 0.5, target.z + 0.5); - double widthOffset = offset(motive.width); - - switch (face.getHorizontalIndex()) { - case 0: - position.x += widthOffset; - position.z += OFFSET; - break; - case 1: - position.x -= OFFSET; - position.z += widthOffset; - break; - case 2: - position.x -= widthOffset; - position.z -= OFFSET; - break; - case 3: - position.x += OFFSET; - position.z -= widthOffset; - break; - } - position.y += offset(motive.height); - - CompoundTag nbt = new CompoundTag() - .putByte("Direction", direction) - .putString("Motive", motive.title) - .putList(new ListTag("Pos") - .add(new DoubleTag("0", position.x)) - .add(new DoubleTag("1", position.y)) - .add(new DoubleTag("2", position.z))) - .putList(new ListTag("Motion") - .add(new DoubleTag("0", 0)) - .add(new DoubleTag("1", 0)) - .add(new DoubleTag("2", 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("0", direction * 90)) - .add(new FloatTag("1", 0))); - - EntityPainting entity = new EntityPainting(chunk, nbt); - - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - entity.spawnToAll(); - - return true; - } - - private static double offset(int value) { - return value > 1 ? 0.5 : 0; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPaper.java b/src/main/java/cn/nukkit/item/ItemPaper.java deleted file mode 100644 index 5d4201253..000000000 --- a/src/main/java/cn/nukkit/item/ItemPaper.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPaper extends Item { - - public ItemPaper() { - this(0, 1); - } - - public ItemPaper(Integer meta) { - this(meta, 1); - } - - public ItemPaper(Integer meta, int count) { - super(PAPER, meta, count, "Paper"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPhantomMembrane.java b/src/main/java/cn/nukkit/item/ItemPhantomMembrane.java deleted file mode 100644 index 21ed3c6d6..000000000 --- a/src/main/java/cn/nukkit/item/ItemPhantomMembrane.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemPhantomMembrane extends Item { - - public ItemPhantomMembrane() { - this(0, 1); - } - - public ItemPhantomMembrane(Integer meta) { - this(meta, 1); - } - - public ItemPhantomMembrane(Integer meta, int count) { - super(PHANTOM_MEMBRANE, meta, count, "Phantom Membrane"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPickaxeDiamond.java b/src/main/java/cn/nukkit/item/ItemPickaxeDiamond.java deleted file mode 100644 index e0072afea..000000000 --- a/src/main/java/cn/nukkit/item/ItemPickaxeDiamond.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPickaxeDiamond extends ItemTool { - - public ItemPickaxeDiamond() { - this(0, 1); - } - - public ItemPickaxeDiamond(Integer meta) { - this(meta, 1); - } - - public ItemPickaxeDiamond(Integer meta, int count) { - super(DIAMOND_PICKAXE, meta, count, "Diamond Pickaxe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_DIAMOND; - } - - @Override - public boolean isPickaxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_DIAMOND; - } - - @Override - public int getAttackDamage() { - return 5; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPickaxeGold.java b/src/main/java/cn/nukkit/item/ItemPickaxeGold.java deleted file mode 100644 index 654c3f18e..000000000 --- a/src/main/java/cn/nukkit/item/ItemPickaxeGold.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPickaxeGold extends ItemTool { - - public ItemPickaxeGold() { - this(0, 1); - } - - public ItemPickaxeGold(Integer meta) { - this(meta, 1); - } - - public ItemPickaxeGold(Integer meta, int count) { - super(GOLD_PICKAXE, meta, count, "Golden Pickaxe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_GOLD; - } - - @Override - public boolean isPickaxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_GOLD; - } - - @Override - public int getAttackDamage() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPickaxeIron.java b/src/main/java/cn/nukkit/item/ItemPickaxeIron.java deleted file mode 100644 index 77d636a29..000000000 --- a/src/main/java/cn/nukkit/item/ItemPickaxeIron.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPickaxeIron extends ItemTool { - - public ItemPickaxeIron() { - this(0, 1); - } - - public ItemPickaxeIron(Integer meta) { - this(meta, 1); - } - - public ItemPickaxeIron(Integer meta, int count) { - super(IRON_PICKAXE, meta, count, "Iron Pickaxe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_IRON; - } - - @Override - public boolean isPickaxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_IRON; - } - - @Override - public int getAttackDamage() { - return 4; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPickaxeNetherite.java b/src/main/java/cn/nukkit/item/ItemPickaxeNetherite.java deleted file mode 100644 index 7c58e92b9..000000000 --- a/src/main/java/cn/nukkit/item/ItemPickaxeNetherite.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.item; - -public class ItemPickaxeNetherite extends ItemTool { - - public ItemPickaxeNetherite() { - this(0, 1); - } - - public ItemPickaxeNetherite(Integer meta) { - this(meta, 1); - } - - public ItemPickaxeNetherite(Integer meta, int count) { - super(NETHERITE_PICKAXE, meta, count, "Netherite Pickaxe"); - } - - @Override - public boolean isPickaxe() { - return true; - } - - @Override - public int getAttackDamage() { - return 6; - } - - @Override - public int getTier() { - return ItemTool.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_NETHERITE; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPickaxeStone.java b/src/main/java/cn/nukkit/item/ItemPickaxeStone.java deleted file mode 100644 index 72ad598e4..000000000 --- a/src/main/java/cn/nukkit/item/ItemPickaxeStone.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPickaxeStone extends ItemTool { - - public ItemPickaxeStone() { - this(0, 1); - } - - public ItemPickaxeStone(Integer meta) { - this(meta, 1); - } - - public ItemPickaxeStone(Integer meta, int count) { - super(STONE_PICKAXE, meta, count, "Stone Pickaxe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_STONE; - } - - @Override - public boolean isPickaxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_STONE; - } - - @Override - public int getAttackDamage() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPickaxeWood.java b/src/main/java/cn/nukkit/item/ItemPickaxeWood.java deleted file mode 100644 index ab4e339b8..000000000 --- a/src/main/java/cn/nukkit/item/ItemPickaxeWood.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPickaxeWood extends ItemTool { - - public ItemPickaxeWood() { - this(0, 1); - } - - public ItemPickaxeWood(Integer meta) { - this(meta, 1); - } - - public ItemPickaxeWood(Integer meta, int count) { - super(WOODEN_PICKAXE, meta, count, "Wooden Pickaxe"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_WOODEN; - } - - @Override - public boolean isPickaxe() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_WOODEN; - } - - @Override - public int getAttackDamage() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPorkchopCooked.java b/src/main/java/cn/nukkit/item/ItemPorkchopCooked.java deleted file mode 100644 index 090047625..000000000 --- a/src/main/java/cn/nukkit/item/ItemPorkchopCooked.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPorkchopCooked extends ItemEdible { - - public ItemPorkchopCooked() { - this(0, 1); - } - - public ItemPorkchopCooked(Integer meta) { - this(meta, 1); - } - - public ItemPorkchopCooked(Integer meta, int count) { - super(COOKED_PORKCHOP, meta, count, "Cooked Porkchop"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPorkchopRaw.java b/src/main/java/cn/nukkit/item/ItemPorkchopRaw.java deleted file mode 100644 index c40c2bb5a..000000000 --- a/src/main/java/cn/nukkit/item/ItemPorkchopRaw.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPorkchopRaw extends ItemEdible { - - public ItemPorkchopRaw() { - this(0, 1); - } - - public ItemPorkchopRaw(Integer meta) { - this(meta, 1); - } - - public ItemPorkchopRaw(Integer meta, int count) { - super(RAW_PORKCHOP, meta, count, "Raw Porkchop"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPotato.java b/src/main/java/cn/nukkit/item/ItemPotato.java deleted file mode 100644 index 915f32e05..000000000 --- a/src/main/java/cn/nukkit/item/ItemPotato.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPotato extends ItemEdible { - - public ItemPotato() { - this(0, 1); - } - - public ItemPotato(Integer meta) { - this(meta, 1); - } - - public ItemPotato(Integer meta, int count) { - super(POTATO, meta, count, "Potato"); - this.block = Block.get(POTATO_BLOCK); - } - - protected ItemPotato(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPotatoBaked.java b/src/main/java/cn/nukkit/item/ItemPotatoBaked.java deleted file mode 100644 index 6c0d9f1fc..000000000 --- a/src/main/java/cn/nukkit/item/ItemPotatoBaked.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPotatoBaked extends ItemEdible { - - public ItemPotatoBaked() { - this(0, 1); - } - - public ItemPotatoBaked(Integer meta) { - this(meta, 1); - } - - public ItemPotatoBaked(Integer meta, int count) { - super(BAKED_POTATO, meta, count, "Baked Potato"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPotatoPoisonous.java b/src/main/java/cn/nukkit/item/ItemPotatoPoisonous.java deleted file mode 100644 index 54799cf48..000000000 --- a/src/main/java/cn/nukkit/item/ItemPotatoPoisonous.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemPotatoPoisonous extends ItemPotato { - - public ItemPotatoPoisonous() { - this(0, 1); - } - - public ItemPotatoPoisonous(Integer meta) { - this(meta, 1); - } - - public ItemPotatoPoisonous(Integer meta, int count) { - super(POISONOUS_POTATO, meta, count, "Poisonous Potato"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPotion.java b/src/main/java/cn/nukkit/item/ItemPotion.java deleted file mode 100644 index cbabed0ba..000000000 --- a/src/main/java/cn/nukkit/item/ItemPotion.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.event.player.PlayerItemConsumeEvent; -import cn.nukkit.math.Vector3; -import cn.nukkit.potion.Potion; - -public class ItemPotion extends Item { - - public static final int NO_EFFECTS = 0; - public static final int MUNDANE = 1; - public static final int MUNDANE_II = 2; - public static final int THICK = 3; - public static final int AWKWARD = 4; - public static final int NIGHT_VISION = 5; - public static final int NIGHT_VISION_LONG = 6; - public static final int INVISIBLE = 7; - public static final int INVISIBLE_LONG = 8; - public static final int LEAPING = 9; - public static final int LEAPING_LONG = 10; - public static final int LEAPING_II = 11; - public static final int FIRE_RESISTANCE = 12; - public static final int FIRE_RESISTANCE_LONG = 13; - public static final int SPEED = 14; - public static final int SPEED_LONG = 15; - public static final int SPEED_II = 16; - public static final int SLOWNESS = 17; - public static final int SLOWNESS_LONG = 18; - public static final int WATER_BREATHING = 19; - public static final int WATER_BREATHING_LONG = 20; - public static final int INSTANT_HEALTH = 21; - public static final int INSTANT_HEALTH_II = 22; - public static final int HARMING = 23; - public static final int HARMING_II = 24; - public static final int POISON = 25; - public static final int POISON_LONG = 26; - public static final int POISON_II = 27; - public static final int REGENERATION = 28; - public static final int REGENERATION_LONG = 29; - public static final int REGENERATION_II = 30; - public static final int STRENGTH = 31; - public static final int STRENGTH_LONG = 32; - public static final int STRENGTH_II = 33; - public static final int WEAKNESS = 34; - public static final int WEAKNESS_LONG = 35; - public static final int DECAY = 36; - - public ItemPotion() { - this(0, 1); - } - - public ItemPotion(Integer meta) { - this(meta, 1); - } - - public ItemPotion(Integer meta, int count) { - super(POTION, meta, count, "Potion"); - } - - @Override - public int getMaxStackSize() { - return 1; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return true; - } - - @Override - public boolean onUse(Player player, int ticksUsed) { - if (player.protocol < 388) return true; - if (ticksUsed < 10) return false; - PlayerItemConsumeEvent consumeEvent = new PlayerItemConsumeEvent(player, this); - player.getServer().getPluginManager().callEvent(consumeEvent); - if (consumeEvent.isCancelled()) { - return false; - } - Potion potion = Potion.getPotion(this.getDamage()).setSplash(false); - - if (!player.isCreative()) { - --this.count; - player.getInventory().setItemInHand(this); - player.getInventory().addItem(new ItemGlassBottle()); - } - - if (potion != null) { - potion.applyPotion(player); - } - return true; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/item/ItemPotionLingering.java b/src/main/java/cn/nukkit/item/ItemPotionLingering.java deleted file mode 100644 index e3ab5a8a9..000000000 --- a/src/main/java/cn/nukkit/item/ItemPotionLingering.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.nbt.tag.CompoundTag; - -public class ItemPotionLingering extends ProjectileItem { - - public ItemPotionLingering() { - this(0, 1); - } - - public ItemPotionLingering(Integer meta) { - this(meta, 1); - } - - public ItemPotionLingering(Integer meta, int count) { - super(LINGERING_POTION, meta, count, "Lingering Potion"); - } - - @Override - public int getMaxStackSize() { - return 1; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public String getProjectileEntityType() { - return "ThrownLingeringPotion"; - } - - @Override - public float getThrowForce() { - return 0.50f; - } - - @Override - protected void correctNBT(CompoundTag nbt) { - nbt.putInt("PotionId", this.meta); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPotionSplash.java b/src/main/java/cn/nukkit/item/ItemPotionSplash.java deleted file mode 100644 index 4e463b72d..000000000 --- a/src/main/java/cn/nukkit/item/ItemPotionSplash.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.nbt.tag.CompoundTag; - -/** - * Created on 2015/12/27 by xtypr. - * Package cn.nukkit.item in project Nukkit . - */ -public class ItemPotionSplash extends ProjectileItem { - - public ItemPotionSplash(Integer meta) { - this(meta, 1); - } - - public ItemPotionSplash(Integer meta, int count) { - super(SPLASH_POTION, meta, count, "Splash Potion"); - } - - @Override - public int getMaxStackSize() { - return 1; - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public String getProjectileEntityType() { - return "ThrownPotion"; - } - - @Override - public float getThrowForce() { - return 0.50f; - } - - @Override - protected void correctNBT(CompoundTag nbt) { - nbt.putInt("PotionId", this.meta); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPrismarineCrystals.java b/src/main/java/cn/nukkit/item/ItemPrismarineCrystals.java deleted file mode 100644 index d1f95157c..000000000 --- a/src/main/java/cn/nukkit/item/ItemPrismarineCrystals.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemPrismarineCrystals extends Item { - - public ItemPrismarineCrystals() { - this(0, 1); - } - - public ItemPrismarineCrystals(Integer meta) { - this(meta, 1); - } - - public ItemPrismarineCrystals(Integer meta, int count) { - super(PRISMARINE_CRYSTALS, 0, count, "Prismarine Crystals"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPrismarineShard.java b/src/main/java/cn/nukkit/item/ItemPrismarineShard.java deleted file mode 100644 index bb5a77554..000000000 --- a/src/main/java/cn/nukkit/item/ItemPrismarineShard.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemPrismarineShard extends Item { - - public ItemPrismarineShard() { - this(0, 1); - } - - public ItemPrismarineShard(Integer meta) { - this(meta, 1); - } - - public ItemPrismarineShard(Integer meta, int count) { - super(PRISMARINE_SHARD, 0, count, "Prismarine Shard"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPufferfish.java b/src/main/java/cn/nukkit/item/ItemPufferfish.java deleted file mode 100644 index 1d76a6d1c..000000000 --- a/src/main/java/cn/nukkit/item/ItemPufferfish.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemPufferfish extends ItemFish { - - public ItemPufferfish() { - this(0, 1); - } - - public ItemPufferfish(Integer meta) { - this(meta, 1); - } - - public ItemPufferfish(Integer meta, int count) { - super(PUFFERFISH, meta, count, "Pufferfish"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemPumpkinPie.java b/src/main/java/cn/nukkit/item/ItemPumpkinPie.java deleted file mode 100644 index 8919b54fc..000000000 --- a/src/main/java/cn/nukkit/item/ItemPumpkinPie.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemPumpkinPie extends ItemEdible { - - public ItemPumpkinPie() { - this(0, 1); - } - - public ItemPumpkinPie(Integer meta) { - this(meta, 1); - } - - public ItemPumpkinPie(Integer meta, int count) { - super(PUMPKIN_PIE, meta, count, "Pumpkin Pie"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemQuartz.java b/src/main/java/cn/nukkit/item/ItemQuartz.java deleted file mode 100644 index ae8722ef3..000000000 --- a/src/main/java/cn/nukkit/item/ItemQuartz.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemQuartz extends Item { - - public ItemQuartz() { - this(0, 1); - } - - public ItemQuartz(Integer meta) { - this(meta, 1); - } - - public ItemQuartz(Integer meta, int count) { - super(NETHER_QUARTZ, 0, count, "Nether Quartz"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRabbitCooked.java b/src/main/java/cn/nukkit/item/ItemRabbitCooked.java deleted file mode 100644 index 6a4d8a960..000000000 --- a/src/main/java/cn/nukkit/item/ItemRabbitCooked.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemRabbitCooked extends ItemEdible { - - public ItemRabbitCooked() { - this(0, 1); - } - - public ItemRabbitCooked(Integer meta) { - this(meta, 1); - } - - public ItemRabbitCooked(Integer meta, int count) { - super(COOKED_RABBIT, meta, count, "Cooked Rabbit"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRabbitFoot.java b/src/main/java/cn/nukkit/item/ItemRabbitFoot.java deleted file mode 100644 index b9ad034a9..000000000 --- a/src/main/java/cn/nukkit/item/ItemRabbitFoot.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemRabbitFoot extends Item { - - public ItemRabbitFoot() { - this(0, 1); - } - - public ItemRabbitFoot(Integer meta) { - this(meta, 1); - } - - public ItemRabbitFoot(Integer meta, int count) { - super(RABBIT_FOOT, meta, count, "Rabbit Foot"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRabbitHide.java b/src/main/java/cn/nukkit/item/ItemRabbitHide.java deleted file mode 100644 index d33b3619f..000000000 --- a/src/main/java/cn/nukkit/item/ItemRabbitHide.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemRabbitHide extends Item { - - public ItemRabbitHide() { - this(0, 1); - } - - public ItemRabbitHide(Integer meta) { - this(meta, 1); - } - - public ItemRabbitHide(Integer meta, int count) { - super(RABBIT_HIDE, 0, count, "Rabbit Hide"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRabbitRaw.java b/src/main/java/cn/nukkit/item/ItemRabbitRaw.java deleted file mode 100644 index 395c9864e..000000000 --- a/src/main/java/cn/nukkit/item/ItemRabbitRaw.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemRabbitRaw extends ItemEdible { - - public ItemRabbitRaw() { - this(0, 1); - } - - public ItemRabbitRaw(Integer meta) { - this(meta, 1); - } - - public ItemRabbitRaw(Integer meta, int count) { - super(RAW_RABBIT, meta, count, "Raw Rabbit"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRabbitStew.java b/src/main/java/cn/nukkit/item/ItemRabbitStew.java deleted file mode 100644 index 7ae2852e1..000000000 --- a/src/main/java/cn/nukkit/item/ItemRabbitStew.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemRabbitStew extends ItemEdible { - - public ItemRabbitStew() { - this(0, 1); - } - - public ItemRabbitStew(Integer meta) { - this(meta, 1); - } - - public ItemRabbitStew(Integer meta, int count) { - super(RABBIT_STEW, meta, count, "Rabbit Stew"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRail.java b/src/main/java/cn/nukkit/item/ItemRail.java deleted file mode 100644 index 4bbcf317a..000000000 --- a/src/main/java/cn/nukkit/item/ItemRail.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemRail extends Item { - - public ItemRail() { - this(0, 1); - } - - public ItemRail(Integer meta) { - this(meta, 1); - } - - public ItemRail(Integer meta, int count) { - super(RAIL, 0, count, "Rail"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecord.java b/src/main/java/cn/nukkit/item/ItemRecord.java deleted file mode 100644 index 5bf652e41..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecord.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public abstract class ItemRecord extends Item { - - public ItemRecord(int id, Integer meta, int count) { - super(id, meta, count, "Music Disc"); - } - - @Override - public int getMaxStackSize() { - return 1; - } - - public abstract String getSoundId(); -} diff --git a/src/main/java/cn/nukkit/item/ItemRecord11.java b/src/main/java/cn/nukkit/item/ItemRecord11.java deleted file mode 100644 index 56f3b8f7a..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecord11.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecord11 extends ItemRecord { - - public ItemRecord11() { - this(0, 1); - } - - public ItemRecord11(Integer meta) { - this(meta, 1); - } - - public ItemRecord11(Integer meta, int count) { - super(RECORD_11, meta, count); - } - - @Override - public String getSoundId() { - return "record.11"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecord13.java b/src/main/java/cn/nukkit/item/ItemRecord13.java deleted file mode 100644 index 173e8b029..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecord13.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecord13 extends ItemRecord { - - public ItemRecord13() { - this(0, 1); - } - - public ItemRecord13(Integer meta) { - this(meta, 1); - } - - public ItemRecord13(Integer meta, int count) { - super(RECORD_13, meta, count); - } - - @Override - public String getSoundId() { - return "record.13"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordBlocks.java b/src/main/java/cn/nukkit/item/ItemRecordBlocks.java deleted file mode 100644 index 00be58db6..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordBlocks.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordBlocks extends ItemRecord { - - public ItemRecordBlocks() { - this(0, 1); - } - - public ItemRecordBlocks(Integer meta) { - this(meta, 1); - } - - public ItemRecordBlocks(Integer meta, int count) { - super(RECORD_BLOCKS, meta, count); - } - - @Override - public String getSoundId() { - return "record.blocks"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordCat.java b/src/main/java/cn/nukkit/item/ItemRecordCat.java deleted file mode 100644 index 8f4eef89f..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordCat.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordCat extends ItemRecord { - - public ItemRecordCat() { - this(0, 1); - } - - public ItemRecordCat(Integer meta) { - this(meta, 1); - } - - public ItemRecordCat(Integer meta, int count) { - super(RECORD_CAT, meta, count); - } - - @Override - public String getSoundId() { - return "record.cat"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordChirp.java b/src/main/java/cn/nukkit/item/ItemRecordChirp.java deleted file mode 100644 index 82bd15366..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordChirp.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordChirp extends ItemRecord { - - public ItemRecordChirp() { - this(0, 1); - } - - public ItemRecordChirp(Integer meta) { - this(meta, 1); - } - - public ItemRecordChirp(Integer meta, int count) { - super(RECORD_CHIRP, meta, count); - } - - @Override - public String getSoundId() { - return "record.chirp"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordFar.java b/src/main/java/cn/nukkit/item/ItemRecordFar.java deleted file mode 100644 index 9f8d1a29c..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordFar.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordFar extends ItemRecord { - - public ItemRecordFar() { - this(0, 1); - } - - public ItemRecordFar(Integer meta) { - this(meta, 1); - } - - public ItemRecordFar(Integer meta, int count) { - super(RECORD_FAR, meta, count); - } - - @Override - public String getSoundId() { - return "record.far"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordMall.java b/src/main/java/cn/nukkit/item/ItemRecordMall.java deleted file mode 100644 index aa49939e6..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordMall.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordMall extends ItemRecord { - - public ItemRecordMall() { - this(0, 1); - } - - public ItemRecordMall(Integer meta) { - this(meta, 1); - } - - public ItemRecordMall(Integer meta, int count) { - super(RECORD_MALL, meta, count); - } - - @Override - public String getSoundId() { - return "record.mall"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordMellohi.java b/src/main/java/cn/nukkit/item/ItemRecordMellohi.java deleted file mode 100644 index 9c5119d95..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordMellohi.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordMellohi extends ItemRecord { - - public ItemRecordMellohi() { - this(0, 1); - } - - public ItemRecordMellohi(Integer meta) { - this(meta, 1); - } - - public ItemRecordMellohi(Integer meta, int count) { - super(RECORD_MELLOHI, meta, count); - } - - @Override - public String getSoundId() { - return "record.mellohi"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordPigstep.java b/src/main/java/cn/nukkit/item/ItemRecordPigstep.java deleted file mode 100644 index 2fb3c523b..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordPigstep.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemRecordPigstep extends ItemRecord { - - public ItemRecordPigstep() { - this(0, 1); - } - - public ItemRecordPigstep(Integer meta) { - this(meta, 1); - } - - public ItemRecordPigstep(Integer meta, int count) { - super(RECORD_PIGSTEP, meta, count); - } - - @Override - public String getSoundId() { - return "record.pigstep"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordStal.java b/src/main/java/cn/nukkit/item/ItemRecordStal.java deleted file mode 100644 index ec3b623f8..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordStal.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordStal extends ItemRecord { - - public ItemRecordStal() { - this(0, 1); - } - - public ItemRecordStal(Integer meta) { - this(meta, 1); - } - - public ItemRecordStal(Integer meta, int count) { - super(RECORD_STAL, meta, count); - } - - @Override - public String getSoundId() { - return "record.stal"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordStrad.java b/src/main/java/cn/nukkit/item/ItemRecordStrad.java deleted file mode 100644 index 2edf6eb9b..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordStrad.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordStrad extends ItemRecord { - - public ItemRecordStrad() { - this(0, 1); - } - - public ItemRecordStrad(Integer meta) { - this(meta, 1); - } - - public ItemRecordStrad(Integer meta, int count) { - super(RECORD_STRAD, meta, count); - } - - @Override - public String getSoundId() { - return "record.strad"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordWait.java b/src/main/java/cn/nukkit/item/ItemRecordWait.java deleted file mode 100644 index 8816d6d8e..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordWait.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordWait extends ItemRecord { - - public ItemRecordWait() { - this(0, 1); - } - - public ItemRecordWait(Integer meta) { - this(meta, 1); - } - - public ItemRecordWait(Integer meta, int count) { - super(RECORD_WAIT, meta, count); - } - - @Override - public String getSoundId() { - return "record.wait"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRecordWard.java b/src/main/java/cn/nukkit/item/ItemRecordWard.java deleted file mode 100644 index 0d65d8fb8..000000000 --- a/src/main/java/cn/nukkit/item/ItemRecordWard.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author CreeperFace - */ -public class ItemRecordWard extends ItemRecord { - - public ItemRecordWard() { - this(0, 1); - } - - public ItemRecordWard(Integer meta) { - this(meta, 1); - } - - public ItemRecordWard(Integer meta, int count) { - super(RECORD_WARD, meta, count); - } - - @Override - public String getSoundId() { - return "record.ward"; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRedstone.java b/src/main/java/cn/nukkit/item/ItemRedstone.java deleted file mode 100644 index 4aae1c8f4..000000000 --- a/src/main/java/cn/nukkit/item/ItemRedstone.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemRedstone extends Item { - - public ItemRedstone() { - this(0, 1); - } - - public ItemRedstone(Integer meta) { - this(meta, 1); - } - - public ItemRedstone(Integer meta, int count) { - super(REDSTONE, meta, count, "Redstone Dust"); - this.block = Block.get(REDSTONE_WIRE); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRedstoneComparator.java b/src/main/java/cn/nukkit/item/ItemRedstoneComparator.java deleted file mode 100644 index a6fa2b69f..000000000 --- a/src/main/java/cn/nukkit/item/ItemRedstoneComparator.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author CreeperFace - */ -public class ItemRedstoneComparator extends Item { - - public ItemRedstoneComparator() { - this(0); - } - - public ItemRedstoneComparator(Integer meta) { - this(0, 1); - } - - public ItemRedstoneComparator(Integer meta, int count) { - super(COMPARATOR, meta, count, "Redstone Comparator"); - this.block = Block.get(UNPOWERED_COMPARATOR); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/item/ItemRedstoneRepeater.java b/src/main/java/cn/nukkit/item/ItemRedstoneRepeater.java deleted file mode 100644 index 2f3b3bec0..000000000 --- a/src/main/java/cn/nukkit/item/ItemRedstoneRepeater.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author CreeperFace - */ -public class ItemRedstoneRepeater extends Item { - - public ItemRedstoneRepeater() { - this(0); - } - - public ItemRedstoneRepeater(Integer meta) { - this(0, 1); - } - - public ItemRedstoneRepeater(Integer meta, int count) { - super(REPEATER, meta, count, "Redstone Repeater"); - this.block = Block.get(UNPOWERED_REPEATER); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemRottenFlesh.java b/src/main/java/cn/nukkit/item/ItemRottenFlesh.java deleted file mode 100644 index cf8a3cdfd..000000000 --- a/src/main/java/cn/nukkit/item/ItemRottenFlesh.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemRottenFlesh extends ItemEdible { - - public ItemRottenFlesh() { - this(0, 1); - } - - public ItemRottenFlesh(Integer meta) { - this(meta, 1); - } - - public ItemRottenFlesh(Integer meta, int count) { - super(ROTTEN_FLESH, meta, count, "Rotten Flesh"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSaddle.java b/src/main/java/cn/nukkit/item/ItemSaddle.java deleted file mode 100644 index e83635e16..000000000 --- a/src/main/java/cn/nukkit/item/ItemSaddle.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item; - -public class ItemSaddle extends Item { - - public ItemSaddle() { - this(0, 1); - } - - public ItemSaddle(Integer meta) { - this(meta, 1); - } - - public ItemSaddle(Integer meta, int count) { - super(SADDLE, meta, count, "Saddle"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSalmon.java b/src/main/java/cn/nukkit/item/ItemSalmon.java deleted file mode 100644 index 6a58bf85b..000000000 --- a/src/main/java/cn/nukkit/item/ItemSalmon.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemSalmon extends ItemFish { - - public ItemSalmon() { - this(0, 1); - } - - public ItemSalmon(Integer meta) { - this(meta, 1); - } - - public ItemSalmon(Integer meta, int count) { - super(RAW_SALMON, meta, count, "Raw Salmon"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSalmonCooked.java b/src/main/java/cn/nukkit/item/ItemSalmonCooked.java deleted file mode 100644 index c9a4509da..000000000 --- a/src/main/java/cn/nukkit/item/ItemSalmonCooked.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemSalmonCooked extends ItemFish { - - public ItemSalmonCooked() { - this(0, 1); - } - - public ItemSalmonCooked(Integer meta) { - this(meta, 1); - } - - public ItemSalmonCooked(Integer meta, int count) { - super(COOKED_SALMON, meta, count, "Cooked Salmon"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemScrapNetherite.java b/src/main/java/cn/nukkit/item/ItemScrapNetherite.java deleted file mode 100644 index 3f5426fc0..000000000 --- a/src/main/java/cn/nukkit/item/ItemScrapNetherite.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemScrapNetherite extends Item { - - public ItemScrapNetherite() { - this(0, 1); - } - - public ItemScrapNetherite(Integer meta) { - this(meta, 1); - } - - public ItemScrapNetherite(Integer meta, int count) { - super(NETHERITE_SCRAP, 0, count, "Netherite Scrap"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemScute.java b/src/main/java/cn/nukkit/item/ItemScute.java deleted file mode 100644 index 550ba6073..000000000 --- a/src/main/java/cn/nukkit/item/ItemScute.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemScute extends Item { - - public ItemScute() { - this(0, 1); - } - - public ItemScute(Integer meta) { - this(meta, 1); - } - - public ItemScute(Integer meta, int count) { - super(SCUTE, meta, count, "Scute"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSeedsBeetroot.java b/src/main/java/cn/nukkit/item/ItemSeedsBeetroot.java deleted file mode 100644 index 94f91a3cc..000000000 --- a/src/main/java/cn/nukkit/item/ItemSeedsBeetroot.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSeedsBeetroot extends Item { - - public ItemSeedsBeetroot() { - this(0, 1); - } - - public ItemSeedsBeetroot(Integer meta) { - this(meta, 1); - } - - public ItemSeedsBeetroot(Integer meta, int count) { - super(BEETROOT_SEEDS, 0, count, "Beetroot Seeds"); - this.block = Block.get(BEETROOT_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSeedsMelon.java b/src/main/java/cn/nukkit/item/ItemSeedsMelon.java deleted file mode 100644 index 773f93e0a..000000000 --- a/src/main/java/cn/nukkit/item/ItemSeedsMelon.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSeedsMelon extends Item { - - public ItemSeedsMelon() { - this(0, 1); - } - - public ItemSeedsMelon(Integer meta) { - this(meta, 1); - } - - public ItemSeedsMelon(Integer meta, int count) { - super(MELON_SEEDS, 0, count, "Melon Seeds"); - this.block = Block.get(MELON_STEM); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSeedsPumpkin.java b/src/main/java/cn/nukkit/item/ItemSeedsPumpkin.java deleted file mode 100644 index 416c89a7f..000000000 --- a/src/main/java/cn/nukkit/item/ItemSeedsPumpkin.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSeedsPumpkin extends Item { - - public ItemSeedsPumpkin() { - this(0, 1); - } - - public ItemSeedsPumpkin(Integer meta) { - this(meta, 1); - } - - public ItemSeedsPumpkin(Integer meta, int count) { - super(PUMPKIN_SEEDS, 0, count, "Pumpkin Seeds"); - this.block = Block.get(PUMPKIN_STEM); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSeedsWheat.java b/src/main/java/cn/nukkit/item/ItemSeedsWheat.java deleted file mode 100644 index d4f18ede8..000000000 --- a/src/main/java/cn/nukkit/item/ItemSeedsWheat.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSeedsWheat extends Item { - - public ItemSeedsWheat() { - this(0, 1); - } - - public ItemSeedsWheat(Integer meta) { - this(meta, 1); - } - - public ItemSeedsWheat(Integer meta, int count) { - super(WHEAT_SEEDS, 0, count, "Seeds"); - this.block = Block.get(WHEAT_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShears.java b/src/main/java/cn/nukkit/item/ItemShears.java deleted file mode 100644 index 708874a8c..000000000 --- a/src/main/java/cn/nukkit/item/ItemShears.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemShears extends ItemTool { - - public ItemShears() { - this(0, 1); - } - - public ItemShears(Integer meta) { - this(meta, 1); - } - - public ItemShears(Integer meta, int count) { - super(SHEARS, meta, count, "Shears"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_SHEARS; - } - - @Override - public boolean isShears() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShield.java b/src/main/java/cn/nukkit/item/ItemShield.java deleted file mode 100644 index f991ce0a8..000000000 --- a/src/main/java/cn/nukkit/item/ItemShield.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item; - -public class ItemShield extends ItemTool { - - public ItemShield() { - this(0, 1); - } - - public ItemShield(Integer meta) { - this(meta, 1); - } - - public ItemShield(Integer meta, int count) { - super(SHIELD, meta, count, "Shield"); - } - - @Override - public int getMaxDurability() { - return 337; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShovelDiamond.java b/src/main/java/cn/nukkit/item/ItemShovelDiamond.java deleted file mode 100644 index cc44d0f05..000000000 --- a/src/main/java/cn/nukkit/item/ItemShovelDiamond.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemShovelDiamond extends ItemTool { - - public ItemShovelDiamond() { - this(0, 1); - } - - public ItemShovelDiamond(Integer meta) { - this(meta, 1); - } - - public ItemShovelDiamond(Integer meta, int count) { - super(DIAMOND_SHOVEL, meta, count, "Diamond Shovel"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_DIAMOND; - } - - @Override - public boolean isShovel() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_DIAMOND; - } - - @Override - public int getAttackDamage() { - return 4; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShovelGold.java b/src/main/java/cn/nukkit/item/ItemShovelGold.java deleted file mode 100644 index e31d0ae2c..000000000 --- a/src/main/java/cn/nukkit/item/ItemShovelGold.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemShovelGold extends ItemTool { - - public ItemShovelGold() { - this(0, 1); - } - - public ItemShovelGold(Integer meta) { - this(meta, 1); - } - - public ItemShovelGold(Integer meta, int count) { - super(GOLD_SHOVEL, meta, count, "Golden Shovel"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_GOLD; - } - - @Override - public boolean isShovel() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_GOLD; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShovelIron.java b/src/main/java/cn/nukkit/item/ItemShovelIron.java deleted file mode 100644 index a3b7c327d..000000000 --- a/src/main/java/cn/nukkit/item/ItemShovelIron.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemShovelIron extends ItemTool { - - public ItemShovelIron() { - this(0, 1); - } - - public ItemShovelIron(Integer meta) { - this(meta, 1); - } - - public ItemShovelIron(Integer meta, int count) { - super(IRON_SHOVEL, meta, count, "Iron Shovel"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_IRON; - } - - @Override - public boolean isShovel() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_IRON; - } - - @Override - public int getAttackDamage() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShovelNetherite.java b/src/main/java/cn/nukkit/item/ItemShovelNetherite.java deleted file mode 100644 index 99e5dd766..000000000 --- a/src/main/java/cn/nukkit/item/ItemShovelNetherite.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.item; - -public class ItemShovelNetherite extends ItemTool { - - public ItemShovelNetherite() { - this(0, 1); - } - - public ItemShovelNetherite(Integer meta) { - this(meta, 1); - } - - public ItemShovelNetherite(Integer meta, int count) { - super(NETHERITE_SHOVEL, meta, count, "Netherite Shovel"); - } - - @Override - public boolean isShovel() { - return true; - } - - @Override - public int getAttackDamage() { - return 5; - } - - @Override - public int getTier() { - return ItemTool.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_NETHERITE; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShovelStone.java b/src/main/java/cn/nukkit/item/ItemShovelStone.java deleted file mode 100644 index b33166930..000000000 --- a/src/main/java/cn/nukkit/item/ItemShovelStone.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemShovelStone extends ItemTool { - - public ItemShovelStone() { - this(0, 1); - } - - public ItemShovelStone(Integer meta) { - this(meta, 1); - } - - public ItemShovelStone(Integer meta, int count) { - super(STONE_SHOVEL, meta, count, "Stone Shovel"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_STONE; - } - - @Override - public boolean isShovel() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_STONE; - } - - @Override - public int getAttackDamage() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShovelWood.java b/src/main/java/cn/nukkit/item/ItemShovelWood.java deleted file mode 100644 index 01676b543..000000000 --- a/src/main/java/cn/nukkit/item/ItemShovelWood.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemShovelWood extends ItemTool { - - public ItemShovelWood() { - this(0, 1); - } - - public ItemShovelWood(Integer meta) { - this(meta, 1); - } - - public ItemShovelWood(Integer meta, int count) { - super(WOODEN_SHOVEL, meta, count, "Wooden Shovel"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_WOODEN; - } - - @Override - public boolean isShovel() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_WOODEN; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemShulkerShell.java b/src/main/java/cn/nukkit/item/ItemShulkerShell.java deleted file mode 100644 index 883e4da54..000000000 --- a/src/main/java/cn/nukkit/item/ItemShulkerShell.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemShulkerShell extends Item { - - public ItemShulkerShell() { - this(0, 1); - } - - public ItemShulkerShell(Integer meta) { - this(meta, 1); - } - - public ItemShulkerShell(Integer meta, int count) { - super(SHULKER_SHELL, 0, count, "Shulker Shell"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSign.java b/src/main/java/cn/nukkit/item/ItemSign.java deleted file mode 100644 index 6cbe86c60..000000000 --- a/src/main/java/cn/nukkit/item/ItemSign.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSign extends Item { - - public ItemSign() { - this(0, 1); - } - - public ItemSign(Integer meta) { - this(meta, 1); - } - - public ItemSign(Integer meta, int count) { - super(SIGN, 0, count, "Sign"); - this.block = Block.get(SIGN_POST); - } - - @Override - public int getMaxStackSize() { - return 16; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSkull.java b/src/main/java/cn/nukkit/item/ItemSkull.java deleted file mode 100644 index f473a4a48..000000000 --- a/src/main/java/cn/nukkit/item/ItemSkull.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * Created by Snake1999 on 2016/2/3. - * Package cn.nukkit.item in project Nukkit. - */ -public class ItemSkull extends Item { - - public static final int SKELETON_SKULL = 0; - public static final int WITHER_SKELETON_SKULL = 1; - public static final int ZOMBIE_HEAD = 2; - public static final int HEAD = 3; - public static final int CREEPER_HEAD = 4; - public static final int DRAGON_HEAD = 5; - - public ItemSkull() { - this(0, 1); - } - - public ItemSkull(Integer meta) { - this(meta, 1); - } - - public ItemSkull(Integer meta, int count) { - super(SKULL, meta, count, getItemSkullName(meta)); - this.block = Block.get(Block.SKULL_BLOCK); - } - - public static String getItemSkullName(int meta) { - switch (meta) { - case WITHER_SKELETON_SKULL : - return "Wither Skeleton Skull"; - case ZOMBIE_HEAD: - return "Zombie Head"; - case HEAD: - return "Head"; - case CREEPER_HEAD: - return "Creeper Head"; - case DRAGON_HEAD: - return "Dragon Head"; - case SKELETON_SKULL: - default: - return "Skeleton Skull"; - } - } - - @Override - public boolean isArmor() { - return true; - } - - @Override - public boolean isHelmet() { - return true; - } - - @Override - public boolean canBePutInHelmetSlot() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSlimeball.java b/src/main/java/cn/nukkit/item/ItemSlimeball.java deleted file mode 100644 index 1546ed99e..000000000 --- a/src/main/java/cn/nukkit/item/ItemSlimeball.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSlimeball extends Item { - - public ItemSlimeball() { - this(0, 1); - } - - public ItemSlimeball(Integer meta) { - this(meta, 1); - } - - public ItemSlimeball(Integer meta, int count) { - super(SLIMEBALL, meta, count, "Slimeball"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSnowball.java b/src/main/java/cn/nukkit/item/ItemSnowball.java deleted file mode 100644 index 83023ee88..000000000 --- a/src/main/java/cn/nukkit/item/ItemSnowball.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSnowball extends ProjectileItem { - - public ItemSnowball() { - this(0, 1); - } - - public ItemSnowball(Integer meta) { - this(meta, 1); - } - - public ItemSnowball(Integer meta, int count) { - super(SNOWBALL, 0, count, "Snowball"); - } - - @Override - public int getMaxStackSize() { - return 16; - } - - @Override - public String getProjectileEntityType() { - return "Snowball"; - } - - @Override - public float getThrowForce() { - return 1.5f; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSpawnEgg.java b/src/main/java/cn/nukkit/item/ItemSpawnEgg.java deleted file mode 100644 index 990a71538..000000000 --- a/src/main/java/cn/nukkit/item/ItemSpawnEgg.java +++ /dev/null @@ -1,146 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockMobSpawner; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntitySpawner; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.mob.EntityZombie; -import cn.nukkit.entity.passive.EntityChicken; -import cn.nukkit.entity.passive.EntityCow; -import cn.nukkit.entity.passive.EntityPig; -import cn.nukkit.entity.passive.EntitySheep; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.BlockFace; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.utils.Utils; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSpawnEgg extends Item { - - public ItemSpawnEgg() { - this(0, 1); - } - - public ItemSpawnEgg(Integer meta) { - this(meta, 1); - } - - public ItemSpawnEgg(Integer meta, int count) { - super(SPAWN_EGG, meta, count, "Spawn Entity Egg"); - } - - @Override - public boolean canBeActivated() { - return true; - } - - @Override - public boolean onActivate(Level level, Player player, Block block, Block target, BlockFace face, double fx, double fy, double fz) { - if (player.isAdventure()) { - return false; - } - - if (!Server.getInstance().spawnEggsEnabled) { - player.sendMessage("\u00A7cSpawn eggs are disabled on this server"); - return false; - } - - if (target instanceof BlockMobSpawner) { - BlockEntity blockEntity = level.getBlockEntity(target); - if (blockEntity instanceof BlockEntitySpawner) { - if (((BlockEntitySpawner) blockEntity).getSpawnEntityType() != this.getDamage()) { - ((BlockEntitySpawner) blockEntity).setSpawnEntityType(this.getDamage()); - - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - } - } else { - if (blockEntity != null) { - blockEntity.close(); - } - - CompoundTag nbt = new CompoundTag() - .putString("id", BlockEntity.MOB_SPAWNER) - .putInt("EntityId", this.getDamage()) - .putInt("x", (int) target.x) - .putInt("y", (int) target.y) - .putInt("z", (int) target.z); - BlockEntity.createBlockEntity(BlockEntity.MOB_SPAWNER, level.getChunk(target.getChunkX(), target.getChunkZ()), nbt); - - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - } - - return true; - } - - FullChunk chunk = level.getChunk((int) block.getX() >> 4, (int) block.getZ() >> 4); - - if (chunk == null) { - return false; - } - - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", block.getX() + 0.5)) - .add(new DoubleTag("", target.getBoundingBox() == null ? block.getY() : target.getBoundingBox().maxY + 0.0001f)) - .add(new DoubleTag("", block.getZ() + 0.5))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", ThreadLocalRandom.current().nextFloat() * 360)) - .add(new FloatTag("", 0))); - - if (this.hasCustomName()) { - nbt.putString("CustomName", this.getCustomName()); - } - - CreatureSpawnEvent ev = new CreatureSpawnEvent(this.meta, block, nbt, CreatureSpawnEvent.SpawnReason.SPAWN_EGG); - level.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return false; - } - - Entity entity = Entity.createEntity(this.meta, chunk, nbt); - - if (entity != null) { - if (!player.isCreative()) { - player.getInventory().decreaseCount(player.getInventory().getHeldItemIndex()); - } - - entity.spawnToAll(); - - if (Utils.rand(1, 20) == 1 && - (entity instanceof EntityCow || - entity instanceof EntityChicken || - entity instanceof EntityPig || - entity instanceof EntitySheep || - entity instanceof EntityZombie)) { - - ((BaseEntity) entity).setBaby(true); - } - - return true; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSpiderEye.java b/src/main/java/cn/nukkit/item/ItemSpiderEye.java deleted file mode 100644 index 5e9e964a9..000000000 --- a/src/main/java/cn/nukkit/item/ItemSpiderEye.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item in project nukkit. - */ -public class ItemSpiderEye extends Item { - - public ItemSpiderEye() { - this(0, 1); - } - - public ItemSpiderEye(Integer meta) { - this(meta, 1); - } - - public ItemSpiderEye(Integer meta, int count) { - super(SPIDER_EYE, meta, count, "Spider Eye"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSpiderEyeFermented.java b/src/main/java/cn/nukkit/item/ItemSpiderEyeFermented.java deleted file mode 100644 index 78b6163eb..000000000 --- a/src/main/java/cn/nukkit/item/ItemSpiderEyeFermented.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemSpiderEyeFermented extends Item { - - public ItemSpiderEyeFermented() { - this(0, 1); - } - - public ItemSpiderEyeFermented(Integer meta) { - this(meta, 1); - } - - public ItemSpiderEyeFermented(Integer meta, int count) { - super(FERMENTED_SPIDER_EYE, 0, count, "Fermented Spider Eye"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSpyglass.java b/src/main/java/cn/nukkit/item/ItemSpyglass.java deleted file mode 100644 index efb7c4d1b..000000000 --- a/src/main/java/cn/nukkit/item/ItemSpyglass.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item; - -/** - * @author LT_Name - */ -public class ItemSpyglass extends Item { - - public ItemSpyglass() { - this(0, 1); - } - - public ItemSpyglass(Integer meta) { - this(meta, 1); - } - - public ItemSpyglass(Integer meta, int count) { - super(SPYGLASS, 0, count, "Spyglass"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSteak.java b/src/main/java/cn/nukkit/item/ItemSteak.java deleted file mode 100644 index 295804dfe..000000000 --- a/src/main/java/cn/nukkit/item/ItemSteak.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSteak extends ItemEdible { - - public ItemSteak() { - this(0, 1); - } - - public ItemSteak(Integer meta) { - this(meta, 1); - } - - public ItemSteak(Integer meta, int count) { - super(STEAK, meta, count, "Steak"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemStick.java b/src/main/java/cn/nukkit/item/ItemStick.java deleted file mode 100644 index 6b667805f..000000000 --- a/src/main/java/cn/nukkit/item/ItemStick.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemStick extends Item { - - public ItemStick() { - this(0, 1); - } - - public ItemStick(Integer meta) { - this(meta, 1); - } - - public ItemStick(Integer meta, int count) { - super(STICK, 0, count, "Stick"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemString.java b/src/main/java/cn/nukkit/item/ItemString.java deleted file mode 100644 index 7d57b8c46..000000000 --- a/src/main/java/cn/nukkit/item/ItemString.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemString extends Item { - - public ItemString() { - this(0, 1); - } - - public ItemString(Integer meta) { - this(meta, 1); - } - - public ItemString(Integer meta, int count) { - super(STRING, meta, count, "String"); - this.block = Block.get(TRIPWIRE); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSugar.java b/src/main/java/cn/nukkit/item/ItemSugar.java deleted file mode 100644 index e9f8866e1..000000000 --- a/src/main/java/cn/nukkit/item/ItemSugar.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSugar extends Item { - - public ItemSugar() { - this(0, 1); - } - - public ItemSugar(Integer meta) { - this(meta, 1); - } - - public ItemSugar(Integer meta, int count) { - super(SUGAR, meta, count, "Sugar"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSugarcane.java b/src/main/java/cn/nukkit/item/ItemSugarcane.java deleted file mode 100644 index 9111f9ea4..000000000 --- a/src/main/java/cn/nukkit/item/ItemSugarcane.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSugarcane extends Item { - - public ItemSugarcane() { - this(0, 1); - } - - public ItemSugarcane(Integer meta) { - this(meta, 1); - } - - public ItemSugarcane(Integer meta, int count) { - super(SUGARCANE, 0, count, "Sugar Canes"); - this.block = Block.get(SUGARCANE_BLOCK); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSuspiciousStew.java b/src/main/java/cn/nukkit/item/ItemSuspiciousStew.java deleted file mode 100644 index 8ad9d10be..000000000 --- a/src/main/java/cn/nukkit/item/ItemSuspiciousStew.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item; - -public class ItemSuspiciousStew extends ItemEdible { - - public ItemSuspiciousStew() { - this(0, 1); - } - - public ItemSuspiciousStew(Integer meta) { - this(meta, 1); - } - - public ItemSuspiciousStew(Integer meta, int count) { - super(SUSPICIOUS_STEW, meta, count, "Suspicious Stew"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSweetBerries.java b/src/main/java/cn/nukkit/item/ItemSweetBerries.java deleted file mode 100644 index 181322bc6..000000000 --- a/src/main/java/cn/nukkit/item/ItemSweetBerries.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.item; - -public class ItemSweetBerries extends ItemEdible { - - public ItemSweetBerries() { - this(0, 1); - } - - public ItemSweetBerries(Integer meta) { - this(meta, 1); - } - - public ItemSweetBerries(Integer meta, int count) { - super(SWEET_BERRIES, meta, count, "Sweet Berries"); - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSwordDiamond.java b/src/main/java/cn/nukkit/item/ItemSwordDiamond.java deleted file mode 100644 index 9ed70071d..000000000 --- a/src/main/java/cn/nukkit/item/ItemSwordDiamond.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSwordDiamond extends ItemTool { - - public ItemSwordDiamond() { - this(0, 1); - } - - public ItemSwordDiamond(Integer meta) { - this(meta, 1); - } - - public ItemSwordDiamond(Integer meta, int count) { - super(DIAMOND_SWORD, meta, count, "Diamond Sword"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_DIAMOND; - } - - @Override - public boolean isSword() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_DIAMOND; - } - - @Override - public int getAttackDamage() { - return 7; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSwordGold.java b/src/main/java/cn/nukkit/item/ItemSwordGold.java deleted file mode 100644 index d9248c2a7..000000000 --- a/src/main/java/cn/nukkit/item/ItemSwordGold.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSwordGold extends ItemTool { - - public ItemSwordGold() { - this(0, 1); - } - - public ItemSwordGold(Integer meta) { - this(meta, 1); - } - - public ItemSwordGold(Integer meta, int count) { - super(GOLD_SWORD, meta, count, "Golden Sword"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_GOLD; - } - - @Override - public boolean isSword() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_GOLD; - } - - @Override - public int getAttackDamage() { - return 4; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSwordIron.java b/src/main/java/cn/nukkit/item/ItemSwordIron.java deleted file mode 100644 index 282e7eaee..000000000 --- a/src/main/java/cn/nukkit/item/ItemSwordIron.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSwordIron extends ItemTool { - - public ItemSwordIron() { - this(0, 1); - } - - public ItemSwordIron(Integer meta) { - this(meta, 1); - } - - public ItemSwordIron(Integer meta, int count) { - super(IRON_SWORD, meta, count, "Iron Sword"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_IRON; - } - - @Override - public boolean isSword() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_IRON; - } - - @Override - public int getAttackDamage() { - return 6; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSwordNetherite.java b/src/main/java/cn/nukkit/item/ItemSwordNetherite.java deleted file mode 100644 index b1c6c2126..000000000 --- a/src/main/java/cn/nukkit/item/ItemSwordNetherite.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.item; - -public class ItemSwordNetherite extends ItemTool { - - public ItemSwordNetherite() { - this(0, 1); - } - - public ItemSwordNetherite(Integer meta) { - this(meta, 1); - } - - public ItemSwordNetherite(Integer meta, int count) { - super(NETHERITE_SWORD, meta, count, "Netherite Sword"); - } - - @Override - public boolean isSword() { - return true; - } - - @Override - public int getAttackDamage() { - return 8; - } - - @Override - public int getTier() { - return ItemTool.TIER_NETHERITE; - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_NETHERITE; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSwordStone.java b/src/main/java/cn/nukkit/item/ItemSwordStone.java deleted file mode 100644 index 34c1fa014..000000000 --- a/src/main/java/cn/nukkit/item/ItemSwordStone.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSwordStone extends ItemTool { - - public ItemSwordStone() { - this(0, 1); - } - - public ItemSwordStone(Integer meta) { - this(meta, 1); - } - - public ItemSwordStone(Integer meta, int count) { - super(STONE_SWORD, meta, count, "Stone Sword"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_STONE; - } - - @Override - public boolean isSword() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_STONE; - } - - @Override - public int getAttackDamage() { - return 5; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemSwordWood.java b/src/main/java/cn/nukkit/item/ItemSwordWood.java deleted file mode 100644 index 7725fe6d5..000000000 --- a/src/main/java/cn/nukkit/item/ItemSwordWood.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemSwordWood extends ItemTool { - - public ItemSwordWood() { - this(0, 1); - } - - public ItemSwordWood(Integer meta) { - this(meta, 1); - } - - public ItemSwordWood(Integer meta, int count) { - super(WOODEN_SWORD, meta, count, "Wooden Sword"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_WOODEN; - } - - @Override - public boolean isSword() { - return true; - } - - @Override - public int getTier() { - return ItemTool.TIER_WOODEN; - } - - @Override - public int getAttackDamage() { - return 4; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemTool.java b/src/main/java/cn/nukkit/item/ItemTool.java deleted file mode 100644 index a98b6ca46..000000000 --- a/src/main/java/cn/nukkit/item/ItemTool.java +++ /dev/null @@ -1,163 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.block.Block; -import cn.nukkit.entity.Entity; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.nbt.tag.ByteTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class ItemTool extends Item implements ItemDurable { - - public static final int TIER_WOODEN = 1; - public static final int TIER_GOLD = 2; - public static final int TIER_STONE = 3; - public static final int TIER_IRON = 4; - public static final int TIER_DIAMOND = 5; - public static final int TIER_NETHERITE = 6; - - public static final int TYPE_NONE = 0; - public static final int TYPE_SWORD = 1; - public static final int TYPE_SHOVEL = 2; - public static final int TYPE_PICKAXE = 3; - public static final int TYPE_AXE = 4; - public static final int TYPE_SHEARS = 5; - public static final int TYPE_HOE = 6; - - public static final int DURABILITY_WOODEN = 60; - public static final int DURABILITY_GOLD = 33; - public static final int DURABILITY_STONE = 132; - public static final int DURABILITY_IRON = 251; - public static final int DURABILITY_DIAMOND = 1562; - public static final int DURABILITY_NETHERITE = 2032; - public static final int DURABILITY_FLINT_STEEL = 65; - public static final int DURABILITY_SHEARS = 239; - public static final int DURABILITY_BOW = 385; - public static final int DURABILITY_CROSSBOW = 385; - public static final int DURABILITY_TRIDENT = 251; - public static final int DURABILITY_FISHING_ROD = 65; - public static final int DURABILITY_CARROT_ON_A_STICK = 25; - public static final int DURABILITY_WARPED_FUNGUS_ON_A_STICK = 100; - - public ItemTool(int id) { - this(id, 0, 1, UNKNOWN_STR); - } - - public ItemTool(int id, Integer meta) { - this(id, meta, 1, UNKNOWN_STR); - } - - public ItemTool(int id, Integer meta, int count) { - this(id, meta, count, UNKNOWN_STR); - } - - public ItemTool(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } - - @Override - public int getMaxStackSize() { - return 1; - } - - @Override - public boolean useOn(Block block) { - if (this.isUnbreakable() || isDurable() || noDamageOnBreak()) { - return true; - } - - if (block.getToolType() == ItemTool.TYPE_PICKAXE && this.isPickaxe() || - block.getToolType() == ItemTool.TYPE_SHOVEL && this.isShovel() || - block.getToolType() == ItemTool.TYPE_AXE && this.isAxe() || - block.getToolType() == ItemTool.TYPE_HOE && this.isHoe() || - block.getToolType() == ItemTool.TYPE_SWORD && this.isSword() || - block.getToolType() == ItemTool.TYPE_SHEARS && this.isShears() - ) { - this.meta++; - } else if (!this.isShears() && block.getBreakTime(this) > 0) { - this.meta += 2; - } else if (this.isHoe()) { - if (block.getId() == GRASS || block.getId() == DIRT) { - this.meta++; - } - } else { - this.meta++; - } - return true; - } - - @Override - public boolean useOn(Entity entity) { - if (this.isUnbreakable() || isDurable() || noDamageOnAttack()) { - return true; - } - - if ((entity != null) && !this.isSword()) { - this.meta += 2; - } else { - this.meta++; - } - - return true; - } - - private boolean isDurable() { - if (!hasEnchantments()) { - return false; - } - - Enchantment durability = getEnchantment(Enchantment.ID_DURABILITY); - return durability != null && durability.getLevel() > 0 && (100 / (durability.getLevel() + 1)) <= Utils.random.nextInt(100); - } - - @Override - public boolean isUnbreakable() { - Tag tag = this.getNamedTagEntry("Unbreakable"); - return tag instanceof ByteTag && ((ByteTag) tag).data > 0; - } - - @Override - public boolean isTool() { - return true; - } - - @Override - public int getEnchantAbility() { - switch (this.getTier()) { - case TIER_STONE: - return 5; - case TIER_WOODEN: - return 15; - case TIER_DIAMOND: - return 10; - case TIER_GOLD: - return 22; - case TIER_IRON: - return 14; - case TIER_NETHERITE: - return 10; //TODO - } - - return 0; - } - - /** - * No damage to item when it's used to attack entities - * @return whether the item should take damage when used to attack entities - */ - public boolean noDamageOnAttack() { - return false; - } - - /** - * No damage to item when it's used to break blocks - * @return whether the item should take damage when used to break blocks - */ - public boolean noDamageOnBreak() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemTotem.java b/src/main/java/cn/nukkit/item/ItemTotem.java deleted file mode 100644 index 0a12915ff..000000000 --- a/src/main/java/cn/nukkit/item/ItemTotem.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.item; - -public class ItemTotem extends Item { - - public ItemTotem(Integer meta) { - this(meta, 1); - } - - public ItemTotem(Integer meta, int count) { - super(TOTEM, meta, count, "Totem of Undying"); - } - - @Override - public int getMaxStackSize() { - return 1; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemTrident.java b/src/main/java/cn/nukkit/item/ItemTrident.java deleted file mode 100644 index 319bb8f71..000000000 --- a/src/main/java/cn/nukkit/item/ItemTrident.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.projectile.EntityThrownTrident; -import cn.nukkit.event.entity.EntityShootBowEvent; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -/** - * Created by PetteriM1 - */ -public class ItemTrident extends ItemTool { - - public ItemTrident() { - this(0, 1); - } - - public ItemTrident(Integer meta) { - this(meta, 1); - } - - public ItemTrident(Integer meta, int count) { - super(TRIDENT, meta, count, "Trident"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_TRIDENT; - } - - @Override - public boolean isSword() { - return true; - } - - @Override - public int getAttackDamage() { - return 9; - } - - @Override - public boolean onClickAir(Player player, Vector3 directionVector) { - return true; - } - - @Override - public boolean onRelease(Player player, int ticksUsed) { - if (this.hasEnchantment(Enchantment.ID_TRIDENT_RIPTIDE)) { - return true; - } - - this.useOn(player); - - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", player.x)) - .add(new DoubleTag("", player.y + player.getEyeHeight())) - .add(new DoubleTag("", player.z))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", -Math.sin(player.yaw / 180 * Math.PI) * Math.cos(player.pitch / 180 * Math.PI))) - .add(new DoubleTag("", -Math.sin(player.pitch / 180 * Math.PI))) - .add(new DoubleTag("", Math.cos(player.yaw / 180 * Math.PI) * Math.cos(player.pitch / 180 * Math.PI)))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", (player.yaw > 180 ? 360 : 0) - (float) player.yaw)) - .add(new FloatTag("", (float) -player.pitch))); - - EntityThrownTrident trident = new EntityThrownTrident(player.chunk, nbt, player); - trident.setItem(this); - - double p = (double) ticksUsed / 20; - double f = Math.min((p * p + p * 2) / 3, 1) * 2.5; - - EntityShootBowEvent entityShootBowEvent = new EntityShootBowEvent(player, this, trident, f); - - if (f < 0.1 || ticksUsed < 5) { - entityShootBowEvent.setCancelled(); - } - - Server.getInstance().getPluginManager().callEvent(entityShootBowEvent); - if (entityShootBowEvent.isCancelled()) { - entityShootBowEvent.getProjectile().close(); - } else { - entityShootBowEvent.getProjectile().setMotion(entityShootBowEvent.getProjectile().getMotion().multiply(entityShootBowEvent.getForce())); - ProjectileLaunchEvent ev = new ProjectileLaunchEvent(entityShootBowEvent.getProjectile()); - Server.getInstance().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - entityShootBowEvent.getProjectile().close(); - } else { - entityShootBowEvent.getProjectile().spawnToAll(); - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_ITEM_TRIDENT_THROW); - if (!player.isCreative()) { - this.count--; - player.getInventory().setItemInHand(this); - } - } - } - - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemTurtleShell.java b/src/main/java/cn/nukkit/item/ItemTurtleShell.java deleted file mode 100644 index d2c2d1c9c..000000000 --- a/src/main/java/cn/nukkit/item/ItemTurtleShell.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.item; - -/** - * Created by PetteriM1 - */ -public class ItemTurtleShell extends ItemArmor { - - public ItemTurtleShell() { - this(0, 1); - } - - public ItemTurtleShell(Integer meta) { - this(meta, 1); - } - - public ItemTurtleShell(Integer meta, int count) { - super(TURTLE_SHELL, meta, count, "Turtle Shell"); - } - - @Override - public int getTier() { - return ItemArmor.TIER_OTHER; - } - - @Override - public boolean isHelmet() { - return true; - } - - @Override - public int getArmorPoints() { - return 2; - } - - @Override - public int getMaxDurability() { - return 276; - } - - @Override - public int getToughness() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemWarpedFungusOnAStick.java b/src/main/java/cn/nukkit/item/ItemWarpedFungusOnAStick.java deleted file mode 100644 index e8c0378c1..000000000 --- a/src/main/java/cn/nukkit/item/ItemWarpedFungusOnAStick.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.item; - -/** - * @author PetteriM1 - */ -public class ItemWarpedFungusOnAStick extends ItemTool { - - public ItemWarpedFungusOnAStick() { - this(0, 1); - } - - public ItemWarpedFungusOnAStick(Integer meta) { - this(meta, 1); - } - - public ItemWarpedFungusOnAStick(Integer meta, int count) { - super(WARPED_FUNGUS_ON_A_STICK, meta, count, "Warped Fungus on a Stick"); - } - - @Override - public int getMaxDurability() { - return ItemTool.DURABILITY_WARPED_FUNGUS_ON_A_STICK; - } - - @Override - public boolean noDamageOnBreak() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/ItemWheat.java b/src/main/java/cn/nukkit/item/ItemWheat.java deleted file mode 100644 index d46ed0ddf..000000000 --- a/src/main/java/cn/nukkit/item/ItemWheat.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ItemWheat extends Item { - - public ItemWheat() { - this(0, 1); - } - - public ItemWheat(Integer meta) { - this(meta, 1); - } - - public ItemWheat(Integer meta, int count) { - super(WHEAT, meta, count, "Wheat"); - } -} diff --git a/src/main/java/cn/nukkit/item/ProjectileItem.java b/src/main/java/cn/nukkit/item/ProjectileItem.java deleted file mode 100644 index fd2a1479e..000000000 --- a/src/main/java/cn/nukkit/item/ProjectileItem.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityExpBottle; -import cn.nukkit.entity.projectile.EntityEnderPearl; -import cn.nukkit.entity.projectile.EntityProjectile; -import cn.nukkit.event.entity.ProjectileLaunchEvent; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.DoubleTag; -import cn.nukkit.nbt.tag.FloatTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.LevelSoundEventPacket; - -/** - * @author CreeperFace - */ -public abstract class ProjectileItem extends Item { - - public ProjectileItem(int id, Integer meta, int count, String name) { - super(id, meta, count, name); - } - - abstract public String getProjectileEntityType(); - - abstract public float getThrowForce(); - - public boolean onClickAir(Player player, Vector3 directionVector) { - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos") - .add(new DoubleTag("", player.x)) - .add(new DoubleTag("", player.y + player.getEyeHeight())) - .add(new DoubleTag("", player.z))) - .putList(new ListTag("Motion") - .add(new DoubleTag("", directionVector.x)) - .add(new DoubleTag("", directionVector.y)) - .add(new DoubleTag("", directionVector.z))) - .putList(new ListTag("Rotation") - .add(new FloatTag("", (float) player.yaw)) - .add(new FloatTag("", (float) player.pitch))); - - this.correctNBT(nbt); - - Entity projectile = Entity.createEntity(this.getProjectileEntityType(), player.getLevel().getChunk(player.getFloorX() >> 4, player.getFloorZ() >> 4), nbt, player); - if (projectile != null) { - if (projectile instanceof EntityEnderPearl) { - if (player.getServer().getTick() - player.getLastEnderPearlThrowingTick() < 20) { - projectile.close(); - return false; - } - } - - projectile.setMotion(projectile.getMotion().multiply(this.getThrowForce())); - - if (projectile instanceof EntityProjectile) { - ProjectileLaunchEvent ev = new ProjectileLaunchEvent((EntityProjectile) projectile); - - player.getServer().getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - projectile.close(); - } else if (player.getGamemode() == Player.CREATIVE && projectile instanceof EntityExpBottle && !player.getServer().xpBottlesOnCreative) { - ev.setCancelled(true); - projectile.close(); - player.sendMessage("\u00A7cXP bottles are disabled on creative"); - } else { - if (!player.isCreative()) { - this.count--; - } - if (projectile instanceof EntityEnderPearl) { - player.onThrowEnderPearl(); - } - projectile.spawnToAll(); - player.getLevel().addLevelSoundEvent(player, LevelSoundEventPacket.SOUND_BOW); - } - } - } - - return true; - } - - protected void correctNBT(CompoundTag nbt) { - } -} diff --git a/src/main/java/cn/nukkit/item/RuntimeItemMapping.java b/src/main/java/cn/nukkit/item/RuntimeItemMapping.java deleted file mode 100644 index 97eca8aff..000000000 --- a/src/main/java/cn/nukkit/item/RuntimeItemMapping.java +++ /dev/null @@ -1,213 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Server; -import cn.nukkit.item.RuntimeItems.MappingEntry; - -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.BinaryStream; -import cn.nukkit.utils.Utils; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import lombok.Data; -import lombok.extern.log4j.Log4j2; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.HashMap; -import java.util.Map; - -@Log4j2 -public class RuntimeItemMapping { - - private final int protocolId; - - private final Int2ObjectMap runtime2Legacy = new Int2ObjectOpenHashMap<>(); - private final Int2ObjectMap legacy2Runtime = new Int2ObjectOpenHashMap<>(); - private final Map identifier2Legacy = new HashMap<>(); - - private byte[] itemPalette; - - public RuntimeItemMapping(Map mappings, String itemStatesFile, int protocolId) { - this.protocolId = protocolId; - InputStream stream = Server.class.getClassLoader().getResourceAsStream(itemStatesFile); - if (stream == null) { - throw new AssertionError("Unable to load " + itemStatesFile); - } - JsonArray json = JsonParser.parseReader(new InputStreamReader(stream, StandardCharsets.UTF_8)).getAsJsonArray(); - - for (JsonElement element : json) { - if (!element.isJsonObject()) { - throw new IllegalStateException("Invalid entry"); - } - JsonObject entry = element.getAsJsonObject(); - String identifier = entry.get("name").getAsString(); - int runtimeId = entry.get("id").getAsInt(); - - if (this.protocolId < ProtocolInfo.v1_16_100) { - this.registerOldItem(identifier, runtimeId); - continue; - } - - boolean hasDamage = false; - int damage = 0; - int legacyId; - - if (mappings.containsKey(identifier)) { - MappingEntry mapping = mappings.get(identifier); - legacyId = RuntimeItems.getLegacyIdFromLegacyString(mapping.getLegacyName()); - if (legacyId == -1) { - throw new IllegalStateException("Unable to match " + mapping + " with legacyId"); - } - damage = mapping.getDamage(); - hasDamage = true; - } else { - legacyId = RuntimeItems.getLegacyIdFromLegacyString(identifier); - if (legacyId == -1) { - log.trace("Unable to find legacyId for " + identifier); - continue; - } - } - - int fullId = this.getFullId(legacyId, damage); - LegacyEntry legacyEntry = new LegacyEntry(legacyId, hasDamage, damage); - - this.runtime2Legacy.put(runtimeId, legacyEntry); - this.identifier2Legacy.put(identifier, legacyEntry); - this.legacy2Runtime.put(fullId, new RuntimeEntry(identifier, runtimeId, hasDamage)); - } - - this.generatePalette(); - } - - private void registerOldItem(String identifier, int legacyId) { - int fullId = this.getFullId(legacyId, 0); - LegacyEntry legacyEntry = new LegacyEntry(legacyId, false, 0); - - this.runtime2Legacy.put(legacyId, legacyEntry); - this.identifier2Legacy.put(identifier, legacyEntry); - this.legacy2Runtime.put(fullId, new RuntimeEntry(identifier, legacyId, false)); - } - - private void generatePalette() { - BinaryStream paletteBuffer = new BinaryStream(); - paletteBuffer.putUnsignedVarInt(this.legacy2Runtime.size()); - for (RuntimeEntry entry : this.legacy2Runtime.values()) { - paletteBuffer.putString(entry.getIdentifier()); - paletteBuffer.putLShort(entry.getRuntimeId()); - if (this.protocolId >= ProtocolInfo.v1_16_100) { - paletteBuffer.putBoolean(false); // Component item - } - } - this.itemPalette = paletteBuffer.getBuffer(); - } - - public LegacyEntry fromRuntime(int runtimeId) { - LegacyEntry legacyEntry = this.runtime2Legacy.get(runtimeId); - if (legacyEntry == null) { - throw new IllegalArgumentException("Unknown runtime2Legacy mapping: " + runtimeId); - } - return legacyEntry; - } - - public RuntimeEntry toRuntime(int id, int meta) { - RuntimeEntry runtimeEntry = this.legacy2Runtime.get(this.getFullId(id, meta)); - if (runtimeEntry == null) { - runtimeEntry = this.legacy2Runtime.get(this.getFullId(id, 0)); - } - - if (runtimeEntry == null) { - throw new IllegalArgumentException("Unknown legacy2Runtime mapping: id=" + id + " meta=" + meta); - } - return runtimeEntry; - } - - public Item parseCreativeItem(JsonObject json, boolean ignoreUnknown) { - return this.parseCreativeItem(json, ignoreUnknown, this.protocolId); - } - - public Item parseCreativeItem(JsonObject json, boolean ignoreUnknown, int protocolId) { - String identifier = json.get("id").getAsString(); - LegacyEntry legacyEntry = this.fromIdentifier(identifier); - if (legacyEntry == null) { - if (!ignoreUnknown) { - throw new IllegalStateException("Can not find legacyEntry for " + identifier); - } - log.trace("Can not find legacyEntry for " + identifier); - return null; - } - - byte[] nbtBytes; - if (json.has("nbt_b64")) { - nbtBytes = Base64.getDecoder().decode(json.get("nbt_b64").getAsString()); - } else if (json.has("nbt_hex")) { - nbtBytes = Utils.parseHexBinary(json.get("nbt_hex").getAsString()); - } else { - nbtBytes = new byte[0]; - } - - int legacyId = legacyEntry.getLegacyId(); - int damage = 0; - if (json.has("damage")) { - damage = json.get("damage").getAsInt(); - } else if (legacyEntry.isHasDamage()) { - damage = legacyEntry.getDamage(); - } else if (json.has("blockRuntimeId")) { - int runtimeId = json.get("blockRuntimeId").getAsInt(); - int fullId = GlobalBlockPalette.getLegacyFullId(protocolId, runtimeId); - if (fullId == -1) { - if (ignoreUnknown) { - return null; - } else { - throw new IllegalStateException("Can not find blockRuntimeId for " + runtimeId); - } - } - - damage = fullId & 0xf; - } - - int count = json.has("count") ? json.get("count").getAsInt() : 1; - return Item.get(legacyId, damage, count, nbtBytes); - } - - - public LegacyEntry fromIdentifier(String identifier) { - return this.identifier2Legacy.get(identifier); - } - - public int getFullId(int id, int data) { - return (((short) id) << 16) | ((data & 0x7fff) << 1); - } - - public byte[] getItemPalette() { - return this.itemPalette; - } - - public int getProtocolId() { - return this.protocolId; - } - - @Data - public static class LegacyEntry { - private final int legacyId; - private final boolean hasDamage; - private final int damage; - - public int getDamage() { - return this.hasDamage ? this.damage : 0; - } - } - - @Data - public static class RuntimeEntry { - private final String identifier; - private final int runtimeId; - private final boolean hasDamage; - } -} diff --git a/src/main/java/cn/nukkit/item/RuntimeItems.java b/src/main/java/cn/nukkit/item/RuntimeItems.java deleted file mode 100644 index c1a63025f..000000000 --- a/src/main/java/cn/nukkit/item/RuntimeItems.java +++ /dev/null @@ -1,118 +0,0 @@ -package cn.nukkit.item; - -import cn.nukkit.Server; -import cn.nukkit.network.protocol.ProtocolInfo; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import lombok.ToString; -import lombok.experimental.UtilityClass; -import lombok.extern.log4j.Log4j2; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.Map; - -@Log4j2 -@UtilityClass -public class RuntimeItems { - - private static final Map legacyString2LegacyInt = new HashMap<>(); - - private static RuntimeItemMapping mapping361; - private static RuntimeItemMapping mapping419; - private static RuntimeItemMapping mapping440; - private static RuntimeItemMapping mapping448; - - private static boolean initialized; - - public static void init() { - if (initialized) { - throw new IllegalStateException("RuntimeItems were already generated!"); - } - initialized = true; - log.debug("Loading runtime items..."); - InputStream itemIdsStream = Server.class.getClassLoader().getResourceAsStream("legacy_item_ids.json"); - if (itemIdsStream == null) { - throw new AssertionError("Unable to load legacy_item_ids.json"); - } - - JsonObject json = JsonParser.parseReader(new InputStreamReader(itemIdsStream)).getAsJsonObject(); - for (String identifier : json.keySet()) { - legacyString2LegacyInt.put(identifier, json.get(identifier).getAsInt()); - } - - InputStream mappingStream = Server.class.getClassLoader().getResourceAsStream("item_mappings.json"); - if (mappingStream == null) { - throw new AssertionError("Unable to load item_mappings.json"); - } - JsonObject itemMapping = JsonParser.parseReader(new InputStreamReader(mappingStream)).getAsJsonObject(); - - Map mappingEntries = new HashMap<>(); - for (String legacyName : itemMapping.keySet()) { - JsonObject convertData = itemMapping.getAsJsonObject(legacyName); - for (String damageStr : convertData.keySet()) { - String identifier = convertData.get(damageStr).getAsString(); - int damage = Integer.parseInt(damageStr); - mappingEntries.put(identifier, new MappingEntry(legacyName, damage)); - } - } - - mapping361 = new RuntimeItemMapping(mappingEntries, "runtime_item_states_361.json", ProtocolInfo.v1_12_0); - mapping419 = new RuntimeItemMapping(mappingEntries, "runtime_item_states_419.json", ProtocolInfo.v1_16_100); - mapping440 = new RuntimeItemMapping(mappingEntries, "runtime_item_states_440.json", ProtocolInfo.v1_17_0); - mapping448 = new RuntimeItemMapping(mappingEntries, "runtime_item_states_448.json", ProtocolInfo.v1_17_10); - } - - public static RuntimeItemMapping getMapping(int protocolId) { - if (protocolId >= ProtocolInfo.v1_17_10) { - return mapping448; - } else if (protocolId >= ProtocolInfo.v1_17_0) { - return mapping440; - } else if (protocolId >= ProtocolInfo.v1_16_100) { - return mapping419; - } - return mapping361; - } - - public static int getLegacyIdFromLegacyString(String identifier) { - return legacyString2LegacyInt.getOrDefault(identifier, -1); - } - - @Data - public static class MappingEntry { - private final String legacyName; - private final int damage; - } - - public static int getId(int fullId) { - return (short) (fullId >> 16); - } - - public static int getData(int fullId) { - return ((fullId >> 1) & 0x7fff); - } - - public static int getFullId(int id, int data) { - return (((short) id) << 16) | ((data & 0x7fff) << 1); - } - - public static int getNetworkId(int networkFullId) { - return networkFullId >> 1; - } - - public static boolean hasData(int id) { - return (id & 0x1) != 0; - } - - @ToString - @RequiredArgsConstructor - static class Entry { - String name; - int id; - Integer oldId; - Integer oldData; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/Enchantment.java b/src/main/java/cn/nukkit/item/enchantment/Enchantment.java deleted file mode 100644 index 3bce2418b..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/Enchantment.java +++ /dev/null @@ -1,313 +0,0 @@ -package cn.nukkit.item.enchantment; - -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.bow.EnchantmentBowFlame; -import cn.nukkit.item.enchantment.bow.EnchantmentBowInfinity; -import cn.nukkit.item.enchantment.bow.EnchantmentBowKnockback; -import cn.nukkit.item.enchantment.bow.EnchantmentBowPower; -import cn.nukkit.item.enchantment.crossbow.EnchantmentCrossbowMultishot; -import cn.nukkit.item.enchantment.crossbow.EnchantmentCrossbowPiercing; -import cn.nukkit.item.enchantment.crossbow.EnchantmentCrossbowQuickCharge; -import cn.nukkit.item.enchantment.damage.EnchantmentDamageAll; -import cn.nukkit.item.enchantment.damage.EnchantmentDamageArthropods; -import cn.nukkit.item.enchantment.damage.EnchantmentDamageSmite; -import cn.nukkit.item.enchantment.loot.EnchantmentLootDigging; -import cn.nukkit.item.enchantment.loot.EnchantmentLootFishing; -import cn.nukkit.item.enchantment.loot.EnchantmentLootWeapon; -import cn.nukkit.item.enchantment.protection.*; -import cn.nukkit.item.enchantment.trident.EnchantmentTridentChanneling; -import cn.nukkit.item.enchantment.trident.EnchantmentTridentImpaling; -import cn.nukkit.item.enchantment.trident.EnchantmentTridentLoyalty; -import cn.nukkit.item.enchantment.trident.EnchantmentTridentRiptide; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.HashSet; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Enchantment implements Cloneable { - - protected static Enchantment[] enchantments; - - public static final int ID_PROTECTION_ALL = 0; - public static final int ID_PROTECTION_FIRE = 1; - public static final int ID_PROTECTION_FALL = 2; - public static final int ID_PROTECTION_EXPLOSION = 3; - public static final int ID_PROTECTION_PROJECTILE = 4; - public static final int ID_THORNS = 5; - public static final int ID_WATER_BREATHING = 6; - public static final int ID_WATER_WALKER = 7; - public static final int ID_WATER_WORKER = 8; - public static final int ID_DAMAGE_ALL = 9; - public static final int ID_DAMAGE_SMITE = 10; - public static final int ID_DAMAGE_ARTHROPODS = 11; - public static final int ID_KNOCKBACK = 12; - public static final int ID_FIRE_ASPECT = 13; - public static final int ID_LOOTING = 14; - public static final int ID_EFFICIENCY = 15; - public static final int ID_SILK_TOUCH = 16; - public static final int ID_DURABILITY = 17; - public static final int ID_FORTUNE_DIGGING = 18; - public static final int ID_BOW_POWER = 19; - public static final int ID_BOW_KNOCKBACK = 20; - public static final int ID_BOW_FLAME = 21; - public static final int ID_BOW_INFINITY = 22; - public static final int ID_FORTUNE_FISHING = 23; - public static final int ID_LURE = 24; - public static final int ID_FROST_WALKER = 25; - public static final int ID_MENDING = 26; - public static final int ID_BINDING_CURSE = 27; - public static final int ID_VANISHING_CURSE = 28; - public static final int ID_TRIDENT_IMPALING = 29; - public static final int ID_TRIDENT_RIPTIDE = 30; - public static final int ID_TRIDENT_LOYALTY = 31; - public static final int ID_TRIDENT_CHANNELING = 32; - public static final int ID_CROSSBOW_MULTISHOT = 33; - public static final int ID_CROSSBOW_PIERCING = 34; - public static final int ID_CROSSBOW_QUICK_CHARGE = 35; - public static final int ID_SOUL_SPEED = 36; - - public static void init() { - enchantments = new Enchantment[256]; - - enchantments[ID_PROTECTION_ALL] = new EnchantmentProtectionAll(); - enchantments[ID_PROTECTION_FIRE] = new EnchantmentProtectionFire(); - enchantments[ID_PROTECTION_FALL] = new EnchantmentProtectionFall(); - enchantments[ID_PROTECTION_EXPLOSION] = new EnchantmentProtectionExplosion(); - enchantments[ID_PROTECTION_PROJECTILE] = new EnchantmentProtectionProjectile(); - enchantments[ID_THORNS] = new EnchantmentThorns(); - enchantments[ID_WATER_BREATHING] = new EnchantmentWaterBreath(); - enchantments[ID_WATER_WORKER] = new EnchantmentWaterWorker(); - enchantments[ID_WATER_WALKER] = new EnchantmentWaterWalker(); - enchantments[ID_DAMAGE_ALL] = new EnchantmentDamageAll(); - enchantments[ID_DAMAGE_SMITE] = new EnchantmentDamageSmite(); - enchantments[ID_DAMAGE_ARTHROPODS] = new EnchantmentDamageArthropods(); - enchantments[ID_KNOCKBACK] = new EnchantmentKnockback(); - enchantments[ID_FIRE_ASPECT] = new EnchantmentFireAspect(); - enchantments[ID_LOOTING] = new EnchantmentLootWeapon(); - enchantments[ID_EFFICIENCY] = new EnchantmentEfficiency(); - enchantments[ID_SILK_TOUCH] = new EnchantmentSilkTouch(); - enchantments[ID_DURABILITY] = new EnchantmentDurability(); - enchantments[ID_FORTUNE_DIGGING] = new EnchantmentLootDigging(); - enchantments[ID_BOW_POWER] = new EnchantmentBowPower(); - enchantments[ID_BOW_KNOCKBACK] = new EnchantmentBowKnockback(); - enchantments[ID_BOW_FLAME] = new EnchantmentBowFlame(); - enchantments[ID_BOW_INFINITY] = new EnchantmentBowInfinity(); - enchantments[ID_FORTUNE_FISHING] = new EnchantmentLootFishing(); - enchantments[ID_LURE] = new EnchantmentLure(); - enchantments[ID_FROST_WALKER] = new EnchantmentFrostWalker(); - enchantments[ID_MENDING] = new EnchantmentMending(); - enchantments[ID_BINDING_CURSE] = new EnchantmentBindingCurse(); - enchantments[ID_VANISHING_CURSE] = new EnchantmentVanishingCurse(); - enchantments[ID_TRIDENT_IMPALING] = new EnchantmentTridentImpaling(); - enchantments[ID_TRIDENT_LOYALTY] = new EnchantmentTridentLoyalty(); - enchantments[ID_TRIDENT_RIPTIDE] = new EnchantmentTridentRiptide(); - enchantments[ID_TRIDENT_CHANNELING] = new EnchantmentTridentChanneling(); - enchantments[ID_CROSSBOW_MULTISHOT] = new EnchantmentCrossbowMultishot(); - enchantments[ID_CROSSBOW_PIERCING] = new EnchantmentCrossbowPiercing(); - enchantments[ID_CROSSBOW_QUICK_CHARGE] = new EnchantmentCrossbowQuickCharge(); - enchantments[ID_SOUL_SPEED] = new EnchantmentSoulSpeed(); - } - - public static Enchantment get(int id) { - Enchantment enchantment = null; - if (id >= 0 && id < enchantments.length) { - enchantment = enchantments[id]; - } - if (enchantment == null) { - return new UnknownEnchantment(id); - } - return enchantment; - } - - public static Enchantment getEnchantment(int id) { - return get(id).clone(); - } - - public static Enchantment[] getEnchantments() { - ArrayList list = new ArrayList<>(); - for (Enchantment enchantment : enchantments) { - if (enchantment == null) { - break; - } - - list.add(enchantment); - } - - return list.toArray(new Enchantment[0]); - } - - public final int id; - private final Rarity rarity; - public EnchantmentType type; - - protected int level = 1; - - protected final String name; - - protected Enchantment(int id, String name, Rarity rarity, EnchantmentType type) { - this.id = id; - this.rarity = rarity; - this.type = type; - - this.name = name; - } - - public int getLevel() { - return level; - } - - public Enchantment setLevel(int level) { - return this.setLevel(level, true); - } - - public Enchantment setLevel(int level, boolean safe) { - if (!safe) { - this.level = level; - return this; - } - - if (level > this.getMaxLevel()) { - this.level = this.getMaxLevel(); - } else this.level = Math.max(level, this.getMinLevel()); - - return this; - } - - public int getId() { - return id; - } - - public Rarity getRarity() { - return this.rarity; - } - - public int getWeight() { - return this.rarity.getWeight(); - } - - public int getMinLevel() { - return 1; - } - - public int getMaxLevel() { - return 1; - } - - public int getMaxEnchantableLevel() { - return getMaxLevel(); - } - - public int getMinEnchantAbility(int level) { - return 1 + level * 10; - } - - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 5; - } - - public float getProtectionFactor(EntityDamageEvent event) { - return 0; - } - - public double getDamageBonus(Entity entity) { - return 0; - } - - public void doPostAttack(Entity attacker, Entity entity) { - - } - - public void doAttack(Entity attacker, Entity entity) { - - } - - public void doPostHurt(Entity attacker, Entity entity) { - - } - - public final boolean isCompatibleWith(Enchantment enchantment) { - return this.checkCompatibility(enchantment) && enchantment.checkCompatibility(this); - } - - protected boolean checkCompatibility(Enchantment enchantment) { - return this != enchantment; - } - - public String getName() { - return "%enchantment." + this.name; - } - - public boolean canEnchant(Item item) { - return this.type.canEnchantItem(item); - } - - public boolean isMajor() { - return false; - } - - public boolean isTreasure() { - return false; - } - - @Override - protected Enchantment clone() { - try { - return (Enchantment) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - - public static final String[] words = {"the", "elder", "scrolls", "klaatu", "berata", "niktu", "xyzzy", "bless", "curse", "light", "darkness", "fire", "air", "earth", "water", "hot", "dry", "cold", "wet", "ignite", "snuff", "embiggen", "twist", "shorten", "stretch", "fiddle", "destroy", "imbue", "galvanize", "enchant", "free", "limited", "range", "of", "towards", "inside", "sphere", "cube", "self", "other", "ball", "mental", "physical", "grow", "shrink", "demon", "elemental", "spirit", "animal", "creature", "beast", "humanoid", "undead", "fresh", "stale"}; - - public static String getRandomName() { - HashSet set = new HashSet<>(); - while (set.size() < Utils.random.nextInt(3, 6)) { - set.add(Enchantment.words[Utils.random.nextInt(0, Enchantment.words.length)]); - } - - String[] words = set.toArray(new String[0]); - return String.join(" ", words); - } - - private static class UnknownEnchantment extends Enchantment { - - protected UnknownEnchantment(int id) { - super(id, "unknown", Rarity.VERY_RARE, EnchantmentType.ALL); - } - } - - public enum Rarity { - COMMON(10), - UNCOMMON(5), - RARE(2), - VERY_RARE(1); - - private final int weight; - - Rarity(int weight) { - this.weight = weight; - } - - public int getWeight() { - return this.weight; - } - - public static Rarity fromWeight(int weight) { - if (weight < 2) { - return VERY_RARE; - } else if (weight < 5) { - return RARE; - } else if (weight < 10) { - return UNCOMMON; - } - return COMMON; - } - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentBindingCurse.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentBindingCurse.java deleted file mode 100644 index e2d0b1876..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentBindingCurse.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item.enchantment; - -public class EnchantmentBindingCurse extends Enchantment { - - protected EnchantmentBindingCurse() { - super(ID_BINDING_CURSE, "curse.binding", Rarity.VERY_RARE, EnchantmentType.WEARABLE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 25; - } - - @Override - public int getMaxEnchantAbility(int level) { - return 30; - } - - @Override - public boolean isTreasure() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentDurability.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentDurability.java deleted file mode 100644 index 4de308f30..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentDurability.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.item.enchantment; - -import cn.nukkit.item.Item; - -import java.util.Random; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentDurability extends Enchantment { - - protected EnchantmentDurability() { - super(ID_DURABILITY, "durability", Rarity.UNCOMMON, EnchantmentType.BREAKABLE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 5 + ((level - 1) << 3); - } - - @Override - public int getMaxEnchantAbility(int level) { - return super.getMinEnchantAbility(level) + 50; - } - - @Override - public int getMaxLevel() { - return 3; - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - return super.checkCompatibility(enchantment) && enchantment.id != ID_FORTUNE_DIGGING; - } - - @Override - public boolean canEnchant(Item item) { - return item.getMaxDurability() >= 0 || super.canEnchant(item); - } - - public static boolean negateDamage(Item item, int level, Random random) { - return !(item.isArmor() && random.nextFloat() < 0.6f) && random.nextInt(level + 1) > 0; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentEfficiency.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentEfficiency.java deleted file mode 100644 index 289c601d9..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentEfficiency.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.item.enchantment; - -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentEfficiency extends Enchantment { - - protected EnchantmentEfficiency() { - super(ID_EFFICIENCY, "digging", Rarity.COMMON, EnchantmentType.DIGGER); - } - - @Override - public int getMinEnchantAbility(int level) { - return 1 + (level - 1) * 10; - } - - @Override - public int getMaxEnchantAbility(int level) { - return super.getMinEnchantAbility(level) + 50; - } - - @Override - public int getMaxLevel() { - return 5; - } - - @Override - public boolean canEnchant(Item item) { - return item.isShears() || super.canEnchant(item); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentEntry.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentEntry.java deleted file mode 100644 index 52ca6b7c2..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentEntry.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.item.enchantment; - -/** - * @author Nukkit Project Team - */ -public class EnchantmentEntry { - - private final Enchantment[] enchantments; - private final int cost; - private final String randomName; - - public EnchantmentEntry(Enchantment[] enchantments, int cost, String randomName) { - this.enchantments = enchantments; - this.cost = cost; - this.randomName = randomName; - } - - public Enchantment[] getEnchantments() { - return enchantments; - } - - public int getCost() { - return cost; - } - - public String getRandomName() { - return randomName; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentFireAspect.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentFireAspect.java deleted file mode 100644 index 0b8b9e815..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentFireAspect.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.item.enchantment; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.entity.EntityCombustByEntityEvent; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentFireAspect extends Enchantment { - - protected EnchantmentFireAspect() { - super(ID_FIRE_ASPECT, "fire", Rarity.RARE, EnchantmentType.SWORD); - } - - @Override - public int getMinEnchantAbility(int level) { - return 10 + (level - 1) * 20; - } - - @Override - public int getMaxEnchantAbility(int level) { - return super.getMinEnchantAbility(level) + 50; - } - - @Override - public int getMaxLevel() { - return 2; - } - - @Override - public void doAttack(Entity attacker, Entity entity) { - if ((!entity.isPlayer || !((Player) entity).isCreative())) { - int duration = Math.max(entity.fireTicks / 20, getLevel() << 2); - - EntityCombustByEntityEvent ev = new EntityCombustByEntityEvent(attacker, entity, duration); - Server.getInstance().getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - entity.setOnFire(ev.getDuration()); - } - } - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentFrostWalker.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentFrostWalker.java deleted file mode 100644 index 8bd9fac14..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentFrostWalker.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.item.enchantment; - -public class EnchantmentFrostWalker extends Enchantment { - - protected EnchantmentFrostWalker() { - super(ID_FROST_WALKER, "frostwalker", Rarity.RARE, EnchantmentType.ARMOR_FEET); - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 15; - } - - @Override - public int getMaxLevel() { - return 2; - } - - @Override - public boolean isTreasure() { - return true; - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - return super.checkCompatibility(enchantment) && enchantment.id != ID_WATER_WALKER; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentKnockback.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentKnockback.java deleted file mode 100644 index bd4d47e01..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentKnockback.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.item.enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentKnockback extends Enchantment { - - protected EnchantmentKnockback() { - super(ID_KNOCKBACK, "knockback", Rarity.UNCOMMON, EnchantmentType.SWORD); - } - - @Override - public int getMinEnchantAbility(int level) { - return 5 + (level - 1) * 20; - } - - @Override - public int getMaxEnchantAbility(int level) { - return super.getMinEnchantAbility(level) + 50; - } - - @Override - public int getMaxLevel() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentList.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentList.java deleted file mode 100644 index 84d873a51..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentList.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.item.enchantment; - -/** - * @author Nukkit Project Team - */ -public class EnchantmentList { - - private final EnchantmentEntry[] enchantments; - - public EnchantmentList(int size) { - this.enchantments = new EnchantmentEntry[size]; - } - - public EnchantmentList setSlot(int slot, EnchantmentEntry entry) { - enchantments[slot] = entry; - return this; - } - - public EnchantmentEntry getSlot(int slot) { - return enchantments[slot]; - } - - public int getSize() { - return enchantments.length; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentLure.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentLure.java deleted file mode 100644 index 51cd8fa3e..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentLure.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.item.enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentLure extends Enchantment { - - protected EnchantmentLure() { - super(ID_LURE, "fishingSpeed", Rarity.RARE, EnchantmentType.FISHING_ROD); - } - - @Override - public int getMinEnchantAbility(int level) { - return level + 8 * level + 6; - } - - @Override - public int getMaxLevel() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentMending.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentMending.java deleted file mode 100644 index c07de6083..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentMending.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.item.enchantment; - -/** - * @author Rover656 - */ -public class EnchantmentMending extends Enchantment { - - protected EnchantmentMending() { - super(ID_MENDING, "mending", Rarity.RARE, EnchantmentType.BREAKABLE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 25 * level; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 50; - } - - @Override - public boolean isTreasure() { - return true; - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - return super.checkCompatibility(enchantment) && enchantment.id != ID_BOW_INFINITY; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentSilkTouch.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentSilkTouch.java deleted file mode 100644 index 740ee115f..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentSilkTouch.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.item.enchantment; - -import cn.nukkit.item.Item; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentSilkTouch extends Enchantment { - - protected EnchantmentSilkTouch() { - super(ID_SILK_TOUCH, "untouching", Rarity.VERY_RARE, EnchantmentType.DIGGER); - } - - @Override - public int getMinEnchantAbility(int level) { - return 15; - } - - @Override - public int getMaxEnchantAbility(int level) { - return super.getMinEnchantAbility(level) + 50; - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - return super.checkCompatibility(enchantment) && enchantment.id != ID_FORTUNE_DIGGING; - } - - @Override - public boolean canEnchant(Item item) { - return item.isShears() || super.canEnchant(item); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentSoulSpeed.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentSoulSpeed.java deleted file mode 100644 index e5d8e1356..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentSoulSpeed.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.item.enchantment; - -public class EnchantmentSoulSpeed extends Enchantment { - - protected EnchantmentSoulSpeed() { - super(ID_SOUL_SPEED, "soul_speed", Rarity.VERY_RARE, EnchantmentType.ARMOR_FEET); - } - - @Override - public int getMinEnchantAbility(int level) { - return 10 * level; - } - - @Override - public int getMaxLevel() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentThorns.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentThorns.java deleted file mode 100644 index 2f2dc3605..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentThorns.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.item.enchantment; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityHumanType; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.item.Item; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentThorns extends Enchantment { - - protected EnchantmentThorns() { - super(ID_THORNS, "thorns", Rarity.RARE, EnchantmentType.ARMOR); - } - - @Override - public int getMinEnchantAbility(int level) { - return 10 + (level - 1) * 20; - } - - @Override - public int getMaxEnchantAbility(int level) { - return super.getMinEnchantAbility(level) + 50; - } - - @Override - public int getMaxLevel() { - return 3; - } - - @Override - public void doPostAttack(Entity attacker, Entity entity) { - if (!(entity instanceof EntityHumanType)) { - return; - } - - EntityHumanType human = (EntityHumanType) entity; - - int thornsLevel = 0; - - for (Item armor : human.getInventory().getArmorContents()) { - Enchantment thorns = armor.getEnchantment(Enchantment.ID_THORNS); - if (thorns != null) { - thornsLevel = Math.max(thorns.getLevel(), thornsLevel); - } - } - - ThreadLocalRandom random = ThreadLocalRandom.current(); - - if (shouldHit(random, thornsLevel)) { - attacker.attack(new EntityDamageByEntityEvent(entity, attacker, EntityDamageEvent.DamageCause.THORNS, getDamage(random, level), 0f)); - } - } - - private static boolean shouldHit(ThreadLocalRandom random, int level) { - return level > 0 && random.nextFloat() < 0.15 * level; - } - - private static int getDamage(ThreadLocalRandom random, int level) { - return level > 10 ? level - 10 : random.nextInt(1, 5); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentType.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentType.java deleted file mode 100644 index a0b8d0ba1..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentType.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.item.enchantment; - -import cn.nukkit.block.BlockPumpkin; -import cn.nukkit.item.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public enum EnchantmentType { - ALL, - ARMOR, - ARMOR_HEAD, - ARMOR_TORSO, - ARMOR_LEGS, - ARMOR_FEET, - SWORD, - DIGGER, - FISHING_ROD, - BREAKABLE, - BOW, - WEARABLE, - TRIDENT, - CROSSBOW; - - public boolean canEnchantItem(Item item) { - if (this == ALL) { - return true; - - } else if (this == BREAKABLE && item.getMaxDurability() >= 0) { - return true; - - } else if (item instanceof ItemArmor) { - if (this == ARMOR || this == WEARABLE) { - return true; - } - - switch (this) { - case ARMOR_HEAD: - return item.isHelmet(); - case ARMOR_TORSO: - return item.isChestplate(); - case ARMOR_LEGS: - return item.isLeggings(); - case ARMOR_FEET: - return item.isBoots(); - case WEARABLE: - return item instanceof ItemArmor || item instanceof ItemSkull || item.getBlock() instanceof BlockPumpkin; - default: - return false; - } - } else { - switch (this) { - case SWORD: - return item.isSword(); - case DIGGER: - return item.isPickaxe() || item.isShovel() || item.isAxe() || item.isHoe(); - case BOW: - return item instanceof ItemBow; - case FISHING_ROD: - return item instanceof ItemFishingRod; - case WEARABLE: - return item instanceof ItemSkull; - case TRIDENT: - return item instanceof ItemTrident; - case CROSSBOW: - return item instanceof ItemCrossbow; - default: - return false; - } - } - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentVanishingCurse.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentVanishingCurse.java deleted file mode 100644 index 40ad778af..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentVanishingCurse.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item.enchantment; - -import cn.nukkit.item.Item; - -public class EnchantmentVanishingCurse extends Enchantment { - - protected EnchantmentVanishingCurse() { - super(ID_VANISHING_CURSE, "curse.vanishing", Rarity.VERY_RARE, EnchantmentType.BREAKABLE); - } - - @Override - public boolean isTreasure() { - return true; - } - - public boolean canEnchant(Item item) { - return item.getId() == Item.SKULL || item.getId() == Item.COMPASS || super.canEnchant(item); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterBreath.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterBreath.java deleted file mode 100644 index 7e1fd5e3f..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterBreath.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.item.enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentWaterBreath extends Enchantment { - - protected EnchantmentWaterBreath() { - super(ID_WATER_BREATHING, "oxygen", Rarity.RARE, EnchantmentType.ARMOR_HEAD); - } - - @Override - public int getMinEnchantAbility(int level) { - return 10 * level; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 30; - } - - @Override - public int getMaxLevel() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterWalker.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterWalker.java deleted file mode 100644 index 36a0b4f79..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterWalker.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.item.enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentWaterWalker extends Enchantment { - - protected EnchantmentWaterWalker() { - super(ID_WATER_WALKER, "waterWalker", Rarity.RARE, EnchantmentType.ARMOR_FEET); - } - - @Override - public int getMinEnchantAbility(int level) { - return level * 10; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 10; - } - - @Override - public int getMaxLevel() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterWorker.java b/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterWorker.java deleted file mode 100644 index b8e45b52a..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/EnchantmentWaterWorker.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.item.enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentWaterWorker extends Enchantment { - - protected EnchantmentWaterWorker() { - super(ID_WATER_WORKER, "waterWorker", Rarity.RARE, EnchantmentType.ARMOR_HEAD); - } - - @Override - public int getMinEnchantAbility(int level) { - return 1; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 40; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBow.java b/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBow.java deleted file mode 100644 index 30581eab1..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBow.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.item.enchantment.bow; - -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EnchantmentBow extends Enchantment { - - protected EnchantmentBow(int id, String name, Rarity rarity) { - super(id, name, rarity, EnchantmentType.BOW); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowFlame.java b/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowFlame.java deleted file mode 100644 index 6bb109edc..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowFlame.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item.enchantment.bow; - -import cn.nukkit.item.enchantment.Enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentBowFlame extends EnchantmentBow { - public EnchantmentBowFlame() { - super(Enchantment.ID_BOW_FLAME, "arrowFire", Rarity.RARE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 20; - } - - @Override - public int getMaxEnchantAbility(int level) { - return 50; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowInfinity.java b/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowInfinity.java deleted file mode 100644 index 7848e7b75..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowInfinity.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.item.enchantment.bow; - -import cn.nukkit.item.enchantment.Enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentBowInfinity extends EnchantmentBow { - - public EnchantmentBowInfinity() { - super(Enchantment.ID_BOW_INFINITY, "arrowInfinite", Rarity.VERY_RARE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 20; - } - - @Override - public int getMaxEnchantAbility(int level) { - return 50; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowKnockback.java b/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowKnockback.java deleted file mode 100644 index 51cf980f9..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowKnockback.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.item.enchantment.bow; - -import cn.nukkit.item.enchantment.Enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentBowKnockback extends EnchantmentBow { - public EnchantmentBowKnockback() { - super(Enchantment.ID_BOW_KNOCKBACK, "arrowKnockback", Rarity.RARE); - } - - @Override - public int getMinEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 25; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 25; - } - - @Override - public int getMaxLevel() { - return 2; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowPower.java b/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowPower.java deleted file mode 100644 index 3c832fffc..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/bow/EnchantmentBowPower.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.item.enchantment.bow; - -import cn.nukkit.item.enchantment.Enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentBowPower extends EnchantmentBow { - - public EnchantmentBowPower() { - super(Enchantment.ID_BOW_POWER, "arrowDamage", Rarity.COMMON); - } - - @Override - public int getMinEnchantAbility(int level) { - return 1 + (level - 1) * 10; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 15; - } - - @Override - public int getMaxLevel() { - return 5; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbow.java b/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbow.java deleted file mode 100644 index 9afc026ef..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbow.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.nukkit.item.enchantment.crossbow; - -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -public abstract class EnchantmentCrossbow extends Enchantment { - - protected EnchantmentCrossbow(int id, String name, Rarity rarity) { - super(id, name, rarity, EnchantmentType.CROSSBOW); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowMultishot.java b/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowMultishot.java deleted file mode 100644 index 939c8f4ca..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowMultishot.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.item.enchantment.crossbow; - -import cn.nukkit.item.enchantment.Enchantment; - -public class EnchantmentCrossbowMultishot extends EnchantmentCrossbow { - - public EnchantmentCrossbowMultishot() { - super(Enchantment.ID_CROSSBOW_MULTISHOT, "crossbowMultishot", Rarity.RARE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 20; - } - - @Override - public int getMaxEnchantAbility(int level) { - return 50 + this.getMinEnchantAbility(level); - } - - @Override - public int getMaxLevel() { - return 1; - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - return super.checkCompatibility(enchantment) && enchantment.id != ID_CROSSBOW_PIERCING; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowPiercing.java b/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowPiercing.java deleted file mode 100644 index 83853f3f5..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowPiercing.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.item.enchantment.crossbow; - -import cn.nukkit.item.enchantment.Enchantment; - -public class EnchantmentCrossbowPiercing extends EnchantmentCrossbow { - - public EnchantmentCrossbowPiercing() { - super(Enchantment.ID_CROSSBOW_PIERCING, "crossbowPiercing", Rarity.COMMON); - } - - @Override - public int getMinEnchantAbility(int level) { - return 1 + 10 * (level - 1); - } - - @Override - public int getMaxEnchantAbility(int level) { - return 50 + this.getMinEnchantAbility(level); - } - - @Override - public int getMaxLevel() { - return 4; - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - return super.checkCompatibility(enchantment) && enchantment.id != ID_CROSSBOW_MULTISHOT; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowQuickCharge.java b/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowQuickCharge.java deleted file mode 100644 index c0ff904d2..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/crossbow/EnchantmentCrossbowQuickCharge.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.item.enchantment.crossbow; - -import cn.nukkit.item.enchantment.Enchantment; - -public class EnchantmentCrossbowQuickCharge extends EnchantmentCrossbow { - - public EnchantmentCrossbowQuickCharge() { - super(Enchantment.ID_CROSSBOW_QUICK_CHARGE, "crossbowQuickCharge", Rarity.UNCOMMON); - } - - @Override - public int getMinEnchantAbility(int level) { - return 12 + 20 * (level - 1); - } - - @Override - public int getMaxEnchantAbility(int level) { - return 50 + this.getMinEnchantAbility(level); - } - - @Override - public int getMaxLevel() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamage.java b/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamage.java deleted file mode 100644 index 9f864befd..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamage.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.item.enchantment.damage; - -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EnchantmentDamage extends Enchantment { - - public enum TYPE { - ALL, - SMITE, - ARTHROPODS - } - - protected EnchantmentDamage(int id, String name, Rarity rarity, TYPE type) { - super(id, name, rarity, EnchantmentType.SWORD); - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - return !(enchantment instanceof EnchantmentDamage); - } - - @Override - public boolean canEnchant(Item item) { - return item.isAxe() || super.canEnchant(item); - } - - @Override - public int getMaxLevel() { - return 5; - } - - @Override - public String getName() { - return "%enchantment.damage." + this.name; - } - - @Override - public boolean isMajor() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageAll.java b/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageAll.java deleted file mode 100644 index 7121b211e..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageAll.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.item.enchantment.damage; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentDamageAll extends EnchantmentDamage { - - public EnchantmentDamageAll() { - super(ID_DAMAGE_ALL, "all", Rarity.COMMON, TYPE.ALL); - } - - @Override - public int getMinEnchantAbility(int level) { - return 1 + (level - 1) * 11; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 20; - } - - @Override - public int getMaxEnchantableLevel() { - return 4; - } - - @Override - public double getDamageBonus(Entity entity) { - return this.getLevel() * 1.25; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageArthropods.java b/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageArthropods.java deleted file mode 100644 index 909c6ed5e..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageArthropods.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.item.enchantment.damage; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityArthropod; -import cn.nukkit.potion.Effect; -import cn.nukkit.utils.Utils; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentDamageArthropods extends EnchantmentDamage { - - public EnchantmentDamageArthropods() { - super(ID_DAMAGE_ARTHROPODS, "arthropods", Rarity.UNCOMMON, TYPE.SMITE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 5 + ((level - 1) << 3); - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 20; - } - - @Override - public double getDamageBonus(Entity entity) { - if (entity instanceof EntityArthropod) { - return getLevel() * 2.5; - } - - return 0; - } - - @Override - public void doPostAttack(Entity attacker, Entity entity) { - if (entity instanceof EntityArthropod) { - entity.addEffect(Effect.getEffect(Effect.SLOWNESS).setDuration(20 + Utils.random.nextInt(10 * this.level)).setAmplifier(3)); - } - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageSmite.java b/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageSmite.java deleted file mode 100644 index de0ed9e9a..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/damage/EnchantmentDamageSmite.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.item.enchantment.damage; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntitySmite; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentDamageSmite extends EnchantmentDamage { - - public EnchantmentDamageSmite() { - super(ID_DAMAGE_SMITE, "undead", Rarity.UNCOMMON, TYPE.SMITE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 5 + ((level - 1) << 3); - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 20; - } - - @Override - public double getDamageBonus(Entity entity) { - if (entity instanceof EntitySmite) { - return getLevel() * 2.5; - } - - return 0; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLoot.java b/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLoot.java deleted file mode 100644 index 3c002d520..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLoot.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item.enchantment.loot; - -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EnchantmentLoot extends Enchantment { - - protected EnchantmentLoot(int id, String name, Rarity rarity, EnchantmentType type) { - super(id, name, rarity, type); - } - - @Override - public int getMinEnchantAbility(int level) { - return 15 + (level - 1) * 9; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 50; - } - - @Override - public int getMaxLevel() { - return 3; - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - return super.checkCompatibility(enchantment) && enchantment.id != Enchantment.ID_SILK_TOUCH; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootDigging.java b/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootDigging.java deleted file mode 100644 index 6e5fa3da8..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootDigging.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.item.enchantment.loot; - -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentLootDigging extends EnchantmentLoot { - - public EnchantmentLootDigging() { - super(Enchantment.ID_FORTUNE_DIGGING, "lootBonusDigger", Rarity.RARE, EnchantmentType.DIGGER); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootFishing.java b/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootFishing.java deleted file mode 100644 index 077bad043..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootFishing.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.item.enchantment.loot; - -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentLootFishing extends EnchantmentLoot { - - public EnchantmentLootFishing() { - super(Enchantment.ID_FORTUNE_FISHING, "lootBonusFishing", Rarity.RARE, EnchantmentType.FISHING_ROD); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootWeapon.java b/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootWeapon.java deleted file mode 100644 index 8bb5a1834..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/loot/EnchantmentLootWeapon.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.item.enchantment.loot; - -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentLootWeapon extends EnchantmentLoot { - - public EnchantmentLootWeapon() { - super(Enchantment.ID_LOOTING, "lootBonus", Rarity.RARE, EnchantmentType.SWORD); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtection.java b/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtection.java deleted file mode 100644 index 7096d2689..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtection.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.nukkit.item.enchantment.protection; - -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class EnchantmentProtection extends Enchantment { - - public enum TYPE { - ALL, - FIRE, - FALL, - EXPLOSION, - PROJECTILE - } - - protected final TYPE protectionType; - - protected EnchantmentProtection(int id, String name, Rarity rarity, EnchantmentProtection.TYPE type) { - super(id, name, rarity, EnchantmentType.ARMOR); - this.protectionType = type; - if (protectionType == TYPE.FALL) { - this.type = EnchantmentType.ARMOR_FEET; - } - } - - @Override - public boolean checkCompatibility(Enchantment enchantment) { - if (enchantment instanceof EnchantmentProtection) { - if (((EnchantmentProtection) enchantment).protectionType == this.protectionType) { - return false; - } - return ((EnchantmentProtection) enchantment).protectionType == TYPE.FALL || this.protectionType == TYPE.FALL; - } - return super.checkCompatibility(enchantment); - } - - @Override - public int getMaxLevel() { - return 4; - } - - @Override - public String getName() { - return "%enchantment.protect." + this.name; - } - - public double getTypeModifier() { - return 0; - } - - @Override - public boolean isMajor() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionAll.java b/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionAll.java deleted file mode 100644 index d4632f535..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionAll.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.item.enchantment.protection; - -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.item.enchantment.Enchantment; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentProtectionAll extends EnchantmentProtection { - - public EnchantmentProtectionAll() { - super(Enchantment.ID_PROTECTION_ALL, "all", Rarity.COMMON, TYPE.ALL); - } - - @Override - public int getMinEnchantAbility(int level) { - return 1 + (level - 1) * 11; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 20; - } - - @Override - public double getTypeModifier() { - return 1; - } - - @Override - public float getProtectionFactor(EntityDamageEvent e) { - DamageCause cause = e.getCause(); - - if (level <= 0 || cause == DamageCause.VOID || cause == DamageCause.CUSTOM || cause == DamageCause.MAGIC) { - return 0; - } - - return (float) (getLevel() * getTypeModifier()); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionExplosion.java b/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionExplosion.java deleted file mode 100644 index d9e54c2dd..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionExplosion.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.item.enchantment.protection; - -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentProtectionExplosion extends EnchantmentProtection { - - public EnchantmentProtectionExplosion() { - super(ID_PROTECTION_EXPLOSION, "explosion", Rarity.RARE, TYPE.EXPLOSION); - } - - @Override - public int getMinEnchantAbility(int level) { - return 5 + ((level - 1) << 3); - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 12; - } - - @Override - public double getTypeModifier() { - return 2; - } - - @Override - public float getProtectionFactor(EntityDamageEvent e) { - DamageCause cause = e.getCause(); - - if (level <= 0 || (cause != DamageCause.ENTITY_EXPLOSION && cause != DamageCause.BLOCK_EXPLOSION)) { - return 0; - } - - return (float) (getLevel() * getTypeModifier()); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionFall.java b/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionFall.java deleted file mode 100644 index d8cac97d0..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionFall.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.item.enchantment.protection; - -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentProtectionFall extends EnchantmentProtection { - - public EnchantmentProtectionFall() { - super(ID_PROTECTION_FALL, "fall", Rarity.UNCOMMON, TYPE.FALL); - } - - @Override - public int getMinEnchantAbility(int level) { - return 5 + (level - 1) * 6; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 10; - } - - @Override - public double getTypeModifier() { - return 2; - } - - @Override - public float getProtectionFactor(EntityDamageEvent e) { - DamageCause cause = e.getCause(); - - if (level <= 0 || (cause != DamageCause.FALL)) { - return 0; - } - - return (float) (getLevel() * getTypeModifier()); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionFire.java b/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionFire.java deleted file mode 100644 index 378a4db25..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionFire.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.item.enchantment.protection; - -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentProtectionFire extends EnchantmentProtection { - - public EnchantmentProtectionFire() { - super(ID_PROTECTION_FIRE, "fire", Rarity.UNCOMMON, TYPE.FIRE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 10 + ((level - 1) << 3); - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 12; - } - - @Override - public double getTypeModifier() { - return 2; - } - - @Override - public float getProtectionFactor(EntityDamageEvent e) { - DamageCause cause = e.getCause(); - - if (level <= 0 || (cause != DamageCause.LAVA && cause != DamageCause.FIRE && cause != DamageCause.FIRE_TICK)) { - return 0; - } - - return (float) (getLevel() * getTypeModifier()); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionProjectile.java b/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionProjectile.java deleted file mode 100644 index 9674dd98c..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/protection/EnchantmentProtectionProjectile.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.item.enchantment.protection; - -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EnchantmentProtectionProjectile extends EnchantmentProtection { - - public EnchantmentProtectionProjectile() { - super(ID_PROTECTION_PROJECTILE, "projectile", Rarity.UNCOMMON, TYPE.PROJECTILE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 3 + (level - 1) * 6; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 15; - } - - @Override - public double getTypeModifier() { - return 3; - } - - @Override - public float getProtectionFactor(EntityDamageEvent e) { - DamageCause cause = e.getCause(); - - if (level <= 0 || (cause != DamageCause.PROJECTILE)) { - return 0; - } - - return (float) (getLevel() * getTypeModifier()); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTrident.java b/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTrident.java deleted file mode 100644 index 78d3d667f..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTrident.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.nukkit.item.enchantment.trident; - -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.item.enchantment.EnchantmentType; - -public abstract class EnchantmentTrident extends Enchantment { - - protected EnchantmentTrident(int id, String name, Rarity rarity) { - super(id, name, rarity, EnchantmentType.TRIDENT); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentChanneling.java b/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentChanneling.java deleted file mode 100644 index f95939a5a..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentChanneling.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.nukkit.item.enchantment.trident; - -import cn.nukkit.item.enchantment.Enchantment; - -public class EnchantmentTridentChanneling extends EnchantmentTrident { - - public EnchantmentTridentChanneling() { - super(Enchantment.ID_TRIDENT_CHANNELING, "tridentChanneling", Rarity.VERY_RARE); - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentImpaling.java b/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentImpaling.java deleted file mode 100644 index 488217a98..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentImpaling.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.item.enchantment.trident; - -import cn.nukkit.entity.Entity; -import cn.nukkit.item.enchantment.Enchantment; - -public class EnchantmentTridentImpaling extends EnchantmentTrident { - - public EnchantmentTridentImpaling() { - super(Enchantment.ID_TRIDENT_IMPALING, "tridentImpaling", Rarity.RARE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 8 * level - 7; - } - - @Override - public int getMaxEnchantAbility(int level) { - return this.getMinEnchantAbility(level) + 20; - } - - @Override - public int getMaxLevel() { - return 5; - } - - @Override - public double getDamageBonus(Entity entity) { - if (entity.isInsideOfWater() || (entity.getLevel().isRaining() && entity.canSeeSky())) { - return 2.5 * getLevel(); - } - - return 0; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentLoyalty.java b/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentLoyalty.java deleted file mode 100644 index ee61f5d2b..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentLoyalty.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item.enchantment.trident; - -import cn.nukkit.item.enchantment.Enchantment; - -public class EnchantmentTridentLoyalty extends EnchantmentTrident { - - public EnchantmentTridentLoyalty() { - super(Enchantment.ID_TRIDENT_LOYALTY, "tridentLoyalty", Rarity.UNCOMMON); - } - - @Override - public int getMinEnchantAbility(int level) { - return 7 * level + 5; - } - - @Override - public int getMaxLevel() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentRiptide.java b/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentRiptide.java deleted file mode 100644 index 65c2bf161..000000000 --- a/src/main/java/cn/nukkit/item/enchantment/trident/EnchantmentTridentRiptide.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.item.enchantment.trident; - -import cn.nukkit.item.enchantment.Enchantment; - -public class EnchantmentTridentRiptide extends EnchantmentTrident { - - public EnchantmentTridentRiptide() { - super(Enchantment.ID_TRIDENT_RIPTIDE, "tridentRiptide", Rarity.RARE); - } - - @Override - public int getMinEnchantAbility(int level) { - return 7 * level + 10; - } - - @Override - public int getMaxLevel() { - return 3; - } -} diff --git a/src/main/java/cn/nukkit/item/food/Food.java b/src/main/java/cn/nukkit/item/food/Food.java deleted file mode 100644 index aa0218bf6..000000000 --- a/src/main/java/cn/nukkit/item/food/Food.java +++ /dev/null @@ -1,204 +0,0 @@ -package cn.nukkit.item.food; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.event.player.PlayerEatFoodEvent; -import cn.nukkit.item.Item; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.potion.Effect; - -import java.util.*; - -/** - * Created by Snake1999 on 2016/1/13. - * Package cn.nukkit.item.food in project nukkit. - */ -public abstract class Food { - - private static final Map registryCustom = new LinkedHashMap<>(); - private static final Map registryDefault = new LinkedHashMap<>(); - - public static final Food apple = registerDefaultFood(new FoodNormal(4, 2.4F).addRelative(Item.APPLE)); - public static final Food apple_golden = registerDefaultFood(new FoodEffective(4, 9.6F) - .addEffect(Effect.getEffect(Effect.REGENERATION).setAmplifier(1).setDuration(100)) - .addEffect(Effect.getEffect(Effect.ABSORPTION).setDuration(2400)) - .addRelative(Item.GOLDEN_APPLE)); - public static final Food apple_golden_enchanted = registerDefaultFood(new FoodEffective(4, 9.6F) - .addEffect(Effect.getEffect(Effect.REGENERATION).setAmplifier(4).setDuration(600)) - .addEffect(Effect.getEffect(Effect.ABSORPTION).setDuration(2400).setAmplifier(3)) - .addEffect(Effect.getEffect(Effect.DAMAGE_RESISTANCE).setDuration(6000)) - .addEffect(Effect.getEffect(Effect.FIRE_RESISTANCE).setDuration(6000)) - .addRelative(Item.GOLDEN_APPLE_ENCHANTED)); - public static final Food beef_raw = registerDefaultFood(new FoodNormal(3, 1.8F).addRelative(Item.RAW_BEEF)); - public static final Food beetroot = registerDefaultFood(new FoodNormal(1, 1.2F).addRelative(Item.BEETROOT)); - public static final Food beetroot_soup = registerDefaultFood(new FoodInBowl(6, 7.2F).addRelative(Item.BEETROOT_SOUP)); - public static final Food bread = registerDefaultFood(new FoodNormal(5, 6F).addRelative(Item.BREAD)); - public static final Food cake_slice = registerDefaultFood(new FoodNormal(2, 0.4F) - .addRelative(Block.CAKE_BLOCK, 0).addRelative(Block.CAKE_BLOCK, 1).addRelative(Block.CAKE_BLOCK, 2) - .addRelative(Block.CAKE_BLOCK, 3).addRelative(Block.CAKE_BLOCK, 4).addRelative(Block.CAKE_BLOCK, 5) - .addRelative(Block.CAKE_BLOCK, 6)); - public static final Food carrot = registerDefaultFood(new FoodNormal(3, 4.8F).addRelative(Item.CARROT)); - public static final Food carrot_golden = registerDefaultFood(new FoodNormal(6, 14.4F).addRelative(Item.GOLDEN_CARROT)); - public static final Food chicken_raw = registerDefaultFood(new FoodEffective(2, 1.2F) - .addChanceEffect(0.3F, Effect.getEffect(Effect.HUNGER).setDuration(600)) - .addRelative(Item.RAW_CHICKEN)); - public static final Food chicken_cooked = registerDefaultFood(new FoodNormal(6, 7.2F).addRelative(Item.COOKED_CHICKEN)); - public static final Food chorus_fruit = registerDefaultFood(new FoodChorusFruit()); - public static final Food cookie = registerDefaultFood(new FoodNormal(2, 0.4F).addRelative(Item.COOKIE)); - public static final Food melon_slice = registerDefaultFood(new FoodNormal(2, 1.2F).addRelative(Item.MELON_SLICE)); - public static final Food milk = registerDefaultFood(new FoodMilk().addRelative(Item.BUCKET, 1)); - public static final Food mushroom_stew = registerDefaultFood(new FoodInBowl(6, 7.2F).addRelative(Item.MUSHROOM_STEW)); - public static final Food mutton_cooked = registerDefaultFood(new FoodNormal(6, 9.6F).addRelative(Item.COOKED_MUTTON)); - public static final Food mutton_raw = registerDefaultFood(new FoodNormal(2, 1.2F).addRelative(Item.RAW_MUTTON)); - public static final Food porkchop_cooked = registerDefaultFood(new FoodNormal(8, 12.8F).addRelative(Item.COOKED_PORKCHOP)); - public static final Food porkchop_raw = registerDefaultFood(new FoodNormal(3, 1.8F).addRelative(Item.RAW_PORKCHOP)); - public static final Food potato_raw = registerDefaultFood(new FoodNormal(1, 0.6F).addRelative(Item.POTATO)); - public static final Food potato_baked = registerDefaultFood(new FoodNormal(5, 7.2F).addRelative(Item.BAKED_POTATO)); - public static final Food potato_poisonous = registerDefaultFood(new FoodEffective(2, 1.2F) - .addChanceEffect(0.6F, Effect.getEffect(Effect.POISON).setDuration(80)) - .addRelative(Item.POISONOUS_POTATO)); - public static final Food pumpkin_pie = registerDefaultFood(new FoodNormal(8, 4.8F).addRelative(Item.PUMPKIN_PIE)); - public static final Food rabbit_cooked = registerDefaultFood(new FoodNormal(5, 6F).addRelative(Item.COOKED_RABBIT)); - public static final Food rabbit_raw = registerDefaultFood(new FoodNormal(3, 1.8F).addRelative(Item.RAW_RABBIT)); - public static final Food rabbit_stew = registerDefaultFood(new FoodInBowl(10, 12F).addRelative(Item.RABBIT_STEW)); - public static final Food rotten_flesh = registerDefaultFood(new FoodEffective(4, 0.8F) - .addChanceEffect(0.8F, Effect.getEffect(Effect.HUNGER).setDuration(600)) - .addRelative(Item.ROTTEN_FLESH)); - public static final Food spider_eye = registerDefaultFood(new FoodEffective(2, 3.2F) - .addEffect(Effect.getEffect(Effect.POISON).setDuration(80)) - .addRelative(Item.SPIDER_EYE)); - public static final Food steak = registerDefaultFood(new FoodNormal(8, 12.8F).addRelative(Item.COOKED_BEEF)); - public static final Food clownfish = registerDefaultFood(new FoodNormal(1, 0.2F).addRelative(Item.CLOWNFISH)); - public static final Food fish_cooked = registerDefaultFood(new FoodNormal(5, 6F).addRelative(Item.COOKED_FISH)); - public static final Food fish_raw = registerDefaultFood(new FoodNormal(2, 0.4F).addRelative(Item.RAW_FISH)); - public static final Food salmon_cooked = registerDefaultFood(new FoodNormal(6, 9.6F).addRelative(Item.COOKED_SALMON)); - public static final Food salmon_raw = registerDefaultFood(new FoodNormal(2, 0.4F).addRelative(Item.RAW_SALMON)); - public static final Food pufferfish = registerDefaultFood(new FoodEffective(1, 0.2F) - .addEffect(Effect.getEffect(Effect.HUNGER).setAmplifier(2).setDuration(300)) - .addEffect(Effect.getEffect(Effect.NAUSEA).setAmplifier(1).setDuration(300)) - .addEffect(Effect.getEffect(Effect.POISON).setAmplifier(3).setDuration(1200)) - .addRelative(Item.PUFFERFISH)); - public static final Food dried_kelp = registerDefaultFood(new FoodNormal(1, 0.6F).addRelative(Item.DRIED_KELP)); - public static final Food sweet_berries = registerDefaultFood(new FoodNormal(2, 0.4F).addRelative(Item.SWEET_BERRIES)); - public static final Food suspicious_stew_night_vision = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.NIGHT_VISION).setAmplifier(1).setDuration(80)).addRelative(Item.SUSPICIOUS_STEW, 0)); - public static final Food suspicious_stew_jump = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.JUMP).setAmplifier(1).setDuration(80)).addRelative(Item.SUSPICIOUS_STEW, 1)); - public static final Food suspicious_stew_weakness = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.WEAKNESS).setAmplifier(1).setDuration(140)).addRelative(Item.SUSPICIOUS_STEW, 2)); - public static final Food suspicious_stew_blindness = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.BLINDNESS).setAmplifier(1).setDuration(120)).addRelative(Item.SUSPICIOUS_STEW, 3)); - public static final Food suspicious_stew_poison = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.POISON).setAmplifier(1).setDuration(220)).addRelative(Item.SUSPICIOUS_STEW, 4)); - public static final Food suspicious_stew_saturation = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.SATURATION).setAmplifier(1).setDuration(7)).addRelative(Item.SUSPICIOUS_STEW, 6)); - public static final Food suspicious_stew_fire_resistance = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.FIRE_RESISTANCE).setAmplifier(1).setDuration(40)).addRelative(Item.SUSPICIOUS_STEW, 7)); - public static final Food suspicious_stew_regeneration = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.REGENERATION).setAmplifier(1).setDuration(120)).addRelative(Item.SUSPICIOUS_STEW, 8)); - public static final Food suspicious_stew_wither = registerDefaultFood(new FoodEffectiveInBow(6, 7.2F) - .addEffect(Effect.getEffect(Effect.WITHER).setAmplifier(1).setDuration(120)).addRelative(Item.SUSPICIOUS_STEW, 9)); - public static final Food honey_bottle = registerDefaultFood(new FoodNormal(6, 1.2F).addRelative(Item.HONEY_BOTTLE)); - - public static Food registerFood(Food food, Plugin plugin) { - Objects.requireNonNull(food); - Objects.requireNonNull(plugin); - food.relativeIDs.forEach(n -> registryCustom.put(new NodeIDMetaPlugin(n.id, n.meta, plugin), food)); - return food; - } - - private static Food registerDefaultFood(Food food) { - food.relativeIDs.forEach(n -> registryDefault.put(n, food)); - return food; - } - - public static Food getByRelative(Item item) { - Objects.requireNonNull(item); - return getByRelative(item.getId(), item.getDamage()); - } - - public static Food getByRelative(Block block) { - Objects.requireNonNull(block); - return getByRelative(block.getId(), block.getDamage()); - } - - public static Food getByRelative(int relativeID, int meta) { - final Food[] result = {null}; - registryCustom.forEach((n, f) -> { - if (n.id == relativeID && n.meta == meta && n.plugin.isEnabled()) result[0] = f; - }); - if (result[0] == null) { - registryDefault.forEach((n, f) -> { - if (n.id == relativeID && n.meta == meta) result[0] = f; - }); - } - return result[0]; - } - - protected int restoreFood = 0; - protected float restoreSaturation = 0; - protected final List relativeIDs = new ArrayList<>(); - - public final boolean eatenBy(Player player) { - PlayerEatFoodEvent event = new PlayerEatFoodEvent(player, this); - player.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return false; - return event.getFood().onEatenBy(player); - } - - protected boolean onEatenBy(Player player) { - player.getFoodData().addFoodLevel(this); - return true; - } - - public Food addRelative(int relativeID) { - return addRelative(relativeID, 0); - } - - public Food addRelative(int relativeID, int meta) { - NodeIDMeta node = new NodeIDMeta(relativeID, meta); - return addRelative(node); - } - - private Food addRelative(NodeIDMeta node) { - if (!relativeIDs.contains(node)) relativeIDs.add(node); - return this; - } - - public int getRestoreFood() { - return restoreFood; - } - - public Food setRestoreFood(int restoreFood) { - this.restoreFood = restoreFood; - return this; - } - - public float getRestoreSaturation() { - return restoreSaturation; - } - - public Food setRestoreSaturation(float restoreSaturation) { - this.restoreSaturation = restoreSaturation; - return this; - } - - static class NodeIDMeta { - final int id; - final int meta; - - NodeIDMeta(int id, int meta) { - this.id = id; - this.meta = meta; - } - } - - static class NodeIDMetaPlugin extends NodeIDMeta { - final Plugin plugin; - - NodeIDMetaPlugin(int id, int meta, Plugin plugin) { - super(id, meta); - this.plugin = plugin; - } - } -} diff --git a/src/main/java/cn/nukkit/item/food/FoodChorusFruit.java b/src/main/java/cn/nukkit/item/food/FoodChorusFruit.java deleted file mode 100644 index ae28a2fdb..000000000 --- a/src/main/java/cn/nukkit/item/food/FoodChorusFruit.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.item.food; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockLiquid; -import cn.nukkit.event.player.PlayerTeleportEvent; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.sound.EndermanTeleportSound; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.Utils; - -public class FoodChorusFruit extends FoodNormal { - - public FoodChorusFruit() { - super(4, 2.4F); - addRelative(Item.CHORUS_FRUIT); - } - - @Override - protected boolean onEatenBy(Player player) { - super.onEatenBy(player); - int minX = player.getFloorX() - 8; - int minY = player.getFloorY() - 8; - int minZ = player.getFloorZ() - 8; - int maxX = minX + 16; - int maxY = minY + 16; - int maxZ = minZ + 16; - - Level level = player.getLevel(); - if (level == null) return false; - - for (int attempts = 0; attempts < 16; attempts++) { - int x = Utils.rand(minX, maxX); - int y = Utils.rand(minY, maxY); - int z = Utils.rand(minZ, maxZ); - - if (y < 0) continue; - - while (y >= 0 && !level.getBlock(new Vector3(x, y + 1, z)).isSolid()) { - y--; - } - - y++; - - Block blockUp = level.getBlock(new Vector3(x, y + 1, z)); - Block blockUp2 = level.getBlock(new Vector3(x, y + 2, z)); - - if (blockUp.isSolid() || blockUp instanceof BlockLiquid || blockUp2.isSolid() || blockUp2 instanceof BlockLiquid) { - continue; - } - - level.addSound(new EndermanTeleportSound(player)); - player.teleport(new Vector3(x + 0.5, y + 1, z + 0.5), PlayerTeleportEvent.TeleportCause.CHORUS_FRUIT); - level.addSound(new EndermanTeleportSound(player)); - - break; - } - - return true; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/item/food/FoodEffective.java b/src/main/java/cn/nukkit/item/food/FoodEffective.java deleted file mode 100644 index 612c2e739..000000000 --- a/src/main/java/cn/nukkit/item/food/FoodEffective.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.item.food; - -import cn.nukkit.Player; -import cn.nukkit.potion.Effect; - -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -/** - * Created by Snake1999 on 2016/1/13. - * Package cn.nukkit.item.food in project nukkit. - */ -public class FoodEffective extends Food { - - protected final Map effects = new LinkedHashMap<>(); - - public FoodEffective(int restoreFood, float restoreSaturation) { - this.setRestoreFood(restoreFood); - this.setRestoreSaturation(restoreSaturation); - } - - public FoodEffective addEffect(Effect effect) { - return addChanceEffect(1F, effect); - } - - public FoodEffective addChanceEffect(float chance, Effect effect) { - if (chance > 1f) chance = 1f; - if (chance < 0f) chance = 0f; - effects.put(effect, chance); - return this; - } - - @Override - protected boolean onEatenBy(Player player) { - super.onEatenBy(player); - List toApply = new LinkedList<>(); - effects.forEach((effect, chance) -> { - if (chance >= Math.random()) toApply.add(effect.clone()); - }); - toApply.forEach(player::addEffect); - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/food/FoodEffectiveInBow.java b/src/main/java/cn/nukkit/item/food/FoodEffectiveInBow.java deleted file mode 100644 index cd2a2e9b0..000000000 --- a/src/main/java/cn/nukkit/item/food/FoodEffectiveInBow.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.item.food; - -import cn.nukkit.Player; -import cn.nukkit.item.ItemBowl; - -public class FoodEffectiveInBow extends FoodEffective { - - public FoodEffectiveInBow(int restoreFood, float restoreSaturation) { - super(restoreFood, restoreSaturation); - } - - @Override - protected boolean onEatenBy(Player player) { - super.onEatenBy(player); - player.getInventory().addItem(new ItemBowl()); - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/food/FoodHoney.java b/src/main/java/cn/nukkit/item/food/FoodHoney.java deleted file mode 100644 index db9467a1d..000000000 --- a/src/main/java/cn/nukkit/item/food/FoodHoney.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.item.food; - -import cn.nukkit.Player; -import cn.nukkit.item.ItemGlassBottle; -import cn.nukkit.potion.Effect; - -public class FoodHoney extends Food { - - public FoodHoney(int restoreFood, float restoreSaturation) { - this.setRestoreFood(restoreFood); - this.setRestoreSaturation(restoreSaturation); - } - - @Override - protected boolean onEatenBy(Player player) { - super.onEatenBy(player); - player.getInventory().addItem(new ItemGlassBottle()); - player.removeEffect(Effect.POISON); - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/food/FoodInBowl.java b/src/main/java/cn/nukkit/item/food/FoodInBowl.java deleted file mode 100644 index bad656152..000000000 --- a/src/main/java/cn/nukkit/item/food/FoodInBowl.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.item.food; - -import cn.nukkit.Player; -import cn.nukkit.item.ItemBowl; - -/** - * Created by Snake1999 on 2016/1/14. - * Package cn.nukkit.item.food in project nukkit. - */ -public class FoodInBowl extends Food { - - public FoodInBowl(int restoreFood, float restoreSaturation) { - this.setRestoreFood(restoreFood); - this.setRestoreSaturation(restoreSaturation); - } - - @Override - protected boolean onEatenBy(Player player) { - super.onEatenBy(player); - player.getInventory().setItem(player.getInventory().getHeldItemSlot(), new ItemBowl()); - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/food/FoodMilk.java b/src/main/java/cn/nukkit/item/food/FoodMilk.java deleted file mode 100644 index d86d05a9b..000000000 --- a/src/main/java/cn/nukkit/item/food/FoodMilk.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.item.food; - -import cn.nukkit.Player; -import cn.nukkit.item.ItemBucket; - -/** - * Created by Snake1999 on 2016/1/21. - * Package cn.nukkit.item.food in project nukkit. - */ -public class FoodMilk extends Food { - - @Override - protected boolean onEatenBy(Player player) { - super.onEatenBy(player); - player.getInventory().addItem(new ItemBucket()); - player.removeAllEffects(); - return true; - } -} diff --git a/src/main/java/cn/nukkit/item/food/FoodNormal.java b/src/main/java/cn/nukkit/item/food/FoodNormal.java deleted file mode 100644 index 13101cd77..000000000 --- a/src/main/java/cn/nukkit/item/food/FoodNormal.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.nukkit.item.food; - -/** - * Created by Snake1999 on 2016/1/13. - * Package cn.nukkit.item.food in project nukkit. - */ -public class FoodNormal extends Food { - - public FoodNormal(int restoreFood, float restoreSaturation) { - this.setRestoreFood(restoreFood); - this.setRestoreSaturation(restoreSaturation); - } -} diff --git a/src/main/java/cn/nukkit/item/randomitem/ConstantItemSelector.java b/src/main/java/cn/nukkit/item/randomitem/ConstantItemSelector.java deleted file mode 100644 index c63505411..000000000 --- a/src/main/java/cn/nukkit/item/randomitem/ConstantItemSelector.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.item.randomitem; - -import cn.nukkit.item.Item; - -/** - * Created by Snake1999 on 2016/1/15. - * Package cn.nukkit.item.randomitem in project nukkit. - */ -public class ConstantItemSelector extends Selector { - - protected final Item item; - - public ConstantItemSelector(int id, Selector parent) { - this(id, 0, parent); - } - - public ConstantItemSelector(int id, Integer meta, Selector parent) { - this(id, meta, 1, parent); - } - - public ConstantItemSelector(int id, Integer meta, int count, Selector parent) { - this(Item.get(id, meta, count), parent); - } - - public ConstantItemSelector(Item item, Selector parent) { - super(parent); - this.item = item; - } - - public Item getItem() { - return item; - } - - public Object select() { - return item; - } -} diff --git a/src/main/java/cn/nukkit/item/randomitem/Fishing.java b/src/main/java/cn/nukkit/item/randomitem/Fishing.java deleted file mode 100644 index dd70cc6c5..000000000 --- a/src/main/java/cn/nukkit/item/randomitem/Fishing.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.nukkit.item.randomitem; - -import cn.nukkit.item.Item; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.potion.Potion; -import cn.nukkit.utils.DyeColor; - -import static cn.nukkit.item.randomitem.RandomItem.*; - -/** - * Created by Snake1999 on 2016/1/15. - * Package cn.nukkit.item.randomitem in project nukkit. - */ -public final class Fishing { - - public static final Selector ROOT_FISHING = putSelector(new Selector(ROOT)); - - public static final Selector FISHES = putSelector(new Selector(ROOT_FISHING), 0.85F); - public static final Selector TREASURES = putSelector(new Selector(ROOT_FISHING), 0.05F); - public static final Selector JUNKS = putSelector(new Selector(ROOT_FISHING), 0.1F); - public static final Selector FISH = putSelector(new ConstantItemSelector(Item.RAW_FISH, FISHES), 0.6F); - public static final Selector SALMON = putSelector(new ConstantItemSelector(Item.RAW_SALMON, FISHES), 0.25F); - public static final Selector CLOWNFISH = putSelector(new ConstantItemSelector(Item.CLOWNFISH, FISHES), 0.02F); - public static final Selector PUFFERFISH = putSelector(new ConstantItemSelector(Item.PUFFERFISH, FISHES), 0.13F); - public static final Selector TREASURE_BOW = putSelector(new ConstantItemSelector(Item.BOW, TREASURES), 0.1667F); - public static final Selector TREASURE_ENCHANTED_BOOK = putSelector(new ConstantItemSelector(Item.ENCHANTED_BOOK, TREASURES), 0.1667F); - public static final Selector TREASURE_FISHING_ROD = putSelector(new ConstantItemSelector(Item.FISHING_ROD, TREASURES), 0.1667F); - public static final Selector TREASURE_NAME_TAG = putSelector(new ConstantItemSelector(Item.NAME_TAG, TREASURES), 0.1667F); - public static final Selector TREASURE_SADDLE = putSelector(new ConstantItemSelector(Item.SADDLE, TREASURES), 0.1667F); - public static final Selector TREASURE_NAUTILUS_SHELL = putSelector(new ConstantItemSelector(Item.NAUTILUS_SHELL, TREASURES), 0.1667F); - public static final Selector JUNK_BOWL = putSelector(new ConstantItemSelector(Item.BOWL, JUNKS), 0.12F); - public static final Selector JUNK_FISHING_ROD = putSelector(new ConstantItemSelector(Item.FISHING_ROD, JUNKS), 0.024F); - public static final Selector JUNK_LEATHER = putSelector(new ConstantItemSelector(Item.LEATHER, JUNKS), 0.12F); - public static final Selector JUNK_LEATHER_BOOTS = putSelector(new ConstantItemSelector(Item.LEATHER_BOOTS, JUNKS), 0.12F); - public static final Selector JUNK_ROTTEN_FLESH = putSelector(new ConstantItemSelector(Item.ROTTEN_FLESH, JUNKS), 0.12F); - public static final Selector JUNK_STICK = putSelector(new ConstantItemSelector(Item.STICK, JUNKS), 0.06F); - public static final Selector JUNK_STRING_ITEM = putSelector(new ConstantItemSelector(Item.STRING, JUNKS), 0.06F); - public static final Selector JUNK_WATTER_BOTTLE = putSelector(new ConstantItemSelector(Item.POTION, Potion.NO_EFFECTS, JUNKS), 0.12F); - public static final Selector JUNK_BONE = putSelector(new ConstantItemSelector(Item.BONE, JUNKS), 0.12F); - public static final Selector JUNK_INK_SAC = putSelector(new ConstantItemSelector(Item.DYE, DyeColor.BLACK.getDyeData(), 10, JUNKS), 0.012F); - public static final Selector JUNK_TRIPWIRE_HOOK = putSelector(new ConstantItemSelector(Item.TRIPWIRE_HOOK, JUNKS), 0.12F); - - public static Item getFishingResult(Item rod) { - int fortuneLevel = 0; - int lureLevel = 0; - if (rod != null) { - if (rod.hasEnchantment(Enchantment.ID_FORTUNE_FISHING)) { - fortuneLevel = rod.getEnchantment(Enchantment.ID_FORTUNE_FISHING).getLevel(); - } else if (rod.hasEnchantment(Enchantment.ID_LURE)) { - lureLevel = rod.getEnchantment(Enchantment.ID_LURE).getLevel(); - } - } - return getFishingResult(fortuneLevel, lureLevel); - } - - public static Item getFishingResult(int fortuneLevel, int lureLevel) { - float treasureChance = limitRange(0.05f + 0.01f * fortuneLevel - 0.01f * lureLevel); - float junkChance = limitRange(0.05f - 0.025f * fortuneLevel - 0.01f * lureLevel); - float fishChance = limitRange(1 - treasureChance - junkChance); - putSelector(FISHES, fishChance); - putSelector(TREASURES, treasureChance); - putSelector(JUNKS, junkChance); - Object result = selectFrom(ROOT_FISHING); - if (result instanceof Item) return (Item) result; - return null; - } - - private static float limitRange(float value) { - if (value >= 1f) return 1f; - return Math.max(value, 0f); - } -} diff --git a/src/main/java/cn/nukkit/item/randomitem/RandomItem.java b/src/main/java/cn/nukkit/item/randomitem/RandomItem.java deleted file mode 100644 index 598d707ed..000000000 --- a/src/main/java/cn/nukkit/item/randomitem/RandomItem.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.item.randomitem; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -/** - * Created by Snake1999 on 2016/1/15. - * Package cn.nukkit.item.randomitem in project nukkit. - */ -public final class RandomItem { - - private static final Map selectors = new HashMap<>(); - - public static final Selector ROOT = new Selector(null); - - public static Selector putSelector(Selector selector) { - return putSelector(selector, 1); - } - - public static Selector putSelector(Selector selector, float chance) { - if (selector.getParent() == null) selector.setParent(ROOT); - selectors.put(selector, chance); - return selector; - } - - static Object selectFrom(Selector selector) { - Objects.requireNonNull(selector); - Map child = new HashMap<>(); - selectors.forEach((s, f) -> { - if (s.getParent() == selector) child.put(s, f); - }); - if (child.isEmpty()) return selector.select(); - return selectFrom(Selector.selectRandom(child)); - } -} diff --git a/src/main/java/cn/nukkit/item/randomitem/Selector.java b/src/main/java/cn/nukkit/item/randomitem/Selector.java deleted file mode 100644 index 1ac7b6ba8..000000000 --- a/src/main/java/cn/nukkit/item/randomitem/Selector.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.item.randomitem; - -import java.util.Map; - -/** - * Created by Snake1999 on 2016/1/15. - * Package cn.nukkit.item.randomitem in project nukkit. - */ -public class Selector { - - private Selector parent; - - public Selector(Selector parent) { - this.setParent(parent); - } - - public Selector setParent(Selector parent) { - this.parent = parent; - return parent; - } - - public Selector getParent() { - return parent; - } - - public Object select() { - return this; - } - - public static Selector selectRandom(Map selectorChanceMap) { - final float[] totalChance = {0}; - selectorChanceMap.values().forEach(f -> totalChance[0] += f); - float resultChance = (float) (Math.random() * totalChance[0]); - final float[] flag = {0}; - final boolean[] found = {false}; - final Selector[] temp = {null}; - selectorChanceMap.forEach((o, f) -> { - flag[0] += f; - if (flag[0] > resultChance && !found[0]) { - temp[0] = o; - found[0] = true; - } - }); - return temp[0]; - } -} diff --git a/src/main/java/cn/nukkit/lang/BaseLang.java b/src/main/java/cn/nukkit/lang/BaseLang.java deleted file mode 100644 index 34f1c4e90..000000000 --- a/src/main/java/cn/nukkit/lang/BaseLang.java +++ /dev/null @@ -1,246 +0,0 @@ -package cn.nukkit.lang; - -import cn.nukkit.Server; -import cn.nukkit.utils.Utils; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BaseLang { - - public static final String FALLBACK_LANGUAGE = "eng"; - - protected final String langName; - - protected Map lang; - protected Map fallbackLang = new HashMap<>(); - - public BaseLang(String lang) { - this(lang, null); - } - - public BaseLang(String lang, String path) { - this(lang, path, FALLBACK_LANGUAGE); - } - - public BaseLang(String lang, String path, String fallback) { - this.langName = lang.toLowerCase(); - boolean useFallback = !lang.equals(fallback); - - if (path == null) { - path = "lang/"; - this.lang = loadLang(this.getClass().getClassLoader().getResourceAsStream(path + this.langName + "/lang.ini")); - if (useFallback) this.fallbackLang = loadLang(this.getClass().getClassLoader().getResourceAsStream(path + fallback + "/lang.ini")); - } else { - this.lang = loadLang(path + this.langName + "/lang.ini"); - if (useFallback) this.fallbackLang = loadLang(path + fallback + "/lang.ini"); - } - - if (this.fallbackLang == null) { - this.fallbackLang = this.lang; - } - } - - public Map getLangMap() { - return lang; - } - - public Map getFallbackLangMap() { - return fallbackLang; - } - - public String getName() { - return this.get("language.name"); - } - - public String getLang() { - return langName; - } - - protected static Map loadLang(String path) { - try { - String content = Utils.readFile(path); - Map d = new HashMap<>(); - for (String line : content.split("\n")) { - line = line.trim(); - if (line.isEmpty() || line.charAt(0) == '#') { - continue; - } - String[] t = line.split("="); - if (t.length < 2) { - continue; - } - String key = t[0]; - StringBuilder value = new StringBuilder(); - for (int i = 1; i < t.length - 1; i++) { - value.append(t[i]).append('='); - } - value.append(t[t.length - 1]); - if (value.length() == 0) { - continue; - } - d.put(key, value.toString()); - } - return d; - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - return null; - } - } - - protected static Map loadLang(InputStream stream) { - try { - String content = Utils.readFile(stream); - Map d = new HashMap<>(); - for (String line : content.split("\n")) { - line = line.trim(); - if (line.isEmpty() || line.charAt(0) == '#') { - continue; - } - String[] t = line.split("="); - if (t.length < 2) { - continue; - } - String key = t[0]; - StringBuilder value = new StringBuilder(); - for (int i = 1; i < t.length - 1; i++) { - value.append(t[i]).append('='); - } - value.append(t[t.length - 1]); - if (value.length() == 0) { - continue; - } - d.put(key, value.toString()); - } - return d; - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - return null; - } - } - - public String translateString(String str) { - return this.translateString(str, new String[]{}, null); - } - - public String translateString(String str, String... params) { - if (params != null) { - return this.translateString(str, params, null); - } - return this.translateString(str, new String[0], null); - } - - public String translateString(String str, Object... params) { - if (params != null) { - String[] paramsToString = new String[params.length]; - for (int i = 0; i < params.length; i++) { - paramsToString[i] = Objects.toString(params[i]); - } - return this.translateString(str, paramsToString, null); - } - return this.translateString(str, new String[0], null); - } - - public String translateString(String str, String param, String onlyPrefix) { - return this.translateString(str, new String[]{param}, onlyPrefix); - } - - public String translateString(String str, String[] params, String onlyPrefix) { - String baseText = this.get(str); - baseText = this.parseTranslation((baseText != null && (onlyPrefix == null || str.indexOf(onlyPrefix) == 0)) ? baseText : str, onlyPrefix); - for (int i = 0; i < params.length; i++) { - baseText = baseText.replace("{%" + i + '}', this.parseTranslation(String.valueOf(params[i]))); - } - - return baseText; - } - - public String translate(TextContainer c) { - String baseText = this.parseTranslation(c.getText()); - if (c instanceof TranslationContainer) { - baseText = this.internalGet(c.getText()); - baseText = this.parseTranslation(baseText != null ? baseText : c.getText()); - for (int i = 0; i < ((TranslationContainer) c).getParameters().length; i++) { - baseText = baseText.replace("{%" + i + '}', this.parseTranslation(((TranslationContainer) c).getParameters()[i])); - } - } - return baseText; - } - - public String internalGet(String id) { - if (this.lang.containsKey(id)) { - return this.lang.get(id); - } else if (this.fallbackLang.containsKey(id)) { - return this.fallbackLang.get(id); - } - return null; - } - - public String get(String id) { - if (this.lang.containsKey(id)) { - return this.lang.get(id); - } else if (this.fallbackLang.containsKey(id)) { - return this.fallbackLang.get(id); - } - return id; - } - - protected String parseTranslation(String text) { - return this.parseTranslation(text, null); - } - - protected String parseTranslation(String text, String onlyPrefix) { - StringBuilder newString = new StringBuilder(); - text = String.valueOf(text); - - StringBuilder replaceString = null; - - int len = text.length(); - - for (int i = 0; i < len; ++i) { - char c = text.charAt(i); - if (replaceString != null) { - if (((int) c >= 0x30 && (int) c <= 0x39) // 0-9 - || ((int) c >= 0x41 && (int) c <= 0x5a) // A-Z - || ((int) c >= 0x61 && (int) c <= 0x7a) || // a-z - c == '.' || c == '-') { - replaceString.append(c); - } else { - String t = this.internalGet(replaceString.substring(1)); - if (t != null && (onlyPrefix == null || replaceString.indexOf(onlyPrefix) == 1)) { - newString.append(t); - } else { - newString.append(replaceString); - } - replaceString = null; - if (c == '%') { - replaceString = new StringBuilder(String.valueOf(c)); - } else { - newString.append(c); - } - } - } else if (c == '%') { - replaceString = new StringBuilder(String.valueOf(c)); - } else { - newString.append(c); - } - } - - if (replaceString != null) { - String t = this.internalGet(replaceString.substring(1)); - if (t != null && (onlyPrefix == null || replaceString.indexOf(onlyPrefix) == 1)) { - newString.append(t); - } else { - newString.append(replaceString); - } - } - return newString.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/lang/TextContainer.java b/src/main/java/cn/nukkit/lang/TextContainer.java deleted file mode 100644 index 61d478143..000000000 --- a/src/main/java/cn/nukkit/lang/TextContainer.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.lang; - -import cn.nukkit.Server; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class TextContainer implements Cloneable { - - protected String text; - - public TextContainer(String text) { - this.text = text; - } - - public void setText(String text) { - this.text = text; - } - - public String getText() { - return text; - } - - @Override - public String toString() { - return this.text; - } - - @Override - public TextContainer clone() { - try { - return (TextContainer) super.clone(); - } catch (CloneNotSupportedException e) { - Server.getInstance().getLogger().logException(e); - } - return null; - } -} diff --git a/src/main/java/cn/nukkit/lang/TranslationContainer.java b/src/main/java/cn/nukkit/lang/TranslationContainer.java deleted file mode 100644 index e938edb1b..000000000 --- a/src/main/java/cn/nukkit/lang/TranslationContainer.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.lang; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class TranslationContainer extends TextContainer implements Cloneable { - - protected String[] params; - - public TranslationContainer(String text) { - this(text, new String[]{}); - } - - public TranslationContainer(String text, String params) { - super(text); - this.setParameters(new String[]{params}); - } - - public TranslationContainer(String text, String... params) { - super(text); - this.setParameters(params); - } - - public String[] getParameters() { - return params; - } - - public void setParameters(String[] params) { - this.params = params; - } - - public String getParameter(int i) { - return (i >= 0 && i < this.params.length) ? this.params[i] : null; - } - - public void setParameter(int i, String str) { - if (i >= 0 && i < this.params.length) { - this.params[i] = str; - } - } - - @Override - public TranslationContainer clone() { - return new TranslationContainer(this.text, this.params.clone()); - } -} diff --git a/src/main/java/cn/nukkit/level/ChunkLoader.java b/src/main/java/cn/nukkit/level/ChunkLoader.java deleted file mode 100644 index 1e1d8fd27..000000000 --- a/src/main/java/cn/nukkit/level/ChunkLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.Vector3; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface ChunkLoader { - - int getLoaderId(); - - boolean isLoaderActive(); - - Position getPosition(); - - double getX(); - - double getZ(); - - Level getLevel(); - - void onChunkChanged(FullChunk chunk); - - void onChunkLoaded(FullChunk chunk); - - void onChunkUnloaded(FullChunk chunk); - - void onChunkPopulated(FullChunk chunk); - - void onBlockChanged(Vector3 block); -} diff --git a/src/main/java/cn/nukkit/level/ChunkManager.java b/src/main/java/cn/nukkit/level/ChunkManager.java deleted file mode 100644 index f871d833c..000000000 --- a/src/main/java/cn/nukkit/level/ChunkManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.level.format.generic.BaseFullChunk; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface ChunkManager { - - int getBlockIdAt(int x, int y, int z); - - void setBlockFullIdAt(int x, int y, int z, int fullId); - - void setBlockIdAt(int x, int y, int z, int id); - - default void setBlockAt(int x, int y, int z, int id) { - setBlockAt(x, y, z, id, 0); - } - - void setBlockAt(int x, int y, int z, int id, int data); - - int getBlockDataAt(int x, int y, int z); - - void setBlockDataAt(int x, int y, int z, int data); - - BaseFullChunk getChunk(int chunkX, int chunkZ); - - void setChunk(int chunkX, int chunkZ); - - void setChunk(int chunkX, int chunkZ, BaseFullChunk chunk); - - long getSeed(); -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/ChunkPosition.java b/src/main/java/cn/nukkit/level/ChunkPosition.java deleted file mode 100644 index 6f1e43c9e..000000000 --- a/src/main/java/cn/nukkit/level/ChunkPosition.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.Vector3; - -/** - * @author Adam Matthew - * - * Nukkit Project - */ -public class ChunkPosition { - - public final int x; - public final int y; - public final int z; - - public ChunkPosition(int i, int j, int k) { - this.x = i; - this.y = j; - this.z = k; - } - - public ChunkPosition(Vector3 vec3d) { - this(MathHelper.floor(vec3d.x), MathHelper.floor(vec3d.y), MathHelper.floor(vec3d.z)); - } - - @Override - public boolean equals(Object object) { - if (!(object instanceof ChunkPosition)) { - return false; - } else { - ChunkPosition chunkposition = (ChunkPosition) object; - - return chunkposition.x == this.x && chunkposition.y == this.y && chunkposition.z == this.z; - } - } - - @Override - public int hashCode() { - return this.x * 8976890 + this.y * 981131 + this.z; - } -} diff --git a/src/main/java/cn/nukkit/level/EnumLevel.java b/src/main/java/cn/nukkit/level/EnumLevel.java deleted file mode 100644 index 6db791aaf..000000000 --- a/src/main/java/cn/nukkit/level/EnumLevel.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.Server; -import cn.nukkit.level.generator.Generator; - -import java.util.StringTokenizer; - -/** - * Default dimensions and their Levels - */ -public enum EnumLevel { - - OVERWORLD, - NETHER, - THE_END; - - Level level; - - /** - * Get Level - * - * @return Level or null if the dimension is not enabled - */ - public Level getLevel() { - return level; - } - - /** - * Internal: Initialize default overworld, nether and the end Levels - */ - public static void initLevels() { - Server server = Server.getInstance(); - OVERWORLD.level = server.getDefaultLevel(); - if (server.netherEnabled) { - if (server.getLevelByName("nether") == null) { - server.generateLevel("nether", System.currentTimeMillis(), Generator.getGenerator(Generator.TYPE_NETHER)); - server.loadLevel("nether"); - } - NETHER.level = server.getLevelByName("nether"); - String list = server.getPropertyString("multi-nether-worlds"); - if (!list.trim().isEmpty()) { - StringTokenizer tokenizer = new StringTokenizer(list, ", "); - while (tokenizer.hasMoreTokens()) { - String world = tokenizer.nextToken(); - Server.multiNetherWorlds.add(world); - String nether = world + "-nether"; - if (server.getLevelByName(nether) == null) { - server.generateLevel(nether, System.currentTimeMillis(), Generator.getGenerator(Generator.TYPE_NETHER)); - server.loadLevel(nether); - } - } - } - } - if (server.endEnabled) { - if (server.getLevelByName("the_end") == null) { - server.generateLevel("the_end", System.currentTimeMillis(), Generator.getGenerator(Generator.TYPE_THE_END)); - server.loadLevel("the_end"); - } - THE_END.level = server.getLevelByName("the_end"); - } - } -} diff --git a/src/main/java/cn/nukkit/level/Explosion.java b/src/main/java/cn/nukkit/level/Explosion.java deleted file mode 100644 index 33c076c3d..000000000 --- a/src/main/java/cn/nukkit/level/Explosion.java +++ /dev/null @@ -1,224 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockTNT; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityShulkerBox; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.entity.item.EntityXPOrb; -import cn.nukkit.event.block.BlockUpdateEvent; -import cn.nukkit.event.entity.EntityDamageByBlockEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.EntityExplodeEvent; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.particle.HugeExplodeSeedParticle; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Hash; -import cn.nukkit.utils.Utils; -import it.unimi.dsi.fastutil.longs.LongArraySet; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class Explosion { - - private static final int rays = 16; - private final Level level; - private final Position source; - private final double size; - - private List affectedBlocks = new ArrayList<>(); - private static final double stepLen = 0.3d; - - private final Object what; - private boolean doesDamage = true; - - public Explosion(Position center, double size, Entity what) { - this.level = center.getLevel(); - this.source = center; - this.size = Math.max(size, 0); - this.what = what; - } - - /** - * @return bool - */ - public boolean explode() { - if (explodeA()) { - return explodeB(); - } - return false; - } - - /** - * @return bool - */ - public boolean explodeA() { - if (what instanceof EntityExplosive && ((Entity) what).isInsideOfWater()) { - this.doesDamage = false; - return true; - } - if (this.size < 0.1) return false; - if (!level.getServer().explosionBreakBlocks) return true; - - Vector3 vector = new Vector3(0, 0, 0); - Vector3 vBlock = new Vector3(0, 0, 0); - - int mRays = 15; - for (int i = 0; i < rays; ++i) { - for (int j = 0; j < rays; ++j) { - for (int k = 0; k < rays; ++k) { - if (i == 0 || i == mRays || j == 0 || j == mRays || k == 0 || k == mRays) { - vector.setComponents((double) i / (double) mRays * 2d - 1, (double) j / (double) mRays * 2d - 1, (double) k / (double) mRays * 2d - 1); - double len = vector.length(); - vector.setComponents((vector.x / len) * stepLen, (vector.y / len) * stepLen, (vector.z / len) * stepLen); - double pointerX = this.source.x; - double pointerY = this.source.y; - double pointerZ = this.source.z; - - for (double blastForce = this.size * (Utils.random.nextInt(700, 1301)) / 1000d; blastForce > 0; blastForce -= 0.22499999999999998) { - int x = (int) pointerX; - int y = (int) pointerY; - int z = (int) pointerZ; - vBlock.x = pointerX >= x ? x : x - 1; - vBlock.y = pointerY >= y ? y : y - 1; - vBlock.z = pointerZ >= z ? z : z - 1; - if (vBlock.y < 0 || vBlock.y > 255) { - break; - } - Block block = this.level.getBlock(vBlock); - - if (block.getId() != 0 && block.getId() != 7) { - blastForce -= (block.getResistance() / 5 + 0.3d) * stepLen; - if (blastForce > 0) { - if (!this.affectedBlocks.contains(block)) { - this.affectedBlocks.add(block); - } - } - } - pointerX += vector.x; - pointerY += vector.y; - pointerZ += vector.z; - } - } - } - } - } - - return true; - } - - public boolean explodeB() { - LongArraySet updateBlocks = new LongArraySet(); - double yield = (1d / this.size) * 100d; - - if (this.what instanceof Entity) { - EntityExplodeEvent ev = new EntityExplodeEvent((Entity) this.what, this.source, this.affectedBlocks, yield); - this.level.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } else { - yield = ev.getYield(); - this.affectedBlocks = ev.getBlockList(); - } - } - - double explosionSize = this.size * 2d; - double minX = NukkitMath.floorDouble(this.source.x - explosionSize - 1); - double maxX = NukkitMath.ceilDouble(this.source.x + explosionSize + 1); - double minY = NukkitMath.floorDouble(this.source.y - explosionSize - 1); - double maxY = NukkitMath.ceilDouble(this.source.y + explosionSize + 1); - double minZ = NukkitMath.floorDouble(this.source.z - explosionSize - 1); - double maxZ = NukkitMath.ceilDouble(this.source.z + explosionSize + 1); - - AxisAlignedBB explosionBB = new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); - Entity[] list = this.level.getNearbyEntities(explosionBB, this.what instanceof Entity ? (Entity) this.what : null); - for (Entity entity : list) { - double distance = entity.distance(this.source) / explosionSize; - - if (distance <= 1) { - Vector3 motion = entity.subtract(this.source).normalize(); - int exposure = 1; - double impact = (1 - distance) * exposure; - - int damage = this.doesDamage ? (int) (((impact * impact + impact) / 2) * 8 * explosionSize + 1) : 0; - - if (this.what instanceof Entity) { - entity.attack(new EntityDamageByEntityEvent((Entity) this.what, entity, DamageCause.ENTITY_EXPLOSION, damage)); - } else if (this.what instanceof Block) { - entity.attack(new EntityDamageByBlockEvent((Block) this.what, entity, DamageCause.BLOCK_EXPLOSION, damage)); - } else { - entity.attack(new EntityDamageEvent(entity, DamageCause.BLOCK_EXPLOSION, damage)); - } - - if (!(entity instanceof EntityItem || entity instanceof EntityXPOrb)) { - entity.setMotion(motion.multiply(impact)); - } - } - } - - ItemBlock air = new ItemBlock(Block.get(BlockID.AIR)); - BlockEntity container; - - for (Block block : this.affectedBlocks) { - if (block.getId() == Block.TNT) { - ((BlockTNT) block).prime(Utils.rand(10, 30), this.what instanceof Entity ? (Entity) this.what : null); - } else if (block.getId() == Block.BED_BLOCK && (block.getDamage() & 0x08) == 0x08) { - this.level.setBlockAt((int) block.x, (int) block.y, (int) block.z, Block.AIR); - continue; // We don't want drops from both bed parts - } else if ((container = block.getLevel().getBlockEntity(block)) instanceof InventoryHolder) { - if (block.getLevel().getGameRules().getBoolean(GameRule.DO_TILE_DROPS)) { - if (container instanceof BlockEntityShulkerBox) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), block.toItem()); - ((InventoryHolder) container).getInventory().clearAll(); - } else { - for (Item drop : ((InventoryHolder) container).getInventory().getContents().values()) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), drop); - } - ((InventoryHolder) container).getInventory().clearAll(); - } - } - } else if (Math.random() * 100 < yield) { - for (Item drop : block.getDrops(air)) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), drop); - } - } - - this.level.setBlockAt((int) block.x, (int) block.y, (int) block.z, Block.AIR); - - Vector3 pos = new Vector3(block.x, block.y, block.z); - - for (BlockFace side : BlockFace.values()) { - Vector3 sideBlock = pos.getSide(side); - long index = Hash.hashBlock((int) sideBlock.x, (int) sideBlock.y, (int) sideBlock.z); - if (!this.affectedBlocks.contains(sideBlock) && !updateBlocks.contains(index)) { - BlockUpdateEvent ev = new BlockUpdateEvent(this.level.getBlock(sideBlock)); - this.level.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - ev.getBlock().onUpdate(Level.BLOCK_UPDATE_NORMAL); - } - updateBlocks.add(index); - } - } - } - - this.level.addParticle(new HugeExplodeSeedParticle(this.source)); - this.level.addLevelSoundEvent(source, LevelSoundEventPacket.SOUND_EXPLODE); - return true; - } -} diff --git a/src/main/java/cn/nukkit/level/GameRule.java b/src/main/java/cn/nukkit/level/GameRule.java deleted file mode 100644 index a3c1cf28d..000000000 --- a/src/main/java/cn/nukkit/level/GameRule.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.nukkit.level; - -import java.util.Optional; - -public enum GameRule { - - COMMAND_BLOCKS_ENABLED("commandBlocksEnabled"), - COMMAND_BLOCK_OUTPUT("commandBlockOutput"), - DO_DAYLIGHT_CYCLE("doDaylightCycle"), - DO_ENTITY_DROPS("doEntityDrops"), - DO_FIRE_TICK("doFireTick"), - DO_INSOMNIA("doInsomnia"), - DO_IMMEDIATE_RESPAWN("doImmediateRespawn"), - DO_MOB_LOOT("doMobLoot"), - DO_MOB_SPAWNING("doMobSpawning"), - DO_TILE_DROPS("doTileDrops"), - DO_WEATHER_CYCLE("doWeatherCycle"), - DROWNING_DAMAGE("drowningDamage"), - FALL_DAMAGE("fallDamage"), - FIRE_DAMAGE("fireDamage"), - FREEZE_DAMAGE("freezeDamage"), - FUNCTION_COMMAND_LIMIT("functionCommandLimit"), - KEEP_INVENTORY("keepInventory"), - MAX_COMMAND_CHAIN_LENGTH("maxCommandChainLength"), - MOB_GRIEFING("mobGriefing"), - NATURAL_REGENERATION("naturalRegeneration"), - PVP("pvp"), - RANDOM_TICK_SPEED("randomTickSpeed"), - SEND_COMMAND_FEEDBACK("sendCommandFeedback"), - SHOW_COORDINATES("showCoordinates"), - SHOW_DEATH_MESSAGES("showDeathMessages"), - SPAWN_RADIUS("spawnRadius"), - TNT_EXPLODES("tntExplodes"), - SHOW_TAGS("showTags"); - - private final String name; - - GameRule(String name) { - this.name = name; - } - - public static Optional parseString(String gameRuleString) { - for (GameRule gameRule: values()) { - if (gameRule.name.equalsIgnoreCase(gameRuleString)) { - return Optional.of(gameRule); - } - } - return Optional.empty(); - } - - public static String[] getNames() { - String[] stringValues = new String[values().length]; - for (int i = 0; i < values().length; i++) { - stringValues[i] = values()[i].name; - } - return stringValues; - } - - public static String[] getNamesLowerCase() { - String[] stringValues = new String[values().length]; - for (int i = 0; i < values().length; i++) { - stringValues[i] = values()[i].name.toLowerCase(); - } - return stringValues; - } - - public String getName() { - return name; - } -} diff --git a/src/main/java/cn/nukkit/level/GameRules.java b/src/main/java/cn/nukkit/level/GameRules.java deleted file mode 100644 index dfa71359e..000000000 --- a/src/main/java/cn/nukkit/level/GameRules.java +++ /dev/null @@ -1,272 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.Server; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.BinaryStream; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; - -import java.util.EnumMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; - -import static cn.nukkit.level.GameRule.*; - -@SuppressWarnings("unchecked") -public class GameRules { - - private final EnumMap gameRules = new EnumMap<>(GameRule.class); - private boolean stale; - - public static GameRules getDefault() { - GameRules gameRules = new GameRules(); - - gameRules.gameRules.put(COMMAND_BLOCKS_ENABLED, new Value<>(Type.BOOLEAN, false, 291)); // Vanilla: default true - gameRules.gameRules.put(COMMAND_BLOCK_OUTPUT, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(DO_DAYLIGHT_CYCLE, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(DO_ENTITY_DROPS, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(DO_FIRE_TICK, new Value(Type.BOOLEAN, true)); - gameRules.gameRules.put(DO_INSOMNIA, new Value(Type.BOOLEAN, false, 281)); // Vanilla: default true - gameRules.gameRules.put(DO_IMMEDIATE_RESPAWN, new Value(Type.BOOLEAN, false, 332)); - gameRules.gameRules.put(DO_MOB_LOOT, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(DO_MOB_SPAWNING, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(DO_TILE_DROPS, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(DO_WEATHER_CYCLE, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(DROWNING_DAMAGE, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(FALL_DAMAGE, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(FIRE_DAMAGE, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(FREEZE_DAMAGE, new Value<>(Type.BOOLEAN, true, 440)); - gameRules.gameRules.put(FUNCTION_COMMAND_LIMIT, new Value<>(Type.INTEGER, 10000, 332)); - gameRules.gameRules.put(KEEP_INVENTORY, new Value<>(Type.BOOLEAN, false)); - gameRules.gameRules.put(MAX_COMMAND_CHAIN_LENGTH, new Value<>(Type.INTEGER, 65536)); - gameRules.gameRules.put(MOB_GRIEFING, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(NATURAL_REGENERATION, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(PVP, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(RANDOM_TICK_SPEED, new Value<>(Type.INTEGER, 3, 313)); // Vanilla: default 1 - gameRules.gameRules.put(SEND_COMMAND_FEEDBACK, new Value<>(Type.BOOLEAN, true, 361)); - gameRules.gameRules.put(SHOW_COORDINATES, new Value<>(Type.BOOLEAN, false)); - gameRules.gameRules.put(SHOW_DEATH_MESSAGES, new Value<>(Type.BOOLEAN, true, 332)); - gameRules.gameRules.put(SPAWN_RADIUS, new Value<>(Type.INTEGER, 5, 361)); - gameRules.gameRules.put(TNT_EXPLODES, new Value<>(Type.BOOLEAN, true)); - gameRules.gameRules.put(SHOW_TAGS, new Value<>(Type.BOOLEAN, true, 389)); - - return gameRules; - } - - public Map getGameRules() { - return ImmutableMap.copyOf(gameRules); - } - - public boolean isStale() { - return stale; - } - - public void refresh() { - stale = false; - } - - public void setGameRule(GameRule gameRule, boolean value) { - if (!gameRules.containsKey(gameRule)) { - throw new IllegalArgumentException("Gamerule does not exist"); - } - gameRules.get(gameRule).setValue(value, Type.BOOLEAN); - stale = true; - } - - public void setGameRule(GameRule gameRule, int value) { - if (!gameRules.containsKey(gameRule)) { - throw new IllegalArgumentException("Gamerule does not exist"); - } - gameRules.get(gameRule).setValue(value, Type.INTEGER); - stale = true; - } - - public void setGameRule(GameRule gameRule, float value) { - if (!gameRules.containsKey(gameRule)) { - throw new IllegalArgumentException("Gamerule does not exist"); - } - gameRules.get(gameRule).setValue(value, Type.FLOAT); - stale = true; - } - - public void setGameRules(GameRule gameRule, String value) throws IllegalArgumentException { - Preconditions.checkNotNull(gameRule, "gameRule"); - Preconditions.checkNotNull(value, "value"); - - switch (getGameRuleType(gameRule)) { - case BOOLEAN: - if (value.equalsIgnoreCase("true")) { - setGameRule(gameRule, true); - } else if (value.equalsIgnoreCase("false")) { - setGameRule(gameRule, false); - } else { - throw new IllegalArgumentException("Was not a boolean"); - } - break; - case INTEGER: - setGameRule(gameRule, Integer.parseInt(value)); - break; - case FLOAT: - setGameRule(gameRule, Float.parseFloat(value)); - } - } - - public boolean getBoolean(GameRule gameRule) { - return gameRules.get(gameRule).getValueAsBoolean(); - } - - public int getInteger(GameRule gameRule) { - Preconditions.checkNotNull(gameRule, "gameRule"); - return gameRules.get(gameRule).getValueAsInteger(); - } - - public float getFloat(GameRule gameRule) { - Preconditions.checkNotNull(gameRule, "gameRule"); - return gameRules.get(gameRule).getValueAsFloat(); - } - - public String getString(GameRule gameRule) { - Preconditions.checkNotNull(gameRule, "gameRule"); - return gameRules.get(gameRule).value.toString(); - } - - public Type getGameRuleType(GameRule gameRule) { - Preconditions.checkNotNull(gameRule, "gameRule"); - return gameRules.get(gameRule).getType(); - } - - public boolean hasRule(GameRule gameRule) { - return gameRules.containsKey(gameRule); - } - - public GameRule[] getRules() { - return gameRules.keySet().toArray(new GameRule[0]); - } - - public CompoundTag writeNBT() { - CompoundTag nbt = new CompoundTag(); - - for (Entry entry : gameRules.entrySet()) { - nbt.putString(entry.getKey().getName(), entry.getValue().value.toString()); - } - - return nbt; - } - - public void readNBT(CompoundTag nbt) { - Preconditions.checkNotNull(nbt); - for (String key : nbt.getTags().keySet()) { - Optional gameRule = GameRule.parseString(key); - if (!gameRule.isPresent()) { - continue; - } - - setGameRules(gameRule.get(), nbt.getString(key)); - } - } - - public enum Type { - UNKNOWN { - @Override - void write(BinaryStream pk, Value value) { - } - }, - BOOLEAN { - @Override - void write(BinaryStream pk, Value value) { - pk.putBoolean(value.getValueAsBoolean()); - } - }, - INTEGER { - @Override - void write(BinaryStream pk, Value value) { - pk.putUnsignedVarInt(value.getValueAsInteger()); - } - }, - FLOAT { - @Override - void write(BinaryStream pk, Value value) { - pk.putLFloat(value.getValueAsFloat()); - } - }; - - abstract void write(BinaryStream pk, Value value); - } - - public static class Value { - private final Type type; - private T value; - private boolean canBeChanged; - private int minProtocol; - - public Value(Type type, T value) { - this.type = type; - this.value = value; - } - - public Value(Type type, T value, int minProtocol) { - this.type = type; - this.value = value; - this.minProtocol = minProtocol; - } - - private void setValue(T value, Type type) { - if (this.type != type) { - throw new UnsupportedOperationException("Rule not of type " + type.name().toLowerCase()); - } - this.value = value; - } - - public boolean isCanBeChanged() { - return this.canBeChanged; - } - - public void setCanBeChanged(boolean canBeChanged) { - this.canBeChanged = canBeChanged; - } - - public Type getType() { - return this.type; - } - - public int getMinProtocol() { - return minProtocol; - } - - private boolean getValueAsBoolean() { - if (type != Type.BOOLEAN) { - throw new UnsupportedOperationException("Rule not of type boolean"); - } - return (Boolean) value; - } - - private int getValueAsInteger() { - if (type != Type.INTEGER) { - throw new UnsupportedOperationException("Rule not of type integer"); - } - return (Integer) value; - } - - private float getValueAsFloat() { - if (type != Type.FLOAT) { - throw new UnsupportedOperationException("Rule not of type float"); - } - return (Float) value; - } - - public void write(BinaryStream pk) { - Server.mvw("GameRules#write(BinaryStream)"); - write(ProtocolInfo.CURRENT_PROTOCOL, pk); - } - - public void write(int protocol, BinaryStream pk) { - if (protocol >= ProtocolInfo.v1_17_0) { - pk.putBoolean(this.canBeChanged); - } - pk.putUnsignedVarInt(type.ordinal()); - type.write(pk, this); - } - } -} diff --git a/src/main/java/cn/nukkit/level/GlobalBlockPalette.java b/src/main/java/cn/nukkit/level/GlobalBlockPalette.java deleted file mode 100644 index 5150c5bca..000000000 --- a/src/main/java/cn/nukkit/level/GlobalBlockPalette.java +++ /dev/null @@ -1,616 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.Server; -import cn.nukkit.block.BlockID; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.BinaryStream; -import com.google.common.io.ByteStreams; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import it.unimi.dsi.fastutil.ints.Int2IntMap; -import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; -import lombok.extern.log4j.Log4j2; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.Collection; -import java.util.NoSuchElementException; -import java.util.concurrent.atomic.AtomicInteger; - -@Log4j2 -public class GlobalBlockPalette { - - private static final Gson GSON = new Gson(); - private static boolean initialized; - - private static final AtomicInteger runtimeIdAllocator282 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator291 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator313 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator332 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator340 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator354 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator361 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator388 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator389 = new AtomicInteger(0); - private static final AtomicInteger runtimeIdAllocator407 = new AtomicInteger(0); - - private static final Int2IntMap legacyToRuntimeId223 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId261 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId274 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId282 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId291 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId313 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId332 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId340 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId354 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId361 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId388 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId389 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId407 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId419 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId428 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId440 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId448 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId465 = new Int2IntOpenHashMap(); - private static final Int2IntMap legacyToRuntimeId471 = new Int2IntOpenHashMap(); - - private static final Int2IntMap runtimeIdToLegacy428 = new Int2IntOpenHashMap(); - private static final Int2IntMap runtimeIdToLegacy440 = new Int2IntOpenHashMap(); - private static final Int2IntMap runtimeIdToLegacy448 = new Int2IntOpenHashMap(); - private static final Int2IntMap runtimeIdToLegacy465 = new Int2IntOpenHashMap(); - private static final Int2IntMap runtimeIdToLegacy471 = new Int2IntOpenHashMap(); - - private static byte[] compiledTable282; - private static byte[] compiledTable291; - private static byte[] compiledTable313; - private static byte[] compiledTable332; - private static byte[] compiledTable340; - private static byte[] compiledTable354; - private static byte[] compiledTable361; - private static byte[] compiledTable388; - private static byte[] compiledTable389; - private static byte[] compiledTable407; - - static { - legacyToRuntimeId223.defaultReturnValue(-1); - legacyToRuntimeId261.defaultReturnValue(-1); - legacyToRuntimeId274.defaultReturnValue(-1); - legacyToRuntimeId282.defaultReturnValue(-1); - legacyToRuntimeId291.defaultReturnValue(-1); - legacyToRuntimeId313.defaultReturnValue(-1); - legacyToRuntimeId332.defaultReturnValue(-1); - legacyToRuntimeId340.defaultReturnValue(-1); - legacyToRuntimeId354.defaultReturnValue(-1); - legacyToRuntimeId361.defaultReturnValue(-1); - legacyToRuntimeId388.defaultReturnValue(-1); - legacyToRuntimeId389.defaultReturnValue(-1); - legacyToRuntimeId407.defaultReturnValue(-1); - legacyToRuntimeId419.defaultReturnValue(-1); - legacyToRuntimeId428.defaultReturnValue(-1); - legacyToRuntimeId440.defaultReturnValue(-1); - legacyToRuntimeId448.defaultReturnValue(-1); - legacyToRuntimeId465.defaultReturnValue(-1); - legacyToRuntimeId471.defaultReturnValue(-1); - - runtimeIdToLegacy428.defaultReturnValue(-1); - runtimeIdToLegacy440.defaultReturnValue(-1); - runtimeIdToLegacy448.defaultReturnValue(-1); - runtimeIdToLegacy465.defaultReturnValue(-1); - runtimeIdToLegacy471.defaultReturnValue(-1); - } - - public static void init() { - if (initialized) { - throw new IllegalStateException("BlockPalette was already generated!"); - } - initialized = true; - log.debug("Loading block palette..."); - - // 223 - InputStream stream223 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_223.json"); - if (stream223 == null) throw new AssertionError("Unable to locate RuntimeID table 223"); - Collection entries223 = GSON.fromJson(new InputStreamReader(stream223, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - for (TableEntryOld entry : entries223) { - legacyToRuntimeId223.put((entry.id << 4) | entry.data, entry.runtimeID); - } - // Compiled table not needed for 223 - // 261 - InputStream stream261 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_261.json"); - if (stream261 == null) throw new AssertionError("Unable to locate RuntimeID table 261"); - Collection entries261 = GSON.fromJson(new InputStreamReader(stream261, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - for (TableEntryOld entry : entries261) { - legacyToRuntimeId261.put((entry.id << 4) | entry.data, entry.runtimeID); - } - // Compiled table not needed 261 - // 274 - InputStream stream274 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_274.json"); - if (stream274 == null) throw new AssertionError("Unable to locate RuntimeID table 274"); - Collection entries274 = GSON.fromJson(new InputStreamReader(stream274, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - for (TableEntryOld entry : entries274) { - legacyToRuntimeId274.put((entry.id << 4) | entry.data, entry.runtimeID); - } - // Compiled table not needed 274 - // 282 - InputStream stream282 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_282.json"); - if (stream282 == null) throw new AssertionError("Unable to locate RuntimeID table 282"); - Collection entries282 = GSON.fromJson(new InputStreamReader(stream282, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - BinaryStream table282 = new BinaryStream(); - table282.putUnsignedVarInt(entries282.size()); - for (TableEntry entry : entries282) { - legacyToRuntimeId282.put((entry.id << 4) | entry.data, runtimeIdAllocator282.getAndIncrement()); - table282.putString(entry.name); - table282.putLShort(entry.data); - } - compiledTable282 = table282.getBuffer(); - // 291 - InputStream stream291 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_291.json"); - if (stream291 == null) throw new AssertionError("Unable to locate RuntimeID table 291"); - Collection entries291 = GSON.fromJson(new InputStreamReader(stream291, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - BinaryStream table291 = new BinaryStream(); - table291.putUnsignedVarInt(entries291.size()); - for (TableEntry entry : entries291) { - legacyToRuntimeId291.put((entry.id << 4) | entry.data, runtimeIdAllocator291.getAndIncrement()); - table291.putString(entry.name); - table291.putLShort(entry.data); - } - compiledTable291 = table291.getBuffer(); - // 313 - InputStream stream313 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_313.json"); - if (stream313 == null) throw new AssertionError("Unable to locate RuntimeID table 313"); - Collection entries313 = GSON.fromJson(new InputStreamReader(stream313, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - BinaryStream table313 = new BinaryStream(); - table313.putUnsignedVarInt(entries313.size()); - for (TableEntry entry : entries313) { - legacyToRuntimeId313.put((entry.id << 4) | entry.data, runtimeIdAllocator313.getAndIncrement()); - table313.putString(entry.name); - table313.putLShort(entry.data); - } - compiledTable313 = table313.getBuffer(); - // 332 - InputStream stream332 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_332.json"); - if (stream332 == null) throw new AssertionError("Unable to locate RuntimeID table 332"); - Collection entries332 = GSON.fromJson(new InputStreamReader(stream332, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - BinaryStream table332 = new BinaryStream(); - table332.putUnsignedVarInt(entries332.size()); - for (TableEntry entry : entries332) { - legacyToRuntimeId332.put((entry.id << 4) | entry.data, runtimeIdAllocator332.getAndIncrement()); - table332.putString(entry.name); - table332.putLShort(entry.data); - } - compiledTable332 = table332.getBuffer(); - // 340 - InputStream stream340 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_340.json"); - if (stream340 == null) throw new AssertionError("Unable to locate RuntimeID table 340"); - Collection entries340 = GSON.fromJson(new InputStreamReader(stream340, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - BinaryStream table340 = new BinaryStream(); - table340.putUnsignedVarInt(entries340.size()); - for (TableEntry entry : entries340) { - legacyToRuntimeId340.put((entry.id << 4) | entry.data, runtimeIdAllocator340.getAndIncrement()); - table340.putString(entry.name); - table340.putLShort(entry.data); - } - compiledTable340 = table340.getBuffer(); - // 354 - InputStream stream354 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_354.json"); - if (stream354 == null) throw new AssertionError("Unable to locate RuntimeID table 354"); - Collection entries354 = GSON.fromJson(new InputStreamReader(stream354, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - BinaryStream table354 = new BinaryStream(); - table354.putUnsignedVarInt(entries354.size()); - for (TableEntry entry : entries354) { - legacyToRuntimeId354.put((entry.id << 4) | entry.data, runtimeIdAllocator354.getAndIncrement()); - table354.putString(entry.name); - table354.putLShort(entry.data); - } - compiledTable354 = table354.getBuffer(); - // 361 - InputStream stream361 = Server.class.getClassLoader().getResourceAsStream("runtimeid_table_361.json"); - if (stream361 == null) throw new AssertionError("Unable to locate RuntimeID table 361"); - Collection entries361 = GSON.fromJson(new InputStreamReader(stream361, StandardCharsets.UTF_8), new TypeToken>(){}.getType()); - BinaryStream table361 = new BinaryStream(); - table361.putUnsignedVarInt(entries361.size()); - for (TableEntry entry : entries361) { - legacyToRuntimeId361.put((entry.id << 4) | entry.data, runtimeIdAllocator361.getAndIncrement()); - table361.putString(entry.name); - table361.putLShort(entry.data); - table361.putLShort(entry.id); - } - compiledTable361 = table361.getBuffer(); - // 388 - InputStream stream388 = Server.class.getClassLoader().getResourceAsStream("runtime_block_states_388.dat"); - if (stream388 == null) throw new AssertionError("Unable to locate block state nbt 388"); - ListTag tag388; - try { - compiledTable388 = ByteStreams.toByteArray(stream388); - //noinspection unchecked - tag388 = (ListTag) NBTIO.readNetwork(new ByteArrayInputStream(compiledTable388)); - } catch (IOException e) { - throw new AssertionError(e); - } - for (CompoundTag state : tag388.getAll()) { - int runtimeId = runtimeIdAllocator388.getAndIncrement(); - if (!state.contains("meta")) continue; - for (int val : state.getIntArray("meta")) { - legacyToRuntimeId388.put(state.getShort("id") << 6 | val, runtimeId); - } - state.remove("meta"); - } - // 389 - InputStream stream389 = Server.class.getClassLoader().getResourceAsStream("runtime_block_states_389.dat"); - if (stream389 == null) throw new AssertionError("Unable to locate block state nbt 389"); - ListTag tag389; - try { - //noinspection unchecked - tag389 = (ListTag) NBTIO.readTag(stream389, ByteOrder.LITTLE_ENDIAN, false); - } catch (IOException e) { - throw new AssertionError("Unable to load block palette 389", e); - } - for (CompoundTag state : tag389.getAll()) { - int runtimeId = runtimeIdAllocator389.getAndIncrement(); - if (!state.contains("meta")) continue; - for (int val : state.getIntArray("meta")) { - legacyToRuntimeId389.put(state.getShort("id") << 6 | val, runtimeId); - } - state.remove("meta"); - } - try { - compiledTable389 = NBTIO.write(tag389, ByteOrder.LITTLE_ENDIAN, true); - } catch (IOException e) { - throw new AssertionError("Unable to write block palette 389", e); - } - // 407 - ListTag tag407; - try (InputStream stream407 = Server.class.getClassLoader().getResourceAsStream("runtime_block_states_407.dat")) { - if (stream407 == null) { - throw new AssertionError("Unable to locate block state nbt 407"); - } - //noinspection unchecked - tag407 = (ListTag) NBTIO.readTag(new ByteArrayInputStream(ByteStreams.toByteArray(stream407)), ByteOrder.BIG_ENDIAN, false); - } catch (IOException e) { - throw new AssertionError("Unable to load block palette 407", e); - } - for (CompoundTag state : tag407.getAll()) { - int id = state.getInt("id"); - int data = state.getShort("data"); - int runtimeId = runtimeIdAllocator407.getAndIncrement(); - int legacyId = id << 6 | data; - legacyToRuntimeId407.put(legacyId, runtimeId); - state.remove("data"); - } - try { - compiledTable407 = NBTIO.write(tag407, ByteOrder.LITTLE_ENDIAN, true); - } catch (IOException e) { - throw new AssertionError("Unable to write block palette 407", e); - } - // 419 - ListTag tag419; - try (InputStream stream419 = Server.class.getClassLoader().getResourceAsStream("runtime_block_states_419.dat")) { - if (stream419 == null) { - throw new AssertionError("Unable to locate block state nbt 419"); - } - //noinspection unchecked - tag419 = (ListTag) NBTIO.readTag(new ByteArrayInputStream(ByteStreams.toByteArray(stream419)), ByteOrder.BIG_ENDIAN, false); - } catch (IOException e) { - throw new AssertionError("Unable to load block palette 419", e); - } - for (CompoundTag state : tag419.getAll()) { - int id = state.getInt("id"); - int data = state.getShort("data"); - int runtimeId = state.getInt("runtimeId"); - int legacyId = id << 6 | data; - legacyToRuntimeId419.put(legacyId, runtimeId); - } - loadBlockStates(paletteFor(428), legacyToRuntimeId428, runtimeIdToLegacy428); - loadBlockStates(paletteFor(440), legacyToRuntimeId440, runtimeIdToLegacy440); - loadBlockStates(paletteFor(448), legacyToRuntimeId448, runtimeIdToLegacy448); - loadBlockStates(paletteFor(465), legacyToRuntimeId465, runtimeIdToLegacy465); - loadBlockStates(paletteFor(471), legacyToRuntimeId471, runtimeIdToLegacy471); - } - - private static ListTag paletteFor(int protocol) { - ListTag tag; - try (InputStream stream = Server.class.getClassLoader().getResourceAsStream("runtime_block_states_" + protocol + ".dat")) { - if (stream == null) { - throw new AssertionError("Unable to locate block state nbt " + protocol); - } - //noinspection unchecked - tag = (ListTag) NBTIO.readTag(new ByteArrayInputStream(ByteStreams.toByteArray(stream)), ByteOrder.BIG_ENDIAN, false); - } catch (IOException e) { - throw new AssertionError("Unable to load block palette " + protocol, e); - } - return tag; - } - - private static void loadBlockStates(ListTag blockStates, Int2IntMap legacyToRuntime, Int2IntMap runtimeIdToLegacy) { - for (CompoundTag state : blockStates.getAll()) { - int id = state.getInt("id"); - int data = state.getShort("data"); - int runtimeId = state.getInt("runtimeId"); - int legacyId = id << 6 | data; - legacyToRuntime.put(legacyId, runtimeId); - if (!runtimeIdToLegacy.containsKey(runtimeId)) { - runtimeIdToLegacy.put(runtimeId, legacyId); - } - } - } - - public static int getOrCreateRuntimeId(int protocol, int id, int meta) { - if (protocol < 223) throw new IllegalArgumentException("Tried to get block runtime id for unsupported protocol version: " + protocol); - int legacyId = protocol >= 388 ? ((id << 6) | meta) : ((id << 4) | meta); - int runtimeId; - switch (protocol) { - // Versions before this doesn't use runtime IDs - case 223: - case 224: - runtimeId = legacyToRuntimeId223.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId223.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 261: - runtimeId = legacyToRuntimeId261.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId261.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 274: - runtimeId = legacyToRuntimeId274.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId274.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 281: - case 282: - runtimeId = legacyToRuntimeId282.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId282.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 291: - runtimeId = legacyToRuntimeId291.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId291.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 313: - runtimeId = legacyToRuntimeId313.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId313.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 332: - runtimeId = legacyToRuntimeId332.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId332.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 340: - runtimeId = legacyToRuntimeId340.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId340.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 354: - runtimeId = legacyToRuntimeId354.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId354.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 361: - runtimeId = legacyToRuntimeId361.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId361.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 388: - runtimeId = legacyToRuntimeId388.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId388.get(id << 6); - if (runtimeId == -1) runtimeId = legacyToRuntimeId388.get(BlockID.INFO_UPDATE << 6); - } - return runtimeId; - case 389: - case 390: - runtimeId = legacyToRuntimeId389.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId389.get(id << 6); - if (runtimeId == -1) runtimeId = legacyToRuntimeId389.get(BlockID.INFO_UPDATE << 6); - } - return runtimeId; - case 407: - case 408: - case 409: - case 410: - case 411: - runtimeId = legacyToRuntimeId407.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId407.get(id << 6); - if (runtimeId == -1) runtimeId = legacyToRuntimeId407.get(BlockID.INFO_UPDATE << 6); - } - return runtimeId; - case 419: - case 420: - case 422: - case ProtocolInfo.v1_16_210_50: - case ProtocolInfo.v1_16_210_53: - runtimeId = legacyToRuntimeId419.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId419.get(id << 6); - if (runtimeId == -1) { - log.info("(419) Missing block runtime id mappings for " + id + ':' + meta); - runtimeId = legacyToRuntimeId419.get(BlockID.INFO_UPDATE << 6); - } - } - return runtimeId; - case ProtocolInfo.v1_16_210: - case ProtocolInfo.v1_16_220: - case ProtocolInfo.v1_16_230_50: - case ProtocolInfo.v1_16_230: - case ProtocolInfo.v1_16_230_54: - runtimeId = legacyToRuntimeId428.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId428.get(id << 6); - if (runtimeId == -1) { - log.info("(428) Missing block runtime id mappings for " + id + ':' + meta); - runtimeId = legacyToRuntimeId428.get(BlockID.INFO_UPDATE << 6); - } - } - - return runtimeId; - case ProtocolInfo.v1_17_0: - runtimeId = legacyToRuntimeId440.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId440.get(id << 6); - if (runtimeId == -1) { - log.info("(440) Missing block runtime id mappings for " + id + ':' + meta); - runtimeId = legacyToRuntimeId440.get(BlockID.INFO_UPDATE << 6); - } - } - return runtimeId; - case ProtocolInfo.v1_17_10: - case ProtocolInfo.v1_17_20_20: - runtimeId = legacyToRuntimeId448.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId448.get(id << 6); - if (runtimeId == -1) { - log.info("(448) Missing block runtime id mappings for " + id + ':' + meta); - runtimeId = legacyToRuntimeId448.get(BlockID.INFO_UPDATE << 6); - } - } - return runtimeId; - case ProtocolInfo.v1_17_30: - runtimeId = legacyToRuntimeId465.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId465.get(id << 6); - if (runtimeId == -1) { - log.info("(465) Missing block runtime id mappings for " + id + ':' + meta); - runtimeId = legacyToRuntimeId465.get(BlockID.INFO_UPDATE << 6); - } - } - return runtimeId; - case ProtocolInfo.v1_17_40: - runtimeId = legacyToRuntimeId471.get(legacyId); - if (runtimeId == -1) { - runtimeId = legacyToRuntimeId471.get(id << 6); - if (runtimeId == -1) { - log.info("(471) Missing block runtime id mappings for " + id + ':' + meta); - runtimeId = legacyToRuntimeId471.get(BlockID.INFO_UPDATE << 6); - } - } - return runtimeId; - default: - throw new IllegalArgumentException("Tried to get block runtime id for unsupported protocol version: " + protocol); - } - } - - public static byte[] getCompiledTable(int protocol) { - switch (protocol) { - // Versions before this doesn't send compiled table in StartGamePacket - case 281: - case 282: - return compiledTable282; - case 291: - return compiledTable291; - case 313: - return compiledTable313; - case 332: - return compiledTable332; - case 340: - return compiledTable340; - case 354: - return compiledTable354; - case 361: - return compiledTable361; - case 388: - return compiledTable388; - case 389: - case 390: - return compiledTable389; - case 407: - case 408: - case 409: - case 410: - case 411: - return compiledTable407; - default: // Unused since 1.16.100 (419) - throw new IllegalArgumentException("Tried to get compiled block runtime id table for unsupported protocol version: " + protocol); - } - } - - public static int getOrCreateRuntimeId(int protocol, int legacyId) throws NoSuchElementException { - if (protocol < 223) throw new IllegalArgumentException("Tried to get block runtime id for unsupported protocol version: " + protocol); - int runtimeId; - switch (protocol) { - case 223: - case 224: - runtimeId = legacyToRuntimeId223.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId223.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 261: - runtimeId = legacyToRuntimeId261.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId261.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 274: - runtimeId = legacyToRuntimeId274.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId274.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 281: - case 282: - runtimeId = legacyToRuntimeId282.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId282.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 291: - runtimeId = legacyToRuntimeId291.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId291.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 313: - runtimeId = legacyToRuntimeId313.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId313.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 332: - runtimeId = legacyToRuntimeId332.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId332.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 340: - runtimeId = legacyToRuntimeId340.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId340.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 354: - runtimeId = legacyToRuntimeId354.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId354.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - case 361: - runtimeId = legacyToRuntimeId361.get(legacyId); - if (runtimeId == -1) runtimeId = legacyToRuntimeId361.get(BlockID.INFO_UPDATE << 4); - return runtimeId; - default: // 388+ - return getOrCreateRuntimeId(protocol, legacyId >> 4, legacyId & 0xf); - } - } - - public static int getLegacyFullId(int protocolId, int runtimeId) { - if (protocolId >= ProtocolInfo.v1_17_40) { - return runtimeIdToLegacy471.get(runtimeId); - } else if (protocolId >= ProtocolInfo.v1_17_30) { - return runtimeIdToLegacy465.get(runtimeId); - } else if (protocolId >= ProtocolInfo.v1_17_10) { - return runtimeIdToLegacy448.get(runtimeId); - } else if (protocolId >= ProtocolInfo.v1_17_0) { - return runtimeIdToLegacy440.get(runtimeId); - } else if (protocolId >= ProtocolInfo.v1_16_210) { - return runtimeIdToLegacy428.get(runtimeId); - } - throw new IllegalArgumentException("Tried to get legacyFullId for unsupported protocol version: " + protocolId); - } - - public static int getOrCreateRuntimeId(int legacyId) throws NoSuchElementException { - Server.mvw("GlobalBlockPalette#getOrCreateRuntimeId(int)"); - return getOrCreateRuntimeId(ProtocolInfo.CURRENT_PROTOCOL, legacyId >> 4, legacyId & 0xf); - } - - public static int getLegacyFullId(int runtimeId) { - Server.mvw("GlobalBlockPalette#getLegacyFullId(int)"); - return getLegacyFullId(ProtocolInfo.CURRENT_PROTOCOL, runtimeId); - } - - @SuppressWarnings("unused") - private static class TableEntry { - private int id; - private int data; - private String name; - } - - @SuppressWarnings("unused") - private static class TableEntryOld { - private int id; - private int data; - private int runtimeID; - private String name; - } -} diff --git a/src/main/java/cn/nukkit/level/Level.java b/src/main/java/cn/nukkit/level/Level.java deleted file mode 100644 index b3cbaa7f1..000000000 --- a/src/main/java/cn/nukkit/level/Level.java +++ /dev/null @@ -1,4339 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockGrass; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockRedstoneDiode; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.entity.item.EntityXPOrb; -import cn.nukkit.entity.mob.EntityWither; -import cn.nukkit.entity.passive.EntityIronGolem; -import cn.nukkit.entity.passive.EntitySnowGolem; -import cn.nukkit.entity.projectile.EntityArrow; -import cn.nukkit.entity.weather.EntityLightning; -import cn.nukkit.event.block.BlockBreakEvent; -import cn.nukkit.event.block.BlockPlaceEvent; -import cn.nukkit.event.block.BlockUpdateEvent; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.event.level.*; -import cn.nukkit.event.player.PlayerInteractEvent; -import cn.nukkit.event.player.PlayerInteractEvent.Action; -import cn.nukkit.event.weather.LightningStrikeEvent; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.item.enchantment.Enchantment; -import cn.nukkit.level.biome.Biome; -import cn.nukkit.level.format.Chunk; -import cn.nukkit.level.format.ChunkSection; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.format.LevelProvider; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.level.format.generic.BaseLevelProvider; -import cn.nukkit.level.format.generic.EmptyChunkSection; -import cn.nukkit.level.generator.Generator; -import cn.nukkit.level.generator.PopChunkManager; -import cn.nukkit.level.generator.task.GenerationTask; -import cn.nukkit.level.generator.task.LightPopulationTask; -import cn.nukkit.level.generator.task.PopulationTask; -import cn.nukkit.level.particle.DestroyBlockParticle; -import cn.nukkit.level.particle.ItemBreakParticle; -import cn.nukkit.level.particle.Particle; -import cn.nukkit.level.sound.Sound; -import cn.nukkit.math.*; -import cn.nukkit.math.BlockFace.Plane; -import cn.nukkit.metadata.BlockMetadataStore; -import cn.nukkit.metadata.MetadataValue; -import cn.nukkit.metadata.Metadatable; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.*; -import cn.nukkit.network.protocol.*; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.potion.Effect; -import cn.nukkit.scheduler.BlockUpdateScheduler; -import cn.nukkit.utils.*; -import co.aikar.timings.Timings; -import co.aikar.timings.TimingsHistory; -import com.google.common.base.Preconditions; -import it.unimi.dsi.fastutil.ints.*; -import it.unimi.dsi.fastutil.longs.*; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import it.unimi.dsi.fastutil.objects.ObjectIterator; -import it.unimi.dsi.fastutil.objects.ObjectList; - -import java.lang.ref.SoftReference; -import java.util.*; -import java.util.concurrent.*; - - -/** - * @author MagicDroidX Nukkit Project - */ -public class Level implements ChunkManager, Metadatable { - - private static int levelIdCounter = 1; - private static int chunkLoaderCounter = 1; - - public static final int BLOCK_UPDATE_NORMAL = 1; - public static final int BLOCK_UPDATE_RANDOM = 2; - public static final int BLOCK_UPDATE_SCHEDULED = 3; - public static final int BLOCK_UPDATE_WEAK = 4; - public static final int BLOCK_UPDATE_TOUCH = 5; - public static final int BLOCK_UPDATE_REDSTONE = 6; - public static final int BLOCK_UPDATE_TICK = 7; - - public static final int TIME_DAY = 0; - public static final int TIME_NOON = 6000; - public static final int TIME_SUNSET = 12000; - public static final int TIME_NIGHT = 14000; - public static final int TIME_MIDNIGHT = 18000; - public static final int TIME_SUNRISE = 23000; - - public static final int TIME_FULL = 24000; - - public static final int DIMENSION_OVERWORLD = 0; - public static final int DIMENSION_NETHER = 1; - public static final int DIMENSION_THE_END = 2; - - // Lower values use less memory - public static final int MAX_BLOCK_CACHE = 512; - - // The blocks that can randomly tick - private static final boolean[] randomTickBlocks = new boolean[256]; - static { - randomTickBlocks[Block.GRASS] = true; - randomTickBlocks[Block.FARMLAND] = true; - randomTickBlocks[Block.MYCELIUM] = true; - randomTickBlocks[Block.SAPLING] = true; - randomTickBlocks[Block.LEAVES] = true; - randomTickBlocks[Block.LEAVES2] = true; - randomTickBlocks[Block.SNOW_LAYER] = true; - randomTickBlocks[Block.ICE] = true; - if (!Server.getInstance().suomiCraftPEMode()) randomTickBlocks[Block.LAVA] = true; - if (!Server.getInstance().suomiCraftPEMode()) randomTickBlocks[Block.STILL_LAVA] = true; - randomTickBlocks[Block.CACTUS] = true; - randomTickBlocks[Block.BEETROOT_BLOCK] = true; - randomTickBlocks[Block.CARROT_BLOCK] = true; - randomTickBlocks[Block.POTATO_BLOCK] = true; - randomTickBlocks[Block.MELON_STEM] = true; - randomTickBlocks[Block.PUMPKIN_STEM] = true; - randomTickBlocks[Block.WHEAT_BLOCK] = true; - randomTickBlocks[Block.SUGARCANE_BLOCK] = true; - randomTickBlocks[Block.NETHER_WART_BLOCK] = true; - if (!Server.getInstance().suomiCraftPEMode()) randomTickBlocks[Block.FIRE] = true; - randomTickBlocks[Block.GLOWING_REDSTONE_ORE] = true; - randomTickBlocks[Block.COCOA_BLOCK] = true; - randomTickBlocks[Block.ICE_FROSTED] = true; - randomTickBlocks[Block.VINE] = true; - randomTickBlocks[Block.WATER] = true; - randomTickBlocks[Block.CAULDRON_BLOCK] = true; - } - - private final Long2ObjectOpenHashMap blockEntities = new Long2ObjectOpenHashMap<>(); - - private final Long2ObjectOpenHashMap players = new Long2ObjectOpenHashMap<>(); - - public final Long2ObjectOpenHashMap entities = new Long2ObjectOpenHashMap<>(); - - public final Long2ObjectOpenHashMap updateEntities = new Long2ObjectOpenHashMap<>(); - - private final ConcurrentLinkedQueue updateBlockEntities = new ConcurrentLinkedQueue<>(); - - private final Server server; - - private final int levelId; - - private LevelProvider provider; - - private final Int2ObjectOpenHashMap loaders = new Int2ObjectOpenHashMap<>(); - - private final Int2IntMap loaderCounter = new Int2IntOpenHashMap(); - - private final Long2ObjectOpenHashMap> chunkLoaders = new Long2ObjectOpenHashMap<>(); - - private final Long2ObjectOpenHashMap> playerLoaders = new Long2ObjectOpenHashMap<>(); - - private final Long2ObjectOpenHashMap> chunkPackets = new Long2ObjectOpenHashMap<>(); - - private final Long2LongMap unloadQueue = Long2LongMaps.synchronize(new Long2LongOpenHashMap()); - - private int time; - - public boolean stopTime; - - public float skyLightSubtracted; - - private final String folderName; - - // Avoid OOM, gc'd references result in whole chunk being sent (possibly higher cpu) - private final Long2ObjectOpenHashMap>> changedBlocks = new Long2ObjectOpenHashMap<>(); - // Storing the vector is redundant - private final Object changeBlocksPresent = new Object(); - // Storing extra blocks past 512 is redundant - private final Map changeBlocksFullMap = new CharacterHashMap(); - - private final BlockUpdateScheduler updateQueue; - private final Queue normalUpdateQueue = new ConcurrentLinkedDeque<>(); - //private final TreeSet updateQueue = new TreeSet<>(); - //private final List nextTickUpdates = Lists.newArrayList(); - //private final Map updateQueueIndex = new HashMap<>(); - - private final Int2ObjectMap>> chunkSendQueues = new Int2ObjectOpenHashMap<>(); - private final Int2ObjectMap chunkSendTasks = new Int2ObjectOpenHashMap<>(); - - private final Long2ObjectOpenHashMap chunkPopulationQueue = new Long2ObjectOpenHashMap<>(); - private final Long2ObjectOpenHashMap chunkPopulationLock = new Long2ObjectOpenHashMap<>(); - private final Long2ObjectOpenHashMap chunkGenerationQueue = new Long2ObjectOpenHashMap<>(); - private final int chunkGenerationQueueSize; - private final int chunkPopulationQueueSize; - - private boolean autoSave; - - private BlockMetadataStore blockMetadata; - - private final boolean useSections; - - private final Vector3 temporalVector; - - public int sleepTicks = 0; - - private final int chunkTickRadius; - private final Long2IntMap chunkTickList = new Long2IntOpenHashMap(); - private final int chunksPerTicks; - private final boolean clearChunksOnTick; - - private int updateLCG = ThreadLocalRandom.current().nextInt(); - - private static final int LCG_CONSTANT = 1013904223; - - public LevelTimings timings; - - private int tickRate; - public int tickRateTime = 0; - public int tickRateCounter = 0; - - // Notice: These shouldn't be used in the internal methods - // Check the dimension id instead - public final boolean isNether; - public final boolean isEnd; - - private Class generatorClass; - private IterableThreadLocal generators = new IterableThreadLocal() { - - @Override - public Generator init() { - try { - Generator generator = generatorClass.getConstructor(Map.class).newInstance(provider.getGeneratorOptions()); - NukkitRandom rand = new NukkitRandom(getSeed()); - if (Server.getInstance().isPrimaryThread()) { - generator.init(Level.this, rand); - } - generator.init(new PopChunkManager(getSeed()), rand); - return generator; - } catch (Throwable e) { - Server.getInstance().getLogger().logException(e); - return null; - } - } - }; - - private boolean raining; - private int rainTime; - private boolean thundering; - private int thunderTime; - - private long levelCurrentTick; - - private int dimension; - - public GameRules gameRules; - - private final boolean randomTickingEnabled; - - public Level(Server server, String name, String path, Class provider) { - this.levelId = levelIdCounter++; - this.blockMetadata = new BlockMetadataStore(this); - this.server = server; - this.autoSave = server.getAutoSave(); - - try { - this.provider = provider.getConstructor(Level.class, String.class).newInstance(this, path); - } catch (Exception e) { - throw new LevelException("Caused by " + Utils.getExceptionMessage(e)); - } - - this.timings = new LevelTimings(this); - - this.provider.updateLevelName(name); - - this.server.getLogger().info(this.server.getLanguage().translateString("nukkit.level.preparing", - TextFormat.GREEN + this.provider.getName() + TextFormat.WHITE)); - - this.generatorClass = Generator.getGenerator(this.provider.getGenerator()); - - try { - this.useSections = (boolean) provider.getMethod("usesChunkSection").invoke(null); - } catch (Exception e) { - throw new RuntimeException(e); - } - - this.folderName = name; - this.time = (int) this.provider.getTime(); - - this.raining = this.provider.isRaining(); - this.rainTime = this.provider.getRainTime(); - if (this.rainTime <= 0) { - setRainTime(Utils.random.nextInt(168000) + 12000); - } - - this.thundering = this.provider.isThundering(); - this.thunderTime = this.provider.getThunderTime(); - if (this.thunderTime <= 0) { - setThunderTime(Utils.random.nextInt(168000) + 12000); - } - - this.levelCurrentTick = this.provider.getCurrentTick(); - this.updateQueue = new BlockUpdateScheduler(this, levelCurrentTick); - - this.chunkTickRadius = Math.min(this.server.getViewDistance(), Math.max(1, this.server.getPropertyInt("chunk-ticking-radius", 4))); - this.chunksPerTicks = this.server.getPropertyInt("chunk-ticking-per-tick", 40); - this.chunkGenerationQueueSize = this.server.getPropertyInt("chunk-generation-queue-size", 8); - this.chunkPopulationQueueSize = this.server.getPropertyInt("chunk-generation-population-queue-size", 8); - this.chunkTickList.clear(); - this.clearChunksOnTick = this.server.getPropertyBoolean("clear-chunk-tick-list", true); - this.temporalVector = new Vector3(0, 0, 0); - this.tickRate = 1; - - this.skyLightSubtracted = this.calculateSkylightSubtracted(1); - - this.isNether = name.equals("nether"); - this.isEnd = name.equals("the_end"); - - this.randomTickingEnabled = !Server.noTickingWorlds.contains(name); - } - - public static long chunkHash(int x, int z) { - return (((long) x) << 32) | (z & 0xffffffffL); - } - - public static long blockHash(int x, int y, int z) { - if (y < 0 || y >= 256) { - throw new IllegalArgumentException("Y coordinate " + y + " is out of range!"); - } - return (((long) x & (long) 0xFFFFFFF) << 36) | (((long) y & (long) 0xFF) << 28) | ((long) z & (long) 0xFFFFFFF); - } - - public static char localBlockHash(double x, double y, double z) { - byte hi = (byte) (((int) x & 15) + (((int) z & 15) << 4)); - byte lo = (byte) y; - return (char) (((hi & 0xFF) << 8) | (lo & 0xFF)); - } - - public static Vector3 getBlockXYZ(long chunkHash, char blockHash) { - int hi = (byte) (blockHash >>> 8); - int lo = (byte) blockHash; - int y = lo & 0xFF; - int x = (hi & 0xF) + (getHashX(chunkHash) << 4); - int z = ((hi >> 4) & 0xF) + (getHashZ(chunkHash) << 4); - return new Vector3(x, y, z); - } - - public static BlockVector3 blockHash(double x, double y, double z) { - return new BlockVector3((int) x, (int) y, (int) z); - } - - public static int chunkBlockHash(int x, int y, int z) { - return (x << 12) | (z << 8) | y; - } - - public static int getHashX(long hash) { - return (int) (hash >> 32); - } - - public static int getHashZ(long hash) { - return (int) hash; - } - - public static Vector3 getBlockXYZ(BlockVector3 hash) { - return new Vector3(hash.x, hash.y, hash.z); - } - - public static Chunk.Entry getChunkXZ(long hash) { - return new Chunk.Entry(getHashX(hash), getHashZ(hash)); - } - - public static int generateChunkLoaderId(ChunkLoader loader) { - if (loader.getLoaderId() == 0) { - return chunkLoaderCounter++; - } else { - throw new IllegalStateException("ChunkLoader has a loader id already assigned: " + loader.getLoaderId()); - } - } - - public int getTickRate() { - return tickRate; - } - - public int getTickRateTime() { - return tickRateTime; - } - - public void setTickRate(int tickRate) { - this.tickRate = tickRate; - } - - public void initLevel() { - Generator generator = generators.get(); - this.dimension = generator.getDimension(); - this.gameRules = this.provider.getGamerules(); - } - - public Generator getGenerator() { - return generators.get(); - } - - public BlockMetadataStore getBlockMetadata() { - return this.blockMetadata; - } - - public Server getServer() { - return server; - } - - final public LevelProvider getProvider() { - return this.provider; - } - - final public int getId() { - return this.levelId; - } - - public void close() { - if (this.autoSave) { - this.save(true); - } - - this.provider.close(); - this.provider = null; - this.blockMetadata = null; - this.server.getLevels().remove(this.levelId); - this.generators.clean(); - } - - public void addSound(Vector3 pos, String sound) { - this.addSound(pos, sound, (Player[]) null); - } - - public void addSound(Vector3 pos, String sound, Player... players) { - PlaySoundPacket packet = new PlaySoundPacket(); - packet.name = sound; - packet.volume = 1; - packet.pitch = 1; - packet.x = pos.getFloorX(); - packet.y = pos.getFloorY(); - packet.z = pos.getFloorZ(); - - if (players == null || players.length == 0) { - addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, packet); - } else { - Server.broadcastPacket(players, packet); - } - } - - public void addSoundToViewers(Vector3 pos, cn.nukkit.level.Sound sound) { - PlaySoundPacket packet = new PlaySoundPacket(); - packet.name = sound.getSound(); - packet.volume = 1f; - packet.pitch = 1f; - packet.x = pos.getFloorX(); - packet.y = pos.getFloorY(); - packet.z = pos.getFloorZ(); - addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, packet); - } - - public void addSound(Vector3 pos, cn.nukkit.level.Sound sound) { - this.addSound(pos, sound, 1, 1, (Player[]) null); - } - - public void addSound(Vector3 pos, cn.nukkit.level.Sound sound, float volume, float pitch) { - this.addSound(pos, sound, volume, pitch, (Player[]) null); - } - - public void addSound(Vector3 pos, cn.nukkit.level.Sound sound, float volume, float pitch, Collection players) { - this.addSound(pos, sound, volume, pitch, players.toArray(new Player[0])); - } - - public void addSound(Vector3 pos, cn.nukkit.level.Sound sound, float volume, float pitch, Player... players) { - Preconditions.checkArgument(volume >= 0 && volume <= 1, "Sound volume must be between 0 and 1"); - Preconditions.checkArgument(pitch >= 0, "Sound pitch must be higher than 0"); - - PlaySoundPacket packet = new PlaySoundPacket(); - packet.name = sound.getSound(); - packet.volume = volume; - packet.pitch = pitch; - packet.x = pos.getFloorX(); - packet.y = pos.getFloorY(); - packet.z = pos.getFloorZ(); - - if (players == null || players.length == 0) { - addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, packet); - } else { - Server.broadcastPacket(players, packet); - } - } - - public void addSound(Sound sound) { - this.addSound(sound, (Player[]) null); - } - - public void addSound(Sound sound, Player player) { - this.addSound(sound, new Player[]{player}); - } - - public void addSound(Sound sound, Player[] players) { - DataPacket packet = sound.encode(); - if (packet != null) { - if (players == null) { - this.addChunkPacket((int) sound.x >> 4, (int) sound.z >> 4, packet); - } else { - Server.broadcastPacket(players, packet); - } - } - } - - public void addSound(Sound sound, Collection players) { - this.addSound(sound, players.toArray(new Player[0])); - } - - public void addLevelSoundEvent(Vector3 pos, int type, int data, int entityType) { - this.addLevelSoundEvent(pos, type, data, entityType, null); - } - - public void addLevelSoundEvent(Vector3 pos, int type, int data, int entityType, Player[] players) { - this.addLevelSoundEvent(pos, type, data, entityType, false, false, players); - } - - public void addLevelSoundEvent(Vector3 pos, int type, int data, int entityType, boolean isBaby, boolean isGlobal) { - this.addLevelSoundEvent(pos, type, data, entityType, isBaby, isGlobal, null); - } - - public void addLevelSoundEvent(Vector3 pos, int type, int data, int entityType, boolean isBaby, boolean isGlobal, Player[] players) { - String identifier = AddEntityPacket.LEGACY_IDS.getOrDefault(entityType, ":"); - this.addLevelSoundEvent(pos, type, data, identifier, isBaby, isGlobal, players); - } - - public void addLevelSoundEvent(Vector3 pos, int type) { - this.addLevelSoundEvent(pos, type, null); - } - - public void addLevelSoundEvent(Vector3 pos, int type, Player[] players) { - this.addLevelSoundEvent(pos, type, -1, players); - } - - public void addLevelSoundEvent(int type, int pitch, int data, Vector3 pos) { - this.addLevelSoundEvent(type, pitch, data, pos, null); - } - - public void addLevelSoundEvent(int type, int pitch, int data, Vector3 pos, Player[] players) { - this.addLevelSoundEvent(pos, type, data, ":", false, false, players); - } - - public void addLevelSoundEvent(Vector3 pos, int type, int data) { - this.addLevelSoundEvent(pos, type, data, null); - } - - public void addLevelSoundEvent(Vector3 pos, int type, int data, Player[] players) { - this.addLevelSoundEvent(pos, type, data, ":", false, false, players); - } - - public void addLevelSoundEvent(Vector3 pos, int type, int data, String identifier, boolean isBaby, boolean isGlobal) { - this.addLevelSoundEvent(pos, type, data, identifier, isBaby, isGlobal, null); - } - - public void addLevelSoundEvent(Vector3 pos, int type, int data, String identifier, boolean isBaby, boolean isGlobal, Player[] players) { - LevelSoundEventPacket pk = new LevelSoundEventPacket(); - pk.sound = type; - pk.extraData = data; - pk.entityIdentifier = identifier; - pk.x = (float) pos.x; - pk.y = (float) pos.y; - pk.z = (float) pos.z; - pk.isGlobal = isGlobal; - pk.isBabyMob = isBaby; - - if (players == null) { - this.addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, pk); - } else { - Server.broadcastPacket(players, pk); - } - } - - public void addLevelSoundEvent(Vector3 pos, int type, int pitch, int data, boolean isGlobal) { - LevelSoundEventPacketV1 pk = new LevelSoundEventPacketV1(); - pk.sound = type; - pk.pitch = pitch; - pk.extraData = data; - pk.x = (float) pos.x; - pk.y = (float) pos.y; - pk.z = (float) pos.z; - pk.isGlobal = isGlobal; - - this.addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, pk); - } - - public void addParticle(Particle particle) { - this.addParticle(particle, (Player[]) null); - } - - public void addParticle(Particle particle, Player player) { - this.addParticle(particle, new Player[]{player}); - } - - public void addParticle(Particle particle, Player[] players) { - addParticle(particle, players, 1); - } - - public void addParticle(Particle particle, Player[] players, int count) { - Int2ObjectMap> targets; - if (players == null) { - targets = Server.sortPlayers(this.getChunkPlayers(particle.getChunkX(), particle.getChunkZ()).values()); - } else { - targets = Server.sortPlayers(players); - } - - for (int protocolId : targets.keySet()) { - ObjectList protocolPlayers = targets.get(protocolId); - DataPacket[] packets = particle.mvEncode(protocolId); - if (packets != null) { - if (count == 1) { - Server.broadcastPackets(protocolPlayers.toArray(new Player[0]), packets); - continue; - } - - List packetList = Arrays.asList(packets); - List sendList = new ObjectArrayList<>(); - for (int i = 0; i < count; i++) { - sendList.addAll(packetList); - } - Server.broadcastPackets(protocolPlayers.toArray(new Player[0]), sendList.toArray(new DataPacket[0])); - } - } - } - - public void addParticle(Particle particle, Collection players) { - this.addParticle(particle, players.toArray(new Player[0])); - } - - public void addParticleEffect(Vector3 pos, ParticleEffect particleEffect) { - this.addParticleEffect(pos, particleEffect, -1, this.dimension, (Player[]) null); - } - - public void addParticleEffect(Vector3 pos, ParticleEffect particleEffect, long uniqueEntityId) { - this.addParticleEffect(pos, particleEffect, uniqueEntityId, this.dimension, (Player[]) null); - } - - public void addParticleEffect(Vector3 pos, ParticleEffect particleEffect, long uniqueEntityId, int dimensionId) { - this.addParticleEffect(pos, particleEffect, uniqueEntityId, dimensionId, (Player[]) null); - } - - public void addParticleEffect(Vector3 pos, ParticleEffect particleEffect, long uniqueEntityId, int dimensionId, Collection players) { - this.addParticleEffect(pos, particleEffect, uniqueEntityId, dimensionId, players.toArray(new Player[0])); - } - - public void addParticleEffect(Vector3 pos, ParticleEffect particleEffect, long uniqueEntityId, int dimensionId, Player... players) { - this.addParticleEffect(pos.asVector3f(), particleEffect.getIdentifier(), uniqueEntityId, dimensionId, players); - } - - public void addParticleEffect(Vector3f pos, String identifier, long uniqueEntityId, int dimensionId, Player... players) { - SpawnParticleEffectPacket pk = new SpawnParticleEffectPacket(); - pk.identifier = identifier; - pk.uniqueEntityId = uniqueEntityId; - pk.dimensionId = dimensionId; - pk.position = pos; - - if (players == null || players.length == 0) { - addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, pk); - } else { - Server.broadcastPacket(players, pk); - } - } - - public boolean getAutoSave() { - return this.autoSave; - } - - public void setAutoSave(boolean autoSave) { - this.autoSave = autoSave; - } - - public boolean unload() { - return this.unload(false); - } - - public boolean unload(boolean force) { - LevelUnloadEvent ev = new LevelUnloadEvent(this); - - if (this == this.server.getDefaultLevel() && !force) { - ev.setCancelled(); - } - - this.server.getPluginManager().callEvent(ev); - - if (!force && ev.isCancelled()) { - return false; - } - - this.server.getLogger().info(this.server.getLanguage().translateString("nukkit.level.unloading", - TextFormat.GREEN + this.getName() + TextFormat.WHITE)); - Level defaultLevel = this.server.getDefaultLevel(); - - for (Player player : new ArrayList<>(this.getPlayers().values())) { - if (this == defaultLevel || defaultLevel == null) { - player.close(player.getLeaveMessage(), "Forced default level unload"); - } else { - player.teleport(this.server.getDefaultLevel().getSafeSpawn()); - } - } - - if (this == defaultLevel) { - this.server.setDefaultLevel(null); - } - - this.close(); - - return true; - } - - public Map getChunkPlayers(int chunkX, int chunkZ) { - long index = Level.chunkHash(chunkX, chunkZ); - Map map = this.playerLoaders.get(index); - if (map != null) { - return new HashMap<>(map); - } else { - return new HashMap<>(); - } - } - - public ChunkLoader[] getChunkLoaders(int chunkX, int chunkZ) { - long index = Level.chunkHash(chunkX, chunkZ); - Map map = this.chunkLoaders.get(index); - if (map != null) { - return map.values().toArray(new ChunkLoader[0]); - } else { - return new ChunkLoader[0]; - } - } - - public void addChunkPacket(int chunkX, int chunkZ, DataPacket packet) { - long index = Level.chunkHash(chunkX, chunkZ); - synchronized (chunkPackets) { - Deque packets = chunkPackets.computeIfAbsent(index, i -> new ArrayDeque<>()); - packets.add(packet); - } - } - - public void registerChunkLoader(ChunkLoader loader, int chunkX, int chunkZ) { - this.registerChunkLoader(loader, chunkX, chunkZ, true); - } - - public void registerChunkLoader(ChunkLoader loader, int chunkX, int chunkZ, boolean autoLoad) { - int hash = loader.getLoaderId(); - long index = Level.chunkHash(chunkX, chunkZ); - - Map map = this.chunkLoaders.get(index); - if (map == null) { - Map newChunkLoader = new HashMap<>(); - newChunkLoader.put(hash, loader); - this.chunkLoaders.put(index, newChunkLoader); - Map newPlayerLoader = new HashMap<>(); - if (loader instanceof Player) { - newPlayerLoader.put(hash, (Player) loader); - } - this.playerLoaders.put(index, newPlayerLoader); - } else if (map.containsKey(hash)) { - return; - } else { - map.put(hash, loader); - if (loader instanceof Player) { - this.playerLoaders.get(index).put(hash, (Player) loader); - } - } - - if (!this.loaders.containsKey(hash)) { - this.loaderCounter.put(hash, 1); - this.loaders.put(hash, loader); - } else { - this.loaderCounter.put(hash, this.loaderCounter.get(hash) + 1); - } - - this.cancelUnloadChunkRequest(hash); - - if (autoLoad) { - this.loadChunk(chunkX, chunkZ); - } - } - - public void unregisterChunkLoader(ChunkLoader loader, int chunkX, int chunkZ) { - int hash = loader.getLoaderId(); - long index = Level.chunkHash(chunkX, chunkZ); - Map chunkLoadersIndex = this.chunkLoaders.get(index); - if (chunkLoadersIndex != null) { - ChunkLoader oldLoader = chunkLoadersIndex.remove(hash); - if (oldLoader != null) { - if (chunkLoadersIndex.isEmpty()) { - this.chunkLoaders.remove(index); - this.playerLoaders.remove(index); - this.unloadChunkRequest(chunkX, chunkZ, true); - } else { - Map playerLoadersIndex = this.playerLoaders.get(index); - playerLoadersIndex.remove(hash); - } - - int count = this.loaderCounter.get(hash); - if (--count == 0) { - this.loaderCounter.remove(hash); - this.loaders.remove(hash); - } else { - this.loaderCounter.put(hash, count); - } - } - } - } - - public void checkTime() { - if (!this.stopTime && this.gameRules.getBoolean(GameRule.DO_DAYLIGHT_CYCLE)) { - this.time = (this.time + tickRate) % TIME_FULL; - } - } - - public void sendTime(Player... players) { - SetTimePacket pk = new SetTimePacket(); - pk.time = this.time; - - Server.broadcastPacket(players, pk); - } - - public void sendTime() { - sendTime(this.players.values().toArray(new Player[0])); - } - - public GameRules getGameRules() { - return gameRules; - } - - @SuppressWarnings("unchecked") - public void doTick(int currentTick) { - if (this.timings.doTick != null) this.timings.doTick.startTiming(); - - updateBlockLight(lightQueue); - this.checkTime(); - - if (/*stopTime || !this.gameRules.getBoolean(GameRule.DO_DAYLIGHT_CYCLE) ||*/ currentTick % 6000 == 0) { // Keep the time in sync - this.sendTime(); - } - - // Tick Weather - if (this.dimension != DIMENSION_NETHER && this.dimension != DIMENSION_THE_END && this.gameRules.getBoolean(GameRule.DO_WEATHER_CYCLE) && this.randomTickingEnabled()) { - this.rainTime--; - if (this.rainTime <= 0) { - if (!this.setRaining(!this.raining)) { - if (this.raining) { - setRainTime(Utils.random.nextInt(12000) + 12000); - } else { - setRainTime(Utils.random.nextInt(168000) + 12000); - } - } - } - - this.thunderTime--; - if (this.thunderTime <= 0) { - if (!this.setThundering(!this.thundering)) { - if (this.thundering) { - setThunderTime(Utils.random.nextInt(12000) + 3600); - } else { - setThunderTime(Utils.random.nextInt(168000) + 12000); - } - } - } - - if (this.isThundering()) { - Map chunks = getChunks(); - if (chunks instanceof Long2ObjectOpenHashMap) { - @SuppressWarnings("rawtypes") - Long2ObjectOpenHashMap fastChunks = (Long2ObjectOpenHashMap) chunks; - ObjectIterator> iter = fastChunks.long2ObjectEntrySet().fastIterator(); - while (iter.hasNext()) { - Long2ObjectMap.Entry entry = iter.next(); - performThunder(entry.getLongKey(), entry.getValue()); - } - } else { - for (Map.Entry entry : getChunks().entrySet()) { - performThunder(entry.getKey(), entry.getValue()); - } - } - } - } - - if (Server.getInstance().lightUpdates) { - this.skyLightSubtracted = this.calculateSkylightSubtracted(1); - } - - this.levelCurrentTick++; - - this.unloadChunks(); - - if (this.timings.doTickPending != null) this.timings.doTickPending.startTiming(); - this.updateQueue.tick(this.levelCurrentTick); - if (this.timings.doTickPending != null) this.timings.doTickPending.stopTiming(); - - Block block; - while ((block = this.normalUpdateQueue.poll()) != null) { - block.onUpdate(BLOCK_UPDATE_NORMAL); - } - - TimingsHistory.entityTicks += this.updateEntities.size(); - if (this.timings.entityTick != null) this.timings.entityTick.startTiming(); - - if (!this.updateEntities.isEmpty()) { - for (long id : new ArrayList<>(this.updateEntities.keySet())) { - Entity entity = this.updateEntities.get(id); - if (entity == null) { - this.updateEntities.remove(id); - continue; - } - if (entity.closed || !entity.onUpdate(currentTick)) { - this.updateEntities.remove(id); - } - } - } - if (this.timings.entityTick != null) this.timings.entityTick.stopTiming(); - - TimingsHistory.tileEntityTicks += this.updateBlockEntities.size(); - if (this.timings.blockEntityTick != null) this.timings.blockEntityTick.startTiming(); - this.updateBlockEntities.removeIf(blockEntity -> !blockEntity.isValid() || !blockEntity.onUpdate()); - if (this.timings.blockEntityTick != null) this.timings.blockEntityTick.stopTiming(); - - if (this.timings.tickChunks != null) this.timings.tickChunks.startTiming(); - this.tickChunks(); - if (this.timings.tickChunks != null) this.timings.tickChunks.stopTiming(); - - synchronized (changedBlocks) { - if (!this.changedBlocks.isEmpty()) { - if (!this.players.isEmpty()) { - ObjectIterator>>> iter = changedBlocks.long2ObjectEntrySet().fastIterator(); - while (iter.hasNext()) { - Long2ObjectMap.Entry>> entry = iter.next(); - long index = entry.getLongKey(); - Map blocks = entry.getValue().get(); - int chunkX = Level.getHashX(index); - int chunkZ = Level.getHashZ(index); - if (blocks == null || blocks.size() > MAX_BLOCK_CACHE) { - FullChunk chunk = this.getChunk(chunkX, chunkZ); - for (Player p : this.getChunkPlayers(chunkX, chunkZ).values()) { - p.onChunkChanged(chunk); - } - } else { - Player[] playerArray = this.getChunkPlayers(chunkX, chunkZ).values().toArray(new Player[0]); - Vector3[] blocksArray = new Vector3[blocks.size()]; - int i = 0; - for (char blockHash : blocks.keySet()) { - Vector3 hash = getBlockXYZ(index, blockHash); - blocksArray[i++] = hash; - } - this.sendBlocks(playerArray, blocksArray, UpdateBlockPacket.FLAG_ALL); - } - } - } - this.changedBlocks.clear(); - } - } - - this.processChunkRequest(); - - if (this.sleepTicks > 0 && --this.sleepTicks <= 0) { - this.checkSleep(); - } - - synchronized (chunkPackets) { - for (long index : this.chunkPackets.keySet()) { - int chunkX = Level.getHashX(index); - int chunkZ = Level.getHashZ(index); - Map map = this.getChunkPlayers(chunkX, chunkZ); - if (!map.isEmpty()) { - Player[] chunkPlayers = map.values().toArray(new Player[0]); - for (DataPacket pk : this.chunkPackets.get(index)) { - Server.broadcastPacket(chunkPlayers, pk); - } - } - } - this.chunkPackets.clear(); - } - - if (gameRules.isStale()) { - GameRulesChangedPacket packet = new GameRulesChangedPacket(); - packet.gameRulesMap = gameRules.getGameRules(); - Server.broadcastPacket(players.values().toArray(new Player[0]), packet); - gameRules.refresh(); - } - - if (this.timings.doTick != null) this.timings.doTick.stopTiming(); - } - - private void performThunder(long index, FullChunk chunk) { - if (areNeighboringChunksLoaded(index)) return; - if (Utils.random.nextInt(10000) == 0) { - int LCG = this.getUpdateLCG() >> 2; - - int chunkX = chunk.getX() << 4; - int chunkZ = chunk.getZ() << 4; - Vector3 vector = this.adjustPosToNearbyEntity(new Vector3(chunkX + (LCG & 0xf), 0, chunkZ + (LCG >> 8 & 0xf))); - - Biome biome = Biome.getBiome(this.getBiomeId(vector.getFloorX(), vector.getFloorZ())); - if (!biome.canRain()) { - return; - } - - int bId = this.getBlockIdAt(vector.getFloorX(), vector.getFloorY(), vector.getFloorZ()); - if (bId != Block.TALL_GRASS && bId != Block.WATER) - vector.y += 1; - CompoundTag nbt = new CompoundTag() - .putList(new ListTag("Pos").add(new DoubleTag("", vector.x)) - .add(new DoubleTag("", vector.y)).add(new DoubleTag("", vector.z))) - .putList(new ListTag("Motion").add(new DoubleTag("", 0)) - .add(new DoubleTag("", 0)).add(new DoubleTag("", 0))) - .putList(new ListTag("Rotation").add(new FloatTag("", 0)) - .add(new FloatTag("", 0))); - - EntityLightning bolt = new EntityLightning(chunk, nbt); - LightningStrikeEvent ev = new LightningStrikeEvent(this, bolt); - server.getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - bolt.spawnToAll(); - this.addLevelSoundEvent(vector, LevelSoundEventPacket.SOUND_THUNDER, -1, EntityLightning.NETWORK_ID); - this.addLevelSoundEvent(vector, LevelSoundEventPacket.SOUND_EXPLODE, -1, EntityLightning.NETWORK_ID); - } else { - bolt.setEffect(false); - } - } - } - - public Vector3 adjustPosToNearbyEntity(Vector3 pos) { - pos.y = this.getHighestBlockAt(pos.getFloorX(), pos.getFloorZ()); - AxisAlignedBB axisalignedbb = new AxisAlignedBB(pos.x, pos.y, pos.z, pos.getX(), 255, pos.getZ()).expand(3, 3, 3); - List list = new ArrayList<>(); - - for (Entity entity : this.getCollidingEntities(axisalignedbb)) { - if (entity.isAlive() && entity.canSeeSky()) { - list.add(entity); - } - } - - if (!list.isEmpty()) { - return list.get(Utils.random.nextInt(list.size())).getPosition(); - } else { - if (pos.getY() == -1) { - pos = pos.up(2); - } - - return pos; - } - } - - public void checkSleep() { - if (this.players.isEmpty()) { - return; - } - - boolean resetTime = true; - for (Player p : this.getPlayers().values()) { - if (!p.isSleeping()) { - resetTime = false; - break; - } - } - - if (resetTime) { - int time = this.getTime() % Level.TIME_FULL; - - if (time >= Level.TIME_NIGHT && time < Level.TIME_SUNRISE) { - this.setTime(this.getTime() + Level.TIME_FULL - time); - - for (Player p : this.getPlayers().values()) { - p.stopSleep(); - } - } - } - } - - public void sendBlockExtraData(int x, int y, int z, int id, int data) { - this.sendBlockExtraData(x, y, z, id, data, this.getChunkPlayers(x >> 4, z >> 4).values()); - } - - public void sendBlockExtraData(int x, int y, int z, int id, int data, Collection players) { - this.sendBlockExtraData(x, y, z, id, data, players.toArray(new Player[0])); - } - - public void sendBlockExtraData(int x, int y, int z, int id, int data, Player[] players) { - LevelEventPacket pk = new LevelEventPacket(); - pk.evid = LevelEventPacket.EVENT_SET_DATA; - pk.x = x + 0.5f; - pk.y = y + 0.5f; - pk.z = z + 0.5f; - pk.data = (data << 8) | id; - - Server.broadcastPacket(players, pk); - } - - public void sendBlocks(Player[] target, Vector3[] blocks) { - this.sendBlocks(target, blocks, UpdateBlockPacket.FLAG_NONE); - } - - public void sendBlocks(Player[] target, Vector3[] blocks, int flags) { - this.sendBlocks(target, blocks, flags, false); - } - - public void sendBlocks(Player[] target, Vector3[] blocks, int flags, boolean optimizeRebuilds) { - LongSet chunks = null; - if (optimizeRebuilds) { - chunks = new LongOpenHashSet(); - } - - Int2ObjectMap> targets = Server.sortPlayers(target); - for (Vector3 b : blocks) { - if (b == null) { - continue; - } - boolean first = !optimizeRebuilds; - - if (optimizeRebuilds) { - long index = Level.chunkHash((int) b.x >> 4, (int) b.z >> 4); - if (!chunks.contains(index)) { - chunks.add(index); - first = true; - } - } - UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); - updateBlockPacket.x = (int) b.x; - updateBlockPacket.y = (int) b.y; - updateBlockPacket.z = (int) b.z; - updateBlockPacket.flags = first ? flags : UpdateBlockPacket.FLAG_NONE; - - for (int protocolId : targets.keySet()) { - ObjectList players = targets.get(protocolId); - UpdateBlockPacket packet = (UpdateBlockPacket) updateBlockPacket.clone(); - try { - if (protocolId > 201) { - if (b instanceof Block) { - packet.blockRuntimeId = GlobalBlockPalette.getOrCreateRuntimeId(protocolId, ((Block) b).getFullId()); - } else { - packet.blockRuntimeId = GlobalBlockPalette.getOrCreateRuntimeId(protocolId, getFullBlock((int) b.x, (int) b.y, (int) b.z)); - } - } else { - Block bl = b instanceof Block ? (Block) b : getBlock((int) b.x, (int) b.y, (int) b.z); - packet.blockId = bl.getId(); - packet.blockData = bl.getDamage(); - } - } catch (NoSuchElementException e) { - throw new IllegalStateException("Unable to create BlockUpdatePacket at (" + b.x + ", " + b.y + ", " + b.z + ") in " + getName() + " for players with protocol " +protocolId); - } - - for (Player player : players) { - player.batchDataPacket(packet); - } - } - } - } - - public void sendBlocks(Player target, Vector3[] blocks, int flags) { - for (Vector3 b : blocks) { - if (b == null) { - continue; - } - - UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); - updateBlockPacket.x = (int) b.x; - updateBlockPacket.y = (int) b.y; - updateBlockPacket.z = (int) b.z; - updateBlockPacket.flags = flags; - - try { - if (target.protocol > 201) { - if (b instanceof Block) { - updateBlockPacket.blockRuntimeId = GlobalBlockPalette.getOrCreateRuntimeId(target.protocol, ((Block) b).getFullId()); - } else { - updateBlockPacket.blockRuntimeId = GlobalBlockPalette.getOrCreateRuntimeId(target.protocol, getFullBlock((int) b.x, (int) b.y, (int) b.z)); - } - } else { - Block bl = b instanceof Block ? (Block) b : getBlock((int) b.x, (int) b.y, (int) b.z); - updateBlockPacket.blockId = bl.getId(); - updateBlockPacket.blockData = bl.getDamage(); - } - } catch (NoSuchElementException e) { - throw new IllegalStateException("Unable to create BlockUpdatePacket at (" + b.x + ", " + b.y + ", " + b.z + ") in " + getName() + " for player " + target.getName() + " with protocol " + target.protocol); - } - - target.batchDataPacket(updateBlockPacket); - } - } - - private void tickChunks() { - if (this.chunksPerTicks <= 0 || this.loaders.isEmpty()) { - this.chunkTickList.clear(); - return; - } - - int chunksPerLoader = Math.min(200, Math.max(1, (int) (((double) (this.chunksPerTicks - this.loaders.size()) / this.loaders.size() + 0.5)))); - int randRange = 3 + chunksPerLoader / 30; - randRange = Math.min(randRange, this.chunkTickRadius); - - for (ChunkLoader loader : this.loaders.values()) { - int chunkX = (int) loader.getX() >> 4; - int chunkZ = (int) loader.getZ() >> 4; - - long index = Level.chunkHash(chunkX, chunkZ); - int existingLoaders = Math.max(0, this.chunkTickList.getOrDefault(index, 0)); - this.chunkTickList.put(index, existingLoaders + 1); - for (int chunk = 0; chunk < chunksPerLoader; ++chunk) { - int dx = Utils.random.nextInt(randRange << 1) - randRange; - int dz = Utils.random.nextInt(randRange << 1) - randRange; - long hash = Level.chunkHash(dx + chunkX, dz + chunkZ); - if (!this.chunkTickList.containsKey(hash) && provider.isChunkLoaded(hash)) { - this.chunkTickList.put(hash, -1); - } - } - } - - int blockTest = 0; - - if (!chunkTickList.isEmpty()) { - ObjectIterator iter = chunkTickList.long2IntEntrySet().iterator(); - while (iter.hasNext()) { - Long2IntMap.Entry entry = iter.next(); - long index = entry.getLongKey(); - if (!areNeighboringChunksLoaded(index)) { - iter.remove(); - continue; - } - - int loaders = entry.getIntValue(); - - int chunkX = getHashX(index); - int chunkZ = getHashZ(index); - - FullChunk chunk; - if ((chunk = this.getChunk(chunkX, chunkZ, false)) == null) { - iter.remove(); - continue; - } else if (loaders <= 0) { - iter.remove(); - } - - for (Entity entity : chunk.getEntities().values()) { - entity.scheduleUpdate(); - } - - if (this.randomTickingEnabled()) { - if (this.useSections) { - for (ChunkSection section : ((Chunk) chunk).getSections()) { - if (!(section instanceof EmptyChunkSection)) { - int Y = section.getY(); - for (int i = 0; i < gameRules.getInteger(GameRule.RANDOM_TICK_SPEED); ++i) { - int lcg = this.getUpdateLCG(); - int x = lcg & 0x0f; - int y = lcg >>> 8 & 0x0f; - int z = lcg >>> 16 & 0x0f; - - int fullId = section.getFullBlock(x, y, z); - int blockId = fullId >> 4; - if (randomTickBlocks[blockId]) { - Block block = Block.get(fullId, this, (chunkX << 4) + x, (Y << 4) + y, (chunkZ << 4) + z); - block.onUpdate(BLOCK_UPDATE_RANDOM); - } - } - } - } - } else { - for (int Y = 0; Y < 8 && (Y < 3 || blockTest != 0); ++Y) { - blockTest = 0; - for (int i = 0; i < gameRules.getInteger(GameRule.RANDOM_TICK_SPEED); ++i) { - int lcg = this.getUpdateLCG(); - int x = lcg & 0x0f; - int y = lcg >>> 8 & 0x0f; - int z = lcg >>> 16 & 0x0f; - - int fullId = chunk.getFullBlock(x, y + (Y << 4), z); - int blockId = fullId >> 4; - blockTest |= fullId; - if (randomTickBlocks[blockId]) { - Block block = Block.get(fullId, this, x, y + (Y << 4), z); - block.onUpdate(BLOCK_UPDATE_RANDOM); - } - } - } - } - } - } - } - - if (this.clearChunksOnTick) { - this.chunkTickList.clear(); - } - } - - public boolean save() { - return this.save(false); - } - - public boolean save(boolean force) { - if (!this.autoSave && !force) { - return false; - } - - this.server.getPluginManager().callEvent(new LevelSaveEvent(this)); - - this.provider.setTime(this.time); - this.provider.setRaining(this.raining); - this.provider.setRainTime(this.rainTime); - this.provider.setThundering(this.thundering); - this.provider.setThunderTime(this.thunderTime); - this.provider.setCurrentTick(this.levelCurrentTick); - this.provider.setGameRules(this.gameRules); - this.saveChunks(); - if (this.provider instanceof BaseLevelProvider) { - this.provider.saveLevelData(); - } - - return true; - } - - public void saveChunks() { - provider.saveChunks(); - } - - public void updateAroundRedstone(Vector3 pos, BlockFace face) { - for (BlockFace side : BlockFace.values()) { - if (face != null /*&&*/|| side == face) { - continue; - } - - this.getBlock(pos.getSide(side)).onUpdate(BLOCK_UPDATE_REDSTONE); - } - } - - public void updateComparatorOutputLevel(Vector3 v) { - for (BlockFace face : Plane.HORIZONTAL) { - Vector3 pos = v.getSide(face); - - if (this.isChunkLoaded((int) pos.x >> 4, (int) pos.z >> 4)) { - Block block1 = this.getBlock(pos); - - if (BlockRedstoneDiode.isDiode(block1)) { - block1.onUpdate(BLOCK_UPDATE_REDSTONE); - } else if (block1.isNormalBlock()) { - pos = pos.getSide(face); - block1 = this.getBlock(pos); - - if (BlockRedstoneDiode.isDiode(block1)) { - block1.onUpdate(BLOCK_UPDATE_REDSTONE); - } - } - } - } - } - - public void updateAround(Vector3 pos) { - updateAround((int) pos.x, (int) pos.y, (int) pos.z); - } - - public void updateAround(int x, int y, int z) { - BlockUpdateEvent ev; - this.server.getPluginManager().callEvent( - ev = new BlockUpdateEvent(this.getBlock(x, y - 1, z))); - if (!ev.isCancelled()) { - normalUpdateQueue.add(ev.getBlock()); - } - - this.server.getPluginManager().callEvent( - ev = new BlockUpdateEvent(this.getBlock(x, y + 1, z))); - if (!ev.isCancelled()) { - normalUpdateQueue.add(ev.getBlock()); - } - - this.server.getPluginManager().callEvent( - ev = new BlockUpdateEvent(this.getBlock(x - 1, y, z))); - if (!ev.isCancelled()) { - normalUpdateQueue.add(ev.getBlock()); - } - - this.server.getPluginManager().callEvent( - ev = new BlockUpdateEvent(this.getBlock(x + 1, y, z))); - if (!ev.isCancelled()) { - normalUpdateQueue.add(ev.getBlock()); - } - - this.server.getPluginManager().callEvent( - ev = new BlockUpdateEvent(this.getBlock(x, y, z - 1))); - if (!ev.isCancelled()) { - normalUpdateQueue.add(ev.getBlock()); - } - - this.server.getPluginManager().callEvent( - ev = new BlockUpdateEvent(this.getBlock(x, y, z + 1))); - if (!ev.isCancelled()) { - normalUpdateQueue.add(ev.getBlock()); - } - } - - public void scheduleUpdate(Block pos, int delay) { - this.scheduleUpdate(pos, pos, delay, 0, true); - } - - public void scheduleUpdate(Block block, Vector3 pos, int delay) { - this.scheduleUpdate(block, pos, delay, 0, true); - } - - public void scheduleUpdate(Block block, Vector3 pos, int delay, int priority) { - this.scheduleUpdate(block, pos, delay, priority, true); - } - - public void scheduleUpdate(Block block, Vector3 pos, int delay, int priority, boolean checkArea) { - if (block.getId() == 0 || (checkArea && !this.isChunkLoaded(block.getFloorX() >> 4, block.getFloorZ() >> 4))) { - return; - } - - BlockUpdateEntry entry = new BlockUpdateEntry(pos.floor(), block, ((long) delay) + levelCurrentTick, priority); - - if (!this.updateQueue.contains(entry)) { - this.updateQueue.add(entry); - } - } - - public boolean cancelSheduledUpdate(Vector3 pos, Block block) { - return this.updateQueue.remove(new BlockUpdateEntry(pos, block)); - } - - public boolean isUpdateScheduled(Vector3 pos, Block block) { - return this.updateQueue.contains(new BlockUpdateEntry(pos, block)); - } - - public boolean isBlockTickPending(Vector3 pos, Block block) { - return this.updateQueue.isBlockTickPending(pos, block); - } - - public Set getPendingBlockUpdates(FullChunk chunk) { - int minX = (chunk.getX() << 4) - 2; - int maxX = minX + 18; - int minZ = (chunk.getZ() << 4) - 2; - int maxZ = minZ + 18; - - return this.getPendingBlockUpdates(new AxisAlignedBB(minX, 0, minZ, maxX, 256, maxZ)); - } - - public Set getPendingBlockUpdates(AxisAlignedBB boundingBox) { - return updateQueue.getPendingBlockUpdates(boundingBox); - } - - public Block[] getCollisionBlocks(AxisAlignedBB bb) { - return this.getCollisionBlocks(bb, false); - } - - public Block[] getCollisionBlocks(AxisAlignedBB bb, boolean targetFirst) { - int minX = NukkitMath.floorDouble(bb.minX); - int minY = NukkitMath.floorDouble(bb.minY); - int minZ = NukkitMath.floorDouble(bb.minZ); - int maxX = NukkitMath.ceilDouble(bb.maxX); - int maxY = NukkitMath.ceilDouble(bb.maxY); - int maxZ = NukkitMath.ceilDouble(bb.maxZ); - - List collides = new ArrayList<>(); - - if (targetFirst) { - for (int z = minZ; z <= maxZ; ++z) { - for (int x = minX; x <= maxX; ++x) { - for (int y = minY; y <= maxY; ++y) { - Block block = this.getBlock(x, y, z, false); - if (block != null && block.getId() != 0 && block.collidesWithBB(bb)) { - return new Block[]{block}; - } - } - } - } - } else { - for (int z = minZ; z <= maxZ; ++z) { - for (int x = minX; x <= maxX; ++x) { - for (int y = minY; y <= maxY; ++y) { - Block block = this.getBlock(x, y, z, false); - if (block != null && block.getId() != 0 && block.collidesWithBB(bb)) { - collides.add(block); - } - } - } - } - } - - return collides.toArray(new Block[0]); - } - - public boolean hasCollisionBlocks(AxisAlignedBB bb) { - int minX = NukkitMath.floorDouble(bb.minX); - int minY = NukkitMath.floorDouble(bb.minY); - int minZ = NukkitMath.floorDouble(bb.minZ); - int maxX = NukkitMath.ceilDouble(bb.maxX); - int maxY = NukkitMath.ceilDouble(bb.maxY); - int maxZ = NukkitMath.ceilDouble(bb.maxZ); - - for (int z = minZ; z <= maxZ; ++z) { - for (int x = minX; x <= maxX; ++x) { - for (int y = minY; y <= maxY; ++y) { - Block block = this.getBlock(x, y, z, false); - if (block != null && block.getId() != 0 && block.collidesWithBB(bb)) { - return true; - } - } - } - } - - return false; - } - - public boolean isFullBlock(Vector3 pos) { - AxisAlignedBB bb; - if (pos instanceof Block) { - if (((Block) pos).isSolid()) { - return true; - } - bb = ((Block) pos).getBoundingBox(); - } else { - bb = this.getBlock(pos).getBoundingBox(); - } - - return bb != null && bb.getAverageEdgeLength() >= 1; - } - - public AxisAlignedBB[] getCollisionCubes(Entity entity, AxisAlignedBB bb) { - return this.getCollisionCubes(entity, bb, true); - } - - public AxisAlignedBB[] getCollisionCubes(Entity entity, AxisAlignedBB bb, boolean entities) { - return getCollisionCubes(entity, bb, entities, false); - } - - public AxisAlignedBB[] getCollisionCubes(Entity entity, AxisAlignedBB bb, boolean entities, boolean solidEntities) { - int minX = NukkitMath.floorDouble(bb.minX); - int minY = NukkitMath.floorDouble(bb.minY); - int minZ = NukkitMath.floorDouble(bb.minZ); - int maxX = NukkitMath.ceilDouble(bb.maxX); - int maxY = NukkitMath.ceilDouble(bb.maxY); - int maxZ = NukkitMath.ceilDouble(bb.maxZ); - - List collides = new ArrayList<>(); - - for (int z = minZ; z <= maxZ; ++z) { - for (int x = minX; x <= maxX; ++x) { - for (int y = minY; y <= maxY; ++y) { - Block block = this.getBlock(x, y, z, false); - if (!block.canPassThrough() && block.collidesWithBB(bb)) { - collides.add(block.getBoundingBox()); - } - } - } - } - - if (entities || solidEntities) { - for (Entity ent : this.getCollidingEntities(bb.grow(0.25f, 0.25f, 0.25f), entity)) { - if (solidEntities && !ent.canPassThrough()) { - collides.add(ent.boundingBox.clone()); - } - } - } - - return collides.toArray(new AxisAlignedBB[0]); - } - - public boolean hasCollision(Entity entity, AxisAlignedBB bb, boolean entities) { - int minX = NukkitMath.floorDouble(bb.minX); - int minY = NukkitMath.floorDouble(bb.minY); - int minZ = NukkitMath.floorDouble(bb.minZ); - int maxX = NukkitMath.ceilDouble(bb.maxX); - int maxY = NukkitMath.ceilDouble(bb.maxY); - int maxZ = NukkitMath.ceilDouble(bb.maxZ); - - for (int z = minZ; z <= maxZ; ++z) { - for (int x = minX; x <= maxX; ++x) { - for (int y = minY; y <= maxY; ++y) { - Block block = this.getBlock(x, y, z, false); - if (!block.canPassThrough() && block.collidesWithBB(bb)) { - return true; - } - } - } - } - - if (entities) { - return this.getCollidingEntities(bb.grow(0.25f, 0.25f, 0.25f), entity).length > 0; - } - return false; - } - - public int getFullLight(Vector3 pos) { - FullChunk chunk = this.getChunk((int) pos.x >> 4, (int) pos.z >> 4, false); - int level = 0; - if (chunk != null) { - level = chunk.getBlockSkyLight((int) pos.x & 0x0f, (int) pos.y & 0xff, (int) pos.z & 0x0f); - level -= this.skyLightSubtracted; - - if (level < 15) { - level = Math.max(chunk.getBlockLight((int) pos.x & 0x0f, (int) pos.y & 0xff, (int) pos.z & 0x0f), level); - } - } - - return level; - } - - public int calculateSkylightSubtracted(float tickDiff) { - float light = 1 - (MathHelper.cos(this.calculateCelestialAngle(getTime(), tickDiff) * (6.2831855f)) * 2 + 0.5f); - light = light < 0 ? 0 : light > 1 ? 1 : light; - light = 1 - light; - light = (float) ((double) light * ((raining ? 1 : 0) - 0.3125)); - light = (float) ((double) light * ((isThundering() ? 1 : 0) - 0.3125)); - light = 1 - light; - return (int) (light * 11f); - } - - public float calculateCelestialAngle(int time, float tickDiff) { - float angle = ((float) time + tickDiff) / 24000f - 0.25f; - - if (angle < 0) { - ++angle; - } - - if (angle > 1) { - --angle; - } - - float i = 1 - (float) ((Math.cos((double) angle * Math.PI) + 1) / 2d); - angle = angle + (i - angle) / 3; - return angle; - } - - public int getMoonPhase(long worldTime) { - return (int) (worldTime / 24000 % 8 + 8) % 8; - } - - public int getFullBlock(int x, int y, int z) { - return this.getChunk(x >> 4, z >> 4, false).getFullBlock(x & 0x0f, y & 0xff, z & 0x0f); - } - - public synchronized Block getBlock(Vector3 pos) { - return this.getBlock(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ()); - } - - public synchronized Block getBlock(Vector3 pos, boolean load) { - return this.getBlock(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ(), load); - } - - public synchronized Block getBlock(int x, int y, int z) { - return getBlock(x, y, z, true); - } - - public synchronized Block getBlock(int x, int y, int z, boolean load) { - int fullState; - if (y >= 0 && y < 256) { - int cx = x >> 4; - int cz = z >> 4; - BaseFullChunk chunk; - if (load) { - chunk = getChunk(cx, cz); - } else { - chunk = getChunkIfLoaded(cx, cz); - } - if (chunk != null) { - fullState = chunk.getFullBlock(x & 0xF, y, z & 0xF); - } else { - fullState = 0; - } - } else { - fullState = 0; - } - - Block block = Block.fullList[fullState & 0xFFF].clone(); - - block.x = x; - block.y = y; - block.z = z; - block.level = this; - - return block; - } - - public void updateAllLight(Vector3 pos) { - this.updateBlockSkyLight((int) pos.x, (int) pos.y, (int) pos.z); - this.addLightUpdate((int) pos.x, (int) pos.y, (int) pos.z); - } - - public void updateBlockSkyLight(int x, int y, int z) { - } - - public void updateBlockLight(Map> map) { - int size = map.size(); - if (size == 0) { - return; - } - Queue lightPropagationQueue = new ConcurrentLinkedQueue<>(); - Queue lightRemovalQueue = new ConcurrentLinkedQueue<>(); - Long2ObjectOpenHashMap visited = new Long2ObjectOpenHashMap<>(); - Long2ObjectOpenHashMap removalVisited = new Long2ObjectOpenHashMap<>(); - - Iterator>> iter = map.entrySet().iterator(); - while (iter.hasNext() && size-- > 0) { - Map.Entry> entry = iter.next(); - iter.remove(); - long index = entry.getKey(); - Map blocks = entry.getValue(); - int chunkX = Level.getHashX(index); - int chunkZ = Level.getHashZ(index); - int bx = chunkX << 4; - int bz = chunkZ << 4; - for (char blockHash : blocks.keySet()) { - int hi = (byte) (blockHash >>> 8); - int lo = (byte) blockHash; - int y = lo & 0xFF; - int x = (hi & 0xF) + bx; - int z = ((hi >> 4) & 0xF) + bz; - BaseFullChunk chunk = getChunk(x >> 4, z >> 4, false); - if (chunk != null) { - int lcx = x & 0xF; - int lcz = z & 0xF; - int oldLevel = chunk.getBlockLight(lcx, y, lcz); - int newLevel = Block.light[chunk.getBlockId(lcx, y, lcz)]; - if (oldLevel != newLevel) { - this.setBlockLightAt(x, y, z, newLevel); - long hash = Hash.hashBlock(x, y, z); - if (newLevel < oldLevel) { - removalVisited.put(hash, changeBlocksPresent); - lightRemovalQueue.add(new Object[]{hash, oldLevel}); - } else { - visited.put(hash, changeBlocksPresent); - lightPropagationQueue.add(hash); - } - } - } - } - } - - while (!lightRemovalQueue.isEmpty()) { - Object[] val = lightRemovalQueue.poll(); - long node = (long) val[0]; - int x = Hash.hashBlockX(node); - int y = Hash.hashBlockY(node); - int z = Hash.hashBlockZ(node); - - int lightLevel = (int) val[1]; - - this.computeRemoveBlockLight(x - 1, y, z, lightLevel, lightRemovalQueue, lightPropagationQueue, removalVisited, visited); - this.computeRemoveBlockLight(x + 1, y, z, lightLevel, lightRemovalQueue, lightPropagationQueue, removalVisited, visited); - this.computeRemoveBlockLight(x, y - 1, z, lightLevel, lightRemovalQueue, lightPropagationQueue, removalVisited, visited); - this.computeRemoveBlockLight(x, y + 1, z, lightLevel, lightRemovalQueue, lightPropagationQueue, removalVisited, visited); - this.computeRemoveBlockLight(x, y, z - 1, lightLevel, lightRemovalQueue, lightPropagationQueue, removalVisited, visited); - this.computeRemoveBlockLight(x, y, z + 1, lightLevel, lightRemovalQueue, lightPropagationQueue, removalVisited, visited); - } - - while (!lightPropagationQueue.isEmpty()) { - long node = lightPropagationQueue.poll(); - - int x = Hash.hashBlockX(node); - int y = Hash.hashBlockY(node); - int z = Hash.hashBlockZ(node); - - int lightLevel = this.getBlockLightAt(x, y, z) - - Block.lightFilter[this.getBlockIdAt(x, y, z)]; - - if (lightLevel >= 1) { - this.computeSpreadBlockLight(x - 1, y, z, lightLevel, lightPropagationQueue, visited); - this.computeSpreadBlockLight(x + 1, y, z, lightLevel, lightPropagationQueue, visited); - this.computeSpreadBlockLight(x, y - 1, z, lightLevel, lightPropagationQueue, visited); - this.computeSpreadBlockLight(x, y + 1, z, lightLevel, lightPropagationQueue, visited); - this.computeSpreadBlockLight(x, y, z - 1, lightLevel, lightPropagationQueue, visited); - this.computeSpreadBlockLight(x, y, z + 1, lightLevel, lightPropagationQueue, visited); - } - } - } - - private void computeRemoveBlockLight(int x, int y, int z, int currentLight, Queue queue, - Queue spreadQueue, Map visited, Map spreadVisited) { - int current = this.getBlockLightAt(x, y, z); - if (current != 0 && current < currentLight) { - this.setBlockLightAt(x, y, z, 0); - if (current > 1) { - long index = Hash.hashBlock(x, y, z); - if (!visited.containsKey(index)) { - visited.put(index, changeBlocksPresent); - queue.add(new Object[]{index, current}); - } - } - } else if (current >= currentLight) { - long index = Hash.hashBlock(x, y, z); - if (!spreadVisited.containsKey(index)) { - spreadVisited.put(index, changeBlocksPresent); - spreadQueue.add(index); - } - } - } - - private void computeSpreadBlockLight(int x, int y, int z, int currentLight, Queue queue, - Map visited) { - int current = this.getBlockLightAt(x, y, z); - if (current < currentLight - 1) { - this.setBlockLightAt(x, y, z, currentLight); - - long index = Hash.hashBlock(x, y, z); - if (!visited.containsKey(index)) { - visited.put(index, changeBlocksPresent); - if (currentLight > 1) { - queue.add(index); - } - } - } - } - - private final Map> lightQueue = new ConcurrentHashMap<>(8, 0.9f, 1); - - public void addLightUpdate(int x, int y, int z) { - long index = chunkHash(x >> 4, z >> 4); - Map currentMap = lightQueue.get(index); - if (currentMap == null) { - currentMap = new ConcurrentHashMap<>(8, 0.9f, 1); - this.lightQueue.put(index, currentMap); - } - currentMap.put(Level.localBlockHash(x, y, z), changeBlocksPresent); - } - - @Override - public synchronized void setBlockFullIdAt(int x, int y, int z, int fullId) { - setBlock(x, y, z, Block.fullList[fullId], false, false); - } - - public synchronized boolean setBlock(Vector3 pos, Block block) { - return this.setBlock(pos, block, false); - } - - public synchronized boolean setBlock(Vector3 pos, Block block, boolean direct) { - return this.setBlock(pos, block, direct, true); - } - - public synchronized boolean setBlock(Vector3 pos, Block block, boolean direct, boolean update) { - return setBlock(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ(), block, direct, update); - } - - public synchronized boolean setBlock(int x, int y, int z, Block block, boolean direct, boolean update) { - if (y < 0 || y >= 256) { - return false; - } - BaseFullChunk chunk = this.getChunk(x >> 4, z >> 4, true); - Block blockPrevious; - blockPrevious = chunk.getAndSetBlock(x & 0xF, y, z & 0xF, block); - if (blockPrevious.getFullId() == block.getFullId()) { - return false; - } - block.x = x; - block.y = y; - block.z = z; - block.level = this; - int cx = x >> 4; - int cz = z >> 4; - - if (direct) { - this.sendBlocks(this.getChunkPlayers(cx, cz).values().toArray(new Player[0]), new Block[]{block}, UpdateBlockPacket.FLAG_ALL_PRIORITY); - } else { - addBlockChange(Level.chunkHash(cx, cz), x, y, z); - } - - for (ChunkLoader loader : this.getChunkLoaders(cx, cz)) { - loader.onBlockChanged(block); - } - if (update) { - if (blockPrevious.isTransparent() != block.isTransparent() || blockPrevious.getLightLevel() != block.getLightLevel()) { - addLightUpdate(x, y, z); - } - BlockUpdateEvent ev = new BlockUpdateEvent(block); - this.server.getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - for (Entity entity : this.getNearbyEntities(new AxisAlignedBB(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1))) { - entity.scheduleUpdate(); - } - block = ev.getBlock(); - block.onUpdate(BLOCK_UPDATE_NORMAL); - this.updateAround(x, y, z); - } - } - return true; - } - - private void addBlockChange(int x, int y, int z) { - long index = Level.chunkHash(x >> 4, z >> 4); - addBlockChange(index, x, y, z); - } - - private void addBlockChange(long index, int x, int y, int z) { - synchronized (changedBlocks) { - SoftReference> current = changedBlocks.computeIfAbsent(index, k -> new SoftReference<>(new HashMap<>())); - Map currentMap = current.get(); - if (currentMap != changeBlocksFullMap && currentMap != null) { - if (currentMap.size() > MAX_BLOCK_CACHE) { - this.changedBlocks.put(index, new SoftReference<>(changeBlocksFullMap)); - } else { - currentMap.put(Level.localBlockHash(x, y, z), changeBlocksPresent); - } - } - } - } - - public void dropItem(Vector3 source, Item item) { - this.dropItem(source, item, null); - } - - public void dropItem(Vector3 source, Item item, Vector3 motion) { - this.dropItem(source, item, motion, 10); - } - - public void dropItem(Vector3 source, Item item, Vector3 motion, int delay) { - this.dropItem(source, item, motion, false, delay); - } - - public void dropItem(Vector3 source, Item item, Vector3 motion, boolean dropAround, int delay) { - if (item.getId() > 0 && item.getCount() > 0) { - if (motion == null) { - if (dropAround) { - float f = ThreadLocalRandom.current().nextFloat() * 0.5f; - float f1 = ThreadLocalRandom.current().nextFloat() * 6.2831855f; - - motion = new Vector3(-MathHelper.sin(f1) * f, 0.20000000298023224, MathHelper.cos(f1) * f); - } else { - motion = new Vector3(Utils.random.nextDouble() * 0.2 - 0.1, 0.2, Utils.random.nextDouble() * 0.2 - 0.1); - } - } - - CompoundTag itemTag = NBTIO.putItemHelper(item); - itemTag.setName("Item"); - - EntityItem itemEntity = new EntityItem( - this.getChunk((int) source.getX() >> 4, (int) source.getZ() >> 4, true), - new CompoundTag().putList(new ListTag("Pos").add(new DoubleTag("", source.getX())) - .add(new DoubleTag("", source.getY())).add(new DoubleTag("", source.getZ()))) - - .putList(new ListTag("Motion").add(new DoubleTag("", motion.x)) - .add(new DoubleTag("", motion.y)).add(new DoubleTag("", motion.z))) - - .putList(new ListTag("Rotation") - .add(new FloatTag("", ThreadLocalRandom.current().nextFloat() * 360)) - .add(new FloatTag("", 0))) - - .putShort("Health", 5).putCompound("Item", itemTag).putShort("PickupDelay", delay)); - - itemEntity.spawnToAll(); - } - } - - public EntityItem dropAndGetItem(Vector3 source, Item item) { - return this.dropAndGetItem(source, item, null); - } - - public EntityItem dropAndGetItem(Vector3 source, Item item, Vector3 motion) { - return this.dropAndGetItem(source, item, motion, 10); - } - - public EntityItem dropAndGetItem(Vector3 source, Item item, Vector3 motion, int delay) { - return this.dropAndGetItem(source, item, motion, false, delay); - } - - public EntityItem dropAndGetItem(Vector3 source, Item item, Vector3 motion, boolean dropAround, int delay) { - EntityItem itemEntity = null; - - if (motion == null) { - if (dropAround) { - float f = ThreadLocalRandom.current().nextFloat() * 0.5f; - float f1 = ThreadLocalRandom.current().nextFloat() * 6.2831855f; - - motion = new Vector3(-MathHelper.sin(f1) * f, 0.20000000298023224, MathHelper.cos(f1) * f); - } else { - motion = new Vector3(Utils.random.nextDouble() * 0.2 - 0.1, 0.2, - Utils.random.nextDouble() * 0.2 - 0.1); - } - } - - CompoundTag itemTag = NBTIO.putItemHelper(item); - itemTag.setName("Item"); - - if (item.getId() > 0 && item.getCount() > 0) { - itemEntity = (EntityItem) Entity.createEntity("Item", - this.getChunk((int) source.getX() >> 4, (int) source.getZ() >> 4, true), - new CompoundTag().putList(new ListTag("Pos").add(new DoubleTag("", source.getX())) - .add(new DoubleTag("", source.getY())).add(new DoubleTag("", source.getZ()))) - - .putList(new ListTag("Motion").add(new DoubleTag("", motion.x)) - .add(new DoubleTag("", motion.y)).add(new DoubleTag("", motion.z))) - - .putList(new ListTag("Rotation") - .add(new FloatTag("", ThreadLocalRandom.current().nextFloat() * 360)) - .add(new FloatTag("", 0))) - - .putShort("Health", 5).putCompound("Item", itemTag).putShort("PickupDelay", delay)); - - if (itemEntity != null) { - itemEntity.spawnToAll(); - } - } - - return itemEntity; - } - - public Item useBreakOn(Vector3 vector) { - return this.useBreakOn(vector, null); - } - - public Item useBreakOn(Vector3 vector, Item item) { - return this.useBreakOn(vector, item, null); - } - - public Item useBreakOn(Vector3 vector, Item item, Player player) { - return this.useBreakOn(vector, item, player, false); - } - - public Item useBreakOn(Vector3 vector, Item item, Player player, boolean createParticles) { - return useBreakOn(vector, null, item, player, createParticles); - } - - public Item useBreakOn(Vector3 vector, BlockFace face, Item item, Player player, boolean createParticles) { - if (player != null && player.getGamemode() > Player.ADVENTURE) { - return null; - } - Block target = this.getBlock(vector); - Item[] drops; - int dropExp = target.getDropExp(); - - if (item == null) { - item = new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } - - boolean isSilkTouch = item.hasEnchantment(Enchantment.ID_SILK_TOUCH); - - if (player != null) { - if (player.getGamemode() == Player.ADVENTURE) { - Tag tag = item.getNamedTagEntry("CanDestroy"); - boolean canBreak = false; - if (tag instanceof ListTag) { - for (Tag v : ((ListTag) tag).getAll()) { - if (v instanceof StringTag) { - Item entry = Item.fromString(((StringTag) v).data); - if (entry.getId() > 0 && entry.getBlock() != null && entry.getBlock().getId() == target.getId()) { - canBreak = true; - break; - } - } - } - } - if (!canBreak) { - return null; - } - } - - double breakTime = target.getBreakTime(item, player); - - if (player.isCreative() && breakTime > 0.15) { - breakTime = 0.15; - } - - if (player.hasEffect(Effect.HASTE)) { - breakTime *= 1 - (0.2 * (player.getEffect(Effect.HASTE).getAmplifier() + 1)); - } - - if (player.hasEffect(Effect.MINING_FATIGUE)) { - breakTime *= 1 - (0.3 * (player.getEffect(Effect.MINING_FATIGUE).getAmplifier() + 1)); - } - - Enchantment eff = item.getEnchantment(Enchantment.ID_EFFICIENCY); - - if (eff != null && eff.getLevel() > 0) { - breakTime *= 1 - (0.3 * eff.getLevel()); - } - - breakTime -= 0.15; - - Item[] eventDrops; - if (!player.isSurvival()) { - eventDrops = new Item[0]; - } else if (isSilkTouch && target.canSilkTouch()) { - eventDrops = new Item[]{target.toItem()}; - } else { - eventDrops = target.getDrops(item); - } - BlockBreakEvent ev = new BlockBreakEvent(player, target, face, item, eventDrops, player.isCreative(), - (player.lastBreak + breakTime * 1000) > System.currentTimeMillis()); - - if ((player.isSurvival() || player.isAdventure()) && !target.isBreakable(item)) { - ev.setCancelled(); - } else if (!player.isOp() && isInSpawnRadius(target)) { - ev.setCancelled(); - } else if (!ev.getInstaBreak() && ev.isFastBreak()) { - ev.setCancelled(); - } - - player.lastBreak = System.currentTimeMillis(); - - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return null; - } - - drops = ev.getDrops(); - dropExp = ev.getDropExp(); - } else if (!target.isBreakable(item)) { - return null; - } else if (item.hasEnchantment(Enchantment.ID_SILK_TOUCH)) { - drops = new Item[]{target.toItem()}; - } else { - drops = target.getDrops(item); - } - - Vector3 above = new Vector3(target.x, target.y + 1, target.z); - if (this.getBlockIdAt((int) above.x, (int) above.y, (int) above.z) == Item.FIRE) { - this.setBlock(above, Block.get(BlockID.AIR), true); - } - - if (createParticles) { - Map players = this.getChunkPlayers((int) target.x >> 4, (int) target.z >> 4); - this.addParticle(new DestroyBlockParticle(target.add(0.5), target), players.values()); - } - - BlockEntity blockEntity = this.getBlockEntity(target); - if (blockEntity != null) { - blockEntity.onBreak(); - blockEntity.close(); - - this.updateComparatorOutputLevel(target); - } - - target.onBreak(item, player); - - item.useOn(target); - if (item.isTool() && item.getDamage() >= item.getMaxDurability()) { - this.addSoundToViewers(target, cn.nukkit.level.Sound.RANDOM_BREAK); - this.addParticle(new ItemBreakParticle(target, item)); - item = new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } - - if (this.gameRules.getBoolean(GameRule.DO_TILE_DROPS)) { - if (!isSilkTouch && player != null && drops.length != 0) { // For example no xp from redstone if it's mined with stone pickaxe - if (player.isSurvival() || player.isAdventure()) { - this.dropExpOrb(vector.add(0.5, 0.5, 0.5), dropExp); - } - } - - if (player == null || player.isSurvival() || player.isAdventure()) { - for (Item drop : drops) { - if (drop.getCount() > 0) { - this.dropItem(vector.add(0.5, 0.5, 0.5), drop); - } - } - } - } - - return item; - } - - public void dropExpOrb(Vector3 source, int exp) { - if (exp > 0) { - dropExpOrb(source, exp, null); - } - } - - public void dropExpOrb(Vector3 source, int exp, Vector3 motion) { - dropExpOrb(source, exp, motion, 10); - } - - public void dropExpOrb(Vector3 source, int exp, Vector3 motion, int delay) { - Random rand = ThreadLocalRandom.current(); - if (server.suomiCraftPEMode()) { - CompoundTag nbt = Entity.getDefaultNBT(source, motion == null ? new Vector3( - (rand.nextDouble() * 0.2 - 0.1) * 2, - rand.nextDouble() * 0.4, - (rand.nextDouble() * 0.2 - 0.1) * 2) : motion, - rand.nextFloat() * 360f, 0); - nbt.putShort("Value", exp); - nbt.putShort("PickupDelay", delay); - Entity entity = Entity.createEntity("XpOrb", this.getChunk(source.getChunkX(), source.getChunkZ()), nbt); - if (entity != null) { - entity.spawnToAll(); - } - } else { - for (int split : EntityXPOrb.splitIntoOrbSizes(exp)) { - CompoundTag nbt = Entity.getDefaultNBT(source, motion == null ? new Vector3( - (rand.nextDouble() * 0.2 - 0.1) * 2, - rand.nextDouble() * 0.4, - (rand.nextDouble() * 0.2 - 0.1) * 2) : motion, - rand.nextFloat() * 360f, 0); - nbt.putShort("Value", split); - nbt.putShort("PickupDelay", delay); - Entity.createEntity("XpOrb", this.getChunk(source.getChunkX(), source.getChunkZ()), nbt).spawnToAll(); - } - } - } - - public Item useItemOn(Vector3 vector, Item item, BlockFace face, float fx, float fy, float fz) { - return this.useItemOn(vector, item, face, fx, fy, fz, null); - } - - public Item useItemOn(Vector3 vector, Item item, BlockFace face, float fx, float fy, float fz, Player player) { - return this.useItemOn(vector, item, face, fx, fy, fz, player, true); - } - - @SuppressWarnings("unchecked") - public Item useItemOn(Vector3 vector, Item item, BlockFace face, float fx, float fy, float fz, Player player, boolean playSound) { - Block target = this.getBlock(vector); - Block block = target.getSide(face); - - if (block.y > 255 || block.y < 0) { - return null; - } - - if (block.y > 127 && this.dimension == DIMENSION_NETHER) { - return null; - } - - if (target.getId() == Item.AIR) { - return null; - } - - if (player != null) { - PlayerInteractEvent ev = new PlayerInteractEvent(player, item, target, face, Action.RIGHT_CLICK_BLOCK); - - if (player.getGamemode() > Player.ADVENTURE) { - ev.setCancelled(); - } - - if (!player.isOp() && isInSpawnRadius(target)) { - ev.setCancelled(); - } - - this.server.getPluginManager().callEvent(ev); - - if (!ev.isCancelled()) { - target.onUpdate(BLOCK_UPDATE_TOUCH); - - if ((!player.isSneaking() || player.getInventory().getItemInHand().isNull()) && target.canBeActivated() && target.onActivate(item, player)) { - if (item.isTool() && item.getDamage() >= item.getMaxDurability()) { - this.addSoundToViewers(target, cn.nukkit.level.Sound.RANDOM_BREAK); - this.addParticle(new ItemBreakParticle(target, item)); - item = new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } - - return item; - } - - if (item.canBeActivated() && item.onActivate(this, player, block, target, face, fx, fy, fz)) { - if (item.getCount() <= 0) { - item = new ItemBlock(Block.get(BlockID.AIR), 0, 0); - return item; - } - } - } else { - return null; - } - } else if (target.canBeActivated() && target.onActivate(item, null)) { - if (item.isTool() && item.getDamage() >= item.getMaxDurability()) { - this.addSoundToViewers(target, cn.nukkit.level.Sound.RANDOM_BREAK); - this.addParticle(new ItemBreakParticle(target, item)); - item = new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } - - return item; - } - - Block hand; - - if (item.canBePlaced()) { - hand = item.getBlock(); - hand.position(block); - } else { - return null; - } - - if (!(block.canBeReplaced() || (hand.getId() == Item.SLAB && block.getId() == Item.SLAB))) { - return null; - } - - if (target.canBeReplaced()) { - block = target; - hand.position(block); - } - - if (!hand.canPassThrough() && hand.getBoundingBox() != null) { - Entity[] entities = this.getCollidingEntities(hand.getBoundingBox()); - int realCount = 0; - for (Entity e : entities) { - if (e == player || e instanceof EntityArrow || e instanceof EntityItem || (e instanceof Player && ((Player) e).isSpectator() || !e.canCollide())) { - continue; - } - ++realCount; - } - - if (player != null) { - Vector3 diff = player.getNextPosition().subtract(player.getPosition()); - //if (diff.lengthSquared() > 0.00001) { - if (hand.getBoundingBox().intersectsWith(player.getBoundingBox().getOffsetBoundingBox(diff.x, diff.y, diff.z))) { - ++realCount; - } - //} - } - - if (realCount > 0) { - return null; - } - } - - if (player != null) { - BlockPlaceEvent event = new BlockPlaceEvent(player, hand, block, target, item); - if (player.getGamemode() == Player.ADVENTURE) { - Tag tag = item.getNamedTagEntry("CanPlaceOn"); - boolean canPlace = false; - if (tag instanceof ListTag) { - for (Tag v : ((ListTag) tag).getAll()) { - if (v instanceof StringTag) { - Item entry = Item.fromString(((StringTag) v).data); - if (entry.getId() > 0 && entry.getBlock() != null && entry.getBlock().getId() == target.getId()) { - canPlace = true; - break; - } - } - } - } - if (!canPlace) { - event.setCancelled(); - } - } - - if (!player.isOp() && isInSpawnRadius(target)) { - event.setCancelled(); - } - - this.server.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return null; - } - - if (server.mobsFromBlocks) { - if (item.getId() == Item.JACK_O_LANTERN || item.getId() == Item.PUMPKIN) { - if (block.getSide(BlockFace.DOWN).getId() == Item.SNOW_BLOCK && block.getSide(BlockFace.DOWN, 2).getId() == Item.SNOW_BLOCK) { - block.getLevel().setBlock(target, Block.get(BlockID.AIR)); - block.getLevel().setBlock(target.add(0, -1, 0), Block.get(BlockID.AIR)); - - CreatureSpawnEvent ev = new CreatureSpawnEvent(EntitySnowGolem.NETWORK_ID, CreatureSpawnEvent.SpawnReason.BUILD_SNOWMAN); - server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return null; - } - - Entity.createEntity("SnowGolem", target.add(0.5, -1, 0.5)).spawnToAll(); - - if (!player.isCreative()) { - item.setCount(item.getCount() - 1); - player.getInventory().setItemInHand(item); - } - return null; - } else if (block.getSide(BlockFace.DOWN).getId() == Item.IRON_BLOCK && block.getSide(BlockFace.DOWN, 2).getId() == Item.IRON_BLOCK) { - block = block.getSide(BlockFace.DOWN); - Block first, second = null; - if ((first = block.getSide(BlockFace.EAST)).getId() == Item.IRON_BLOCK && (second = block.getSide(BlockFace.WEST)).getId() == Item.IRON_BLOCK) { - block.getLevel().setBlock(first, Block.get(BlockID.AIR)); - block.getLevel().setBlock(second, Block.get(BlockID.AIR)); - } else if ((first = block.getSide(BlockFace.NORTH)).getId() == Item.IRON_BLOCK && (second = block.getSide(BlockFace.SOUTH)).getId() == Item.IRON_BLOCK) { - block.getLevel().setBlock(first, Block.get(BlockID.AIR)); - block.getLevel().setBlock(second, Block.get(BlockID.AIR)); - } - - if (second != null) { - block.getLevel().setBlock(block, Block.get(BlockID.AIR)); - block.getLevel().setBlock(block.add(0, -1, 0), Block.get(BlockID.AIR)); - - CreatureSpawnEvent ev = new CreatureSpawnEvent(EntityIronGolem.NETWORK_ID, CreatureSpawnEvent.SpawnReason.BUILD_IRONGOLEM); - server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return null; - } - - Entity.createEntity("IronGolem", block.add(0.5, -1, 0.5)).spawnToAll(); - - if (!player.isCreative()) { - item.setCount(item.getCount() - 1); - player.getInventory().setItemInHand(item); - } - return null; - } - } - } else if (item.getId() == Item.SKULL && item.getDamage() == 1) { - if (block.getSide(BlockFace.DOWN).getId() == Item.SOUL_SAND && block.getSide(BlockFace.DOWN, 2).getId() == Item.SOUL_SAND) { - Block first, second; - - if (!(((first = block.getSide(BlockFace.EAST)).getId() == Item.SKULL_BLOCK && first.toItem().getDamage() == 1) && ((second = block.getSide(BlockFace.WEST)).getId() == Item.SKULL_BLOCK && second.toItem().getDamage() == 1) || ((first = block.getSide(BlockFace.NORTH)).getId() == Item.SKULL_BLOCK && first.toItem().getDamage() == 1) && ((second = block.getSide(BlockFace.SOUTH)).getId() == Item.SKULL_BLOCK && second.toItem().getDamage() == 1))) { - return null; - } - - block = block.getSide(BlockFace.DOWN); - - Block first2, second2; - - if (!((first2 = block.getSide(BlockFace.EAST)).getId() == Item.SOUL_SAND && (second2 = block.getSide(BlockFace.WEST)).getId() == Item.SOUL_SAND || (first2 = block.getSide(BlockFace.NORTH)).getId() == Item.SOUL_SAND && (second2 = block.getSide(BlockFace.SOUTH)).getId() == Item.SOUL_SAND)) { - return null; - } - - block.getLevel().setBlock(first, Block.get(BlockID.AIR)); - block.getLevel().setBlock(second, Block.get(BlockID.AIR)); - block.getLevel().setBlock(first2, Block.get(BlockID.AIR)); - block.getLevel().setBlock(second2, Block.get(BlockID.AIR)); - block.getLevel().setBlock(block, Block.get(BlockID.AIR)); - block.getLevel().setBlock(block.add(0, -1, 0), Block.get(BlockID.AIR)); - - CreatureSpawnEvent ev = new CreatureSpawnEvent(EntityWither.NETWORK_ID, CreatureSpawnEvent.SpawnReason.BUILD_WITHER); - server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return null; - } - - if (!player.isCreative()) { - item.setCount(item.getCount() - 1); - player.getInventory().setItemInHand(item); - } - - EntityWither wither = (EntityWither) Entity.createEntity("Wither", block.add(0.5, -1, 0.5)); - wither.stayTime = 220; - wither.spawnToAll(); - this.addSoundToViewers(wither, cn.nukkit.level.Sound.MOB_WITHER_SPAWN); - return null; - } - } - } - } - - if (!hand.place(item, block, target, face, fx, fy, fz, player)) { - return null; - } - - if (player != null) { - if (!player.isCreative()) { - item.setCount(item.getCount() - 1); - } - } - - - if (playSound) { - Int2ObjectMap> players = Server.sortPlayers(this.getChunkPlayers(hand.getChunkX(), hand.getChunkZ()).values()); - for (int protocolId : players.keySet()) { - ObjectList targets = players.get(protocolId); - int soundData = GlobalBlockPalette.getOrCreateRuntimeId(protocolId > ProtocolInfo.v1_2_10 ? protocolId : ProtocolInfo.CURRENT_PROTOCOL, // no block palette in <= 1.2.10 - hand.getId(), hand.getDamage()); - this.addLevelSoundEvent(hand, LevelSoundEventPacket.SOUND_PLACE, soundData, targets.toArray(new Player[0])); - } - } - - if (item.getCount() <= 0) { - item = new ItemBlock(Block.get(BlockID.AIR), 0, 0); - } - return item; - } - - public boolean isInSpawnRadius(Vector3 vector3) { - return server.getSpawnRadius() > -1 && new Vector2(vector3.x, vector3.z).distance(new Vector2(this.getSpawnLocation().x, this.getSpawnLocation().z)) <= server.getSpawnRadius(); - } - - public Entity getEntity(long entityId) { - return this.entities.containsKey(entityId) ? this.entities.get(entityId) : null; - } - - public Entity[] getEntities() { - return entities.values().toArray(new Entity[0]); - } - - public Entity[] getCollidingEntities(AxisAlignedBB bb) { - return this.getCollidingEntities(bb, null); - } - - public Entity[] getCollidingEntities(AxisAlignedBB bb, Entity entity) { - List nearby = new ArrayList<>(); - - if (entity == null || entity.canCollide()) { - int minX = NukkitMath.floorDouble((bb.minX - 2) / 16); - int maxX = NukkitMath.ceilDouble((bb.maxX + 2) / 16); - int minZ = NukkitMath.floorDouble((bb.minZ - 2) / 16); - int maxZ = NukkitMath.ceilDouble((bb.maxZ + 2) / 16); - - for (int x = minX; x <= maxX; ++x) { - for (int z = minZ; z <= maxZ; ++z) { - for (Entity ent : this.getChunkEntities(x, z, false).values()) { - if ((entity == null || (ent != entity && entity.canCollideWith(ent))) - && ent.boundingBox.intersectsWith(bb)) { - nearby.add(ent); - } - } - } - } - } - - return nearby.toArray(new Entity[0]); - } - - public Entity[] getNearbyEntities(AxisAlignedBB bb) { - return this.getNearbyEntities(bb, null); - } - - private static final Entity[] EMPTY_ENTITY_ARR = new Entity[0]; - private static final Entity[] ENTITY_BUFFER = new Entity[512]; - - public Entity[] getNearbyEntities(AxisAlignedBB bb, Entity entity) { - return getNearbyEntities(bb, entity, false); - } - - public Entity[] getNearbyEntities(AxisAlignedBB bb, Entity entity, boolean loadChunks) { - int index = 0; - - int minX = NukkitMath.floorDouble((bb.minX - 2) * 0.0625); - int maxX = NukkitMath.ceilDouble((bb.maxX + 2) * 0.0625); - int minZ = NukkitMath.floorDouble((bb.minZ - 2) * 0.0625); - int maxZ = NukkitMath.ceilDouble((bb.maxZ + 2) * 0.0625); - - ArrayList overflow = null; - - for (int x = minX; x <= maxX; ++x) { - for (int z = minZ; z <= maxZ; ++z) { - for (Entity ent : this.getChunkEntities(x, z, loadChunks).values()) { - if (ent != entity && ent.boundingBox.intersectsWith(bb)) { - if (index < ENTITY_BUFFER.length) { - ENTITY_BUFFER[index] = ent; - } else { - if (overflow == null) overflow = new ArrayList<>(1024); - overflow.add(ent); - } - index++; - } - } - } - } - - if (index == 0) return EMPTY_ENTITY_ARR; - Entity[] copy; - if (overflow == null) { - copy = Arrays.copyOfRange(ENTITY_BUFFER, 0, index); - Arrays.fill(ENTITY_BUFFER, 0, index, null); - } else { - copy = new Entity[ENTITY_BUFFER.length + overflow.size()]; - System.arraycopy(ENTITY_BUFFER, 0, copy, 0, ENTITY_BUFFER.length); - for (int i = 0; i < overflow.size(); i++) { - copy[ENTITY_BUFFER.length + i] = overflow.get(i); - } - } - return copy; - } - - public Map getBlockEntities() { - return blockEntities; - } - - public BlockEntity getBlockEntityById(long blockEntityId) { - return this.blockEntities.containsKey(blockEntityId) ? this.blockEntities.get(blockEntityId) : null; - } - - public Map getPlayers() { - return players; - } - - public Map getLoaders() { - return loaders; - } - - public BlockEntity getBlockEntity(Vector3 pos) { - FullChunk chunk = this.getChunk((int) pos.x >> 4, (int) pos.z >> 4, false); - - if (chunk != null) { - return chunk.getTile((int) pos.x & 0x0f, (int) pos.y & 0xff, (int) pos.z & 0x0f); - } - - return null; - } - - public BlockEntity getBlockEntityIfLoaded(Vector3 pos) { - FullChunk chunk = this.getChunkIfLoaded((int) pos.x >> 4, (int) pos.z >> 4); - - if (chunk != null) { - return chunk.getTile((int) pos.x & 0x0f, (int) pos.y & 0xff, (int) pos.z & 0x0f); - } - - return null; - } - - public Map getChunkEntities(int X, int Z) { - return getChunkEntities(X, Z, true); - } - - public Map getChunkEntities(int X, int Z, boolean loadChunks) { - FullChunk chunk = loadChunks ? this.getChunk(X, Z) : this.getChunkIfLoaded(X, Z); - return chunk != null ? chunk.getEntities() : Collections.emptyMap(); - } - - public Map getChunkBlockEntities(int X, int Z) { - FullChunk chunk; - return (chunk = this.getChunk(X, Z)) != null ? chunk.getBlockEntities() : Collections.emptyMap(); - } - - @Override - public synchronized int getBlockIdAt(int x, int y, int z) { - return this.getChunk(x >> 4, z >> 4, true).getBlockId(x & 0x0f, y & 0xff, z & 0x0f); - } - - public int getBlockIdAt(FullChunk chunk, int x, int y, int z) { - if (chunk == null) chunk = this.getChunk(x >> 4, z >> 4, true); - return chunk.getBlockId(x & 0x0f, y & 0xff, z & 0x0f); - } - - @Override - public synchronized void setBlockIdAt(int x, int y, int z, int id) { - this.getChunk(x >> 4, z >> 4, true).setBlockId(x & 0x0f, y & 0xff, z & 0x0f, id & 0xff); - addBlockChange(x, y, z); - temporalVector.setComponents(x, y, z); - for (ChunkLoader loader : this.getChunkLoaders(x >> 4, z >> 4)) { - loader.onBlockChanged(temporalVector); - } - } - - public synchronized void setBlockAt(int x, int y, int z, int id, int data) { - BaseFullChunk chunk = this.getChunk(x >> 4, z >> 4, true); - chunk.setBlockId(x & 0x0f, y & 0xff, z & 0x0f, id & 0xff); - chunk.setBlockData(x & 0x0f, y & 0xff, z & 0x0f, data & 0xf); - addBlockChange(x, y, z); - temporalVector.setComponents(x, y, z); - for (ChunkLoader loader : this.getChunkLoaders(x >> 4, z >> 4)) { - loader.onBlockChanged(temporalVector); - } - } - - public synchronized int getBlockExtraDataAt(int x, int y, int z) { - return this.getChunk(x >> 4, z >> 4, true).getBlockExtraData(x & 0x0f, y & 0xff, z & 0x0f); - } - - public synchronized void setBlockExtraDataAt(int x, int y, int z, int id, int data) { - this.getChunk(x >> 4, z >> 4, true).setBlockExtraData(x & 0x0f, y & 0xff, z & 0x0f, (data << 8) | id); - - this.sendBlockExtraData(x, y, z, id, data); - } - - @Override - public synchronized int getBlockDataAt(int x, int y, int z) { - return this.getChunk(x >> 4, z >> 4, true).getBlockData(x & 0x0f, y & 0xff, z & 0x0f); - } - - @Override - public synchronized void setBlockDataAt(int x, int y, int z, int data) { - this.getChunk(x >> 4, z >> 4, true).setBlockData(x & 0x0f, y & 0xff, z & 0x0f, data & 0x0f); - addBlockChange(x, y, z); - temporalVector.setComponents(x, y, z); - for (ChunkLoader loader : this.getChunkLoaders(x >> 4, z >> 4)) { - loader.onBlockChanged(temporalVector); - } - } - - public synchronized int getBlockSkyLightAt(int x, int y, int z) { - return this.getChunk(x >> 4, z >> 4, true).getBlockSkyLight(x & 0x0f, y & 0xff, z & 0x0f); - } - - public synchronized void setBlockSkyLightAt(int x, int y, int z, int level) { - this.getChunk(x >> 4, z >> 4, true).setBlockSkyLight(x & 0x0f, y & 0xff, z & 0x0f, level & 0x0f); - } - - public synchronized int getBlockLightAt(int x, int y, int z) { - BaseFullChunk chunk = this.getChunkIfLoaded(x >> 4, z >> 4); - return chunk == null ? 0 : chunk.getBlockLight(x & 0x0f, y & 0xff, z & 0x0f); - } - - public synchronized void setBlockLightAt(int x, int y, int z, int level) { - BaseFullChunk c = this.getChunkIfLoaded(x >> 4, z >> 4); - if (null != c) { - c.setBlockLight(x & 0x0f, y & 0xff, z & 0x0f, level & 0x0f); - } - } - - public int getBiomeId(int x, int z) { - return this.getChunk(x >> 4, z >> 4, true).getBiomeId(x & 0x0f, z & 0x0f); - } - - public void setBiomeId(int x, int z, int biomeId) { - this.getChunk(x >> 4, z >> 4, true).setBiomeId(x & 0x0f, z & 0x0f, biomeId & 0x0f); - } - - public void setBiomeId(int x, int z, byte biomeId) { - this.getChunk(x >> 4, z >> 4, true).setBiomeId(x & 0x0f, z & 0x0f, biomeId & 0x0f); - } - - public int getHeightMap(int x, int z) { - return this.getChunk(x >> 4, z >> 4, true).getHeightMap(x & 0x0f, z & 0x0f); - } - - public void setHeightMap(int x, int z, int value) { - this.getChunk(x >> 4, z >> 4, true).setHeightMap(x & 0x0f, z & 0x0f, value & 0x0f); - } - - public int getBiomeColor(int x, int z) { - return this.getChunk(x >> 4, z >> 4, true).getBiomeColor(x & 0x0f, z & 0x0f); - } - - public void setBiomeColor(int x, int z, int R, int G, int B) { - this.getChunk(x >> 4, z >> 4, true).setBiomeColor(x & 0x0f, z & 0x0f, R, G, B); - } - - public Map getChunks() { - return provider.getLoadedChunks(); - } - - @Override - public BaseFullChunk getChunk(int chunkX, int chunkZ) { - return this.getChunk(chunkX, chunkZ, false); - } - - public BaseFullChunk getChunk(int chunkX, int chunkZ, boolean create) { - long index = Level.chunkHash(chunkX, chunkZ); - BaseFullChunk chunk = this.provider.getLoadedChunk(index); - if (chunk == null) { - chunk = this.forceLoadChunk(index, chunkX, chunkZ, create); - } - return chunk; - } - - public BaseFullChunk getChunkIfLoaded(int chunkX, int chunkZ) { - return this.provider.getLoadedChunk(Level.chunkHash(chunkX, chunkZ)); - } - - public void generateChunkCallback(int x, int z, BaseFullChunk chunk) { - generateChunkCallback(x, z, chunk, true); - } - - public void generateChunkCallback(int x, int z, BaseFullChunk chunk, boolean isPopulated) { - if (Timings.generationCallbackTimer != null) Timings.generationCallbackTimer.startTiming(); - long index = Level.chunkHash(x, z); - if (this.chunkPopulationQueue.containsKey(index)) { - FullChunk oldChunk = this.getChunk(x, z, false); - for (int xx = -1; xx <= 1; ++xx) { - for (int zz = -1; zz <= 1; ++zz) { - this.chunkPopulationLock.remove(Level.chunkHash(x + xx, z + zz)); - } - } - this.chunkPopulationQueue.remove(index); - chunk.setProvider(this.provider); - this.setChunk(x, z, chunk, false); - chunk = this.getChunk(x, z, false); - if (chunk != null && (oldChunk == null || !isPopulated) && chunk.isPopulated() - && chunk.getProvider() != null) { - this.server.getPluginManager().callEvent(new ChunkPopulateEvent(chunk)); - - for (ChunkLoader loader : this.getChunkLoaders(x, z)) { - loader.onChunkPopulated(chunk); - } - } - } else if (this.chunkGenerationQueue.containsKey(index) || this.chunkPopulationLock.containsKey(index)) { - this.chunkGenerationQueue.remove(index); - this.chunkPopulationLock.remove(index); - chunk.setProvider(this.provider); - this.setChunk(x, z, chunk, false); - } else { - chunk.setProvider(this.provider); - this.setChunk(x, z, chunk, false); - } - if (Timings.generationCallbackTimer != null) Timings.generationCallbackTimer.stopTiming(); - } - - @Override - public void setChunk(int chunkX, int chunkZ) { - this.setChunk(chunkX, chunkZ, null); - } - - @Override - public void setChunk(int chunkX, int chunkZ, BaseFullChunk chunk) { - this.setChunk(chunkX, chunkZ, chunk, true); - } - - public void setChunk(int chunkX, int chunkZ, BaseFullChunk chunk, boolean unload) { - if (chunk == null) { - return; - } - - long index = Level.chunkHash(chunkX, chunkZ); - FullChunk oldChunk = this.getChunk(chunkX, chunkZ, false); - - if (oldChunk != chunk) { - if (unload && oldChunk != null) { - this.unloadChunk(chunkX, chunkZ, false, false); - } else { - Map oldEntities = oldChunk != null ? oldChunk.getEntities() : Collections.emptyMap(); - - Map oldBlockEntities = oldChunk != null ? oldChunk.getBlockEntities() : Collections.emptyMap(); - - if (!oldEntities.isEmpty()) { - Iterator> iter = oldEntities.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - Entity entity = entry.getValue(); - chunk.addEntity(entity); - if (oldChunk != null) { - iter.remove(); - oldChunk.removeEntity(entity); - entity.chunk = chunk; - } - } - } - - if (!oldBlockEntities.isEmpty()) { - Iterator> iter = oldBlockEntities.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - BlockEntity blockEntity = entry.getValue(); - chunk.addBlockEntity(blockEntity); - if (oldChunk != null) { - iter.remove(); - oldChunk.removeBlockEntity(blockEntity); - blockEntity.chunk = chunk; - } - } - } - - } - this.provider.setChunk(chunkX, chunkZ, chunk); - } - - chunk.setChanged(); - - if (!this.isChunkInUse(index)) { - this.unloadChunkRequest(chunkX, chunkZ); - } else { - for (ChunkLoader loader : this.getChunkLoaders(chunkX, chunkZ)) { - loader.onChunkChanged(chunk); - } - } - } - - public int getHighestBlockAt(int x, int z) { - return this.getHighestBlockAt(x, z, true); - } - - public int getHighestBlockAt(int x, int z, boolean cache) { - return this.getChunk(x >> 4, z >> 4, true).getHighestBlockAt(x & 0x0f, z & 0x0f, cache); - } - - public BlockColor getMapColorAt(int x, int z) { - int y = getHighestBlockAt(x, z, false); - - while (y > 1) { - Block block = getBlock(new Vector3(x, y, z)); - if (block instanceof BlockGrass) { - return getGrassColorAt(x, z); - //} else if (block instanceof BlockWater) { - // return getWaterColorAt(x, z); - } else { - BlockColor blockColor = block.getColor(); - if (blockColor.getAlpha() == 0x00) { - y--; - } else { - return blockColor; - } - } - } - - return BlockColor.VOID_BLOCK_COLOR; - } - - public BlockColor getGrassColorAt(int x, int z) { - int biome = this.getBiomeId(x, z); - - switch (biome) { - case 0: //ocean - case 7: //river - case 9: //end - case 24: //deep ocean - return new BlockColor("#8eb971"); - case 1: //plains - case 16: //beach - case 129: //sunflower plains - return new BlockColor("#91bd59"); - case 2: //desert - case 8: //hell - case 17: //desert hills - case 35: //savanna - case 36: //savanna plateau - case 130: //desert m - case 163: //savanna m - case 164: //savanna plateau m - return new BlockColor("#bfb755"); - case 3: //extreme hills - case 20: //extreme hills edge - case 25: //stone beach - case 34: //extreme hills - case 131: //extreme hills m - case 162: //extreme hills plus m - return new BlockColor("#8ab689"); - case 4: //forest - case 132: //flower forest - return new BlockColor("#79c05a"); - case 5: //taiga - case 19: //taiga hills - case 32: //mega taiga - case 33: //mega taiga hills - case 133: //taiga m - case 160: //mega spruce taiga - return new BlockColor("#86b783"); - case 6: //swamp - case 134: //swampland m - return new BlockColor("#6A7039"); - case 10: //frozen ocean - case 11: //frozen river - case 12: //ice plains - case 30: //cold taiga - case 31: //cold taiga hills - case 140: //ice plains spikes - case 158: //cold taiga m - return new BlockColor("#80b497"); - case 14: //mushroom island - case 15: //mushroom island shore - return new BlockColor("#55c93f"); - case 18: //forest hills - case 27: //birch forest - case 28: //birch forest hills - case 155: //birch forest m - case 156: //birch forest hills m - return new BlockColor("#88bb67"); - case 21: //jungle - case 22: //jungle hills - case 149: //jungle m - return new BlockColor("#59c93c"); - case 23: //jungle edge - case 151: //jungle edge m - return new BlockColor("#64c73f"); - case 26: //cold beach - return new BlockColor("#83b593"); - case 29: //roofed forest - case 157: //roofed forest m - return new BlockColor("#507a32"); - case 37: //mesa - case 38: //mesa plateau f - case 39: //mesa plateau - case 165: //mesa bryce - case 166: //mesa plateau f m - case 167: //mesa plateau m - return new BlockColor("#90814d"); - default: - return BlockColor.GRASS_BLOCK_COLOR; - } - } - - public BlockColor getWaterColorAt(int x, int z) { - int biome = this.getBiomeId(x, z); - - switch (biome) { - case 2: //desert - case 130: //desert m - return new BlockColor("#32A598"); - case 4: //forest - return new BlockColor("#1E97F2"); - case 132: //flower forest - return new BlockColor("#20A3CC"); - case 5: //taiga - case 19: //taiga hills - case 133: //taiga m - case 3: //extreme hills - case 20: //extreme hills edge - case 34: //extreme hills - case 131: //extreme hills m - case 162: //extreme hills plus m - return new BlockColor("#1E6B82"); - case 6: //swamp - return new BlockColor("#4c6559"); - case 134: //swampland m - return new BlockColor("#4c6156"); - case 7: //river - return new BlockColor("#0084FF"); - case 9: //end - return new BlockColor("#62529e"); - case 8: //hell - return new BlockColor("#905957"); - case 11: //frozen river - return new BlockColor("#185390"); - case 12: //ice plains - case 140: //ice plains spikes - return new BlockColor("#14559b"); - case 14: //mushroom island - return new BlockColor("#8a8997"); - case 15: //mushroom island shore - return new BlockColor("#818193"); - case 16: //beach - return new BlockColor("#157cab"); - case 17: //desert hills - return new BlockColor("#1a7aa1"); - case 18: //forest hills - return new BlockColor("#056bd1"); - case 21: //jungle - return new BlockColor("#14A2C5"); - case 22: //jungle hills - case 149: //jungle m - return new BlockColor("#1B9ED8"); - case 23: //jungle edge - case 151: //jungle edge m - return new BlockColor("#0D8AE3"); - case 25: //stone beach - return new BlockColor("#0d67bb"); - case 26: //cold beach - return new BlockColor("#1463a5"); - case 27: //birch forest - case 155: //birch forest m - return new BlockColor("#0677ce"); - case 28: //birch forest hills - case 156: //birch forest hills m - return new BlockColor("#0a74c4"); - case 29: //roofed forest - case 157: //roofed forest m - return new BlockColor("#3B6CD1"); - case 30: //cold taiga - case 158: //cold taiga m - return new BlockColor("#205e83"); - case 31: //cold taiga hills - return new BlockColor("#245b78"); - case 32: //mega taiga - case 160: //mega spruce taiga - return new BlockColor("#2d6d77"); - case 33: //mega taiga hills - return new BlockColor("#286378"); - case 35: //savanna - case 163: //savanna m - return new BlockColor("#2C8B9C"); - case 36: //savanna plateau - case 164: //savanna plateau m - return new BlockColor("#2590A8"); - case 0: //ocean - case 24: //deep ocean - return new BlockColor("#1787D4"); - case 10: //frozen ocean - return new BlockColor("#2570B5"); - default: // plains, sunflower plains, others - return new BlockColor("#44AFF5"); - case 37: //mesa - return new BlockColor("#4E7F81"); - case 38: //mesa plateau f - case 39: //mesa plateau - case 165: //mesa bryce - return new BlockColor("#497F99"); - case 166: //mesa plateau f m - case 167: //mesa plateau m - return new BlockColor("#55809E"); - } - } - - public boolean isChunkLoaded(int x, int z) { - return this.provider.isChunkLoaded(x, z); - } - - private boolean areNeighboringChunksLoaded(long hash) { - return this.provider.isChunkLoaded(hash + 1) && - this.provider.isChunkLoaded(hash - 1) && - this.provider.isChunkLoaded(hash + (4294967296L)) && - this.provider.isChunkLoaded(hash - (4294967296L)); - } - - public boolean isChunkGenerated(int x, int z) { - FullChunk chunk = this.getChunk(x, z); - return chunk != null && chunk.isGenerated(); - } - - public boolean isChunkPopulated(int x, int z) { - FullChunk chunk = this.getChunk(x, z); - return chunk != null && chunk.isPopulated(); - } - - public Position getSpawnLocation() { - return Position.fromObject(this.provider.getSpawn(), this); - } - - public void setSpawnLocation(Vector3 pos) { - Position previousSpawn = this.getSpawnLocation(); - this.provider.setSpawn(pos); - this.server.getPluginManager().callEvent(new SpawnChangeEvent(this, previousSpawn)); - SetSpawnPositionPacket pk = new SetSpawnPositionPacket(); - pk.spawnType = SetSpawnPositionPacket.TYPE_WORLD_SPAWN; - pk.x = pos.getFloorX(); - pk.y = pos.getFloorY(); - pk.z = pos.getFloorZ(); - pk.dimension = this.getDimension(); - for (Player p : getPlayers().values()) p.dataPacket(pk); - } - - public void requestChunk(int x, int z, Player player) { - Preconditions.checkState(player.getLoaderId() > 0, player.getName() + " has no chunk loader"); - long index = Level.chunkHash(x, z); - - this.getChunkSendQueue(player.protocol).computeIfAbsent(index, k -> - new Int2ObjectOpenHashMap<>()).put(player.getLoaderId(), player); - } - - private void sendChunk(int x, int z, long index, DataPacket packet) { - for (int protocolId : chunkSendTasks.keySet()) { - this.sendChunkInternal(x, z, index, packet, protocolId); - } - } - - private void sendChunkInternal(int x, int z, long index, DataPacket packet, int protocol) { - LongSet tasks = this.getChunkSendTasks(protocol); - if (!tasks.contains(index)) { - return; - } - - ConcurrentMap> queue = this.getChunkSendQueue(protocol); - for (Player player : queue.get(index).values()) { - if (player.isConnected() && player.usedChunks.containsKey(index)) { - player.sendChunk(x, z, packet); - } - } - queue.remove(index); - tasks.remove(index); - } - - private void processChunkRequest() { - if (this.timings.syncChunkSendTimer != null) { - this.timings.syncChunkSendTimer.startTiming(); - } - - // Map shorted by index => requested protocols - Long2ObjectMap chunkRequests = new Long2ObjectOpenHashMap<>(); - for (int protocolId : this.chunkSendQueues.keySet()) { - Set indexes = this.getChunkSendQueue(protocolId).keySet(); - LongSet tasks = this.getChunkSendTasks(protocolId); - for (long index : indexes) { - if (!tasks.contains(index)) { - chunkRequests.computeIfAbsent(index, l -> new IntOpenHashSet()).add(protocolId); - tasks.add(index); - } - } - } - - this.chunkRequestInternal(chunkRequests); - - if (this.timings.syncChunkSendTimer != null) { - this.timings.syncChunkSendTimer.stopTiming(); - } - } - - private void chunkRequestInternal(Long2ObjectMap chunkRequests) { - for (long index : chunkRequests.keySet()) { - IntSet protocols = new IntOpenHashSet(chunkRequests.get(index)); - int x = getHashX(index); - int z = getHashZ(index); - - for (int protocol : chunkRequests.get(index)) { - BaseFullChunk chunk = this.getChunk(x, z); - if (chunk != null) { - BatchPacket packet = chunk.getChunkPacket(protocol); - if (packet != null) { - this.sendChunk(x, z, index, packet); - protocols.remove(protocol); - } - } - } - - if (protocols.isEmpty()) { - continue; - } - - if (this.timings.syncChunkSendPrepareTimer != null) { - this.timings.syncChunkSendPrepareTimer.startTiming(); - } - - this.provider.requestChunkTask(protocols, x, z); - - if (this.timings.syncChunkSendPrepareTimer != null) { - this.timings.syncChunkSendPrepareTimer.stopTiming(); - } - } - } - - public void chunkRequestCallback(int protocol, long timestamp, int x, int z, int subChunkCount, byte[] payload) { - if (this.timings.syncChunkSendTimer != null) this.timings.syncChunkSendTimer.startTiming(); - long index = Level.chunkHash(x, z); - - if (server.cacheChunks) { - BatchPacket data = Player.getChunkCacheFromData(protocol, x, z, subChunkCount, payload); - BaseFullChunk chunk = getChunk(x, z, false); - if (chunk != null && chunk.getChanges() <= timestamp) { - chunk.setChunkPacket(protocol, data); - } - this.sendChunk(x, z, index, data); - if (this.timings.syncChunkSendTimer != null) this.timings.syncChunkSendTimer.stopTiming(); - return; - } - - LongSet tasks = this.getChunkSendTasks(protocol); - if (tasks.contains(index)) { - ConcurrentMap> queue = this.getChunkSendQueue(protocol); - for (Player player : queue.get(index).values()) { - if (player.isConnected() && player.usedChunks.containsKey(index)) { - if (matchMVChunkProtocol(protocol, player.protocol)) { - player.sendChunk(x, z, subChunkCount, payload); - } - } - } - - queue.remove(index); - tasks.remove(index); - } - - if (this.timings.syncChunkSendTimer != null) this.timings.syncChunkSendTimer.stopTiming(); - } - - public void removeEntity(Entity entity) { - if (entity.getLevel() != this) { - throw new LevelException("Invalid Entity level"); - } - - if (entity instanceof Player) { - this.players.remove(entity.getId()); - this.checkSleep(); - } else { - entity.close(); - } - - this.entities.remove(entity.getId()); - this.updateEntities.remove(entity.getId()); - } - - public void addEntity(Entity entity) { - if (entity.getLevel() != this) { - throw new LevelException("Invalid Entity level"); - } - - if (entity instanceof Player) { - this.players.put(entity.getId(), (Player) entity); - } - this.entities.put(entity.getId(), entity); - } - - public void addBlockEntity(BlockEntity blockEntity) { - if (blockEntity.getLevel() != this) { - throw new LevelException("Invalid BlockEntity level"); - } - blockEntities.put(blockEntity.getId(), blockEntity); - } - - public void scheduleBlockEntityUpdate(BlockEntity entity) { - Preconditions.checkNotNull(entity, "entity"); - Preconditions.checkArgument(entity.getLevel() == this, "BlockEntity is not in this level"); - if (!updateBlockEntities.contains(entity)) { - updateBlockEntities.add(entity); - } - } - - public void removeBlockEntity(BlockEntity entity) { - Preconditions.checkNotNull(entity, "entity"); - Preconditions.checkArgument(entity.getLevel() == this, "BlockEntity is not in this level"); - blockEntities.remove(entity.getId()); - updateBlockEntities.remove(entity); - } - - public boolean isChunkInUse(int x, int z) { - return isChunkInUse(Level.chunkHash(x, z)); - } - - public boolean isChunkInUse(long hash) { - Map map = this.chunkLoaders.get(hash); - return map != null && !map.isEmpty(); - } - - public boolean loadChunk(int x, int z) { - return this.loadChunk(x, z, true); - } - - public boolean loadChunk(int x, int z, boolean generate) { - long index = Level.chunkHash(x, z); - if (this.provider.isChunkLoaded(index)) { - return true; - } - return forceLoadChunk(index, x, z, generate) != null; - } - - private synchronized BaseFullChunk forceLoadChunk(long index, int x, int z, boolean generate) { - if (this.timings.syncChunkLoadTimer != null) this.timings.syncChunkLoadTimer.startTiming(); - - BaseFullChunk chunk = this.provider.getChunk(x, z, generate); - - if (chunk == null) { - if (generate) { - throw new IllegalStateException("Could not create new chunk"); - } - if (this.timings.syncChunkLoadTimer != null) this.timings.syncChunkLoadTimer.stopTiming(); - return null; - } - - if (chunk.getProvider() != null) { - this.server.getPluginManager().callEvent(new ChunkLoadEvent(chunk, !chunk.isGenerated())); - } else { - this.unloadChunk(x, z, false); - if (this.timings.syncChunkLoadTimer != null) this.timings.syncChunkLoadTimer.stopTiming(); - return chunk; - } - - chunk.initChunk(); - - if (!chunk.isLightPopulated() && chunk.isPopulated() && this.server.lightUpdates) { - this.server.getScheduler().scheduleAsyncTask(new LightPopulationTask(this, chunk)); - } - - if (this.isChunkInUse(index)) { - this.unloadQueue.remove(index); - for (ChunkLoader loader : this.getChunkLoaders(x, z)) { - loader.onChunkLoaded(chunk); - } - } else { - this.unloadQueue.put(index, System.currentTimeMillis()); - } - if (this.timings.syncChunkLoadTimer != null) this.timings.syncChunkLoadTimer.stopTiming(); - return chunk; - } - - private void queueUnloadChunk(int x, int z) { - long index = Level.chunkHash(x, z); - this.unloadQueue.put(index, System.currentTimeMillis()); - } - - public boolean unloadChunkRequest(int x, int z) { - return this.unloadChunkRequest(x, z, true); - } - - public boolean unloadChunkRequest(int x, int z, boolean safe) { - if ((safe && this.isChunkInUse(x, z)) || this.isSpawnChunk(x, z)) { - return false; - } - - this.queueUnloadChunk(x, z); - - return true; - } - - public void cancelUnloadChunkRequest(int x, int z) { - this.cancelUnloadChunkRequest(Level.chunkHash(x, z)); - } - - public void cancelUnloadChunkRequest(long hash) { - this.unloadQueue.remove(hash); - } - - public boolean unloadChunk(int x, int z) { - return this.unloadChunk(x, z, true); - } - - public boolean unloadChunk(int x, int z, boolean safe) { - return this.unloadChunk(x, z, safe, true); - } - - public synchronized boolean unloadChunk(int x, int z, boolean safe, boolean trySave) { - if (safe && this.isChunkInUse(x, z)) { - return false; - } - - if (!this.isChunkLoaded(x, z)) { - return true; - } - - if (this.timings.doChunkUnload != null) this.timings.doChunkUnload.startTiming(); - - BaseFullChunk chunk = this.getChunk(x, z); - - if (chunk != null && chunk.getProvider() != null) { - ChunkUnloadEvent ev = new ChunkUnloadEvent(chunk); - this.server.getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - if (this.timings.doChunkUnload != null) this.timings.doChunkUnload.stopTiming(); - return false; - } - } - - try { - if (chunk != null) { - if (trySave && this.autoSave) { - int entities = 0; - for (Entity e : chunk.getEntities().values()) { - if (e instanceof Player) { - continue; - } - ++entities; - } - - if (chunk.hasChanged() || !chunk.getBlockEntities().isEmpty() || entities > 0) { - this.provider.setChunk(x, z, chunk); - this.provider.saveChunk(x, z); - } - } - for (ChunkLoader loader : this.getChunkLoaders(x, z)) { - loader.onChunkUnloaded(chunk); - } - } - this.provider.unloadChunk(x, z, safe); - } catch (Exception e) { - MainLogger logger = this.server.getLogger(); - logger.error(this.server.getLanguage().translateString("nukkit.level.chunkUnloadError", e.toString())); - logger.logException(e); - } - - if (this.timings.doChunkUnload != null) this.timings.doChunkUnload.stopTiming(); - - return true; - } - - public boolean isSpawnChunk(int X, int Z) { - Vector3 spawn = this.getSpawnLocation(); - - if (this.server.suomiCraftPEMode() && !this.randomTickingEnabled()) { - if (this.equals(this.getServer().getDefaultLevel())) { - return Math.abs(X - (spawn.getFloorX() >> 4)) <= 9 && Math.abs(Z - (spawn.getFloorZ() >> 4)) <= 9; - } - return Math.abs(X - (spawn.getFloorX() >> 4)) <= 5 && Math.abs(Z - (spawn.getFloorZ() >> 4)) <= 5; - } else { - return Math.abs(X - (spawn.getFloorX() >> 4)) <= 1 && Math.abs(Z - (spawn.getFloorZ() >> 4)) <= 1; - } - } - - public Position getSafeSpawn() { - return this.getSafeSpawn(null); - } - - public Position getSafeSpawn(Vector3 spawn) { - if (spawn == null /*|| spawn.y < 1*/) { - spawn = this.getSpawnLocation(); - } - - Vector3 pos = new Vector3(spawn.getFloorX(), (int) Math.floor(spawn.y + 0.1), spawn.getFloorZ()); - FullChunk chunk = this.getChunk((int) pos.x >> 4, (int) pos.z >> 4, false); - int x = (int) pos.x & 0x0f; - int z = (int) pos.z & 0x0f; - if (chunk != null && chunk.isGenerated()) { - int y = NukkitMath.clamp((int) pos.y, 1, 254); - boolean wasAir = chunk.getBlockId(x, y - 1, z) == 0; - for (; y > 0; --y) { - int b = chunk.getFullBlock(x, y, z); - Block block = Block.get(b >> 4, b & 0x0f); - if (this.isFullBlock(block)) { - if (wasAir) { - y++; - break; - } - } else { - wasAir = true; - } - } - - for (; y >= 0 && y < 255; y++) { - int b = chunk.getFullBlock(x, y + 1, z); - Block block = Block.get(b >> 4, b & 0x0f); - if (!this.isFullBlock(block)) { - b = chunk.getFullBlock(x, y, z); - block = Block.get(b >> 4, b & 0x0f); - if (!this.isFullBlock(block)) { - return new Position(pos.x + 0.5, pos.y + 0.1, pos.z + 0.5, this); - } - } else { - ++y; - } - } - - pos.y = y; - } - - return new Position(pos.x + 0.5, pos.y + 0.1, pos.z + 0.5, this); - } - - public int getTime() { - return time; - } - - public boolean isDaytime() { - return this.skyLightSubtracted < 4; - } - - public long getCurrentTick() { - return this.levelCurrentTick; - } - - public String getName() { - return this.provider.getName(); - } - - public String getFolderName() { - return this.folderName; - } - - public void setTime(int time) { - this.time = time; - this.sendTime(); - } - - public void stopTime() { - this.stopTime = true; - this.sendTime(); - } - - public void startTime() { - this.stopTime = false; - this.sendTime(); - } - - @Override - public long getSeed() { - return this.provider.getSeed(); - } - - public void setSeed(int seed) { - this.provider.setSeed(seed); - } - - public boolean populateChunk(int x, int z) { - return this.populateChunk(x, z, false); - } - - public boolean populateChunk(int x, int z, boolean force) { - long index = Level.chunkHash(x, z); - if (this.chunkPopulationQueue.containsKey(index) || this.chunkPopulationQueue.size() >= this.chunkPopulationQueueSize && !force) { - return false; - } - - BaseFullChunk chunk = this.getChunk(x, z, true); - boolean populate; - if (!chunk.isPopulated()) { - if (Timings.populationTimer != null) Timings.populationTimer.startTiming(); - populate = true; - for (int xx = -1; xx <= 1; ++xx) { - for (int zz = -1; zz <= 1; ++zz) { - if (this.chunkPopulationLock.containsKey(Level.chunkHash(x + xx, z + zz))) { - populate = false; - break; - } - } - } - - if (populate) { - if (!this.chunkPopulationQueue.containsKey(index)) { - this.chunkPopulationQueue.put(index, Boolean.TRUE); - for (int xx = -1; xx <= 1; ++xx) { - for (int zz = -1; zz <= 1; ++zz) { - this.chunkPopulationLock.put(Level.chunkHash(x + xx, z + zz), Boolean.TRUE); - } - } - - this.server.getScheduler().scheduleAsyncTask(new PopulationTask(this, chunk)); - } - } - if (Timings.populationTimer != null) Timings.populationTimer.stopTiming(); - return false; - } - - return true; - } - - public void generateChunk(int x, int z) { - this.generateChunk(x, z, false); - } - - public void generateChunk(int x, int z, boolean force) { - if (this.chunkGenerationQueue.size() >= this.chunkGenerationQueueSize && !force) { - return; - } - - long index = Level.chunkHash(x, z); - if (!this.chunkGenerationQueue.containsKey(index)) { - if (Timings.generationTimer != null) Timings.generationTimer.startTiming(); - this.chunkGenerationQueue.put(index, Boolean.TRUE); - GenerationTask task = new GenerationTask(this, this.getChunk(x, z, true)); - this.server.getScheduler().scheduleAsyncTask(task); - if (Timings.generationTimer != null) Timings.generationTimer.stopTiming(); - } - } - - public void regenerateChunk(int x, int z) { - this.unloadChunk(x, z, false, false); - this.cancelUnloadChunkRequest(x, z); - provider.setChunk(x, z, provider.getEmptyChunk(x, z)); - this.generateChunk(x, z); - } - - public void doChunkGarbageCollection() { - if (this.timings.doChunkGC != null) this.timings.doChunkGC.startTiming(); - // Remove all invalid block entities - if (!blockEntities.isEmpty()) { - ObjectIterator iter = blockEntities.values().iterator(); - while (iter.hasNext()) { - BlockEntity blockEntity = iter.next(); - if (blockEntity != null) { - if (!blockEntity.isValid()) { - iter.remove(); - blockEntity.close(); - } - } else { - iter.remove(); - } - } - } - - for (Map.Entry entry : provider.getLoadedChunks().entrySet()) { - long index = entry.getKey(); - if (!this.unloadQueue.containsKey(index)) { - FullChunk chunk = entry.getValue(); - int X = chunk.getX(); - int Z = chunk.getZ(); - if (!this.isSpawnChunk(X, Z)) { - this.unloadChunkRequest(X, Z, true); - } - } - } - - this.provider.doGarbageCollection(); - if (this.timings.doChunkGC != null) this.timings.doChunkGC.stopTiming(); - } - - - public void doGarbageCollection(long allocatedTime) { - long start = System.currentTimeMillis(); - if (unloadChunks(start, allocatedTime, false)) { - allocatedTime -= (System.currentTimeMillis() - start); - provider.doGarbageCollection(allocatedTime); - } - } - - public void unloadChunks() { - this.unloadChunks(false); - } - - public void unloadChunks(boolean force) { - this.unloadChunks(50, force); - } - - public void unloadChunks(int maxUnload, boolean force) { - if (!this.unloadQueue.isEmpty()) { - long now = System.currentTimeMillis(); - - int unloaded = 0; - LongList toRemove = null; - for (Long2LongMap.Entry entry : unloadQueue.long2LongEntrySet()) { - long index = entry.getLongKey(); - - if (isChunkInUse(index)) { - continue; - } - - if (!force) { - long time = entry.getLongValue(); - if (unloaded > maxUnload) { - break; - } else if (time > (now - 20000)) { - continue; - } - unloaded++; - } - - if (toRemove == null) toRemove = new LongArrayList(); - toRemove.add(index); - } - - if (toRemove != null) { - int size = toRemove.size(); - for (int i = 0; i < size; i++) { - long index = toRemove.getLong(i); - int X = getHashX(index); - int Z = getHashZ(index); - - if (this.unloadChunk(X, Z, true)) { - this.unloadQueue.remove(index); - } - } - } - } - } - - private int lastUnloadIndex; - - /** - * @param now current time - * @param allocatedTime allocated time - * @param force force - * @return true if there is allocated time remaining - */ - private boolean unloadChunks(long now, long allocatedTime, boolean force) { - if (!this.unloadQueue.isEmpty()) { - boolean result = true; - int maxIterations = this.unloadQueue.size(); - - if (lastUnloadIndex > maxIterations) lastUnloadIndex = 0; - ObjectIterator iter = this.unloadQueue.long2LongEntrySet().iterator(); - if (lastUnloadIndex != 0) iter.skip(lastUnloadIndex); - - LongList toUnload = null; - - for (int i = 0; i < maxIterations; i++) { - if (!iter.hasNext()) { - iter = this.unloadQueue.long2LongEntrySet().iterator(); - } - Long2LongMap.Entry entry = iter.next(); - - long index = entry.getLongKey(); - - if (isChunkInUse(index)) { - continue; - } - - if (!force) { - long time = entry.getLongValue(); - if (time > (now - 20000)) { - continue; - } - } - - if (toUnload == null) toUnload = new LongArrayList(); - toUnload.add(index); - } - - if (toUnload != null) { - //long[] arr = toUnload.toLongArray(); - for (long index : toUnload) { - int X = getHashX(index); - int Z = getHashZ(index); - if (this.unloadChunk(X, Z, true)) { - this.unloadQueue.remove(index); - if (System.currentTimeMillis() - now >= allocatedTime) { - result = false; - break; - } - } - } - } - return result; - } else { - return true; - } - } - - @Override - public void setMetadata(String metadataKey, MetadataValue newMetadataValue) throws Exception { - this.server.getLevelMetadata().setMetadata(this, metadataKey, newMetadataValue); - } - - @Override - public List getMetadata(String metadataKey) throws Exception { - return this.server.getLevelMetadata().getMetadata(this, metadataKey); - } - - @Override - public boolean hasMetadata(String metadataKey) throws Exception { - return this.server.getLevelMetadata().hasMetadata(this, metadataKey); - } - - @Override - public void removeMetadata(String metadataKey, Plugin owningPlugin) throws Exception { - this.server.getLevelMetadata().removeMetadata(this, metadataKey, owningPlugin); - } - - @SuppressWarnings("unused") - public void addPlayerMovement(Entity entity, double x, double y, double z, double yaw, double pitch, double headYaw) { - MovePlayerPacket pk = new MovePlayerPacket(); - pk.eid = entity.getId(); - pk.x = (float) x; - pk.y = (float) y; - pk.z = (float) z; - pk.yaw = (float) yaw; - pk.headYaw = (float) headYaw; - pk.pitch = (float) pitch; - pk.onGround = entity.onGround; - - if (entity.riding != null) { - pk.ridingEid = entity.riding.getId(); - pk.mode = MovePlayerPacket.MODE_PITCH; - } - - Server.broadcastPacket(entity.getViewers().values(), pk); - } - - public void addEntityMovement(Entity entity, double x, double y, double z, double yaw, double pitch, double headYaw) { - MoveEntityAbsolutePacket pk = new MoveEntityAbsolutePacket(); - pk.eid = entity.getId(); - pk.x = (float) x; - pk.y = (float) y; - pk.z = (float) z; - pk.yaw = (float) yaw; - pk.headYaw = (float) headYaw; - pk.pitch = (float) pitch; - pk.onGround = entity.onGround; - - for (Player p : entity.getViewers().values()) { - p.batchDataPacket(pk); // Server.broadcastPacket would only use batching for >= 1.16.100 - } - } - - public boolean isRaining() { - return this.raining; - } - - public boolean setRaining(boolean raining) { - WeatherChangeEvent ev = new WeatherChangeEvent(this, raining); - this.server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return false; - } - - this.raining = raining; - - LevelEventPacket pk = new LevelEventPacket(); - // These numbers are from Minecraft - - if (raining) { - pk.evid = LevelEventPacket.EVENT_START_RAIN; - int time = Utils.random.nextInt(12000) + 12000; - pk.data = time; - setRainTime(time); - } else { - pk.evid = LevelEventPacket.EVENT_STOP_RAIN; - setRainTime(Utils.random.nextInt(168000) + 12000); - } - - Server.broadcastPacket(this.getPlayers().values(), pk); - - return true; - } - - public int getRainTime() { - return this.rainTime; - } - - public void setRainTime(int rainTime) { - this.rainTime = rainTime; - } - - public boolean isThundering() { - return raining && this.thundering; - } - - public boolean setThundering(boolean thundering) { - ThunderChangeEvent ev = new ThunderChangeEvent(this, thundering); - this.server.getPluginManager().callEvent(ev); - - if (ev.isCancelled()) { - return false; - } - - if (thundering && !raining) { - setRaining(true); - } - - this.thundering = thundering; - - LevelEventPacket pk = new LevelEventPacket(); - // These numbers are from Minecraft - if (thundering) { - pk.evid = LevelEventPacket.EVENT_START_THUNDER; - int time = Utils.random.nextInt(12000) + 3600; - pk.data = time; - setThunderTime(time); - } else { - pk.evid = LevelEventPacket.EVENT_STOP_THUNDER; - setThunderTime(Utils.random.nextInt(168000) + 12000); - } - - Server.broadcastPacket(this.getPlayers().values(), pk); - - return true; - } - - public int getThunderTime() { - return this.thunderTime; - } - - public void setThunderTime(int thunderTime) { - this.thunderTime = thunderTime; - } - - public void sendWeather(Player[] players) { - if (players == null) { - players = this.getPlayers().values().toArray(new Player[0]); - } - - LevelEventPacket pk = new LevelEventPacket(); - - if (this.raining) { - pk.evid = LevelEventPacket.EVENT_START_RAIN; - pk.data = this.rainTime; - } else { - pk.evid = LevelEventPacket.EVENT_STOP_RAIN; - } - - Server.broadcastPacket(players, pk); - - if (this.isThundering()) { - pk.evid = LevelEventPacket.EVENT_START_THUNDER; - pk.data = this.thunderTime; - } else { - pk.evid = LevelEventPacket.EVENT_STOP_THUNDER; - } - - Server.broadcastPacket(players, pk); - } - - public void sendWeather(Player player) { - if (player != null) { - this.sendWeather(new Player[]{player}); - } - } - - public void sendWeather(Collection players) { - if (players == null) { - players = this.getPlayers().values(); - } - this.sendWeather(players.toArray(new Player[0])); - } - - public int getDimension() { - return dimension; - } - - public boolean canBlockSeeSky(Vector3 pos) { - return this.getHighestBlockAt(pos.getFloorX(), pos.getFloorZ()) < pos.getY(); - } - - public boolean canBlockSeeSky(Block block) { - return this.getHighestBlockAt((int) block.getX(), (int) block.getZ()) < block.getY(); - } - - public int getStrongPower(Vector3 pos, BlockFace direction) { - return this.getBlock(pos).getStrongPower(direction); - } - - public int getStrongPower(Vector3 pos) { - int i = 0; - - for (BlockFace face : BlockFace.values()) { - i = Math.max(i, this.getStrongPower(pos.getSide(face), face)); - - if (i >= 15) { - return i; - } - } - - return i; - } - - public boolean isSidePowered(Vector3 pos, BlockFace face) { - return this.getRedstonePower(pos, face) > 0; - } - - public int getRedstonePower(Vector3 pos, BlockFace face) { - Block block = this.getBlock(pos); - return block.isNormalBlock() ? this.getStrongPower(pos) : block.getWeakPower(face); - } - - public boolean isBlockPowered(Vector3 pos) { - for (BlockFace face : BlockFace.values()) { - if (this.getRedstonePower(pos.getSide(face), face) > 0) { - return true; - } - } - return false; - } - - public int isBlockIndirectlyGettingPowered(Vector3 pos) { - int power = 0; - - for (BlockFace face : BlockFace.values()) { - int blockPower = this.getRedstonePower(pos.getSide(face), face); - - if (blockPower >= 15) { - return 15; - } - - if (blockPower > power) { - power = blockPower; - } - } - - return power; - } - - public boolean isAreaLoaded(AxisAlignedBB bb) { - if (bb.maxY < 0 || bb.minY >= 256) { - return false; - } - int minX = NukkitMath.floorDouble(bb.minX) >> 4; - int minZ = NukkitMath.floorDouble(bb.minZ) >> 4; - int maxX = NukkitMath.floorDouble(bb.maxX) >> 4; - int maxZ = NukkitMath.floorDouble(bb.maxZ) >> 4; - - for (int x = minX; x <= maxX; ++x) { - for (int z = minZ; z <= maxZ; ++z) { - if (!this.isChunkLoaded(x, z)) { - return false; - } - } - } - - return true; - } - - public void addLevelEvent(Vector3 pos, int event) { - this.addLevelEvent(pos, event, 0); - } - - public void addLevelEvent(Vector3 pos, int event, int data) { - LevelEventPacket pk = new LevelEventPacket(); - pk.evid = event; - pk.x = (float) pos.x; - pk.y = (float) pos.y; - pk.z = (float) pos.z; - pk.data = data; - - addChunkPacket(pos.getFloorX() >> 4, pos.getFloorZ() >> 4, pk); - } - - private int getUpdateLCG() { - return (this.updateLCG = (this.updateLCG * 3) ^ LCG_CONSTANT); - } - - public boolean randomTickingEnabled() { - return this.randomTickingEnabled; - } - - public boolean isAnimalSpawningAllowedByTime() { - int time = this.getTime() % TIME_FULL; - return time < 13184 || time > 22800; - } - - public boolean isMobSpawningAllowedByTime() { - int time = this.getTime() % TIME_FULL; - return time > 13184 && time < 22800; - } - - public boolean shouldMobBurn(BaseEntity entity) { - int time = this.getTime() % TIME_FULL; - return !entity.isOnFire() && !this.raining && !entity.isBaby() && (time < 12567 || time > 23450) && !entity.isInsideOfWater() && entity.canSeeSky(); - } - - public boolean isMobSpawningAllowed() { - return !Server.disabledSpawnWorlds.contains(getName()) && gameRules.getBoolean(GameRule.DO_MOB_SPAWNING); - } - - public boolean createPortal(Block target, boolean fireCharge) { - if (this.dimension == DIMENSION_THE_END) return false; - final int maxPortalSize = 23; - final int targX = target.getFloorX(); - final int targY = target.getFloorY(); - final int targZ = target.getFloorZ(); - //check if there's air above (at least 3 blocks) - for (int i = 1; i < 4; i++) { - if (this.getBlockIdAt(targX, targY + i, targZ) != BlockID.AIR) { - return false; - } - } - int sizePosX = 0; - int sizeNegX = 0; - int sizePosZ = 0; - int sizeNegZ = 0; - for (int i = 1; i < maxPortalSize; i++) { - if (this.getBlockIdAt(targX + i, targY, targZ) == BlockID.OBSIDIAN) { - sizePosX++; - } else { - break; - } - } - for (int i = 1; i < maxPortalSize; i++) { - if (this.getBlockIdAt(targX - i, targY, targZ) == BlockID.OBSIDIAN) { - sizeNegX++; - } else { - break; - } - } - for (int i = 1; i < maxPortalSize; i++) { - if (this.getBlockIdAt(targX, targY, targZ + i) == BlockID.OBSIDIAN) { - sizePosZ++; - } else { - break; - } - } - for (int i = 1; i < maxPortalSize; i++) { - if (this.getBlockIdAt(targX, targY, targZ - i) == BlockID.OBSIDIAN) { - sizeNegZ++; - } else { - break; - } - } - //plus one for target block - int sizeX = sizePosX + sizeNegX + 1; - int sizeZ = sizePosZ + sizeNegZ + 1; - if (sizeX >= 2 && sizeX <= maxPortalSize) { - //start scan from 1 block above base - //find pillar or end of portal to start scan - int scanX = targX; - int scanY = targY + 1; - for (int i = 0; i < sizePosX + 1; i++) { - //this must be air - if (this.getBlockIdAt(scanX + i, scanY, targZ) != BlockID.AIR) { - return false; - } - if (this.getBlockIdAt(scanX + i + 1, scanY, targZ) == BlockID.OBSIDIAN) { - scanX += i; - break; - } - } - //make sure that the above loop finished - if (this.getBlockIdAt(scanX + 1, scanY, targZ) != BlockID.OBSIDIAN) { - return false; - } - - int innerWidth = 0; - LOOP: for (int i = 0; i < 21; i++) { - int id = this.getBlockIdAt(scanX - i, scanY, targZ); - switch (id) { - case BlockID.AIR: - innerWidth++; - break; - case BlockID.OBSIDIAN: - break LOOP; - default: - return false; - } - } - int innerHeight = 0; - LOOP: for (int i = 0; i < 21; i++) { - int id = this.getBlockIdAt(scanX, scanY + i, targZ); - switch (id) { - case BlockID.AIR: - innerHeight++; - break; - case BlockID.OBSIDIAN: - break LOOP; - default: - return false; - } - } - if (!(innerWidth <= 21 - && innerWidth >= 2 - && innerHeight <= 21 - && innerHeight >= 3)) { - return false; - } - - for (int height = 0; height < innerHeight + 1; height++) { - if (height == innerHeight) { - for (int width = 0; width < innerWidth; width++) { - if (this.getBlockIdAt(scanX - width, scanY + height, targZ) != BlockID.OBSIDIAN) { - return false; - } - } - } else { - if (this.getBlockIdAt(scanX + 1, scanY + height, targZ) != BlockID.OBSIDIAN - || this.getBlockIdAt(scanX - innerWidth, scanY + height, targZ) != BlockID.OBSIDIAN) { - return false; - } - - for (int width = 0; width < innerWidth; width++) { - if (this.getBlockIdAt(scanX - width, scanY + height, targZ) != BlockID.AIR) { - return false; - } - } - } - } - - for (int height = 0; height < innerHeight; height++) { - for (int width = 0; width < innerWidth; width++) { - this.setBlock(new Vector3(scanX - width, scanY + height, targZ), Block.get(BlockID.NETHER_PORTAL)); - } - } - - if (fireCharge) { - this.addSoundToViewers(target, cn.nukkit.level.Sound.MOB_GHAST_FIREBALL); - } else { - this.addLevelSoundEvent(target, LevelSoundEventPacket.SOUND_IGNITE); - } - return true; - } else if (sizeZ >= 2 && sizeZ <= maxPortalSize) { - //start scan from 1 block above base - //find pillar or end of portal to start scan - int scanY = targY + 1; - int scanZ = targZ; - for (int i = 0; i < sizePosZ + 1; i++) { - //this must be air - if (this.getBlockIdAt(targX, scanY, scanZ + i) != BlockID.AIR) { - return false; - } - if (this.getBlockIdAt(targX, scanY, scanZ + i + 1) == BlockID.OBSIDIAN) { - scanZ += i; - break; - } - } - //make sure that the above loop finished - if (this.getBlockIdAt(targX, scanY, scanZ + 1) != BlockID.OBSIDIAN) { - return false; - } - - int innerWidth = 0; - LOOP: for (int i = 0; i < 21; i++) { - int id = this.getBlockIdAt(targX, scanY, scanZ - i); - switch (id) { - case BlockID.AIR: - innerWidth++; - break; - case BlockID.OBSIDIAN: - break LOOP; - default: - return false; - } - } - int innerHeight = 0; - LOOP: for (int i = 0; i < 21; i++) { - int id = this.getBlockIdAt(targX, scanY + i, scanZ); - switch (id) { - case BlockID.AIR: - innerHeight++; - break; - case BlockID.OBSIDIAN: - break LOOP; - default: - return false; - } - } - if (!(innerWidth <= 21 - && innerWidth >= 2 - && innerHeight <= 21 - && innerHeight >= 3)) { - return false; - } - - for (int height = 0; height < innerHeight + 1; height++) { - if (height == innerHeight) { - for (int width = 0; width < innerWidth; width++) { - if (this.getBlockIdAt(targX, scanY + height, scanZ - width) != BlockID.OBSIDIAN) { - return false; - } - } - } else { - if (this.getBlockIdAt(targX, scanY + height, scanZ + 1) != BlockID.OBSIDIAN - || this.getBlockIdAt(targX, scanY + height, scanZ - innerWidth) != BlockID.OBSIDIAN) { - return false; - } - - for (int width = 0; width < innerWidth; width++) { - if (this.getBlockIdAt(targX, scanY + height, scanZ - width) != BlockID.AIR) { - return false; - } - } - } - } - - for (int height = 0; height < innerHeight; height++) { - for (int width = 0; width < innerWidth; width++) { - this.setBlock(new Vector3(targX, scanY + height, scanZ - width), Block.get(BlockID.NETHER_PORTAL)); - } - } - - if (fireCharge) { - this.addSoundToViewers(target, cn.nukkit.level.Sound.MOB_GHAST_FIREBALL); - } else { - this.addLevelSoundEvent(target, LevelSoundEventPacket.SOUND_IGNITE); - } - return true; - } - - return false; - } - - public Position calculatePortalMirror(Vector3 portal) { - Level nether = Server.getInstance().getNetherWorld(this.getName()); - if (nether == null) { - return null; - } - - double x; - double z; - if (this == nether) { - x = Math.floor(portal.getFloorX() << 3); - z = Math.floor(portal.getFloorZ() << 3); - } else { - x = Math.floor(portal.getFloorX() >> 3); - z = Math.floor(portal.getFloorZ() >> 3); - } - return new Position(x, portal.getFloorY(), z, this == nether ? Server.getInstance().getDefaultLevel() : nether); - } - - private ConcurrentMap> getChunkSendQueue(int protocol) { - int protocolId = this.getChunkProtocol(protocol); - return this.chunkSendQueues.computeIfAbsent(protocolId, i -> new ConcurrentHashMap<>()); - } - - private LongSet getChunkSendTasks(int protocol) { - int protocolId = this.getChunkProtocol(protocol); - return this.chunkSendTasks.computeIfAbsent(protocolId, i -> new LongOpenHashSet()); - } - - private int getChunkProtocol(int protocol) { - if (protocol >= ProtocolInfo.v1_17_40) { - return ProtocolInfo.v1_17_40; - } if (protocol >= ProtocolInfo.v1_17_30) { - return ProtocolInfo.v1_17_30; - } else if (protocol >= ProtocolInfo.v1_17_10) { - return ProtocolInfo.v1_17_10; - } else if (protocol >= ProtocolInfo.v1_17_0) { - return ProtocolInfo.v1_17_0; - } else if (protocol >= ProtocolInfo.v1_16_210) { - return ProtocolInfo.v1_16_210; - } else if (protocol >= ProtocolInfo.v1_16_100) { - return ProtocolInfo.v1_16_100; - } else if (protocol >= ProtocolInfo.v1_16_0 && protocol <= ProtocolInfo.v1_16_100_52) { - return ProtocolInfo.v1_16_0; - } else if (protocol == ProtocolInfo.v1_14_0 || protocol == ProtocolInfo.v1_14_60) { - return ProtocolInfo.v1_14_0; - } else if (protocol == ProtocolInfo.v1_13_0) { - return ProtocolInfo.v1_13_0; - } else if (protocol == ProtocolInfo.v1_12_0) { - return ProtocolInfo.v1_12_0; - } else if (protocol < ProtocolInfo.v1_12_0) { - return 0; - } - throw new IllegalArgumentException("Invalid chunk protocol: " + protocol); - } - - private static boolean matchMVChunkProtocol(int chunk, int player) { - if (chunk == 0) if (player < ProtocolInfo.v1_12_0) return true; - if (chunk == ProtocolInfo.v1_12_0) if (player == ProtocolInfo.v1_12_0) return true; - if (chunk == ProtocolInfo.v1_13_0) if (player == ProtocolInfo.v1_13_0) return true; - if (chunk == ProtocolInfo.v1_14_0) - if (player == ProtocolInfo.v1_14_0 || player == ProtocolInfo.v1_14_60) return true; - if (chunk == ProtocolInfo.v1_16_0) - if (player >= ProtocolInfo.v1_16_0) if (player <= ProtocolInfo.v1_16_100_52) return true; - if (chunk == ProtocolInfo.v1_16_100) - if (player >= ProtocolInfo.v1_16_100) if (player < ProtocolInfo.v1_16_210) return true; - if (chunk == ProtocolInfo.v1_16_210) - if (player >= ProtocolInfo.v1_16_210) if (player < ProtocolInfo.v1_17_0) return true; - if (chunk == ProtocolInfo.v1_17_0) if (player == ProtocolInfo.v1_17_0) return true; - if (chunk == ProtocolInfo.v1_17_10) - if (player >= ProtocolInfo.v1_17_10) if (player < ProtocolInfo.v1_17_30) return true; - if (chunk == ProtocolInfo.v1_17_30) if (player == ProtocolInfo.v1_17_30) return true; - if (chunk == ProtocolInfo.v1_17_40) if (player >= ProtocolInfo.v1_17_40) return true; - return false; // Remember to update when block palette changes - } - - private static class CharacterHashMap extends HashMap { - - @Override - public int size() { - return Character.MAX_VALUE; - } - } -} diff --git a/src/main/java/cn/nukkit/level/Location.java b/src/main/java/cn/nukkit/level/Location.java deleted file mode 100644 index a5e902685..000000000 --- a/src/main/java/cn/nukkit/level/Location.java +++ /dev/null @@ -1,208 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.LevelException; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Location extends Position { - - public double yaw; - public double pitch; - public double headYaw; - - public Location() { - this(0); - } - - public Location(double x) { - this(x, 0); - } - - public Location(double x, double y) { - this(x, y, 0); - } - - public Location(double x, double y, double z) { - this(x, y, z, 0, 0, 0, null); - } - - public Location(double x, double y, double z, Level level) { - this(x, y, z, 0, 0, 0, level); - } - - public Location(double x, double y, double z, double yaw) { - this(x, y, z, yaw, 0, 0, null); - } - - public Location(double x, double y, double z, double yaw, double pitch) { - this(x, y, z, yaw, pitch, 0, null); - } - - public Location(double x, double y, double z, double yaw, double pitch, Level level) { - this(x, y, z, yaw, pitch, 0, level); - } - - public Location(double x, double y, double z, double yaw, double pitch, double headYaw) { - this(x, y, z, yaw, pitch, headYaw, null); - } - - public Location(double x, double y, double z, double yaw, double pitch, double headYaw, Level level) { - this.x = x; - this.y = y; - this.z = z; - this.yaw = yaw; - this.pitch = pitch; - this.headYaw = headYaw; - this.level = level; - } - - public static Location fromObject(Vector3 pos) { - return fromObject(pos, null, 0.0f, 0.0f, 0.0f); - } - - public static Location fromObject(Vector3 pos, Level level) { - return fromObject(pos, level, 0.0f, 0.0f, 0.0f); - } - - public static Location fromObject(Vector3 pos, Level level, double yaw) { - return fromObject(pos, level, yaw, 0.0f, 0.0f); - } - - public static Location fromObject(Vector3 pos, Level level, double yaw, double pitch) { - return fromObject(pos, level, yaw, pitch, 0.0f); - } - - public static Location fromObject(Vector3 pos, Level level, double yaw, double pitch, double headYaw) { - return new Location(pos.x, pos.y, pos.z, yaw, pitch, headYaw, (level == null) ? ((pos instanceof Position) ? ((Position) pos).level : null) : level); - } - - public double getYaw() { - return this.yaw; - } - - public double getPitch() { - return this.pitch; - } - - public double getHeadYaw() { - return this.headYaw; - } - - public Location setYaw(double yaw) { - this.yaw = yaw; - return this; - } - - public Location setPitch(double pitch) { - this.pitch = pitch; - return this; - } - - public Location setHeadYaw(double headYaw) { - this.headYaw = headYaw; - return this; - } - - @Override - public String toString() { - return "Location (level=" + (this.isValid() ? this.getLevel().getName() : "null") + ", x=" + this.x + ", y=" + this.y + ", z=" + this.z + ", yaw=" + this.yaw + ", pitch=" + this.pitch + ", headYaw=" + this.headYaw + ')'; - } - - @Override - public Location getLocation() { - if (this.isValid()) return new Location(this.x, this.y, this.z, this.yaw, this.pitch, this.headYaw, this.level); - else throw new LevelException("Undefined Level reference"); - } - - @Override - public Location add(double x) { - return this.add(x, 0, 0); - } - - @Override - public Location add(double x, double y) { - return this.add(x, y, 0); - } - - @Override - public Location add(double x, double y, double z) { - return new Location(this.x + x, this.y + y, this.z + z, this.yaw, this.pitch, this.headYaw, this.level); - } - - @Override - public Location add(Vector3 x) { - return new Location(this.x + x.getX(), this.y + x.getY(), this.z + x.getZ(), this.yaw, this.pitch, this.headYaw, this.level); - } - - @Override - public Location subtract() { - return this.subtract(0, 0, 0); - } - - @Override - public Location subtract(double x) { - return this.subtract(x, 0, 0); - } - - @Override - public Location subtract(double x, double y) { - return this.subtract(x, y, 0); - } - - @Override - public Location subtract(double x, double y, double z) { - return this.add(-x, -y, -z); - } - - @Override - public Location subtract(Vector3 x) { - return this.add(-x.getX(), -x.getY(), -x.getZ()); - } - - @Override - public Location multiply(double number) { - return new Location(this.x * number, this.y * number, this.z * number, this.yaw, this.pitch, this.headYaw, this.level); - } - - @Override - public Location divide(double number) { - return new Location(this.x / number, this.y / number, this.z / number, this.yaw, this.pitch, this.headYaw, this.level); - } - - @Override - public Location ceil() { - return new Location((int) Math.ceil(this.x), (int) Math.ceil(this.y), (int) Math.ceil(this.z), this.yaw, this.pitch, this.headYaw, this.level); - } - - @Override - public Location floor() { - return new Location(this.getFloorX(), this.getFloorY(), this.getFloorZ(), this.yaw, this.pitch, this.headYaw, this.level); - } - - @Override - public Location round() { - return new Location(Math.round(this.x), Math.round(this.y), Math.round(this.z), this.yaw, this.pitch, this.headYaw, this.level); - } - - @Override - public Location abs() { - return new Location((int) Math.abs(this.x), (int) Math.abs(this.y), (int) Math.abs(this.z), this.yaw, this.pitch, this.headYaw, this.level); - } - - public Vector3 getDirectionVector() { - double pitch = ((this.pitch + 90) * Math.PI) / 180; - double yaw = ((this.yaw + 90) * Math.PI) / 180; - double x = Math.sin(pitch) * Math.cos(yaw); - double z = Math.sin(pitch) * Math.sin(yaw); - double y = Math.cos(pitch); - return new Vector3(x, y, z).normalize(); - } - - @Override - public Location clone() { - return (Location) super.clone(); - } -} diff --git a/src/main/java/cn/nukkit/level/MovingObjectPosition.java b/src/main/java/cn/nukkit/level/MovingObjectPosition.java deleted file mode 100644 index 8f1cc5a47..000000000 --- a/src/main/java/cn/nukkit/level/MovingObjectPosition.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.entity.Entity; -import cn.nukkit.math.Vector3; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class MovingObjectPosition { - - /** - * 0 = block, 1 = entity - */ - public int typeOfHit; - - public int blockX; - public int blockY; - public int blockZ; - - /** - * Which side was hit. If its -1 then it went the full length of the ray trace. - * Bottom = 0, Top = 1, East = 2, West = 3, North = 4, South = 5. - */ - public int sideHit; - - public Vector3 hitVector; - - public Entity entityHit; - - public static MovingObjectPosition fromBlock(int x, int y, int z, int side, Vector3 hitVector) { - MovingObjectPosition objectPosition = new MovingObjectPosition(); - objectPosition.typeOfHit = 0; - objectPosition.blockX = x; - objectPosition.blockY = y; - objectPosition.blockZ = z; - objectPosition.hitVector = new Vector3(hitVector.x, hitVector.y, hitVector.z); - return objectPosition; - } - - public static MovingObjectPosition fromEntity(Entity entity) { - MovingObjectPosition objectPosition = new MovingObjectPosition(); - objectPosition.typeOfHit = 1; - objectPosition.entityHit = entity; - objectPosition.hitVector = new Vector3(entity.x, entity.y, entity.z); - return objectPosition; - } -} diff --git a/src/main/java/cn/nukkit/level/ParticleEffect.java b/src/main/java/cn/nukkit/level/ParticleEffect.java deleted file mode 100644 index bb8743fa8..000000000 --- a/src/main/java/cn/nukkit/level/ParticleEffect.java +++ /dev/null @@ -1,146 +0,0 @@ -package cn.nukkit.level; - -public enum ParticleEffect { - - ARROWSPELL("minecraft:arrow_spell_emitter"), - BALLOON_GAS("minecraft:balloon_gas_particle"), - BASIC_BUBBLE("minecraft:basic_bubble_particle"), - BASIC_BUBBLE_MANUAL("minecraft:basic_bubble_particle_manual"), - BASIC_CRIT("minecraft:basic_crit_particle"), - BASIC_FLAME("minecraft:basic_flame_particle"), - BASIC_PORTAL("minecraft:basic_portal_particle"), - BASIC_SMOKE("minecraft:basic_smoke_particle"), - BLEACH("minecraft:bleach"), - BLOCK_DESTRUCT("minecraft:block_destruct"), - BLOCK_SLIDE("minecraft:block_slide"), - BLUE_FLAME("minecraft:blue_flame_particle"), - BREAKING_ITEM_ICON("minecraft:breaking_item_icon"), - BREAKING_ITEM_TERRAIN("minecraft:breaking_item_terrain"), - BUBBLE_COLUMN_BUBBLE("minecraft:bubble_column_bubble"), - BUBBLE_COLUMN_DOWN("minecraft:bubble_column_down_particle"), - BUBBLE_COLUMN_UP("minecraft:bubble_column_up_particle"), - CAMERA_SHOOT_EXPLOSION("minecraft:camera_shoot_explosion"), - CAMPFIRE_SMOKE("minecraft:campfire_smoke_particle"), - CAMPFIRE_SMOKE_TALL("minecraft:campfire_tall_smoke_particle"), - CANDLE_FLAME("minecraft:candle_flame_particle"), - CAULDRONSPELL("minecraft:cauldron_spell_emitter"), - CAULDRON_BUBBLE("minecraft:cauldron_bubble_particle"), - CAULDRON_SPLASH("minecraft:cauldron_splash_particle"), - COLORED_FLAME("minecraft:colored_flame_particle"), - CONDUIT("minecraft:conduit_particle"), - CONDUIT_ABSORB("minecraft:conduit_absorb_particle"), - CONDUIT_ATTACK("minecraft:conduit_attack_emitter"), - CRITICAL_HIT("minecraft:critical_hit_emitter"), - CROP_GROWTH("minecraft:crop_growth_emitter"), - CROP_GROWTH_AREA("minecraft:crop_growth_area_emitter"), - DOLPHIN_MOVE("minecraft:dolphin_move_particle"), - DRAGON_BREATH_FIRE("minecraft:dragon_breath_fire"), - DRAGON_BREATH_LINGERING("minecraft:dragon_breath_lingering"), - DRAGON_BREATH_TRAIL("minecraft:dragon_breath_trail"), - DRAGON_DEATH_EXPLOSION("minecraft:dragon_death_explosion_emitter"), - DRAGON_DESTROY_BLOCK("minecraft:dragon_destroy_block"), - DRAGON_DYING_EXPLOSION("minecraft:dragon_dying_explosion"), - DRIPSTONE_LAVA_DRIP("minecraft:stalactite_lava_drip_particle"), - DRIPSTONE_WATER_DRIP("minecraft:stalactite_water_drip_particle"), - ELECTRIC_SPARK("minecraft:electric_spark_particle"), - ENCHANTING_TABLE_PARTICLE("minecraft:enchanting_table_particle"), - ENDROD("minecraft:endrod"), - END_CHEST("minecraft:end_chest"), - EVAPORATION_ELEPHANT_TOOTHPASTE("minecraft:elephant_tooth_paste_vapor_particle"), - EVOCATION_FANG("minecraft:evocation_fang_particle"), - EVOKER_SPELL("minecraft:evoker_spell"), - EXPLOSION_CAULDRON("minecraft:cauldron_explosion_emitter"), - EXPLOSION_DEATH("minecraft:death_explosion_emitter"), - EXPLOSION_EGG_DESTROY("minecraft:egg_destroy_emitter"), - EXPLOSION_EYEOFENDER_DEATH("minecraft:eyeofender_death_explode_particle"), - EXPLOSION_LABTABLE_FIRE("minecraft:misc_fire_vapor_particle"), - EXPLOSION_LEVEL("minecraft:explosion_particle"), - EXPLOSION_MANUAL("minecraft:explosion_manual"), - EYE_OF_ENDER_BUBBLE("minecraft:eye_of_ender_bubble_particle"), - FALLING_BORDER_DUST("minecraft:falling_border_dust_particle"), - FALLING_DUST("minecraft:falling_dust"), - FALLING_DUST_CONCRETE_POWDER("minecraft:falling_dust_concrete_powder_particle"), - FALLING_DUST_DRAGON_EGG("minecraft:falling_dust_dragon_egg_particle"), - FALLING_DUST_GRAVEL("minecraft:falling_dust_gravel_particle"), - FALLING_DUST_RED_SAND("minecraft:falling_dust_red_sand_particle"), - FALLING_DUST_SAND("minecraft:falling_dust_sand_particle"), - FALLING_DUST_SCAFFOLDING("minecraft:falling_dust_scaffolding_particle"), - FALLING_DUST_TOP_SNOW("minecraft:falling_dust_top_snow_particle"), - FISH_HOOK("minecraft:fish_hook_particle"), - FISH_POS("minecraft:fish_pos_particle"), - GLOW("minecraft:glow_particle"), - GUARDIAN_ATTACK("minecraft:guardian_attack_particle"), - GUARDIAN_WATER_MOVE("minecraft:guardian_water_move_particle"), - HEART("minecraft:heart_particle"), - HONEY_DRIP("minecraft:honey_drip_particle"), - HUGE_EXPLOSION_LAB_MISC("minecraft:huge_explosion_lab_misc_emitter"), - HUGE_EXPLOSION_LEVEL("minecraft:huge_explosion_emitter"), - ICE_EVAPORATION("minecraft:ice_evaporation_emitter"), - INK("minecraft:ink_emitter"), - KNOCKBACK_ROAR("minecraft:knockback_roar_particle"), - LAB_TABLE_HEATBLOCK_DUST("minecraft:lab_table_heatblock_dust_particle"), - LAB_TABLE_MISC_MYSTICAL("minecraft:lab_table_misc_mystical_particle"), - LARGE_EXPLOSION_LEVEL("minecraft:large_explosion"), - LAVA_DRIP("minecraft:lava_drip_particle"), - LAVA_PARTICLE("minecraft:lava_particle"), - LLAMA_SPIT("minecraft:llama_spit_smoke"), - MAGNESIUM_SALTS("minecraft:magnesium_salts_emitter"), - MOBFLAME("minecraft:mobflame_emitter"), - MOBFLAME_SINGLE("minecraft:mobflame_single"), - MOBSPELL("minecraft:mobspell_emitter"), - MOB_BLOCK_SPAWN("minecraft:mob_block_spawn_emitter"), - MOB_PORTAL("minecraft:mob_portal"), - MYCELIUM_DUST("minecraft:mycelium_dust_particle"), - NECTAR_DRIP("minecraft:nectar_drip_particle"), - NOTE("minecraft:note_particle"), - OBSIDIAN_GLOW_DUST("minecraft:obsidian_glow_dust_particle"), - OBSIDIAN_TEAR("minecraft:obsidian_tear_particle"), - PHANTOM_TRAIL("minecraft:phantom_trail_particle"), - PORTAL_DIRECTIONAL("minecraft:portal_directional"), - PORTAL_EAST_WEST("minecraft:portal_east_west"), - PORTAL_NORTH_SOUTH("minecraft:portal_north_south"), - PORTAL_REVERSE("minecraft:portal_reverse_particle"), - RAIN_SPLASH("minecraft:rain_splash_particle"), - REDSTONE_ORE_DUST("minecraft:redstone_ore_dust_particle"), - REDSTONE_REPEATER_DUST("minecraft:redstone_repeater_dust_particle"), - REDSTONE_TORCH_DUST("minecraft:redstone_torch_dust_particle"), - REDSTONE_WIRE_DUST("minecraft:redstone_wire_dust_particle"), - RISING_BORDER_DUST("minecraft:rising_border_dust_particle"), - SHULKER_BULLET("minecraft:shulker_bullet"), - SILVERFISH_GRIEF("minecraft:silverfish_grief_emitter"), - SNOWFLAKE("minecraft:snowflake_particle"), - SOUL("minecraft:soul_particle"), - SPARKLER("minecraft:sparkler_emitter"), - SPLASHPOTIONSPELL("minecraft:splash_spell_emitter"), - SPONGE_ABSORB_BUBBLE("minecraft:sponge_absorb_water_particle"), - SPORE_BLOSSOM_AMBIENT_BLOCK_ACTOR("minecraft:spore_blossom_ambient_particle"), - SPORE_BLOSSOM_SHOWER("minecraft:spore_blossom_shower_particle"), - SQUID_FLEE("minecraft:squid_flee_particle"), - SQUID_INK_BUBBLE("minecraft:squid_ink_bubble"), - SQUID_MOVE("minecraft:squid_move_particle"), - STUNNED("minecraft:stunned_emitter"), - TOTEM("minecraft:totem_particle"), - TOTEM_MANUAL("minecraft:totem_manual"), - UNDERWATER_TORCH_BUBBLE("minecraft:underwater_torch_particle"), - VILLAGER_ANGRY("minecraft:villager_angry"), - VILLAGER_HAPPY("minecraft:villager_happy"), - WATER_DRIP("minecraft:water_drip_particle"), - WATER_EVAPORATION_ACTOR("minecraft:water_evaporation_actor_emitter"), - WATER_EVAPORATION_BUCKET("minecraft:water_evaporation_bucket_emitter"), - WATER_EVAPORATION_MANUAL("minecraft:water_evaporation_manual"), - WATER_SPASH_MANUAL("minecraft:water_splash_particle_manual"), - WATER_SPLASH("minecraft:water_splash_particle"), - WATER_WAKE("minecraft:water_wake_particle"), - WAX("minecraft:wax_particle"), - WITHER_BOSS_INVULNERABLE("minecraft:wither_boss_invulnerable"); - - private final String identifier; - - ParticleEffect(String identifier) { - this.identifier = identifier; - } - - public String getIdentifier() { - return this.identifier; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/Position.java b/src/main/java/cn/nukkit/level/Position.java deleted file mode 100644 index 5f0d34892..000000000 --- a/src/main/java/cn/nukkit/level/Position.java +++ /dev/null @@ -1,186 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.LevelException; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Position extends Vector3 { - - public Level level; - - public Position() { - this(0, 0, 0, null); - } - - public Position(double x) { - this(x, 0, 0, null); - } - - public Position(double x, double y) { - this(x, y, 0, null); - } - - public Position(double x, double y, double z) { - this(x, y, z, null); - } - - public Position(double x, double y, double z, Level level) { - this.x = x; - this.y = y; - this.z = z; - this.level = level; - } - - public static Position fromObject(Vector3 pos) { - return fromObject(pos, null); - } - - public static Position fromObject(Vector3 pos, Level level) { - return new Position(pos.x, pos.y, pos.z, level); - } - - public Level getLevel() { - return this.level; - } - - public Position setLevel(Level level) { - this.level = level; - return this; - } - - public boolean isValid() { - return this.level != null; - } - - public boolean setStrong() { - return false; - } - - public boolean setWeak() { - return false; - } - - public Position getSide(BlockFace face) { - return this.getSide(face, 1); - } - - public Position getSide(BlockFace face, int step) { - if (!this.isValid()) { - throw new LevelException("Undefined Level reference"); - } - return Position.fromObject(super.getSide(face, step), this.level); - } - - @Override - public String toString() { - return "Position(level=" + (this.isValid() ? this.level.getName() : "null") + ",x=" + this.x + ",y=" + this.y + ",z=" + this.z + ')'; - } - - @Override - public Position setComponents(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - return this; - } - - public Block getLevelBlock() { - if (this.isValid()) return this.level.getBlock(this); - else throw new LevelException("Undefined Level reference"); - } - - public Location getLocation() { - if (this.isValid()) return new Location(this.x, this.y, this.z, 0, 0, this.level); - else throw new LevelException("Undefined Level reference"); - } - - @Override - public Position add(double x) { - return this.add(x, 0, 0); - } - - @Override - public Position add(double x, double y) { - return this.add(x, y, 0); - } - - @Override - public Position add(double x, double y, double z) { - return new Position(this.x + x, this.y + y, this.z + z, this.level); - } - - @Override - public Position add(Vector3 x) { - return new Position(this.x + x.getX(), this.y + x.getY(), this.z + x.getZ(), this.level); - } - - @Override - public Position subtract() { - return this.subtract(0, 0, 0); - } - - @Override - public Position subtract(double x) { - return this.subtract(x, 0, 0); - } - - @Override - public Position subtract(double x, double y) { - return this.subtract(x, y, 0); - } - - @Override - public Position subtract(double x, double y, double z) { - return this.add(-x, -y, -z); - } - - @Override - public Position subtract(Vector3 x) { - return this.add(-x.getX(), -x.getY(), -x.getZ()); - } - - @Override - public Position multiply(double number) { - return new Position(this.x * number, this.y * number, this.z * number, this.level); - } - - @Override - public Position divide(double number) { - return new Position(this.x / number, this.y / number, this.z / number, this.level); - } - - @Override - public Position ceil() { - return new Position((int) Math.ceil(this.x), (int) Math.ceil(this.y), (int) Math.ceil(this.z), this.level); - } - - @Override - public Position floor() { - return new Position(this.getFloorX(), this.getFloorY(), this.getFloorZ(), this.level); - } - - @Override - public Position round() { - return new Position(Math.round(this.x), Math.round(this.y), Math.round(this.z), this.level); - } - - @Override - public Position abs() { - return new Position((int) Math.abs(this.x), (int) Math.abs(this.y), (int) Math.abs(this.z), this.level); - } - - @Override - public Position clone() { - return (Position) super.clone(); - } - - public FullChunk getChunk() { - return isValid() ? level.getChunk(getChunkX(), getChunkZ()) : null; - } -} diff --git a/src/main/java/cn/nukkit/level/SimpleChunkManager.java b/src/main/java/cn/nukkit/level/SimpleChunkManager.java deleted file mode 100644 index fab12a9cb..000000000 --- a/src/main/java/cn/nukkit/level/SimpleChunkManager.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.format.generic.BaseFullChunk; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class SimpleChunkManager implements ChunkManager { - - protected Long2ObjectOpenHashMap chunks = new Long2ObjectOpenHashMap<>(); - - protected long seed; - - public SimpleChunkManager(long seed) { - this.seed = seed; - } - - @Override - public int getBlockIdAt(int x, int y, int z) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - return chunk.getBlockId(x & 0xf, y & 0xff, z & 0xf); - } - return 0; - } - - @Override - public void setBlockIdAt(int x, int y, int z, int id) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - chunk.setBlockId(x & 0xf, y & 0xff, z & 0xf, id); - } - } - - @Override - public void setBlockAt(int x, int y, int z, int id, int data) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - chunk.setBlock(x & 0xf, y & 0xff, z & 0xf, id, data); - } - } - - @Override - public void setBlockFullIdAt(int x, int y, int z, int fullId) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - chunk.setFullBlockId(x & 0xf, y & 0xff, z & 0xf, fullId); - } - } - - @Override - public int getBlockDataAt(int x, int y, int z) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - return chunk.getBlockData(x & 0xf, y & 0xff, z & 0xf); - } - return 0; - } - - @Override - public void setBlockDataAt(int x, int y, int z, int data) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - chunk.setBlockData(x & 0xf, y & 0xff, z & 0xf, data); - } - } - - @Override - public BaseFullChunk getChunk(int chunkX, int chunkZ) { - long index = Level.chunkHash(chunkX, chunkZ); - return this.chunks.containsKey(index) ? (BaseFullChunk) this.chunks.get(index) : null; - } - - @Override - public void setChunk(int chunkX, int chunkZ) { - this.setChunk(chunkX, chunkZ, null); - } - - @Override - public void setChunk(int chunkX, int chunkZ, BaseFullChunk chunk) { - if (chunk == null) { - this.chunks.remove(Level.chunkHash(chunkX, chunkZ)); - return; - } - this.chunks.put(Level.chunkHash(chunkX, chunkZ), chunk); - } - - public void cleanChunks() { - this.chunks.clear(); - } - - @Override - public long getSeed() { - return seed; - } - - public void setSeed(long seed) { - this.seed = seed; - } - - public void cleanChunks(long seed) { - this.seed = seed; - } -} diff --git a/src/main/java/cn/nukkit/level/Sound.java b/src/main/java/cn/nukkit/level/Sound.java deleted file mode 100644 index 64da8fe8c..000000000 --- a/src/main/java/cn/nukkit/level/Sound.java +++ /dev/null @@ -1,997 +0,0 @@ -package cn.nukkit.level; - -/** - * @author CreeperFace - */ -public enum Sound { - - AMBIENT_BASALT_DELTAS_ADDITIONS("ambient.basalt_deltas.additions"), - AMBIENT_BASALT_DELTAS_LOOP("ambient.basalt_deltas.loop"), - AMBIENT_BASALT_DELTAS_MOOD("ambient.basalt_deltas.mood"), - AMBIENT_CANDLE("ambient.candle"), - AMBIENT_CAVE("ambient.cave"), - AMBIENT_CRIMSON_FOREST_ADDITIONS("ambient.crimson_forest.additions"), - AMBIENT_CRIMSON_FOREST_LOOP("ambient.crimson_forest.loop"), - AMBIENT_CRIMSON_FOREST_MOOD("ambient.crimson_forest.mood"), - AMBIENT_NETHER_WASTES_ADDITIONS("ambient.nether_wastes.additions"), - AMBIENT_NETHER_WASTES_LOOP("ambient.nether_wastes.loop"), - AMBIENT_NETHER_WASTES_MOOD("ambient.nether_wastes.mood"), - AMBIENT_SOULSAND_VALLEY_ADDITIONS("ambient.soulsand_valley.additions"), - AMBIENT_SOULSAND_VALLEY_LOOP("ambient.soulsand_valley.loop"), - AMBIENT_SOULSAND_VALLEY_MOOD("ambient.soulsand_valley.mood"), - AMBIENT_WARPED_FOREST_ADDITIONS("ambient.warped_forest.additions"), - AMBIENT_WARPED_FOREST_LOOP("ambient.warped_forest.loop"), - AMBIENT_WARPED_FOREST_MOOD("ambient.warped_forest.mood"), - AMBIENT_WEATHER_LIGHTNING_IMPACT("ambient.weather.lightning.impact"), - AMBIENT_WEATHER_RAIN("ambient.weather.rain"), - AMBIENT_WEATHER_THUNDER("ambient.weather.thunder"), - ARMOR_EQUIP_CHAIN("armor.equip_chain"), - ARMOR_EQUIP_DIAMOND("armor.equip_diamond"), - ARMOR_EQUIP_GENERIC("armor.equip_generic"), - ARMOR_EQUIP_GOLD("armor.equip_gold"), - ARMOR_EQUIP_IRON("armor.equip_iron"), - ARMOR_EQUIP_LEATHER("armor.equip_leather"), - ARMOR_EQUIP_NETHERITE("armor.equip_netherite"), - BEACON_ACTIVATE("beacon.activate"), - BEACON_AMBIENT("beacon.ambient"), - BEACON_DEACTIVATE("beacon.deactivate"), - BEACON_POWER("beacon.power"), - BLOCK_BAMBOO_BREAK("block.bamboo.break"), - BLOCK_BAMBOO_FALL("block.bamboo.fall"), - BLOCK_BAMBOO_HIT("block.bamboo.hit"), - BLOCK_BAMBOO_PLACE("block.bamboo.place"), - BLOCK_BAMBOO_STEP("block.bamboo.step"), - BLOCK_BAMBOO_SAPLING_BREAK("block.bamboo_sapling.break"), - BLOCK_BAMBOO_SAPLING_PLACE("block.bamboo_sapling.place"), - BLOCK_BARREL_CLOSE("block.barrel.close"), - BLOCK_BARREL_OPEN("block.barrel.open"), - BLOCK_BEEHIVE_DRIP("block.beehive.drip"), - BLOCK_BEEHIVE_ENTER("block.beehive.enter"), - BLOCK_BEEHIVE_EXIT("block.beehive.exit"), - BLOCK_BEEHIVE_SHEAR("block.beehive.shear"), - BLOCK_BEEHIVE_WORK("block.beehive.work"), - BLOCK_BELL_HIT("block.bell.hit"), - BLOCK_BLASTFURNACE_FIRE_CRACKLE("block.blastfurnace.fire_crackle"), - BLOCK_BOWHIT("block.bowhit"), - BLOCK_CAMPFIRE_CRACKLE("block.campfire.crackle"), - BLOCK_CARTOGRAPHY_TABLE_USE("block.cartography_table.use"), - BLOCK_CHORUSFLOWER_DEATH("block.chorusflower.death"), - BLOCK_CHORUSFLOWER_GROW("block.chorusflower.grow"), - BLOCK_CLICK("block.click"), - BLOCK_COMPOSTER_EMPTY("block.composter.empty"), - BLOCK_COMPOSTER_FILL("block.composter.fill"), - BLOCK_COMPOSTER_FILL_SUCCESS("block.composter.fill_success"), - BLOCK_COMPOSTER_READY("block.composter.ready"), - BLOCK_END_PORTAL_SPAWN("block.end_portal.spawn"), - BLOCK_END_PORTAL_FRAME_FILL("block.end_portal_frame.fill"), - BLOCK_FALSE_PERMISSIONS("block.false_permissions"), - BLOCK_FURNACE_LIT("block.furnace.lit"), - BLOCK_GRINDSTONE_USE("block.grindstone.use"), - BLOCK_ITEMFRAME_ADD_ITEM("block.itemframe.add_item"), - BLOCK_ITEMFRAME_BREAK("block.itemframe.break"), - BLOCK_ITEMFRAME_PLACE("block.itemframe.place"), - BLOCK_ITEMFRAME_REMOVE_ITEM("block.itemframe.remove_item"), - BLOCK_ITEMFRAME_ROTATE_ITEM("block.itemframe.rotate_item"), - BLOCK_LANTERN_BREAK("block.lantern.break"), - BLOCK_LANTERN_FALL("block.lantern.fall"), - BLOCK_LANTERN_HIT("block.lantern.hit"), - BLOCK_LANTERN_PLACE("block.lantern.place"), - BLOCK_LANTERN_STEP("block.lantern.step"), - BLOCK_LOOM_USE("block.loom.use"), - BLOCK_SCAFFOLDING_BREAK("block.scaffolding.break"), - BLOCK_SCAFFOLDING_CLIMB("block.scaffolding.climb"), - BLOCK_SCAFFOLDING_FALL("block.scaffolding.fall"), - BLOCK_SCAFFOLDING_HIT("block.scaffolding.hit"), - BLOCK_SCAFFOLDING_PLACE("block.scaffolding.place"), - BLOCK_SCAFFOLDING_STEP("block.scaffolding.step"), - BLOCK_SMOKER_SMOKE("block.smoker.smoke"), - BLOCK_STONECUTTER_USE("block.stonecutter.use"), - BLOCK_SWEET_BERRY_BUSH_BREAK("block.sweet_berry_bush.break"), - BLOCK_SWEET_BERRY_BUSH_HURT("block.sweet_berry_bush.hurt"), - BLOCK_SWEET_BERRY_BUSH_PICK("block.sweet_berry_bush.pick"), - BLOCK_SWEET_BERRY_BUSH_PLACE("block.sweet_berry_bush.place"), - BLOCK_TURTLE_EGG_BREAK("block.turtle_egg.break"), - BLOCK_TURTLE_EGG_CRACK("block.turtle_egg.crack"), - BLOCK_TURTLE_EGG_DROP("block.turtle_egg.drop"), - BOTTLE_DRAGONBREATH("bottle.dragonbreath"), - BREAK_AMETHYST_BLOCK("break.amethyst_block"), - BREAK_AMETHYST_CLUSTER("break.amethyst_cluster"), - BREAK_AZALEA("break.azalea"), - BREAK_BIG_DRIPLEAF("break.big_dripleaf"), - BREAK_CALCITE("break.calcite"), - BREAK_DIRT_WITH_ROOTS("break.dirt_with_roots"), - BREAK_DRIPSTONE_BLOCK("break.dripstone_block"), - BREAK_HANGING_ROOTS("break.hanging_roots"), - BREAK_LARGE_AMETHYST_BUD("break.large_amethyst_bud"), - BREAK_MEDIUM_AMETHYST_BUD("break.medium_amethyst_bud"), - BREAK_POINTED_DRIPSTONE("break.pointed_dripstone"), - BREAK_SMALL_AMETHYST_BUD("break.small_amethyst_bud"), - BREAK_SPORE_BLOSSOM("break.spore_blossom"), - BREAK_TUFF("break.tuff"), - BUBBLE_DOWN("bubble.down"), - BUBBLE_DOWNINSIDE("bubble.downinside"), - BUBBLE_POP("bubble.pop"), - BUBBLE_UP("bubble.up"), - BUBBLE_UPINSIDE("bubble.upinside"), - BUCKET_EMPTY_FISH("bucket.empty_fish"), - BUCKET_EMPTY_LAVA("bucket.empty_lava"), - BUCKET_EMPTY_POWDER_SNOW("bucket.empty_powder_snow"), - BUCKET_EMPTY_WATER("bucket.empty_water"), - BUCKET_FILL_FISH("bucket.fill_fish"), - BUCKET_FILL_LAVA("bucket.fill_lava"), - BUCKET_FILL_POWDER_SNOW("bucket.fill_powder_snow"), - BUCKET_FILL_WATER("bucket.fill_water"), - CAKE_ADD_CANDLE("cake.add_candle"), - CAMERA_TAKE_PICTURE("camera.take_picture"), - CAULDRON_ADDDYE("cauldron.adddye"), - CAULDRON_CLEANARMOR("cauldron.cleanarmor"), - CAULDRON_CLEANBANNER("cauldron.cleanbanner"), - CAULDRON_DYEARMOR("cauldron.dyearmor"), - CAULDRON_EXPLODE("cauldron.explode"), - CAULDRON_FILLPOTION("cauldron.fillpotion"), - CAULDRON_FILLWATER("cauldron.fillwater"), - CAULDRON_TAKEPOTION("cauldron.takepotion"), - CAULDRON_TAKEWATER("cauldron.takewater"), - CAULDRON_DRIP_LAVA_POINTED_DRIPSTONE("cauldron_drip.lava.pointed_dripstone"), - CAULDRON_DRIP_WATER_POINTED_DRIPSTONE("cauldron_drip.water.pointed_dripstone"), - CHIME_AMETHYST_BLOCK("chime.amethyst_block"), - COMPONENT_JUMP_TO_BLOCK("component.jump_to_block"), - CONDUIT_ACTIVATE("conduit.activate"), - CONDUIT_AMBIENT("conduit.ambient"), - CONDUIT_ATTACK("conduit.attack"), - CONDUIT_DEACTIVATE("conduit.deactivate"), - CONDUIT_SHORT("conduit.short"), - COPPER_WAX_OFF("copper.wax.off"), - COPPER_WAX_ON("copper.wax.on"), - CROSSBOW_LOADING_END("crossbow.loading.end"), - CROSSBOW_LOADING_MIDDLE("crossbow.loading.middle"), - CROSSBOW_LOADING_START("crossbow.loading.start"), - CROSSBOW_QUICK_CHARGE_END("crossbow.quick_charge.end"), - CROSSBOW_QUICK_CHARGE_MIDDLE("crossbow.quick_charge.middle"), - CROSSBOW_QUICK_CHARGE_START("crossbow.quick_charge.start"), - CROSSBOW_SHOOT("crossbow.shoot"), - DAMAGE_FALLBIG("damage.fallbig"), - DAMAGE_FALLSMALL("damage.fallsmall"), - DIG_ANCIENT_DEBRIS("dig.ancient_debris"), - DIG_AZALEA_LEAVES("dig.azalea_leaves"), - DIG_BASALT("dig.basalt"), - DIG_BONE_BLOCK("dig.bone_block"), - DIG_CANDLE("dig.candle"), - DIG_CAVE_VINES("dig.cave_vines"), - DIG_CHAIN("dig.chain"), - DIG_CLOTH("dig.cloth"), - DIG_COPPER("dig.copper"), - DIG_CORAL("dig.coral"), - DIG_DEEPSLATE("dig.deepslate"), - DIG_DEEPSLATE_BRICKS("dig.deepslate_bricks"), - DIG_FUNGUS("dig.fungus"), - DIG_GRASS("dig.grass"), - DIG_GRAVEL("dig.gravel"), - DIG_HONEY_BLOCK("dig.honey_block"), - DIG_LODESTONE("dig.lodestone"), - DIG_MOSS("dig.moss"), - DIG_NETHER_BRICK("dig.nether_brick"), - DIG_NETHER_GOLD_ORE("dig.nether_gold_ore"), - DIG_NETHER_SPROUTS("dig.nether_sprouts"), - DIG_NETHER_WART("dig.nether_wart"), - DIG_NETHERITE("dig.netherite"), - DIG_NETHERRACK("dig.netherrack"), - DIG_NYLIUM("dig.nylium"), - DIG_POWDER_SNOW("dig.powder_snow"), - DIG_ROOTS("dig.roots"), - DIG_SAND("dig.sand"), - DIG_SHROOMLIGHT("dig.shroomlight"), - DIG_SNOW("dig.snow"), - DIG_SOUL_SAND("dig.soul_sand"), - DIG_SOUL_SOIL("dig.soul_soil"), - DIG_STEM("dig.stem"), - DIG_STONE("dig.stone"), - DIG_VINES("dig.vines"), - DIG_WOOD("dig.wood"), - DRIP_LAVA_POINTED_DRIPSTONE("drip.lava.pointed_dripstone"), - DRIP_WATER_POINTED_DRIPSTONE("drip.water.pointed_dripstone"), - ELYTRA_LOOP("elytra.loop"), - ENTITY_ZOMBIE_CONVERTED_TO_DROWNED("entity.zombie.converted_to_drowned"), - EXTINGUISH_CANDLE("extinguish.candle"), - FALL_AMETHYST_BLOCK("fall.amethyst_block"), - FALL_AMETHYST_CLUSTER("fall.amethyst_cluster"), - FALL_ANCIENT_DEBRIS("fall.ancient_debris"), - FALL_AZALEA("fall.azalea"), - FALL_AZALEA_LEAVES("fall.azalea_leaves"), - FALL_BASALT("fall.basalt"), - FALL_BIG_DRIPLEAF("fall.big_dripleaf"), - FALL_BONE_BLOCK("fall.bone_block"), - FALL_CALCITE("fall.calcite"), - FALL_CAVE_VINES("fall.cave_vines"), - FALL_CHAIN("fall.chain"), - FALL_CLOTH("fall.cloth"), - FALL_COPPER("fall.copper"), - FALL_CORAL("fall.coral"), - FALL_DEEPSLATE("fall.deepslate"), - FALL_DEEPSLATE_BRICKS("fall.deepslate_bricks"), - FALL_DIRT_WITH_ROOTS("fall.dirt_with_roots"), - FALL_DRIPSTONE_BLOCK("fall.dripstone_block"), - FALL_EGG("fall.egg"), - FALL_GRASS("fall.grass"), - FALL_GRAVEL("fall.gravel"), - FALL_HANGING_ROOTS("fall.hanging_roots"), - FALL_HONEY_BLOCK("fall.honey_block"), - FALL_LADDER("fall.ladder"), - FALL_MOSS("fall.moss"), - FALL_NETHER_BRICK("fall.nether_brick"), - FALL_NETHER_GOLD_ORE("fall.nether_gold_ore"), - FALL_NETHER_SPROUTS("fall.nether_sprouts"), - FALL_NETHER_WART("fall.nether_wart"), - FALL_NETHERITE("fall.netherite"), - FALL_NETHERRACK("fall.netherrack"), - FALL_NYLIUM("fall.nylium"), - FALL_POINTED_DRIPSTONE("fall.pointed_dripstone"), - FALL_POWDER_SNOW("fall.powder_snow"), - FALL_ROOTS("fall.roots"), - FALL_SAND("fall.sand"), - FALL_SHROOMLIGHT("fall.shroomlight"), - FALL_SLIME("fall.slime"), - FALL_SNOW("fall.snow"), - FALL_SOUL_SAND("fall.soul_sand"), - FALL_SOUL_SOIL("fall.soul_soil"), - FALL_SPORE_BLOSSOM("fall.spore_blossom"), - FALL_STEM("fall.stem"), - FALL_STONE("fall.stone"), - FALL_TUFF("fall.tuff"), - FALL_VINES("fall.vines"), - FALL_WOOD("fall.wood"), - FIRE_FIRE("fire.fire"), - FIRE_IGNITE("fire.ignite"), - FIREWORK_BLAST("firework.blast"), - FIREWORK_LARGE_BLAST("firework.large_blast"), - FIREWORK_LAUNCH("firework.launch"), - FIREWORK_SHOOT("firework.shoot"), - FIREWORK_TWINKLE("firework.twinkle"), - GAME_PLAYER_ATTACK_NODAMAGE("game.player.attack.nodamage"), - GAME_PLAYER_ATTACK_STRONG("game.player.attack.strong"), - GAME_PLAYER_DIE("game.player.die"), - GAME_PLAYER_HURT("game.player.hurt"), - HIT_AMETHYST_BLOCK("hit.amethyst_block"), - HIT_AMETHYST_CLUSTER("hit.amethyst_cluster"), - HIT_ANCIENT_DEBRIS("hit.ancient_debris"), - HIT_ANVIL("hit.anvil"), - HIT_AZALEA("hit.azalea"), - HIT_AZALEA_LEAVES("hit.azalea_leaves"), - HIT_BASALT("hit.basalt"), - HIT_BIG_DRIPLEAF("hit.big_dripleaf"), - HIT_BONE_BLOCK("hit.bone_block"), - HIT_CALCITE("hit.calcite"), - HIT_CANDLE("hit.candle"), - HIT_CAVE_VINES("hit.cave_vines"), - HIT_CHAIN("hit.chain"), - HIT_CLOTH("hit.cloth"), - HIT_COPPER("hit.copper"), - HIT_CORAL("hit.coral"), - HIT_DEEPSLATE("hit.deepslate"), - HIT_DEEPSLATE_BRICKS("hit.deepslate_bricks"), - HIT_DIRT_WITH_ROOTS("hit.dirt_with_roots"), - HIT_DRIPSTONE_BLOCK("hit.dripstone_block"), - HIT_GRASS("hit.grass"), - HIT_GRAVEL("hit.gravel"), - HIT_HANGING_ROOTS("hit.hanging_roots"), - HIT_HONEY_BLOCK("hit.honey_block"), - HIT_LADDER("hit.ladder"), - HIT_MOSS("hit.moss"), - HIT_NETHER_BRICK("hit.nether_brick"), - HIT_NETHER_GOLD_ORE("hit.nether_gold_ore"), - HIT_NETHER_SPROUTS("hit.nether_sprouts"), - HIT_NETHER_WART("hit.nether_wart"), - HIT_NETHERITE("hit.netherite"), - HIT_NETHERRACK("hit.netherrack"), - HIT_NYLIUM("hit.nylium"), - HIT_POINTED_DRIPSTONE("hit.pointed_dripstone"), - HIT_POWDER_SNOW("hit.powder_snow"), - HIT_ROOTS("hit.roots"), - HIT_SAND("hit.sand"), - HIT_SHROOMLIGHT("hit.shroomlight"), - HIT_SLIME("hit.slime"), - HIT_SNOW("hit.snow"), - HIT_SOUL_SAND("hit.soul_sand"), - HIT_SOUL_SOIL("hit.soul_soil"), - HIT_SPORE_BLOSSOM("hit.spore_blossom"), - HIT_STEM("hit.stem"), - HIT_STONE("hit.stone"), - HIT_TUFF("hit.tuff"), - HIT_VINES("hit.vines"), - HIT_WOOD("hit.wood"), - ITEM_BONE_MEAL_USE("item.bone_meal.use"), - ITEM_BOOK_PAGE_TURN("item.book.page_turn"), - ITEM_BOOK_PUT("item.book.put"), - ITEM_SHIELD_BLOCK("item.shield.block"), - ITEM_SPYGLASS_STOP_USING("item.spyglass.stop_using"), - ITEM_SPYGLASS_USE("item.spyglass.use"), - ITEM_TRIDENT_HIT("item.trident.hit"), - ITEM_TRIDENT_HIT_GROUND("item.trident.hit_ground"), - ITEM_TRIDENT_RETURN("item.trident.return"), - ITEM_TRIDENT_RIPTIDE_1("item.trident.riptide_1"), - ITEM_TRIDENT_RIPTIDE_2("item.trident.riptide_2"), - ITEM_TRIDENT_RIPTIDE_3("item.trident.riptide_3"), - ITEM_TRIDENT_THROW("item.trident.throw"), - ITEM_TRIDENT_THUNDER("item.trident.thunder"), - JUMP_ANCIENT_DEBRIS("jump.ancient_debris"), - JUMP_AZALEA("jump.azalea"), - JUMP_BASALT("jump.basalt"), - JUMP_BIG_DRIPLEAF("jump.big_dripleaf"), - JUMP_BONE_BLOCK("jump.bone_block"), - JUMP_CAVE_VINES("jump.cave_vines"), - JUMP_CHAIN("jump.chain"), - JUMP_CLOTH("jump.cloth"), - JUMP_CORAL("jump.coral"), - JUMP_DEEPSLATE("jump.deepslate"), - JUMP_DEEPSLATE_BRICKS("jump.deepslate_bricks"), - JUMP_DIRT_WITH_ROOTS("jump.dirt_with_roots"), - JUMP_DRIPSTONE_BLOCK("jump.dripstone_block"), - JUMP_GRASS("jump.grass"), - JUMP_GRAVEL("jump.gravel"), - JUMP_HANGING_ROOTS("jump.hanging_roots"), - JUMP_HONEY_BLOCK("jump.honey_block"), - JUMP_MOSS("jump.moss"), - JUMP_NETHER_BRICK("jump.nether_brick"), - JUMP_NETHER_GOLD_ORE("jump.nether_gold_ore"), - JUMP_NETHER_SPROUTS("jump.nether_sprouts"), - JUMP_NETHER_WART("jump.nether_wart"), - JUMP_NETHERITE("jump.netherite"), - JUMP_NETHERRACK("jump.netherrack"), - JUMP_NYLIUM("jump.nylium"), - JUMP_POINTED_DRIPSTONE("jump.pointed_dripstone"), - JUMP_ROOTS("jump.roots"), - JUMP_SAND("jump.sand"), - JUMP_SHROOMLIGHT("jump.shroomlight"), - JUMP_SLIME("jump.slime"), - JUMP_SNOW("jump.snow"), - JUMP_SOUL_SAND("jump.soul_sand"), - JUMP_SOUL_SOIL("jump.soul_soil"), - JUMP_SPORE_BLOSSOM("jump.spore_blossom"), - JUMP_STEM("jump.stem"), - JUMP_STONE("jump.stone"), - JUMP_VINES("jump.vines"), - JUMP_WOOD("jump.wood"), - LAND_ANCIENT_DEBRIS("land.ancient_debris"), - LAND_AZALEA("land.azalea"), - LAND_BASALT("land.basalt"), - LAND_BIG_DRIPLEAF("land.big_dripleaf"), - LAND_BONE_BLOCK("land.bone_block"), - LAND_CAVE_VINES("land.cave_vines"), - LAND_CHAIN("land.chain"), - LAND_CLOTH("land.cloth"), - LAND_CORAL("land.coral"), - LAND_DEEPSLATE("land.deepslate"), - LAND_DEEPSLATE_BRICKS("land.deepslate_bricks"), - LAND_DIRT_WITH_ROOTS("land.dirt_with_roots"), - LAND_DRIPSTONE_BLOCK("land.dripstone_block"), - LAND_GRASS("land.grass"), - LAND_GRAVEL("land.gravel"), - LAND_HANGING_ROOTS("land.hanging_roots"), - LAND_HONEY_BLOCK("land.honey_block"), - LAND_MOSS("land.moss"), - LAND_NETHER_BRICK("land.nether_brick"), - LAND_NETHER_GOLD_ORE("land.nether_gold_ore"), - LAND_NETHER_SPROUTS("land.nether_sprouts"), - LAND_NETHER_WART("land.nether_wart"), - LAND_NETHERITE("land.netherite"), - LAND_NETHERRACK("land.netherrack"), - LAND_NYLIUM("land.nylium"), - LAND_POINTED_DRIPSTONE("land.pointed_dripstone"), - LAND_ROOTS("land.roots"), - LAND_SAND("land.sand"), - LAND_SHROOMLIGHT("land.shroomlight"), - LAND_SLIME("land.slime"), - LAND_SNOW("land.snow"), - LAND_SOUL_SAND("land.soul_sand"), - LAND_SOUL_SOIL("land.soul_soil"), - LAND_SPORE_BLOSSOM("land.spore_blossom"), - LAND_STEM("land.stem"), - LAND_STONE("land.stone"), - LAND_VINES("land.vines"), - LAND_WOOD("land.wood"), - LEASHKNOT_BREAK("leashknot.break"), - LEASHKNOT_PLACE("leashknot.place"), - LIQUID_LAVA("liquid.lava"), - LIQUID_LAVAPOP("liquid.lavapop"), - LIQUID_WATER("liquid.water"), - LODESTONE_COMPASS_LINK_COMPASS_TO_LODESTONE("lodestone_compass.link_compass_to_lodestone"), - MINECART_BASE("minecart.base"), - MINECART_INSIDE("minecart.inside"), - MOB_AGENT_SPAWN("mob.agent.spawn"), - MOB_ARMOR_STAND_BREAK("mob.armor_stand.break"), - MOB_ARMOR_STAND_HIT("mob.armor_stand.hit"), - MOB_ARMOR_STAND_LAND("mob.armor_stand.land"), - MOB_ARMOR_STAND_PLACE("mob.armor_stand.place"), - MOB_AXOLOTL_ATTACK("mob.axolotl.attack"), - MOB_AXOLOTL_DEATH("mob.axolotl.death"), - MOB_AXOLOTL_HURT("mob.axolotl.hurt"), - MOB_AXOLOTL_IDLE("mob.axolotl.idle"), - MOB_AXOLOTL_IDLE_WATER("mob.axolotl.idle_water"), - MOB_AXOLOTL_SPLASH("mob.axolotl.splash"), - MOB_AXOLOTL_SWIM("mob.axolotl.swim"), - MOB_BAT_DEATH("mob.bat.death"), - MOB_BAT_HURT("mob.bat.hurt"), - MOB_BAT_IDLE("mob.bat.idle"), - MOB_BAT_TAKEOFF("mob.bat.takeoff"), - MOB_BEE_AGGRESSIVE("mob.bee.aggressive"), - MOB_BEE_DEATH("mob.bee.death"), - MOB_BEE_HURT("mob.bee.hurt"), - MOB_BEE_LOOP("mob.bee.loop"), - MOB_BEE_POLLINATE("mob.bee.pollinate"), - MOB_BEE_STING("mob.bee.sting"), - MOB_BLAZE_BREATHE("mob.blaze.breathe"), - MOB_BLAZE_DEATH("mob.blaze.death"), - MOB_BLAZE_HIT("mob.blaze.hit"), - MOB_BLAZE_SHOOT("mob.blaze.shoot"), - MOB_CAT_BEG("mob.cat.beg"), - MOB_CAT_EAT("mob.cat.eat"), - MOB_CAT_HISS("mob.cat.hiss"), - MOB_CAT_HIT("mob.cat.hit"), - MOB_CAT_MEOW("mob.cat.meow"), - MOB_CAT_PURR("mob.cat.purr"), - MOB_CAT_PURREOW("mob.cat.purreow"), - MOB_CAT_STRAYMEOW("mob.cat.straymeow"), - MOB_CHICKEN_HURT("mob.chicken.hurt"), - MOB_CHICKEN_PLOP("mob.chicken.plop"), - MOB_CHICKEN_SAY("mob.chicken.say"), - MOB_CHICKEN_STEP("mob.chicken.step"), - MOB_COW_HURT("mob.cow.hurt"), - MOB_COW_MILK("mob.cow.milk"), - MOB_COW_SAY("mob.cow.say"), - MOB_COW_STEP("mob.cow.step"), - MOB_CREEPER_DEATH("mob.creeper.death"), - MOB_CREEPER_SAY("mob.creeper.say"), - MOB_DOLPHIN_ATTACK("mob.dolphin.attack"), - MOB_DOLPHIN_BLOWHOLE("mob.dolphin.blowhole"), - MOB_DOLPHIN_DEATH("mob.dolphin.death"), - MOB_DOLPHIN_EAT("mob.dolphin.eat"), - MOB_DOLPHIN_HURT("mob.dolphin.hurt"), - MOB_DOLPHIN_IDLE("mob.dolphin.idle"), - MOB_DOLPHIN_IDLE_WATER("mob.dolphin.idle_water"), - MOB_DOLPHIN_JUMP("mob.dolphin.jump"), - MOB_DOLPHIN_PLAY("mob.dolphin.play"), - MOB_DOLPHIN_SPLASH("mob.dolphin.splash"), - MOB_DOLPHIN_SWIM("mob.dolphin.swim"), - MOB_DROWNED_DEATH("mob.drowned.death"), - MOB_DROWNED_DEATH_WATER("mob.drowned.death_water"), - MOB_DROWNED_HURT("mob.drowned.hurt"), - MOB_DROWNED_HURT_WATER("mob.drowned.hurt_water"), - MOB_DROWNED_SAY("mob.drowned.say"), - MOB_DROWNED_SAY_WATER("mob.drowned.say_water"), - MOB_DROWNED_SHOOT("mob.drowned.shoot"), - MOB_DROWNED_STEP("mob.drowned.step"), - MOB_DROWNED_SWIM("mob.drowned.swim"), - MOB_ELDERGUARDIAN_CURSE("mob.elderguardian.curse"), - MOB_ELDERGUARDIAN_DEATH("mob.elderguardian.death"), - MOB_ELDERGUARDIAN_HIT("mob.elderguardian.hit"), - MOB_ELDERGUARDIAN_IDLE("mob.elderguardian.idle"), - MOB_ENDERDRAGON_DEATH("mob.enderdragon.death"), - MOB_ENDERDRAGON_FLAP("mob.enderdragon.flap"), - MOB_ENDERDRAGON_GROWL("mob.enderdragon.growl"), - MOB_ENDERDRAGON_HIT("mob.enderdragon.hit"), - MOB_ENDERMEN_DEATH("mob.endermen.death"), - MOB_ENDERMEN_HIT("mob.endermen.hit"), - MOB_ENDERMEN_IDLE("mob.endermen.idle"), - MOB_ENDERMEN_PORTAL("mob.endermen.portal"), - MOB_ENDERMEN_SCREAM("mob.endermen.scream"), - MOB_ENDERMEN_STARE("mob.endermen.stare"), - MOB_ENDERMITE_HIT("mob.endermite.hit"), - MOB_ENDERMITE_KILL("mob.endermite.kill"), - MOB_ENDERMITE_SAY("mob.endermite.say"), - MOB_ENDERMITE_STEP("mob.endermite.step"), - MOB_EVOCATION_FANGS_ATTACK("mob.evocation_fangs.attack"), - MOB_EVOCATION_ILLAGER_AMBIENT("mob.evocation_illager.ambient"), - MOB_EVOCATION_ILLAGER_CAST_SPELL("mob.evocation_illager.cast_spell"), - MOB_EVOCATION_ILLAGER_CELEBRATE("mob.evocation_illager.celebrate"), - MOB_EVOCATION_ILLAGER_DEATH("mob.evocation_illager.death"), - MOB_EVOCATION_ILLAGER_HURT("mob.evocation_illager.hurt"), - MOB_EVOCATION_ILLAGER_PREPARE_ATTACK("mob.evocation_illager.prepare_attack"), - MOB_EVOCATION_ILLAGER_PREPARE_SUMMON("mob.evocation_illager.prepare_summon"), - MOB_EVOCATION_ILLAGER_PREPARE_WOLOLO("mob.evocation_illager.prepare_wololo"), - MOB_FISH_FLOP("mob.fish.flop"), - MOB_FISH_HURT("mob.fish.hurt"), - MOB_FISH_STEP("mob.fish.step"), - MOB_FOX_AGGRO("mob.fox.aggro"), - MOB_FOX_AMBIENT("mob.fox.ambient"), - MOB_FOX_BITE("mob.fox.bite"), - MOB_FOX_DEATH("mob.fox.death"), - MOB_FOX_EAT("mob.fox.eat"), - MOB_FOX_HURT("mob.fox.hurt"), - MOB_FOX_SCREECH("mob.fox.screech"), - MOB_FOX_SLEEP("mob.fox.sleep"), - MOB_FOX_SNIFF("mob.fox.sniff"), - MOB_FOX_SPIT("mob.fox.spit"), - MOB_GHAST_AFFECTIONATE_SCREAM("mob.ghast.affectionate_scream"), - MOB_GHAST_CHARGE("mob.ghast.charge"), - MOB_GHAST_DEATH("mob.ghast.death"), - MOB_GHAST_FIREBALL("mob.ghast.fireball"), - MOB_GHAST_MOAN("mob.ghast.moan"), - MOB_GHAST_SCREAM("mob.ghast.scream"), - MOB_GLOW_SQUID_AMBIENT("mob.glow_squid.ambient"), - MOB_GLOW_SQUID_DEATH("mob.glow_squid.death"), - MOB_GLOW_SQUID_HURT("mob.glow_squid.hurt"), - MOB_GLOW_SQUID_INK_SQUIRT("mob.glow_squid.ink_squirt"), - MOB_GOAT_AMBIENT("mob.goat.ambient"), - MOB_GOAT_AMBIENT_SCREAMER("mob.goat.ambient.screamer"), - MOB_GOAT_DEATH("mob.goat.death"), - MOB_GOAT_DEATH_SCREAMER("mob.goat.death.screamer"), - MOB_GOAT_EAT("mob.goat.eat"), - MOB_GOAT_HURT("mob.goat.hurt"), - MOB_GOAT_HURT_SCREAMER("mob.goat.hurt.screamer"), - MOB_GOAT_MILK_SCREAMER("mob.goat.milk.screamer"), - MOB_GOAT_PREPARE_RAM("mob.goat.prepare_ram"), - MOB_GOAT_PREPARE_RAM_SCREAMER("mob.goat.prepare_ram.screamer"), - MOB_GOAT_RAM_IMPACT("mob.goat.ram_impact"), - MOB_GOAT_RAM_IMPACT_SCREAMER("mob.goat.ram_impact.screamer"), - MOB_GOAT_STEP("mob.goat.step"), - MOB_GUARDIAN_AMBIENT("mob.guardian.ambient"), - MOB_GUARDIAN_ATTACK_LOOP("mob.guardian.attack_loop"), - MOB_GUARDIAN_DEATH("mob.guardian.death"), - MOB_GUARDIAN_FLOP("mob.guardian.flop"), - MOB_GUARDIAN_HIT("mob.guardian.hit"), - MOB_GUARDIAN_LAND_DEATH("mob.guardian.land_death"), - MOB_GUARDIAN_LAND_HIT("mob.guardian.land_hit"), - MOB_GUARDIAN_LAND_IDLE("mob.guardian.land_idle"), - MOB_HOGLIN_AMBIENT("mob.hoglin.ambient"), - MOB_HOGLIN_ANGRY("mob.hoglin.angry"), - MOB_HOGLIN_ATTACK("mob.hoglin.attack"), - MOB_HOGLIN_DEATH("mob.hoglin.death"), - MOB_HOGLIN_HOWL("mob.hoglin.howl"), - MOB_HOGLIN_HURT("mob.hoglin.hurt"), - MOB_HOGLIN_RETREAT("mob.hoglin.retreat"), - MOB_HOGLIN_STEP("mob.hoglin.step"), - MOB_HORSE_ANGRY("mob.horse.angry"), - MOB_HORSE_ARMOR("mob.horse.armor"), - MOB_HORSE_BREATHE("mob.horse.breathe"), - MOB_HORSE_DEATH("mob.horse.death"), - MOB_HORSE_DONKEY_ANGRY("mob.horse.donkey.angry"), - MOB_HORSE_DONKEY_DEATH("mob.horse.donkey.death"), - MOB_HORSE_DONKEY_HIT("mob.horse.donkey.hit"), - MOB_HORSE_DONKEY_IDLE("mob.horse.donkey.idle"), - MOB_HORSE_EAT("mob.horse.eat"), - MOB_HORSE_GALLOP("mob.horse.gallop"), - MOB_HORSE_HIT("mob.horse.hit"), - MOB_HORSE_IDLE("mob.horse.idle"), - MOB_HORSE_JUMP("mob.horse.jump"), - MOB_HORSE_LAND("mob.horse.land"), - MOB_HORSE_LEATHER("mob.horse.leather"), - MOB_HORSE_SKELETON_DEATH("mob.horse.skeleton.death"), - MOB_HORSE_SKELETON_HIT("mob.horse.skeleton.hit"), - MOB_HORSE_SKELETON_IDLE("mob.horse.skeleton.idle"), - MOB_HORSE_SOFT("mob.horse.soft"), - MOB_HORSE_WOOD("mob.horse.wood"), - MOB_HORSE_ZOMBIE_DEATH("mob.horse.zombie.death"), - MOB_HORSE_ZOMBIE_HIT("mob.horse.zombie.hit"), - MOB_HORSE_ZOMBIE_IDLE("mob.horse.zombie.idle"), - MOB_HUSK_AMBIENT("mob.husk.ambient"), - MOB_HUSK_DEATH("mob.husk.death"), - MOB_HUSK_HURT("mob.husk.hurt"), - MOB_HUSK_STEP("mob.husk.step"), - MOB_IRONGOLEM_DEATH("mob.irongolem.death"), - MOB_IRONGOLEM_HIT("mob.irongolem.hit"), - MOB_IRONGOLEM_THROW("mob.irongolem.throw"), - MOB_IRONGOLEM_WALK("mob.irongolem.walk"), - MOB_LLAMA_ANGRY("mob.llama.angry"), - MOB_LLAMA_DEATH("mob.llama.death"), - MOB_LLAMA_EAT("mob.llama.eat"), - MOB_LLAMA_HURT("mob.llama.hurt"), - MOB_LLAMA_IDLE("mob.llama.idle"), - MOB_LLAMA_SPIT("mob.llama.spit"), - MOB_LLAMA_STEP("mob.llama.step"), - MOB_LLAMA_SWAG("mob.llama.swag"), - MOB_MAGMACUBE_BIG("mob.magmacube.big"), - MOB_MAGMACUBE_JUMP("mob.magmacube.jump"), - MOB_MAGMACUBE_SMALL("mob.magmacube.small"), - MOB_MOOSHROOM_CONVERT("mob.mooshroom.convert"), - MOB_MOOSHROOM_EAT("mob.mooshroom.eat"), - MOB_MOOSHROOM_SUSPICIOUS_MILK("mob.mooshroom.suspicious_milk"), - MOB_OCELOT_DEATH("mob.ocelot.death"), - MOB_OCELOT_IDLE("mob.ocelot.idle"), - MOB_PANDA_BITE("mob.panda.bite"), - MOB_PANDA_CANT_BREED("mob.panda.cant_breed"), - MOB_PANDA_DEATH("mob.panda.death"), - MOB_PANDA_EAT("mob.panda.eat"), - MOB_PANDA_HURT("mob.panda.hurt"), - MOB_PANDA_IDLE("mob.panda.idle"), - MOB_PANDA_IDLE_AGGRESSIVE("mob.panda.idle.aggressive"), - MOB_PANDA_IDLE_WORRIED("mob.panda.idle.worried"), - MOB_PANDA_PRESNEEZE("mob.panda.presneeze"), - MOB_PANDA_SNEEZE("mob.panda.sneeze"), - MOB_PANDA_STEP("mob.panda.step"), - MOB_PANDA_BABY_IDLE("mob.panda_baby.idle"), - MOB_PARROT_DEATH("mob.parrot.death"), - MOB_PARROT_EAT("mob.parrot.eat"), - MOB_PARROT_FLY("mob.parrot.fly"), - MOB_PARROT_HURT("mob.parrot.hurt"), - MOB_PARROT_IDLE("mob.parrot.idle"), - MOB_PARROT_STEP("mob.parrot.step"), - MOB_PHANTOM_BITE("mob.phantom.bite"), - MOB_PHANTOM_DEATH("mob.phantom.death"), - MOB_PHANTOM_FLAP("mob.phantom.flap"), - MOB_PHANTOM_HURT("mob.phantom.hurt"), - MOB_PHANTOM_IDLE("mob.phantom.idle"), - MOB_PHANTOM_SWOOP("mob.phantom.swoop"), - MOB_PIG_BOOST("mob.pig.boost"), - MOB_PIG_DEATH("mob.pig.death"), - MOB_PIG_SAY("mob.pig.say"), - MOB_PIG_STEP("mob.pig.step"), - MOB_PIGLIN_ADMIRING_ITEM("mob.piglin.admiring_item"), - MOB_PIGLIN_AMBIENT("mob.piglin.ambient"), - MOB_PIGLIN_ANGRY("mob.piglin.angry"), - MOB_PIGLIN_CELEBRATE("mob.piglin.celebrate"), - MOB_PIGLIN_CONVERTED_TO_ZOMBIFIED("mob.piglin.converted_to_zombified"), - MOB_PIGLIN_DEATH("mob.piglin.death"), - MOB_PIGLIN_HURT("mob.piglin.hurt"), - MOB_PIGLIN_JEALOUS("mob.piglin.jealous"), - MOB_PIGLIN_RETREAT("mob.piglin.retreat"), - MOB_PIGLIN_STEP("mob.piglin.step"), - MOB_PIGLIN_BRUTE_AMBIENT("mob.piglin_brute.ambient"), - MOB_PIGLIN_BRUTE_ANGRY("mob.piglin_brute.angry"), - MOB_PIGLIN_BRUTE_CONVERTED_TO_ZOMBIFIED("mob.piglin_brute.converted_to_zombified"), - MOB_PIGLIN_BRUTE_DEATH("mob.piglin_brute.death"), - MOB_PIGLIN_BRUTE_HURT("mob.piglin_brute.hurt"), - MOB_PIGLIN_BRUTE_STEP("mob.piglin_brute.step"), - MOB_PILLAGER_CELEBRATE("mob.pillager.celebrate"), - MOB_PILLAGER_DEATH("mob.pillager.death"), - MOB_PILLAGER_HURT("mob.pillager.hurt"), - MOB_PILLAGER_IDLE("mob.pillager.idle"), - MOB_PLAYER_HURT_DROWN("mob.player.hurt_drown"), - MOB_PLAYER_HURT_FREEZE("mob.player.hurt_freeze"), - MOB_PLAYER_HURT_ON_FIRE("mob.player.hurt_on_fire"), - MOB_POLARBEAR_DEATH("mob.polarbear.death"), - MOB_POLARBEAR_HURT("mob.polarbear.hurt"), - MOB_POLARBEAR_IDLE("mob.polarbear.idle"), - MOB_POLARBEAR_STEP("mob.polarbear.step"), - MOB_POLARBEAR_WARNING("mob.polarbear.warning"), - MOB_POLARBEAR_BABY_IDLE("mob.polarbear_baby.idle"), - MOB_RABBIT_DEATH("mob.rabbit.death"), - MOB_RABBIT_HOP("mob.rabbit.hop"), - MOB_RABBIT_HURT("mob.rabbit.hurt"), - MOB_RABBIT_IDLE("mob.rabbit.idle"), - MOB_RAVAGER_AMBIENT("mob.ravager.ambient"), - MOB_RAVAGER_BITE("mob.ravager.bite"), - MOB_RAVAGER_CELEBRATE("mob.ravager.celebrate"), - MOB_RAVAGER_DEATH("mob.ravager.death"), - MOB_RAVAGER_HURT("mob.ravager.hurt"), - MOB_RAVAGER_ROAR("mob.ravager.roar"), - MOB_RAVAGER_STEP("mob.ravager.step"), - MOB_RAVAGER_STUN("mob.ravager.stun"), - MOB_SHEEP_SAY("mob.sheep.say"), - MOB_SHEEP_SHEAR("mob.sheep.shear"), - MOB_SHEEP_STEP("mob.sheep.step"), - MOB_SHULKER_AMBIENT("mob.shulker.ambient"), - MOB_SHULKER_BULLET_HIT("mob.shulker.bullet.hit"), - MOB_SHULKER_CLOSE("mob.shulker.close"), - MOB_SHULKER_CLOSE_HURT("mob.shulker.close.hurt"), - MOB_SHULKER_DEATH("mob.shulker.death"), - MOB_SHULKER_HURT("mob.shulker.hurt"), - MOB_SHULKER_OPEN("mob.shulker.open"), - MOB_SHULKER_SHOOT("mob.shulker.shoot"), - MOB_SHULKER_TELEPORT("mob.shulker.teleport"), - MOB_SILVERFISH_HIT("mob.silverfish.hit"), - MOB_SILVERFISH_KILL("mob.silverfish.kill"), - MOB_SILVERFISH_SAY("mob.silverfish.say"), - MOB_SILVERFISH_STEP("mob.silverfish.step"), - MOB_SKELETON_CONVERT_TO_STRAY("mob.skeleton.convert_to_stray"), - MOB_SKELETON_DEATH("mob.skeleton.death"), - MOB_SKELETON_HURT("mob.skeleton.hurt"), - MOB_SKELETON_SAY("mob.skeleton.say"), - MOB_SKELETON_STEP("mob.skeleton.step"), - MOB_SLIME_ATTACK("mob.slime.attack"), - MOB_SLIME_BIG("mob.slime.big"), - MOB_SLIME_DEATH("mob.slime.death"), - MOB_SLIME_HURT("mob.slime.hurt"), - MOB_SLIME_JUMP("mob.slime.jump"), - MOB_SLIME_SMALL("mob.slime.small"), - MOB_SLIME_SQUISH("mob.slime.squish"), - MOB_SNOWGOLEM_DEATH("mob.snowgolem.death"), - MOB_SNOWGOLEM_HURT("mob.snowgolem.hurt"), - MOB_SNOWGOLEM_SHOOT("mob.snowgolem.shoot"), - MOB_SPIDER_DEATH("mob.spider.death"), - MOB_SPIDER_SAY("mob.spider.say"), - MOB_SPIDER_STEP("mob.spider.step"), - MOB_SQUID_AMBIENT("mob.squid.ambient"), - MOB_SQUID_DEATH("mob.squid.death"), - MOB_SQUID_HURT("mob.squid.hurt"), - MOB_SQUID_INK_SQUIRT("mob.squid.ink_squirt"), - MOB_STRAY_AMBIENT("mob.stray.ambient"), - MOB_STRAY_DEATH("mob.stray.death"), - MOB_STRAY_HURT("mob.stray.hurt"), - MOB_STRAY_STEP("mob.stray.step"), - MOB_STRIDER_DEATH("mob.strider.death"), - MOB_STRIDER_EAT("mob.strider.eat"), - MOB_STRIDER_HURT("mob.strider.hurt"), - MOB_STRIDER_IDLE("mob.strider.idle"), - MOB_STRIDER_PANIC("mob.strider.panic"), - MOB_STRIDER_STEP("mob.strider.step"), - MOB_STRIDER_STEP_LAVA("mob.strider.step_lava"), - MOB_STRIDER_TEMPT("mob.strider.tempt"), - MOB_TURTLE_AMBIENT("mob.turtle.ambient"), - MOB_TURTLE_DEATH("mob.turtle.death"), - MOB_TURTLE_HURT("mob.turtle.hurt"), - MOB_TURTLE_STEP("mob.turtle.step"), - MOB_TURTLE_SWIM("mob.turtle.swim"), - MOB_TURTLE_BABY_BORN("mob.turtle_baby.born"), - MOB_TURTLE_BABY_DEATH("mob.turtle_baby.death"), - MOB_TURTLE_BABY_HURT("mob.turtle_baby.hurt"), - MOB_TURTLE_BABY_STEP("mob.turtle_baby.step"), - MOB_VEX_AMBIENT("mob.vex.ambient"), - MOB_VEX_CHARGE("mob.vex.charge"), - MOB_VEX_DEATH("mob.vex.death"), - MOB_VEX_HURT("mob.vex.hurt"), - MOB_VILLAGER_DEATH("mob.villager.death"), - MOB_VILLAGER_HAGGLE("mob.villager.haggle"), - MOB_VILLAGER_HIT("mob.villager.hit"), - MOB_VILLAGER_IDLE("mob.villager.idle"), - MOB_VILLAGER_NO("mob.villager.no"), - MOB_VILLAGER_YES("mob.villager.yes"), - MOB_VINDICATOR_CELEBRATE("mob.vindicator.celebrate"), - MOB_VINDICATOR_DEATH("mob.vindicator.death"), - MOB_VINDICATOR_HURT("mob.vindicator.hurt"), - MOB_VINDICATOR_IDLE("mob.vindicator.idle"), - MOB_WANDERINGTRADER_DEATH("mob.wanderingtrader.death"), - MOB_WANDERINGTRADER_DISAPPEARED("mob.wanderingtrader.disappeared"), - MOB_WANDERINGTRADER_DRINK_MILK("mob.wanderingtrader.drink_milk"), - MOB_WANDERINGTRADER_DRINK_POTION("mob.wanderingtrader.drink_potion"), - MOB_WANDERINGTRADER_HAGGLE("mob.wanderingtrader.haggle"), - MOB_WANDERINGTRADER_HURT("mob.wanderingtrader.hurt"), - MOB_WANDERINGTRADER_IDLE("mob.wanderingtrader.idle"), - MOB_WANDERINGTRADER_NO("mob.wanderingtrader.no"), - MOB_WANDERINGTRADER_REAPPEARED("mob.wanderingtrader.reappeared"), - MOB_WANDERINGTRADER_YES("mob.wanderingtrader.yes"), - MOB_WITCH_AMBIENT("mob.witch.ambient"), - MOB_WITCH_CELEBRATE("mob.witch.celebrate"), - MOB_WITCH_DEATH("mob.witch.death"), - MOB_WITCH_DRINK("mob.witch.drink"), - MOB_WITCH_HURT("mob.witch.hurt"), - MOB_WITCH_THROW("mob.witch.throw"), - MOB_WITHER_AMBIENT("mob.wither.ambient"), - MOB_WITHER_BREAK_BLOCK("mob.wither.break_block"), - MOB_WITHER_DEATH("mob.wither.death"), - MOB_WITHER_HURT("mob.wither.hurt"), - MOB_WITHER_SHOOT("mob.wither.shoot"), - MOB_WITHER_SPAWN("mob.wither.spawn"), - MOB_WOLF_BARK("mob.wolf.bark"), - MOB_WOLF_DEATH("mob.wolf.death"), - MOB_WOLF_GROWL("mob.wolf.growl"), - MOB_WOLF_HURT("mob.wolf.hurt"), - MOB_WOLF_PANTING("mob.wolf.panting"), - MOB_WOLF_SHAKE("mob.wolf.shake"), - MOB_WOLF_STEP("mob.wolf.step"), - MOB_WOLF_WHINE("mob.wolf.whine"), - MOB_ZOGLIN_ANGRY("mob.zoglin.angry"), - MOB_ZOGLIN_ATTACK("mob.zoglin.attack"), - MOB_ZOGLIN_DEATH("mob.zoglin.death"), - MOB_ZOGLIN_HURT("mob.zoglin.hurt"), - MOB_ZOGLIN_IDLE("mob.zoglin.idle"), - MOB_ZOGLIN_STEP("mob.zoglin.step"), - MOB_ZOMBIE_DEATH("mob.zombie.death"), - MOB_ZOMBIE_HURT("mob.zombie.hurt"), - MOB_ZOMBIE_REMEDY("mob.zombie.remedy"), - MOB_ZOMBIE_SAY("mob.zombie.say"), - MOB_ZOMBIE_STEP("mob.zombie.step"), - MOB_ZOMBIE_UNFECT("mob.zombie.unfect"), - MOB_ZOMBIE_WOOD("mob.zombie.wood"), - MOB_ZOMBIE_WOODBREAK("mob.zombie.woodbreak"), - MOB_ZOMBIE_VILLAGER_DEATH("mob.zombie_villager.death"), - MOB_ZOMBIE_VILLAGER_HURT("mob.zombie_villager.hurt"), - MOB_ZOMBIE_VILLAGER_SAY("mob.zombie_villager.say"), - MOB_ZOMBIEPIG_ZPIG("mob.zombiepig.zpig"), - MOB_ZOMBIEPIG_ZPIGANGRY("mob.zombiepig.zpigangry"), - MOB_ZOMBIEPIG_ZPIGDEATH("mob.zombiepig.zpigdeath"), - MOB_ZOMBIEPIG_ZPIGHURT("mob.zombiepig.zpighurt"), - MUSIC_GAME("music.game"), - MUSIC_GAME_CREATIVE("music.game.creative"), - MUSIC_GAME_CREDITS("music.game.credits"), - MUSIC_GAME_CRIMSON_FOREST("music.game.crimson_forest"), - MUSIC_GAME_END("music.game.end"), - MUSIC_GAME_ENDBOSS("music.game.endboss"), - MUSIC_GAME_NETHER("music.game.nether"), - MUSIC_GAME_NETHER_WASTES("music.game.nether_wastes"), - MUSIC_GAME_SOULSAND_VALLEY("music.game.soulsand_valley"), - MUSIC_GAME_WATER("music.game.water"), - MUSIC_MENU("music.menu"), - NOTE_BANJO("note.banjo"), - NOTE_BASS("note.bass"), - NOTE_BASSATTACK("note.bassattack"), - NOTE_BD("note.bd"), - NOTE_BELL("note.bell"), - NOTE_BIT("note.bit"), - NOTE_CHIME("note.chime"), - NOTE_COW_BELL("note.cow_bell"), - NOTE_DIDGERIDOO("note.didgeridoo"), - NOTE_FLUTE("note.flute"), - NOTE_GUITAR("note.guitar"), - NOTE_HARP("note.harp"), - NOTE_HAT("note.hat"), - NOTE_IRON_XYLOPHONE("note.iron_xylophone"), - NOTE_PLING("note.pling"), - NOTE_SNARE("note.snare"), - NOTE_XYLOPHONE("note.xylophone"), - PARTICLE_SOUL_ESCAPE("particle.soul_escape"), - PICK_BERRIES_CAVE_VINES("pick_berries.cave_vines"), - PLACE_AMETHYST_BLOCK("place.amethyst_block"), - PLACE_AMETHYST_CLUSTER("place.amethyst_cluster"), - PLACE_AZALEA("place.azalea"), - PLACE_AZALEA_LEAVES("place.azalea_leaves"), - PLACE_BIG_DRIPLEAF("place.big_dripleaf"), - PLACE_CALCITE("place.calcite"), - PLACE_COPPER("place.copper"), - PLACE_DEEPSLATE("place.deepslate"), - PLACE_DEEPSLATE_BRICKS("place.deepslate_bricks"), - PLACE_DIRT_WITH_ROOTS("place.dirt_with_roots"), - PLACE_DRIPSTONE_BLOCK("place.dripstone_block"), - PLACE_HANGING_ROOTS("place.hanging_roots"), - PLACE_LARGE_AMETHYST_BUD("place.large_amethyst_bud"), - PLACE_MEDIUM_AMETHYST_BUD("place.medium_amethyst_bud"), - PLACE_MOSS("place.moss"), - PLACE_POINTED_DRIPSTONE("place.pointed_dripstone"), - PLACE_POWDER_SNOW("place.powder_snow"), - PLACE_SMALL_AMETHYST_BUD("place.small_amethyst_bud"), - PLACE_SPORE_BLOSSOM("place.spore_blossom"), - PLACE_TUFF("place.tuff"), - PORTAL_PORTAL("portal.portal"), - PORTAL_TRAVEL("portal.travel"), - PORTAL_TRIGGER("portal.trigger"), - RAID_HORN("raid.horn"), - RANDOM_ANVIL_BREAK("random.anvil_break"), - RANDOM_ANVIL_LAND("random.anvil_land"), - RANDOM_ANVIL_USE("random.anvil_use"), - RANDOM_BOW("random.bow"), - RANDOM_BOWHIT("random.bowhit"), - RANDOM_BREAK("random.break"), - RANDOM_BURP("random.burp"), - RANDOM_CHESTCLOSED("random.chestclosed"), - RANDOM_CHESTOPEN("random.chestopen"), - RANDOM_CLICK("random.click"), - RANDOM_DOOR_CLOSE("random.door_close"), - RANDOM_DOOR_OPEN("random.door_open"), - RANDOM_DRINK("random.drink"), - RANDOM_DRINK_HONEY("random.drink_honey"), - RANDOM_EAT("random.eat"), - RANDOM_ENDERCHESTCLOSED("random.enderchestclosed"), - RANDOM_ENDERCHESTOPEN("random.enderchestopen"), - RANDOM_EXPLODE("random.explode"), - RANDOM_FIZZ("random.fizz"), - RANDOM_FUSE("random.fuse"), - RANDOM_GLASS("random.glass"), - RANDOM_HURT("random.hurt"), - RANDOM_LEVELUP("random.levelup"), - RANDOM_ORB("random.orb"), - RANDOM_POP("random.pop"), - RANDOM_POP2("random.pop2"), - RANDOM_POTION_BREWED("random.potion.brewed"), - RANDOM_SCREENSHOT("random.screenshot"), - RANDOM_SHULKERBOXCLOSED("random.shulkerboxclosed"), - RANDOM_SHULKERBOXOPEN("random.shulkerboxopen"), - RANDOM_SPLASH("random.splash"), - RANDOM_SWIM("random.swim"), - RANDOM_TOAST("random.toast"), - RANDOM_TOTEM("random.totem"), - RECORD_11("record.11"), - RECORD_13("record.13"), - RECORD_BLOCKS("record.blocks"), - RECORD_CAT("record.cat"), - RECORD_CHIRP("record.chirp"), - RECORD_FAR("record.far"), - RECORD_MALL("record.mall"), - RECORD_MELLOHI("record.mellohi"), - RECORD_PIGSTEP("record.pigstep"), - RECORD_STAL("record.stal"), - RECORD_STRAD("record.strad"), - RECORD_WAIT("record.wait"), - RECORD_WARD("record.ward"), - RESPAWN_ANCHOR_AMBIENT("respawn_anchor.ambient"), - RESPAWN_ANCHOR_CHARGE("respawn_anchor.charge"), - RESPAWN_ANCHOR_DEPLETE("respawn_anchor.deplete"), - RESPAWN_ANCHOR_SET_SPAWN("respawn_anchor.set_spawn"), - SCRAPE("scrape"), - SIGN_DYE_USE("sign.dye.use"), - SIGN_INK_SAC_USE("sign.ink_sac.use"), - SMITHING_TABLE_USE("smithing_table.use"), - STEP_AMETHYST_BLOCK("step.amethyst_block"), - STEP_AMETHYST_CLUSTER("step.amethyst_cluster"), - STEP_ANCIENT_DEBRIS("step.ancient_debris"), - STEP_AZALEA("step.azalea"), - STEP_AZALEA_LEAVES("step.azalea_leaves"), - STEP_BASALT("step.basalt"), - STEP_BIG_DRIPLEAF("step.big_dripleaf"), - STEP_BONE_BLOCK("step.bone_block"), - STEP_CALCITE("step.calcite"), - STEP_CANDLE("step.candle"), - STEP_CAVE_VINES("step.cave_vines"), - STEP_CHAIN("step.chain"), - STEP_CLOTH("step.cloth"), - STEP_COPPER("step.copper"), - STEP_CORAL("step.coral"), - STEP_DEEPSLATE("step.deepslate"), - STEP_DEEPSLATE_BRICKS("step.deepslate_bricks"), - STEP_DIRT_WITH_ROOTS("step.dirt_with_roots"), - STEP_DRIPSTONE_BLOCK("step.dripstone_block"), - STEP_GRASS("step.grass"), - STEP_GRAVEL("step.gravel"), - STEP_HANGING_ROOTS("step.hanging_roots"), - STEP_HONEY_BLOCK("step.honey_block"), - STEP_LADDER("step.ladder"), - STEP_MOSS("step.moss"), - STEP_NETHER_BRICK("step.nether_brick"), - STEP_NETHER_GOLD_ORE("step.nether_gold_ore"), - STEP_NETHER_SPROUTS("step.nether_sprouts"), - STEP_NETHER_WART("step.nether_wart"), - STEP_NETHERITE("step.netherite"), - STEP_NETHERRACK("step.netherrack"), - STEP_NYLIUM("step.nylium"), - STEP_POINTED_DRIPSTONE("step.pointed_dripstone"), - STEP_POWDER_SNOW("step.powder_snow"), - STEP_ROOTS("step.roots"), - STEP_SAND("step.sand"), - STEP_SHROOMLIGHT("step.shroomlight"), - STEP_SLIME("step.slime"), - STEP_SNOW("step.snow"), - STEP_SOUL_SAND("step.soul_sand"), - STEP_SOUL_SOIL("step.soul_soil"), - STEP_SPORE_BLOSSOM("step.spore_blossom"), - STEP_STEM("step.stem"), - STEP_STONE("step.stone"), - STEP_TUFF("step.tuff"), - STEP_VINES("step.vines"), - STEP_WOOD("step.wood"), - TILE_PISTON_IN("tile.piston.in"), - TILE_PISTON_OUT("tile.piston.out"), - TILT_DOWN_BIG_DRIPLEAF("tilt_down.big_dripleaf"), - TILT_UP_BIG_DRIPLEAF("tilt_up.big_dripleaf"), - UI_CARTOGRAPHY_TABLE_TAKE_RESULT("ui.cartography_table.take_result"), - UI_LOOM_SELECT_PATTERN("ui.loom.select_pattern"), - UI_LOOM_TAKE_RESULT("ui.loom.take_result"), - UI_STONECUTTER_TAKE_RESULT("ui.stonecutter.take_result"), - USE_ANCIENT_DEBRIS("use.ancient_debris"), - USE_BASALT("use.basalt"), - USE_BONE_BLOCK("use.bone_block"), - USE_CANDLE("use.candle"), - USE_CAVE_VINES("use.cave_vines"), - USE_CHAIN("use.chain"), - USE_CLOTH("use.cloth"), - USE_COPPER("use.copper"), - USE_CORAL("use.coral"), - USE_DEEPSLATE("use.deepslate"), - USE_DEEPSLATE_BRICKS("use.deepslate_bricks"), - USE_DIRT_WITH_ROOTS("use.dirt_with_roots"), - USE_DRIPSTONE_BLOCK("use.dripstone_block"), - USE_GRASS("use.grass"), - USE_GRAVEL("use.gravel"), - USE_HANGING_ROOTS("use.hanging_roots"), - USE_HONEY_BLOCK("use.honey_block"), - USE_LADDER("use.ladder"), - USE_MOSS("use.moss"), - USE_NETHER_BRICK("use.nether_brick"), - USE_NETHER_GOLD_ORE("use.nether_gold_ore"), - USE_NETHER_SPROUTS("use.nether_sprouts"), - USE_NETHER_WART("use.nether_wart"), - USE_NETHERITE("use.netherite"), - USE_NETHERRACK("use.netherrack"), - USE_NYLIUM("use.nylium"), - USE_POINTED_DRIPSTONE("use.pointed_dripstone"), - USE_ROOTS("use.roots"), - USE_SAND("use.sand"), - USE_SHROOMLIGHT("use.shroomlight"), - USE_SLIME("use.slime"), - USE_SNOW("use.snow"), - USE_SOUL_SAND("use.soul_sand"), - USE_SOUL_SOIL("use.soul_soil"), - USE_SPORE_BLOSSOM("use.spore_blossom"), - USE_STEM("use.stem"), - USE_STONE("use.stone"), - USE_VINES("use.vines"), - USE_WOOD("use.wood"), - VR_STUTTERTURN("vr.stutterturn"); - - private final String sound; - - Sound(String sound) { - this.sound = sound; - } - - public String getSound() { - return this.sound; - } -} diff --git a/src/main/java/cn/nukkit/level/StrongExplosion.java b/src/main/java/cn/nukkit/level/StrongExplosion.java deleted file mode 100644 index 12e8335f7..000000000 --- a/src/main/java/cn/nukkit/level/StrongExplosion.java +++ /dev/null @@ -1,210 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockTNT; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityShulkerBox; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.entity.item.EntityXPOrb; -import cn.nukkit.event.block.BlockUpdateEvent; -import cn.nukkit.event.entity.EntityDamageByBlockEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.EntityExplodeEvent; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.particle.HugeExplodeSeedParticle; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Hash; -import cn.nukkit.utils.Utils; -import it.unimi.dsi.fastutil.longs.LongArraySet; - -import java.util.ArrayList; -import java.util.List; - -/** - * Explosion that can break obsidian (for wither skulls) - */ -public class StrongExplosion extends Explosion { - - private final Level level; - private final Position source; - private final double size; - private final Object what; - private boolean doesDamage = true; - private List affectedBlocks = new ArrayList<>(); - - public StrongExplosion(Position center, double size, Entity what) { - super(center, size, what); - this.level = center.getLevel(); - this.source = center; - this.size = Math.max(size, 0); - this.what = what; - } - - public boolean explodeA() { - if (what instanceof EntityExplosive && ((Entity) what).isInsideOfWater()) { - this.doesDamage = false; - return true; - } - - if (this.size < 0.1) return false; - if (!level.getServer().explosionBreakBlocks) return true; - - Vector3 vector = new Vector3(0, 0, 0); - Vector3 vBlock = new Vector3(0, 0, 0); - - int mRays = 15; - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - for (int k = 0; k < 16; ++k) { - if (i == 0 || i == mRays || j == 0 || j == mRays || k == 0 || k == mRays) { - vector.setComponents((double) i / (double) mRays * 2d - 1, (double) j / (double) mRays * 2d - 1, (double) k / (double) mRays * 2d - 1); - double len = vector.length(); - vector.setComponents((vector.x / len) * 0.3d, (vector.y / len) * 0.3d, (vector.z / len) * 0.3d); - double pointerX = this.source.x; - double pointerY = this.source.y; - double pointerZ = this.source.z; - - for (double blastForce = this.size * (Utils.random.nextInt(700, 1301)) / 1000d; blastForce > 0; blastForce -= 0.22499999999999998) { - int x = (int) pointerX; - int y = (int) pointerY; - int z = (int) pointerZ; - vBlock.x = pointerX >= x ? x : x - 1; - vBlock.y = pointerY >= y ? y : y - 1; - vBlock.z = pointerZ >= z ? z : z - 1; - if (vBlock.y < 0 || vBlock.y > 255) { - break; - } - Block block = this.level.getBlock(vBlock); - - if (block.getId() != Block.AIR && block.getId() != Block.BEDROCK) { - if (block.getId() != Block.OBSIDIAN) { - blastForce -= (block.getResistance() / 5 + 0.3d) * 0.3d; - } - if (blastForce > 0) { - if (!this.affectedBlocks.contains(block)) { - this.affectedBlocks.add(block); - } - } - } - pointerX += vector.x; - pointerY += vector.y; - pointerZ += vector.z; - } - } - } - } - } - - return true; - } - - public boolean explodeB() { - LongArraySet updateBlocks = new LongArraySet(); - double yield = (1d / this.size) * 100d; - - if (this.what instanceof Entity) { - EntityExplodeEvent ev = new EntityExplodeEvent((Entity) this.what, this.source, this.affectedBlocks, yield); - this.level.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } else { - yield = ev.getYield(); - this.affectedBlocks = ev.getBlockList(); - } - } - - double explosionSize = this.size * 2d; - double minX = NukkitMath.floorDouble(this.source.x - explosionSize - 1); - double maxX = NukkitMath.ceilDouble(this.source.x + explosionSize + 1); - double minY = NukkitMath.floorDouble(this.source.y - explosionSize - 1); - double maxY = NukkitMath.ceilDouble(this.source.y + explosionSize + 1); - double minZ = NukkitMath.floorDouble(this.source.z - explosionSize - 1); - double maxZ = NukkitMath.ceilDouble(this.source.z + explosionSize + 1); - - AxisAlignedBB explosionBB = new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); - - Entity[] list = this.level.getNearbyEntities(explosionBB, this.what instanceof Entity ? (Entity) this.what : null); - for (Entity entity : list) { - double distance = entity.distance(this.source) / explosionSize; - - if (distance <= 1) { - Vector3 motion = entity.subtract(this.source).normalize(); - int exposure = 1; - double impact = (1 - distance) * exposure; - int damage = this.doesDamage ? (int) (((impact * impact + impact) / 2) * 8 * explosionSize + 1) : 0; - - if (this.what instanceof Entity) { - entity.attack(new EntityDamageByEntityEvent((Entity) this.what, entity, DamageCause.ENTITY_EXPLOSION, damage)); - } else if (this.what instanceof Block) { - entity.attack(new EntityDamageByBlockEvent((Block) this.what, entity, DamageCause.BLOCK_EXPLOSION, damage)); - } else { - entity.attack(new EntityDamageEvent(entity, DamageCause.BLOCK_EXPLOSION, damage)); - } - - if (!(entity instanceof EntityItem || entity instanceof EntityXPOrb)) { - entity.setMotion(motion.multiply(impact)); - } - } - } - - ItemBlock air = new ItemBlock(Block.get(BlockID.AIR)); - BlockEntity container; - - for (Block block : this.affectedBlocks) { - if (block.getId() == Block.TNT) { - ((BlockTNT) block).prime(Utils.rand(10, 30), this.what instanceof Entity ? (Entity) this.what : null); - } else if (block.getId() == Block.BED_BLOCK && (block.getDamage() & 0x08) == 0x08) { - this.level.setBlockAt((int) block.x, (int) block.y, (int) block.z, Block.AIR); - continue; // We don't want drops from both bed parts - } else if ((container = block.getLevel().getBlockEntity(block)) instanceof InventoryHolder) { - if (block.getLevel().getGameRules().getBoolean(GameRule.DO_TILE_DROPS)) { - if (container instanceof BlockEntityShulkerBox) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), block.toItem()); - ((InventoryHolder) container).getInventory().clearAll(); - } else { - for (Item drop : ((InventoryHolder) container).getInventory().getContents().values()) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), drop); - } - ((InventoryHolder) container).getInventory().clearAll(); - } - } - } else if (Math.random() * 100 < yield && block.getId() != Block.OBSIDIAN) { - for (Item drop : block.getDrops(air)) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), drop); - } - } - - this.level.setBlockAt((int) block.x, (int) block.y, (int) block.z, Block.AIR); - - Vector3 pos = new Vector3(block.x, block.y, block.z); - - for (BlockFace side : BlockFace.values()) { - Vector3 sideBlock = pos.getSide(side); - long index = Hash.hashBlock((int) sideBlock.x, (int) sideBlock.y, (int) sideBlock.z); - if (!this.affectedBlocks.contains(sideBlock) && !updateBlocks.contains(index)) { - BlockUpdateEvent ev = new BlockUpdateEvent(this.level.getBlock(sideBlock)); - this.level.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - ev.getBlock().onUpdate(Level.BLOCK_UPDATE_NORMAL); - } - updateBlocks.add(index); - } - } - } - - this.level.addParticle(new HugeExplodeSeedParticle(this.source)); - this.level.addLevelSoundEvent(source, LevelSoundEventPacket.SOUND_EXPLODE); - return true; - } -} diff --git a/src/main/java/cn/nukkit/level/WeakExplosion.java b/src/main/java/cn/nukkit/level/WeakExplosion.java deleted file mode 100644 index 7ecc7c08d..000000000 --- a/src/main/java/cn/nukkit/level/WeakExplosion.java +++ /dev/null @@ -1,190 +0,0 @@ -package cn.nukkit.level; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockTNT; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityShulkerBox; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityExplosive; -import cn.nukkit.entity.item.EntityItem; -import cn.nukkit.entity.item.EntityXPOrb; -import cn.nukkit.event.block.BlockUpdateEvent; -import cn.nukkit.event.entity.EntityDamageByBlockEvent; -import cn.nukkit.event.entity.EntityDamageByEntityEvent; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.EntityExplodeEvent; -import cn.nukkit.inventory.InventoryHolder; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemBlock; -import cn.nukkit.level.particle.HugeExplodeSeedParticle; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelSoundEventPacket; -import cn.nukkit.utils.Hash; -import cn.nukkit.utils.Utils; -import it.unimi.dsi.fastutil.longs.LongArraySet; - -import java.util.ArrayList; -import java.util.List; - -/** - * Explosion that can't break stone (for fireballs) - */ -public class WeakExplosion extends Explosion { - - private final Level level; - private final Position source; - private final double size; - private final Object what; - private boolean doesDamage = true; - private List affectedBlocks = new ArrayList<>(); - - public WeakExplosion(Position center, double size, Entity what) { - super(center, size, what); - this.level = center.getLevel(); - this.source = center; - this.size = Math.max(size, 0); - this.what = what; - } - - @Override - public boolean explodeA() { - if (what instanceof EntityExplosive && ((Entity) what).isInsideOfWater()) { - this.doesDamage = false; - return true; - } - if (this.size < 0.1) return false; - if (!level.getServer().explosionBreakBlocks) return true; - Vector3 vector = new Vector3(0, 0, 0); - Vector3 vBlock = new Vector3(0, 0, 0); - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - for (int k = 0; k < 16; ++k) { - if (i == 0 || i == 15 || j == 0 || j == 15 || k == 0 || k == 15) { - vector.setComponents((double) i / (double) 15 * 2d - 1, (double) j / (double) 15 * 2d - 1, (double) k / (double) 15 * 2d - 1); - double len = vector.length(); - vector.setComponents((vector.x / len) * 0.3d, (vector.y / len) * 0.3d, (vector.z / len) * 0.3d); - double pointerX = this.source.x; - double pointerY = this.source.y; - double pointerZ = this.source.z; - for (double blastForce = this.size * (Utils.random.nextInt(700, 1301)) / 1000d; blastForce > 0; blastForce -= 0.22499999999999998) { - int x = (int) pointerX; - int y = (int) pointerY; - int z = (int) pointerZ; - vBlock.x = pointerX >= x ? x : x - 1; - vBlock.y = pointerY >= y ? y : y - 1; - vBlock.z = pointerZ >= z ? z : z - 1; - if (vBlock.y < 0 || vBlock.y > 255) { - break; - } - Block block = this.level.getBlock(vBlock); - if (block.getId() != 0 && block.getResistance() < 20) { - blastForce -= (block.getResistance() / 5 + 0.3d) * 0.3d; - if (blastForce > 0) { - if (!this.affectedBlocks.contains(block)) { - this.affectedBlocks.add(block); - } - } - } - pointerX += vector.x; - pointerY += vector.y; - pointerZ += vector.z; - } - } - } - } - } - return true; - } - - @Override - public boolean explodeB() { - LongArraySet updateBlocks = new LongArraySet(); - double yield = (1d / this.size) * 100d; - if (this.what instanceof Entity) { - EntityExplodeEvent ev = new EntityExplodeEvent((Entity) this.what, this.source, this.affectedBlocks, yield); - this.level.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - return false; - } else { - yield = ev.getYield(); - this.affectedBlocks = ev.getBlockList(); - } - } - double explosionSize = this.size * 2d; - double minX = NukkitMath.floorDouble(this.source.x - explosionSize - 1); - double maxX = NukkitMath.ceilDouble(this.source.x + explosionSize + 1); - double minY = NukkitMath.floorDouble(this.source.y - explosionSize - 1); - double maxY = NukkitMath.ceilDouble(this.source.y + explosionSize + 1); - double minZ = NukkitMath.floorDouble(this.source.z - explosionSize - 1); - double maxZ = NukkitMath.ceilDouble(this.source.z + explosionSize + 1); - AxisAlignedBB explosionBB = new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); - Entity[] list = this.level.getNearbyEntities(explosionBB, this.what instanceof Entity ? (Entity) this.what : null); - for (Entity entity : list) { - double distance = entity.distance(this.source) / explosionSize; - if (distance <= 1) { - Vector3 motion = entity.subtract(this.source).normalize(); - int exposure = 1; - double impact = (1 - distance) * exposure; - int damage = this.doesDamage ? (int) (((impact * impact + impact) / 2) * 5 * explosionSize + 1) : 0; - if (this.what instanceof Entity) { - entity.attack(new EntityDamageByEntityEvent((Entity) this.what, entity, DamageCause.ENTITY_EXPLOSION, damage)); - } else if (this.what instanceof Block) { - entity.attack(new EntityDamageByBlockEvent((Block) this.what, entity, DamageCause.BLOCK_EXPLOSION, damage)); - } else { - entity.attack(new EntityDamageEvent(entity, DamageCause.BLOCK_EXPLOSION, damage)); - } - if (!(entity instanceof EntityItem || entity instanceof EntityXPOrb)) { - entity.setMotion(motion.multiply(impact)); - } - } - } - ItemBlock air = new ItemBlock(Block.get(BlockID.AIR)); - BlockEntity container; - for (Block block : this.affectedBlocks) { - if (block.getId() == Block.TNT) { - ((BlockTNT) block).prime(Utils.rand(10, 30), this.what instanceof Entity ? (Entity) this.what : null); - } else if (block.getId() == Block.BED_BLOCK && (block.getDamage() & 0x08) == 0x08) { - this.level.setBlockAt((int) block.x, (int) block.y, (int) block.z, Block.AIR); - continue; // We don't want drops from both bed parts - } else if ((container = block.getLevel().getBlockEntity(block)) instanceof InventoryHolder) { - if (block.getLevel().getGameRules().getBoolean(GameRule.DO_TILE_DROPS)) { - if (container instanceof BlockEntityShulkerBox) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), block.toItem()); - ((InventoryHolder) container).getInventory().clearAll(); - } else { - for (Item drop : ((InventoryHolder) container).getInventory().getContents().values()) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), drop); - } - ((InventoryHolder) container).getInventory().clearAll(); - } - } - } else if (Math.random() * 100 < yield) { - for (Item drop : block.getDrops(air)) { - this.level.dropItem(block.add(0.5, 0.5, 0.5), drop); - } - } - this.level.setBlockAt((int) block.x, (int) block.y, (int) block.z, BlockID.AIR); - Vector3 pos = new Vector3(block.x, block.y, block.z); - for (BlockFace side : BlockFace.values()) { - Vector3 sideBlock = pos.getSide(side); - long index = Hash.hashBlock((int) sideBlock.x, (int) sideBlock.y, (int) sideBlock.z); - if (!this.affectedBlocks.contains(sideBlock) && !updateBlocks.contains(index)) { - BlockUpdateEvent ev = new BlockUpdateEvent(this.level.getBlock(sideBlock)); - this.level.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - ev.getBlock().onUpdate(Level.BLOCK_UPDATE_NORMAL); - } - updateBlocks.add(index); - } - } - } - this.level.addParticle(new HugeExplodeSeedParticle(this.source)); - this.level.addLevelSoundEvent(source, LevelSoundEventPacket.SOUND_EXPLODE); - return true; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/biome/Biome.java b/src/main/java/cn/nukkit/level/biome/Biome.java deleted file mode 100644 index fb535aa00..000000000 --- a/src/main/java/cn/nukkit/level/biome/Biome.java +++ /dev/null @@ -1,141 +0,0 @@ -package cn.nukkit.level.biome; - -import cn.nukkit.block.BlockID; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Biome implements BlockID { - - public static final Biome[] biomes = new Biome[256]; - public static final List unorderedBiomes = new ArrayList<>(); - - private final ArrayList populators = new ArrayList<>(); - private int id; - private float baseHeight = 0.1f; - private float heightVariation = 0.3f; - - protected static void register(int id, Biome biome) { - biome.setId(id); - biomes[id] = biome; - unorderedBiomes.add(biome); - } - - public static Biome getBiome(int id) { - Biome biome = biomes[id]; - return biome != null ? biome : EnumBiome.OCEAN.biome; - } - - /** - * Get Biome by name. - * - * @param name Name of biome. Name could contain symbol "_" instead of space - * @return Biome. Null - when biome was not found - */ - public static Biome getBiome(String name) { - for (Biome biome : biomes) { - if (biome != null) { - if (biome.getName().equalsIgnoreCase(name.replace("_", " "))) return biome; - } - } - return null; - } - - public void clearPopulators() { - this.populators.clear(); - } - - public void addPopulator(Populator populator) { - this.populators.add(populator); - } - - public void populateChunk(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random) { - FullChunk chunk = level.getChunk(chunkX, chunkZ); - for (Populator populator : populators) { - populator.populate(level, chunkX, chunkZ, random, chunk); - } - } - - public ArrayList getPopulators() { - return populators; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public abstract String getName(); - - public void setBaseHeight(float baseHeight) { - this.baseHeight = baseHeight; - } - - public void setHeightVariation(float heightVariation) { - this.heightVariation = heightVariation; - } - - public float getBaseHeight() { - return baseHeight; - } - - public float getHeightVariation() { - return heightVariation; - } - - @Override - public int hashCode() { - return id; - } - - @Override - public boolean equals(Object obj) { - return hashCode() == obj.hashCode(); - } - - /** - * Whether or not water should freeze into ice on generation - * - * @return overhang - */ - public boolean isFreezing() { - return false; - } - - /** - * Whether or not overhangs should generate in this biome (places where solid blocks generate over air) - * - * This should probably be used with a custom max elevation or things can look stupid - * - * @return overhang - */ - public boolean doesOverhang() { - return false; - } - - /** - * How much offset should be added to the min/max heights at this position - * - * @param x x - * @param z z - * @return height offset - */ - public int getHeightOffset(int x, int z) { - return 0; - } - - public boolean canRain() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/BiomeSelector.java b/src/main/java/cn/nukkit/level/biome/BiomeSelector.java deleted file mode 100644 index f8e041826..000000000 --- a/src/main/java/cn/nukkit/level/biome/BiomeSelector.java +++ /dev/null @@ -1,191 +0,0 @@ -package cn.nukkit.level.biome; - -import cn.nukkit.level.generator.noise.nukkit.f.SimplexF; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class BiomeSelector { - - private final SimplexF temperature; - private final SimplexF rainfall; - private final SimplexF river; - private final SimplexF ocean; - private final SimplexF hills; - - public BiomeSelector(NukkitRandom random) { - this.temperature = new SimplexF(random, 2F, 0.125f, 4.8828125E-4f); - this.rainfall = new SimplexF(random, 2F, 0.125f, 4.8828125E-4f); - this.river = new SimplexF(random, 6f, 0.5f, 9.765625E-4f); - this.ocean = new SimplexF(random, 6f, 0.5f, 4.8828125E-4f); - this.hills = new SimplexF(random, 2f, 0.5f, 4.8828125E-4f); - } - - public Biome pickBiome(int x, int z) { - float noiseOcean = ocean.noise2D(x, z, true); - float noiseRiver = river.noise2D(x, z, true); - float temperature = this.temperature.noise2D(x, z, true); - float rainfall = this.rainfall.noise2D(x, z, true); - EnumBiome biome; - if (noiseOcean < -0.3f) { - if (noiseOcean < -0.6f) { - biome = EnumBiome.MUSHROOM_ISLAND_SHORE; - } else { - if (rainfall < 0f) { - if (temperature < -0.4f) { - biome = EnumBiome.FROZEN_OCEAN; - } else { - biome = EnumBiome.OCEAN; - } - } else { - biome = EnumBiome.DEEP_OCEAN; - } - } - } else if (Math.abs(noiseRiver) < -0.1f) { - if (temperature < -0.3f) { - biome = EnumBiome.FROZEN_RIVER; - } else { - biome = EnumBiome.RIVER; - } - } else { - float hills = this.hills.noise2D(x, z, true); - if (temperature < -0.379f) { - // freezing - if (noiseOcean < -0.12f) { - biome = EnumBiome.COLD_BEACH; - } else if (rainfall < 0f) { - if (hills < -0.1f) { - biome = EnumBiome.COLD_TAIGA; - } else if (hills < 0.5f) { - biome = EnumBiome.COLD_TAIGA_HILLS; - } else { - biome = EnumBiome.COLD_TAIGA_M; - } - } else { - if (hills < 0.7f) { - biome = EnumBiome.ICE_PLAINS; - } else { - biome = EnumBiome.ICE_PLAINS_SPIKES; - } - } - } else if (noiseOcean < -0.12f) { - biome = EnumBiome.BEACH; - } else if (temperature < 0f) { - // cold - if (hills < 0.2f) { - if (rainfall < -0.5f) { - biome = EnumBiome.EXTREME_HILLS_M; - } else if (rainfall > 0.5f) { - biome = EnumBiome.EXTREME_HILLS_PLUS_M; - } else if (rainfall < 0f) { - biome = EnumBiome.EXTREME_HILLS; - } else { - biome = EnumBiome.EXTREME_HILLS_PLUS; - } - } else { - if (rainfall < -0.6) { - biome = EnumBiome.MEGA_TAIGA; - } else if (rainfall > 0.6) { - biome = EnumBiome.MEGA_SPRUCE_TAIGA; - } else if (rainfall < 0.2f) { - biome = EnumBiome.TAIGA; - } else { - biome = EnumBiome.TAIGA_M; - } - } - } else if (temperature < 0.5f) { - // normal - if (temperature < 0.25f) { - if (rainfall < 0f) { - if (noiseOcean < 0f) { - biome = EnumBiome.SUNFLOWER_PLAINS; - } else { - biome = EnumBiome.PLAINS; - } - } else if (rainfall < 0.25f) { - if (noiseOcean < 0f) { - biome = EnumBiome.FLOWER_FOREST; - } else { - biome = EnumBiome.FOREST; - } - } else { - if (noiseOcean < 0f) { - biome = EnumBiome.BIRCH_FOREST_M; - } else { - biome = EnumBiome.BIRCH_FOREST; - } - } - } else { - if (rainfall < -0.2f) { - if (noiseOcean < 0f) { - biome = EnumBiome.SWAMPLAND_M; - } else { - biome = EnumBiome.SWAMP; - } - } else if (rainfall > 0.1f) { - if (noiseOcean < 0.155f) { - biome = EnumBiome.JUNGLE_M; - } else { - biome = EnumBiome.JUNGLE; - } - } else { - if (noiseOcean < 0f) { - biome = EnumBiome.ROOFED_FOREST_M; - } else { - biome = EnumBiome.ROOFED_FOREST; - } - } - } - } else { - // hot - if (rainfall < 0f) { - if (noiseOcean < 0f) { - biome = EnumBiome.DESERT_M; - } else if (hills < 0f) { - biome = EnumBiome.DESERT_HILLS; - } else { - biome = EnumBiome.DESERT; - } - } else if (rainfall > 0.4f) { - if (noiseOcean < 0.155f) { - if (hills < 0f) { - biome = EnumBiome.SAVANNA_PLATEAU_M; - } else { - biome = EnumBiome.SAVANNA_M; - } - } else { - if (hills < 0f) { - biome = EnumBiome.SAVANNA_PLATEAU; - } else { - biome = EnumBiome.SAVANNA; - } - } - } else { - if (noiseOcean < 0f) { - if (hills < 0f) { - biome = EnumBiome.MESA_PLATEAU_F; - } else { - biome = EnumBiome.MESA_PLATEAU_F_M; - } - } else if (hills < 0f) { - if (noiseOcean < 0.2f) { - biome = EnumBiome.MESA_PLATEAU_M; - } else { - biome = EnumBiome.MESA_PLATEAU; - } - } else { - if (noiseOcean < 0.1f) { - biome = EnumBiome.MESA_BRYCE; - } else { - biome = EnumBiome.MESA; - } - } - } - } - } - - return biome.biome; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/EnumBiome.java b/src/main/java/cn/nukkit/level/biome/EnumBiome.java deleted file mode 100644 index 2c7508358..000000000 --- a/src/main/java/cn/nukkit/level/biome/EnumBiome.java +++ /dev/null @@ -1,136 +0,0 @@ -package cn.nukkit.level.biome; - -import cn.nukkit.level.biome.impl.EndBiome; -import cn.nukkit.level.biome.impl.HellBiome; -import cn.nukkit.level.biome.impl.beach.BeachBiome; -import cn.nukkit.level.biome.impl.beach.ColdBeachBiome; -import cn.nukkit.level.biome.impl.desert.DesertBiome; -import cn.nukkit.level.biome.impl.desert.DesertHillsBiome; -import cn.nukkit.level.biome.impl.desert.DesertMBiome; -import cn.nukkit.level.biome.impl.extremehills.*; -import cn.nukkit.level.biome.impl.forest.FlowerForestBiome; -import cn.nukkit.level.biome.impl.forest.ForestBiome; -import cn.nukkit.level.biome.impl.forest.ForestHillsBiome; -import cn.nukkit.level.biome.impl.iceplains.IcePlainsBiome; -import cn.nukkit.level.biome.impl.iceplains.IcePlainsSpikesBiome; -import cn.nukkit.level.biome.impl.jungle.*; -import cn.nukkit.level.biome.impl.mesa.*; -import cn.nukkit.level.biome.impl.mushroom.MushroomIslandBiome; -import cn.nukkit.level.biome.impl.mushroom.MushroomIslandShoreBiome; -import cn.nukkit.level.biome.impl.ocean.DeepOceanBiome; -import cn.nukkit.level.biome.impl.ocean.FrozenOceanBiome; -import cn.nukkit.level.biome.impl.ocean.OceanBiome; -import cn.nukkit.level.biome.impl.plains.PlainsBiome; -import cn.nukkit.level.biome.impl.plains.SunflowerPlainsBiome; -import cn.nukkit.level.biome.impl.river.FrozenRiverBiome; -import cn.nukkit.level.biome.impl.river.RiverBiome; -import cn.nukkit.level.biome.impl.roofedforest.RoofedForestBiome; -import cn.nukkit.level.biome.impl.roofedforest.RoofedForestMBiome; -import cn.nukkit.level.biome.impl.savanna.SavannaBiome; -import cn.nukkit.level.biome.impl.savanna.SavannaMBiome; -import cn.nukkit.level.biome.impl.savanna.SavannaPlateauBiome; -import cn.nukkit.level.biome.impl.savanna.SavannaPlateauMBiome; -import cn.nukkit.level.biome.impl.swamp.SwampBiome; -import cn.nukkit.level.biome.impl.swamp.SwamplandMBiome; -import cn.nukkit.level.biome.impl.taiga.*; - -/** - * @author DaPorkchop_ - *

- * A more effective way of accessing specific biomes (to prevent Biome.getBiome(Biome.OCEAN) and such) - * Also just looks cleaner than listing everything as static final in {@link Biome} - *

- */ -public enum EnumBiome { - - OCEAN(0, new OceanBiome()), - PLAINS(1, new PlainsBiome()), - DESERT(2, new DesertBiome()), - EXTREME_HILLS(3, new ExtremeHillsBiome()), - FOREST(4, new ForestBiome()), - TAIGA(5, new TaigaBiome()), - SWAMP(6, new SwampBiome()), - RIVER(7, new RiverBiome()), - HELL(8, new HellBiome()), - END(9, new EndBiome()), - FROZEN_OCEAN(10, new FrozenOceanBiome()), - FROZEN_RIVER(11, new FrozenRiverBiome()), - ICE_PLAINS(12, new IcePlainsBiome()), - MUSHROOM_ISLAND(14, new MushroomIslandBiome()), - MUSHROOM_ISLAND_SHORE(15, new MushroomIslandShoreBiome()), - BEACH(16, new BeachBiome()), - DESERT_HILLS(17, new DesertHillsBiome()), - FOREST_HILLS(18, new ForestHillsBiome()), - TAIGA_HILLS(19, new TaigaHillsBiome()), - EXTREME_HILLS_EDGE(20, new ExtremeHillsEdgeBiome()), - JUNGLE(21, new JungleBiome()), - JUNGLE_HILLS(22, new JungleHillsBiome()), - JUNGLE_EDGE(23, new JungleEdgeBiome()), - DEEP_OCEAN(24, new DeepOceanBiome()), - STONE_BEACH(25, new StoneBeachBiome()), - COLD_BEACH(26, new ColdBeachBiome()), - BIRCH_FOREST(27, new ForestBiome(ForestBiome.TYPE_BIRCH)), - BIRCH_FOREST_HILLS(28, new ForestHillsBiome(ForestHillsBiome.TYPE_BIRCH)), - ROOFED_FOREST(29, new RoofedForestBiome()), - COLD_TAIGA(30, new ColdTaigaBiome()), - COLD_TAIGA_HILLS(31, new ColdTaigaHillsBiome()), - MEGA_TAIGA(32, new MegaTaigaBiome()), - MEGA_TAIGA_HILLS(33, new MegaTaigaHillsBiome()), - EXTREME_HILLS_PLUS(34, new ExtremeHillsPlusBiome()), - SAVANNA(35, new SavannaBiome()), - SAVANNA_PLATEAU(36, new SavannaPlateauBiome()), - MESA(37, new MesaBiome()), - MESA_PLATEAU_F(38, new MesaPlateauFBiome()), - MESA_PLATEAU(39, new MesaPlateauBiome()), - // All biomes below this comment are mutated variants of existing biomes - SUNFLOWER_PLAINS(129, new SunflowerPlainsBiome()), - DESERT_M(130, new DesertMBiome()), - EXTREME_HILLS_M(131, new ExtremeHillsMBiome()), - FLOWER_FOREST(132, new FlowerForestBiome()), - TAIGA_M(133, new TaigaMBiome()), - SWAMPLAND_M(134, new SwamplandMBiome()), - // No, the following jumps in IDs are NOT mistakes - ICE_PLAINS_SPIKES(140, new IcePlainsSpikesBiome()), - JUNGLE_M(149, new JungleMBiome()), - JUNGLE_EDGE_M(151, new JungleEdgeMBiome()), - BIRCH_FOREST_M(155, new ForestBiome(ForestBiome.TYPE_BIRCH_TALL)), - BIRCH_FOREST_HILLS_M(156, new ForestHillsBiome(ForestBiome.TYPE_BIRCH_TALL)), - ROOFED_FOREST_M(157, new RoofedForestMBiome()), - COLD_TAIGA_M(158, new ColdTaigaMBiome()), - MEGA_SPRUCE_TAIGA(160, new MegaSpruceTaigaBiome()), - EXTREME_HILLS_PLUS_M(162, new ExtremeHillsPlusMBiome()), - SAVANNA_M(163, new SavannaMBiome()), - SAVANNA_PLATEAU_M(164, new SavannaPlateauMBiome()), - MESA_BRYCE(165, new MesaBryceBiome()), - MESA_PLATEAU_F_M(166, new MesaPlateauFMBiome()), - MESA_PLATEAU_M(167, new MesaPlateauMBiome()); - - public final int id; - public final Biome biome; - - EnumBiome(int id, Biome biome) { - Biome.register(id, biome); - this.id = id; - this.biome = biome; - } - - /** - * You really shouldn't use this method if you can help it, reference the biomes directly! - * - * @param id biome id - * @return biome - */ - public static Biome getBiome(int id) { - return Biome.getBiome(id); - } - - /** - * You really shouldn't use this method if you can help it, reference the biomes directly! - * - * @param name biome name - * @return biome - */ - public static Biome getBiome(String name) { - return Biome.getBiome(name); - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/EndBiome.java b/src/main/java/cn/nukkit/level/biome/impl/EndBiome.java deleted file mode 100644 index 8f27a2416..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/EndBiome.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.nukkit.level.biome.impl; - -import cn.nukkit.level.biome.Biome; - -public class EndBiome extends Biome { - - @Override - public String getName() { - return "The End"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/HellBiome.java b/src/main/java/cn/nukkit/level/biome/impl/HellBiome.java deleted file mode 100644 index d7983dd73..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/HellBiome.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.level.biome.impl; - -import cn.nukkit.level.biome.Biome; - -public class HellBiome extends Biome { - - @Override - public String getName() { - return "Hell"; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/beach/BeachBiome.java b/src/main/java/cn/nukkit/level/biome/impl/beach/BeachBiome.java deleted file mode 100644 index e9fc9c24f..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/beach/BeachBiome.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.level.biome.impl.beach; - -import cn.nukkit.level.biome.type.SandyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorCactus; -import cn.nukkit.level.generator.populator.impl.PopulatorSugarcane; -import cn.nukkit.level.generator.populator.impl.PopulatorTallSugarcane; -import cn.nukkit.level.generator.populator.impl.PopulatorWell; - -/** - * @author PeratX - * Nukkit Project - */ -public class BeachBiome extends SandyBiome { - public BeachBiome() { - PopulatorSugarcane sugarcane = new PopulatorSugarcane(); - //sugarcane.setBaseAmount(2); - sugarcane.setRandomAmount(2); - this.addPopulator(sugarcane); - PopulatorTallSugarcane tallSugarcane = new PopulatorTallSugarcane(); - //tallSugarcane.setBaseAmount(1); - tallSugarcane.setRandomAmount(1); - this.addPopulator(tallSugarcane); - PopulatorCactus cactus = new PopulatorCactus(); - cactus.setRandomAmount(1); - this.addPopulator(cactus); - this.addPopulator(new PopulatorWell()); - - this.setBaseHeight(0f); - this.setHeightVariation(0.025f); - } - - @Override - public String getName() { - return "Beach"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/beach/ColdBeachBiome.java b/src/main/java/cn/nukkit/level/biome/impl/beach/ColdBeachBiome.java deleted file mode 100644 index 17927e043..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/beach/ColdBeachBiome.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.level.biome.impl.beach; - -import cn.nukkit.level.biome.type.SandyBiome; -import cn.nukkit.level.generator.populator.impl.WaterIcePopulator; - -public class ColdBeachBiome extends SandyBiome { - public ColdBeachBiome() { - this.addPopulator(new WaterIcePopulator()); - - this.setBaseHeight(0f); - this.setHeightVariation(0.025f); - } - - @Override - public int getCoverId(int x, int z) { - return 1248; - } - - @Override - public String getName() { - return "Cold Beach"; - } - - @Override - public boolean isFreezing() { - return true; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/desert/DesertBiome.java b/src/main/java/cn/nukkit/level/biome/impl/desert/DesertBiome.java deleted file mode 100644 index 560715533..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/desert/DesertBiome.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.level.biome.impl.desert; - -import cn.nukkit.level.biome.type.SandyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorCactus; -import cn.nukkit.level.generator.populator.impl.PopulatorDeadBush; -import cn.nukkit.level.generator.populator.impl.PopulatorWell; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class DesertBiome extends SandyBiome { - public DesertBiome() { - PopulatorCactus cactus = new PopulatorCactus(); - cactus.setBaseAmount(2); - this.addPopulator(cactus); - - PopulatorDeadBush deadbush = new PopulatorDeadBush(); - deadbush.setBaseAmount(2); - this.addPopulator(deadbush); - - this.addPopulator(new PopulatorWell()); - - this.setBaseHeight(0.125f); - this.setHeightVariation(0.05f); - } - - @Override - public String getName() { - return "Desert"; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/desert/DesertHillsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/desert/DesertHillsBiome.java deleted file mode 100644 index 370aeda9d..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/desert/DesertHillsBiome.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.biome.impl.desert; - -/** - * @author DaPorkchop_ - */ -public class DesertHillsBiome extends DesertBiome { - public DesertHillsBiome() { - super(); - - this.setBaseHeight(0.45f); - this.setHeightVariation(0.3f); - } - - @Override - public String getName() { - return "Desert Hills"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/desert/DesertMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/desert/DesertMBiome.java deleted file mode 100644 index 869082be9..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/desert/DesertMBiome.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.biome.impl.desert; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class DesertMBiome extends DesertBiome { - public DesertMBiome() { - super(); - - this.setBaseHeight(0.225f); - this.setHeightVariation(0.25f); - } - - @Override - public String getName() { - return "Desert M"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsBiome.java deleted file mode 100644 index 8ec6b7723..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsBiome.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.level.biome.impl.extremehills; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.object.ore.OreType; -import cn.nukkit.level.generator.populator.impl.PopulatorOre; -import cn.nukkit.level.generator.populator.impl.PopulatorTree; - -/** - * @author DaPorkchop_ - * Nukkit Project - *

- * make sure this is touching another extreme hills type or it'll look dumb - * - * steep mountains with flat areas between - */ -public class ExtremeHillsBiome extends GrassyBiome { - public ExtremeHillsBiome() { - this(true); - } - - public ExtremeHillsBiome(boolean tree) { - super(); - - if (tree) { - PopulatorTree trees = new PopulatorTree(BlockSapling.SPRUCE); - trees.setBaseAmount(2); - trees.setRandomAmount(2); - this.addPopulator(trees); - } - - this.addPopulator(new PopulatorOre(STONE, new OreType[]{ - new OreType(Block.get(BlockID.EMERALD_ORE), 11, 1, 0, 32) - })); - - this.setBaseHeight(1f); - this.setHeightVariation(0.5f); - } - - @Override - public String getName() { - return "Extreme Hills"; - } - - @Override - public boolean doesOverhang() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsEdgeBiome.java b/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsEdgeBiome.java deleted file mode 100644 index aeffaa732..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsEdgeBiome.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.level.biome.impl.extremehills; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class ExtremeHillsEdgeBiome extends ExtremeHillsBiome { - - public ExtremeHillsEdgeBiome() { - super(); - - this.setBaseHeight(0.8f); - this.setHeightVariation(0.3f); - } - - @Override - public String getName() { - return "Extreme Hills Edge"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsMBiome.java deleted file mode 100644 index 9ec1fe304..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsMBiome.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.level.biome.impl.extremehills; - -import cn.nukkit.level.generator.noise.nukkit.f.SimplexF; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - *

- * make sure this is touching another extreme hills type or it'll look dumb - * - * very smooth hills with flat areas between - */ -public class ExtremeHillsMBiome extends ExtremeHillsPlusBiome { - private static final SimplexF gravelNoise = new SimplexF(new NukkitRandom(0), 1f, 0.25f, 0.015625f); - - public ExtremeHillsMBiome() { - this(true); - } - - public ExtremeHillsMBiome(boolean tree) { - super(tree); - - this.setBaseHeight(1f); - this.setHeightVariation(0.5f); - } - - @Override - public String getName() { - return "Extreme Hills M"; - } - - @Override - public int getSurfaceId(int x, int y, int z) { - return gravelNoise.noise2D(x, z, true) < -0.75f ? 208 : super.getSurfaceId(x, y, z); - } - - @Override - public int getSurfaceDepth(int x, int y, int z) { - return gravelNoise.noise2D(x, z, true) < -0.75f ? 4 : super.getSurfaceDepth(x, y, z); - } - - @Override - public int getGroundDepth(int x, int y, int z) { - return gravelNoise.noise2D(x, z, true) < -0.75f ? 0 : super.getGroundDepth(x, y, z); - } - - @Override - public boolean doesOverhang() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsPlusBiome.java b/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsPlusBiome.java deleted file mode 100644 index b93b2e89d..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsPlusBiome.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.level.biome.impl.extremehills; - -/** - * @author DaPorkchop_ - * Nukkit Project - *

- * make sure this is touching another extreme hills type or it'll look dumb - * - * vertical cliffs, flat on top and on bottom - */ -public class ExtremeHillsPlusBiome extends ExtremeHillsBiome { - - public ExtremeHillsPlusBiome() { - this(true); - } - - public ExtremeHillsPlusBiome(boolean tree) { - super(tree); - - this.setBaseHeight(1f); - this.setHeightVariation(0.5f); - } - - @Override - public String getName() { - return "Extreme Hills+"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsPlusMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsPlusMBiome.java deleted file mode 100644 index dfb7e1903..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/extremehills/ExtremeHillsPlusMBiome.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.level.biome.impl.extremehills; - -/** - * @author DaPorkchop_ - * Nukkit Project - *

- * make sure this is touching another extreme hills type or it'll look dumb - * - * very steep (1-2 block at a time) hills with round tops. flat in between - */ -public class ExtremeHillsPlusMBiome extends ExtremeHillsMBiome { - - public ExtremeHillsPlusMBiome() { - super(false); - - this.setBaseHeight(1f); - this.setHeightVariation(0.5f); - } - - @Override - public String getName() { - return "Extreme Hills+ M"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/extremehills/StoneBeachBiome.java b/src/main/java/cn/nukkit/level/biome/impl/extremehills/StoneBeachBiome.java deleted file mode 100644 index de7615193..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/extremehills/StoneBeachBiome.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.level.biome.impl.extremehills; - -import cn.nukkit.level.biome.type.CoveredBiome; - -/** - * @author DaPorkchop_ - *

- * Occurs when Extreme hills and variants touch the ocean. - * - * Nearly ertical cliffs, but no overhangs. Height difference is 2-7 near ocean, and pretty much flat everywhere else - */ -public class StoneBeachBiome extends CoveredBiome { - - public StoneBeachBiome() { - this.setBaseHeight(0.1f); - this.setHeightVariation(0.8f); - } - - @Override - public int getSurfaceDepth(int x, int y, int z) { - return 0; - } - - @Override - public int getSurfaceId(int x, int y, int z) { - return 0; - } - - @Override - public int getGroundDepth(int x, int y, int z) { - return 0; - } - - @Override - public int getGroundId(int x, int y, int z) { - return 0; - } - - @Override - public String getName() { - return "Stone Beach"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/forest/FlowerForestBiome.java b/src/main/java/cn/nukkit/level/biome/impl/forest/FlowerForestBiome.java deleted file mode 100644 index 5ff7bcaf1..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/forest/FlowerForestBiome.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.level.biome.impl.forest; - -import cn.nukkit.block.BlockDoublePlant; -import cn.nukkit.block.BlockFlower; -import cn.nukkit.level.generator.populator.impl.PopulatorFlower; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class FlowerForestBiome extends ForestBiome { - public FlowerForestBiome() { - this(TYPE_NORMAL); - } - - public FlowerForestBiome(int type) { - super(type); - - //see https://minecraft.gamepedia.com/Flower#Flower_biomes - PopulatorFlower flower = new PopulatorFlower(); - flower.setBaseAmount(10); - flower.addType(DANDELION, 0); - flower.addType(RED_FLOWER, BlockFlower.TYPE_POPPY); - flower.addType(RED_FLOWER, BlockFlower.TYPE_ALLIUM); - flower.addType(RED_FLOWER, BlockFlower.TYPE_AZURE_BLUET); - flower.addType(RED_FLOWER, BlockFlower.TYPE_RED_TULIP); - flower.addType(RED_FLOWER, BlockFlower.TYPE_ORANGE_TULIP); - flower.addType(RED_FLOWER, BlockFlower.TYPE_WHITE_TULIP); - flower.addType(RED_FLOWER, BlockFlower.TYPE_PINK_TULIP); - flower.addType(RED_FLOWER, BlockFlower.TYPE_OXEYE_DAISY); - flower.addType(RED_FLOWER, BlockFlower.CORNFLOWER); - flower.addType(RED_FLOWER, BlockFlower.LILY_OF_THE_VALLEY); - flower.addType(DOUBLE_PLANT, BlockDoublePlant.LILAC); - flower.addType(DOUBLE_PLANT, BlockDoublePlant.ROSE_BUSH); - flower.addType(DOUBLE_PLANT, BlockDoublePlant.PEONY); - this.addPopulator(flower); - - this.setHeightVariation(0.4f); - } - - @Override - public String getName() { - return this.type == TYPE_BIRCH ? "Birch Forest" : "Forest"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/forest/ForestBiome.java b/src/main/java/cn/nukkit/level/biome/impl/forest/ForestBiome.java deleted file mode 100644 index 04aad146d..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/forest/ForestBiome.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.level.biome.impl.forest; - -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorFallenTree; -import cn.nukkit.level.generator.populator.impl.PopulatorTree; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ForestBiome extends GrassyBiome { - public static final int TYPE_NORMAL = 0; - public static final int TYPE_BIRCH = 1; - public static final int TYPE_BIRCH_TALL = 2; - - public final int type; - - public ForestBiome() { - this(TYPE_NORMAL); - } - - public ForestBiome(int type) { - super(); - - this.type = type; - - PopulatorTree trees = new PopulatorTree(type == TYPE_BIRCH_TALL ? BlockSapling.BIRCH_TALL : BlockSapling.BIRCH); - trees.setBaseAmount(type == TYPE_NORMAL ? 3 : 6); - this.addPopulator(trees); - - if (type == TYPE_NORMAL) { - // Normal forest biomes have both oak and birch trees - trees = new PopulatorTree(BlockSapling.OAK); - trees.setBaseAmount(3); - this.addPopulator(trees); - } - - PopulatorFallenTree fallenTree = new PopulatorFallenTree(); - fallenTree.setType(type); - this.addPopulator(fallenTree); - } - - @Override - public String getName() { - switch (this.type) { - case TYPE_BIRCH: - return "Birch Forest"; - case TYPE_BIRCH_TALL: - return "Birch Forest M"; - default: - return "Forest"; - } - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/forest/ForestHillsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/forest/ForestHillsBiome.java deleted file mode 100644 index 658cea5d3..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/forest/ForestHillsBiome.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.level.biome.impl.forest; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class ForestHillsBiome extends ForestBiome { - public ForestHillsBiome() { - this(TYPE_NORMAL); - } - - public ForestHillsBiome(int type) { - super(type); - - this.setBaseHeight(0.45f); - this.setHeightVariation(0.3f); - } - - @Override - public String getName() { - switch (this.type) { - case TYPE_BIRCH: - return "Birch Forest Hills"; - case TYPE_BIRCH_TALL: - return "Birch Forest Hills M"; - default: - return "Forest Hills"; - } - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/iceplains/IcePlainsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/iceplains/IcePlainsBiome.java deleted file mode 100644 index 834556098..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/iceplains/IcePlainsBiome.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.level.biome.impl.iceplains; - -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.biome.type.SnowyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorTree; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class IcePlainsBiome extends SnowyBiome { - - public IcePlainsBiome() { - super(); - - PopulatorTree trees = new PopulatorTree(BlockSapling.SPRUCE); - trees.setBaseAmount(0); - trees.setRandomAmount(1); - this.addPopulator(trees); - - this.setBaseHeight(0.125f); - this.setHeightVariation(0.05f); - } - - public String getName() { - return "Ice Plains"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/iceplains/IcePlainsSpikesBiome.java b/src/main/java/cn/nukkit/level/biome/impl/iceplains/IcePlainsSpikesBiome.java deleted file mode 100644 index 539309faf..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/iceplains/IcePlainsSpikesBiome.java +++ /dev/null @@ -1,102 +0,0 @@ -package cn.nukkit.level.biome.impl.iceplains; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class IcePlainsSpikesBiome extends IcePlainsBiome { - - public IcePlainsSpikesBiome() { - super(); - - PopulatorIceSpikes iceSpikes = new PopulatorIceSpikes(); - this.addPopulator(iceSpikes); - } - - @Override - public int getSurfaceId(int x, int y, int z) { - return 1280; - } - - public String getName() { - return "Ice Plains Spikes"; - } - - - /** - * @author DaPorkchop_ - *

- * Please excuse this mess, but it runs way faster than the correct method - */ - private static class PopulatorIceSpikes extends Populator { - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - for (int i = 0; i < 8; i++) { - int x = (chunkX << 4) + random.nextBoundedInt(16); - int z = (chunkZ << 4) + random.nextBoundedInt(16); - boolean isTall = random.nextBoundedInt(16) == 0; - int height = 10 + random.nextBoundedInt(16) + (isTall ? random.nextBoundedInt(31) : 0); - int startY = getHighestWorkableBlock(x, z, chunk); - int maxY = startY + height; - if (isTall) { - for (int y = startY; y < maxY; y++) { - //center column - level.setBlockAt(x, y, z, PACKED_ICE); - //t shape - level.setBlockAt(x + 1, y, z, PACKED_ICE); - level.setBlockAt(x - 1, y, z, PACKED_ICE); - level.setBlockAt(x, y, z + 1, PACKED_ICE); - level.setBlockAt(x, y, z - 1, PACKED_ICE); - //additional blocks on the side - if (random.nextBoolean()) { - level.setBlockAt(x + 1, y, z + 1, PACKED_ICE); - } - if (random.nextBoolean()) { - level.setBlockAt(x + 1, y, z - 1, PACKED_ICE); - } - if (random.nextBoolean()) { - level.setBlockAt(x - 1, y, z + 1, PACKED_ICE); - } - if (random.nextBoolean()) { - level.setBlockAt(x - 1, y, z - 1, PACKED_ICE); - } - } - //finish with a point - level.setBlockAt(x + 1, maxY, z, PACKED_ICE); - level.setBlockAt(x - 1, maxY, z, PACKED_ICE); - level.setBlockAt(x, maxY, z + 1, PACKED_ICE); - level.setBlockAt(x, maxY, z - 1, PACKED_ICE); - for (int y = maxY; y < maxY + 3; y++) { - level.setBlockAt(x, y, z, PACKED_ICE); - } - } else { - //the maximum possible radius in blocks - int baseWidth = random.nextBoundedInt(1) + 4; - float shrinkFactor = baseWidth / (float) height; - float currWidth = baseWidth; - for (int y = startY; y < maxY; y++) { - for (int xx = (int) -currWidth; xx < currWidth; xx++) { - for (int zz = (int) -currWidth; zz < currWidth; zz++) { - int currDist = (int) Math.sqrt(xx * xx + zz * zz); - if ((int) currWidth != currDist && random.nextBoolean()) { - level.setBlockAt(x + xx, y, z + zz, PACKED_ICE); - } - } - } - currWidth -= shrinkFactor; - } - } - } - } - - public int getHighestWorkableBlock(int x, int z, FullChunk chunk) { - return chunk.getHighestBlockAt(x & 0xF, z & 0xF) - 5; - } - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleBiome.java b/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleBiome.java deleted file mode 100644 index 656f66345..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleBiome.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.level.biome.impl.jungle; - -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorMelon; -import cn.nukkit.level.generator.populator.impl.tree.JungleBigTreePopulator; -import cn.nukkit.level.generator.populator.impl.tree.JungleTreePopulator; - -/** - * @author DaPorkchop_ - */ -public class JungleBiome extends GrassyBiome { - public JungleBiome() { - super(); - - JungleTreePopulator trees = new JungleTreePopulator(); - trees.setBaseAmount(10); - this.addPopulator(trees); - - JungleBigTreePopulator bigTrees = new JungleBigTreePopulator(); - bigTrees.setBaseAmount(7); - this.addPopulator(bigTrees); - - PopulatorMelon melon = new PopulatorMelon(); - melon.setRandomAmount(2); - this.addPopulator(melon); - } - - @Override - public String getName() { - return "Jungle"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleEdgeBiome.java b/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleEdgeBiome.java deleted file mode 100644 index 620936c8d..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleEdgeBiome.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.nukkit.level.biome.impl.jungle; - -/** - * @author DaPorkchpo_ - */ -public class JungleEdgeBiome extends JungleBiome { - - @Override - public String getName() { - return "Jungle Edge"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleEdgeMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleEdgeMBiome.java deleted file mode 100644 index 2a53b8cd7..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleEdgeMBiome.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.nukkit.level.biome.impl.jungle; - -/** - * @author DaPorkchpo_ - */ -public class JungleEdgeMBiome extends JungleEdgeBiome { - - @Override - public String getName() { - return "Jungle Edge M"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleHillsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleHillsBiome.java deleted file mode 100644 index b531fd33a..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleHillsBiome.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.biome.impl.jungle; - -/** - * @author DaPorkchop_ - */ -public class JungleHillsBiome extends JungleBiome { - public JungleHillsBiome() { - super(); - - this.setBaseHeight(0.45f); - this.setHeightVariation(0.3f); - } - - @Override - public String getName() { - return "Jungle Hills"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleMBiome.java deleted file mode 100644 index 3b8ab0dcd..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/jungle/JungleMBiome.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.level.biome.impl.jungle; - -import cn.nukkit.level.generator.populator.impl.tree.JungleFloorPopulator; - -/** - * @author DaPorkchop_ - */ -public class JungleMBiome extends JungleBiome { - public JungleMBiome() { - super(); - - JungleFloorPopulator floor = new JungleFloorPopulator(); - floor.setBaseAmount(10); - floor.setRandomAmount(5); - this.addPopulator(floor); - - this.setBaseHeight(0.2f); - this.setHeightVariation(0.4f); - } - - @Override - public String getName() { - return "Jungle M"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaBiome.java b/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaBiome.java deleted file mode 100644 index cd8f8cf01..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaBiome.java +++ /dev/null @@ -1,124 +0,0 @@ -package cn.nukkit.level.biome.impl.mesa; - -import cn.nukkit.level.biome.type.CoveredBiome; -import cn.nukkit.level.generator.noise.nukkit.f.SimplexF; -import cn.nukkit.level.generator.populator.impl.PopulatorCactus; -import cn.nukkit.level.generator.populator.impl.PopulatorDeadBush; -import cn.nukkit.math.NukkitRandom; - -import java.util.Arrays; -import java.util.SplittableRandom; - -/** - * @author DaPorkchop_ - *

- * Handles the placement of stained clay for all mesa variants - */ -public class MesaBiome extends CoveredBiome { - - static final int[] colorLayer = new int[64]; - static final SimplexF redSandNoise = new SimplexF(new NukkitRandom(937478913), 2f, 0.25f, 0.25f); - static final SimplexF colorNoise = new SimplexF(new NukkitRandom(193759875), 2f, 0.25f, 0.03125f); - - static { - SplittableRandom random = new SplittableRandom(29864); - - Arrays.fill(colorLayer, -1); // hard clay, other values are stained clay - setRandomLayerColor(random, 14, 1); // orange - setRandomLayerColor(random, 8, 4); // yellow - setRandomLayerColor(random, 7, 12); // brown - setRandomLayerColor(random, 10, 14); // red - for (int i = 0, j = 0; i < random.nextInt(3) + 3; i++) { - j += random.nextInt(6) + 4; - if (j >= colorLayer.length - 3) { - break; - } - if (random.nextInt(2) == 0 || j < colorLayer.length - 1 && random.nextInt(2) == 0) { - colorLayer[j - 1] = 8; // light gray - } else { - colorLayer[j] = 0; // white - } - } - } - - protected int moundHeight; - private SimplexF moundNoise = new SimplexF(new NukkitRandom(347228794), 2f, 0.25f, getMoundFrequency()); - public MesaBiome() { - PopulatorCactus cactus = new PopulatorCactus(); - cactus.setBaseAmount(1); - cactus.setRandomAmount(1); - this.addPopulator(cactus); - - PopulatorDeadBush deadBush = new PopulatorDeadBush(); - deadBush.setBaseAmount(3); - deadBush.setRandomAmount(2); - this.addPopulator(deadBush); - - this.setMoundHeight(17); - } - - private static void setRandomLayerColor(SplittableRandom random, int sliceCount, int color) { - for (int i = 0; i < random.nextInt(4) + sliceCount; i++) { - int j = random.nextInt(colorLayer.length); - int k = 0; - while (k < random.nextInt(2) + 1 && j < colorLayer.length) { - colorLayer[j++] = color; - k++; - } - } - } - - public void setMoundHeight(int height) { - this.moundHeight = height; - } - - @Override - public int getSurfaceDepth(int x, int y, int z) { - return y < (71 + Math.round((redSandNoise.noise2D(x, z, true) + 1) * 1.5f)) ? 3 : y - 66; - } - - @Override - public int getSurfaceId(int x, int y, int z) { - if (y < (71 + Math.round((redSandNoise.noise2D(x, z, true) + 1) * 1.5f))) { - return 193; - } else { - int meta = colorLayer[(y + Math.round((colorNoise.noise2D(x, z, true) + 1) * 1.5f)) & 0x3F]; - return (meta == -1 ? 2752 : 2544) | Math.max(0, meta); - } - } - - @Override - public int getGroundDepth(int x, int y, int z) { - return y < (71 + Math.round((redSandNoise.noise2D(x, z, true) + 1) * 1.5f)) ? 2 : 0; - } - - @Override - public int getGroundId(int x, int y, int z) { - return 2864; - } - - @Override - public String getName() { - return "Mesa"; - } - - protected float getMoundFrequency() { - return 0.0078125f; - } - - @Override - public int getHeightOffset(int x, int z) { - float n = moundNoise.noise2D(x, z, true); - float a = minHill(); - return (n > a && n < a + 0.2f) ? (int) ((n - a) * 5f * moundHeight) : n < a + 0.1f ? 0 : moundHeight; - } - - protected float minHill() { - return -0.1f; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaBryceBiome.java b/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaBryceBiome.java deleted file mode 100644 index 2251a2f6f..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaBryceBiome.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.level.biome.impl.mesa; - -/** - * @author DaPorkchop_ - */ -public class MesaBryceBiome extends MesaBiome { - - @Override - public String getName() { - return "Mesa (Bryce)"; - } - - @Override - protected float getMoundFrequency() { - return 0.0625f; - } - - @Override - protected float minHill() { - return 0.3f; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauBiome.java b/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauBiome.java deleted file mode 100644 index 72d8e2997..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauBiome.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.level.biome.impl.mesa; - -/** - * @author DaPorkchop_ - */ -public class MesaPlateauBiome extends MesaBiome { - public MesaPlateauBiome() { - super(); - - this.setBaseHeight(1.5f); - this.setHeightVariation(0.025f); - - this.setMoundHeight(0); - } - - @Override - public String getName() { - return "Mesa Plateau"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauFBiome.java b/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauFBiome.java deleted file mode 100644 index cd7d3f539..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauFBiome.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.level.biome.impl.mesa; - -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.generator.populator.impl.PopulatorTree; - -/** - * @author DaPorkchop_ - */ -public class MesaPlateauFBiome extends MesaPlateauBiome { - public MesaPlateauFBiome() { - super(); - - PopulatorTree tree = new PopulatorTree(BlockSapling.OAK); - tree.setBaseAmount(2); - tree.setRandomAmount(1); - this.addPopulator(tree); - } - - @Override - public int getCoverId(int x, int z) { - return 32; - } - - @Override - public String getName() { - return "Mesa Plateau F"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauFMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauFMBiome.java deleted file mode 100644 index e9c46c745..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauFMBiome.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.nukkit.level.biome.impl.mesa; - -/** - * @author DaPorkchop_ - */ -public class MesaPlateauFMBiome extends MesaPlateauFBiome { - - @Override - public String getName() { - return "Mesa Plateau F M"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauMBiome.java deleted file mode 100644 index 268206f7b..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/mesa/MesaPlateauMBiome.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.level.biome.impl.mesa; - -/** - * @author DaPorkchop_ - */ -public class MesaPlateauMBiome extends MesaBiome { - public MesaPlateauMBiome() { - super(); - - this.setMoundHeight(10); - } - - @Override - public String getName() { - return "Mesa Plateau M"; - } - - - - @Override - protected float getMoundFrequency() { - return 0.02f; - } - - @Override - protected float minHill() { - return 0.1f; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/mushroom/MushroomIslandBiome.java b/src/main/java/cn/nukkit/level/biome/impl/mushroom/MushroomIslandBiome.java deleted file mode 100644 index b55a4b20a..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/mushroom/MushroomIslandBiome.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.level.biome.impl.mushroom; - -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.MushroomPopulator; - -public class MushroomIslandBiome extends GrassyBiome { - public MushroomIslandBiome() { - MushroomPopulator mushroomPopulator = new MushroomPopulator(); - mushroomPopulator.setBaseAmount(1); - addPopulator(mushroomPopulator); - - this.setBaseHeight(0.2f); - this.setHeightVariation(0.3f); - } - - @Override - public String getName() { - return "Mushroom Island"; - } - - @Override - public int getSurfaceId(int x, int y, int z) { - return 1760; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/mushroom/MushroomIslandShoreBiome.java b/src/main/java/cn/nukkit/level/biome/impl/mushroom/MushroomIslandShoreBiome.java deleted file mode 100644 index bc83ac855..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/mushroom/MushroomIslandShoreBiome.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.biome.impl.mushroom; - -/** - * @author DaPorkchop_ - */ -public class MushroomIslandShoreBiome extends MushroomIslandBiome { - public MushroomIslandShoreBiome() { - super(); - - this.setBaseHeight(0f); - this.setHeightVariation(0.025f); - } - - @Override - public String getName() { - return "Mushroom Island Shore"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/ocean/DeepOceanBiome.java b/src/main/java/cn/nukkit/level/biome/impl/ocean/DeepOceanBiome.java deleted file mode 100644 index 13c3866d7..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/ocean/DeepOceanBiome.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.level.biome.impl.ocean; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class DeepOceanBiome extends OceanBiome { - - public DeepOceanBiome() { - super(); - - //TODO: ocean monuments - this.setBaseHeight(-1.8f); - this.setHeightVariation(0.1f); - } - - @Override - public String getName() { - return "Deep Ocean"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/ocean/FrozenOceanBiome.java b/src/main/java/cn/nukkit/level/biome/impl/ocean/FrozenOceanBiome.java deleted file mode 100644 index 8581608e9..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/ocean/FrozenOceanBiome.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.level.biome.impl.ocean; - -import cn.nukkit.level.generator.populator.impl.WaterIcePopulator; - -/** - * @author DaPorkchop_ - * Nukkit Project - *

- * This biome does not generate naturally - */ -public class FrozenOceanBiome extends OceanBiome { - public FrozenOceanBiome() { - super(); - - WaterIcePopulator ice = new WaterIcePopulator(); - this.addPopulator(ice); - } - - @Override - public String getName() { - return "Frozen Ocean"; - } - - @Override - public boolean isFreezing() { - return true; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/ocean/OceanBiome.java b/src/main/java/cn/nukkit/level/biome/impl/ocean/OceanBiome.java deleted file mode 100644 index eaa095dd0..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/ocean/OceanBiome.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.level.biome.impl.ocean; - -import cn.nukkit.level.biome.type.WateryBiome; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class OceanBiome extends WateryBiome { - - public OceanBiome() { - this.setBaseHeight(-1.0f); - this.setHeightVariation(0.1f); - } - - @Override - public String getName() { - return "Ocean"; - } - - @Override - public int getGroundId(int x, int y, int z) { - return 208; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/plains/PlainsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/plains/PlainsBiome.java deleted file mode 100644 index ecfca50ae..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/plains/PlainsBiome.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.level.biome.impl.plains; - -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorPumpkin; -import cn.nukkit.level.generator.populator.impl.PopulatorTree; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class PlainsBiome extends GrassyBiome { - - public PlainsBiome() { - super(); - - PopulatorTree trees = new PopulatorTree(BlockSapling.OAK); - trees.setRandomAmount(1); - this.addPopulator(trees); - - this.addPopulator(new PopulatorPumpkin()); - - this.setBaseHeight(0.125f); - this.setHeightVariation(0.05f); - } - - @Override - public String getName() { - return "Plains"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/plains/SunflowerPlainsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/plains/SunflowerPlainsBiome.java deleted file mode 100644 index 73e0c3d26..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/plains/SunflowerPlainsBiome.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.level.biome.impl.plains; - -import cn.nukkit.block.BlockDoublePlant; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorDoublePlant; -import cn.nukkit.level.generator.populator.impl.PopulatorTree; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class SunflowerPlainsBiome extends GrassyBiome { - - public SunflowerPlainsBiome() { - super(); - - PopulatorTree trees = new PopulatorTree(BlockSapling.OAK); - trees.setRandomAmount(1); - this.addPopulator(trees); - - PopulatorDoublePlant sunflower = new PopulatorDoublePlant(BlockDoublePlant.SUNFLOWER); - sunflower.setBaseAmount(8); - sunflower.setRandomAmount(5); - this.addPopulator(sunflower); - - this.setBaseHeight(0.125f); - this.setHeightVariation(0.05f); - } - - @Override - public String getName() { - return "Sunflower Plains"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/river/FrozenRiverBiome.java b/src/main/java/cn/nukkit/level/biome/impl/river/FrozenRiverBiome.java deleted file mode 100644 index 4ac836a76..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/river/FrozenRiverBiome.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.level.biome.impl.river; - -import cn.nukkit.level.generator.populator.impl.WaterIcePopulator; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class FrozenRiverBiome extends RiverBiome { - public FrozenRiverBiome() { - super(); - - WaterIcePopulator ice = new WaterIcePopulator(); - this.addPopulator(ice); - } - - @Override - public String getName() { - return "Frozen River"; - } - - @Override - public boolean isFreezing() { - return true; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/river/RiverBiome.java b/src/main/java/cn/nukkit/level/biome/impl/river/RiverBiome.java deleted file mode 100644 index 94e74c1e6..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/river/RiverBiome.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.level.biome.impl.river; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.level.biome.type.WateryBiome; -import cn.nukkit.level.generator.object.ore.OreType; -import cn.nukkit.level.generator.populator.impl.PopulatorOre; -import cn.nukkit.level.generator.populator.impl.PopulatorSugarcane; -import cn.nukkit.level.generator.populator.impl.PopulatorTallSugarcane; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class RiverBiome extends WateryBiome { - - public RiverBiome() { - PopulatorSugarcane sugarcane = new PopulatorSugarcane(); - sugarcane.setBaseAmount(2); - sugarcane.setRandomAmount(2); - this.addPopulator(sugarcane); - PopulatorTallSugarcane tallSugarcane = new PopulatorTallSugarcane(); - tallSugarcane.setRandomAmount(1); - this.addPopulator(tallSugarcane); - - PopulatorOre ores = new PopulatorOre(DIRT, new OreType[]{ - new OreType(Block.get(BlockID.GRAVEL), 13, 33, 50, 60), - new OreType(Block.get(BlockID.CLAY_BLOCK), 8, 22, 50, 60) - }); - - this.addPopulator(ores); - - this.setBaseHeight(-0.5f); - this.setHeightVariation(0f); - } - - @Override - public String getName() { - return "River"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/roofedforest/RoofedForestBiome.java b/src/main/java/cn/nukkit/level/biome/impl/roofedforest/RoofedForestBiome.java deleted file mode 100644 index c8ebf2c33..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/roofedforest/RoofedForestBiome.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.level.biome.impl.roofedforest; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockFlower; -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.MushroomPopulator; -import cn.nukkit.level.generator.populator.impl.PopulatorFlower; -import cn.nukkit.level.generator.populator.impl.tree.DarkOakTreePopulator; - -public class RoofedForestBiome extends GrassyBiome { - - public RoofedForestBiome() { - super(); - - DarkOakTreePopulator tree = new DarkOakTreePopulator(); - tree.setBaseAmount(20); - tree.setRandomAmount(10); - this.addPopulator(tree); - - PopulatorFlower flower = new PopulatorFlower(); - flower.setBaseAmount(3); - flower.addType(Block.DANDELION, 0); - flower.addType(Block.RED_FLOWER, BlockFlower.TYPE_POPPY); - - MushroomPopulator mushroom = new MushroomPopulator(); - mushroom.setBaseAmount(1); - mushroom.setRandomAmount(2); - this.addPopulator(mushroom); - } - - @Override - public String getName() { - return "Roofed Forest"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/roofedforest/RoofedForestMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/roofedforest/RoofedForestMBiome.java deleted file mode 100644 index f9e950785..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/roofedforest/RoofedForestMBiome.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.level.biome.impl.roofedforest; - -public class RoofedForestMBiome extends RoofedForestBiome { - - public RoofedForestMBiome() { - super(); - - this.setBaseHeight(0.2f); - this.setHeightVariation(0.4f); - } - - @Override - public String getName() { - return "Roofed Forest M"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaBiome.java b/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaBiome.java deleted file mode 100644 index 8edf451c1..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaBiome.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.level.biome.impl.savanna; - -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorFlower; -import cn.nukkit.level.generator.populator.impl.tree.SavannaTreePopulator; - -/** - * @author DaPorkchop_ - */ -public class SavannaBiome extends GrassyBiome { - - public SavannaBiome() { - super(); - - SavannaTreePopulator tree = new SavannaTreePopulator(BlockSapling.ACACIA); - tree.setBaseAmount(1); - this.addPopulator(tree); - - PopulatorFlower flower = new PopulatorFlower(); - flower.setBaseAmount(2); - this.addPopulator(flower); - - this.setBaseHeight(0.125f); - this.setHeightVariation(0.05f); - } - - @Override - public String getName() { - return "Savanna"; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaMBiome.java deleted file mode 100644 index e84f09034..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaMBiome.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.level.biome.impl.savanna; - -/** - * @author DaPorkchop_ - */ -public class SavannaMBiome extends SavannaBiome { - //TODO: coarse dirt? - //private static final Simplex coarseDirtNoise = new Simplex(new NukkitRandom(0), 1d, 1 / 4f, 1 / 16f); - //boolean coarseDirt = false; - - public SavannaMBiome() { - super(); - - //this is set to be above the build limit so that it'll actually hit it sometimes - this.setBaseHeight(0.3625f); - this.setHeightVariation(1.225f); - } - - @Override - public String getName() { - return "Savanna M"; - } - - //@Override - //public int getSurfaceBlock(int y) { - // return coarseDirt ? COARSE_DIRT : DIRT; - //} - - //@Override - //public void preCover(int x, int z) { - // coarseDirt = coarseDirtNoise.noise2D(x, z, true) < 0; - //} - - @Override - public boolean doesOverhang() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaPlateauBiome.java b/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaPlateauBiome.java deleted file mode 100644 index 2a5946441..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaPlateauBiome.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.biome.impl.savanna; - -/** - * @author DaPorkchop_ - */ -public class SavannaPlateauBiome extends SavannaBiome { - - public SavannaPlateauBiome() { - super(); - - this.setBaseHeight(1.5f); - this.setHeightVariation(0.025f); - } - - @Override - public String getName() { - return "Savanna Plateau"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaPlateauMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaPlateauMBiome.java deleted file mode 100644 index c5e89e58f..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/savanna/SavannaPlateauMBiome.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.level.biome.impl.savanna; - -/** - * @author DaPorkchop_ - */ -public class SavannaPlateauMBiome extends SavannaPlateauBiome { - - public SavannaPlateauMBiome() { - super(); - - this.setBaseHeight(1.05f); - this.setHeightVariation(1.2125001f); - } - - @Override - public String getName() { - return "Savanna Plateau M"; - } - - @Override - public boolean doesOverhang() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/swamp/SwampBiome.java b/src/main/java/cn/nukkit/level/biome/impl/swamp/SwampBiome.java deleted file mode 100644 index 6aead7953..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/swamp/SwampBiome.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.level.biome.impl.swamp; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockFlower; -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.MushroomPopulator; -import cn.nukkit.level.generator.populator.impl.PopulatorFlower; -import cn.nukkit.level.generator.populator.impl.PopulatorLilyPad; -import cn.nukkit.level.generator.populator.impl.PopulatorSmallMushroom; -import cn.nukkit.level.generator.populator.impl.tree.SwampTreePopulator; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class SwampBiome extends GrassyBiome { - - public SwampBiome() { - super(); - - PopulatorLilyPad lilypad = new PopulatorLilyPad(); - lilypad.setBaseAmount(4); - lilypad.setRandomAmount(2); - this.addPopulator(lilypad); - - SwampTreePopulator trees = new SwampTreePopulator(); - trees.setBaseAmount(2); - this.addPopulator(trees); - - PopulatorFlower flower = new PopulatorFlower(); - flower.setBaseAmount(2); - flower.addType(Block.RED_FLOWER, BlockFlower.TYPE_BLUE_ORCHID); - this.addPopulator(flower); - - MushroomPopulator mushroom = new MushroomPopulator(1); - mushroom.setBaseAmount(-5); - mushroom.setRandomAmount(7); - this.addPopulator(mushroom); - - PopulatorSmallMushroom smallMushroom = new PopulatorSmallMushroom(); - smallMushroom.setBaseAmount(0); - smallMushroom.setRandomAmount(2); - this.addPopulator(smallMushroom); - - this.setBaseHeight(-0.2f); - this.setHeightVariation(0.1f); - } - - @Override - public String getName() { - return "Swamp"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/swamp/SwamplandMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/swamp/SwamplandMBiome.java deleted file mode 100644 index 5cf743ee2..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/swamp/SwamplandMBiome.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.nukkit.level.biome.impl.swamp; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class SwamplandMBiome extends SwampBiome { - - @Override - public String getName() { - return "Swampland M"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaBiome.java deleted file mode 100644 index c8b3c411e..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaBiome.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -import cn.nukkit.level.generator.populator.impl.WaterIcePopulator; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class ColdTaigaBiome extends TaigaBiome { - public ColdTaigaBiome() { - super(); - - WaterIcePopulator ice = new WaterIcePopulator(); - this.addPopulator(ice); - - this.setBaseHeight(0.2f); - this.setHeightVariation(0.2f); - } - - @Override - public String getName() { - return "Cold Taiga"; - } - - @Override - public int getCoverId(int x, int z) { - return 1248; - } - - @Override - public boolean isFreezing() { - return true; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaHillsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaHillsBiome.java deleted file mode 100644 index 0c693e812..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaHillsBiome.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class ColdTaigaHillsBiome extends ColdTaigaBiome { - public ColdTaigaHillsBiome() { - super(); - - this.setBaseHeight(0.45f); - this.setHeightVariation(0.3f); - } - - @Override - public String getName() { - return "Cold Taiga Hills"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaMBiome.java deleted file mode 100644 index 99e5a24ee..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/ColdTaigaMBiome.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class ColdTaigaMBiome extends ColdTaigaBiome { - - @Override - public String getName() { - return "Cold Taiga M"; - } - - @Override - public boolean doesOverhang() { - return true; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaSpruceTaigaBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaSpruceTaigaBiome.java deleted file mode 100644 index f2710904a..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaSpruceTaigaBiome.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -import cn.nukkit.level.generator.populator.impl.tree.SpruceBigTreePopulator; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class MegaSpruceTaigaBiome extends TaigaBiome { - public MegaSpruceTaigaBiome() { - super(); - - SpruceBigTreePopulator bigTrees = new SpruceBigTreePopulator(); - bigTrees.setBaseAmount(6); - this.addPopulator(bigTrees); - } - - @Override - public String getName() { - return "Mega Spruce Taiga"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaTaigaBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaTaigaBiome.java deleted file mode 100644 index dc4e18a68..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaTaigaBiome.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -import cn.nukkit.level.generator.populator.impl.tree.SpruceBigTreePopulator; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class MegaTaigaBiome extends TaigaBiome { - public MegaTaigaBiome() { - super(); - - SpruceBigTreePopulator bigTrees = new SpruceBigTreePopulator(); - bigTrees.setBaseAmount(6); - this.addPopulator(bigTrees); - - this.setBaseHeight(0.2f); - this.setHeightVariation(0.2f); - } - - @Override - public String getName() { - return "Mega Taiga"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaTaigaHillsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaTaigaHillsBiome.java deleted file mode 100644 index 73f0d3fcc..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/MegaTaigaHillsBiome.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class MegaTaigaHillsBiome extends MegaTaigaBiome { - public MegaTaigaHillsBiome() { - super(); - - this.setBaseHeight(0.45f); - this.setHeightVariation(0.3f); - } - - @Override - public String getName() { - return "Mega Taiga Hills"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaBiome.java deleted file mode 100644 index 9cdda615c..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaBiome.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.biome.type.GrassyBiome; -import cn.nukkit.level.generator.populator.impl.PopulatorTree; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class TaigaBiome extends GrassyBiome { - public TaigaBiome() { - super(); - - PopulatorTree trees = new PopulatorTree(BlockSapling.SPRUCE); - trees.setBaseAmount(10); - this.addPopulator(trees); - - this.setBaseHeight(0.2f); - this.setHeightVariation(0.2f); - } - - @Override - public String getName() { - return "Taiga"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaHillsBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaHillsBiome.java deleted file mode 100644 index 871401ec3..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaHillsBiome.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class TaigaHillsBiome extends TaigaBiome { - - public TaigaHillsBiome() { - super(); - - this.setBaseHeight(0.25f); - this.setHeightVariation(0.8f); - } - - @Override - public String getName() { - return "Taiga Hills"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaMBiome.java b/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaMBiome.java deleted file mode 100644 index 4f09ee750..000000000 --- a/src/main/java/cn/nukkit/level/biome/impl/taiga/TaigaMBiome.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.biome.impl.taiga; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class TaigaMBiome extends TaigaBiome { - public TaigaMBiome() { - super(); - - this.setBaseHeight(0.3f); - this.setHeightVariation(0.4f); - } - - @Override - public String getName() { - return "Taiga M"; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/type/CoveredBiome.java b/src/main/java/cn/nukkit/level/biome/type/CoveredBiome.java deleted file mode 100644 index 8907e8630..000000000 --- a/src/main/java/cn/nukkit/level/biome/type/CoveredBiome.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.nukkit.level.biome.type; - -import cn.nukkit.level.biome.Biome; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.Normal; - -/** - * @author DaPorkchop_ - * Nukkit Project - *

- * A biome with ground covering - *

- */ -public abstract class CoveredBiome extends Biome { - - public int getCoverId(int x, int z) { - return 0; - } - - public int getSurfaceDepth(int x, int y, int z) { - return 1; - } - - public abstract int getSurfaceId(int x, int y, int z); - - public int getGroundDepth(int x, int y, int z) { - return 4; - } - - public abstract int getGroundId(int x, int y, int z); - - public void doCover(int x, int z, FullChunk chunk) { - final int fullX = (chunk.getX() << 4) | x; - final int fullZ = (chunk.getZ() << 4) | z; - - final int coverBlock = this.getCoverId(fullX, fullZ); - - boolean hasCovered = false; - int realY; - //start one below build limit in case of cover blocks - for (int y = 254; y > 32; y--) { - if (chunk.getFullBlock(x, y, z) == 16) { - COVER: - if (!hasCovered) { - if (y >= Normal.seaHeight) { - chunk.setFullBlockId(x, y + 1, z, coverBlock); - int surfaceDepth = this.getSurfaceDepth(fullX, y, fullZ); - for (int i = 0; i < surfaceDepth; i++) { - realY = y - i; - if (chunk.getFullBlock(x, realY, z) == 16) { - chunk.setFullBlockId(x, realY, z, this.getSurfaceId(fullX, realY, fullZ)); - } else break COVER; - } - y -= surfaceDepth; - } - int groundDepth = this.getGroundDepth(fullX, y, fullZ); - for (int i = 0; i < groundDepth; i++) { - realY = y - i; - if (chunk.getFullBlock(x, realY, z) == 16) { - chunk.setFullBlockId(x, realY, z, this.getGroundId(fullX, realY, fullZ)); - } else break COVER; - } - //don't take all of groundDepth away because we do y-- in the loop - y -= groundDepth - 1; - } - hasCovered = true; - } else { - if (hasCovered) { - //reset it if this isn't a valid stone block (allows us to place ground cover on top and below overhangs) - hasCovered = false; - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/biome/type/GrassyBiome.java b/src/main/java/cn/nukkit/level/biome/type/GrassyBiome.java deleted file mode 100644 index c3aeb9066..000000000 --- a/src/main/java/cn/nukkit/level/biome/type/GrassyBiome.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.level.biome.type; - -import cn.nukkit.block.BlockDoublePlant; -import cn.nukkit.level.generator.populator.impl.PopulatorDoublePlant; -import cn.nukkit.level.generator.populator.impl.PopulatorGrass; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class GrassyBiome extends CoveredBiome { - - public GrassyBiome() { - PopulatorGrass grass = new PopulatorGrass(); - grass.setBaseAmount(30); - this.addPopulator(grass); - - PopulatorDoublePlant tallGrass = new PopulatorDoublePlant(BlockDoublePlant.TALL_GRASS); - tallGrass.setBaseAmount(5); - this.addPopulator(tallGrass); - } - - @Override - public int getSurfaceId(int x, int y, int z) { - return 32; - } - - @Override - public int getGroundId(int x, int y, int z) { - return 48; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/type/SandyBiome.java b/src/main/java/cn/nukkit/level/biome/type/SandyBiome.java deleted file mode 100644 index 0eebaa9ee..000000000 --- a/src/main/java/cn/nukkit/level/biome/type/SandyBiome.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.level.biome.type; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class SandyBiome extends CoveredBiome { - @Override - public int getSurfaceDepth(int x, int y, int z) { - return 3; - } - - @Override - public int getSurfaceId(int x, int y, int z) { - return 192; - } - - @Override - public int getGroundDepth(int x, int y, int z) { - return 2; - } - - @Override - public int getGroundId(int x, int y, int z) { - return 384; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/type/SnowyBiome.java b/src/main/java/cn/nukkit/level/biome/type/SnowyBiome.java deleted file mode 100644 index 8788d9b16..000000000 --- a/src/main/java/cn/nukkit/level/biome/type/SnowyBiome.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.level.biome.type; - -import cn.nukkit.level.generator.populator.impl.WaterIcePopulator; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public abstract class SnowyBiome extends GrassyBiome { - public SnowyBiome() { - super(); - - this.addPopulator(new WaterIcePopulator()); - } - - @Override - public int getCoverId(int x, int z) { - return 1248; - } - - @Override - public boolean isFreezing() { - return true; - } - - @Override - public boolean canRain() { - return false; - } -} diff --git a/src/main/java/cn/nukkit/level/biome/type/WateryBiome.java b/src/main/java/cn/nukkit/level/biome/type/WateryBiome.java deleted file mode 100644 index bb8560415..000000000 --- a/src/main/java/cn/nukkit/level/biome/type/WateryBiome.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.level.biome.type; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public abstract class WateryBiome extends CoveredBiome { - - @Override - public int getSurfaceDepth(int x, int y, int z) { - return 0; - } - - @Override - public int getSurfaceId(int x, int y, int z) { - //doesn't matter, surface depth is 0 - return 0; - } - - @Override - public int getGroundDepth(int x, int y, int z) { - return 5; - } - - @Override - public int getGroundId(int x, int y, int z) { - return 48; - } -} diff --git a/src/main/java/cn/nukkit/level/format/Chunk.java b/src/main/java/cn/nukkit/level/format/Chunk.java deleted file mode 100644 index c3b912030..000000000 --- a/src/main/java/cn/nukkit/level/format/Chunk.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.level.format; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface Chunk extends FullChunk { - - byte SECTION_COUNT = 16; - - boolean isSectionEmpty(float fY); - - ChunkSection getSection(float fY); - - boolean setSection(float fY, ChunkSection section); - - ChunkSection[] getSections(); - - class Entry { - public final int chunkX; - public final int chunkZ; - - public Entry(int chunkX, int chunkZ) { - this.chunkX = chunkX; - this.chunkZ = chunkZ; - } - } -} diff --git a/src/main/java/cn/nukkit/level/format/ChunkSection.java b/src/main/java/cn/nukkit/level/format/ChunkSection.java deleted file mode 100644 index 52518958b..000000000 --- a/src/main/java/cn/nukkit/level/format/ChunkSection.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.level.format; - -import cn.nukkit.block.Block; -import cn.nukkit.utils.BinaryStream; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface ChunkSection { - - int getY(); - - int getBlockId(int x, int y, int z); - - void setBlockId(int x, int y, int z, int id); - - int getBlockData(int x, int y, int z); - - void setBlockData(int x, int y, int z, int data); - - int getFullBlock(int x, int y, int z); - - Block getAndSetBlock(int x, int y, int z, Block block); - - boolean setFullBlockId(int x, int y, int z, int fullId); - - boolean setBlock(int x, int y, int z, int blockId); - - boolean setBlock(int x, int y, int z, int blockId, int meta); - - int getBlockSkyLight(int x, int y, int z); - - void setBlockSkyLight(int x, int y, int z, int level); - - int getBlockLight(int x, int y, int z); - - void setBlockLight(int x, int y, int z, int level); - - byte[] getIdArray(); - - byte[] getDataArray(); - - byte[] getSkyLightArray(); - - byte[] getLightArray(); - - boolean isEmpty(); - - // for < 1.13 chunk format - byte[] getBytes(); - - // for >= 1.13 chunk format - void writeTo(int protocol, BinaryStream stream); - - ChunkSection copy(); -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/format/FullChunk.java b/src/main/java/cn/nukkit/level/format/FullChunk.java deleted file mode 100644 index bddabadaf..000000000 --- a/src/main/java/cn/nukkit/level/format/FullChunk.java +++ /dev/null @@ -1,168 +0,0 @@ -package cn.nukkit.level.format; - -import cn.nukkit.block.Block; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.entity.Entity; - -import java.io.IOException; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface FullChunk extends Cloneable { - - int getX(); - - int getZ(); - - default void setPosition(int x, int z) { - setX(x); - setZ(z); - } - - void setX(int x); - - void setZ(int z); - - long getIndex(); - - LevelProvider getProvider(); - - void setProvider(LevelProvider provider); - - int getFullBlock(int x, int y, int z); - - Block getAndSetBlock(int x, int y, int z, Block block); - - default boolean setFullBlockId(int x, int y, int z, int fullId) { - return setBlock(x, y, z, fullId >> 4, fullId & 0xF); - } - - boolean setBlock(int x, int y, int z, int blockId); - - boolean setBlock(int x, int y, int z, int blockId, int meta); - - int getBlockId(int x, int y, int z); - - void setBlockId(int x, int y, int z, int id); - - int getBlockData(int x, int y, int z); - - void setBlockData(int x, int y, int z, int data); - - int getBlockExtraData(int x, int y, int z); - - void setBlockExtraData(int x, int y, int z, int data); - - int getBlockSkyLight(int x, int y, int z); - - void setBlockSkyLight(int x, int y, int z, int level); - - int getBlockLight(int x, int y, int z); - - void setBlockLight(int x, int y, int z, int level); - - int getHighestBlockAt(int x, int z); - - int getHighestBlockAt(int x, int z, boolean cache); - - int getHeightMap(int x, int z); - - void setHeightMap(int x, int z, int value); - - void recalculateHeightMap(); - - void populateSkyLight(); - - int getBiomeId(int x, int z); - - void setBiomeIdAndColor(int x, int z, int idAndColor); - - default void setBiomeId(int x, int z, int biomeId) { - setBiomeId(x, z, (byte) biomeId); - } - - void setBiomeId(int x, int z, byte biomeId); - - default void setBiome(int x, int z, cn.nukkit.level.biome.Biome biome) { - setBiomeId(x, z, (byte) biome.getId()); - } - - int getBiomeColor(int x, int z); - - void setBiomeColor(int x, int z, int r, int g, int b); - - boolean isLightPopulated(); - - void setLightPopulated(); - - void setLightPopulated(boolean value); - - boolean isPopulated(); - - void setPopulated(); - - void setPopulated(boolean value); - - boolean isGenerated(); - - void setGenerated(); - - void setGenerated(boolean value); - - void addEntity(Entity entity); - - void removeEntity(Entity entity); - - void addBlockEntity(BlockEntity blockEntity); - - void removeBlockEntity(BlockEntity blockEntity); - - Map getEntities(); - - Map getBlockEntities(); - - BlockEntity getTile(int x, int y, int z); - - boolean isLoaded(); - - boolean load() throws IOException; - - boolean load(boolean generate) throws IOException; - - boolean unload() throws Exception; - - boolean unload(boolean save) throws Exception; - - boolean unload(boolean save, boolean safe) throws Exception; - - void initChunk(); - - byte[] getBiomeIdArray(); - - int[] getBiomeColorArray(); - - byte[] getHeightMapArray(); - - byte[] getBlockIdArray(); - - byte[] getBlockDataArray(); - - Map getBlockExtraDataArray(); - - byte[] getBlockSkyLightArray(); - - byte[] getBlockLightArray(); - - byte[] toBinary(); - - byte[] toFastBinary(); - - boolean hasChanged(); - - void setChanged(); - - void setChanged(boolean changed); -} diff --git a/src/main/java/cn/nukkit/level/format/LevelProvider.java b/src/main/java/cn/nukkit/level/format/LevelProvider.java deleted file mode 100644 index d81d16db0..000000000 --- a/src/main/java/cn/nukkit/level/format/LevelProvider.java +++ /dev/null @@ -1,117 +0,0 @@ -package cn.nukkit.level.format; - -import cn.nukkit.level.GameRules; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.math.Vector3; -import it.unimi.dsi.fastutil.ints.IntSet; - -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface LevelProvider { - - byte ORDER_YZX = 0; - byte ORDER_ZXY = 1; - - void requestChunkTask(IntSet protocols, int X, int Z); - - String getPath(); - - String getGenerator(); - - Map getGeneratorOptions(); - - BaseFullChunk getLoadedChunk(int X, int Z); - - BaseFullChunk getLoadedChunk(long hash); - - BaseFullChunk getChunk(int X, int Z); - - BaseFullChunk getChunk(int X, int Z, boolean create); - - BaseFullChunk getEmptyChunk(int x, int z); - - void saveChunks(); - - void saveChunk(int X, int Z); - - void saveChunk(int X, int Z, FullChunk chunk); - - void unloadChunks(); - - boolean loadChunk(int X, int Z); - - boolean loadChunk(int X, int Z, boolean create); - - boolean unloadChunk(int X, int Z); - - boolean unloadChunk(int X, int Z, boolean safe); - - boolean isChunkGenerated(int X, int Z); - - boolean isChunkPopulated(int X, int Z); - - boolean isChunkLoaded(int X, int Z); - - boolean isChunkLoaded(long hash); - - void setChunk(int chunkX, int chunkZ, FullChunk chunk); - - String getName(); - - boolean isRaining(); - - void setRaining(boolean raining); - - int getRainTime(); - - void setRainTime(int rainTime); - - boolean isThundering(); - - void setThundering(boolean thundering); - - int getThunderTime(); - - void setThunderTime(int thunderTime); - - long getCurrentTick(); - - void setCurrentTick(long currentTick); - - long getTime(); - - void setTime(long value); - - long getSeed(); - - void setSeed(long value); - - Vector3 getSpawn(); - - void setSpawn(Vector3 pos); - - Map getLoadedChunks(); - - void doGarbageCollection(); - - default void doGarbageCollection(long time) { - - } - - Level getLevel(); - - void close(); - - void saveLevelData(); - - void updateLevelName(String name); - - GameRules getGamerules(); - - void setGameRules(GameRules rules); -} diff --git a/src/main/java/cn/nukkit/level/format/LevelProviderManager.java b/src/main/java/cn/nukkit/level/format/LevelProviderManager.java deleted file mode 100644 index 89a4753b2..000000000 --- a/src/main/java/cn/nukkit/level/format/LevelProviderManager.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.level.format; - -import cn.nukkit.Server; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class LevelProviderManager { - - protected static final Map> providers = new HashMap<>(); - - public static void addProvider(Server server, Class clazz) { - try { - providers.put((String) clazz.getMethod("getProviderName").invoke(null), clazz); - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - } - - public static Class getProvider(String path) { - for (Class provider : providers.values()) { - try { - if ((boolean) provider.getMethod("isValid", String.class).invoke(null, path)) { - return provider; - } - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - } - return null; - } - - public static Class getProviderByName(String name) { - return providers.getOrDefault(name.trim().toLowerCase(), null); - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/Anvil.java b/src/main/java/cn/nukkit/level/format/anvil/Anvil.java deleted file mode 100644 index e90d40b31..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/Anvil.java +++ /dev/null @@ -1,280 +0,0 @@ -package cn.nukkit.level.format.anvil; - -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntitySpawnable; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.level.format.generic.BaseLevelProvider; -import cn.nukkit.level.format.generic.BaseRegionLoader; -import cn.nukkit.level.generator.Generator; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.BinaryStream; -import cn.nukkit.utils.ChunkException; -import cn.nukkit.utils.ThreadCache; -import it.unimi.dsi.fastutil.ints.IntSet; -import it.unimi.dsi.fastutil.objects.ObjectIterator; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.ByteOrder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Anvil extends BaseLevelProvider { - - static private final byte[] PAD_256 = new byte[256]; - - public Anvil(Level level, String path) throws IOException { - super(level, path); - } - - public static String getProviderName() { - return "anvil"; - } - - public static byte getProviderOrder() { - return ORDER_YZX; - } - - public static boolean usesChunkSection() { - return true; - } - - public static boolean isValid(String path) { - boolean isValid = (new File(path + "/level.dat").exists()) && new File(path + "/region/").isDirectory(); - if (isValid) { - for (File file : new File(path + "/region/").listFiles((dir, name) -> Pattern.matches("^.+\\.mc[r|a]$", name))) { - if (!file.getName().endsWith(".mca")) { - isValid = false; - break; - } - } - } - return isValid; - } - - public static void generate(String path, String name, long seed, Class generator) throws IOException { - generate(path, name, seed, generator, new HashMap<>()); - } - - public static void generate(String path, String name, long seed, Class generator, Map options) throws IOException { - if (!new File(path + "/region").exists()) { - new File(path + "/region").mkdirs(); - } - - CompoundTag levelData = new CompoundTag("Data") - .putCompound("GameRules", new CompoundTag()) - .putLong("DayTime", 0) - .putInt("GameType", 0) - .putString("generatorName", Generator.getGeneratorName(generator)) - .putString("generatorOptions", options.getOrDefault("preset", "")) - .putInt("generatorVersion", 1) - .putBoolean("hardcore", false) - .putBoolean("initialized", true) - .putLong("LastPlayed", System.currentTimeMillis() / 1000) - .putString("LevelName", name) - .putBoolean("raining", false) - .putInt("rainTime", 0) - .putLong("RandomSeed", seed) - .putInt("SpawnX", 128) - .putInt("SpawnY", 70) - .putInt("SpawnZ", 128) - .putBoolean("thundering", false) - .putInt("thunderTime", 0) - .putInt("version", 19133) - .putLong("Time", 0) - .putLong("SizeOnDisk", 0); - - NBTIO.writeGZIPCompressed(new CompoundTag().putCompound("Data", levelData), new FileOutputStream(path + "level.dat"), ByteOrder.BIG_ENDIAN); - } - - @Override - public Chunk getEmptyChunk(int chunkX, int chunkZ) { - return Chunk.getEmptyChunk(chunkX, chunkZ, this); - } - - @Override - public void requestChunkTask(IntSet protocols, int x, int z) throws ChunkException { - Chunk chunk = (Chunk) this.getChunk(x, z, false); - if (chunk == null) { - throw new ChunkException("Invalid Chunk Set"); - } - - long timestamp = chunk.getChanges(); - - byte[] blockEntities = new byte[0]; - - if (!chunk.getBlockEntities().isEmpty()) { - List tagList = new ArrayList<>(); - - for (BlockEntity blockEntity : chunk.getBlockEntities().values()) { - if (blockEntity instanceof BlockEntitySpawnable) { - tagList.add(((BlockEntitySpawnable) blockEntity).getSpawnCompound()); - } - } - - try { - blockEntities = NBTIO.write(tagList, ByteOrder.LITTLE_ENDIAN, true); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - int subChunkCount = 0; - cn.nukkit.level.format.ChunkSection[] sections = chunk.getSections(); - for (int i = sections.length - 1; i >= 0; i--) { - if (!sections[i].isEmpty()) { - subChunkCount = i + 1; - break; - } - } - - for (int protocolId : protocols) { - BinaryStream stream = ThreadCache.binaryStream.get().reset(); - if (protocolId < ProtocolInfo.v1_12_0) { - stream.putByte((byte) subChunkCount); - } - - for (int i = 0; i < subChunkCount; i++) { - if (protocolId < ProtocolInfo.v1_13_0) { - stream.putByte((byte) 0); - stream.put(sections[i].getBytes()); - } else { - sections[i].writeTo(protocolId, stream); - } - } - if (protocolId < ProtocolInfo.v1_12_0) { - for (byte height : chunk.getHeightMapArray()) { - stream.putByte(height); - } - stream.put(PAD_256); - } - stream.put(chunk.getBiomeIdArray()); - stream.putByte((byte) 0); // Border blocks - if (protocolId < ProtocolInfo.v1_16_100) { - stream.putVarInt(0); // There is no extra data anymore but idk when it was removed - } - stream.put(blockEntities); - this.getLevel().chunkRequestCallback(protocolId, timestamp, x, z, subChunkCount, stream.getBuffer()); - } - } - - private int lastPosition = 0; - - @Override - public void doGarbageCollection(long time) { - long start = System.currentTimeMillis(); - int maxIterations = size(); - if (lastPosition > maxIterations) lastPosition = 0; - int i; - synchronized (chunks) { - ObjectIterator iter = chunks.values().iterator(); - if (lastPosition != 0) iter.skip(lastPosition); - for (i = 0; i < maxIterations; i++) { - if (!iter.hasNext()) { - iter = chunks.values().iterator(); - } - if (!iter.hasNext()) break; - BaseFullChunk chunk = iter.next(); - if (chunk == null) continue; - if (chunk.isGenerated() && chunk.isPopulated() && chunk instanceof Chunk) { - chunk.compress(); - if (System.currentTimeMillis() - start >= time) break; - } - } - } - lastPosition += i; - } - - @Override - public synchronized BaseFullChunk loadChunk(long index, int chunkX, int chunkZ, boolean create) { - int regionX = getRegionIndexX(chunkX); - int regionZ = getRegionIndexZ(chunkZ); - BaseRegionLoader region = this.loadRegion(regionX, regionZ); - if (this.level.timings.syncChunkLoadDataTimer != null) this.level.timings.syncChunkLoadDataTimer.startTiming(); - BaseFullChunk chunk; - try { - chunk = region.readChunk(chunkX - (regionX << 5), chunkZ - (regionZ << 5)); - } catch (IOException e) { - throw new RuntimeException(e); - } - if (chunk == null) { - if (create) { - chunk = this.getEmptyChunk(chunkX, chunkZ); - putChunk(index, chunk); - } - } else { - putChunk(index, chunk); - } - if (this.level.timings.syncChunkLoadDataTimer != null) this.level.timings.syncChunkLoadDataTimer.stopTiming(); - return chunk; - } - - @Override - public synchronized void saveChunk(int X, int Z) { - BaseFullChunk chunk = this.getChunk(X, Z); - if (chunk != null) { - try { - this.loadRegion(X >> 5, Z >> 5).writeChunk(chunk); - } catch (Exception e) { - throw new ChunkException("Error saving chunk (" + X + ", " + Z + ')', e); - } - } - } - - - @Override - public synchronized void saveChunk(int x, int z, FullChunk chunk) { - if (!(chunk instanceof Chunk)) { - throw new ChunkException("Invalid Chunk class"); - } - int regionX = x >> 5; - int regionZ = z >> 5; - this.loadRegion(regionX, regionZ); - chunk.setX(x); - chunk.setZ(z); - try { - this.getRegion(regionX, regionZ).writeChunk(chunk); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static ChunkSection createChunkSection(int y) { - ChunkSection cs = new ChunkSection(y); - cs.hasSkyLight = true; - return cs; - } - - protected synchronized BaseRegionLoader loadRegion(int x, int z) { - BaseRegionLoader tmp = lastRegion.get(); - if (tmp != null && x == tmp.getX() && z == tmp.getZ()) { - return tmp; - } - long index = Level.chunkHash(x, z); - synchronized (regions) { - BaseRegionLoader region = this.regions.get(index); - if (region == null) { - try { - region = new RegionLoader(this, x, z); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.regions.put(index, region); - } - lastRegion.set(region); - return region; - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/format/anvil/Chunk.java b/src/main/java/cn/nukkit/level/format/anvil/Chunk.java deleted file mode 100644 index 6c1cc7fa5..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/Chunk.java +++ /dev/null @@ -1,515 +0,0 @@ -package cn.nukkit.level.format.anvil; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.level.format.LevelProvider; -import cn.nukkit.level.format.anvil.palette.BiomePalette; -import cn.nukkit.level.format.generic.BaseChunk; -import cn.nukkit.level.format.generic.EmptyChunkSection; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.*; -import cn.nukkit.utils.*; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.lang.reflect.Constructor; -import java.nio.ByteOrder; -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Chunk extends BaseChunk { - - protected long inhabitedTime; - protected boolean terrainPopulated; - protected boolean terrainGenerated; - - @Override - public Chunk clone() { - return (Chunk) super.clone(); - } - - public Chunk(LevelProvider level) { - this(level, null); - } - - public Chunk(Class providerClass) { - this((LevelProvider) null, null); - this.providerClass = providerClass; - } - - public Chunk(Class providerClass, CompoundTag nbt) { - this((LevelProvider) null, nbt); - this.providerClass = providerClass; - } - - public Chunk(LevelProvider level, CompoundTag nbt) { - this.provider = level; - if (level != null) { - this.providerClass = level.getClass(); - } - - if (nbt == null) { - this.biomes = new byte[256]; - this.sections = new cn.nukkit.level.format.ChunkSection[16]; - System.arraycopy(EmptyChunkSection.EMPTY, 0, this.sections, 0, 16); - return; - } - - this.sections = new cn.nukkit.level.format.ChunkSection[16]; - for (Tag section : nbt.getList("Sections").getAll()) { - if (section instanceof CompoundTag) { - int y = ((CompoundTag) section).getByte("Y"); - if (y < 16) { - sections[y] = new ChunkSection((CompoundTag) section); - } - } - } - - for (int y = 0; y < 16; y++) { - if (sections[y] == null) { - sections[y] = EmptyChunkSection.EMPTY[y]; - } - } - - Map extraData = new HashMap<>(); - - Tag extra = nbt.get("ExtraData"); - if (extra instanceof ByteArrayTag) { - BinaryStream stream = new BinaryStream(((ByteArrayTag) extra).data); - for (int i = 0; i < stream.getInt(); i++) { - int key = stream.getInt(); - extraData.put(key, stream.getShort()); - } - } - - this.setPosition(nbt.getInt("xPos"), nbt.getInt("zPos")); - if (sections.length > SECTION_COUNT) { - throw new ChunkException("Invalid amount of chunks"); - } - - if (nbt.contains("BiomeColors")) { - this.biomes = new byte[256]; - int[] biomeColors = nbt.getIntArray("BiomeColors"); - if (biomeColors != null && biomeColors.length == 256) { - BiomePalette palette = new BiomePalette(biomeColors); - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - this.biomes[(x << 4) | z] = (byte) (palette.get(x, z) >> 24); - } - } - } - } else { - this.biomes = Arrays.copyOf(nbt.getByteArray("Biomes"), 256); - } - - int[] heightMap = nbt.getIntArray("HeightMap"); - this.heightMap = new byte[256]; - if (heightMap.length != 256) { - Arrays.fill(this.heightMap, (byte) 255); - } else { - for (int i = 0; i < heightMap.length; i++) { - this.heightMap[i] = (byte) heightMap[i]; - } - } - - if (!extraData.isEmpty()) this.extraData = extraData; - - this.NBTentities = nbt.getList("Entities", CompoundTag.class).getAll(); - this.NBTtiles = nbt.getList("TileEntities", CompoundTag.class).getAll(); - if (this.NBTentities.isEmpty()) this.NBTentities = null; - if (this.NBTtiles.isEmpty()) this.NBTtiles = null; - - ListTag updateEntries = nbt.getList("TileTicks", CompoundTag.class); - - if (updateEntries != null && updateEntries.size() > 0 && updateEntries.size() < 10000) { - for (CompoundTag entryNBT : updateEntries.getAll()) { - Block block = null; - - try { - Tag tag = entryNBT.get("i"); - if (tag instanceof StringTag) { - String name = ((StringTag) tag).data; - - @SuppressWarnings("unchecked") - Class clazz = (Class) Class.forName("cn.nukkit.block." + name); - - Constructor constructor = clazz.getDeclaredConstructor(); - constructor.setAccessible(true); - block = (Block) constructor.newInstance(); - } - } catch (Throwable e) { - continue; - } - - if (block == null) { - continue; - } - - block.x = entryNBT.getInt("x"); - block.y = entryNBT.getInt("y"); - block.z = entryNBT.getInt("z"); - - this.provider.getLevel().scheduleUpdate(block, block, entryNBT.getInt("t"), entryNBT.getInt("p"), false); - } - } - - this.inhabitedTime = nbt.getLong("InhabitedTime"); - this.terrainPopulated = nbt.getBoolean("TerrainPopulated"); - this.terrainGenerated = nbt.getBoolean("TerrainGenerated"); - } - - @Override - public boolean isPopulated() { - return this.terrainPopulated; - } - - @Override - public void setPopulated() { - this.setPopulated(true); - } - - @Override - public void setPopulated(boolean value) { - if (value != this.terrainPopulated) { - this.terrainPopulated = value; - setChanged(); - } - } - - @Override - public boolean isGenerated() { - return this.terrainGenerated || this.terrainPopulated; - } - - @Override - public void setGenerated() { - this.setGenerated(true); - } - - @Override - public void setGenerated(boolean value) { - if (this.terrainGenerated != value) { - this.terrainGenerated = value; - setChanged(); - } - } - - public CompoundTag getNBT() { - CompoundTag tag = new CompoundTag(); - - tag.put("LightPopulated", new ByteTag("LightPopulated", (byte) (isLightPopulated() ? 1 : 0))); - tag.put("InhabitedTime", new LongTag("InhabitedTime", this.inhabitedTime)); - - tag.put("V", new ByteTag("V", (byte) 1)); - - tag.put("TerrainGenerated", new ByteTag("TerrainGenerated", (byte) (isGenerated() ? 1 : 0))); - tag.put("TerrainPopulated", new ByteTag("TerrainPopulated", (byte) (terrainPopulated ? 1 : 0))); - - return tag; - } - - public static Chunk fromBinary(byte[] data) { - return fromBinary(data, null); - } - - public static Chunk fromBinary(byte[] data, LevelProvider provider) { - try { - CompoundTag chunk = NBTIO.read(new ByteArrayInputStream(Zlib.inflate(data)), ByteOrder.BIG_ENDIAN); - - if (!chunk.contains("Level") || !(chunk.get("Level") instanceof CompoundTag)) { - return null; - } - - return new Chunk(provider, chunk.getCompound("Level")); - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - return null; - } - } - - - public static Chunk fromFastBinary(byte[] data) { - return fromFastBinary(data, null); - } - - public static Chunk fromFastBinary(byte[] data, LevelProvider provider) { - try { - CompoundTag chunk = NBTIO.read(new DataInputStream(new ByteArrayInputStream(data)), ByteOrder.BIG_ENDIAN); - if (!chunk.contains("Level") || !(chunk.get("Level") instanceof CompoundTag)) { - return null; - } - - return new Chunk(provider, chunk.getCompound("Level")); - } catch (Exception e) { - return null; - } - } - - - @Override - public byte[] toFastBinary() { - CompoundTag nbt = this.getNBT().copy(); - nbt.remove("BiomeColors"); - - nbt.putInt("xPos", this.getX()); - nbt.putInt("zPos", this.getZ()); - - nbt.putByteArray("Biomes", this.getBiomeIdArray()); - /*int[] heightInts = new int[256]; // Unused? - byte[] heightBytes = this.getHeightMapArray(); - for (int i = 0; i < heightInts.length; i++) { - heightInts[i] = heightBytes[i] & 0xFF; - }*/ - - for (cn.nukkit.level.format.ChunkSection section : this.getSections()) { - if (section instanceof EmptyChunkSection) { - continue; - } - CompoundTag s = new CompoundTag(); - s.putByte("Y", section.getY()); - s.putByteArray("Blocks", section.getIdArray()); - s.putByteArray("Data", section.getDataArray()); - s.putByteArray("BlockLight", section.getLightArray()); - s.putByteArray("SkyLight", section.getSkyLightArray()); - nbt.getList("Sections", CompoundTag.class).add(s); - } - - ArrayList entities = new ArrayList<>(); - for (Entity entity : this.getEntities().values()) { - if (!(entity instanceof Player) && !entity.closed) { - entity.saveNBT(); - entities.add(entity.namedTag); - } - } - ListTag entityListTag = new ListTag<>("Entities"); - entityListTag.setAll(entities); - nbt.putList(entityListTag); - - ArrayList tiles = new ArrayList<>(); - for (BlockEntity blockEntity : this.getBlockEntities().values()) { - blockEntity.saveNBT(); - tiles.add(blockEntity.namedTag); - } - ListTag tileListTag = new ListTag<>("TileEntities"); - tileListTag.setAll(tiles); - nbt.putList(tileListTag); - - Set entries = this.provider.getLevel().getPendingBlockUpdates(this); - - if (entries != null) { - ListTag tileTickTag = new ListTag<>("TileTicks"); - long totalTime = this.provider.getLevel().getCurrentTick(); - - for (BlockUpdateEntry entry : entries) { - CompoundTag entryNBT = new CompoundTag() - .putString("i", entry.block.getSaveId()) - .putInt("x", entry.pos.getFloorX()) - .putInt("y", entry.pos.getFloorY()) - .putInt("z", entry.pos.getFloorZ()) - .putInt("t", (int) (entry.delay - totalTime)) - .putInt("p", entry.priority); - tileTickTag.add(entryNBT); - } - - nbt.putList(tileTickTag); - } - - BinaryStream extraData = new BinaryStream(); - Map extraDataArray = this.getBlockExtraDataArray(); - extraData.putInt(extraDataArray.size()); - for (Map.Entry entry : extraDataArray.entrySet()) { - extraData.putInt(entry.getKey()); - extraData.putShort(entry.getValue()); - } - - nbt.putByteArray("ExtraData", extraData.getBuffer()); - - CompoundTag chunk = new CompoundTag(""); - chunk.putCompound("Level", nbt); - - try { - return NBTIO.write(chunk, ByteOrder.BIG_ENDIAN); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public byte[] toBinary() { - CompoundTag nbt = this.getNBT().copy(); - nbt.remove("BiomeColors"); - - nbt.putInt("xPos", this.getX()); - nbt.putInt("zPos", this.getZ()); - - ListTag sectionList = new ListTag<>("Sections"); - for (cn.nukkit.level.format.ChunkSection section : this.getSections()) { - if (section instanceof EmptyChunkSection) { - continue; - } - CompoundTag s = new CompoundTag(); - s.putByte("Y", (section.getY())); - s.putByteArray("Blocks", section.getIdArray()); - s.putByteArray("Data", section.getDataArray()); - s.putByteArray("BlockLight", section.getLightArray()); - s.putByteArray("SkyLight", section.getSkyLightArray()); - sectionList.add(s); - } - nbt.putList(sectionList); - - nbt.putByteArray("Biomes", this.getBiomeIdArray()); - int[] heightInts = new int[256]; - byte[] heightBytes = this.getHeightMapArray(); - for (int i = 0; i < heightInts.length; i++) { - heightInts[i] = heightBytes[i] & 0xFF; - } - nbt.putIntArray("HeightMap", heightInts); - - ArrayList entities = new ArrayList<>(); - for (Entity entity : this.getEntities().values()) { - if (!(entity instanceof Player) && !entity.closed) { - entity.saveNBT(); - entities.add(entity.namedTag); - } - } - ListTag entityListTag = new ListTag<>("Entities"); - entityListTag.setAll(entities); - nbt.putList(entityListTag); - - ArrayList tiles = new ArrayList<>(); - for (BlockEntity blockEntity : this.getBlockEntities().values()) { - blockEntity.saveNBT(); - tiles.add(blockEntity.namedTag); - } - ListTag tileListTag = new ListTag<>("TileEntities"); - tileListTag.setAll(tiles); - nbt.putList(tileListTag); - - Set entries = this.provider.getLevel().getPendingBlockUpdates(this); - - if (entries != null) { - ListTag tileTickTag = new ListTag<>("TileTicks"); - long totalTime = this.provider.getLevel().getCurrentTick(); - - for (BlockUpdateEntry entry : entries) { - CompoundTag entryNBT = new CompoundTag() - .putString("i", entry.block.getSaveId()) - .putInt("x", entry.pos.getFloorX()) - .putInt("y", entry.pos.getFloorY()) - .putInt("z", entry.pos.getFloorZ()) - .putInt("t", (int) (entry.delay - totalTime)) - .putInt("p", entry.priority); - tileTickTag.add(entryNBT); - } - - nbt.putList(tileTickTag); - } - - BinaryStream extraData = new BinaryStream(); - Map extraDataArray = this.getBlockExtraDataArray(); - extraData.putInt(extraDataArray.size()); - for (Map.Entry entry : extraDataArray.entrySet()) { - extraData.putInt(entry.getKey()); - extraData.putShort(entry.getValue()); - } - - nbt.putByteArray("ExtraData", extraData.getBuffer()); - - CompoundTag chunk = new CompoundTag(""); - chunk.putCompound("Level", nbt); - - try { - return Zlib.deflate(NBTIO.write(chunk, ByteOrder.BIG_ENDIAN), RegionLoader.COMPRESSION_LEVEL); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public int getBlockSkyLight(int x, int y, int z) { - cn.nukkit.level.format.ChunkSection section = this.sections[y >> 4]; - if (section instanceof cn.nukkit.level.format.anvil.ChunkSection) { - cn.nukkit.level.format.anvil.ChunkSection anvilSection = (cn.nukkit.level.format.anvil.ChunkSection) section; - if (anvilSection.skyLight != null) { - return section.getBlockSkyLight(x, y & 0x0f, z); - } else if (!anvilSection.hasSkyLight) { - return 0; - } else { - int height = getHighestBlockAt(x, z); - if (height < y) { - return 15; - } else if (height == y) { - return Block.transparent[getBlockId(x, y, z)] ? 15 : 0; - } else { - return section.getBlockSkyLight(x, y & 0x0f, z); - } - } - } else { - return section.getBlockSkyLight(x, y & 0x0f, z); - } - } - - @Override - public int getBlockLight(int x, int y, int z) { - cn.nukkit.level.format.ChunkSection section = this.sections[y >> 4]; - if (section instanceof cn.nukkit.level.format.anvil.ChunkSection) { - cn.nukkit.level.format.anvil.ChunkSection anvilSection = (cn.nukkit.level.format.anvil.ChunkSection) section; - if (anvilSection.blockLight != null) { - return section.getBlockLight(x, y & 0x0f, z); - } else if (!anvilSection.hasBlockLight) { - return 0; - } else { - return section.getBlockLight(x, y & 0x0f, z); - } - } else { - return section.getBlockLight(x, y & 0x0f, z); - } - } - - public static Chunk getEmptyChunk(int chunkX, int chunkZ) { - return getEmptyChunk(chunkX, chunkZ, null); - } - - public static Chunk getEmptyChunk(int chunkX, int chunkZ, LevelProvider provider) { - try { - Chunk chunk; - if (provider != null) { - chunk = new Chunk(provider, null); - } else { - chunk = new Chunk(Anvil.class, null); - } - - chunk.setPosition(chunkX, chunkZ); - - chunk.heightMap = new byte[256]; - chunk.inhabitedTime = 0; - chunk.terrainGenerated = false; - chunk.terrainPopulated = false; - return chunk; - } catch (Exception e) { - return null; - } - } - - @Override - public boolean compress() { - super.compress(); - boolean result = false; - for (cn.nukkit.level.format.ChunkSection section : getSections()) { - if (section instanceof ChunkSection) { - ChunkSection anvilSection = (ChunkSection) section; - if (!anvilSection.isEmpty()) { - result |= anvilSection.compress(); - } - } - } - return result; - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/ChunkSection.java b/src/main/java/cn/nukkit/level/format/anvil/ChunkSection.java deleted file mode 100644 index 9efc3082e..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/ChunkSection.java +++ /dev/null @@ -1,383 +0,0 @@ -package cn.nukkit.level.format.anvil; - -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.level.format.anvil.util.BlockStorage; -import cn.nukkit.level.format.anvil.util.NibbleArray; -import cn.nukkit.level.format.generic.EmptyChunkSection; -import cn.nukkit.level.util.PalettedBlockStorage; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.Binary; -import cn.nukkit.utils.BinaryStream; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.Zlib; - -import java.io.IOException; -import java.util.Arrays; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ChunkSection implements cn.nukkit.level.format.ChunkSection { - - private static final PalettedBlockStorage EMPTY_STORAGE_PRE419 = new PalettedBlockStorage(0); - private static final PalettedBlockStorage EMPTY_STORAGE = new PalettedBlockStorage(ProtocolInfo.v1_16_100); - - private final int y; - - private final BlockStorage storage; - - protected byte[] blockLight; - protected byte[] skyLight; - protected byte[] compressedLight; - protected boolean hasBlockLight; - protected boolean hasSkyLight; - - private ChunkSection(int y, BlockStorage storage, byte[] blockLight, byte[] skyLight, byte[] compressedLight, boolean hasBlockLight, boolean hasSkyLight) { - this.y = y; - this.storage = storage; - this.blockLight = blockLight; - this.skyLight = skyLight; - this.compressedLight = compressedLight; - this.hasBlockLight = hasBlockLight; - this.hasSkyLight = hasSkyLight; - } - - public ChunkSection(int y) { - this.y = y; - - hasBlockLight = false; - hasSkyLight = false; - - storage = new BlockStorage(); - } - - public ChunkSection(CompoundTag nbt) { - this.y = nbt.getByte("Y"); - - byte[] blocks = nbt.getByteArray("Blocks"); - NibbleArray data = new NibbleArray(nbt.getByteArray("Data")); - - storage = new BlockStorage(); - - // Convert YZX to XZY - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 16; y++) { - int index = getAnvilIndex(x, y, z); - // Set block data first so we can overwrite it when removing data values from air in setBlockId - storage.setBlockData(x, y, z, data.get(index)); - storage.setBlockId(x, y, z, blocks[index]); - } - } - } - - this.blockLight = nbt.getByteArray("BlockLight"); - this.skyLight = nbt.getByteArray("SkyLight"); - } - - private static int getAnvilIndex(int x, int y, int z) { - return (y << 8) + (z << 4) + x; - } - - @Override - public int getY() { - return y; - } - - @Override - public int getBlockId(int x, int y, int z) { - synchronized (storage) { - return storage.getBlockId(x, y, z); - } - } - - @Override - public void setBlockId(int x, int y, int z, int id) { - synchronized (storage) { - storage.setBlockId(x, y, z, id); - } - } - - @Override - public boolean setFullBlockId(int x, int y, int z, int fullId) { - synchronized (storage) { - storage.setFullBlock(x, y, z, (char) fullId); - } - return true; - } - - @Override - public int getBlockData(int x, int y, int z) { - synchronized (storage) { - return storage.getBlockData(x, y, z); - } - } - - @Override - public void setBlockData(int x, int y, int z, int data) { - synchronized (storage) { - storage.setBlockData(x, y, z, data); - } - } - - @Override - public int getFullBlock(int x, int y, int z) { - synchronized (storage) { - return storage.getFullBlock(x, y, z); - } - } - - @Override - public boolean setBlock(int x, int y, int z, int blockId) { - synchronized (storage) { - return setBlock(x, y, z, blockId, 0); - } - } - - public Block getAndSetBlock(int x, int y, int z, Block block) { - synchronized (storage) { - int fullId = storage.getAndSetFullBlock(x, y, z, block.getFullId()); - return Block.fullList[fullId].clone(); - } - } - - @Override - public boolean setBlock(int x, int y, int z, int blockId, int meta) { - int newFullId = (blockId << 4) + meta; - synchronized (storage) { - int previousFullId = storage.getAndSetFullBlock(x, y, z, newFullId); - return (newFullId != previousFullId); - } - } - - @Override - public int getBlockSkyLight(int x, int y, int z) { - if (this.skyLight == null) { - if (!hasSkyLight) { - return 0; - } else if (compressedLight == null) { - return 15; - } - } - this.skyLight = getSkyLightArray(); - int sl = this.skyLight[(y << 7) | (z << 3) | (x >> 1)] & 0xff; - if ((x & 1) == 0) { - return sl & 0x0f; - } - return sl >> 4; - } - - @Override - public void setBlockSkyLight(int x, int y, int z, int level) { - if (this.skyLight == null) { - if (hasSkyLight && compressedLight != null) { - this.skyLight = getSkyLightArray(); - } else if (level == (hasSkyLight ? 15 : 0)) { - return; - } else { - this.skyLight = new byte[2048]; - if (hasSkyLight) { - Arrays.fill(this.skyLight, (byte) 0xFF); - } - } - } - int i = (y << 7) | (z << 3) | (x >> 1); - int old = this.skyLight[i] & 0xff; - if ((x & 1) == 0) { - this.skyLight[i] = (byte) ((old & 0xf0) | (level & 0x0f)); - } else { - this.skyLight[i] = (byte) (((level & 0x0f) << 4) | (old & 0x0f)); - } - } - - @Override - public int getBlockLight(int x, int y, int z) { - if (blockLight == null && !hasBlockLight) return 0; - this.blockLight = getLightArray(); - int l = blockLight[(y << 7) | (z << 3) | (x >> 1)] & 0xff; - if ((x & 1) == 0) { - return l & 0x0f; - } - return l >> 4; - } - - @Override - public void setBlockLight(int x, int y, int z, int level) { - if (this.blockLight == null) { - if (hasBlockLight) { - this.blockLight = getLightArray(); - } else if (level == 0) { - return; - } else { - this.blockLight = new byte[2048]; - } - } - int i = (y << 7) | (z << 3) | (x >> 1); - int old = this.blockLight[i] & 0xff; - if ((x & 1) == 0) { - this.blockLight[i] = (byte) ((old & 0xf0) | (level & 0x0f)); - } else { - this.blockLight[i] = (byte) (((level & 0x0f) << 4) | (old & 0x0f)); - } - } - - @Override - public byte[] getIdArray() { - synchronized (storage) { - byte[] anvil = new byte[4096]; - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 16; y++) { - int index = getAnvilIndex(x, y, z); - anvil[index] = (byte) storage.getBlockId(x, y, z); - } - } - } - return anvil; - } - } - - @Override - public byte[] getDataArray() { - synchronized (storage) { - NibbleArray anvil = new NibbleArray(4096); - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 16; y++) { - int index = getAnvilIndex(x, y, z); - anvil.set(index, (byte) storage.getBlockData(x, y, z)); - } - } - } - return anvil.getData(); - } - } - - @Override - public byte[] getSkyLightArray() { - if (this.skyLight != null) return this.skyLight; - if (this.hasSkyLight) { - if (this.compressedLight != null) { - this.inflate(); - if (this.skyLight != null) return this.skyLight; - } - } - return EmptyChunkSection.EMPTY_SKY_LIGHT_ARR; - } - - private void inflate() { - try { - if (compressedLight != null && compressedLight.length != 0) { - byte[] inflated = Zlib.inflate(compressedLight); - blockLight = Arrays.copyOfRange(inflated, 0, 2048); - if (inflated.length > 2048) { - skyLight = Arrays.copyOfRange(inflated, 2048, 4096); - } else { - skyLight = new byte[2048]; - if (hasSkyLight) { - Arrays.fill(skyLight, (byte) 0xFF); - } - } - compressedLight = null; - } else { - blockLight = new byte[2048]; - skyLight = new byte[2048]; - if (hasSkyLight) { - Arrays.fill(skyLight, (byte) 0xFF); - } - } - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - } - } - - @Override - public byte[] getLightArray() { - if (this.blockLight != null) return this.blockLight; - if (this.hasBlockLight) { - this.inflate(); - if (this.blockLight != null) return this.blockLight; - } - return EmptyChunkSection.EMPTY_LIGHT_ARR; - } - - @Override - public boolean isEmpty() { - return false; - } - - @Override - public byte[] getBytes() { - synchronized (storage) { - byte[] ids = storage.getBlockIds(); - byte[] data = storage.getBlockData(); - byte[] merged = new byte[ids.length + data.length]; - System.arraycopy(ids, 0, merged, 0, ids.length); - System.arraycopy(data, 0, merged, ids.length, data.length); - return merged; - } - } - - @Override - public void writeTo(int protocol, BinaryStream stream) { - synchronized (storage) { - stream.putByte((byte) 8); // Paletted chunk because Mojang messed up the old one - stream.putByte((byte) 2); - this.storage.writeTo(protocol, stream); - if (protocol >= ProtocolInfo.v1_16_100) { - EMPTY_STORAGE.writeTo(protocol, stream); - } else { - EMPTY_STORAGE_PRE419.writeTo(protocol, stream); - } - } - } - - public boolean compress() { - if (blockLight != null) { - byte[] arr1 = blockLight; - hasBlockLight = !Utils.isByteArrayEmpty(arr1); - byte[] arr2; - if (skyLight != null) { - arr2 = skyLight; - hasSkyLight = !Utils.isByteArrayEmpty(arr2); - } else if (hasSkyLight) { - arr2 = EmptyChunkSection.EMPTY_SKY_LIGHT_ARR; - } else { - arr2 = EmptyChunkSection.EMPTY_LIGHT_ARR; - hasSkyLight = false; - } - blockLight = null; - skyLight = null; - byte[] toDeflate = null; - if (hasBlockLight && hasSkyLight && arr2 != EmptyChunkSection.EMPTY_SKY_LIGHT_ARR) { - toDeflate = Binary.appendBytes(arr1, arr2); - } else if (hasBlockLight) { - toDeflate = arr1; - } - if (toDeflate != null) { - try { - compressedLight = Zlib.deflate(toDeflate, 1); - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - } - return true; - } - return false; - } - - public ChunkSection copy() { - return new ChunkSection( - this.y, - this.storage.copy(), - this.blockLight == null ? null : this.blockLight.clone(), - this.skyLight == null ? null : this.skyLight.clone(), - this.compressedLight == null ? null : this.compressedLight.clone(), - this.hasBlockLight, - this.hasSkyLight - ); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/format/anvil/RegionLoader.java b/src/main/java/cn/nukkit/level/format/anvil/RegionLoader.java deleted file mode 100644 index 9255a2642..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/RegionLoader.java +++ /dev/null @@ -1,323 +0,0 @@ -package cn.nukkit.level.format.anvil; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.format.LevelProvider; -import cn.nukkit.level.format.generic.BaseRegionLoader; -import cn.nukkit.utils.*; - -import java.io.EOFException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Map; -import java.util.TreeMap; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class RegionLoader extends BaseRegionLoader { - - public RegionLoader(LevelProvider level, int regionX, int regionZ) throws IOException { - super(level, regionX, regionZ, "mca"); - } - - @Override - protected boolean isChunkGenerated(int index) { - Integer[] array = this.locationTable.get(index); - return !(array[0] == 0 || array[1] == 0); - } - - @Override - public Chunk readChunk(int x, int z) throws IOException { - int index = getChunkOffset(x, z); - if (index < 0 || index >= 4096) { - return null; - } - - this.lastUsed = System.currentTimeMillis(); - - if (!this.isChunkGenerated(index)) { - return null; - } - - try { - Integer[] table = this.locationTable.get(index); - RandomAccessFile raf = this.getRandomAccessFile(); - raf.seek(table[0] << 12); - int length = raf.readInt(); - byte compression = raf.readByte(); - if (length <= 0 || length >= MAX_SECTOR_LENGTH) { - if (length >= MAX_SECTOR_LENGTH) { - table[0] = ++this.lastSector; - table[1] = 1; - this.locationTable.put(index, table); - MainLogger.getLogger().error("Corrupted chunk header detected"); - } - return null; - } - - if (length > (table[1] << 12)) { - MainLogger.getLogger().error("Corrupted bigger chunk detected"); - table[1] = length >> 12; - this.locationTable.put(index, table); - this.writeLocationIndex(index); - } else if (compression != COMPRESSION_ZLIB && compression != COMPRESSION_GZIP) { - MainLogger.getLogger().error("Invalid compression type"); - return null; - } - - byte[] data = new byte[length - 1]; - raf.readFully(data); - Chunk chunk = this.unserializeChunk(data); - if (chunk != null) { - return chunk; - } else { - MainLogger.getLogger().error("Corrupted chunk detected at (" + x + ", " + z + ") in " + levelProvider.getName()); - return null; - } - } catch (EOFException e) { - MainLogger.getLogger().error("Your world is corrupted because some code is bad and corrupted it"); - return null; - } - } - - @Override - protected Chunk unserializeChunk(byte[] data) { - return Chunk.fromBinary(data, this.levelProvider); - } - - @Override - public boolean chunkExists(int x, int z) { - return this.isChunkGenerated(getChunkOffset(x, z)); - } - - @Override - protected void saveChunk(int x, int z, byte[] chunkData) throws IOException { - int length = chunkData.length + 1; - if (length + 4 > MAX_SECTOR_LENGTH) { - throw new ChunkException("Chunk [" + x + ", " + z + "] is too big! " + (length + 4) + " > " + MAX_SECTOR_LENGTH); - } - int sectors = (int) Math.ceil((length + 4) / 4096d); - int index = getChunkOffset(x, z); - boolean indexChanged = false; - Integer[] table = this.locationTable.get(index); - - if (table[1] < sectors) { - table[0] = this.lastSector + 1; - this.locationTable.put(index, table); - this.lastSector += sectors; - indexChanged = true; - } else if (table[1] != sectors) { - indexChanged = true; - } - - table[1] = sectors; - table[2] = (int) (System.currentTimeMillis() / 1000d); - - this.locationTable.put(index, table); - RandomAccessFile raf = this.getRandomAccessFile(); - raf.seek(table[0] << 12); - - BinaryStream stream = new BinaryStream(); - stream.put(Binary.writeInt(length)); - stream.putByte(COMPRESSION_ZLIB); - stream.put(chunkData); - byte[] data = stream.getBuffer(); - if (data.length < sectors << 12) { - byte[] newData = new byte[sectors << 12]; - System.arraycopy(data, 0, newData, 0, data.length); - data = newData; - } - - raf.write(data); - - if (indexChanged) { - this.writeLocationIndex(index); - } - } - - @Override - public void removeChunk(int x, int z) { - int index = getChunkOffset(x, z); - Integer[] table = this.locationTable.get(0); - table[0] = 0; - table[1] = 0; - this.locationTable.put(index, table); - } - - @Override - public void writeChunk(FullChunk chunk) throws Exception { - this.lastUsed = System.currentTimeMillis(); - byte[] chunkData = chunk.toBinary(); - this.saveChunk(chunk.getX() & 0x1f, chunk.getZ() & 0x1f, chunkData); - } - - protected static int getChunkOffset(int x, int z) { - return x | (z << 5); - } - - @Override - public void close() throws IOException { - this.writeLocationTable(); - this.levelProvider = null; - super.close(); - } - - @Override - public int doSlowCleanUp() throws Exception { - RandomAccessFile raf = this.getRandomAccessFile(); - for (int i = 0; i < 1024; i++) { - Integer[] table = this.locationTable.get(i); - if (table[0] == 0 || table[1] == 0) { - continue; - } - raf.seek(table[0] << 12); - byte[] chunk = new byte[table[1] << 12]; - raf.readFully(chunk); - int length = Binary.readInt(Arrays.copyOfRange(chunk, 0, 3)); - if (length <= 1) { - this.locationTable.put(i, (table = new Integer[]{0, 0, 0})); - } - try { - chunk = Zlib.inflate(Arrays.copyOf(chunk, 5)); - } catch (Exception e) { - this.locationTable.put(i, new Integer[]{0, 0, 0}); - continue; - } - chunk = Zlib.deflate(chunk, 9); - ByteBuffer buffer = ByteBuffer.allocate(4 + 1 + chunk.length); - buffer.put(Binary.writeInt(chunk.length + 1)); - buffer.put(COMPRESSION_ZLIB); - buffer.put(chunk); - chunk = buffer.array(); - int sectors = (int) Math.ceil(chunk.length / 4096d); - if (sectors > table[1]) { - table[0] = this.lastSector + 1; - this.lastSector += sectors; - this.locationTable.put(i, table); - } - raf.seek(table[0] << 12); - byte[] bytes = new byte[sectors << 12]; - ByteBuffer buffer1 = ByteBuffer.wrap(bytes); - buffer1.put(chunk); - raf.write(buffer1.array()); - } - this.writeLocationTable(); - int n = this.cleanGarbage(); - this.writeLocationTable(); - return n; - } - - @Override - protected void loadLocationTable() throws IOException { - RandomAccessFile raf = this.getRandomAccessFile(); - raf.seek(0); - this.lastSector = 1; - int[] data = new int[2048]; //1024 records * 2 times - for (int i = 0; i < 2048; i++) { - data[i] = raf.readInt(); - } - for (int i = 0; i < 1024; ++i) { - int index = data[i]; - this.locationTable.put(i, new Integer[]{index >> 8, index & 0xff, data[1024 + i]}); - int value = this.locationTable.get(i)[0] + this.locationTable.get(i)[1] - 1; - if (value > this.lastSector) { - this.lastSector = value; - } - } - } - - private void writeLocationTable() throws IOException { - RandomAccessFile raf = this.getRandomAccessFile(); - raf.seek(0); - for (int i = 0; i < 1024; ++i) { - Integer[] array = this.locationTable.get(i); - raf.writeInt((array[0] << 8) | array[1]); - } - for (int i = 0; i < 1024; ++i) { - Integer[] array = this.locationTable.get(i); - raf.writeInt(array[2]); - } - } - - private int cleanGarbage() throws IOException { - RandomAccessFile raf = this.getRandomAccessFile(); - Map sectors = new TreeMap<>(); - for (Map.Entry entry : this.locationTable.entrySet()) { - Integer index = (Integer) entry.getKey(); - Integer[] data = (Integer[]) entry.getValue(); - if (data[0] == 0 || data[1] == 0) { - this.locationTable.put(index, new Integer[]{0, 0, 0}); - continue; - } - sectors.put(data[0], index); - } - - if (sectors.size() == (this.lastSector - 2)) { - return 0; - } - int shift = 0; - int lastSector = 1; - - raf.seek(8192); - int s = 2; - for (int sector : sectors.keySet()) { - s = sector; - int index = sectors.get(sector); - if ((sector - lastSector) > 1) { - shift += sector - lastSector - 1; - } - if (shift > 0) { - raf.seek(sector << 12); - byte[] old = new byte[4096]; - raf.readFully(old); - raf.seek((sector - shift) << 12); - raf.write(old); - } - Integer[] v = this.locationTable.get(index); - v[0] -= shift; - this.locationTable.put(index, v); - this.lastSector = sector; - } - raf.setLength((s + 1) << 12); - return shift; - } - - @Override - protected void writeLocationIndex(int index) throws IOException { - RandomAccessFile raf = this.getRandomAccessFile(); - Integer[] array = this.locationTable.get(index); - raf.seek(index << 2); - raf.writeInt((array[0] << 8) | array[1]); - raf.seek(4096 + (index << 2)); - raf.writeInt(array[2]); - } - - @Override - protected void createBlank() throws IOException { - RandomAccessFile raf = this.getRandomAccessFile(); - raf.seek(0); - raf.setLength(0); - this.lastSector = 1; - int time = (int) (System.currentTimeMillis() / 1000d); - for (int i = 0; i < 1024; ++i) { - this.locationTable.put(i, new Integer[]{0, 0, time}); - raf.writeInt(0); - } - for (int i = 0; i < 1024; ++i) { - raf.writeInt(time); - } - } - - @Override - public int getX() { - return x; - } - - @Override - public int getZ() { - return z; - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/BiomePalette.java b/src/main/java/cn/nukkit/level/format/anvil/palette/BiomePalette.java deleted file mode 100644 index 3d58f2d3a..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/BiomePalette.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import cn.nukkit.math.MathHelper; -import cn.nukkit.utils.ThreadCache; -import java.util.Arrays; - -public final class BiomePalette { - - private int biome; - private BitArray256 encodedData; - private IntPalette palette; - - private BiomePalette(BiomePalette clone) { - this.biome = clone.biome; - if (clone.encodedData != null) { - this.encodedData = clone.encodedData.clone(); - this.palette = clone.palette.clone(); - } - } - - public BiomePalette(int[] biomeColors) { - for (int i = 0; i < 256; i++) { - set(i, biomeColors[i]); - } - } - - public BiomePalette() { - this.biome = Integer.MIN_VALUE; - } - - public int get(int x, int z) { - return get(getIndex(x, z)); - } - - public synchronized int get(int index) { - if (encodedData == null) return biome; - return palette.getKey(encodedData.getAt(index)); - } - - public void set(int x, int z, int value) { - set(getIndex(x, z), value); - } - - public synchronized void set(int index, int value) { - if (encodedData == null) { - if (value == biome) return; - if (biome == Integer.MIN_VALUE) { - biome = value; - return; - } - synchronized (this) { - palette = new IntPalette(); - palette.add(biome); - palette.add(value); - encodedData = new BitArray256(1); - if (value < biome) { - Arrays.fill(encodedData.data, -1); - encodedData.setAt(index, 0); - } else { - encodedData.setAt(index, 1); - } - return; - } - } - - int encodedValue = palette.getValue(value); - if (encodedValue != Integer.MIN_VALUE) { - encodedData.setAt(index, encodedValue); - } else { - synchronized (this) { - int[] raw = encodedData.toRaw(ThreadCache.intCache256.get()); - - // TODO skip remapping of raw data and use grow instead if `remap` - // boolean remap = value < palette.getValue(palette.length() - 1); - - for (int i = 0; i < 256; i++) { - raw[i] = palette.getKey(raw[i]); - } - - raw[index] = value; - - palette.add(value); - - int newBits = MathHelper.log2(palette.length() - 1); - if (MathHelper.log2(palette.length() - 2) != newBits) { - encodedData = new BitArray256(newBits); - } - - for (int i = 0; i < raw.length; i++) { - raw[i] = palette.getValue(raw[i]); - } - - encodedData.fromRaw(raw); - } - } - } - - public synchronized int[] toRaw() { - int[] buffer = ThreadCache.intCache256.get(); - if (encodedData == null) { - Arrays.fill(buffer, biome); - } else { - synchronized (this) { - buffer = encodedData.toRaw(buffer); - for (int i = 0; i < 256; i++) { - buffer[i] = palette.getKey(buffer[i]); - } - } - } - return buffer; - } - - public int getIndex(int x, int z) { - return (z << 4) | x; - } - - public synchronized BiomePalette clone() { - return new BiomePalette(this); - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray.java b/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray.java deleted file mode 100644 index d47ad1fc2..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray.java +++ /dev/null @@ -1,156 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import cn.nukkit.utils.ThreadCache; - -/** - * @author https://github.com/boy0001/ - */ -public final class BitArray { - - private final int bitsPerEntry; - private final int maxSeqLocIndex; - private final int maxEntryValue; - private final long[] data; - - public BitArray(int bitsPerEntry) { - this.bitsPerEntry = bitsPerEntry; - this.maxSeqLocIndex = 64 - bitsPerEntry; - maxEntryValue = (1 << bitsPerEntry) - 1; - this.data = new long[(this.bitsPerEntry << 12) >> 6]; - } - - public final void setAt(int index, int value) { - int bitIndexStart = index * bitsPerEntry; - int longIndexStart = bitIndexStart >> 6; - int localBitIndexStart = bitIndexStart & 63; - this.data[longIndexStart] = this.data[longIndexStart] & ~((long) maxEntryValue << localBitIndexStart) | ((long) value) << localBitIndexStart; - - if (localBitIndexStart > maxSeqLocIndex) { - int longIndexEnd = longIndexStart + 1; - int localShiftStart = 64 - localBitIndexStart; - int localShiftEnd = bitsPerEntry - localShiftStart; - this.data[longIndexEnd] = this.data[longIndexEnd] >>> localShiftEnd << localShiftEnd | (((long) value) >> localShiftStart); - } - } - - public final int getAt(int index) { - int bitIndexStart = index * bitsPerEntry; - - int longIndexStart = bitIndexStart >> 6; - - int localBitIndexStart = bitIndexStart & 63; - if (localBitIndexStart <= maxSeqLocIndex) { - return (int)(this.data[longIndexStart] >>> localBitIndexStart & maxEntryValue); - } else { - return (int) ((this.data[longIndexStart] >>> localBitIndexStart | this.data[longIndexStart + 1] << (64 - localBitIndexStart)) & maxEntryValue); - } - } - - public final void fromRawSlow(char[] arr) { - for (int i = 0; i < arr.length; i++) { - setAt(i, arr[i]); - } - } - - public final void fromRaw(char[] arr) { - final long[] data = this.data; - final int dataLength = data.length; - final int bitsPerEntry = this.bitsPerEntry; - final int maxSeqLocIndex = this.maxSeqLocIndex; - - int localStart = 0; - char lastVal; - int arrI = 0; - long l = 0; - long nextVal; - for (int i = 0; i < dataLength; i++) { - for (; localStart <= maxSeqLocIndex; localStart += bitsPerEntry) { - lastVal = arr[arrI++]; - l |= ((long) lastVal << localStart); - } - if (localStart < 64) { - if (i != dataLength - 1) { - lastVal = arr[arrI++]; - int shift = 64 - localStart; - - nextVal = lastVal >> shift; - - l |= ((lastVal - (nextVal << shift)) << localStart); - - data[i] = l; - data[i + 1] = l = nextVal; - - localStart -= maxSeqLocIndex; - } - } else { - localStart = 0; - data[i] = l; - l = 0; - } - } - } - - public BitArray grow(int newBitsPerEntry) { - if (newBitsPerEntry - this.bitsPerEntry <= 0) return this; - BitArray newBitArray = new BitArray(newBitsPerEntry); - - char[] buffer = ThreadCache.charCache4096.get(); - toRaw(buffer); - newBitArray.fromRaw(buffer); - - return newBitArray; - } - - public BitArray growSlow(int bitsPerEntry) { - BitArray newBitArray = new BitArray(bitsPerEntry); - for (int i = 0; i < 4096; i++) { - newBitArray.setAt(i, getAt(i)); - } - return newBitArray; - } - - public final char[] toRawSlow() { - char[] arr = new char[4096]; - for (int i = 0; i < arr.length; i++) { - arr[i] = (char) getAt(i); - } - return arr; - } - - public final char[] toRaw() { - return toRaw(new char[4096]); - } - - protected final char[] toRaw(char[] buffer) { - final long[] data = this.data; - final int dataLength = data.length; - final int bitsPerEntry = this.bitsPerEntry; - final int maxEntryValue = this.maxEntryValue; - final int maxSeqLocIndex = this.maxSeqLocIndex; - - int localStart = 0; - char lastVal; - int arrI = 0; - long l; - for (int i = 0; i < dataLength; i++) { - l = data[i]; - for (; localStart <= maxSeqLocIndex; localStart += bitsPerEntry) { - lastVal = (char) (l >>> localStart & maxEntryValue); - buffer[arrI++] = lastVal; - } - if (localStart < 64) { - if (i != dataLength - 1) { - lastVal = (char) (l >>> localStart); - localStart -= maxSeqLocIndex; - l = data[i + 1]; - lastVal |= l << (bitsPerEntry - localStart); - lastVal &= maxEntryValue; - buffer[arrI++] = lastVal; - } - } else { - localStart = 0; - } - } - return buffer; - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray256.java b/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray256.java deleted file mode 100644 index 3591101d6..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray256.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import cn.nukkit.utils.ThreadCache; - -/** - * @author https://github.com/boy0001/ - */ -public final class BitArray256 { - - private final int bitsPerEntry; - protected final long[] data; - - public BitArray256(int bitsPerEntry) { - this.bitsPerEntry = bitsPerEntry; - int longLen = (this.bitsPerEntry << 8) >> 6; - this.data = new long[longLen]; - } - - public BitArray256(BitArray256 other) { - this.bitsPerEntry = other.bitsPerEntry; - this.data = other.data.clone(); - } - - public final void setAt(int index, int value) { - int bitIndexStart = index * bitsPerEntry; - int longIndexStart = bitIndexStart >> 6; - int localBitIndexStart = bitIndexStart & 63; - this.data[longIndexStart] = this.data[longIndexStart] & ~((long) ((1 << bitsPerEntry) - 1) << localBitIndexStart) | ((long) value) << localBitIndexStart; - - if (localBitIndexStart > 64 - bitsPerEntry) { - int longIndexEnd = longIndexStart + 1; - int localShiftStart = 64 - localBitIndexStart; - int localShiftEnd = bitsPerEntry - localShiftStart; - this.data[longIndexEnd] = this.data[longIndexEnd] >>> localShiftEnd << localShiftEnd | (((long) value) >> localShiftStart); - } - } - - public final int getAt(int index) { - int bitIndexStart = index * bitsPerEntry; - - int longIndexStart = bitIndexStart >> 6; - - int localBitIndexStart = bitIndexStart & 63; - if (localBitIndexStart <= 64 - bitsPerEntry) { - return (int)(this.data[longIndexStart] >>> localBitIndexStart & ((1 << bitsPerEntry) - 1)); - } else { - return (int) ((this.data[longIndexStart] >>> localBitIndexStart | this.data[longIndexStart + 1] << (64 - localBitIndexStart)) & ((1 << bitsPerEntry) - 1)); - } - } - - public final void fromRaw(int[] arr) { - for (int i = 0; i < arr.length; i++) { - setAt(i, arr[i]); - } - } - - public BitArray256 grow(int newBitsPerEntry) { - if (newBitsPerEntry - this.bitsPerEntry <= 0) return this; - BitArray256 newBitArray = new BitArray256(newBitsPerEntry); - - int[] buffer = ThreadCache.intCache256.get(); - toRaw(buffer); - newBitArray.fromRaw(buffer); - - return newBitArray; - } - - public BitArray256 growSlow(int bitsPerEntry) { - BitArray256 newBitArray = new BitArray256(bitsPerEntry); - for (int i = 0; i < 256; i++) { - newBitArray.setAt(i, getAt(i)); - } - return newBitArray; - } - - public final int[] toRaw(int[] buffer) { - for (int i = 0; i < buffer.length; i++) { - buffer[i] = getAt(i); - } - return buffer; - } - - public final int[] toRaw() { - return toRaw(new int[256]); - } - - public BitArray256 clone() { - return new BitArray256(this); - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray4096.java b/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray4096.java deleted file mode 100644 index 7526fc1c3..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/BitArray4096.java +++ /dev/null @@ -1,160 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import cn.nukkit.utils.ThreadCache; - -/** - * @author https://github.com/boy0001/ - */ -public final class BitArray4096 { - - private final int bitsPerEntry; - private final int maxSeqLocIndex; - private final int maxEntryValue; - private final long[] data; - - public BitArray4096(int bitsPerEntry) { - this.bitsPerEntry = bitsPerEntry; - this.maxSeqLocIndex = 64 - bitsPerEntry; - maxEntryValue = (1 << bitsPerEntry) - 1; - this.data = new long[(this.bitsPerEntry << 12) >> 6]; - } - - public final void setAt(int index, int value) { - if (data.length == 0) return; - int bitIndexStart = index * bitsPerEntry; - int longIndexStart = bitIndexStart >> 6; - int localBitIndexStart = bitIndexStart & 63; - this.data[longIndexStart] = this.data[longIndexStart] & ~((long) maxEntryValue << localBitIndexStart) | ((long) value) << localBitIndexStart; - - if (localBitIndexStart > maxSeqLocIndex) { - int longIndexEnd = longIndexStart + 1; - int localShiftStart = 64 - localBitIndexStart; - int localShiftEnd = bitsPerEntry - localShiftStart; - this.data[longIndexEnd] = this.data[longIndexEnd] >>> localShiftEnd << localShiftEnd | (((long) value) >> localShiftStart); - } - } - - public final int getAt(int index) { - if (data.length == 0) return 0; - int bitIndexStart = index * bitsPerEntry; - - int longIndexStart = bitIndexStart >> 6; - - int localBitIndexStart = bitIndexStart & 63; - if (localBitIndexStart <= maxSeqLocIndex) { - return (int)(this.data[longIndexStart] >>> localBitIndexStart & maxEntryValue); - } else { - int localShift = 64 - localBitIndexStart; - return (int) ((this.data[longIndexStart] >>> localBitIndexStart | this.data[longIndexStart + 1] << localShift) & maxEntryValue); - } - } - - public final void fromRawSlow(char[] arr) { - for (int i = 0; i < arr.length; i++) { - setAt(i, arr[i]); - } - } - - public final void fromRaw(char[] arr) { - final long[] data = this.data; - final int dataLength = data.length; - final int bitsPerEntry = this.bitsPerEntry; - final int maxSeqLocIndex = this.maxSeqLocIndex; - - int localStart = 0; - char lastVal; - int arrI = 0; - long l = 0; - long nextVal; - for (int i = 0; i < dataLength; i++) { - for (; localStart <= maxSeqLocIndex; localStart += bitsPerEntry) { - lastVal = arr[arrI++]; - l |= ((long) lastVal << localStart); - } - if (localStart < 64) { - if (i != dataLength - 1) { - lastVal = arr[arrI++]; - int shift = 64 - localStart; - - nextVal = lastVal >> shift; - - l |= ((lastVal - (nextVal << shift)) << localStart); - - data[i] = l; - data[i + 1] = l = nextVal; - - localStart -= maxSeqLocIndex; - } - } else { - localStart = 0; - data[i] = l; - l = 0; - } - } - } - - public BitArray4096 grow(int newBitsPerEntry) { - if (newBitsPerEntry - this.bitsPerEntry <= 0) return this; - BitArray4096 newBitArray = new BitArray4096(newBitsPerEntry); - - char[] buffer = ThreadCache.charCache4096.get(); - toRaw(buffer); - newBitArray.fromRaw(buffer); - - return newBitArray; - } - - public BitArray4096 growSlow(int bitsPerEntry) { - BitArray4096 newBitArray = new BitArray4096(bitsPerEntry); - for (int i = 0; i < 4096; i++) { - newBitArray.setAt(i, getAt(i)); - } - return newBitArray; - } - - public final char[] toRawSlow() { - char[] arr = new char[4096]; - for (int i = 0; i < arr.length; i++) { - arr[i] = (char) getAt(i); - } - return arr; - } - - public final char[] toRaw() { - return toRaw(new char[4096]); - } - - protected final char[] toRaw(char[] buffer) { - final long[] data = this.data; - final int dataLength = data.length; - final int bitsPerEntry = this.bitsPerEntry; - final int maxEntryValue = this.maxEntryValue; - final int maxSeqLocIndex = this.maxSeqLocIndex; - - int localStart = 0; - char lastVal; - int arrI = 0; - long l; - for (int i = 0; i < dataLength; i++) { - l = data[i]; - for (; localStart <= maxSeqLocIndex; localStart += bitsPerEntry) { - lastVal = (char) (l >>> localStart & maxEntryValue); - buffer[arrI++] = lastVal; - } - if (localStart < 64) { - if (i != dataLength - 1) { - lastVal = (char) (l >>> localStart); - localStart -= maxSeqLocIndex; - l = data[i + 1]; - int localShift = bitsPerEntry - localStart; - lastVal |= l << localShift; - lastVal &= maxEntryValue; - buffer[arrI++] = lastVal; - } - } else { - localStart = 0; - } - } - return buffer; - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/BlockDataPalette.java b/src/main/java/cn/nukkit/level/format/anvil/palette/BlockDataPalette.java deleted file mode 100644 index b64525b91..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/BlockDataPalette.java +++ /dev/null @@ -1,220 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import cn.nukkit.Server; -import cn.nukkit.math.MathHelper; -import cn.nukkit.utils.ThreadCache; -import com.google.common.base.Preconditions; - -import java.util.Arrays; - -/** - * @author https://github.com/boy0001/ - */ -public final class BlockDataPalette implements Cloneable { - - private static final int BLOCK_SIZE = 4096; - private volatile char[] rawData; - - private volatile BitArray4096 encodedData; - private volatile CharPalette palette; - - // TODO compress unused sections - // private byte[] compressedData; - - public BlockDataPalette() { - this(new char[BLOCK_SIZE]); - } - - public BlockDataPalette(char[] rawData) { - Preconditions.checkArgument(rawData.length == BLOCK_SIZE, "Data is not 4096"); - this.rawData = rawData; - } - - private char[] getCachedRaw() { - char[] raw = rawData; - if (raw != null) { - return raw; - } else if (!Server.getInstance().isPrimaryThread()) { - return getRaw(); - } - return rawData; - } - - public synchronized char[] getRaw() { - CharPalette palette = this.palette; - BitArray4096 encodedData = this.encodedData; - this.encodedData = null; - this.palette = null; - - char[] raw = rawData; - if (raw == null && palette != null) { - if (encodedData != null) { - raw = encodedData.toRaw(); - } else { - raw = new char[BLOCK_SIZE]; - } - for (int i = 0; i < BLOCK_SIZE; i++) { - raw[i] = palette.getKey(raw[i]); - } - } else { - raw = new char[BLOCK_SIZE]; - } - rawData = raw; - return rawData; - } - - private int getIndex(int x, int y, int z) { - return (x << 8) + (z << 4) + y; // XZY = Bedrock format - } - - public int getBlockData(int x, int y, int z) { - return getFullBlock(x, y, z) & 0xF; - } - - public int getBlockId(int x, int y, int z) { - return getFullBlock(x, y, z) >> 4; - } - - public void setBlockId(int x, int y, int z, int id) { - setFullBlock(x, y, z, (char) (id << 4)); - } - - public synchronized void setBlockData(int x, int y, int z, int data) { - int index = getIndex(x, y, z); - char[] raw = getCachedRaw(); - - if (raw != null) { - int fullId = raw[index]; - raw[index] = (char) ((fullId & 0xFFF0) | data); - } if (palette != null && encodedData != null) { - char fullId = palette.getKey(encodedData.getAt(index)); - if ((fullId & 0xF) != data) { - setPaletteFullBlock(index, (char) ((fullId & 0xFFF0) | data)); - } - } else { - throw new IllegalStateException("Raw data and pallete was null"); - } - } - - public int getFullBlock(int x, int y, int z) { - return getFullBlock(getIndex(x, y, z)); - } - - public void setFullBlock(int x, int y, int z, int value) { - this.setFullBlock(getIndex(x, y, z), (char) value); - } - - public int getAndSetFullBlock(int x, int y, int z, int value) { - return getAndSetFullBlock(getIndex(x, y, z), (char) value); - } - - private int getAndSetFullBlock(int index, char value) { - char[] raw = getCachedRaw(); - if (raw != null) { - char result = raw[index]; - raw[index] = value; - return result; - } else if (palette != null && encodedData != null) { - char result = palette.getKey(encodedData.getAt(index)); - if (result != value) { - setPaletteFullBlock(index, value); - } - return result; - } else { - throw new IllegalStateException("Raw data and pallete was null"); - } - } - - private int getFullBlock(int index) { - char[] raw = getCachedRaw(); - if (raw != null) { - return raw[index]; - } else if (palette != null && encodedData != null) { - return palette.getKey(encodedData.getAt(index)); - } else { - throw new IllegalStateException("Raw data and pallete was null"); - } - } - - private void setFullBlock(int index, char value) { - char[] raw = getCachedRaw(); - if (raw != null) { - raw[index] = value; - } else if (!setPaletteFullBlock(index, value)) { - throw new IllegalStateException("Raw data and pallete was null"); - } - } - - private synchronized boolean setPaletteFullBlock(int index, char value) { - CharPalette palette = this.palette; - BitArray4096 encodedData = this.encodedData; - if (palette != null && encodedData != null) { - char encodedValue = palette.getValue(value); - if (encodedValue != Character.MAX_VALUE) { - encodedData.setAt(index, encodedValue); - } else { - char[] raw = encodedData.toRaw(); - for (int i = 0; i < BLOCK_SIZE; i++) { - raw[i] = palette.getKey(raw[i]); - } - raw[index] = value; - this.rawData = raw; - this.encodedData = null; - this.palette = null; - } - return true; - } - return false; - } - - public synchronized boolean compress() { - char[] raw = rawData; - if (raw != null) { - char unique = 0; - - boolean[] countTable = ThreadCache.boolCache4096.get(); - char[] mapFullTable = ThreadCache.charCache4096.get(); - char[] mapBitTable = ThreadCache.charCache4096v2.get(); - Arrays.fill(countTable, false); - for (char c : raw) { - if (!countTable[c]) { - mapBitTable[unique] = c; - countTable[c] = true; - unique++; - } - } - - char[] keys = Arrays.copyOfRange(mapBitTable, 0, unique); - if (keys.length > 1) { - Arrays.sort(keys); - for (char c = 0; c < keys.length; c++) { - mapFullTable[keys[c]] = c; - } - } else { - mapFullTable[keys[0]] = 0; - } - - CharPalette palette = new CharPalette(); - palette.set(keys); - - int bits = MathHelper.log2(unique - 1); - BitArray4096 encodedData = new BitArray4096(bits); - - for (int i = 0; i < raw.length; i++) { - mapBitTable[i] = mapFullTable[raw[i]]; - } - - encodedData.fromRaw(mapBitTable); - - this.palette = palette; - this.encodedData = encodedData; - rawData = null; - return true; - } - return false; - } - - public synchronized BlockDataPalette clone() { - return new BlockDataPalette(getRaw().clone()); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/BytePalette.java b/src/main/java/cn/nukkit/level/format/anvil/palette/BytePalette.java deleted file mode 100644 index 83b5a76cf..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/BytePalette.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import java.util.Arrays; - -/** - * @author https://github.com/boy0001/ - */ -public class BytePalette { - - private static byte[] BYTE0 = new byte[0]; - private byte[] keys = BYTE0; - private byte lastIndex = Byte.MIN_VALUE; - - public void add(byte key) { - keys = insert(key); - lastIndex = Byte.MIN_VALUE; - } - - protected void set(byte[] keys) { - this.keys = keys; - lastIndex = Byte.MIN_VALUE; - } - - private byte[] insert(byte val) { - lastIndex = Byte.MIN_VALUE; - if (keys.length == 0) { - return new byte[] { val }; - } - else if (val < keys[0]) { - byte[] s = new byte[keys.length + 1]; - System.arraycopy(keys, 0, s, 1, keys.length); - s[0] = val; - return s; - } else if (val > keys[keys.length - 1]) { - byte[] s = Arrays.copyOf(keys, keys.length + 1); - s[keys.length] = val; - return s; - } - byte[] s = Arrays.copyOf(keys, keys.length + 1); - for (int i = 0; i < s.length; i++) { - if (keys[i] < val) { - continue; - } - System.arraycopy(keys, i, s, i + 1, s.length - i - 1); - s[i] = val; - break; - } - return s; - } - - public byte getKey(int index) { - return keys[index]; - } - - public byte getValue(byte key) { - byte lastTmp = lastIndex; - boolean hasLast = lastTmp != Byte.MIN_VALUE; - int index; - if (hasLast) { - byte lastKey = keys[lastTmp]; - if (lastKey == key) return lastTmp; - if (lastKey > key) { - index = binarySearch0(0, lastTmp, key); - } else { - index = binarySearch0(lastTmp + 1, keys.length, key); - } - } else { - index = binarySearch0(0, keys.length, key); - } - if (index >= keys.length || index < 0) { - return lastIndex = Byte.MIN_VALUE; - } else { - return lastIndex = (byte) index; - } - } - - private int binarySearch0(int fromIndex, int toIndex, byte key) { - int low = fromIndex; - int high = toIndex - 1; - - while (low <= high) { - int mid = (low + high) >>> 1; - byte midVal = keys[mid]; - - if (midVal < key) - low = mid + 1; - else if (midVal > key) - high = mid - 1; - else - return mid; // key found - } - return -(low + 1); // key not found. - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/CharPalette.java b/src/main/java/cn/nukkit/level/format/anvil/palette/CharPalette.java deleted file mode 100644 index 33a94e84e..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/CharPalette.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import java.util.Arrays; - -/** - * @author https://github.com/boy0001/ - */ -public class CharPalette { - - private static char[] CHAR0 = new char[0]; - private char[] keys = CHAR0; - private char lastIndex = Character.MAX_VALUE; - - public void add(char key) { - keys = insert(key); - lastIndex = Character.MAX_VALUE; - } - - protected void set(char[] keys) { - this.keys = keys; - lastIndex = Character.MAX_VALUE; - } - - private char[] insert(char val) { - lastIndex = Character.MAX_VALUE; - if (keys.length == 0) { - return new char[] { val }; - } - else if (val < keys[0]) { - char[] s = new char[keys.length + 1]; - System.arraycopy(keys, 0, s, 1, keys.length); - s[0] = val; - return s; - } else if (val > keys[keys.length - 1]) { - char[] s = Arrays.copyOf(keys, keys.length + 1); - s[keys.length] = val; - return s; - } - char[] s = Arrays.copyOf(keys, keys.length + 1); - for (int i = 0; i < s.length; i++) { - if (keys[i] < val) { - continue; - } - System.arraycopy(keys, i, s, i + 1, s.length - i - 1); - s[i] = val; - break; - } - return s; - } - - public char getKey(int index) { - return keys[index]; - } - - public char getValue(char key) { - char lastTmp = lastIndex; - boolean hasLast = lastTmp != Character.MAX_VALUE; - int index; - if (hasLast) { - char lastKey = keys[lastTmp]; - if (lastKey == key) return lastTmp; - if (lastKey > key) { - index = binarySearch0(0, lastTmp, key); - } else { - index = binarySearch0(lastTmp + 1, keys.length, key); - } - } else { - index = binarySearch0(0, keys.length, key); - } - if (index >= keys.length || index < 0) { - return lastIndex = Character.MAX_VALUE; - } else { - return lastIndex = (char) index; - } - } - - private int binarySearch0(int fromIndex, int toIndex, char key) { - int low = fromIndex; - int high = toIndex - 1; - - while (low <= high) { - int mid = (low + high) >>> 1; - char midVal = keys[mid]; - - if (midVal < key) - low = mid + 1; - else if (midVal > key) - high = mid - 1; - else - return mid; // key found - } - return -(low + 1); // key not found. - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/DataPalette.java b/src/main/java/cn/nukkit/level/format/anvil/palette/DataPalette.java deleted file mode 100644 index 01dac2a9e..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/DataPalette.java +++ /dev/null @@ -1,209 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import cn.nukkit.math.MathHelper; -import java.util.Arrays; - -/** - * @author https://github.com/boy0001/ - */ -public final class DataPalette implements Cloneable { - - protected static final ThreadLocal countCache = new ThreadLocal() { - @Override - protected boolean[] initialValue() { - // TODO use actual block size - return new boolean[4096]; - } - }; - - protected static final ThreadLocal mapFullToBitCache = new ThreadLocal() { - @Override - protected char[] initialValue() { - // TODO use actual block size - return new char[4096]; - } - }; - - protected static final ThreadLocal mapBitToFullCache = new ThreadLocal() { - @Override - protected char[] initialValue() { - // TODO use actual block size - return new char[4096]; - } - }; - - private char[] rawData; - - private BitArray encodedData; - private CharPalette palette; - - // TODO compress unused sections - // private byte[] compressedData; - - public DataPalette() { - this(new char[4096]); - } - - public DataPalette(char[] rawData) { - this.rawData = rawData; - } - - public synchronized char[] getRaw() { - char[] raw = rawData; - if (raw == null) { - raw = encodedData.toRaw(); - for (int i = 0; i < 4096; i++) { - raw[i] = palette.getKey(raw[i]); - } - } - rawData = raw; - encodedData = null; - palette = null; - return rawData; - } - - private int getIndex(int x, int y, int z) { - return (x << 8) + (z << 4) + y; // XZY = Bedrock format - } - - public int getBlockData(int x, int y, int z) { - return getFullBlock(x, y, z) & 0xF; - } - - public int getBlockId(int x, int y, int z) { - return getFullBlock(x, y, z) >> 4; - } - - public void setBlockId(int x, int y, int z, int id) { - setFullBlock(x, y, z, (char) (id << 4)); - } - - public void setBlockData(int x, int y, int z, int data) { - int index = getIndex(x, y, z); - char[] raw = rawData; - if (raw != null) { - int fullId = raw[index]; - raw[index] = (char) ((fullId & 0xFFF0) | data); - } else { - char fullId = palette.getKey(encodedData.getAt(index)); - if ((fullId & 0xF) != data) { - setPaletteFullBlock(index, (char) ((fullId & 0xFFF0) | data)); - } - } - } - - public int getFullBlock(int x, int y, int z) { - return getFullBlock(getIndex(x, y, z)); - } - - public void setFullBlock(int x, int y, int z, int value) { - this.setFullBlock(getIndex(x, y, z), (char) value); - } - - public int getAndSetFullBlock(int x, int y, int z, int value) { - return getAndSetFullBlock(getIndex(x, y, z), (char) value); - } - - private int getAndSetFullBlock(int index, char value) { - char[] raw = rawData; - if (raw != null) { - char result = raw[index]; - raw[index] = value; - return result; - } else { - char fullId = palette.getKey(encodedData.getAt(index)); - if (fullId != value) { - setPaletteFullBlock(index, value); - } - return fullId; - } - } - - private int getFullBlock(int index) { - char[] raw = rawData; - if (raw != null) { - return raw[index]; - } - return palette.getKey(encodedData.getAt(index)); - } - - private void setFullBlock(int index, char value) { - char[] raw = rawData; - if (raw != null) { - raw[index] = value; - return; - } - setPaletteFullBlock(index, value); - } - - private void setPaletteFullBlock(int index, char value) { - char encodedValue = palette.getValue(value); - if (encodedValue != Character.MAX_VALUE) { - encodedData.setAt(index, encodedValue); - } else { - synchronized (this) { - char[] raw = encodedData.toRaw(); - for (int i = 0; i < 4096; i++) { - raw[i] = palette.getKey(raw[i]); - } - raw[index] = value; - rawData = raw; - encodedData = null; - palette = null; - } - } - } - - public boolean compress() { - char[] raw = rawData; - if (raw != null) { - synchronized (this) { - char unique = 0; - - boolean[] countTable = countCache.get(); - char[] mapFullTable = mapFullToBitCache.get(); - char[] mapBitTable = mapBitToFullCache.get(); - Arrays.fill(countTable, false); - for (char c : raw) { - if (!countTable[c]) { - mapBitTable[unique] = c; - countTable[c] = true; - unique++; - } - } - - char[] keys = Arrays.copyOfRange(mapBitTable, 0, unique); - if (keys.length > 1) { - Arrays.sort(keys); - for (char c = 0; c < keys.length; c++) { - mapFullTable[keys[c]] = c; - } - } else { - mapFullTable[keys[0]] = 0; - } - - CharPalette palette = new CharPalette(); - palette.set(keys); - - int bits = MathHelper.log2nlz(unique) + 1; - BitArray encodedData = new BitArray(bits); - - for (int i = 0; i < raw.length; i++) { - raw[i] = mapFullTable[raw[i]]; - } - - encodedData.fromRaw(raw); - - this.palette = palette; - this.encodedData = encodedData; - rawData = null; - return true; - } - } - return false; - } - - public synchronized DataPalette clone() { - return new DataPalette(getRaw().clone()); - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/palette/IntPalette.java b/src/main/java/cn/nukkit/level/format/anvil/palette/IntPalette.java deleted file mode 100644 index 11140ddd2..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/palette/IntPalette.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.nukkit.level.format.anvil.palette; - -import java.util.Arrays; - -/** - * @author https://github.com/boy0001/ - */ -public class IntPalette { - - private static int[] INT0 = new int[0]; - private int[] keys = INT0; - private int lastIndex = Integer.MIN_VALUE; - - public void add(int key) { - keys = insert(key); - lastIndex = Integer.MIN_VALUE; - } - - protected void set(int[] keys) { - this.keys = keys; - lastIndex = Integer.MIN_VALUE; - } - - private int[] insert(int val) { - lastIndex = Integer.MIN_VALUE; - if (keys.length == 0) { - return new int[] { val }; - } - else if (val < keys[0]) { - int[] s = new int[keys.length + 1]; - System.arraycopy(keys, 0, s, 1, keys.length); - s[0] = val; - return s; - } else if (val > keys[keys.length - 1]) { - int[] s = Arrays.copyOf(keys, keys.length + 1); - s[keys.length] = val; - return s; - } - int[] s = Arrays.copyOf(keys, keys.length + 1); - for (int i = 0; i < s.length; i++) { - if (keys[i] < val) { - continue; - } - System.arraycopy(keys, i, s, i + 1, s.length - i - 1); - s[i] = val; - break; - } - return s; - } - - public int getKey(int index) { - return keys[index]; - } - - public int getValue(int key) { - int lastTmp = lastIndex; - boolean hasLast = lastTmp != Integer.MIN_VALUE; - int index; - if (hasLast) { - int lastKey = keys[lastTmp]; - if (lastKey == key) return lastTmp; - if (lastKey > key) { - index = binarySearch0(0, lastTmp, key); - } else { - index = binarySearch0(lastTmp + 1, keys.length, key); - } - } else { - index = binarySearch0(0, keys.length, key); - } - if (index >= keys.length || index < 0) { - return lastIndex = Integer.MIN_VALUE; - } else { - return lastIndex = index; - } - } - - private int binarySearch0(int fromIndex, int toIndex, int key) { - int low = fromIndex; - int high = toIndex - 1; - - while (low <= high) { - int mid = (low + high) >>> 1; - int midVal = keys[mid]; - - if (midVal < key) - low = mid + 1; - else if (midVal > key) - high = mid - 1; - else - return mid; // key found - } - return -(low + 1); // key not found. - } - - public int length() { - return keys.length; - } - - public IntPalette clone() { - IntPalette p = new IntPalette(); - p.keys = this.keys != INT0 ? this.keys.clone() : INT0; - p.lastIndex = this.lastIndex; - return p; - } -} diff --git a/src/main/java/cn/nukkit/level/format/anvil/util/BlockStorage.java b/src/main/java/cn/nukkit/level/format/anvil/util/BlockStorage.java deleted file mode 100644 index 406fce10d..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/util/BlockStorage.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.nukkit.level.format.anvil.util; - -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.level.util.PalettedBlockStorage; -import cn.nukkit.utils.BinaryStream; -import com.google.common.base.Preconditions; - -import java.util.Arrays; - -public class BlockStorage { - private static final int SECTION_SIZE = 4096; - private final byte[] blockIds; - private final NibbleArray blockData; - - public BlockStorage() { - blockIds = new byte[SECTION_SIZE]; - blockData = new NibbleArray(SECTION_SIZE); - } - - private BlockStorage(byte[] blockIds, NibbleArray blockData) { - this.blockIds = blockIds; - this.blockData = blockData; - } - - private static int getIndex(int x, int y, int z) { - int index = (x << 8) + (z << 4) + y; // XZY = Bedrock format - if (index < 0 || index >= SECTION_SIZE) throw new IllegalArgumentException("Invalid index"); - return index; - } - - public int getBlockData(int x, int y, int z) { - return blockData.get(getIndex(x, y, z)) & 0xf; - } - - public int getBlockId(int x, int y, int z) { - return blockIds[getIndex(x, y, z)] & 0xFF; - } - - public void setBlockId(int x, int y, int z, int id) { - int index = getIndex(x, y, z); - int value = id & 0xff; - blockIds[index] = (byte) value; - if (value == 0) { - blockData.remove(index); - } - } - - public void setBlockData(int x, int y, int z, int data) { - blockData.set(getIndex(x, y, z), (byte) data); - } - - public int getFullBlock(int x, int y, int z) { - return getFullBlock(getIndex(x, y, z)); - } - - public void setFullBlock(int x, int y, int z, int value) { - this.setFullBlock(getIndex(x, y, z), (short) value); - } - - public int getAndSetFullBlock(int x, int y, int z, int value) { - return getAndSetFullBlock(getIndex(x, y, z), (short) value); - } - - private int getAndSetFullBlock(int index, short value) { - Preconditions.checkArgument(value < 0xfff, "Invalid full block"); - byte oldBlock = blockIds[index]; - byte oldData = blockData.get(index); - byte newBlock = (byte) ((value & 0xff0) >> 4); - byte newData = (byte) (value & 0xf); - if (oldBlock != newBlock) { - blockIds[index] = newBlock; - } - if (oldData != newData) { - blockData.set(index, newData); - } - return ((oldBlock & 0xff) << 4) | oldData; - } - - private int getFullBlock(int index) { - byte block = blockIds[index]; - byte data = blockData.get(index); - return ((block & 0xff) << 4) | data; - } - - private void setFullBlock(int index, short value) { - Preconditions.checkArgument(value < 0xfff, "Invalid full block"); - byte block = (byte) ((value & 0xff0) >> 4); - byte data = (byte) (value & 0xf); - - blockIds[index] = block; - blockData.set(index, data); - } - - public byte[] getBlockIds() { - return Arrays.copyOf(blockIds, blockIds.length); - } - - public byte[] getBlockData() { - return blockData.getData(); - } - - public void writeTo(int protocol, BinaryStream stream) { - PalettedBlockStorage storage = new PalettedBlockStorage(protocol); - for (int i = 0; i < SECTION_SIZE; i++) { - storage.setBlock(i, GlobalBlockPalette.getOrCreateRuntimeId(protocol, blockIds[i] & 0xff, blockData.get(i))); - } - storage.writeTo(protocol, stream); - } - - public BlockStorage copy() { - return new BlockStorage(blockIds.clone(), blockData.copy()); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/format/anvil/util/NibbleArray.java b/src/main/java/cn/nukkit/level/format/anvil/util/NibbleArray.java deleted file mode 100644 index 746726b1b..000000000 --- a/src/main/java/cn/nukkit/level/format/anvil/util/NibbleArray.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.nukkit.level.format.anvil.util; - - -import com.google.common.base.Preconditions; - -import java.util.Arrays; - -public class NibbleArray implements Cloneable { - - private final byte[] data; - - public NibbleArray(int length) { - data = new byte[(length >> 1)]; - } - - public NibbleArray(byte[] array) { - data = array; - } - - public byte get(int index) { - if (index >= data.length << 1) throw new IndexOutOfBoundsException(); - byte val = data[index >> 1]; - if ((index & 1) == 0) { - return (byte) (val & 0x0f); - } else { - return (byte) ((val & 0xf0) >>> 4); - } - } - - public void set(int index, byte value) { - if (value != (value & 15)) { - throw new IllegalArgumentException("Nibbles must have a value between 0 and 15."); - } else if (index >= data.length << 1 || index < 0) { - throw new IndexOutOfBoundsException(); - } - value &= 0xf; - int half = index >> 1; - byte previous = data[half]; - if ((index & 1) == 0) { - data[half] = (byte) (previous & 0xf0 | value); - } else { - data[half] = (byte) (previous & 0x0f | value << 4); - } - } - - public void remove(int index) { - if (index >= data.length << 1 || index < 0) { - throw new IndexOutOfBoundsException(); - } - int half = index >> 1; - byte previous = data[half]; - if ((index & 1) == 0) { - data[half] = (byte) (previous & 0xf0); - } else { - data[half] = (byte) (previous & 0x0f); - } - } - - public void fill(byte value) { - Preconditions.checkArgument(value >= 0 && value < 16, "Nibbles must have a value between 0 and 15."); - value &= 0xf; - Arrays.fill(data, (byte) ((value << 4) | value)); - } - - public void copyFrom(byte[] bytes) { - Preconditions.checkNotNull(bytes, "bytes"); - Preconditions.checkArgument(bytes.length == data.length, "length of provided byte array is %s but expected %s", bytes.length, - data.length); - System.arraycopy(bytes, 0, data, 0, data.length); - } - - public void copyFrom(NibbleArray array) { - Preconditions.checkNotNull(array, "array"); - copyFrom(array.data); - } - - public byte[] getData() { - return data; - } - - public NibbleArray copy() { - return new NibbleArray(getData().clone()); - } -} diff --git a/src/main/java/cn/nukkit/level/format/generic/BaseChunk.java b/src/main/java/cn/nukkit/level/format/generic/BaseChunk.java deleted file mode 100644 index bfca23a67..000000000 --- a/src/main/java/cn/nukkit/level/format/generic/BaseChunk.java +++ /dev/null @@ -1,292 +0,0 @@ -package cn.nukkit.level.format.generic; - -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.level.format.Chunk; -import cn.nukkit.level.format.ChunkSection; -import cn.nukkit.level.format.LevelProvider; -import cn.nukkit.utils.ChunkException; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.nio.ByteBuffer; -import java.util.Arrays; - -/** - * @author MagicDroidX - * Nukkit Project - */ - -public abstract class BaseChunk extends BaseFullChunk implements Chunk { - - protected ChunkSection[] sections; - - private static final byte[] emptyIdArray = new byte[4096]; - private static final byte[] emptyDataArray = new byte[2048]; - - @Override - public BaseChunk clone() { - BaseChunk chunk = (BaseChunk) super.clone(); - if (this.biomes != null) chunk.biomes = this.biomes.clone(); - chunk.heightMap = this.getHeightMapArray().clone(); - if (sections != null && sections[0] != null) { - chunk.sections = new ChunkSection[sections.length]; - for (int i = 0; i < sections.length; i++) { - chunk.sections[i] = sections[i].copy(); - } - } - return chunk; - } - - private void removeInvalidTile(int x, int y, int z) { - BlockEntity entity = getTile(x, y, z); - if (entity != null && !entity.isBlockEntityValid()) { - removeBlockEntity(entity); - } - } - - @Override - public int getFullBlock(int x, int y, int z) { - return this.sections[y >> 4].getFullBlock(x, y & 0x0f, z); - } - - @Override - public boolean setBlock(int x, int y, int z, int blockId) { - return this.setBlock(x, y, z, blockId, 0); - } - - @Override - public Block getAndSetBlock(int x, int y, int z, Block block) { - int Y = y >> 4; - try { - setChanged(); - return this.sections[Y].getAndSetBlock(x, y & 0x0f, z, block); - } catch (ChunkException e) { - try { - this.setInternalSection(Y, (ChunkSection) this.providerClass.getMethod("createChunkSection", int.class).invoke(this.providerClass, Y)); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e1) { - Server.getInstance().getLogger().logException(e1); - } - return this.sections[Y].getAndSetBlock(x, y & 0x0f, z, block); - } finally { - removeInvalidTile(x, y, z); - } - } - - @Override - public boolean setFullBlockId(int x, int y, int z, int fullId) { - int Y = y >> 4; - try { - setChanged(); - return this.sections[Y].setFullBlockId(x, y & 0x0f, z, fullId); - } catch (ChunkException e) { - try { - this.setInternalSection(Y, (ChunkSection) this.providerClass.getMethod("createChunkSection", int.class).invoke(this.providerClass, Y)); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e1) { - Server.getInstance().getLogger().logException(e1); - } - return this.sections[Y].setFullBlockId(x, y & 0x0f, z, fullId); - } finally { - removeInvalidTile(x, y, z); - } - } - - @Override - public boolean setBlock(int x, int y, int z, int blockId, int meta) { - int Y = y >> 4; - try { - setChanged(); - return this.sections[Y].setBlock(x, y & 0x0f, z, blockId, meta); - } catch (ChunkException e) { - try { - this.setInternalSection(Y, (ChunkSection) this.providerClass.getMethod("createChunkSection", int.class).invoke(this.providerClass, Y)); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e1) { - Server.getInstance().getLogger().logException(e1); - } - return this.sections[Y].setBlock(x, y & 0x0f, z, blockId, meta); - } finally { - removeInvalidTile(x, y, z); - } - } - - @Override - public void setBlockId(int x, int y, int z, int id) { - int Y = y >> 4; - try { - this.sections[Y].setBlockId(x, y & 0x0f, z, id); - setChanged(); - } catch (ChunkException e) { - try { - this.setInternalSection(Y, (ChunkSection) this.providerClass.getMethod("createChunkSection", int.class).invoke(this.providerClass, Y)); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e1) { - Server.getInstance().getLogger().logException(e1); - } - this.sections[Y].setBlockId(x, y & 0x0f, z, id); - } finally { - removeInvalidTile(x, y, z); - } - } - - @Override - public int getBlockId(int x, int y, int z) { - return this.sections[y >> 4].getBlockId(x, y & 0x0f, z); - } - - @Override - public int getBlockData(int x, int y, int z) { - return this.sections[y >> 4].getBlockData(x, y & 0x0f, z); - } - - @Override - public void setBlockData(int x, int y, int z, int data) { - int Y = y >> 4; - try { - this.sections[Y].setBlockData(x, y & 0x0f, z, data); - setChanged(); - } catch (ChunkException e) { - try { - this.setInternalSection(Y, (ChunkSection) this.providerClass.getMethod("createChunkSection", int.class).invoke(this.providerClass, Y)); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e1) { - Server.getInstance().getLogger().logException(e1); - } - this.sections[Y].setBlockData(x, y & 0x0f, z, data); - } finally { - removeInvalidTile(x, y, z); - } - } - - @Override - public int getBlockSkyLight(int x, int y, int z) { - return this.sections[y >> 4].getBlockSkyLight(x, y & 0x0f, z); - } - - @Override - public void setBlockSkyLight(int x, int y, int z, int level) { - int Y = y >> 4; - try { - this.sections[Y].setBlockSkyLight(x, y & 0x0f, z, level); - setChanged(); - } catch (ChunkException e) { - try { - this.setInternalSection(Y, (ChunkSection) this.providerClass.getMethod("createChunkSection", int.class).invoke(this.providerClass, Y)); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e1) { - Server.getInstance().getLogger().logException(e1); - } - this.sections[Y].setBlockSkyLight(x, y & 0x0f, z, level); - } - } - - @Override - public int getBlockLight(int x, int y, int z) { - return this.sections[y >> 4].getBlockLight(x, y & 0x0f, z); - } - - @Override - public void setBlockLight(int x, int y, int z, int level) { - int Y = y >> 4; - try { - this.sections[Y].setBlockLight(x, y & 0x0f, z, level); - setChanged(); - } catch (ChunkException e) { - try { - this.setInternalSection(Y, (ChunkSection) this.providerClass.getMethod("createChunkSection", int.class).invoke(this.providerClass, Y)); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e1) { - Server.getInstance().getLogger().logException(e1); - } - this.sections[Y].setBlockLight(x, y & 0x0f, z, level); - } - } - - @Override - public boolean isSectionEmpty(float fY) { - return this.sections[(int) fY] instanceof EmptyChunkSection; - } - - @Override - public ChunkSection getSection(float fY) { - return this.sections[(int) fY]; - } - - @Override - public boolean setSection(float fY, ChunkSection section) { - if (Arrays.equals(emptyIdArray, section.getIdArray()) && Arrays.equals(emptyDataArray, section.getDataArray())) { - this.sections[(int) fY] = EmptyChunkSection.EMPTY[(int) fY]; - } else { - this.sections[(int) fY] = section; - } - setChanged(); - return true; - } - - private void setInternalSection(float fY, ChunkSection section) { - this.sections[(int) fY] = section; - setChanged(); - } - - @Override - public boolean load() throws IOException { - return this.load(true); - } - - @Override - public boolean load(boolean generate) throws IOException { - return this.provider != null && this.provider.getChunk(this.getX(), this.getZ(), true) != null; - } - - @Override - public byte[] getBlockIdArray() { - ByteBuffer buffer = ByteBuffer.allocate(65536); - for (int y = 0; y < SECTION_COUNT; y++) { - buffer.put(this.sections[y].getIdArray()); - } - return buffer.array(); - } - - @Override - public byte[] getBlockDataArray() { - ByteBuffer buffer = ByteBuffer.allocate(32768); - for (int y = 0; y < SECTION_COUNT; y++) { - buffer.put(this.sections[y].getDataArray()); - } - return buffer.array(); - } - - @Override - public byte[] getBlockSkyLightArray() { - ByteBuffer buffer = ByteBuffer.allocate(32768); - for (int y = 0; y < SECTION_COUNT; y++) { - buffer.put(this.sections[y].getSkyLightArray()); - } - return buffer.array(); - } - - @Override - public byte[] getBlockLightArray() { - ByteBuffer buffer = ByteBuffer.allocate(32768); - for (int y = 0; y < SECTION_COUNT; y++) { - buffer.put(this.sections[y].getLightArray()); - } - return buffer.array(); - } - - @Override - public ChunkSection[] getSections() { - return sections; - } - - @Override - public int[] getBiomeColorArray() { - return new int[0]; - } - - @Override - public byte[] getHeightMapArray() { - return this.heightMap; - } - - @Override - public LevelProvider getProvider() { - return this.provider; - } -} diff --git a/src/main/java/cn/nukkit/level/format/generic/BaseFullChunk.java b/src/main/java/cn/nukkit/level/format/generic/BaseFullChunk.java deleted file mode 100644 index a5007b193..000000000 --- a/src/main/java/cn/nukkit/level/format/generic/BaseFullChunk.java +++ /dev/null @@ -1,622 +0,0 @@ -package cn.nukkit.level.format.generic; - -import cn.nukkit.Player; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.format.LevelProvider; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.NumberTag; -import cn.nukkit.network.protocol.BatchPacket; -import co.aikar.timings.Timing; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BaseFullChunk implements FullChunk, ChunkManager { - - protected Map entities; - - protected Map tiles; - - protected Map tileList; - - /** - * encoded as: - * - * (x << 4) | z - */ - protected byte[] biomes; - - protected byte[] blocks; - - protected byte[] data; - - protected byte[] skyLight; - - protected byte[] blockLight; - - protected byte[] heightMap; - - protected List NBTtiles; - - protected List NBTentities; - - protected Map extraData; - - protected LevelProvider provider; - protected Class providerClass; - - private int x; - private int z; - private long hash; - - protected long changes; - - protected boolean isInit; - - protected Map chunkPackets; - - @Override - public BaseFullChunk clone() { - BaseFullChunk chunk; - try { - chunk = (BaseFullChunk) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - if (this.biomes != null) { - chunk.biomes = this.biomes.clone(); - } - - if (this.blocks != null) { - chunk.blocks = this.blocks.clone(); - } - - if (this.data != null) { - chunk.data = this.data.clone(); - } - - if (this.skyLight != null) { - chunk.skyLight = this.skyLight.clone(); - } - - if (this.blockLight != null) { - chunk.blockLight = this.blockLight.clone(); - } - - if (this.heightMap != null) { - chunk.heightMap = this.getHeightMapArray().clone(); - } - return chunk; - } - - public void setChunkPacket(int protocol, BatchPacket packet) { - if (packet != null) { - packet.trim(); - if (chunkPackets == null) { - chunkPackets = new Int2ObjectOpenHashMap<>(); - } - this.chunkPackets.put(protocol, packet); - } - } - - public BatchPacket getChunkPacket(int protocol) { - if (chunkPackets == null) { - return null; - } - BatchPacket pk = chunkPackets.get(protocol); - if (pk != null) { - pk.trim(); - } - return pk; - } - - public void initChunk() { - if (this.getProvider() != null && !this.isInit) { - boolean changed = false; - if (this.NBTentities != null) { - Timing timing = this.getProvider().getLevel().timings.syncChunkLoadEntitiesTimer; - if (timing != null) timing.startTiming(); - for (CompoundTag nbt : NBTentities) { - if (!nbt.contains("id")) { - this.setChanged(); - continue; - } - ListTag pos = nbt.getList("Pos"); - if ((((NumberTag) pos.get(0)).getData().intValue() >> 4) != this.x || ((((NumberTag) pos.get(2)).getData().intValue() >> 4) != this.z)) { - changed = true; - continue; - } - Entity entity = Entity.createEntity(nbt.getString("id"), this, nbt); - if (entity != null) { - changed = true; - } - } - if (timing != null) timing.stopTiming(); - this.NBTentities = null; - } - - if (this.NBTtiles != null) { - Timing timing = this.getProvider().getLevel().timings.syncChunkLoadBlockEntitiesTimer; - if (timing != null) timing.startTiming(); - for (CompoundTag nbt : NBTtiles) { - if (nbt != null) { - if (!nbt.contains("id")) { - changed = true; - continue; - } - if ((nbt.getInt("x") >> 4) != this.x || ((nbt.getInt("z") >> 4) != this.z)) { - changed = true; - continue; - } - BlockEntity blockEntity = BlockEntity.createBlockEntity(nbt.getString("id").replaceFirst("BlockEntity", ""), this, nbt); - if (blockEntity == null) { - changed = true; - } - } - } - if (timing != null) timing.stopTiming(); - this.NBTtiles = null; - } - - this.setChanged(changed); - - this.isInit = true; - } - } - - @Override - public final long getIndex() { - return hash; - } - - @Override - public final int getX() { - return x; - } - - @Override - public final int getZ() { - return z; - } - - @Override - public void setPosition(int x, int z) { - this.x = x; - this.z = z; - this.hash = Level.chunkHash(x, z); - } - - public final void setX(int x) { - this.x = x; - this.hash = Level.chunkHash(x, z); - } - - public final void setZ(int z) { - this.z = z; - this.hash = Level.chunkHash(x, z); - } - - @Override - public LevelProvider getProvider() { - return provider; - } - - @Override - public void setProvider(LevelProvider provider) { - this.provider = provider; - - if (provider != null) { - this.providerClass = provider.getClass(); - } - } - - @Override - public int getBiomeId(int x, int z) { - return this.biomes[(x << 4) | z] & 0xFF; - } - - @Override - public void setBiomeId(int x, int z, byte biomeId) { - this.biomes[(x << 4) | z] = biomeId; - } - - @Override - public void setBiomeId(int x, int z, int biomeId) { - this.biomes[(x << 4) | z] = (byte) biomeId; - } - - @Override - public int getBiomeColor(int x, int z) { - return 0; - } - - @Override - public void setBiomeIdAndColor(int x, int z, int idAndColor) { - } - - @Override - public void setBiomeColor(int x, int z, int r, int g, int b) { - } - - @Override - public int getHeightMap(int x, int z) { - return this.heightMap[(z << 4) | x] & 0xFF; - } - - @Override - public void setHeightMap(int x, int z, int value) { - this.heightMap[(z << 4) | x] = (byte) value; - } - - @Override - public void recalculateHeightMap() { - for (int z = 0; z < 16; ++z) { - for (int x = 0; x < 16; ++x) { - this.setHeightMap(x, z, this.getHighestBlockAt(x, z, false)); - } - } - } - - @Override - public int getBlockExtraData(int x, int y, int z) { - int index = Level.chunkBlockHash(x, y, z); - if (this.extraData != null && this.extraData.containsKey(index)) { - return this.extraData.get(index); - } - - return 0; - } - - @Override - public void setBlockExtraData(int x, int y, int z, int data) { - if (data == 0) { - if (this.extraData != null) { - this.extraData.remove(Level.chunkBlockHash(x, y, z)); - } - } else { - if (this.extraData == null) this.extraData = new Int2ObjectOpenHashMap<>(); - this.extraData.put(Level.chunkBlockHash(x, y, z), data); - } - - this.setChanged(true); - } - - @Override - public void populateSkyLight() { - /*for (int z = 0; z < 16; ++z) { - for (int x = 0; x < 16; ++x) { - int top = this.getHeightMap(x, z); - for (int y = 255; y > top; --y) { - this.setBlockSkyLight(x, y, z, 15); - } - for (int y = top; y >= 0; --y) { - if (Block.solid[this.getBlockId(x, y, z)]) { - break; - } - this.setBlockSkyLight(x, y, z, 15); - } - this.setHeightMap(x, z, this.getHighestBlockAt(x, z, false)); - } - }*/ - } - - @Override - public int getHighestBlockAt(int x, int z) { - return this.getHighestBlockAt(x, z, true); - } - - @Override - public int getHighestBlockAt(int x, int z, boolean cache) { - if (cache) { - int h = this.getHeightMap(x, z); - if (h != 0 && h != 255) { - return h; - } - } - for (int y = 255; y >= 0; --y) { - if (getBlockId(x, y, z) != 0x00) { - if (cache) { - this.setHeightMap(x, z, y); - } - return y; - } - } - return 0; - } - - @Override - public void addEntity(Entity entity) { - if (this.entities == null) { - this.entities = new Long2ObjectOpenHashMap<>(); - } - this.entities.put(entity.getId(), entity); - if (!(entity instanceof Player) && this.isInit) { - this.setChanged(); - } - } - - @Override - public void removeEntity(Entity entity) { - if (this.entities != null) { - this.entities.remove(entity.getId()); - if (!(entity instanceof Player) && this.isInit) { - this.setChanged(); - } - } - } - - @Override - public void addBlockEntity(BlockEntity blockEntity) { - if (this.tiles == null) { - this.tiles = new Long2ObjectOpenHashMap<>(); - this.tileList = new Int2ObjectOpenHashMap<>(); - } - this.tiles.put(blockEntity.getId(), blockEntity); - int index = ((blockEntity.getFloorZ() & 0x0f) << 12) | ((blockEntity.getFloorX() & 0x0f) << 8) | (blockEntity.getFloorY() & 0xff); - if (this.tileList.containsKey(index) && !this.tileList.get(index).equals(blockEntity)) { - BlockEntity entity = this.tileList.get(index); - this.tiles.remove(entity.getId()); - entity.close(); - } - this.tileList.put(index, blockEntity); - if (this.isInit) { - this.setChanged(); - } - } - - @Override - public void removeBlockEntity(BlockEntity blockEntity) { - if (this.tiles != null) { - this.tiles.remove(blockEntity.getId()); - this.tileList.remove(((blockEntity.getFloorZ() & 0x0f) << 12) | ((blockEntity.getFloorX() & 0x0f) << 8) | (blockEntity.getFloorY() & 0xff)); - if (this.isInit) { - this.setChanged(); - } - } - } - - @Override - public Map getEntities() { - return entities == null ? Collections.emptyMap() : entities; - } - - @Override - public Map getBlockEntities() { - return tiles == null ? Collections.emptyMap() : tiles; - } - - @Override - public Map getBlockExtraDataArray() { - return extraData == null ? Collections.emptyMap() : extraData; - } - - @Override - public BlockEntity getTile(int x, int y, int z) { - return this.tileList != null ? this.tileList.get((z << 12) | (x << 8) | y) : null; - } - - @Override - public boolean isLoaded() { - return this.getProvider() != null && this.getProvider().isChunkLoaded(this.x, this.z); - } - - @Override - public boolean load() throws IOException { - return this.load(true); - } - - @Override - public boolean load(boolean generate) throws IOException { - return this.getProvider() != null && this.getProvider().getChunk(this.x, this.z, true) != null; - } - - @Override - public boolean unload() throws Exception { - return this.unload(provider.getLevel().getAutoSave(), true); - } - - @Override - public boolean unload(boolean save) throws Exception { - return this.unload(save, true); - } - - @Override - public boolean unload(boolean save, boolean safe) { - LevelProvider provider = this.getProvider(); - if (provider == null) { - return true; - } - if (save && this.changes != 0) { - provider.saveChunk(this.x, this.z); - } - if (safe) { - for (Entity entity : this.getEntities().values()) { - if (entity instanceof Player) { - return false; - } - } - } - for (Entity entity : new ArrayList<>(this.getEntities().values())) { - if (entity instanceof Player) { - continue; - } - entity.close(); - } - - for (BlockEntity blockEntity : new ArrayList<>(this.getBlockEntities().values())) { - blockEntity.close(); - } - this.provider = null; - return true; - } - - @Override - public byte[] getBlockIdArray() { - return this.blocks; - } - - @Override - public byte[] getBlockDataArray() { - return this.data; - } - - @Override - public byte[] getBlockSkyLightArray() { - return this.skyLight; - } - - @Override - public byte[] getBlockLightArray() { - return this.blockLight; - } - - @Override - public byte[] getBiomeIdArray() { - return this.biomes; - } - - @Override - public int[] getBiomeColorArray() { - return new int[0]; - } - - @Override - public byte[] getHeightMapArray() { - return this.heightMap; - } - - public long getChanges() { - return changes; - } - - @Override - public boolean hasChanged() { - return this.changes != 0; - } - - @Override - public void setChanged() { - this.changes++; - chunkPackets = null; - } - - @Override - public void setChanged(boolean changed) { - if (changed) { - setChanged(); - } else { - changes = 0; - } - } - - @Override - public byte[] toFastBinary() { - return this.toBinary(); - } - - @Override - public boolean isLightPopulated() { - return true; - } - - @Override - public void setLightPopulated() { - this.setLightPopulated(true); - } - - @Override - public void setLightPopulated(boolean value) { - - } - - @Override - public int getBlockIdAt(int x, int y, int z) { - if (x >> 4 == this.x && z >> 4 == this.z) { - return getBlockId(x & 15, y, z & 15); - } - return 0; - } - - @Override - public void setBlockFullIdAt(int x, int y, int z, int fullId) { - if (x >> 4 == this.x && z >> 4 == this.z) { - setFullBlockId(x & 15, y, z & 15, fullId); - } - } - - @Override - public void setBlockIdAt(int x, int y, int z, int id) { - if (x >> 4 == this.x && z >> 4 == this.z) { - setBlockId(x & 15, y, z & 15, id); - } - } - - @Override - public void setBlockAt(int x, int y, int z, int id, int data) { - if (x >> 4 == this.x && z >> 4 == this.z) { - setBlock(x & 15, y, z & 15, id, data); - } - } - - @Override - public int getBlockDataAt(int x, int y, int z) { - if (x >> 4 == this.x && z >> 4 == this.z) { - return getBlockIdAt(x & 15, y, z & 15); - } - return 0; - } - - @Override - public void setBlockDataAt(int x, int y, int z, int data) { - if (x >> 4 == this.x && z >> 4 == this.z) { - setBlockData(x & 15, y, z & 15, data); - } - } - - @Override - public BaseFullChunk getChunk(int chunkX, int chunkZ) { - if (chunkX == x && chunkZ == z) return this; - return null; - } - - @Override - public void setChunk(int chunkX, int chunkZ) { - setChunk(chunkX, chunkZ, null); - } - - @Override - public void setChunk(int chunkX, int chunkZ, BaseFullChunk chunk) { - throw new UnsupportedOperationException(); - } - - @Override - public long getSeed() { - throw new UnsupportedOperationException("Chunk does not have a seed"); - } - - public boolean compress() { - if (chunkPackets == null) { - return false; - } - for (BatchPacket pk : chunkPackets.values()) { - if (pk != null) { - pk.trim(); - } - } - return !chunkPackets.isEmpty(); - } -} diff --git a/src/main/java/cn/nukkit/level/format/generic/BaseLevelProvider.java b/src/main/java/cn/nukkit/level/format/generic/BaseLevelProvider.java deleted file mode 100644 index 998f62028..000000000 --- a/src/main/java/cn/nukkit/level/format/generic/BaseLevelProvider.java +++ /dev/null @@ -1,456 +0,0 @@ -package cn.nukkit.level.format.generic; - -import cn.nukkit.Server; -import cn.nukkit.level.GameRules; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.format.LevelProvider; -import cn.nukkit.level.generator.Generator; -import cn.nukkit.math.Vector3; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.utils.ChunkException; -import cn.nukkit.utils.LevelException; -import com.google.common.collect.ImmutableMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectIterator; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.ByteOrder; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class BaseLevelProvider implements LevelProvider { - - protected Level level; - - protected final String path; - - protected CompoundTag levelData; - - private Vector3 spawn; - - protected final AtomicReference lastRegion = new AtomicReference<>(); - - protected final Long2ObjectMap regions = new Long2ObjectOpenHashMap<>(); - - protected final Long2ObjectMap chunks = new Long2ObjectOpenHashMap<>(); - - private final AtomicReference lastChunk = new AtomicReference<>(); - - public BaseLevelProvider(Level level, String path) throws IOException { - this.level = level; - this.path = path; - File file_path = new File(this.path); - if (!file_path.exists()) { - file_path.mkdirs(); - } - CompoundTag levelData = NBTIO.readCompressed(new FileInputStream(new File(this.path + "level.dat")), ByteOrder.BIG_ENDIAN); - if (levelData.get("Data") instanceof CompoundTag) { - this.levelData = levelData.getCompound("Data"); - } else { - throw new LevelException("Invalid level.dat"); - } - - if (!this.levelData.contains("generatorName")) { - this.levelData.putString("generatorName", Generator.getGenerator("DEFAULT").getSimpleName().toLowerCase()); - } - - if (!this.levelData.contains("generatorOptions")) { - this.levelData.putString("generatorOptions", ""); - } - - this.spawn = new Vector3(this.levelData.getInt("SpawnX"), this.levelData.getInt("SpawnY"), this.levelData.getInt("SpawnZ")); - } - - public abstract BaseFullChunk loadChunk(long index, int chunkX, int chunkZ, boolean create); - - public int size() { - synchronized (chunks) { - return this.chunks.size(); - } - } - - @Override - public void unloadChunks() { - ObjectIterator iter = chunks.values().iterator(); - while (iter.hasNext()) { - iter.next().unload(level.getAutoSave(), false); - iter.remove(); - } - } - - @Override - public String getGenerator() { - return this.levelData.getString("generatorName"); - } - - @Override - public Map getGeneratorOptions() { - return new HashMap() { - { - put("preset", levelData.getString("generatorOptions")); - } - }; - } - - @Override - public Map getLoadedChunks() { - synchronized (chunks) { - return ImmutableMap.copyOf(chunks); - } - } - - @Override - public boolean isChunkLoaded(int X, int Z) { - return isChunkLoaded(Level.chunkHash(X, Z)); - } - - public void putChunk(long index, BaseFullChunk chunk) { - synchronized (chunks) { - chunks.put(index, chunk); - } - } - - @Override - public boolean isChunkLoaded(long hash) { - synchronized (chunks) { - return this.chunks.containsKey(hash); - } - } - - public BaseRegionLoader getRegion(int x, int z) { - long index = Level.chunkHash(x, z); - synchronized (regions) { - return this.regions.get(index); - } - } - - protected static int getRegionIndexX(int chunkX) { - return chunkX >> 5; - } - - protected static int getRegionIndexZ(int chunkZ) { - return chunkZ >> 5; - } - - @Override - public String getPath() { - return path; - } - - public Server getServer() { - return this.level.getServer(); - } - - @Override - public Level getLevel() { - return level; - } - - @Override - public String getName() { - return this.levelData.getString("LevelName"); - } - - @Override - public boolean isRaining() { - return this.levelData.getBoolean("raining"); - } - - @Override - public void setRaining(boolean raining) { - this.levelData.putBoolean("raining", raining); - } - - @Override - public int getRainTime() { - return this.levelData.getInt("rainTime"); - } - - @Override - public void setRainTime(int rainTime) { - this.levelData.putInt("rainTime", rainTime); - } - - @Override - public boolean isThundering() { - return this.levelData.getBoolean("thundering"); - } - - @Override - public void setThundering(boolean thundering) { - this.levelData.putBoolean("thundering", thundering); - } - - @Override - public int getThunderTime() { - return this.levelData.getInt("thunderTime"); - } - - @Override - public void setThunderTime(int thunderTime) { - this.levelData.putInt("thunderTime", thunderTime); - } - - @Override - public long getCurrentTick() { - return this.levelData.getLong("Time"); - } - - @Override - public void setCurrentTick(long currentTick) { - this.levelData.putLong("Time", currentTick); - } - - @Override - public long getTime() { - return this.levelData.getLong("DayTime"); - } - - @Override - public void setTime(long value) { - this.levelData.putLong("DayTime", value); - } - - @Override - public long getSeed() { - return this.levelData.getLong("RandomSeed"); - } - - @Override - public void setSeed(long value) { - this.levelData.putLong("RandomSeed", value); - } - - @Override - public Vector3 getSpawn() { - return spawn; - } - - @Override - public void setSpawn(Vector3 pos) { - this.levelData.putInt("SpawnX", (int) pos.x); - this.levelData.putInt("SpawnY", (int) pos.y); - this.levelData.putInt("SpawnZ", (int) pos.z); - spawn = pos; - } - - @Override - public GameRules getGamerules() { - GameRules rules = GameRules.getDefault(); - - if (this.levelData.contains("GameRules")) - rules.readNBT(this.levelData.getCompound("GameRules")); - - return rules; - } - - @Override - public void setGameRules(GameRules rules) { - this.levelData.putCompound("GameRules", rules.writeNBT()); - } - - @Override - public void doGarbageCollection() { - int limit = (int) (System.currentTimeMillis() - 50); - synchronized (regions) { - if (regions.isEmpty()) { - return; - } - - ObjectIterator iter = regions.values().iterator(); - while (iter.hasNext()) { - BaseRegionLoader loader = iter.next(); - - if (loader.lastUsed <= limit) { - try { - loader.close(); - } catch (IOException e) { - throw new RuntimeException("Unable to close RegionLoader", e); - } - lastRegion.set(null); - iter.remove(); - } - } - } - } - - @Override - public void saveChunks() { - synchronized (chunks) { - for (BaseFullChunk chunk : this.chunks.values()) { - if (chunk.getChanges() != 0) { - chunk.setChanged(false); - this.saveChunk(chunk.getX(), chunk.getZ()); - } - } - } - } - - public CompoundTag getLevelData() { - return levelData; - } - - @Override - public void saveLevelData() { - String file = this.path + "level.dat"; - File old = new File(file); - if (old.exists()) { - try { - com.google.common.io.Files.copy(old, new File(file + ".bak")); - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - } - } - try { - NBTIO.writeGZIPCompressed(new CompoundTag().putCompound("Data", this.levelData), new FileOutputStream(file)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public void updateLevelName(String name) { - if (!this.getName().equals(name)) { - this.levelData.putString("LevelName", name); - } - } - - @Override - public boolean loadChunk(int chunkX, int chunkZ) { - return this.loadChunk(chunkX, chunkZ, false); - } - - @Override - public boolean loadChunk(int chunkX, int chunkZ, boolean create) { - long index = Level.chunkHash(chunkX, chunkZ); - synchronized (chunks) { - if (this.chunks.containsKey(index)) { - return true; - } - } - return loadChunk(index, chunkX, chunkZ, create) != null; - } - - @Override - public boolean unloadChunk(int X, int Z) { - return this.unloadChunk(X, Z, true); - } - - @Override - public boolean unloadChunk(int X, int Z, boolean safe) { - long index = Level.chunkHash(X, Z); - synchronized (chunks) { - BaseFullChunk chunk = this.chunks.get(index); - if (chunk != null && chunk.unload(false, safe)) { - lastChunk.set(null); - this.chunks.remove(index, chunk); - return true; - } - } - return false; - } - - @Override - public BaseFullChunk getChunk(int chunkX, int chunkZ) { - return this.getChunk(chunkX, chunkZ, false); - } - - @Override - public BaseFullChunk getLoadedChunk(int chunkX, int chunkZ) { - BaseFullChunk tmp = lastChunk.get(); - if (tmp != null && tmp.getX() == chunkX && tmp.getZ() == chunkZ) { - return tmp; - } - long index = Level.chunkHash(chunkX, chunkZ); - synchronized (chunks) { - lastChunk.set(tmp = chunks.get(index)); - } - return tmp; - } - - @Override - public BaseFullChunk getLoadedChunk(long hash) { - BaseFullChunk tmp = lastChunk.get(); - if (tmp != null && tmp.getIndex() == hash) { - return tmp; - } - synchronized (chunks) { - lastChunk.set(tmp = chunks.get(hash)); - } - return tmp; - } - - @Override - public BaseFullChunk getChunk(int chunkX, int chunkZ, boolean create) { - BaseFullChunk tmp = lastChunk.get(); - if (tmp != null && tmp.getX() == chunkX && tmp.getZ() == chunkZ) { - return tmp; - } - long index = Level.chunkHash(chunkX, chunkZ); - synchronized (chunks) { - lastChunk.set(tmp = chunks.get(index)); - } - if (tmp == null) { - tmp = this.loadChunk(index, chunkX, chunkZ, create); - lastChunk.set(tmp); - } - return tmp; - } - - @Override - public void setChunk(int chunkX, int chunkZ, FullChunk chunk) { - if (!(chunk instanceof BaseFullChunk)) { - throw new ChunkException("Invalid Chunk class"); - } - chunk.setProvider(this); - chunk.setPosition(chunkX, chunkZ); - long index = Level.chunkHash(chunkX, chunkZ); - synchronized (chunks) { - if (this.chunks.containsKey(index) && !this.chunks.get(index).equals(chunk)) { - this.unloadChunk(chunkX, chunkZ, false); - } - this.chunks.put(index, (BaseFullChunk) chunk); - } - } - - @Override - public boolean isChunkPopulated(int chunkX, int chunkZ) { - BaseFullChunk chunk = this.getChunk(chunkX, chunkZ); - return chunk != null && chunk.isPopulated(); - } - - @Override - public synchronized void close() { - this.unloadChunks(); - synchronized (regions) { - ObjectIterator iter = this.regions.values().iterator(); - - while (iter.hasNext()) { - try { - iter.next().close(); - } catch (IOException e) { - throw new RuntimeException("Unable to close RegionLoader", e); - } - lastRegion.set(null); - iter.remove(); - } - } - this.level = null; - } - - @Override - public boolean isChunkGenerated(int chunkX, int chunkZ) { - BaseRegionLoader region = this.getRegion(chunkX >> 5, chunkZ >> 5); - return region != null && region.chunkExists(chunkX - (region.getX() << 5), chunkZ - (region.getZ() << 5)) && this.getChunk(chunkX - (region.getX() << 5), chunkZ - (region.getZ() << 5), true).isGenerated(); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/format/generic/BaseRegionLoader.java b/src/main/java/cn/nukkit/level/format/generic/BaseRegionLoader.java deleted file mode 100644 index 4c7ec71f9..000000000 --- a/src/main/java/cn/nukkit/level/format/generic/BaseRegionLoader.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.nukkit.level.format.generic; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.format.LevelProvider; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.HashMap; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -abstract public class BaseRegionLoader { - - public static final byte COMPRESSION_GZIP = 1; - public static final byte COMPRESSION_ZLIB = 2; - public static final int MAX_SECTOR_LENGTH = 1048576; - public static final int COMPRESSION_LEVEL = 7; - - protected int x; - protected int z; - protected int lastSector; - protected LevelProvider levelProvider; - - private final RandomAccessFile randomAccessFile; - - // TODO: A simple array will perform better and use less memory - protected final Map locationTable = new HashMap<>(); - - public long lastUsed; - - public BaseRegionLoader(LevelProvider level, int regionX, int regionZ, String ext) { - try { - this.x = regionX; - this.z = regionZ; - this.levelProvider = level; - String filePath = this.levelProvider.getPath() + "region/r." + regionX + '.' + regionZ + '.' + ext; - File file = new File(filePath); - boolean exists = file.exists(); - if (!exists) { - file.createNewFile(); - } - // TODO: buffering is a temporary solution to chunk reading/writing being poorly optimized - // - need to fix the code where it reads single bytes at a time from disk - this.randomAccessFile = new RandomAccessFile(filePath, "rw"); - if (!exists) { - this.createBlank(); - } else { - this.loadLocationTable(); - } - - this.lastUsed = System.currentTimeMillis(); - } catch (IOException e) { - throw new RuntimeException("Unable to load r." + regionX + '.' + regionZ + '.' + ext, e); - } - } - - public RandomAccessFile getRandomAccessFile() { - return randomAccessFile; - } - - protected abstract boolean isChunkGenerated(int index); - - public abstract BaseFullChunk readChunk(int x, int z) throws IOException; - - protected abstract BaseFullChunk unserializeChunk(byte[] data); - - public abstract boolean chunkExists(int x, int z); - - protected abstract void saveChunk(int x, int z, byte[] chunkData) throws IOException; - - public abstract void removeChunk(int x, int z); - - public abstract void writeChunk(FullChunk chunk) throws Exception; - - public void close() throws IOException { - if (randomAccessFile != null) randomAccessFile.close(); - } - - protected abstract void loadLocationTable() throws IOException; - - public abstract int doSlowCleanUp() throws Exception; - - protected abstract void writeLocationIndex(int index) throws IOException; - - protected abstract void createBlank() throws IOException; - - public abstract int getX(); - - public abstract int getZ(); - - public Integer[] getLocationIndexes() { - return this.locationTable.keySet().toArray(new Integer[0]); - } -} diff --git a/src/main/java/cn/nukkit/level/format/generic/EmptyChunkSection.java b/src/main/java/cn/nukkit/level/format/generic/EmptyChunkSection.java deleted file mode 100644 index d0cb5671c..000000000 --- a/src/main/java/cn/nukkit/level/format/generic/EmptyChunkSection.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.nukkit.level.format.generic; - -import cn.nukkit.block.Block; -import cn.nukkit.level.format.ChunkSection; -import cn.nukkit.level.util.BitArrayVersion; -import cn.nukkit.level.util.PalettedBlockStorage; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.BinaryStream; -import cn.nukkit.utils.ChunkException; - -import java.util.Arrays; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EmptyChunkSection implements ChunkSection { - - public static final EmptyChunkSection[] EMPTY = new EmptyChunkSection[16]; - private static final PalettedBlockStorage EMPTY_STORAGE_PRE419 = new PalettedBlockStorage(BitArrayVersion.V1, 0); - private static final PalettedBlockStorage EMPTY_STORAGE = new PalettedBlockStorage(BitArrayVersion.V1, ProtocolInfo.v1_16_100); - - static { - for (int y = 0; y < EMPTY.length; y++) { - EMPTY[y] = new EmptyChunkSection(y); - } - } - public static byte[] EMPTY_LIGHT_ARR = new byte[2048]; - public static byte[] EMPTY_SKY_LIGHT_ARR = new byte[2048]; - static { - Arrays.fill(EMPTY_SKY_LIGHT_ARR, (byte) 255); - } - - private final int y; - - public EmptyChunkSection(int y) { - this.y = y; - } - - @Override - public int getY() { - return this.y; - } - - @Override - final public int getBlockId(int x, int y, int z) { - return 0; - } - - @Override - public int getFullBlock(int x, int y, int z) throws ChunkException { - return 0; - } - - @Override - public Block getAndSetBlock(int x, int y, int z, Block block) { - if (block.getId() != 0) throw new ChunkException("Tried to modify an empty Chunk"); - return Block.get(0); - } - - @Override - public boolean setBlock(int x, int y, int z, int blockId) throws ChunkException { - if (blockId != 0) throw new ChunkException("Tried to modify an empty Chunk"); - return false; - } - - @Override - public boolean setBlock(int x, int y, int z, int blockId, int meta) throws ChunkException { - if (blockId != 0) throw new ChunkException("Tried to modify an empty Chunk"); - return false; - } - - @Override - public byte[] getIdArray() { - return new byte[4096]; - } - - @Override - public byte[] getDataArray() { - return new byte[2048]; - } - - @Override - public byte[] getSkyLightArray() { - return EMPTY_SKY_LIGHT_ARR; - } - - @Override - public byte[] getLightArray() { - return EMPTY_LIGHT_ARR; - } - - @Override - final public void setBlockId(int x, int y, int z, int id) throws ChunkException { - if (id != 0) throw new ChunkException("Tried to modify an empty Chunk"); - } - - @Override - final public int getBlockData(int x, int y, int z) { - return 0; - } - - @Override - public void setBlockData(int x, int y, int z, int data) throws ChunkException { - if (data != 0) throw new ChunkException("Tried to modify an empty Chunk"); - } - - @Override - public boolean setFullBlockId(int x, int y, int z, int fullId) { - if (fullId != 0) throw new ChunkException("Tried to modify an empty Chunk"); - return false; - } - - @Override - public int getBlockLight(int x, int y, int z) { - return 0; - } - - @Override - public void setBlockLight(int x, int y, int z, int level) throws ChunkException { - if (level != 0) throw new ChunkException("Tried to modify an empty Chunk"); - } - - @Override - public int getBlockSkyLight(int x, int y, int z) { - return 15; - } - - @Override - public void setBlockSkyLight(int x, int y, int z, int level) throws ChunkException { - if (level != 15) throw new ChunkException("Tried to modify an empty Chunk"); - } - - @Override - public boolean isEmpty() { - return true; - } - - @Override - public byte[] getBytes() { - return new byte[6144]; - } - - @Override - public void writeTo(int protocol, BinaryStream stream) { - stream.putByte((byte) 8); - stream.putByte((byte) 2); - if (protocol >= ProtocolInfo.v1_16_100) { - EMPTY_STORAGE.writeTo(protocol, stream); - EMPTY_STORAGE.writeTo(protocol, stream); - } else { - EMPTY_STORAGE_PRE419.writeTo(protocol, stream); - EMPTY_STORAGE_PRE419.writeTo(protocol, stream); - } - } - - @Override - public EmptyChunkSection copy() { - return this; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/End.java b/src/main/java/cn/nukkit/level/generator/End.java deleted file mode 100644 index 82538d91f..000000000 --- a/src/main/java/cn/nukkit/level/generator/End.java +++ /dev/null @@ -1,160 +0,0 @@ -package cn.nukkit.level.generator; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.Level; -import cn.nukkit.level.biome.EnumBiome; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.level.generator.noise.Noise; -import cn.nukkit.level.generator.noise.Simplex; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by PetteriM1 - */ -public class End extends Generator { - - private ChunkManager level; - private NukkitRandom nukkitRandom; - //private final List populators = new ArrayList<>(); - //private List generationPopulators = new ArrayList<>(); - - private Simplex noiseBase; - - public End() { - this(new HashMap<>()); - } - - public End(Map options) { - } - - @Override - public int getId() { - return Generator.TYPE_THE_END; - } - - @Override - public int getDimension() { - return Level.DIMENSION_THE_END; - } - - @Override - public ChunkManager getChunkManager() { - return level; - } - - @Override - public Map getSettings() { - return new HashMap<>(); - } - - @Override - public String getName() { - return "the_end"; - } - - @Override - public void init(ChunkManager level, NukkitRandom random) { - this.level = level; - this.nukkitRandom = random; - this.noiseBase = new Simplex(this.nukkitRandom, 4, 0.25f, 0.015625f); - } - - @Override - public void generateChunk(int chunkX, int chunkZ) { - this.nukkitRandom.setSeed(0xa6fe78dc ^ (chunkX << 8) ^ chunkZ ^ this.level.getSeed()); - - BaseFullChunk chunk = level.getChunk(chunkX, chunkZ); - - double[][][] noise = getFastNoise3D(this.noiseBase, 16, 128, 16, 4, 8, 4, chunkX << 4, 0, chunkZ << 4); - - for (int x = 0; x < 16; ++x) { - for (int z = 0; z < 16; ++z) { - chunk.setBiomeId(x, z, EnumBiome.END.biome.getId()); - - for (int y = 12; y < 64; ++y) { - double noiseValue = 0 - noise[x][z][y]; - noiseValue -= 0.5; - - double distance = new Vector3(0, 64, 0).distance(new Vector3((chunkX << 4) + x, y / 1.3, (chunkZ << 4) + z)); - - if ((noiseValue < 0 && distance < 100) || (noiseValue < -0.2 && distance > 400)) { - chunk.setBlockId(x, y, z, Block.END_STONE); - } - } - } - } - - /*for (Populator populator : this.generationPopulators) { - populator.populate(this.level, chunkX, chunkZ, this.nukkitRandom, chunk); - }*/ - } - - @Override - public void populateChunk(int chunkX, int chunkZ) { - /*BaseFullChunk chunk = level.getChunk(chunkX, chunkZ); - this.nukkitRandom.setSeed(0xa6fe78dc ^ (chunkX << 8) ^ chunkZ ^ this.level.getSeed()); - for (Populator populator : this.populators) { - populator.populate(this.level, chunkX, chunkZ, this.nukkitRandom, chunk); - } - - Biome biome = EnumBiome.getBiome(EnumBiome.END.id); - biome.populateChunk(this.level, chunkX, chunkZ, this.nukkitRandom);*/ - } - - public Vector3 getSpawn() { - return new Vector3(0, 64, 0); - } - - private double[][][] getFastNoise3D(Noise noise, int xSize, int ySize, int zSize, int xSamplingRate, int ySamplingRate, int zSamplingRate, int x, int y, int z) { - double[][][] noiseArray = new double[xSize + 1][zSize + 1][ySize + 1]; - for (int xx = 0; xx <= xSize; xx += xSamplingRate) { - for (int zz = 0; zz <= zSize; zz += zSamplingRate) { - for (int yy = 0; yy <= ySize; yy += ySamplingRate) { - noiseArray[xx][zz][yy] = noise.noise3D(x + xx, y + yy, z + zz, true); - } - } - } - - for (int xx = 0; xx < xSize; ++xx) { - for (int zz = 0; zz < zSize; ++zz) { - for (int yy = 0; yy < ySize; ++yy) { - if (xx % xSamplingRate != 0 || zz % zSamplingRate != 0 || yy % ySamplingRate != 0) { - int nx = xx / xSamplingRate * xSamplingRate; - int ny = yy / ySamplingRate * ySamplingRate; - int nz = zz / zSamplingRate * zSamplingRate; - - int nnx = nx + xSamplingRate; - int nny = ny + ySamplingRate; - int nnz = nz + zSamplingRate; - - double dx1 = ((double) (nnx - xx) / (double) (nnx - nx)); - double dx2 = ((double) (xx - nx) / (double) (nnx - nx)); - double dy1 = ((double) (nny - yy) / (double) (nny - ny)); - double dy2 = ((double) (yy - ny) / (double) (nny - ny)); - - noiseArray[xx][zz][yy] = ((double) (nnz - zz) / (double) (nnz - nz)) * ( - dy1 * ( - dx1 * noiseArray[nx][nz][ny] + dx2 * noiseArray[nnx][nz][ny] - ) + dy2 * ( - dx1 * noiseArray[nx][nz][nny] + dx2 * noiseArray[nnx][nz][nny] - ) - ) + ((double) (zz - nz) / (double) (nnz - nz)) * ( - dy1 * ( - dx1 * noiseArray[nx][nnz][ny] + dx2 * noiseArray[nnx][nnz][ny] - ) + dy2 * ( - dx1 * noiseArray[nx][nnz][nny] + dx2 * noiseArray[nnx][nnz][nny] - ) - ); - } - } - } - } - - return noiseArray; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/Flat.java b/src/main/java/cn/nukkit/level/generator/Flat.java deleted file mode 100644 index 193a61820..000000000 --- a/src/main/java/cn/nukkit/level/generator/Flat.java +++ /dev/null @@ -1,191 +0,0 @@ -package cn.nukkit.level.generator; - -import cn.nukkit.Server; -import cn.nukkit.block.*; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.ore.OreType; -import cn.nukkit.level.generator.populator.impl.PopulatorOre; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Flat extends Generator { - - @Override - public int getId() { - return TYPE_FLAT; - } - - private ChunkManager level; - - private NukkitRandom random; - - private final List populators = new ArrayList<>(); - - private int[][] structure; - - private final Map options; - - private int floorLevel; - - private String preset; - - private boolean init = false; - - private int biome; - - @Override - public ChunkManager getChunkManager() { - return level; - } - - @Override - public Map getSettings() { - return this.options; - } - - @Override - public String getName() { - return "flat"; - } - - public Flat() { - this(new HashMap<>()); - } - - public Flat(Map options) { - this.preset = "2;7,2x3,2;1;"; - this.options = options; - - if (this.options.containsKey("decoration")) { - PopulatorOre ores = new PopulatorOre(STONE, new OreType[]{ - new OreType(Block.get(BlockID.COAL_ORE), 20, 17, 0, 128), - new OreType(Block.get(BlockID.IRON_ORE), 20, 9, 0, 64), - new OreType(Block.get(BlockID.REDSTONE_ORE), 8, 8, 0, 16), - new OreType(Block.get(BlockID.LAPIS_ORE), 1, 7, 0, 30), - new OreType(Block.get(BlockID.GOLD_ORE), 2, 9, 0, 32), - new OreType(Block.get(BlockID.DIAMOND_ORE), 1, 8, 0, 16), - new OreType(Block.get(BlockID.DIRT), 10, 33, 0, 128), - new OreType(Block.get(BlockID.GRAVEL), 8, 33, 0, 128) - }); - this.populators.add(ores); - } - } - - protected void parsePreset(String preset) { - try { - this.preset = preset; - String[] presetArray = preset.split(";"); - String blocks = presetArray.length > 1 ? presetArray[1] : ""; - this.biome = presetArray.length > 2 ? Integer.parseInt(presetArray[2]) : 1; - String options = presetArray.length > 3 ? presetArray[1] : ""; - this.structure = new int[256][]; - int y = 0; - for (String block : blocks.split(",")) { - int id, meta = 0, cnt = 1; - if (Pattern.matches("^[0-9]{1,3}x[0-9]$", block)) { - //AxB - String[] s = block.split("x"); - cnt = Integer.parseInt(s[0]); - id = Integer.parseInt(s[1]); - } else if (Pattern.matches("^[0-9]{1,3}:[0-9]{0,2}$", block)) { - //A:B - String[] s = block.split(":"); - id = Integer.parseInt(s[0]); - meta = Integer.parseInt(s[1]); - } else if (Pattern.matches("^[0-9]{1,3}$", block)) { - //A - id = Integer.parseInt(block); - } else { - continue; - } - int cY = y; - y += cnt; - if (y > 0xFF) { - y = 0xFF; - } - for (; cY < y; ++cY) { - this.structure[cY] = new int[]{id, meta}; - } - } - this.floorLevel = y; - for (; y <= 0xFF; ++y) { - this.structure[y] = new int[]{0, 0}; - } - for (String option : options.split(",")) { - if (Pattern.matches("^[0-9a-z_]+$", option)) { - this.options.put(option, true); - } else if (Pattern.matches("^[0-9a-z_]+\\([0-9a-z_ =]+\\)$", option)) { - String name = option.substring(0, option.indexOf('(')); - String extra = option.substring(option.indexOf('(') + 1, option.indexOf(')')); - Map map = new HashMap<>(); - for (String kv : extra.split(" ")) { - String[] data = kv.split("="); - map.put(data[0], Float.valueOf(data[1])); - } - this.options.put(name, map); - } - } - } catch (Exception e) { - Server.getInstance().getLogger().error("Error while parsing the preset", e); - throw new RuntimeException(e); - } - } - - @Override - public void init(ChunkManager level, NukkitRandom random) { - this.level = level; - this.random = random; - } - - @Override - public void generateChunk(int chunkX, int chunkZ) { - if (!this.init) { - init = true; - if (this.options.containsKey("preset") && !"".equals(this.options.get("preset"))) { - this.parsePreset((String) this.options.get("preset")); - } else { - this.parsePreset(this.preset); - } - } - this.generateChunk(level.getChunk(chunkX, chunkZ)); - } - - private void generateChunk(FullChunk chunk) { - chunk.setGenerated(); - - for (int Z = 0; Z < 16; ++Z) { - for (int X = 0; X < 16; ++X) { - chunk.setBiomeId(X, Z, biome); - - for (int y = 0; y < 256; ++y) { - chunk.setBlock(X, y, Z, this.structure[y][0], this.structure[y][1]); - } - } - } - } - - @Override - public void populateChunk(int chunkX, int chunkZ) { - this.random.setSeed(0xdeadbeef ^ (chunkX << 8) ^ chunkZ ^ this.level.getSeed()); - for (Populator populator : this.populators) { - populator.populate(this.level, chunkX, chunkZ, this.random, level.getChunk(chunkX, chunkZ)); - } - } - - @Override - public Vector3 getSpawn() { - return new Vector3(0.5, this.floorLevel, 0.5); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/Generator.java b/src/main/java/cn/nukkit/level/generator/Generator.java deleted file mode 100644 index ec386457a..000000000 --- a/src/main/java/cn/nukkit/level/generator/Generator.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.nukkit.level.generator; - -import cn.nukkit.block.BlockID; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.Level; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Generator implements BlockID { - - public static final int TYPE_OLD = 0; - public static final int TYPE_INFINITE = 1; - public static final int TYPE_FLAT = 2; - public static final int TYPE_NETHER = 3; - public static final int TYPE_THE_END = 4; - public static final int TYPE_VOID = 5; - - public abstract int getId(); - - public int getDimension() { - return Level.DIMENSION_OVERWORLD; - } - - private static final Map> nameList = new HashMap<>(); - - private static final Map> typeList = new HashMap<>(); - - public static boolean addGenerator(Class clazz, String name, int type) { - name = name.toLowerCase(); - if (clazz != null && !Generator.nameList.containsKey(name)) { - Generator.nameList.put(name, clazz); - if (!Generator.typeList.containsKey(type)) { - Generator.typeList.put(type, clazz); - } - return true; - } - return false; - } - - public static String[] getGeneratorList() { - String[] keys = new String[Generator.nameList.size()]; - return Generator.nameList.keySet().toArray(keys); - } - - public static Class getGenerator(String name) { - name = name.toLowerCase(); - if (Generator.nameList.containsKey(name)) { - return Generator.nameList.get(name); - } - return Normal.class; - } - - public static Class getGenerator(int type) { - if (Generator.typeList.containsKey(type)) { - return Generator.typeList.get(type); - } - return Normal.class; - } - - public static String getGeneratorName(Class c) { - for (Map.Entry> entry : Generator.nameList.entrySet()) { - if (entry.getValue() == c) { - return entry.getKey(); - } - } - return "unknown"; - } - - public static int getGeneratorType(Class c) { - for (Map.Entry> entry : Generator.typeList.entrySet()) { - if (entry.getValue() == c) { - return entry.getKey(); - } - } - return Generator.TYPE_INFINITE; - } - - public abstract void init(ChunkManager level, NukkitRandom random); - - public abstract void generateChunk(int chunkX, int chunkZ); - - public abstract void populateChunk(int chunkX, int chunkZ); - - public abstract Map getSettings(); - - public abstract String getName(); - - public abstract Vector3 getSpawn(); - - public abstract ChunkManager getChunkManager(); -} diff --git a/src/main/java/cn/nukkit/level/generator/Nether.java b/src/main/java/cn/nukkit/level/generator/Nether.java deleted file mode 100644 index 3faa8668c..000000000 --- a/src/main/java/cn/nukkit/level/generator/Nether.java +++ /dev/null @@ -1,162 +0,0 @@ -package cn.nukkit.level.generator; - -import cn.nukkit.block.*; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.Level; -import cn.nukkit.level.biome.Biome; -import cn.nukkit.level.biome.EnumBiome; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.level.generator.noise.nukkit.f.SimplexF; -import cn.nukkit.level.generator.object.ore.OreType; -import cn.nukkit.level.generator.populator.impl.PopulatorNetherWart; -import cn.nukkit.level.generator.populator.impl.PopulatorGlowStone; -import cn.nukkit.level.generator.populator.impl.PopulatorGroundFire; -import cn.nukkit.level.generator.populator.impl.PopulatorLava; -import cn.nukkit.level.generator.populator.impl.PopulatorOre; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; - -public class Nether extends Generator { - - private ChunkManager level; - private NukkitRandom nukkitRandom; - private static final int lavaHeight = 32; - private SimplexF[] noiseGen = new SimplexF[3]; - private final List populators = new ArrayList<>(); - //private List generationPopulators = new ArrayList<>(); - - private long localSeed1; - private long localSeed2; - - public Nether() { - this(new HashMap<>()); - } - - public Nether(Map options) { - } - - @Override - public int getId() { - return Generator.TYPE_NETHER; - } - - @Override - public int getDimension() { - return Level.DIMENSION_NETHER; - } - - @Override - public String getName() { - return "nether"; - } - - @Override - public Map getSettings() { - return new HashMap<>(); - } - - @Override - public ChunkManager getChunkManager() { - return level; - } - - @Override - public void init(ChunkManager level, NukkitRandom random) { - this.level = level; - this.nukkitRandom = random; - this.nukkitRandom.setSeed(this.level.getSeed()); - - for (int i = 0; i < noiseGen.length; i++) { - noiseGen[i] = new SimplexF(nukkitRandom, 4, 0.25f, 0.015625f); - } - - this.nukkitRandom.setSeed(this.level.getSeed()); - this.localSeed1 = ThreadLocalRandom.current().nextLong(); - this.localSeed2 = ThreadLocalRandom.current().nextLong(); - - PopulatorOre ores = new PopulatorOre(NETHERRACK, new OreType[]{ - new OreType(Block.get(BlockID.QUARTZ_ORE), 20, 16, 0, 120, NETHERRACK), - new OreType(Block.get(BlockID.SOUL_SAND), 5, 64, 0, 120, NETHERRACK), - new OreType(Block.get(BlockID.GRAVEL), 5, 64, 0, 120, NETHERRACK), - new OreType(Block.get(BlockID.MAGMA), 5, 12, 30, 33, NETHERRACK), - new OreType(Block.get(BlockID.LAVA), 1, 16, 0, lavaHeight, NETHERRACK), - }); - this.populators.add(ores); - - PopulatorGroundFire groundFire = new PopulatorGroundFire(); - groundFire.setRandomAmount(3); - this.populators.add(groundFire); - - PopulatorLava lava = new PopulatorLava(); - lava.setRandomAmount(2); - this.populators.add(lava); - - this.populators.add(new PopulatorGlowStone()); - - PopulatorNetherWart netherWart = new PopulatorNetherWart(); - netherWart.setBaseAmount(5); - netherWart.setRandomAmount(8); - this.populators.add(netherWart); - } - - @Override - public void generateChunk(int chunkX, int chunkZ) { - int baseX = chunkX << 4; - int baseZ = chunkZ << 4; - this.nukkitRandom.setSeed(chunkX * localSeed1 ^ chunkZ * localSeed2 ^ this.level.getSeed()); - - BaseFullChunk chunk = level.getChunk(chunkX, chunkZ); - - for (int x = 0; x < 16; ++x) { - for (int z = 0; z < 16; ++z) { - chunk.setBiomeId(x, z, EnumBiome.HELL.biome.getId()); - - chunk.setBlockId(x, 0, z, Block.BEDROCK); - for (int y = 115; y < 127; ++y) { - chunk.setBlockId(x, y, z, Block.NETHERRACK); - } - chunk.setBlockId(x, 127, z, Block.BEDROCK); - for (int y = 1; y < 127; ++y) { - if (getNoise(baseX | x, y, baseZ | z) > 0) { - chunk.setBlockId(x, y, z, Block.NETHERRACK); - } else if (y <= lavaHeight) { - chunk.setBlockId(x, y, z, Block.STILL_LAVA); - chunk.setBlockLight(x, y + 1, z, 15); - } - } - } - } - - /*for (Populator populator : this.generationPopulators) { - populator.populate(this.level, chunkX, chunkZ, this.nukkitRandom, chunk); - }*/ - } - - @Override - public void populateChunk(int chunkX, int chunkZ) { - BaseFullChunk chunk = level.getChunk(chunkX, chunkZ); - this.nukkitRandom.setSeed(0xdeadbeef ^ (chunkX << 8) ^ chunkZ ^ this.level.getSeed()); - for (Populator populator : this.populators) { - populator.populate(this.level, chunkX, chunkZ, this.nukkitRandom, chunk); - } - - Biome biome = EnumBiome.getBiome(EnumBiome.HELL.id); - biome.populateChunk(this.level, chunkX, chunkZ, this.nukkitRandom); - } - - public Vector3 getSpawn() { - return new Vector3(0.5, 64, 0.5); - } - - public float getNoise(int x, int y, int z) { - float val = 0f; - for (int i = 0; i < noiseGen.length; i++) { - val += noiseGen[i].noise3D(x >> i, y, z >> i, true); - } - return val; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/Normal.java b/src/main/java/cn/nukkit/level/generator/Normal.java deleted file mode 100644 index 1b98e72cf..000000000 --- a/src/main/java/cn/nukkit/level/generator/Normal.java +++ /dev/null @@ -1,317 +0,0 @@ -package cn.nukkit.level.generator; - -import cn.nukkit.block.*; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.biome.Biome; -import cn.nukkit.level.biome.BiomeSelector; -import cn.nukkit.level.biome.EnumBiome; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.level.generator.noise.vanilla.f.NoiseGeneratorOctavesF; -import cn.nukkit.level.generator.object.ore.OreType; -import cn.nukkit.level.generator.populator.impl.*; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; -import com.google.common.collect.ImmutableList; - -import java.util.*; - -/** - * Nukkit's terrain generator - * Originally adapted from the PocketMine-MP generator by NycuRO and CreeperFace - * Mostly rewritten by DaPorkchop_ - *

- * The generator classes, and others related to terrain generation are theirs and are intended for NUKKIT USAGE and should not be copied/translated to other server software - * such as BukkitPE, ClearSky, Genisys, PocketMine-MP, or others - */ -public class Normal extends Generator { - - private static final float[] biomeWeights = new float[25]; - - static { - for (int i = -2; i <= 2; ++i) { - for (int j = -2; j <= 2; ++j) { - biomeWeights[i + 2 + (j + 2) * 5] = (float) (10.0F / Math.sqrt((float) (i * i + j * j) + 0.2F)); - } - } - } - - private List populators = Collections.emptyList(); - private List generationPopulators = Collections.emptyList(); - public static final int seaHeight = 64; // should be 62 - public NoiseGeneratorOctavesF scaleNoise; - public NoiseGeneratorOctavesF depthNoise; - private ChunkManager level; - private NukkitRandom nukkitRandom; - private long localSeed1; - private long localSeed2; - private BiomeSelector selector; - private ThreadLocal depthRegion = ThreadLocal.withInitial(() -> null); - private ThreadLocal mainNoiseRegion = ThreadLocal.withInitial(() -> null); - private ThreadLocal minLimitRegion = ThreadLocal.withInitial(() -> null); - private ThreadLocal maxLimitRegion = ThreadLocal.withInitial(() -> null); - private ThreadLocal heightMap = ThreadLocal.withInitial(() -> new float[825]); - private NoiseGeneratorOctavesF minLimitPerlinNoise; - private NoiseGeneratorOctavesF maxLimitPerlinNoise; - private NoiseGeneratorOctavesF mainPerlinNoise; - - public Normal() { - this(Collections.emptyMap()); - } - - public Normal(Map options) { - } - - @Override - public int getId() { - return TYPE_INFINITE; - } - - @Override - public ChunkManager getChunkManager() { - return level; - } - - @Override - public String getName() { - return "normal"; - } - - @Override - public Map getSettings() { - return Collections.emptyMap(); - } - - public Biome pickBiome(int x, int z) { - return this.selector.pickBiome(x, z); - } - - @Override - public void init(ChunkManager level, NukkitRandom random) { - this.level = level; - this.nukkitRandom = random; - SplittableRandom random1 = new SplittableRandom(); - this.nukkitRandom.setSeed(this.level.getSeed()); - this.localSeed1 = random1.nextLong(); - this.localSeed2 = random1.nextLong(); - this.nukkitRandom.setSeed(this.level.getSeed()); - this.selector = new BiomeSelector(this.nukkitRandom); - - this.minLimitPerlinNoise = new NoiseGeneratorOctavesF(random, 16); - this.maxLimitPerlinNoise = new NoiseGeneratorOctavesF(random, 16); - this.mainPerlinNoise = new NoiseGeneratorOctavesF(random, 8); - this.scaleNoise = new NoiseGeneratorOctavesF(random, 10); - this.depthNoise = new NoiseGeneratorOctavesF(random, 16); - - //this should run before all other populators so that we don't do things like generate ground cover on bedrock or something - this.generationPopulators = ImmutableList.of( - new PopulatorBedrock(), - new PopulatorGroundCover() - ); - - this.populators = ImmutableList.of( - new PopulatorOre(STONE, new OreType[]{ - new OreType(Block.get(BlockID.COAL_ORE), 20, 17, 0, 128), - new OreType(Block.get(BlockID.IRON_ORE), 20, 9, 0, 64), - new OreType(Block.get(BlockID.REDSTONE_ORE), 8, 8, 0, 16), - new OreType(Block.get(BlockID.LAPIS_ORE), 1, 7, 0, 30), - new OreType(Block.get(BlockID.GOLD_ORE), 2, 9, 0, 32), - new OreType(Block.get(BlockID.DIAMOND_ORE), 1, 8, 0, 16), - new OreType(Block.get(BlockID.DIRT), 10, 33, 0, 128), - new OreType(Block.get(BlockID.GRAVEL), 8, 33, 0, 128), - new OreType(Block.get(BlockID.STONE, BlockStone.GRANITE), 10, 33, 0, 80), - new OreType(Block.get(BlockID.STONE, BlockStone.DIORITE), 10, 33, 0, 80), - new OreType(Block.get(BlockID.STONE, BlockStone.ANDESITE), 10, 33, 0, 80) - }), - new PopulatorCaves(), - new PopulatorDungeon() - ); - } - - @Override - public void generateChunk(final int chunkX, final int chunkZ) { - int baseX = chunkX << 4; - int baseZ = chunkZ << 4; - this.nukkitRandom.setSeed(chunkX * localSeed1 ^ chunkZ * localSeed2 ^ this.level.getSeed()); - - BaseFullChunk chunk = level.getChunk(chunkX, chunkZ); - - //generate base noise values - float[] depthRegion = this.depthNoise.generateNoiseOctaves(this.depthRegion.get(), chunkX << 2, chunkZ << 2, 5, 5, 200f, 200f, 0.5f); - this.depthRegion.set(depthRegion); - float[] mainNoiseRegion = this.mainPerlinNoise.generateNoiseOctaves(this.mainNoiseRegion.get(), chunkX << 2, 0, chunkZ << 2, 5, 33, 5, 11.406866f, 4.277575f, 11.406866f); - this.mainNoiseRegion.set(mainNoiseRegion); - float[] minLimitRegion = this.minLimitPerlinNoise.generateNoiseOctaves(this.minLimitRegion.get(), chunkX << 2, 0, chunkZ << 2, 5, 33, 5, 684.412f, 684.412f, 684.412f); - this.minLimitRegion.set(minLimitRegion); - float[] maxLimitRegion = this.maxLimitPerlinNoise.generateNoiseOctaves(this.maxLimitRegion.get(), chunkX << 2, 0, chunkZ << 2, 5, 33, 5, 684.412f, 684.412f, 684.412f); - this.maxLimitRegion.set(maxLimitRegion); - float[] heightMap = this.heightMap.get(); - - //generate heightmap and smooth biome heights - int horizCounter = 0; - int vertCounter = 0; - for (int xSeg = 0; xSeg < 5; ++xSeg) { - for (int zSeg = 0; zSeg < 5; ++zSeg) { - float heightVariationSum = 0.0F; - float baseHeightSum = 0.0F; - float biomeWeightSum = 0.0F; - Biome biome = pickBiome(baseX + (xSeg << 2), baseZ + (zSeg << 2)); - - for (int xSmooth = -2; xSmooth <= 2; ++xSmooth) { - for (int zSmooth = -2; zSmooth <= 2; ++zSmooth) { - Biome biome1 = pickBiome(baseX + (xSeg << 2) + xSmooth, baseZ + (zSeg << 2) + zSmooth); - float baseHeight = biome1.getBaseHeight(); - float heightVariation = biome1.getHeightVariation(); - - float scaledWeight = biomeWeights[xSmooth + 2 + (zSmooth + 2) * 5] / (baseHeight + 2.0F); - - if (biome1.getBaseHeight() > biome.getBaseHeight()) { - scaledWeight /= 2.0F; - } - - heightVariationSum += heightVariation * scaledWeight; - baseHeightSum += baseHeight * scaledWeight; - biomeWeightSum += scaledWeight; - } - } - - heightVariationSum = heightVariationSum / biomeWeightSum; - baseHeightSum = baseHeightSum / biomeWeightSum; - heightVariationSum = heightVariationSum * 0.9F + 0.1F; - baseHeightSum = (baseHeightSum * 4.0F - 1.0F) / 8.0F; - float depthNoise = depthRegion[vertCounter] / 8000.0f; - - if (depthNoise < 0.0f) { - depthNoise = -depthNoise * 0.3f; - } - - depthNoise = depthNoise * 3.0f - 2.0f; - - if (depthNoise < 0.0f) { - depthNoise = depthNoise / 2.0f; - - if (depthNoise < -1.0f) { - depthNoise = -1.0f; - } - - depthNoise = depthNoise / 1.4f; - depthNoise = depthNoise / 2.0f; - } else { - if (depthNoise > 1.0f) { - depthNoise = 1.0f; - } - - depthNoise = depthNoise / 8.0f; - } - - ++vertCounter; - float baseHeightClone = baseHeightSum; - float heightVariationClone = heightVariationSum; - baseHeightClone = baseHeightClone + depthNoise * 0.2f; - baseHeightClone = baseHeightClone * 8.5f / 8.0f; - float baseHeightFactor = 8.5f + baseHeightClone * 4.0f; - - for (int ySeg = 0; ySeg < 33; ++ySeg) { - float baseScale = ((float) ySeg - baseHeightFactor) * 12f * 128.0f / 256.0f / heightVariationClone; - - if (baseScale < 0.0f) { - baseScale *= 4.0f; - } - - float minScaled = minLimitRegion[horizCounter] / 512f; - float maxScaled = maxLimitRegion[horizCounter] / 512f; - float noiseScaled = (mainNoiseRegion[horizCounter] / 10.0f + 1.0f) / 2.0f; - float clamp = MathHelper.denormalizeClamp(minScaled, maxScaled, noiseScaled) - baseScale; - - if (ySeg > 29) { - float yScaled = ((float) (ySeg - 29) / 3.0F); - clamp = clamp * (1.0f - yScaled) + -10.0f * yScaled; - } - - heightMap[horizCounter] = clamp; - ++horizCounter; - } - } - } - - //place blocks - for (int xSeg = 0; xSeg < 4; ++xSeg) { - int xScale = xSeg * 5; - int xScaleEnd = (xSeg + 1) * 5; - - for (int zSeg = 0; zSeg < 4; ++zSeg) { - int zScale1 = (xScale + zSeg) * 33; - int zScaleEnd1 = (xScale + zSeg + 1) * 33; - int zScale2 = (xScaleEnd + zSeg) * 33; - int zScaleEnd2 = (xScaleEnd + zSeg + 1) * 33; - - for (int ySeg = 0; ySeg < 32; ++ySeg) { - double height1 = heightMap[zScale1 + ySeg]; - double height2 = heightMap[zScaleEnd1 + ySeg]; - double height3 = heightMap[zScale2 + ySeg]; - double height4 = heightMap[zScaleEnd2 + ySeg]; - double height5 = (heightMap[zScale1 + ySeg + 1] - height1) * 0.125f; - double height6 = (heightMap[zScaleEnd1 + ySeg + 1] - height2) * 0.125f; - double height7 = (heightMap[zScale2 + ySeg + 1] - height3) * 0.125f; - double height8 = (heightMap[zScaleEnd2 + ySeg + 1] - height4) * 0.125f; - - for (int yIn = 0; yIn < 8; ++yIn) { - double baseIncr = height1; - double baseIncr2 = height2; - double scaleY = (height3 - height1) * 0.25f; - double scaleY2 = (height4 - height2) * 0.25f; - - for (int zIn = 0; zIn < 4; ++zIn) { - double scaleZ = (baseIncr2 - baseIncr) * 0.25f; - double scaleZ2 = baseIncr - scaleZ; - - for (int xIn = 0; xIn < 4; ++xIn) { - if ((scaleZ2 += scaleZ) > 0.0f) { - chunk.setBlockId((xSeg << 2) + zIn, (ySeg << 3) + yIn, (zSeg << 2) + xIn, STONE); - } else if ((ySeg << 3) + yIn <= seaHeight) { - chunk.setBlockId((xSeg << 2) + zIn, (ySeg << 3) + yIn, (zSeg << 2) + xIn, STILL_WATER); - } - } - - baseIncr += scaleY; - baseIncr2 += scaleY2; - } - - height1 += height5; - height2 += height6; - height3 += height7; - height4 += height8; - } - } - } - } - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - chunk.setBiome(x, z, selector.pickBiome(baseX | x, baseZ | z)); - } - } - - //populate chunk - for (Populator populator : this.generationPopulators) { - populator.populate(this.level, chunkX, chunkZ, this.nukkitRandom, chunk); - } - } - - @Override - public void populateChunk(int chunkX, int chunkZ) { - this.nukkitRandom.setSeed(0xdeadbeef ^ (chunkX << 8) ^ chunkZ ^ this.level.getSeed()); - for (Populator populator : this.populators) { - populator.populate(this.level, chunkX, chunkZ, this.nukkitRandom, level.getChunk(chunkX, chunkZ)); - } - - Biome biome = EnumBiome.getBiome(level.getChunk(chunkX, chunkZ).getBiomeId(7, 7)); - biome.populateChunk(this.level, chunkX, chunkZ, this.nukkitRandom); - } - - @Override - public Vector3 getSpawn() { - return new Vector3(0.5, 256, 0.5); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/PopChunkManager.java b/src/main/java/cn/nukkit/level/generator/PopChunkManager.java deleted file mode 100644 index 68ae642ad..000000000 --- a/src/main/java/cn/nukkit/level/generator/PopChunkManager.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.nukkit.level.generator; - -import cn.nukkit.level.format.generic.BaseFullChunk; -import java.util.Arrays; - -public class PopChunkManager extends SimpleChunkManager { - - private boolean clean = true; - private final BaseFullChunk[] chunks = new BaseFullChunk[9]; - private int CX = Integer.MAX_VALUE; - private int CZ = Integer.MAX_VALUE; - - public PopChunkManager(long seed) { - super(seed); - } - - @Override - public void cleanChunks(long seed) { - super.cleanChunks(seed); - if (!clean) { - Arrays.fill(chunks, null); - CX = Integer.MAX_VALUE; - CZ = Integer.MAX_VALUE; - clean = true; - } - } - - @Override - public BaseFullChunk getChunk(int chunkX, int chunkZ) { - int index; - switch (chunkX - CX) { - case 0: - index = 0; - break; - case 1: - index = 1; - break; - case 2: - index = 2; - break; - default: - return null; - } - switch (chunkZ - CZ) { - case 0: - break; - case 1: - index += 3; - break; - case 2: - index += 6; - break; - default: - return null; - } - return chunks[index]; - } - - @Override - public void setChunk(int chunkX, int chunkZ, BaseFullChunk chunk) { - if (CX == Integer.MAX_VALUE) { - CX = chunkX; - CZ = chunkZ; - } - int index; - switch (chunkX - CX) { - case 0: - index = 0; - break; - case 1: - index = 1; - break; - case 2: - index = 2; - break; - default: - throw new UnsupportedOperationException("Chunk is outside population area"); - } - switch (chunkZ - CZ) { - case 0: - break; - case 1: - index += 3; - break; - case 2: - index += 6; - break; - default: - throw new UnsupportedOperationException("Chunk is outside population area"); - } - clean = false; - chunks[index] = chunk; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/SimpleChunkManager.java b/src/main/java/cn/nukkit/level/generator/SimpleChunkManager.java deleted file mode 100644 index 819f2eaca..000000000 --- a/src/main/java/cn/nukkit/level/generator/SimpleChunkManager.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.nukkit.level.generator; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class SimpleChunkManager implements ChunkManager { - - protected long seed; - - public SimpleChunkManager(long seed) { - this.seed = seed; - } - - @Override - public int getBlockIdAt(int x, int y, int z) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - return chunk.getBlockId(x & 0xf, y & 0xff, z & 0xf); - } - return 0; - } - - @Override - public void setBlockIdAt(int x, int y, int z, int id) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - chunk.setBlockId(x & 0xf, y & 0xff, z & 0xf, id); - } - } - - @Override - public void setBlockAt(int x, int y, int z, int id, int data) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - chunk.setBlock(x & 0xf, y & 0xff, z & 0xf, id, data); - } - } - - - @Override - public void setBlockFullIdAt(int x, int y, int z, int fullId) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - chunk.setFullBlockId(x & 0xf, y & 0xff, z & 0xf, fullId); - } - } - - @Override - public int getBlockDataAt(int x, int y, int z) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - return chunk.getBlockData(x & 0xf, y & 0xff, z & 0xf); - } - return 0; - } - - @Override - public void setBlockDataAt(int x, int y, int z, int data) { - FullChunk chunk = this.getChunk(x >> 4, z >> 4); - if (chunk != null) { - chunk.setBlockData(x & 0xf, y & 0xff, z & 0xf, data); - } - } - - @Override - public void setChunk(int chunkX, int chunkZ) { - this.setChunk(chunkX, chunkZ, null); - } - - @Override - public long getSeed() { - return seed; - } - - public void setSeed(long seed) { - this.seed = seed; - } - - public void cleanChunks(long seed) { - this.seed = seed; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/Void.java b/src/main/java/cn/nukkit/level/generator/Void.java deleted file mode 100644 index 24c2af2b2..000000000 --- a/src/main/java/cn/nukkit/level/generator/Void.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.level.generator; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -import java.util.HashMap; -import java.util.Map; - -public class Void extends Generator { - - private ChunkManager level; - - public Void() { - this(new HashMap<>()); - } - - public Void(Map options) { - } - - @Override - public int getId() { - return TYPE_VOID; - } - - @Override - public ChunkManager getChunkManager() { - return level; - } - - @Override - public void init(ChunkManager level, NukkitRandom random) { - this.level = level; - } - - @Override - public void generateChunk(int chX, int chZ) { - } - - @Override - public void populateChunk(int i, int i1) { - } - - @Override - public Map getSettings() { - return null; - } - - @Override - public String getName() { - return "void"; - } - - @Override - public Vector3 getSpawn() { - return new Vector3(0.5, 64, 0.5); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/Noise.java b/src/main/java/cn/nukkit/level/generator/noise/Noise.java deleted file mode 100644 index 88ee18a49..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/Noise.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.level.generator.noise; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Noise { - protected int[] perm; - protected double offsetX = 0; - protected double offsetY = 0; - protected double offsetZ = 0; - protected double octaves = 8; - protected double persistence; - protected double expansion; - - public static int floor(double x) { - return x >= 0 ? (int) x : (int) (x - 1); - } - - public static double fade(double x) { - return x * x * x * (x * (x * 6 - 15) + 10); - } - - public static double lerp(double x, double y, double z) { - return y + x * (z - y); - } - - public static double linearLerp(double x, double x1, double x2, double q0, double q1) { - return ((x2 - x) / (x2 - x1)) * q0 + ((x - x1) / (x2 - x1)) * q1; - } - - public static double bilinearLerp(double x, double y, double q00, double q01, double q10, double q11, double x1, double x2, double y1, double y2) { - double dx1 = ((x2 - x) / (x2 - x1)); - double dx2 = ((x - x1) / (x2 - x1)); - - return ((y2 - y) / (y2 - y1)) * ( - dx1 * q00 + dx2 * q10 - ) + ((y - y1) / (y2 - y1)) * ( - dx1 * q01 + dx2 * q11 - ); - } - - public static double trilinearLerp(double x, double y, double z, double q000, double q001, double q010, double q011, double q100, double q101, double q110, double q111, double x1, double x2, double y1, double y2, double z1, double z2) { - double dx1 = ((x2 - x) / (x2 - x1)); - double dx2 = ((x - x1) / (x2 - x1)); - double dy1 = ((y2 - y) / (y2 - y1)); - double dy2 = ((y - y1) / (y2 - y1)); - - return ((z2 - z) / (z2 - z1)) * ( - dy1 * ( - dx1 * q000 + dx2 * q100 - ) + dy2 * ( - dx1 * q001 + dx2 * q101 - ) - ) + ((z - z1) / (z2 - z1)) * ( - dy1 * ( - dx1 * q010 + dx2 * q110 - ) + dy2 * ( - dx1 * q011 + dx2 * q111 - ) - ); - } - - public static double grad(int hash, double x, double y, double z) { - hash &= 15; - double u = hash < 8 ? x : y; - double v = hash < 4 ? y : ((hash == 12 || hash == 14) ? x : - z); - - return ((hash & 1) == 0 ? u : -u) + ((hash & 2) == 0 ? v : -v); - } - - abstract public double getNoise2D(double x, double z); - - abstract public double getNoise3D(double x, double y, double z); - - public double noise2D(double x, double z) { - return noise2D(x, z, false); - } - - public double noise2D(double x, double z, boolean normalized) { - double result = 0; - double amp = 1; - double freq = 1; - double max = 0; - - x *= this.expansion; - z *= this.expansion; - - for (int i = 0; i < this.octaves; ++i) { - result += this.getNoise2D(x * freq, z * freq) * amp; - max += amp; - freq *= 2; - amp *= this.persistence; - } - - if (normalized) { - result /= max; - } - - return result; - } - - public double noise3D(double x, double y, double z) { - return noise3D(x, y, z, false); - } - - public double noise3D(double x, double y, double z, boolean normalized) { - double result = 0; - double amp = 1; - double freq = 1; - double max = 0; - - x *= this.expansion; - y *= this.expansion; - z *= this.expansion; - - for (int i = 0; i < this.octaves; ++i) { - result += this.getNoise3D(x * freq, y * freq, z * freq) * amp; - max += amp; - freq *= 2; - amp *= this.persistence; - } - - if (normalized) { - result /= max; - } - - return result; - } - - public void setOffset(double x, double y, double z) { - this.offsetX = x; - this.offsetY = y; - this.offsetZ = z; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/Perlin.java b/src/main/java/cn/nukkit/level/generator/noise/Perlin.java deleted file mode 100644 index dbf8ad919..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/Perlin.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.nukkit.level.generator.noise; - -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Perlin extends Noise { - public static final int[][] grad3 = { - {1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, - {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, - {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1} - }; - - public Perlin(NukkitRandom random, double octaves, double persistence) { - this(random, octaves, persistence, 1); - } - - public Perlin(NukkitRandom random, double octaves, double persistence, double expansion) { - this.octaves = octaves; - this.persistence = persistence; - this.expansion = expansion; - this.offsetX = random.nextFloat() * 256; - this.offsetY = random.nextFloat() * 256; - this.offsetZ = random.nextFloat() * 256; - this.perm = new int[512]; - for (int i = 0; i < 256; ++i) { - this.perm[i] = random.nextBoundedInt(256); - } - for (int i = 0; i < 256; ++i) { - int pos = random.nextBoundedInt(256 - i) + i; - int old = this.perm[i]; - this.perm[i] = this.perm[pos]; - this.perm[pos] = old; - this.perm[i + 256] = this.perm[i]; - } - } - - @Override - public double getNoise2D(double x, double y) { - return this.getNoise3D(x, y, 0); - } - - @Override - public double getNoise3D(double x, double y, double z) { - x += this.offsetX; - y += this.offsetY; - z += this.offsetZ; - - int floorX = (int) x; - int floorY = (int) y; - int floorZ = (int) z; - - int X = floorX & 0xFF; - int Y = floorY & 0xFF; - int Z = floorZ & 0xFF; - - x -= floorX; - y -= floorY; - z -= floorZ; - - //Fade curves - //fX = fade(x); - //fY = fade(y); - //fZ = fade(z); - double fX = x * x * x * (x * (x * 6 - 15) + 10); - double fY = y * y * y * (y * (y * 6 - 15) + 10); - double fZ = z * z * z * (z * (z * 6 - 15) + 10); - - //Cube corners - int A = this.perm[X] + Y; - int B = this.perm[X + 1] + Y; - - int AA = this.perm[A] + Z; - int AB = this.perm[A + 1] + Z; - int BA = this.perm[B] + Z; - int BB = this.perm[B + 1] + Z; - - double AA1 = grad(this.perm[AA], x, y, z); - double BA1 = grad(this.perm[BA], x - 1, y, z); - double AB1 = grad(this.perm[AB], x, y - 1, z); - double BB1 = grad(this.perm[BB], x - 1, y - 1, z); - double AA2 = grad(this.perm[AA + 1], x, y, z - 1); - double BA2 = grad(this.perm[BA + 1], x - 1, y, z - 1); - double AB2 = grad(this.perm[AB + 1], x, y - 1, z - 1); - double BB2 = grad(this.perm[BB + 1], x - 1, y - 1, z - 1); - - double xLerp11 = AA1 + fX * (BA1 - AA1); - - double zLerp1 = xLerp11 + fY * (AB1 + fX * (BB1 - AB1) - xLerp11); - - double xLerp21 = AA2 + fX * (BA2 - AA2); - - return zLerp1 + fZ * (xLerp21 + fY * (AB2 + fX * (BB2 - AB2) - xLerp21) - zLerp1); - - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/Simplex.java b/src/main/java/cn/nukkit/level/generator/noise/Simplex.java deleted file mode 100644 index b2b8c7367..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/Simplex.java +++ /dev/null @@ -1,285 +0,0 @@ -package cn.nukkit.level.generator.noise; - -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Simplex extends Perlin { - protected static double SQRT_3; - protected static double SQRT_5; - protected static double F2; - protected static double G2; - protected static double G22; - protected static double F3; - protected static double G3; - protected static double F4; - protected static double G4; - protected static double G42; - protected static double G43; - protected static double G44; - protected static final int[][] grad4 = {{0, 1, 1, 1}, {0, 1, 1, -1}, {0, 1, -1, 1}, {0, 1, -1, -1}, - {0, -1, 1, 1}, {0, -1, 1, -1}, {0, -1, -1, 1}, {0, -1, -1, -1}, - {1, 0, 1, 1}, {1, 0, 1, -1}, {1, 0, -1, 1}, {1, 0, -1, -1}, - {-1, 0, 1, 1}, {-1, 0, 1, -1}, {-1, 0, -1, 1}, {-1, 0, -1, -1}, - {1, 1, 0, 1}, {1, 1, 0, -1}, {1, -1, 0, 1}, {1, -1, 0, -1}, - {-1, 1, 0, 1}, {-1, 1, 0, -1}, {-1, -1, 0, 1}, {-1, -1, 0, -1}, - {1, 1, 1, 0}, {1, 1, -1, 0}, {1, -1, 1, 0}, {1, -1, -1, 0}, - {-1, 1, 1, 0}, {-1, 1, -1, 0}, {-1, -1, 1, 0}, {-1, -1, -1, 0}}; - protected static final int[][] simplex = { - {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 0, 0, 0}, {0, 2, 3, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 2, 3, 0}, - {0, 2, 1, 3}, {0, 0, 0, 0}, {0, 3, 1, 2}, {0, 3, 2, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 3, 2, 0}, - {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, - {1, 2, 0, 3}, {0, 0, 0, 0}, {1, 3, 0, 2}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {2, 3, 0, 1}, {2, 3, 1, 0}, - {1, 0, 2, 3}, {1, 0, 3, 2}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {2, 0, 3, 1}, {0, 0, 0, 0}, {2, 1, 3, 0}, - {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, - {2, 0, 1, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {3, 0, 1, 2}, {3, 0, 2, 1}, {0, 0, 0, 0}, {3, 1, 2, 0}, - {2, 1, 0, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {3, 1, 0, 2}, {0, 0, 0, 0}, {3, 2, 0, 1}, {3, 2, 1, 0}}; - protected final double offsetW; - - public Simplex(NukkitRandom random, double octaves, double persistence) { - super(random, octaves, persistence); - this.offsetW = random.nextDouble() * 256; - SQRT_3 = Math.sqrt(3); - SQRT_5 = Math.sqrt(5); - F2 = 0.5 * (SQRT_3 - 1); - G2 = (3 - SQRT_3) / 6; - G22 = G2 * 2.0 - 1; - F3 = 0.3333333333333333; - G3 = 0.16666666666666666; - F4 = (SQRT_5 - 1.0) / 4.0; - G4 = (5.0 - SQRT_5) / 20.0; - G42 = G4 * 2.0; - G43 = G4 * 3.0; - G44 = G4 * 4.0 - 1.0; - } - - public Simplex(NukkitRandom random, double octaves, double persistence, double expansion) { - super(random, octaves, persistence, expansion); - this.offsetW = random.nextDouble() * 256; - SQRT_3 = Math.sqrt(3); - SQRT_5 = Math.sqrt(5); - F2 = 0.5 * (SQRT_3 - 1); - G2 = (3 - SQRT_3) / 6; - G22 = G2 * 2.0 - 1; - F3 = 0.3333333333333333; - G3 = 0.16666666666666666; - F4 = (SQRT_5 - 1.0) / 4.0; - G4 = (5.0 - SQRT_5) / 20.0; - G42 = G4 * 2.0; - G43 = G4 * 3.0; - G44 = G4 * 4.0 - 1.0; - } - - - protected static double dot2D(int[] g, double x, double y) { - return g[0] * x + g[1] * y; - } - - protected static double dot3D(int[] g, double x, double y, double z) { - return g[0] * x + g[1] * y + g[2] * z; - } - - protected static double dot4D(int[] g, double x, double y, double z, double w) { - return g[0] * x + g[1] * y + g[2] * z + g[3] * w; - } - - @Override - public double getNoise3D(double x, double y, double z) { - x += this.offsetX; - y += this.offsetY; - z += this.offsetZ; - - // Skew the input space to determine which simplex cell we're in - double s = (x + y + z) * F3; // Very nice and simple skew factor for 3D - int i = (int) (x + s); - int j = (int) (y + s); - int k = (int) (z + s); - double t = (i + j + k) * G3; - // Unskew the cell origin back to (x,y,z) space - double x0 = x - (i - t); // The x,y,z distances from the cell origin - double y0 = y - (j - t); - double z0 = z - (k - t); - - // For the 3D case, the simplex shape is a slightly irregular tetrahedron. - int i1 = 0; - int j1 = 0; - int k1 = 0; - int i2 = 0; - int j2 = 0; - int k2 = 0; - - // Determine which simplex we are in. - if (x0 >= y0) { - if (y0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } // X Y Z order - else if (x0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - } // X Z Y order - else { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } - // Z X Y order - } else { // x0 0) { - int[] gi0 = grad3[this.perm[ii + this.perm[jj + this.perm[kk]]] % 12]; - n += t0 * t0 * t0 * t0 * (gi0[0] * x0 + gi0[1] * y0 + gi0[2] * z0); - } - - double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; - if (t1 > 0) { - int[] gi1 = grad3[this.perm[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]] % 12]; - n += t1 * t1 * t1 * t1 * (gi1[0] * x1 + gi1[1] * y1 + gi1[2] * z1); - } - - double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; - if (t2 > 0) { - int[] gi2 = grad3[this.perm[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]] % 12]; - n += t2 * t2 * t2 * t2 * (gi2[0] * x2 + gi2[1] * y2 + gi2[2] * z2); - } - - double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; - if (t3 > 0) { - int[] gi3 = grad3[this.perm[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]] % 12]; - n += t3 * t3 * t3 * t3 * (gi3[0] * x3 + gi3[1] * y3 + gi3[2] * z3); - } - - // Add contributions from each corner to get the noise value. - // The result is scaled to stay just inside [-1,1] - return 32.0 * n; - } - - @Override - public double getNoise2D(double x, double y) { - x += this.offsetX; - y += this.offsetY; - - // Skew the input space to determine which simplex cell we're in - double s = (x + y) * F2; // Hairy factor for 2D - int i = (int) (x + s); - int j = (int) (y + s); - double t = (i + j) * G2; - // Unskew the cell origin back to (x,y) space - double x0 = x - (i - t); // The x,y distances from the cell origin - double y0 = y - (j - t); - - // For the 2D case, the simplex shape is an equilateral triangle. - int i1 = 0; - int j1 = 0; - // Determine which simplex we are in. - if (x0 > y0) { - i1 = 1; - j1 = 0; - } // lower triangle, XY order: (0,0).(1,0).(1,1) - else { - i1 = 0; - j1 = 1; - } - // upper triangle, YX order: (0,0).(0,1).(1,1) - - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - - double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords - double y1 = y0 - j1 + G2; - double x2 = x0 + G22; // Offsets for last corner in (x,y) unskewed coords - double y2 = y0 + G22; - - // Work out the hashed gradient indices of the three simplex corners - int ii = i & 255; - int jj = j & 255; - - double n = 0; - - // Calculate the contribution from the three corners - double t0 = 0.5 - x0 * x0 - y0 * y0; - if (t0 > 0) { - int[] gi0 = grad3[this.perm[ii + this.perm[jj]] % 12]; - n += t0 * t0 * t0 * t0 * (gi0[0] * x0 + gi0[1] * y0); // (x,y) of grad3 used for 2D gradient - } - - double t1 = 0.5 - x1 * x1 - y1 * y1; - if (t1 > 0) { - int[] gi1 = grad3[this.perm[ii + i1 + this.perm[jj + j1]] % 12]; - n += t1 * t1 * t1 * t1 * (gi1[0] * x1 + gi1[1] * y1); - } - - double t2 = 0.5 - x2 * x2 - y2 * y2; - if (t2 > 0) { - int[] gi2 = grad3[this.perm[ii + 1 + this.perm[jj + 1]] % 12]; - n += t2 * t2 * t2 * t2 * (gi2[0] * x2 + gi2[1] * y2); - } - - // Add contributions from each corner to get the noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70.0 * n; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/NoiseD.java b/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/NoiseD.java deleted file mode 100644 index 5439e1332..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/NoiseD.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.level.generator.noise.nukkit.d; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class NoiseD { - protected int[] perm; - protected double offsetX = 0; - protected double offsetY = 0; - protected double offsetZ = 0; - protected double octaves = 8; - protected double persistence; - protected double expansion; - - public static int floor(double x) { - return x >= 0 ? (int) x : (int) (x - 1); - } - - public static double fade(double x) { - return x * x * x * (x * (x * 6 - 15) + 10); - } - - public static double lerp(double x, double y, double z) { - return y + x * (z - y); - } - - public static double linearLerp(double x, double x1, double x2, double q0, double q1) { - return ((x2 - x) / (x2 - x1)) * q0 + ((x - x1) / (x2 - x1)) * q1; - } - - public static double bilinearLerp(double x, double y, double q00, double q01, double q10, double q11, double x1, double x2, double y1, double y2) { - double dx1 = ((x2 - x) / (x2 - x1)); - double dx2 = ((x - x1) / (x2 - x1)); - - return ((y2 - y) / (y2 - y1)) * ( - dx1 * q00 + dx2 * q10 - ) + ((y - y1) / (y2 - y1)) * ( - dx1 * q01 + dx2 * q11 - ); - } - - public static double trilinearLerp(double x, double y, double z, double q000, double q001, double q010, double q011, double q100, double q101, double q110, double q111, double x1, double x2, double y1, double y2, double z1, double z2) { - double dx1 = ((x2 - x) / (x2 - x1)); - double dx2 = ((x - x1) / (x2 - x1)); - double dy1 = ((y2 - y) / (y2 - y1)); - double dy2 = ((y - y1) / (y2 - y1)); - - return ((z2 - z) / (z2 - z1)) * ( - dy1 * ( - dx1 * q000 + dx2 * q100 - ) + dy2 * ( - dx1 * q001 + dx2 * q101 - ) - ) + ((z - z1) / (z2 - z1)) * ( - dy1 * ( - dx1 * q010 + dx2 * q110 - ) + dy2 * ( - dx1 * q011 + dx2 * q111 - ) - ); - } - - public static double grad(int hash, double x, double y, double z) { - hash &= 15; - double u = hash < 8 ? x : y; - double v = hash < 4 ? y : ((hash == 12 || hash == 14) ? x : - z); - - return ((hash & 1) == 0 ? u : -u) + ((hash & 2) == 0 ? v : -v); - } - - abstract public double getNoise2D(double x, double z); - - abstract public double getNoise3D(double x, double y, double z); - - public double noise2D(double x, double z) { - return noise2D(x, z, false); - } - - public double noise2D(double x, double z, boolean normalized) { - double result = 0; - double amp = 1; - double freq = 1; - double max = 0; - - x *= this.expansion; - z *= this.expansion; - - for (int i = 0; i < this.octaves; ++i) { - result += this.getNoise2D(x * freq, z * freq) * amp; - max += amp; - freq *= 2; - amp *= this.persistence; - } - - if (normalized) { - result /= max; - } - - return result; - } - - public double noise3D(double x, double y, double z) { - return noise3D(x, y, z, false); - } - - public double noise3D(double x, double y, double z, boolean normalized) { - double result = 0; - double amp = 1; - double freq = 1; - double max = 0; - - x *= this.expansion; - y *= this.expansion; - z *= this.expansion; - - for (int i = 0; i < this.octaves; ++i) { - result += this.getNoise3D(x * freq, y * freq, z * freq) * amp; - max += amp; - freq *= 2; - amp *= this.persistence; - } - - if (normalized) { - result /= max; - } - - return result; - } - - public void setOffset(double x, double y, double z) { - this.offsetX = x; - this.offsetY = y; - this.offsetZ = z; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/PerlinD.java b/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/PerlinD.java deleted file mode 100644 index 22c77e255..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/PerlinD.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.nukkit.level.generator.noise.nukkit.d; - -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PerlinD extends NoiseD { - public PerlinD(NukkitRandom random, double octaves, double persistence) { - this(random, octaves, persistence, 1); - } - - public PerlinD(NukkitRandom random, double octaves, double persistence, double expansion) { - this.octaves = octaves; - this.persistence = persistence; - this.expansion = expansion; - this.offsetX = random.nextFloat() * 256; - this.offsetY = random.nextFloat() * 256; - this.offsetZ = random.nextFloat() * 256; - this.perm = new int[512]; - for (int i = 0; i < 256; ++i) { - this.perm[i] = random.nextBoundedInt(256); - } - for (int i = 0; i < 256; ++i) { - int pos = random.nextBoundedInt(256 - i) + i; - int old = this.perm[i]; - this.perm[i] = this.perm[pos]; - this.perm[pos] = old; - this.perm[i + 256] = this.perm[i]; - } - } - - @Override - public double getNoise2D(double x, double y) { - return this.getNoise3D(x, y, 0); - } - - @Override - public double getNoise3D(double x, double y, double z) { - x += this.offsetX; - y += this.offsetY; - z += this.offsetZ; - - int floorX = (int) x; - int floorY = (int) y; - int floorZ = (int) z; - - int X = floorX & 0xFF; - int Y = floorY & 0xFF; - int Z = floorZ & 0xFF; - - x -= floorX; - y -= floorY; - z -= floorZ; - - //Fade curves - //fX = fade(x); - //fY = fade(y); - //fZ = fade(z); - double fX = x * x * x * (x * (x * 6 - 15) + 10); - double fY = y * y * y * (y * (y * 6 - 15) + 10); - double fZ = z * z * z * (z * (z * 6 - 15) + 10); - - //Cube corners - int A = this.perm[X] + Y; - int B = this.perm[X + 1] + Y; - - int AA = this.perm[A] + Z; - int AB = this.perm[A + 1] + Z; - int BA = this.perm[B] + Z; - int BB = this.perm[B + 1] + Z; - - double AA1 = grad(this.perm[AA], x, y, z); - double BA1 = grad(this.perm[BA], x - 1, y, z); - double AB1 = grad(this.perm[AB], x, y - 1, z); - double BB1 = grad(this.perm[BB], x - 1, y - 1, z); - double AA2 = grad(this.perm[AA + 1], x, y, z - 1); - double BA2 = grad(this.perm[BA + 1], x - 1, y, z - 1); - double AB2 = grad(this.perm[AB + 1], x, y - 1, z - 1); - double BB2 = grad(this.perm[BB + 1], x - 1, y - 1, z - 1); - - double xLerp11 = AA1 + fX * (BA1 - AA1); - - double zLerp1 = xLerp11 + fY * (AB1 + fX * (BB1 - AB1) - xLerp11); - - double xLerp21 = AA2 + fX * (BA2 - AA2); - - return zLerp1 + fZ * (xLerp21 + fY * (AB2 + fX * (BB2 - AB2) - xLerp21) - zLerp1); - - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/SimplexD.java b/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/SimplexD.java deleted file mode 100644 index 95d376e10..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/nukkit/d/SimplexD.java +++ /dev/null @@ -1,273 +0,0 @@ -package cn.nukkit.level.generator.noise.nukkit.d; - -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class SimplexD extends PerlinD { - protected static double SQRT_3; - protected static double SQRT_5; - protected static double F2; - protected static double G2; - protected static double G22; - protected static double F3; - protected static double G3; - protected static double F4; - protected static double G4; - protected static double G42; - protected static double G43; - protected static double G44; - public static final int[][] grad3 = { - {1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, - {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, - {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1} - }; - protected final double offsetW; - - public SimplexD(NukkitRandom random, double octaves, double persistence) { - super(random, octaves, persistence); - this.offsetW = random.nextDouble() * 256; - SQRT_3 = Math.sqrt(3); - SQRT_5 = Math.sqrt(5); - F2 = 0.5 * (SQRT_3 - 1); - G2 = (3 - SQRT_3) / 6; - G22 = G2 * 2.0 - 1; - F3 = 0.3333333333333333; - G3 = 0.16666666666666666; - F4 = (SQRT_5 - 1.0) / 4.0; - G4 = (5.0 - SQRT_5) / 20.0; - G42 = G4 * 2.0; - G43 = G4 * 3.0; - G44 = G4 * 4.0 - 1.0; - } - - public SimplexD(NukkitRandom random, double octaves, double persistence, double expansion) { - super(random, octaves, persistence, expansion); - this.offsetW = random.nextDouble() * 256; - SQRT_3 = Math.sqrt(3); - SQRT_5 = Math.sqrt(5); - F2 = 0.5 * (SQRT_3 - 1); - G2 = (3 - SQRT_3) / 6; - G22 = G2 * 2.0 - 1; - F3 = 0.3333333333333333; - G3 = 0.16666666666666666; - F4 = (SQRT_5 - 1.0) / 4.0; - G4 = (5.0 - SQRT_5) / 20.0; - G42 = G4 * 2.0; - G43 = G4 * 3.0; - G44 = G4 * 4.0 - 1.0; - } - - - protected static double dot2D(int[] g, double x, double y) { - return g[0] * x + g[1] * y; - } - - protected static double dot3D(int[] g, double x, double y, double z) { - return g[0] * x + g[1] * y + g[2] * z; - } - - protected static double dot4D(int[] g, double x, double y, double z, double w) { - return g[0] * x + g[1] * y + g[2] * z + g[3] * w; - } - - @Override - public double getNoise3D(double x, double y, double z) { - x += this.offsetX; - y += this.offsetY; - z += this.offsetZ; - - // Skew the input space to determine which simplex cell we're in - double s = (x + y + z) * F3; // Very nice and simple skew factor for 3D - int i = (int) (x + s); - int j = (int) (y + s); - int k = (int) (z + s); - double t = (i + j + k) * G3; - // Unskew the cell origin back to (x,y,z) space - double x0 = x - (i - t); // The x,y,z distances from the cell origin - double y0 = y - (j - t); - double z0 = z - (k - t); - - // For the 3D case, the simplex shape is a slightly irregular tetrahedron. - int i1 = 0; - int j1 = 0; - int k1 = 0; - int i2 = 0; - int j2 = 0; - int k2 = 0; - - // Determine which simplex we are in. - if (x0 >= y0) { - if (y0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } // X Y Z order - else if (x0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - } // X Z Y order - else { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } - // Z X Y order - } else { // x0 0) { - int[] gi0 = grad3[this.perm[ii + this.perm[jj + this.perm[kk]]] % 12]; - n += t0 * t0 * t0 * t0 * (gi0[0] * x0 + gi0[1] * y0 + gi0[2] * z0); - } - - double t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; - if (t1 > 0) { - int[] gi1 = grad3[this.perm[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]] % 12]; - n += t1 * t1 * t1 * t1 * (gi1[0] * x1 + gi1[1] * y1 + gi1[2] * z1); - } - - double t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; - if (t2 > 0) { - int[] gi2 = grad3[this.perm[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]] % 12]; - n += t2 * t2 * t2 * t2 * (gi2[0] * x2 + gi2[1] * y2 + gi2[2] * z2); - } - - double t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; - if (t3 > 0) { - int[] gi3 = grad3[this.perm[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]] % 12]; - n += t3 * t3 * t3 * t3 * (gi3[0] * x3 + gi3[1] * y3 + gi3[2] * z3); - } - - // Add contributions from each corner to get the noise value. - // The result is scaled to stay just inside [-1,1] - return 32.0 * n; - } - - @Override - public double getNoise2D(double x, double y) { - x += this.offsetX; - y += this.offsetY; - - // Skew the input space to determine which simplex cell we're in - double s = (x + y) * F2; // Hairy factor for 2D - int i = (int) (x + s); - int j = (int) (y + s); - double t = (i + j) * G2; - // Unskew the cell origin back to (x,y) space - double x0 = x - (i - t); // The x,y distances from the cell origin - double y0 = y - (j - t); - - // For the 2D case, the simplex shape is an equilateral triangle. - int i1 = 0; - int j1 = 0; - // Determine which simplex we are in. - if (x0 > y0) { - i1 = 1; - j1 = 0; - } // lower triangle, XY order: (0,0).(1,0).(1,1) - else { - i1 = 0; - j1 = 1; - } - // upper triangle, YX order: (0,0).(0,1).(1,1) - - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - - double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords - double y1 = y0 - j1 + G2; - double x2 = x0 + G22; // Offsets for last corner in (x,y) unskewed coords - double y2 = y0 + G22; - - // Work out the hashed gradient indices of the three simplex corners - int ii = i & 255; - int jj = j & 255; - - double n = 0; - - // Calculate the contribution from the three corners - double t0 = 0.5 - x0 * x0 - y0 * y0; - if (t0 > 0) { - int[] gi0 = grad3[this.perm[ii + this.perm[jj]] % 12]; - n += t0 * t0 * t0 * t0 * (gi0[0] * x0 + gi0[1] * y0); // (x,y) of grad3 used for 2D gradient - } - - double t1 = 0.5 - x1 * x1 - y1 * y1; - if (t1 > 0) { - int[] gi1 = grad3[this.perm[ii + i1 + this.perm[jj + j1]] % 12]; - n += t1 * t1 * t1 * t1 * (gi1[0] * x1 + gi1[1] * y1); - } - - double t2 = 0.5 - x2 * x2 - y2 * y2; - if (t2 > 0) { - int[] gi2 = grad3[this.perm[ii + 1 + this.perm[jj + 1]] % 12]; - n += t2 * t2 * t2 * t2 * (gi2[0] * x2 + gi2[1] * y2); - } - - // Add contributions from each corner to get the noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70.0 * n; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/NoiseF.java b/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/NoiseF.java deleted file mode 100644 index 5fe0f025c..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/NoiseF.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.level.generator.noise.nukkit.f; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public abstract class NoiseF { - protected int[] perm; - protected float offsetX = 0; - protected float offsetY = 0; - protected float offsetZ = 0; - protected float octaves = 8; - protected float persistence; - protected float expansion; - - public static int floor(float x) { - return x >= 0 ? (int) x : (int) (x - 1); - } - - public static float fade(float x) { - return x * x * x * (x * (x * 6 - 15) + 10); - } - - public static float lerp(float x, float y, float z) { - return y + x * (z - y); - } - - public static float linearLerp(float x, float x1, float x2, float q0, float q1) { - return ((x2 - x) / (x2 - x1)) * q0 + ((x - x1) / (x2 - x1)) * q1; - } - - public static float bilinearLerp(float x, float y, float q00, float q01, float q10, float q11, float x1, float x2, float y1, float y2) { - float dx1 = ((x2 - x) / (x2 - x1)); - float dx2 = ((x - x1) / (x2 - x1)); - - return ((y2 - y) / (y2 - y1)) * ( - dx1 * q00 + dx2 * q10 - ) + ((y - y1) / (y2 - y1)) * ( - dx1 * q01 + dx2 * q11 - ); - } - - public static float trilinearLerp(float x, float y, float z, float q000, float q001, float q010, float q011, float q100, float q101, float q110, float q111, float x1, float x2, float y1, float y2, float z1, float z2) { - float dx1 = ((x2 - x) / (x2 - x1)); - float dx2 = ((x - x1) / (x2 - x1)); - float dy1 = ((y2 - y) / (y2 - y1)); - float dy2 = ((y - y1) / (y2 - y1)); - - return ((z2 - z) / (z2 - z1)) * ( - dy1 * ( - dx1 * q000 + dx2 * q100 - ) + dy2 * ( - dx1 * q001 + dx2 * q101 - ) - ) + ((z - z1) / (z2 - z1)) * ( - dy1 * ( - dx1 * q010 + dx2 * q110 - ) + dy2 * ( - dx1 * q011 + dx2 * q111 - ) - ); - } - - public static float grad(int hash, float x, float y, float z) { - hash &= 15; - float u = hash < 8 ? x : y; - float v = hash < 4 ? y : ((hash == 12 || hash == 14) ? x : - z); - - return ((hash & 1) == 0 ? u : -u) + ((hash & 2) == 0 ? v : -v); - } - - abstract public float getNoise2D(float x, float z); - - abstract public float getNoise3D(float x, float y, float z); - - public float noise2D(float x, float z) { - return noise2D(x, z, false); - } - - public float noise2D(float x, float z, boolean normalized) { - float result = 0; - float amp = 1; - float freq = 1; - float max = 0; - - x *= this.expansion; - z *= this.expansion; - - for (int i = 0; i < this.octaves; ++i) { - result += this.getNoise2D(x * freq, z * freq) * amp; - max += amp; - freq *= 2; - amp *= this.persistence; - } - - if (normalized) { - result /= max; - } - - return result; - } - - public float noise3D(float x, float y, float z) { - return noise3D(x, y, z, false); - } - - public float noise3D(float x, float y, float z, boolean normalized) { - float result = 0; - float amp = 1; - float freq = 1; - float max = 0; - - x *= this.expansion; - y *= this.expansion; - z *= this.expansion; - - for (int i = 0; i < this.octaves; ++i) { - result += this.getNoise3D(x * freq, y * freq, z * freq) * amp; - max += amp; - freq *= 2; - amp *= this.persistence; - } - - if (normalized) { - result /= max; - } - - return result; - } - - public void setOffset(float x, float y, float z) { - this.offsetX = x; - this.offsetY = y; - this.offsetZ = z; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/PerlinF.java b/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/PerlinF.java deleted file mode 100644 index 50c092979..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/PerlinF.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.nukkit.level.generator.noise.nukkit.f; - -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class PerlinF extends NoiseF { - public PerlinF(NukkitRandom random, float octaves, float persistence) { - this(random, octaves, persistence, 1); - } - - public PerlinF(NukkitRandom random, float octaves, float persistence, float expansion) { - this.octaves = octaves; - this.persistence = persistence; - this.expansion = expansion; - this.offsetX = random.nextFloat() * 256; - this.offsetY = random.nextFloat() * 256; - this.offsetZ = random.nextFloat() * 256; - this.perm = new int[512]; - for (int i = 0; i < 256; ++i) { - this.perm[i] = random.nextBoundedInt(256); - } - for (int i = 0; i < 256; ++i) { - int pos = random.nextBoundedInt(256 - i) + i; - int old = this.perm[i]; - this.perm[i] = this.perm[pos]; - this.perm[pos] = old; - this.perm[i + 256] = this.perm[i]; - } - } - - @Override - public float getNoise2D(float x, float y) { - return this.getNoise3D(x, y, 0); - } - - @Override - public float getNoise3D(float x, float y, float z) { - x += this.offsetX; - y += this.offsetY; - z += this.offsetZ; - - int floorX = (int) x; - int floorY = (int) y; - int floorZ = (int) z; - - int X = floorX & 0xFF; - int Y = floorY & 0xFF; - int Z = floorZ & 0xFF; - - x -= floorX; - y -= floorY; - z -= floorZ; - - //Fade curves - //fX = fade(x); - //fY = fade(y); - //fZ = fade(z); - float fX = x * x * x * (x * (x * 6 - 15) + 10); - float fY = y * y * y * (y * (y * 6 - 15) + 10); - float fZ = z * z * z * (z * (z * 6 - 15) + 10); - - //Cube corners - int A = this.perm[X] + Y; - int B = this.perm[X + 1] + Y; - - int AA = this.perm[A] + Z; - int AB = this.perm[A + 1] + Z; - int BA = this.perm[B] + Z; - int BB = this.perm[B + 1] + Z; - - float AA1 = grad(this.perm[AA], x, y, z); - float BA1 = grad(this.perm[BA], x - 1, y, z); - float AB1 = grad(this.perm[AB], x, y - 1, z); - float BB1 = grad(this.perm[BB], x - 1, y - 1, z); - float AA2 = grad(this.perm[AA + 1], x, y, z - 1); - float BA2 = grad(this.perm[BA + 1], x - 1, y, z - 1); - float AB2 = grad(this.perm[AB + 1], x, y - 1, z - 1); - float BB2 = grad(this.perm[BB + 1], x - 1, y - 1, z - 1); - - float xLerp11 = AA1 + fX * (BA1 - AA1); - - float zLerp1 = xLerp11 + fY * (AB1 + fX * (BB1 - AB1) - xLerp11); - - float xLerp21 = AA2 + fX * (BA2 - AA2); - - return zLerp1 + fZ * (xLerp21 + fY * (AB2 + fX * (BB2 - AB2) - xLerp21) - zLerp1); - - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/SimplexF.java b/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/SimplexF.java deleted file mode 100644 index 2ed41d428..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/nukkit/f/SimplexF.java +++ /dev/null @@ -1,273 +0,0 @@ -package cn.nukkit.level.generator.noise.nukkit.f; - -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class SimplexF extends PerlinF { - protected static float SQRT_3; - protected static float SQRT_5; - protected static float F2; - protected static float G2; - protected static float G22; - protected static float F3; - protected static float G3; - protected static float F4; - protected static float G4; - protected static float G42; - protected static float G43; - protected static float G44; - public static final int[][] grad3 = { - {1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, - {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, - {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1} - }; - protected final float offsetW; - - public SimplexF(NukkitRandom random, float octaves, float persistence) { - super(random, octaves, persistence); - this.offsetW = random.nextFloat() * 256; - SQRT_3 = (float) Math.sqrt(3); - SQRT_5 = (float) Math.sqrt(5); - F2 = 0.5f * (SQRT_3 - 1f); - G2 = (3f - SQRT_3) / 6f; - G22 = G2 * 2.0f - 1f; - F3 = 0.33333334f; - G3 = 0.16666667f; - F4 = (SQRT_5 - 1.0f) / 4.0f; - G4 = (5.0f - SQRT_5) / 20.0f; - G42 = G4 * 2.0f; - G43 = G4 * 3.0f; - G44 = G4 * 4.0f - 1.0f; - } - - public SimplexF(NukkitRandom random, float octaves, float persistence, float expansion) { - super(random, octaves, persistence, expansion); - this.offsetW = random.nextFloat() * 256; - SQRT_3 = (float) Math.sqrt(3); - SQRT_5 = (float) Math.sqrt(5); - F2 = 0.5f * (SQRT_3 - 1f); - G2 = (3f - SQRT_3) / 6f; - G22 = G2 * 2.0f - 1f; - F3 = 0.33333334f; - G3 = 0.16666667f; - F4 = (SQRT_5 - 1.0f) / 4.0f; - G4 = (5.0f - SQRT_5) / 20.0f; - G42 = G4 * 2.0f; - G43 = G4 * 3.0f; - G44 = G4 * 4.0f - 1.0f; - } - - - protected static float dot2D(int[] g, float x, float y) { - return g[0] * x + g[1] * y; - } - - protected static float dot3D(int[] g, float x, float y, float z) { - return g[0] * x + g[1] * y + g[2] * z; - } - - protected static float dot4D(int[] g, float x, float y, float z, float w) { - return g[0] * x + g[1] * y + g[2] * z + g[3] * w; - } - - @Override - public float getNoise3D(float x, float y, float z) { - x += this.offsetX; - y += this.offsetY; - z += this.offsetZ; - - // Skew the input space to determine which simplex cell we're in - float s = (x + y + z) * F3; // Very nice and simple skew factor for 3D - int i = (int) (x + s); - int j = (int) (y + s); - int k = (int) (z + s); - float t = (i + j + k) * G3; - // Unskew the cell origin back to (x,y,z) space - float x0 = x - (i - t); // The x,y,z distances from the cell origin - float y0 = y - (j - t); - float z0 = z - (k - t); - - // For the 3D case, the simplex shape is a slightly irregular tetrahedron. - int i1 = 0; - int j1 = 0; - int k1 = 0; - int i2 = 0; - int j2 = 0; - int k2 = 0; - - // Determine which simplex we are in. - if (x0 >= y0) { - if (y0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } // X Y Z order - else if (x0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - } // X Z Y order - else { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } - // Z X Y order - } else { // x0 0) { - int[] gi0 = grad3[this.perm[ii + this.perm[jj + this.perm[kk]]] % 12]; - n += t0 * t0 * t0 * t0 * (gi0[0] * x0 + gi0[1] * y0 + gi0[2] * z0); - } - - float t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1; - if (t1 > 0) { - int[] gi1 = grad3[this.perm[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]] % 12]; - n += t1 * t1 * t1 * t1 * (gi1[0] * x1 + gi1[1] * y1 + gi1[2] * z1); - } - - float t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2; - if (t2 > 0) { - int[] gi2 = grad3[this.perm[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]] % 12]; - n += t2 * t2 * t2 * t2 * (gi2[0] * x2 + gi2[1] * y2 + gi2[2] * z2); - } - - float t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3; - if (t3 > 0) { - int[] gi3 = grad3[this.perm[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]] % 12]; - n += t3 * t3 * t3 * t3 * (gi3[0] * x3 + gi3[1] * y3 + gi3[2] * z3); - } - - // Add contributions from each corner to get the noise value. - // The result is scaled to stay just inside [-1,1] - return 32.0f * n; - } - - @Override - public float getNoise2D(float x, float y) { - x += this.offsetX; - y += this.offsetY; - - // Skew the input space to determine which simplex cell we're in - float s = (x + y) * F2; // Hairy factor for 2D - int i = (int) (x + s); - int j = (int) (y + s); - float t = (i + j) * G2; - // Unskew the cell origin back to (x,y) space - float x0 = x - (i - t); // The x,y distances from the cell origin - float y0 = y - (j - t); - - // For the 2D case, the simplex shape is an equilateral triangle. - int i1 = 0; - int j1 = 0; - // Determine which simplex we are in. - if (x0 > y0) { - i1 = 1; - j1 = 0; - } // lower triangle, XY order: (0,0).(1,0).(1,1) - else { - i1 = 0; - j1 = 1; - } - // upper triangle, YX order: (0,0).(0,1).(1,1) - - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - - float x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords - float y1 = y0 - j1 + G2; - float x2 = x0 + G22; // Offsets for last corner in (x,y) unskewed coords - float y2 = y0 + G22; - - // Work out the hashed gradient indices of the three simplex corners - int ii = i & 255; - int jj = j & 255; - - float n = 0; - - // Calculate the contribution from the three corners - float t0 = 0.5f - x0 * x0 - y0 * y0; - if (t0 > 0) { - int[] gi0 = grad3[this.perm[ii + this.perm[jj]] % 12]; - n += t0 * t0 * t0 * t0 * (gi0[0] * x0 + gi0[1] * y0); // (x,y) of grad3 used for 2D gradient - } - - float t1 = 0.5f - x1 * x1 - y1 * y1; - if (t1 > 0) { - int[] gi1 = grad3[this.perm[ii + i1 + this.perm[jj + j1]] % 12]; - n += t1 * t1 * t1 * t1 * (gi1[0] * x1 + gi1[1] * y1); - } - - float t2 = 0.5f - x2 * x2 - y2 * y2; - if (t2 > 0) { - int[] gi2 = grad3[this.perm[ii + 1 + this.perm[jj + 1]] % 12]; - n += t2 * t2 * t2 * t2 * (gi2[0] * x2 + gi2[1] * y2); - } - - // Add contributions from each corner to get the noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70.0f * n; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorImprovedD.java b/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorImprovedD.java deleted file mode 100644 index 2c3c1d104..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorImprovedD.java +++ /dev/null @@ -1,177 +0,0 @@ -package cn.nukkit.level.generator.noise.vanilla.d; - -import cn.nukkit.math.NukkitRandom; - -public class NoiseGeneratorImprovedD { - private static final double[] GRAD_X = new double[]{1.0D, -1.0, 1.0D, -1.0, 1.0D, -1.0, 1.0D, -1.0, 0.0D, 0.0D, 0.0D, 0.0D, 1.0D, 0.0D, -1.0, 0.0D}; - private static final double[] GRAD_Y = new double[]{1.0D, 1.0D, -1.0, -1.0, 0.0D, 0.0D, 0.0D, 0.0D, 1.0D, -1.0, 1.0D, -1.0, 1.0D, -1.0, 1.0D, -1.0}; - private static final double[] GRAD_Z = new double[]{0.0D, 0.0D, 0.0D, 0.0D, 1.0D, 1.0D, -1.0, -1.0, 1.0D, 1.0D, -1.0, -1.0, 0.0D, 1.0D, 0.0D, -1.0}; - private static final double[] GRAD_2X = new double[]{1.0D, -1.0, 1.0D, -1.0, 1.0D, -1.0, 1.0D, -1.0, 0.0D, 0.0D, 0.0D, 0.0D, 1.0D, 0.0D, -1.0, 0.0D}; - private static final double[] GRAD_2Z = new double[]{0.0D, 0.0D, 0.0D, 0.0D, 1.0D, 1.0D, -1.0, -1.0, 1.0D, 1.0D, -1.0, -1.0, 0.0D, 1.0D, 0.0D, -1.0}; - private final int[] permutations; - public double xCoord; - public double yCoord; - public double zCoord; - - public NoiseGeneratorImprovedD() { - this(new NukkitRandom(System.currentTimeMillis())); - } - - public NoiseGeneratorImprovedD(NukkitRandom random) { - this.permutations = new int[512]; - this.xCoord = random.nextDouble() * 256.0D; - this.yCoord = random.nextDouble() * 256.0D; - this.zCoord = random.nextDouble() * 256.0D; - - int i = 0; - while (i < 256) { - this.permutations[i] = i++; - } - - for (int l = 0; l < 256; ++l) { - int j = random.nextBoundedInt(256 - l) + l; - int k = this.permutations[l]; - this.permutations[l] = this.permutations[j]; - this.permutations[j] = k; - this.permutations[l + 256] = this.permutations[l]; - } - } - - public final double lerp(double p_76311_1_, double p_76311_3_, double p_76311_5_) { - return p_76311_3_ + p_76311_1_ * (p_76311_5_ - p_76311_3_); - } - - public final double grad2(int p_76309_1_, double p_76309_2_, double p_76309_4_) { - int i = p_76309_1_ & 15; - return GRAD_2X[i] * p_76309_2_ + GRAD_2Z[i] * p_76309_4_; - } - - public final double grad(int p_76310_1_, double p_76310_2_, double p_76310_4_, double p_76310_6_) { - int i = p_76310_1_ & 15; - return GRAD_X[i] * p_76310_2_ + GRAD_Y[i] * p_76310_4_ + GRAD_Z[i] * p_76310_6_; - } - - /* - * noiseArray should be xSize*ySize*zSize in size - */ - public void populateNoiseArray(double[] noiseArray, double xOffset, double yOffset, double zOffset, int xSize, int ySize, int zSize, double xScale, double yScale, double zScale, double noiseScale) { - if (ySize == 1) { - int i5 = 0; - int j5 = 0; - int j = 0; - int k5 = 0; - double d14 = 0.0D; - double d15 = 0.0D; - int l5 = 0; - double d16 = 1.0D / noiseScale; - - for (int j2 = 0; j2 < xSize; ++j2) { - double d17 = xOffset + (double) j2 * xScale + this.xCoord; - int i6 = (int) d17; - - if (d17 < (double) i6) { - --i6; - } - - int k2 = i6 & 255; - d17 = d17 - (double) i6; - double d18 = d17 * d17 * d17 * (d17 * (d17 * 6.0D - 15.0D) + 10.0D); - - for (int j6 = 0; j6 < zSize; ++j6) { - double d19 = zOffset + (double) j6 * zScale + this.zCoord; - int k6 = (int) d19; - - if (d19 < (double) k6) { - --k6; - } - - int l6 = k6 & 255; - d19 = d19 - (double) k6; - double d20 = d19 * d19 * d19 * (d19 * (d19 * 6.0D - 15.0D) + 10.0D); - i5 = this.permutations[k2]; - j5 = this.permutations[i5] + l6; - j = this.permutations[k2 + 1]; - k5 = this.permutations[j] + l6; - d14 = this.lerp(d18, this.grad2(this.permutations[j5], d17, d19), this.grad(this.permutations[k5], d17 - 1.0D, 0.0D, d19)); - d15 = this.lerp(d18, this.grad(this.permutations[j5 + 1], d17, 0.0D, d19 - 1.0D), this.grad(this.permutations[k5 + 1], d17 - 1.0D, 0.0D, d19 - 1.0D)); - double d21 = this.lerp(d20, d14, d15); - int i7 = l5++; - noiseArray[i7] += d21 * d16; - } - } - } else { - int i = 0; - double d0 = 1.0D / noiseScale; - int k = -1; - int l = 0; - int i1 = 0; - int j1 = 0; - int k1 = 0; - int l1 = 0; - int i2 = 0; - double d1 = 0.0D; - double d2 = 0.0D; - double d3 = 0.0D; - double d4 = 0.0D; - - for (int l2 = 0; l2 < xSize; ++l2) { - double d5 = xOffset + (double) l2 * xScale + this.xCoord; - int i3 = (int) d5; - - if (d5 < (double) i3) { - --i3; - } - - int j3 = i3 & 255; - d5 = d5 - (double) i3; - double d6 = d5 * d5 * d5 * (d5 * (d5 * 6.0D - 15.0D) + 10.0D); - - for (int k3 = 0; k3 < zSize; ++k3) { - double d7 = zOffset + (double) k3 * zScale + this.zCoord; - int l3 = (int) d7; - - if (d7 < (double) l3) { - --l3; - } - - int i4 = l3 & 255; - d7 = d7 - (double) l3; - double d8 = d7 * d7 * d7 * (d7 * (d7 * 6.0D - 15.0D) + 10.0D); - - for (int j4 = 0; j4 < ySize; ++j4) { - double d9 = yOffset + (double) j4 * yScale + this.yCoord; - int k4 = (int) d9; - - if (d9 < (double) k4) { - --k4; - } - - int l4 = k4 & 255; - d9 = d9 - (double) k4; - double d10 = d9 * d9 * d9 * (d9 * (d9 * 6.0D - 15.0D) + 10.0D); - - if (j4 == 0 || l4 != k) { - k = l4; - l = this.permutations[j3] + l4; - i1 = this.permutations[l] + i4; - j1 = this.permutations[l + 1] + i4; - k1 = this.permutations[j3 + 1] + l4; - l1 = this.permutations[k1] + i4; - i2 = this.permutations[k1 + 1] + i4; - d1 = this.lerp(d6, this.grad(this.permutations[i1], d5, d9, d7), this.grad(this.permutations[l1], d5 - 1.0D, d9, d7)); - d2 = this.lerp(d6, this.grad(this.permutations[j1], d5, d9 - 1.0D, d7), this.grad(this.permutations[i2], d5 - 1.0D, d9 - 1.0D, d7)); - d3 = this.lerp(d6, this.grad(this.permutations[i1 + 1], d5, d9, d7 - 1.0D), this.grad(this.permutations[l1 + 1], d5 - 1.0D, d9, d7 - 1.0D)); - d4 = this.lerp(d6, this.grad(this.permutations[j1 + 1], d5, d9 - 1.0D, d7 - 1.0D), this.grad(this.permutations[i2 + 1], d5 - 1.0D, d9 - 1.0D, d7 - 1.0D)); - } - - double d11 = this.lerp(d10, d1, d2); - double d12 = this.lerp(d10, d3, d4); - double d13 = this.lerp(d8, d11, d12); - int j7 = i++; - noiseArray[j7] += d13 * d0; - } - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorOctavesD.java b/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorOctavesD.java deleted file mode 100644 index ad0cf3806..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorOctavesD.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.level.generator.noise.vanilla.d; - -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.NukkitRandom; - -import java.util.Arrays; - -public class NoiseGeneratorOctavesD { - /** - * Collection of noise generation functions. Output is combined to produce different octaves of noise. - */ - private final NoiseGeneratorImprovedD[] generatorCollection; - private final int octaves; - - public NoiseGeneratorOctavesD(NukkitRandom seed, int octavesIn) { - this.octaves = octavesIn; - this.generatorCollection = new NoiseGeneratorImprovedD[octavesIn]; - - for (int i = 0; i < octavesIn; ++i) { - this.generatorCollection[i] = new NoiseGeneratorImprovedD(seed); - } - } - - /* - * pars:(par2,3,4=noiseOffset ; so that adjacent noise segments connect) (pars5,6,7=x,y,zArraySize),(pars8,10,12 = - * x,y,z noiseScale) - */ - public double[] generateNoiseOctaves(double[] noiseArray, int xOffset, int yOffset, int zOffset, int xSize, int ySize, int zSize, double xScale, double yScale, double zScale) { - if (noiseArray == null) { - noiseArray = new double[xSize * ySize * zSize]; - } else { - Arrays.fill(noiseArray, 0.0D); - } - - double d3 = 1.0D; - - for (int j = 0; j < this.octaves; ++j) { - double d0 = (double) xOffset * d3 * xScale; - double d1 = (double) yOffset * d3 * yScale; - double d2 = (double) zOffset * d3 * zScale; - long k = MathHelper.floor_double_long(d0); - long l = MathHelper.floor_double_long(d2); - d0 = d0 - (double) k; - d2 = d2 - (double) l; - k = k % 16777216L; - l = l % 16777216L; - d0 = d0 + (double) k; - d2 = d2 + (double) l; - this.generatorCollection[j].populateNoiseArray(noiseArray, d0, d1, d2, xSize, ySize, zSize, xScale * d3, yScale * d3, zScale * d3, d3); - d3 /= 2.0D; - } - - return noiseArray; - } - - /* - * Bouncer function to the main one with some default arguments. - */ - public double[] generateNoiseOctaves(double[] noiseArray, int xOffset, int zOffset, int xSize, int zSize, double xScale, double zScale, double p_76305_10_) { - return this.generateNoiseOctaves(noiseArray, xOffset, 10, zOffset, xSize, 1, zSize, xScale, 1.0D, zScale); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorPerlinD.java b/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorPerlinD.java deleted file mode 100644 index f65ca41b2..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorPerlinD.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.level.generator.noise.vanilla.d; - -import cn.nukkit.math.NukkitRandom; - -import java.util.Arrays; - -public class NoiseGeneratorPerlinD { - private final NoiseGeneratorSimplexD[] noiseLevels; - private final int levels; - - public NoiseGeneratorPerlinD(NukkitRandom p_i45470_1_, int p_i45470_2_) { - this.levels = p_i45470_2_; - this.noiseLevels = new NoiseGeneratorSimplexD[p_i45470_2_]; - - for (int i = 0; i < p_i45470_2_; ++i) { - this.noiseLevels[i] = new NoiseGeneratorSimplexD(p_i45470_1_); - } - } - - public double getValue(double p_151601_1_, double p_151601_3_) { - double d0 = 0.0D; - double d1 = 1.0D; - - for (int i = 0; i < this.levels; ++i) { - d0 += this.noiseLevels[i].getValue(p_151601_1_ * d1, p_151601_3_ * d1) / d1; - d1 /= 2.0D; - } - - return d0; - } - - public double[] getRegion(double[] p_151599_1_, double p_151599_2_, double p_151599_4_, int p_151599_6_, int p_151599_7_, double p_151599_8_, double p_151599_10_, double p_151599_12_) { - return this.getRegion(p_151599_1_, p_151599_2_, p_151599_4_, p_151599_6_, p_151599_7_, p_151599_8_, p_151599_10_, p_151599_12_, 0.5D); - } - - public double[] getRegion(double[] p_151600_1_, double p_151600_2_, double p_151600_4_, int p_151600_6_, int p_151600_7_, double p_151600_8_, double p_151600_10_, double p_151600_12_, double p_151600_14_) { - if (p_151600_1_ != null && p_151600_1_.length >= p_151600_6_ * p_151600_7_) { - Arrays.fill(p_151600_1_, 0.0D); - } else { - p_151600_1_ = new double[p_151600_6_ * p_151600_7_]; - } - - double d1 = 1.0D; - double d0 = 1.0D; - - for (int j = 0; j < this.levels; ++j) { - this.noiseLevels[j].add(p_151600_1_, p_151600_2_, p_151600_4_, p_151600_6_, p_151600_7_, p_151600_8_ * d0 * d1, p_151600_10_ * d0 * d1, 0.55D / d1); - d0 *= p_151600_12_; - d1 *= p_151600_14_; - } - - return p_151600_1_; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorSimplexD.java b/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorSimplexD.java deleted file mode 100644 index 78ca1ecbf..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/vanilla/d/NoiseGeneratorSimplexD.java +++ /dev/null @@ -1,182 +0,0 @@ -package cn.nukkit.level.generator.noise.vanilla.d; - -import cn.nukkit.math.NukkitRandom; - -public class NoiseGeneratorSimplexD { - public static final double SQRT_3 = Math.sqrt(3.0D); - private static final int[][] grad3 = new int[][]{{1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1}}; - private static final double F2 = 0.5D * (SQRT_3 - 1.0D); - private static final double G2 = (3.0D - SQRT_3) / 6.0D; - private final int[] p; - public double xo; - public double yo; - public double zo; - - public NoiseGeneratorSimplexD() { - this(new NukkitRandom(System.currentTimeMillis())); - } - - public NoiseGeneratorSimplexD(NukkitRandom p_i45471_1_) { - this.p = new int[512]; - this.xo = p_i45471_1_.nextDouble() * 256.0D; - this.yo = p_i45471_1_.nextDouble() * 256.0D; - this.zo = p_i45471_1_.nextDouble() * 256.0D; - - int i = 0; - while (i < 256) { - this.p[i] = i++; - } - - for (int l = 0; l < 256; ++l) { - int j = p_i45471_1_.nextBoundedInt(256 - l) + l; - int k = this.p[l]; - this.p[l] = this.p[j]; - this.p[j] = k; - this.p[l + 256] = this.p[l]; - } - } - - private static int fastFloor(double value) { - return value > 0.0D ? (int) value : (int) value - 1; - } - - private static double dot(int[] p_151604_0_, double p_151604_1_, double p_151604_3_) { - return (double) p_151604_0_[0] * p_151604_1_ + (double) p_151604_0_[1] * p_151604_3_; - } - - public double getValue(double p_151605_1_, double p_151605_3_) { - double d3 = 0.5D * (SQRT_3 - 1.0D); - double d4 = (p_151605_1_ + p_151605_3_) * d3; - int i = fastFloor(p_151605_1_ + d4); - int j = fastFloor(p_151605_3_ + d4); - double d5 = (3.0D - SQRT_3) / 6.0D; - double d6 = (double) (i + j) * d5; - double d7 = (double) i - d6; - double d8 = (double) j - d6; - double d9 = p_151605_1_ - d7; - double d10 = p_151605_3_ - d8; - int k; - int l; - - if (d9 > d10) { - k = 1; - l = 0; - } else { - k = 0; - l = 1; - } - - double d11 = d9 - (double) k + d5; - double d12 = d10 - (double) l + d5; - double d13 = d9 - 1.0D + 2.0D * d5; - double d14 = d10 - 1.0D + 2.0D * d5; - int i1 = i & 255; - int j1 = j & 255; - int k1 = this.p[i1 + this.p[j1]] % 12; - int l1 = this.p[i1 + k + this.p[j1 + l]] % 12; - int i2 = this.p[i1 + 1 + this.p[j1 + 1]] % 12; - double d15 = 0.5D - d9 * d9 - d10 * d10; - double d0; - - if (d15 < 0.0D) { - d0 = 0.0D; - } else { - d15 = d15 * d15; - d0 = d15 * d15 * dot(grad3[k1], d9, d10); - } - - double d16 = 0.5D - d11 * d11 - d12 * d12; - double d1; - - if (d16 < 0.0D) { - d1 = 0.0D; - } else { - d16 = d16 * d16; - d1 = d16 * d16 * dot(grad3[l1], d11, d12); - } - - double d17 = 0.5D - d13 * d13 - d14 * d14; - double d2; - - if (d17 < 0.0D) { - d2 = 0.0D; - } else { - d17 = d17 * d17; - d2 = d17 * d17 * dot(grad3[i2], d13, d14); - } - - return 70.0D * (d0 + d1 + d2); - } - - public void add(double[] p_151606_1_, double p_151606_2_, double p_151606_4_, int p_151606_6_, int p_151606_7_, double p_151606_8_, double p_151606_10_, double p_151606_12_) { - int i = 0; - - for (int j = 0; j < p_151606_7_; ++j) { - double d0 = (p_151606_4_ + (double) j) * p_151606_10_ + this.yo; - - for (int k = 0; k < p_151606_6_; ++k) { - double d1 = (p_151606_2_ + (double) k) * p_151606_8_ + this.xo; - double d5 = (d1 + d0) * F2; - int l = fastFloor(d1 + d5); - int i1 = fastFloor(d0 + d5); - double d6 = (double) (l + i1) * G2; - double d7 = (double) l - d6; - double d8 = (double) i1 - d6; - double d9 = d1 - d7; - double d10 = d0 - d8; - int j1; - int k1; - - if (d9 > d10) { - j1 = 1; - k1 = 0; - } else { - j1 = 0; - k1 = 1; - } - - double d11 = d9 - (double) j1 + G2; - double d12 = d10 - (double) k1 + G2; - double d13 = d9 - 1.0D + 2.0D * G2; - double d14 = d10 - 1.0D + 2.0D * G2; - int l1 = l & 255; - int i2 = i1 & 255; - int j2 = this.p[l1 + this.p[i2]] % 12; - int k2 = this.p[l1 + j1 + this.p[i2 + k1]] % 12; - int l2 = this.p[l1 + 1 + this.p[i2 + 1]] % 12; - double d15 = 0.5D - d9 * d9 - d10 * d10; - double d2; - - if (d15 < 0.0D) { - d2 = 0.0D; - } else { - d15 = d15 * d15; - d2 = d15 * d15 * dot(grad3[j2], d9, d10); - } - - double d16 = 0.5D - d11 * d11 - d12 * d12; - double d3; - - if (d16 < 0.0D) { - d3 = 0.0D; - } else { - d16 = d16 * d16; - d3 = d16 * d16 * dot(grad3[k2], d11, d12); - } - - double d17 = 0.5D - d13 * d13 - d14 * d14; - double d4; - - if (d17 < 0.0D) { - d4 = 0.0D; - } else { - d17 = d17 * d17; - d4 = d17 * d17 * dot(grad3[l2], d13, d14); - } - - int i3 = i++; - p_151606_1_[i3] += 70.0D * (d2 + d3 + d4) * p_151606_12_; - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorImprovedF.java b/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorImprovedF.java deleted file mode 100644 index 954a3da6d..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorImprovedF.java +++ /dev/null @@ -1,177 +0,0 @@ -package cn.nukkit.level.generator.noise.vanilla.f; - -import cn.nukkit.math.NukkitRandom; - -public class NoiseGeneratorImprovedF { - private static final float[] GRAD_X = new float[]{1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f}; - private static final float[] GRAD_Y = new float[]{1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f}; - private static final float[] GRAD_Z = new float[]{0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f}; - private static final float[] GRAD_2X = new float[]{1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f}; - private static final float[] GRAD_2Z = new float[]{0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f}; - private final int[] permutations; - public float xCoord; - public float yCoord; - public float zCoord; - - public NoiseGeneratorImprovedF() { - this(new NukkitRandom(System.currentTimeMillis())); - } - - public NoiseGeneratorImprovedF(NukkitRandom p_i45469_1_) { - this.permutations = new int[512]; - this.xCoord = p_i45469_1_.nextFloat() * 256.0f; - this.yCoord = p_i45469_1_.nextFloat() * 256.0f; - this.zCoord = p_i45469_1_.nextFloat() * 256.0f; - - int i = 0; - while (i < 256) { - this.permutations[i] = i++; - } - - for (int l = 0; l < 256; ++l) { - int j = p_i45469_1_.nextBoundedInt(256 - l) + l; - int k = this.permutations[l]; - this.permutations[l] = this.permutations[j]; - this.permutations[j] = k; - this.permutations[l + 256] = this.permutations[l]; - } - } - - public final float lerp(float p_76311_1_, float p_76311_3_, float p_76311_5_) { - return p_76311_3_ + p_76311_1_ * (p_76311_5_ - p_76311_3_); - } - - public final float grad2(int p_76309_1_, float p_76309_2_, float p_76309_4_) { - int i = p_76309_1_ & 15; - return GRAD_2X[i] * p_76309_2_ + GRAD_2Z[i] * p_76309_4_; - } - - public final float grad(int p_76310_1_, float p_76310_2_, float p_76310_4_, float p_76310_6_) { - int i = p_76310_1_ & 15; - return GRAD_X[i] * p_76310_2_ + GRAD_Y[i] * p_76310_4_ + GRAD_Z[i] * p_76310_6_; - } - - /* - * noiseArray should be xSize*ySize*zSize in size - */ - public void populateNoiseArray(float[] noiseArray, float xOffset, float yOffset, float zOffset, int xSize, int ySize, int zSize, float xScale, float yScale, float zScale, float noiseScale) { - if (ySize == 1) { - int i5 = 0; - int j5 = 0; - int j = 0; - int k5 = 0; - float d14 = 0.0f; - float d15 = 0.0f; - int l5 = 0; - float d16 = 1.0f / noiseScale; - - for (int j2 = 0; j2 < xSize; ++j2) { - float d17 = xOffset + (float) j2 * xScale + this.xCoord; - int i6 = (int) d17; - - if (d17 < (float) i6) { - --i6; - } - - int k2 = i6 & 255; - d17 = d17 - (float) i6; - float d18 = d17 * d17 * d17 * (d17 * (d17 * 6.0f - 15.0f) + 10.0f); - - for (int j6 = 0; j6 < zSize; ++j6) { - float d19 = zOffset + (float) j6 * zScale + this.zCoord; - int k6 = (int) d19; - - if (d19 < (float) k6) { - --k6; - } - - int l6 = k6 & 255; - d19 = d19 - (float) k6; - float d20 = d19 * d19 * d19 * (d19 * (d19 * 6.0f - 15.0f) + 10.0f); - i5 = this.permutations[k2]; - j5 = this.permutations[i5] + l6; - j = this.permutations[k2 + 1]; - k5 = this.permutations[j] + l6; - d14 = this.lerp(d18, this.grad2(this.permutations[j5], d17, d19), this.grad(this.permutations[k5], d17 - 1.0f, 0.0f, d19)); - d15 = this.lerp(d18, this.grad(this.permutations[j5 + 1], d17, 0.0f, d19 - 1.0f), this.grad(this.permutations[k5 + 1], d17 - 1.0f, 0.0f, d19 - 1.0f)); - float d21 = this.lerp(d20, d14, d15); - int i7 = l5++; - noiseArray[i7] += d21 * d16; - } - } - } else { - int i = 0; - float d0 = 1.0f / noiseScale; - int k = -1; - int l = 0; - int i1 = 0; - int j1 = 0; - int k1 = 0; - int l1 = 0; - int i2 = 0; - float d1 = 0.0f; - float d2 = 0.0f; - float d3 = 0.0f; - float d4 = 0.0f; - - for (int l2 = 0; l2 < xSize; ++l2) { - float d5 = xOffset + (float) l2 * xScale + this.xCoord; - int i3 = (int) d5; - - if (d5 < (float) i3) { - --i3; - } - - int j3 = i3 & 255; - d5 = d5 - (float) i3; - float d6 = d5 * d5 * d5 * (d5 * (d5 * 6.0f - 15.0f) + 10.0f); - - for (int k3 = 0; k3 < zSize; ++k3) { - float d7 = zOffset + (float) k3 * zScale + this.zCoord; - int l3 = (int) d7; - - if (d7 < (float) l3) { - --l3; - } - - int i4 = l3 & 255; - d7 = d7 - (float) l3; - float d8 = d7 * d7 * d7 * (d7 * (d7 * 6.0f - 15.0f) + 10.0f); - - for (int j4 = 0; j4 < ySize; ++j4) { - float d9 = yOffset + (float) j4 * yScale + this.yCoord; - int k4 = (int) d9; - - if (d9 < (float) k4) { - --k4; - } - - int l4 = k4 & 255; - d9 = d9 - (float) k4; - float d10 = d9 * d9 * d9 * (d9 * (d9 * 6.0f - 15.0f) + 10.0f); - - if (j4 == 0 || l4 != k) { - k = l4; - l = this.permutations[j3] + l4; - i1 = this.permutations[l] + i4; - j1 = this.permutations[l + 1] + i4; - k1 = this.permutations[j3 + 1] + l4; - l1 = this.permutations[k1] + i4; - i2 = this.permutations[k1 + 1] + i4; - d1 = this.lerp(d6, this.grad(this.permutations[i1], d5, d9, d7), this.grad(this.permutations[l1], d5 - 1.0f, d9, d7)); - d2 = this.lerp(d6, this.grad(this.permutations[j1], d5, d9 - 1.0f, d7), this.grad(this.permutations[i2], d5 - 1.0f, d9 - 1.0f, d7)); - d3 = this.lerp(d6, this.grad(this.permutations[i1 + 1], d5, d9, d7 - 1.0f), this.grad(this.permutations[l1 + 1], d5 - 1.0f, d9, d7 - 1.0f)); - d4 = this.lerp(d6, this.grad(this.permutations[j1 + 1], d5, d9 - 1.0f, d7 - 1.0f), this.grad(this.permutations[i2 + 1], d5 - 1.0f, d9 - 1.0f, d7 - 1.0f)); - } - - float d11 = this.lerp(d10, d1, d2); - float d12 = this.lerp(d10, d3, d4); - float d13 = this.lerp(d8, d11, d12); - int j7 = i++; - noiseArray[j7] += d13 * d0; - } - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorOctavesF.java b/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorOctavesF.java deleted file mode 100644 index d01b0f256..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorOctavesF.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.level.generator.noise.vanilla.f; - -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.NukkitRandom; - -import java.util.Arrays; - -public class NoiseGeneratorOctavesF { - /** - * Collection of noise generation functions. Output is combined to produce different octaves of noise. - */ - private final NoiseGeneratorImprovedF[] generatorCollection; - private final int octaves; - - public NoiseGeneratorOctavesF(NukkitRandom seed, int octavesIn) { - this.octaves = octavesIn; - this.generatorCollection = new NoiseGeneratorImprovedF[octavesIn]; - - for (int i = 0; i < octavesIn; ++i) { - this.generatorCollection[i] = new NoiseGeneratorImprovedF(seed); - } - } - - /* - * pars:(par2,3,4=noiseOffset ; so that adjacent noise segments connect) (pars5,6,7=x,y,zArraySize),(pars8,10,12 = - * x,y,z noiseScale) - */ - public float[] generateNoiseOctaves(float[] noiseArray, int xOffset, int yOffset, int zOffset, int xSize, int ySize, int zSize, float xScale, float yScale, float zScale) { - if (noiseArray == null) { - noiseArray = new float[xSize * ySize * zSize]; - } else { - Arrays.fill(noiseArray, 0.0f); - } - - float d3 = 1.0f; - - for (int j = 0; j < this.octaves; ++j) { - float d0 = (float) xOffset * d3 * xScale; - float d1 = (float) yOffset * d3 * yScale; - float d2 = (float) zOffset * d3 * zScale; - int k = MathHelper.floor_float_int(d0); - int l = MathHelper.floor_float_int(d2); - d0 = d0 - (float) k; - d2 = d2 - (float) l; - k = k % 16777216; - l = l % 16777216; - d0 = d0 + (float) k; - d2 = d2 + (float) l; - this.generatorCollection[j].populateNoiseArray(noiseArray, d0, d1, d2, xSize, ySize, zSize, xScale * d3, yScale * d3, zScale * d3, d3); - d3 /= 2.0D; - } - - return noiseArray; - } - - /* - * Bouncer function to the main one with some default arguments. - */ - public float[] generateNoiseOctaves(float[] noiseArray, int xOffset, int zOffset, int xSize, int zSize, float xScale, float zScale, float p_76305_10_) { - return this.generateNoiseOctaves(noiseArray, xOffset, 10, zOffset, xSize, 1, zSize, xScale, 1.0f, zScale); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorPerlinF.java b/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorPerlinF.java deleted file mode 100644 index 58ef829d7..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorPerlinF.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.level.generator.noise.vanilla.f; - -import cn.nukkit.math.NukkitRandom; - -import java.util.Arrays; - -public class NoiseGeneratorPerlinF { - private final NoiseGeneratorSimplexF[] noiseLevels; - private final int levels; - - public NoiseGeneratorPerlinF(NukkitRandom p_i45470_1_, int p_i45470_2_) { - this.levels = p_i45470_2_; - this.noiseLevels = new NoiseGeneratorSimplexF[p_i45470_2_]; - - for (int i = 0; i < p_i45470_2_; ++i) { - this.noiseLevels[i] = new NoiseGeneratorSimplexF(p_i45470_1_); - } - } - - public float getValue(float p_151601_1_, float p_151601_3_) { - float d0 = 0.0f; - float d1 = 1.0f; - - for (int i = 0; i < this.levels; ++i) { - d0 += this.noiseLevels[i].getValue(p_151601_1_ * d1, p_151601_3_ * d1) / d1; - d1 /= 2.0f; - } - - return d0; - } - - public float[] getRegion(float[] p_151599_1_, float p_151599_2_, float p_151599_4_, int p_151599_6_, int p_151599_7_, float p_151599_8_, float p_151599_10_, float p_151599_12_) { - return this.getRegion(p_151599_1_, p_151599_2_, p_151599_4_, p_151599_6_, p_151599_7_, p_151599_8_, p_151599_10_, p_151599_12_, 0.5f); - } - - public float[] getRegion(float[] p_151600_1_, float p_151600_2_, float p_151600_4_, int p_151600_6_, int p_151600_7_, float p_151600_8_, float p_151600_10_, float p_151600_12_, float p_151600_14_) { - if (p_151600_1_ != null && p_151600_1_.length >= p_151600_6_ * p_151600_7_) { - Arrays.fill(p_151600_1_, 0.0f); - } else { - p_151600_1_ = new float[p_151600_6_ * p_151600_7_]; - } - - float d1 = 1.0f; - float d0 = 1.0f; - - for (int j = 0; j < this.levels; ++j) { - this.noiseLevels[j].add(p_151600_1_, p_151600_2_, p_151600_4_, p_151600_6_, p_151600_7_, p_151600_8_ * d0 * d1, p_151600_10_ * d0 * d1, 0.55f / d1); - d0 *= p_151600_12_; - d1 *= p_151600_14_; - } - - return p_151600_1_; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorSimplexF.java b/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorSimplexF.java deleted file mode 100644 index d55d59e41..000000000 --- a/src/main/java/cn/nukkit/level/generator/noise/vanilla/f/NoiseGeneratorSimplexF.java +++ /dev/null @@ -1,182 +0,0 @@ -package cn.nukkit.level.generator.noise.vanilla.f; - -import cn.nukkit.math.NukkitRandom; - -public class NoiseGeneratorSimplexF { - public static final float SQRT_3 = (float) Math.sqrt(3.0f); - private static final int[][] grad3 = new int[][]{{1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1}}; - private static final float F2 = 0.5f * (SQRT_3 - 1.0f); - private static final float G2 = (3.0f - SQRT_3) / 6.0f; - private final int[] p; - public float xo; - public float yo; - public float zo; - - public NoiseGeneratorSimplexF() { - this(new NukkitRandom(System.currentTimeMillis())); - } - - public NoiseGeneratorSimplexF(NukkitRandom p_i45471_1_) { - this.p = new int[512]; - this.xo = p_i45471_1_.nextFloat() * 256.0f; - this.yo = p_i45471_1_.nextFloat() * 256.0f; - this.zo = p_i45471_1_.nextFloat() * 256.0f; - - int i = 0; - while (i < 256) { - this.p[i] = i++; - } - - for (int l = 0; l < 256; ++l) { - int j = p_i45471_1_.nextBoundedInt(256 - l) + l; - int k = this.p[l]; - this.p[l] = this.p[j]; - this.p[j] = k; - this.p[l + 256] = this.p[l]; - } - } - - private static int fastFloor(float value) { - return value > 0.0f ? (int) value : (int) value - 1; - } - - private static float dot(int[] p_151604_0_, float p_151604_1_, float p_151604_3_) { - return (float) p_151604_0_[0] * p_151604_1_ + (float) p_151604_0_[1] * p_151604_3_; - } - - public float getValue(float p_151605_1_, float p_151605_3_) { - float d3 = 0.5f * (SQRT_3 - 1.0f); - float d4 = (p_151605_1_ + p_151605_3_) * d3; - int i = fastFloor(p_151605_1_ + d4); - int j = fastFloor(p_151605_3_ + d4); - float d5 = (3.0f - SQRT_3) / 6.0f; - float d6 = (float) (i + j) * d5; - float d7 = (float) i - d6; - float d8 = (float) j - d6; - float d9 = p_151605_1_ - d7; - float d10 = p_151605_3_ - d8; - int k; - int l; - - if (d9 > d10) { - k = 1; - l = 0; - } else { - k = 0; - l = 1; - } - - float d11 = d9 - (float) k + d5; - float d12 = d10 - (float) l + d5; - float d13 = d9 - 1.0f + 2.0f * d5; - float d14 = d10 - 1.0f + 2.0f * d5; - int i1 = i & 255; - int j1 = j & 255; - int k1 = this.p[i1 + this.p[j1]] % 12; - int l1 = this.p[i1 + k + this.p[j1 + l]] % 12; - int i2 = this.p[i1 + 1 + this.p[j1 + 1]] % 12; - float d15 = 0.5f - d9 * d9 - d10 * d10; - float d0; - - if (d15 < 0.0f) { - d0 = 0.0f; - } else { - d15 = d15 * d15; - d0 = d15 * d15 * dot(grad3[k1], d9, d10); - } - - float d16 = 0.5f - d11 * d11 - d12 * d12; - float d1; - - if (d16 < 0.0f) { - d1 = 0.0f; - } else { - d16 = d16 * d16; - d1 = d16 * d16 * dot(grad3[l1], d11, d12); - } - - float d17 = 0.5f - d13 * d13 - d14 * d14; - float d2; - - if (d17 < 0.0f) { - d2 = 0.0f; - } else { - d17 = d17 * d17; - d2 = d17 * d17 * dot(grad3[i2], d13, d14); - } - - return 70.0f * (d0 + d1 + d2); - } - - public void add(float[] p_151606_1_, float p_151606_2_, float p_151606_4_, int p_151606_6_, int p_151606_7_, float p_151606_8_, float p_151606_10_, float p_151606_12_) { - int i = 0; - - for (int j = 0; j < p_151606_7_; ++j) { - float d0 = (p_151606_4_ + (float) j) * p_151606_10_ + this.yo; - - for (int k = 0; k < p_151606_6_; ++k) { - float d1 = (p_151606_2_ + (float) k) * p_151606_8_ + this.xo; - float d5 = (d1 + d0) * F2; - int l = fastFloor(d1 + d5); - int i1 = fastFloor(d0 + d5); - float d6 = (float) (l + i1) * G2; - float d7 = (float) l - d6; - float d8 = (float) i1 - d6; - float d9 = d1 - d7; - float d10 = d0 - d8; - int j1; - int k1; - - if (d9 > d10) { - j1 = 1; - k1 = 0; - } else { - j1 = 0; - k1 = 1; - } - - float d11 = d9 - (float) j1 + G2; - float d12 = d10 - (float) k1 + G2; - float d13 = d9 - 1.0f + 2.0f * G2; - float d14 = d10 - 1.0f + 2.0f * G2; - int l1 = l & 255; - int i2 = i1 & 255; - int j2 = this.p[l1 + this.p[i2]] % 12; - int k2 = this.p[l1 + j1 + this.p[i2 + k1]] % 12; - int l2 = this.p[l1 + 1 + this.p[i2 + 1]] % 12; - float d15 = 0.5f - d9 * d9 - d10 * d10; - float d2; - - if (d15 < 0.0f) { - d2 = 0.0f; - } else { - d15 = d15 * d15; - d2 = d15 * d15 * dot(grad3[j2], d9, d10); - } - - float d16 = 0.5f - d11 * d11 - d12 * d12; - float d3; - - if (d16 < 0.0f) { - d3 = 0.0f; - } else { - d16 = d16 * d16; - d3 = d16 * d16 * dot(grad3[k2], d11, d12); - } - - float d17 = 0.5f - d13 * d13 - d14 * d14; - float d4; - - if (d17 < 0.0f) { - d4 = 0.0f; - } else { - d17 = d17 * d17; - d4 = d17 * d17 * dot(grad3[l2], d13, d14); - } - - int i3 = i++; - p_151606_1_[i3] += 70.0f * (d2 + d3 + d4) * p_151606_12_; - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/BasicGenerator.java b/src/main/java/cn/nukkit/level/generator/object/BasicGenerator.java deleted file mode 100644 index 2e4e6bf83..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/BasicGenerator.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.level.generator.object; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public abstract class BasicGenerator { - - public abstract boolean generate(ChunkManager level, NukkitRandom rand, Vector3 position); - - protected void setBlockAndNotifyAdequately(ChunkManager level, BlockVector3 pos, Block state) { - setBlock(level, new Vector3(pos.x, pos.y, pos.z), state); - } - - protected void setBlockAndNotifyAdequately(ChunkManager level, Vector3 pos, Block state) { - setBlock(level, pos, state); - } - - protected void setBlock(ChunkManager level, Vector3 v, Block b) { - level.setBlockAt((int) v.x, (int) v.y, (int) v.z, b.getId(), b.getDamage()); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/object/ObjectTallGrass.java b/src/main/java/cn/nukkit/level/generator/object/ObjectTallGrass.java deleted file mode 100644 index c4b946e3a..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/ObjectTallGrass.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.level.generator.object; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -/** - * @author ItsLucas - * Nukkit Project - */ - -public class ObjectTallGrass { - - public static void growGrass(ChunkManager level, Vector3 pos, NukkitRandom random) { - for (int i = 0; i < 128; ++i) { - int num = 0; - - int x = pos.getFloorX(); - int y = pos.getFloorY() + 1; - int z = pos.getFloorZ(); - - while (true) { - if (num >= i >> 4) { - if (level.getBlockIdAt(x, y, z) == Block.AIR) { - if (random.nextBoundedInt(8) == 0) { - if (random.nextBoolean()) { - level.setBlockAt(x, y, z, Block.DANDELION); - } else { - level.setBlockAt(x, y, z, Block.POPPY); - } - } else { - level.setBlockAt(x, y, z, Block.TALL_GRASS, 1); - } - } - - break; - } - - x += random.nextRange(-1, 1); - y += random.nextRange(-1, 1) * random.nextBoundedInt(3) >> 1; - z += random.nextRange(-1, 1); - - if (level.getBlockIdAt(x, y - 1, z) != Block.GRASS || y > 255 || y < 0) { - break; - } - - ++num; - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/mushroom/BigMushroom.java b/src/main/java/cn/nukkit/level/generator/object/mushroom/BigMushroom.java deleted file mode 100644 index 4dc835df0..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/mushroom/BigMushroom.java +++ /dev/null @@ -1,202 +0,0 @@ -package cn.nukkit.level.generator.object.mushroom; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.generator.object.BasicGenerator; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class BigMushroom extends BasicGenerator { - public static final int NORTH_WEST = 1; - public static final int NORTH = 2; - public static final int NORTH_EAST = 3; - public static final int WEST = 4; - public static final int CENTER = 5; - public static final int EAST = 6; - public static final int SOUTH_WEST = 7; - public static final int SOUTH = 8; - public static final int SOUTH_EAST = 9; - public static final int STEM = 10; - public static final int ALL_INSIDE = 0; - public static final int ALL_OUTSIDE = 14; - public static final int ALL_STEM = 15; - - public static final int BROWN = 0; - public static final int RED = 1; - /** - * The mushroom type. 0 for brown, 1 for red. - */ - private int mushroomType; - - public BigMushroom(int mushroomType) { - this.mushroomType = mushroomType; - } - - public BigMushroom() { - this.mushroomType = -1; - } - - public boolean generate(ChunkManager level, NukkitRandom rand, Vector3 position) { - int block = this.mushroomType; - if (block < 0) { - block = rand.nextBoolean() ? RED : BROWN; - } - - Block mushroom = block == 0 ? Block.get(BlockID.BROWN_MUSHROOM_BLOCK) : Block.get(BlockID.RED_MUSHROOM_BLOCK); - - int i = rand.nextBoundedInt(3) + 4; - - if (rand.nextBoundedInt(12) == 0) { - i <<= 1; - } - - boolean flag = true; - - if (position.getY() >= 1 && position.getY() + i + 1 < 256) { - for (int j = position.getFloorY(); j <= position.getY() + 1 + i; ++j) { - int k = 3; - - if (j <= position.getY() + 3) { - k = 0; - } - - Vector3 pos = new Vector3(); - - for (int l = position.getFloorX() - k; l <= position.getX() + k && flag; ++l) { - for (int i1 = position.getFloorZ() - k; i1 <= position.getZ() + k && flag; ++i1) { - if (j >= 0 && j < 256) { - pos.setComponents(l, j, i1); - int material = level.getBlockIdAt(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ()); - - if (material != Block.AIR && material != Block.LEAVES) { - flag = false; - } - } else { - flag = false; - } - } - } - } - - if (!flag) { - return false; - } else { - Vector3 pos2 = position.down(); - int block1 = level.getBlockIdAt(pos2.getFloorX(), pos2.getFloorY(), pos2.getFloorZ()); - - if (block1 != Block.DIRT && block1 != Block.GRASS && block1 != Block.MYCELIUM) { - return false; - } else { - int k2 = position.getFloorY() + i; - - if (block == RED) { - k2 = position.getFloorY() + i - 3; - } - - for (int l2 = k2; l2 <= position.getY() + i; ++l2) { - int j3 = 1; - - if (l2 < position.getY() + i) { - ++j3; - } - - if (block == BROWN) { - j3 = 3; - } - - int k3 = position.getFloorX() - j3; - int l3 = position.getFloorX() + j3; - int j1 = position.getFloorZ() - j3; - int k1 = position.getFloorZ() + j3; - - for (int l1 = k3; l1 <= l3; ++l1) { - for (int i2 = j1; i2 <= k1; ++i2) { - int j2 = 5; - - if (l1 == k3) { - --j2; - } else if (l1 == l3) { - ++j2; - } - - if (i2 == j1) { - j2 -= 3; - } else if (i2 == k1) { - j2 += 3; - } - - int meta = j2; - - if (block == BROWN || l2 < position.getY() + i) { - if ((l1 == k3 || l1 == l3) && (i2 == j1 || i2 == k1)) { - continue; - } - - if (l1 == position.getX() - (j3 - 1) && i2 == j1) { - meta = NORTH_WEST; - } - - if (l1 == k3 && i2 == position.getZ() - (j3 - 1)) { - meta = NORTH_WEST; - } - - if (l1 == position.getX() + (j3 - 1) && i2 == j1) { - meta = NORTH_EAST; - } - - if (l1 == l3 && i2 == position.getZ() - (j3 - 1)) { - meta = NORTH_EAST; - } - - if (l1 == position.getX() - (j3 - 1) && i2 == k1) { - meta = SOUTH_WEST; - } - - if (l1 == k3 && i2 == position.getZ() + (j3 - 1)) { - meta = SOUTH_WEST; - } - - if (l1 == position.getX() + (j3 - 1) && i2 == k1) { - meta = SOUTH_EAST; - } - - if (l1 == l3 && i2 == position.getZ() + (j3 - 1)) { - meta = SOUTH_EAST; - } - } - - if (meta == CENTER && l2 < position.getY() + i) { - meta = ALL_INSIDE; - } - - if (position.getY() >= position.getY() + i - 1 || meta != ALL_INSIDE) { - Vector3 blockPos = new Vector3(l1, l2, i2); - - if (!Block.solid[level.getBlockIdAt(blockPos.getFloorX(), blockPos.getFloorY(), blockPos.getFloorZ())]) { - mushroom.setDamage(meta); - this.setBlockAndNotifyAdequately(level, blockPos, mushroom); - } - } - } - } - } - - for (int i3 = 0; i3 < i; ++i3) { - Vector3 pos = position.up(i3); - int id = level.getBlockIdAt(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ()); - - if (!Block.solid[id]) { - mushroom.setDamage(STEM); - this.setBlockAndNotifyAdequately(level, pos, mushroom); - } - } - - return true; - } - } - } else { - return false; - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/ore/OreType.java b/src/main/java/cn/nukkit/level/generator/object/ore/OreType.java deleted file mode 100644 index 2e06274aa..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/ore/OreType.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.nukkit.level.generator.object.ore; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.NukkitRandom; - -import static cn.nukkit.block.BlockID.STONE; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class OreType { - - public final int fullId; - public final int clusterCount; - public final int clusterSize; - public final int maxHeight; - public final int minHeight; - public final int replaceBlockId; - - public OreType(Block material, int clusterCount, int clusterSize, int minHeight, int maxHeight) { - this(material, clusterCount, clusterSize, minHeight, maxHeight, STONE); - } - - public OreType(Block material, int clusterCount, int clusterSize, int minHeight, int maxHeight, int replaceBlockId) { - this.fullId = material.getFullId(); - this.clusterCount = clusterCount; - this.clusterSize = clusterSize; - this.maxHeight = maxHeight; - this.minHeight = minHeight; - this.replaceBlockId = replaceBlockId; - } - - public boolean spawn(ChunkManager level, NukkitRandom rand, int replaceId, int x, int y, int z) { - float piScaled = rand.nextFloat() * (float) Math.PI; - double scaleMaxX = (float) (x + 8) + MathHelper.sin(piScaled) * (float) clusterSize / 8.0F; - double scaleMinX = (float) (x + 8) - MathHelper.sin(piScaled) * (float) clusterSize / 8.0F; - double scaleMaxZ = (float) (z + 8) + MathHelper.cos(piScaled) * (float) clusterSize / 8.0F; - double scaleMinZ = (float) (z + 8) - MathHelper.cos(piScaled) * (float) clusterSize / 8.0F; - double scaleMaxY = y + rand.nextBoundedInt(3) - 2; - double scaleMinY = y + rand.nextBoundedInt(3) - 2; - - for (int i = 0; i < clusterSize; ++i) { - float sizeIncr = (float) i / (float) clusterSize; - double scaleX = scaleMaxX + (scaleMinX - scaleMaxX) * (double) sizeIncr; - double scaleY = scaleMaxY + (scaleMinY - scaleMaxY) * (double) sizeIncr; - double scaleZ = scaleMaxZ + (scaleMinZ - scaleMaxZ) * (double) sizeIncr; - double randSizeOffset = rand.nextDouble() * (double) clusterSize / 16.0D; - double randVec1 = (double) (MathHelper.sin((float) Math.PI * sizeIncr) + 1.0F) * randSizeOffset + 1.0D; - double randVec2 = (double) (MathHelper.sin((float) Math.PI * sizeIncr) + 1.0F) * randSizeOffset + 1.0D; - int minX = MathHelper.floor(scaleX - randVec1 / 2.0D); - int minY = MathHelper.floor(scaleY - randVec2 / 2.0D); - int minZ = MathHelper.floor(scaleZ - randVec1 / 2.0D); - int maxX = MathHelper.floor(scaleX + randVec1 / 2.0D); - int maxY = MathHelper.floor(scaleY + randVec2 / 2.0D); - int maxZ = MathHelper.floor(scaleZ + randVec1 / 2.0D); - - for (int xSeg = minX; xSeg <= maxX; ++xSeg) { - double xVal = ((double) xSeg + 0.5D - scaleX) / (randVec1 / 2.0D); - - if (xVal * xVal < 1.0D) { - for (int ySeg = minY; ySeg <= maxY; ++ySeg) { - double yVal = ((double) ySeg + 0.5D - scaleY) / (randVec2 / 2.0D); - - if (xVal * xVal + yVal * yVal < 1.0D) { - for (int zSeg = minZ; zSeg <= maxZ; ++zSeg) { - double zVal = ((double) zSeg + 0.5D - scaleZ) / (randVec1 / 2.0D); - - if (xVal * xVal + yVal * yVal + zVal * zVal < 1.0D) { - if (level.getBlockIdAt(xSeg, ySeg, zSeg) == replaceBlockId) { - level.setBlockFullIdAt(xSeg, ySeg, zSeg, fullId); - } - } - } - } - } - } - } - } - - return true; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/object/structure/ObjectFallenTree.java b/src/main/java/cn/nukkit/level/generator/object/structure/ObjectFallenTree.java deleted file mode 100644 index 6469da06d..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/structure/ObjectFallenTree.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.nukkit.level.generator.object.structure; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; - -/** - * Created by PetteriM1 - */ -public class ObjectFallenTree { - - public ObjectFallenTree(ChunkManager level, int x, int y, int z, int type, NukkitRandom random) { - placeObject(level, x, y, z, type, random); - } - - public void placeObject(ChunkManager level, int x, int y, int z, int type, NukkitRandom random) { - int direction = random.nextRange(1, 2); - if (direction == 1 && type == 0) { //oak tree - //tree - level.setBlockAt(x - 1, y, z, Block.WOOD); - level.setBlockAt(x + 1, y, z, Block.WOOD, 12); - level.setBlockAt(x + 2, y, z, Block.WOOD, 12); - //vines - level.setBlockAt(x - 2, y, z, Block.VINES, 8); - level.setBlockAt(x - 1, y, z + 1, Block.VINES, 4); - level.setBlockAt(x - 1, y, z - 1, Block.VINES, 1); - } else if (direction == 1 && type == 1) { //birch - //tree - level.setBlockAt(x - 1, y, z, Block.WOOD, 2); - level.setBlockAt(x + 1, y, z, Block.WOOD, 14); - level.setBlockAt(x + 2, y, z, Block.WOOD, 14); - level.setBlockAt(x + 3, y, z, Block.WOOD, 14); - //vines - level.setBlockAt(x - 2, y, z, Block.VINES, 8); - level.setBlockAt(x - 1, y, z + 1, Block.VINES, 4); - level.setBlockAt(x - 1, y, z - 1, Block.VINES, 1); - //mushrooms - level.setBlockAt(x + 1, y + 1, z, Block.BROWN_MUSHROOM); - level.setBlockAt(x + 3, y + 1, z, Block.RED_MUSHROOM); - } else if (direction == 2 && type == 0) { //oak tree - //tree - level.setBlockAt(x, y, z - 1, Block.WOOD); - level.setBlockAt(x, y, z + 1, Block.WOOD, 12); - level.setBlockAt(x, y, z + 2, Block.WOOD, 12); - //vines - level.setBlockAt(x, y, z - 2, Block.VINES, 1); - level.setBlockAt(x + 1, y, z - 1, Block.VINES, 2); - level.setBlockAt(x - 1, y, z - 1, Block.VINES, 8); - } else if (direction == 2 && type == 1) { //birch - //tree - level.setBlockAt(x, y, z - 1, Block.WOOD, 2); - level.setBlockAt(x, y, z + 1, Block.WOOD, 14); - level.setBlockAt(x, y, z + 2, Block.WOOD, 14); - level.setBlockAt(x, y, z + 3, Block.WOOD, 14); - //vines - level.setBlockAt(x, y, z - 2, Block.VINES, 1); - level.setBlockAt(x + 1, y, z - 1, Block.VINES, 2); - level.setBlockAt(x - 1, y, z - 1, Block.VINES, 8); - //mushrooms - level.setBlockAt(x, y + 1, z + 1, Block.BROWN_MUSHROOM); - level.setBlockAt(x, y + 1, z + 3, Block.RED_MUSHROOM); - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/structure/ObjectWell.java b/src/main/java/cn/nukkit/level/generator/object/structure/ObjectWell.java deleted file mode 100644 index 78d46172b..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/structure/ObjectWell.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.nukkit.level.generator.object.structure; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; - -/** - * Created by PetteriM1 - */ -public class ObjectWell { - - public ObjectWell(ChunkManager level, int x, int y, int z) { - if (canPlaceObject(level, x, y, z)) { - placeObject(level, x, y, z); - } - } - - public boolean canPlaceObject(ChunkManager level, int x, int y, int z) { - int radiusToCheck = 0; - for (int yy = 0; yy < 8; ++yy) { - if (yy == 1 || yy == 5) { - ++radiusToCheck; - } - for (int xx = -radiusToCheck; xx < (radiusToCheck + 1); ++xx) { - for (int zz = -radiusToCheck; zz < (radiusToCheck + 1); ++zz) { - if (level.getBlockIdAt(x + xx, y + yy, z + zz) != Block.AIR) { - return false; - } - } - } - } - - return true; - } - - public void placeObject(ChunkManager level, int x, int y, int z) { - for (int yy = y - 3 + 5; yy <= y + 5; ++yy) { - double yOff = yy - (y + 5); - int mid = (int) (1 - yOff / 2); - for (int xx = x - mid; xx <= x + mid; ++xx) { - for (int zz = z - mid; zz <= z + mid; ++zz) { - level.setBlockAt(xx, yy - 3, zz, Block.SANDSTONE); - } - } - } - - //slabs for all sides - level.setBlockAt(x + 2, y, z, Block.SLAB, 1); - level.setBlockAt(x - 2, y, z, Block.SLAB, 1); - level.setBlockAt(x, y, z + 2, Block.SLAB, 1); - level.setBlockAt(x, y, z - 2, Block.SLAB, 1); - - //water - level.setBlockAt(x, y, z, Block.WATER); - level.setBlockAt(x + 1, y, z, Block.WATER); - level.setBlockAt(x - 1, y, z, Block.WATER); - level.setBlockAt(x, y, z + 1, Block.WATER); - level.setBlockAt(x, y, z - 1, Block.WATER); - - //air - level.setBlockAt(x, y + 1, z, Block.AIR); - level.setBlockAt(x + 1, y + 1, z, Block.AIR); - level.setBlockAt(x - 1, y + 1, z, Block.AIR); - level.setBlockAt(x, y + 1, z + 1, Block.AIR); - level.setBlockAt(x, y + 1, z - 1, Block.AIR); - - //more air - level.setBlockAt(x, y + 2, z, Block.AIR); - level.setBlockAt(x + 1, y + 2, z, Block.AIR); - level.setBlockAt(x - 1, y + 2, z, Block.AIR); - level.setBlockAt(x, y + 2, z + 1, Block.AIR); - level.setBlockAt(x, y + 2, z - 1, Block.AIR); - - //roof - level.setBlockAt(x, y + 3, z, Block.SANDSTONE); - level.setBlockAt(x + 1, y + 3, z, Block.SLAB, 1); - level.setBlockAt(x - 1, y + 3, z, Block.SLAB, 1); - level.setBlockAt(x, y + 3, z + 1, Block.SLAB, 1); - level.setBlockAt(x, y + 3, z - 1, Block.SLAB, 1); - level.setBlockAt(x + 1, y + 3, z + 1, Block.SLAB, 1); - level.setBlockAt(x + 1, y + 3, z - 1, Block.SLAB, 1); - level.setBlockAt(x - 1, y + 3, z - 1, Block.SLAB, 1); - level.setBlockAt(x - 1, y + 3, z + 1, Block.SLAB, 1); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/HugeTreesGenerator.java b/src/main/java/cn/nukkit/level/generator/object/tree/HugeTreesGenerator.java deleted file mode 100644 index b0c76c585..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/HugeTreesGenerator.java +++ /dev/null @@ -1,147 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public abstract class HugeTreesGenerator extends TreeGenerator { - /** - * The base height of the tree - */ - protected final int baseHeight; - - /** - * Sets the metadata for the wood blocks used - */ - protected final Block woodMetadata; - - /** - * Sets the metadata for the leaves used in huge trees - */ - protected final Block leavesMetadata; - protected int extraRandomHeight; - - public HugeTreesGenerator(int baseHeightIn, int extraRandomHeightIn, Block woodMetadataIn, Block leavesMetadataIn) { - this.baseHeight = baseHeightIn; - this.extraRandomHeight = extraRandomHeightIn; - this.woodMetadata = woodMetadataIn; - this.leavesMetadata = leavesMetadataIn; - } - - /** - * Calculates the height based on this trees base height and its extra random height - */ - protected int getHeight(NukkitRandom rand) { - int i = rand.nextBoundedInt(3) + this.baseHeight; - - if (this.extraRandomHeight > 1) { - i += rand.nextBoundedInt(this.extraRandomHeight); - } - - return i; - } - - /** - * returns whether or not there is space for a tree to grow at a certain position - */ - private boolean isSpaceAt(ChunkManager worldIn, Vector3 leavesPos, int height) { - boolean flag = true; - - if (leavesPos.getY() >= 1 && leavesPos.getY() + height + 1 <= 256) { - for (int i = 0; i <= 1 + height; ++i) { - int j = 2; - - if (i == 0) { - j = 1; - } else if (i >= 1 + height - 2) { - j = 2; - } - - for (int k = -j; k <= j && flag; ++k) { - for (int l = -j; l <= j && flag; ++l) { - Vector3 blockPos = leavesPos.add(k, i, l); - if (leavesPos.getY() + i < 0 || leavesPos.getY() + i >= 256 || !this.canGrowInto(worldIn.getBlockIdAt((int) blockPos.x, (int) blockPos.y, (int) blockPos.z))) { - flag = false; - } - } - } - } - - return flag; - } else { - return false; - } - } - - /** - * returns whether or not there is dirt underneath the block where the tree will be grown. - * It also generates dirt around the block in a 2x2 square if there is dirt underneath the blockpos. - */ - private boolean ensureDirtsUnderneath(Vector3 pos, ChunkManager worldIn) { - Vector3 blockpos = pos.down(); - int block = worldIn.getBlockIdAt((int) blockpos.x, (int) blockpos.y, (int) blockpos.z); - - if ((block == Block.GRASS || block == Block.DIRT) && pos.getY() >= 2) { - this.setDirtAt(worldIn, blockpos); - this.setDirtAt(worldIn, blockpos.east()); - this.setDirtAt(worldIn, blockpos.south()); - this.setDirtAt(worldIn, blockpos.south().east()); - return true; - } else { - return false; - } - } - - /** - * returns whether or not a tree can grow at a specific position. - * If it can, it generates surrounding dirt underneath. - */ - protected boolean ensureGrowable(ChunkManager worldIn, Vector3 treePos, int p_175929_4_) { - return this.isSpaceAt(worldIn, treePos, p_175929_4_) && this.ensureDirtsUnderneath(treePos, worldIn); - } - - /** - * grow leaves in a circle with the outsides being within the circle - */ - protected void growLeavesLayerStrict(ChunkManager worldIn, Vector3 layerCenter, int width) { - int i = width * width; - - for (int j = -width; j <= width + 1; ++j) { - for (int k = -width; k <= width + 1; ++k) { - int l = j - 1; - int i1 = k - 1; - - if (j * j + k * k <= i || l * l + i1 * i1 <= i || j * j + i1 * i1 <= i || l * l + k * k <= i) { - Vector3 blockpos = layerCenter.add(j, 0, k); - int id = worldIn.getBlockIdAt((int) blockpos.x, (int) blockpos.y, (int) blockpos.z); - - if (id == Block.AIR || id == Block.LEAVES) { - this.setBlockAndNotifyAdequately(worldIn, blockpos, this.leavesMetadata); - } - } - } - } - } - - /** - * grow leaves in a circle - */ - protected void growLeavesLayer(ChunkManager worldIn, Vector3 layerCenter, int width) { - int i = width * width; - - for (int j = -width; j <= width; ++j) { - for (int k = -width; k <= width; ++k) { - if (j * j + k * k <= i) { - Vector3 blockpos = layerCenter.add(j, 0, k); - int id = worldIn.getBlockIdAt((int) blockpos.x, (int) blockpos.y, (int) blockpos.z); - - if (id == Block.AIR || id == Block.LEAVES) { - this.setBlockAndNotifyAdequately(worldIn, blockpos, this.leavesMetadata); - } - } - } - } - } -} - diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/NewJungleTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/NewJungleTree.java deleted file mode 100644 index ed0d94cae..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/NewJungleTree.java +++ /dev/null @@ -1,233 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.*; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -/** - * Created by CreeperFace on 26. 10. 2016. - */ -public class NewJungleTree extends TreeGenerator { - - /** - * The minimum height of a generated tree. - */ - private final int minTreeHeight; - - /** - * The maxium height of a generated tree. - */ - private final int maxTreeHeight; - - /** - * The metadata value of the wood to use in tree generation. - */ - private final Block metaWood = Block.get(BlockID.WOOD, BlockWood.JUNGLE); - - /** - * The metadata value of the leaves to use in tree generation. - */ - private final Block metaLeaves = Block.get(BlockID.LEAVES, BlockLeaves.JUNGLE); - - public NewJungleTree(int minTreeHeight) { - this(minTreeHeight, 3); - } - - public NewJungleTree(int minTreeHeight, int maxTreeHeight) { - this.minTreeHeight = minTreeHeight; - this.maxTreeHeight = maxTreeHeight; - } - - @Override - public boolean generate(ChunkManager worldIn, NukkitRandom rand, Vector3 vectorPosition) { - BlockVector3 position = new BlockVector3(vectorPosition.getFloorX(), vectorPosition.getFloorY(), vectorPosition.getFloorZ()); - - int i = rand.nextBoundedInt(maxTreeHeight) + this.minTreeHeight; - boolean flag = true; - - if (position.getY() >= 1 && position.getY() + i + 1 <= 256) { - for (int j = position.getY(); j <= position.getY() + 1 + i; ++j) { - int k = 1; - - if (j == position.getY()) { - k = 0; - } - - if (j >= position.getY() + 1 + i - 2) { - k = 2; - } - - BlockVector3 pos2 = new BlockVector3(); - - for (int l = position.getX() - k; l <= position.getX() + k && flag; ++l) { - for (int i1 = position.getZ() - k; i1 <= position.getZ() + k && flag; ++i1) { - if (j >= 0 && j < 256) { - pos2.setComponents(l, j, i1); - if (!this.canGrowInto(worldIn.getBlockIdAt(pos2.x, pos2.y, pos2.z))) { - flag = false; - } - } else { - flag = false; - } - } - } - } - - if (!flag) { - return false; - } else { - BlockVector3 down = position.down(); - int block = worldIn.getBlockIdAt(down.x, down.y, down.z); - - if ((block == Block.GRASS || block == Block.DIRT || block == Block.FARMLAND) && position.getY() < 256 - i - 1) { - this.setDirtAt(worldIn, down); - - for (int i3 = position.getY() - 3 + i; i3 <= position.getY() + i; ++i3) { - int i4 = i3 - (position.getY() + i); - int j1 = 1 - (i4 >> 1); - - for (int k1 = position.getX() - j1; k1 <= position.getX() + j1; ++k1) { - int l1 = k1 - position.getX(); - - for (int i2 = position.getZ() - j1; i2 <= position.getZ() + j1; ++i2) { - int j2 = i2 - position.getZ(); - - if (Math.abs(l1) != j1 || Math.abs(j2) != j1 || rand.nextBoundedInt(2) != 0 && i4 != 0) { - BlockVector3 blockpos = new BlockVector3(k1, i3, i2); - int id = worldIn.getBlockIdAt(blockpos.x, blockpos.y, blockpos.z); - - if (id == Block.AIR || id == Block.LEAVES || id == Block.VINE) { - this.setBlockAndNotifyAdequately(worldIn, blockpos, this.metaLeaves); - } - } - } - } - } - - for (int j3 = 0; j3 < i; ++j3) { - BlockVector3 up = position.up(j3); - int id = worldIn.getBlockIdAt(up.x, up.y, up.z); - - if (id == Block.AIR || id == Block.LEAVES || id == Block.VINE) { - this.setBlockAndNotifyAdequately(worldIn, up, this.metaWood); - - if (j3 > 0) { - if (rand.nextBoundedInt(3) > 0 && isAirBlock(worldIn, position.add(-1, j3, 0))) { - this.addVine(worldIn, position.add(-1, j3, 0), 8); - } - - if (rand.nextBoundedInt(3) > 0 && isAirBlock(worldIn, position.add(1, j3, 0))) { - this.addVine(worldIn, position.add(1, j3, 0), 2); - } - - if (rand.nextBoundedInt(3) > 0 && isAirBlock(worldIn, position.add(0, j3, -1))) { - this.addVine(worldIn, position.add(0, j3, -1), 1); - } - - if (rand.nextBoundedInt(3) > 0 && isAirBlock(worldIn, position.add(0, j3, 1))) { - this.addVine(worldIn, position.add(0, j3, 1), 4); - } - } - } - } - - for (int k3 = position.getY() - 3 + i; k3 <= position.getY() + i; ++k3) { - int j4 = k3 - (position.getY() + i); - int k4 = 2 - (j4 >> 1); - BlockVector3 pos2 = new BlockVector3(); - - for (int l4 = position.getX() - k4; l4 <= position.getX() + k4; ++l4) { - for (int i5 = position.getZ() - k4; i5 <= position.getZ() + k4; ++i5) { - pos2.setComponents(l4, k3, i5); - - if (worldIn.getBlockIdAt(pos2.x, pos2.y, pos2.z) == Block.LEAVES) { - BlockVector3 blockpos2 = pos2.west(); - BlockVector3 blockpos3 = pos2.east(); - BlockVector3 blockpos4 = pos2.north(); - BlockVector3 blockpos1 = pos2.south(); - - if (rand.nextBoundedInt(4) == 0 && worldIn.getBlockIdAt(blockpos2.x, blockpos2.y, blockpos2.z) == Block.AIR) { - this.addHangingVine(worldIn, blockpos2, 8); - } - - if (rand.nextBoundedInt(4) == 0 && worldIn.getBlockIdAt(blockpos3.x, blockpos3.y, blockpos3.z) == Block.AIR) { - this.addHangingVine(worldIn, blockpos3, 2); - } - - if (rand.nextBoundedInt(4) == 0 && worldIn.getBlockIdAt(blockpos4.x, blockpos4.y, blockpos4.z) == Block.AIR) { - this.addHangingVine(worldIn, blockpos4, 1); - } - - if (rand.nextBoundedInt(4) == 0 && worldIn.getBlockIdAt(blockpos1.x, blockpos1.y, blockpos1.z) == Block.AIR) { - this.addHangingVine(worldIn, blockpos1, 4); - } - } - } - } - } - - if (rand.nextBoundedInt(5) == 0 && i > 5) { - for (int l3 = 0; l3 < 2; ++l3) { - for (BlockFace enumfacing : BlockFace.Plane.HORIZONTAL) { - if (rand.nextBoundedInt(4 - l3) == 0) { - BlockFace enumfacing1 = enumfacing.getOpposite(); - this.placeCocoa(worldIn, /*rand.nextBoundedInt(3),*/ position.add(enumfacing1.getXOffset(), i - 5 + l3, enumfacing1.getZOffset()), enumfacing); - } - } - } - } - - return true; - } else { - return false; - } - } - } else { - return false; - } - } - - private void placeCocoa(ChunkManager worldIn, /*int age,*/ BlockVector3 pos, BlockFace side) { - this.setBlockAndNotifyAdequately(worldIn, pos, new BlockUnknown(127, getCocoaMeta(side.getIndex()))); - } - - private void addVine(ChunkManager worldIn, BlockVector3 pos, int meta) { - this.setBlockAndNotifyAdequately(worldIn, pos, Block.get(BlockID.VINE, meta)); - } - - private void addHangingVine(ChunkManager worldIn, BlockVector3 pos, int meta) { - this.addVine(worldIn, pos, meta); - int i = 4; - - for (pos = pos.down(); i > 0 && worldIn.getBlockIdAt(pos.x, pos.y, pos.z) == Block.AIR; --i) { - this.addVine(worldIn, pos, meta); - pos = pos.down(); - } - } - - private static boolean isAirBlock(ChunkManager level, BlockVector3 v) { - return level.getBlockIdAt(v.x, v.y, v.z) == 0; - } - - private static int getCocoaMeta(int side) { - int meta = 0; - - //3 4 2 5 - switch (side) { - case 4: - meta++; - break; - case 2: - meta += 2; - break; - case 5: - meta += 3; - break; - } - - return meta; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectBigSpruceTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectBigSpruceTree.java deleted file mode 100644 index 7d7910c77..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectBigSpruceTree.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.utils.Utils; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class ObjectBigSpruceTree extends ObjectSpruceTree { - - private final float leafStartHeightMultiplier; - private final int baseLeafRadius; - boolean fromSapling; - - public ObjectBigSpruceTree(float leafStartHeightMultiplier, int baseLeafRadius) { - this(leafStartHeightMultiplier, baseLeafRadius, false); - } - - public ObjectBigSpruceTree(float leafStartHeightMultiplier, int baseLeafRadius, boolean fromSapling) { - this.leafStartHeightMultiplier = leafStartHeightMultiplier; - this.baseLeafRadius = baseLeafRadius; - this.fromSapling = fromSapling; - } - - @Override - public void placeObject(ChunkManager level, int x, int y, int z, NukkitRandom random) { - this.treeHeight = fromSapling ? Utils.rand(10, 15) : random.nextBoundedInt(15) + 20; - - int topSize = this.treeHeight - (int) (this.treeHeight * leafStartHeightMultiplier); - int lRadius = baseLeafRadius + random.nextBoundedInt(2); - - this.placeTrunk(level, x, y, z, random, this.getTreeHeight() - random.nextBoundedInt(3)); - - this.placeLeaves(level, topSize, lRadius, x, y, z, random); - } - - @Override - protected void placeTrunk(ChunkManager level, int x, int y, int z, NukkitRandom random, int trunkHeight) { - // The base dirt block - level.setBlockAt(x, y - 1, z, Block.DIRT); - int radius = 2; - - for (int yy = 0; yy < trunkHeight; ++yy) { - for (int xx = 0; xx < radius; xx++) { - for (int zz = 0; zz < radius; zz++) { - int blockId = level.getBlockIdAt(x, y + yy, z); - if (this.overridable(blockId)) { - level.setBlockAt(x + xx, y + yy, z + zz, this.getTrunkBlock(), this.getType()); - } - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectBirchTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectBirchTree.java deleted file mode 100644 index 81701139e..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectBirchTree.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.BlockWood; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ObjectBirchTree extends ObjectTree { - - protected int treeHeight = 7; - - @Override - public int getType() { - return BlockWood.BIRCH; - } - - @Override - public int getTreeHeight() { - return this.treeHeight; - } - - @Override - public void placeObject(ChunkManager level, int x, int y, int z, NukkitRandom random) { - this.treeHeight = random.nextBoundedInt(2) + 5; - super.placeObject(level, x, y, z, random); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectDarkOakTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectDarkOakTree.java deleted file mode 100644 index 7fb1da9f3..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectDarkOakTree.java +++ /dev/null @@ -1,176 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockLeaves2; -import cn.nukkit.block.BlockWood2; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -/** - * Created by CreeperFace on 23. 10. 2016. - */ -public class ObjectDarkOakTree extends TreeGenerator { - - private static final Block DARK_OAK_LOG = Block.get(BlockID.WOOD2, BlockWood2.DARK_OAK); - private static final Block DARK_OAK_LEAVES = Block.get(BlockID.LEAVES2, BlockLeaves2.DARK_OAK); - - @Override - public boolean generate(ChunkManager level, NukkitRandom rand, Vector3 position) { - int i = rand.nextBoundedInt(3) + rand.nextBoundedInt(2) + 6; - int j = position.getFloorX(); - int k = position.getFloorY(); - int l = position.getFloorZ(); - - if (k >= 1 && k + i + 1 < 256) { - Vector3 blockpos = position.down(); - int block = level.getBlockIdAt(blockpos.getFloorX(), blockpos.getFloorY(), blockpos.getFloorZ()); - - if (block != Block.GRASS && block != Block.DIRT) { - return false; - } else if (!this.placeTreeOfHeight(level, position, i)) { - return false; - } else { - this.setDirtAt(level, blockpos); - this.setDirtAt(level, blockpos.east()); - this.setDirtAt(level, blockpos.south()); - this.setDirtAt(level, blockpos.south().east()); - BlockFace enumfacing = BlockFace.Plane.HORIZONTAL.random(rand); - int i1 = i - rand.nextBoundedInt(4); - int j1 = 2 - rand.nextBoundedInt(3); - int k1 = j; - int l1 = l; - int i2 = k + i - 1; - - for (int j2 = 0; j2 < i; ++j2) { - if (j2 >= i1 && j1 > 0) { - k1 += enumfacing.getXOffset(); - l1 += enumfacing.getZOffset(); - --j1; - } - - int k2 = k + j2; - Vector3 blockpos1 = new Vector3(k1, k2, l1); - int material = level.getBlockIdAt(blockpos1.getFloorX(), blockpos1.getFloorY(), blockpos1.getFloorZ()); - - if (material == Block.AIR || material == Block.LEAVES) { - this.placeLogAt(level, blockpos1); - this.placeLogAt(level, blockpos1.east()); - this.placeLogAt(level, blockpos1.south()); - this.placeLogAt(level, blockpos1.east().south()); - } - } - - for (int i3 = -2; i3 <= 0; ++i3) { - for (int l3 = -2; l3 <= 0; ++l3) { - int k4 = -1; - this.placeLeafAt(level, k1 + i3, i2 + k4, l1 + l3); - this.placeLeafAt(level, 1 + k1 - i3, i2 + k4, l1 + l3); - this.placeLeafAt(level, k1 + i3, i2 + k4, 1 + l1 - l3); - this.placeLeafAt(level, 1 + k1 - i3, i2 + k4, 1 + l1 - l3); - - if ((i3 > -2 || l3 > -1) && (i3 != -1 || l3 != -2)) { - k4 = 1; - this.placeLeafAt(level, k1 + i3, i2 + k4, l1 + l3); - this.placeLeafAt(level, 1 + k1 - i3, i2 + k4, l1 + l3); - this.placeLeafAt(level, k1 + i3, i2 + k4, 1 + l1 - l3); - this.placeLeafAt(level, 1 + k1 - i3, i2 + k4, 1 + l1 - l3); - } - } - } - - if (rand.nextBoolean()) { - this.placeLeafAt(level, k1, i2 + 2, l1); - this.placeLeafAt(level, k1 + 1, i2 + 2, l1); - this.placeLeafAt(level, k1 + 1, i2 + 2, l1 + 1); - this.placeLeafAt(level, k1, i2 + 2, l1 + 1); - } - - for (int j3 = -3; j3 <= 4; ++j3) { - for (int i4 = -3; i4 <= 4; ++i4) { - if ((j3 != -3 || i4 != -3) && (j3 != -3 || i4 != 4) && (j3 != 4 || i4 != -3) && (j3 != 4 || i4 != 4) && (Math.abs(j3) < 3 || Math.abs(i4) < 3)) { - this.placeLeafAt(level, k1 + j3, i2, l1 + i4); - } - } - } - - for (int k3 = -1; k3 <= 2; ++k3) { - for (int j4 = -1; j4 <= 2; ++j4) { - if ((k3 < 0 || k3 > 1 || j4 < 0 || j4 > 1) && rand.nextBoundedInt(3) <= 0) { - int l4 = rand.nextBoundedInt(3) + 2; - - for (int i5 = 0; i5 < l4; ++i5) { - this.placeLogAt(level, new Vector3(j + k3, i2 - i5 - 1, l + j4)); - } - - for (int j5 = -1; j5 <= 1; ++j5) { - for (int l2 = -1; l2 <= 1; ++l2) { - this.placeLeafAt(level, k1 + k3 + j5, i2, l1 + j4 + l2); - } - } - - for (int k5 = -2; k5 <= 2; ++k5) { - for (int l5 = -2; l5 <= 2; ++l5) { - if (Math.abs(k5) != 2 || Math.abs(l5) != 2) { - this.placeLeafAt(level, k1 + k3 + k5, i2 - 1, l1 + j4 + l5); - } - } - } - } - } - } - - return true; - } - } else { - return false; - } - } - - private boolean placeTreeOfHeight(ChunkManager worldIn, Vector3 pos, int height) { - int i = pos.getFloorX(); - int j = pos.getFloorY(); - int k = pos.getFloorZ(); - Vector3 blockPos = new Vector3(); - - for (int l = 0; l <= height + 1; ++l) { - int i1 = 1; - - if (l == 0) { - i1 = 0; - } - - if (l >= height - 1) { - i1 = 2; - } - - for (int j1 = -i1; j1 <= i1; ++j1) { - for (int k1 = -i1; k1 <= i1; ++k1) { - blockPos.setComponents(i + j1, j + l, k + k1); - if (!this.canGrowInto(worldIn.getBlockIdAt(blockPos.getFloorX(), blockPos.getFloorY(), blockPos.getFloorZ()))) { - return false; - } - } - } - } - - return true; - } - - private void placeLogAt(ChunkManager worldIn, Vector3 pos) { - if (this.canGrowInto(worldIn.getBlockIdAt(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ()))) { - this.setBlockAndNotifyAdequately(worldIn, pos, DARK_OAK_LOG); - } - } - - private void placeLeafAt(ChunkManager worldIn, int x, int y, int z) { - Vector3 blockpos = new Vector3(x, y, z); - int material = worldIn.getBlockIdAt(blockpos.getFloorX(), blockpos.getFloorY(), blockpos.getFloorZ()); - - if (material == Block.AIR) { - this.setBlockAndNotifyAdequately(worldIn, blockpos, DARK_OAK_LEAVES); - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectJungleBigTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectJungleBigTree.java deleted file mode 100644 index 2bba4c5db..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectJungleBigTree.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class ObjectJungleBigTree extends HugeTreesGenerator { - public ObjectJungleBigTree(int baseHeightIn, int extraRandomHeight, Block woodMetadata, Block leavesMetadata) { - super(baseHeightIn, extraRandomHeight, woodMetadata, leavesMetadata); - } - - public boolean generate(ChunkManager level, NukkitRandom rand, Vector3 position) { - int height = this.getHeight(rand); - - if (!this.ensureGrowable(level, position, height)) { - return false; - } else { - this.createCrown(level, position.up(height), 2); - - for (int j = (int) position.getY() + height - 2 - rand.nextBoundedInt(4); j > position.getY() + (height >> 1); j -= 2 + rand.nextBoundedInt(4)) { - float f = rand.nextFloat() * (6.2831855f); - int k = (int) (position.getX() + (0.5F + MathHelper.cos(f) * 4.0F)); - int l = (int) (position.getZ() + (0.5F + MathHelper.sin(f) * 4.0F)); - - for (int i1 = 0; i1 < 5; ++i1) { - k = (int) (position.getX() + (1.5F + MathHelper.cos(f) * (float) i1)); - l = (int) (position.getZ() + (1.5F + MathHelper.sin(f) * (float) i1)); - this.setBlockAndNotifyAdequately(level, new Vector3(k, j - 3 + (i1 >> 1), l), this.woodMetadata); - } - - int j2 = 1 + rand.nextBoundedInt(2); - - for (int k1 = j - j2; k1 <= j; ++k1) { - int l1 = k1 - j; - this.growLeavesLayer(level, new Vector3(k, k1, l), 1 - l1); - } - } - - for (int i2 = 0; i2 < height; ++i2) { - Vector3 blockpos = position.up(i2); - - if (this.canGrowInto(level.getBlockIdAt((int) blockpos.x, (int) blockpos.y, (int) blockpos.z))) { - this.setBlockAndNotifyAdequately(level, blockpos, this.woodMetadata); - - if (i2 > 0) { - this.placeVine(level, rand, blockpos.west(), 8); - this.placeVine(level, rand, blockpos.north(), 1); - } - } - - if (i2 < height - 1) { - Vector3 blockpos1 = blockpos.east(); - - if (this.canGrowInto(level.getBlockIdAt((int) blockpos1.x, (int) blockpos1.y, (int) blockpos1.z))) { - this.setBlockAndNotifyAdequately(level, blockpos1, this.woodMetadata); - - if (i2 > 0) { - this.placeVine(level, rand, blockpos1.east(), 2); - this.placeVine(level, rand, blockpos1.north(), 1); - } - } - - Vector3 blockpos2 = blockpos.south().east(); - - if (this.canGrowInto(level.getBlockIdAt((int) blockpos2.x, (int) blockpos2.y, (int) blockpos2.z))) { - this.setBlockAndNotifyAdequately(level, blockpos2, this.woodMetadata); - - if (i2 > 0) { - this.placeVine(level, rand, blockpos2.east(), 2); - this.placeVine(level, rand, blockpos2.south(), 4); - } - } - - Vector3 blockpos3 = blockpos.south(); - - if (this.canGrowInto(level.getBlockIdAt((int) blockpos3.x, (int) blockpos3.y, (int) blockpos3.z))) { - this.setBlockAndNotifyAdequately(level, blockpos3, this.woodMetadata); - - if (i2 > 0) { - this.placeVine(level, rand, blockpos3.west(), 8); - this.placeVine(level, rand, blockpos3.south(), 4); - } - } - } - } - - return true; - } - } - - private void placeVine(ChunkManager level, NukkitRandom random, Vector3 pos, int meta) { - if (random.nextBoundedInt(3) > 0 && level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) == 0) { - this.setBlockAndNotifyAdequately(level, pos, Block.get(BlockID.VINES, meta)); - } - } - - private void createCrown(ChunkManager level, Vector3 pos, int i1) { - for (int j = -2; j <= 0; ++j) { - this.growLeavesLayerStrict(level, pos.up(j), i1 + 1 - j); - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectJungleTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectJungleTree.java deleted file mode 100644 index e3a0e4e67..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectJungleTree.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.BlockWood; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ObjectJungleTree extends ObjectTree { - private int treeHeight = 8; - - @Override - public int getType() { - return BlockWood.JUNGLE; - } - - @Override - public int getTreeHeight() { - return this.treeHeight; - } - - @Override - public void placeObject(ChunkManager level, int x, int y, int z, NukkitRandom random) { - this.treeHeight = random.nextBoundedInt(6) + 4; - super.placeObject(level, x, y, z, random); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectOakTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectOakTree.java deleted file mode 100644 index 35592f7ee..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectOakTree.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.BlockWood; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ObjectOakTree extends ObjectTree { - - private int treeHeight = 7; - - @Override - public int getType() { - return BlockWood.OAK; - } - - @Override - public int getTreeHeight() { - return this.treeHeight; - } - - @Override - public void placeObject(ChunkManager level, int x, int y, int z, NukkitRandom random) { - this.treeHeight = random.nextBoundedInt(3) + 4; - super.placeObject(level, x, y, z, random); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSavannaTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSavannaTree.java deleted file mode 100644 index 72832f590..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSavannaTree.java +++ /dev/null @@ -1,173 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockLeaves2; -import cn.nukkit.block.BlockWood2; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class ObjectSavannaTree extends TreeGenerator { - - private static final Block TRUNK = Block.get(BlockID.WOOD2, BlockWood2.ACACIA); - private static final Block LEAF = Block.get(BlockID.LEAVES2, BlockLeaves2.ACACIA); - - public boolean generate(ChunkManager level, NukkitRandom rand, Vector3 position) { - int i = rand.nextBoundedInt(3) + rand.nextBoundedInt(3) + 5; - boolean flag = true; - - if (position.getY() >= 1 && position.getY() + i + 1 <= 256) { - for (int j = (int) position.getY(); j <= position.getY() + 1 + i; ++j) { - int k = 1; - - if (j == position.getY()) { - k = 0; - } - - if (j >= position.getY() + 1 + i - 2) { - k = 2; - } - - Vector3 vector3 = new Vector3(); - - for (int l = (int) position.getX() - k; l <= position.getX() + k && flag; ++l) { - for (int i1 = (int) position.getZ() - k; i1 <= position.getZ() + k && flag; ++i1) { - if (j >= 0 && j < 256) { - - vector3.setComponents(l, j, i1); - if (!this.canGrowInto(level.getBlockIdAt((int) vector3.x, (int) vector3.y, (int) vector3.z))) { - flag = false; - } - } else { - flag = false; - } - } - } - } - - if (!flag) { - return false; - } else { - Vector3 down = position.down(); - int block = level.getBlockIdAt(down.getFloorX(), down.getFloorY(), down.getFloorZ()); - - if ((block == Block.GRASS || block == Block.DIRT) && position.getY() < 256 - i - 1) { - this.setDirtAt(level, position.down()); - BlockFace face = BlockFace.Plane.HORIZONTAL.random(rand); - int k2 = i - rand.nextBoundedInt(4) - 1; - int l2 = 3 - rand.nextBoundedInt(3); - int i3 = position.getFloorX(); - int j1 = position.getFloorZ(); - int k1 = 0; - - for (int l1 = 0; l1 < i; ++l1) { - int i2 = position.getFloorY() + l1; - - if (l1 >= k2 && l2 > 0) { - i3 += face.getXOffset(); - j1 += face.getZOffset(); - --l2; - } - - Vector3 blockpos = new Vector3(i3, i2, j1); - int material = level.getBlockIdAt(blockpos.getFloorX(), blockpos.getFloorY(), blockpos.getFloorZ()); - - if (material == Block.AIR || material == Block.LEAVES) { - this.placeLogAt(level, blockpos); - k1 = i2; - } - } - - Vector3 blockpos2 = new Vector3(i3, k1, j1); - - for (int j3 = -3; j3 <= 3; ++j3) { - for (int i4 = -3; i4 <= 3; ++i4) { - if (Math.abs(j3) != 3 || Math.abs(i4) != 3) { - this.placeLeafAt(level, blockpos2.add(j3, 0, i4)); - } - } - } - - blockpos2 = blockpos2.up(); - - for (int k3 = -1; k3 <= 1; ++k3) { - for (int j4 = -1; j4 <= 1; ++j4) { - this.placeLeafAt(level, blockpos2.add(k3, 0, j4)); - } - } - - this.placeLeafAt(level, blockpos2.east(2)); - this.placeLeafAt(level, blockpos2.west(2)); - this.placeLeafAt(level, blockpos2.south(2)); - this.placeLeafAt(level, blockpos2.north(2)); - i3 = position.getFloorX(); - j1 = position.getFloorZ(); - BlockFace face1 = BlockFace.Plane.HORIZONTAL.random(rand); - - if (face1 != face) { - int l3 = k2 - rand.nextBoundedInt(2) - 1; - int k4 = 1 + rand.nextBoundedInt(3); - k1 = 0; - - for (int l4 = l3; l4 < i && k4 > 0; --k4) { - if (l4 >= 1) { - int j2 = position.getFloorY() + l4; - i3 += face1.getXOffset(); - j1 += face1.getZOffset(); - Vector3 blockpos1 = new Vector3(i3, j2, j1); - int material1 = level.getBlockIdAt(blockpos1.getFloorX(), blockpos1.getFloorY(), blockpos1.getFloorZ()); - - if (material1 == Block.AIR || material1 == Block.LEAVES) { - this.placeLogAt(level, blockpos1); - k1 = j2; - } - } - - ++l4; - } - - if (k1 > 0) { - Vector3 blockpos3 = new Vector3(i3, k1, j1); - - for (int i5 = -2; i5 <= 2; ++i5) { - for (int k5 = -2; k5 <= 2; ++k5) { - if (Math.abs(i5) != 2 || Math.abs(k5) != 2) { - this.placeLeafAt(level, blockpos3.add(i5, 0, k5)); - } - } - } - - blockpos3 = blockpos3.up(); - - for (int j5 = -1; j5 <= 1; ++j5) { - for (int l5 = -1; l5 <= 1; ++l5) { - this.placeLeafAt(level, blockpos3.add(j5, 0, l5)); - } - } - } - } - - return true; - } else { - return false; - } - } - } else { - return false; - } - } - - private void placeLogAt(ChunkManager worldIn, Vector3 pos) { - this.setBlockAndNotifyAdequately(worldIn, pos, TRUNK); - } - - private void placeLeafAt(ChunkManager worldIn, Vector3 pos) { - int material = worldIn.getBlockIdAt(pos.getFloorX(), pos.getFloorY(), pos.getFloorZ()); - - if (material == Block.AIR || material == Block.LEAVES) { - this.setBlockAndNotifyAdequately(worldIn, pos, LEAF); - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSpruceTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSpruceTree.java deleted file mode 100644 index b80d4a3f6..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSpruceTree.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockWood; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ObjectSpruceTree extends ObjectTree { - - protected int treeHeight = 15; - - @Override - public int getType() { - return BlockWood.SPRUCE; - } - - @Override - public int getTreeHeight() { - return this.treeHeight; - } - - @Override - public void placeObject(ChunkManager level, int x, int y, int z, NukkitRandom random) { - this.treeHeight = random.nextBoundedInt(4) + 6; - - int topSize = this.treeHeight - (1 + random.nextBoundedInt(2)); - int lRadius = 2 + random.nextBoundedInt(2); - - this.placeTrunk(level, x, y, z, random, this.treeHeight - random.nextBoundedInt(2)); - - this.placeLeaves(level, topSize, lRadius, x, y, z, random); - } - - public void placeLeaves(ChunkManager level, int topSize, int lRadius, int x, int y, int z, NukkitRandom random) { - int radius = random.nextBoundedInt(2); - int maxR = 1; - int minR = 0; - - for (int yy = 0; yy <= topSize; ++yy) { - int yyy = y + this.treeHeight - yy; - - for (int xx = x - radius; xx <= x + radius; ++xx) { - int xOff = Math.abs(xx - x); - for (int zz = z - radius; zz <= z + radius; ++zz) { - int zOff = Math.abs(zz - z); - if (xOff == radius && zOff == radius && radius > 0) { - continue; - } - - if (!Block.solid[level.getBlockIdAt(xx, yyy, zz)]) { - level.setBlockAt(xx, yyy, zz, this.getLeafBlock(), this.getType()); - } - } - } - - if (radius >= maxR) { - radius = minR; - minR = 1; - if (++maxR > lRadius) { - maxR = lRadius; - } - } else { - ++radius; - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSwampTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSwampTree.java deleted file mode 100644 index 9e51883cd..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectSwampTree.java +++ /dev/null @@ -1,156 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockLeaves; -import cn.nukkit.block.BlockWood; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class ObjectSwampTree extends TreeGenerator { - - /** - * The metadata value of the wood to use in tree generation. - */ - private final Block metaWood = Block.get(BlockID.WOOD, BlockWood.OAK); - - /** - * The metadata value of the leaves to use in tree generation. - */ - private final Block metaLeaves = Block.get(BlockID.LEAVES, BlockLeaves.OAK); - - @Override - public boolean generate(ChunkManager worldIn, NukkitRandom rand, Vector3 vectorPosition) { - BlockVector3 position = new BlockVector3(vectorPosition.getFloorX(), vectorPosition.getFloorY(), vectorPosition.getFloorZ()); - - int i = rand.nextBoundedInt(4) + 5; - boolean flag = true; - - if (position.getY() >= 1 && position.getY() + i + 1 <= 256) { - for (int j = position.getY(); j <= position.getY() + 1 + i; ++j) { - int k = 1; - - if (j == position.getY()) { - k = 0; - } - - if (j >= position.getY() + 1 + i - 2) { - k = 3; - } - - BlockVector3 pos2 = new BlockVector3(); - - for (int l = position.getX() - k; l <= position.getX() + k && flag; ++l) { - for (int i1 = position.getZ() - k; i1 <= position.getZ() + k && flag; ++i1) { - if (j >= 0 && j < 256) { - pos2.setComponents(l, j, i1); - if (!this.canGrowInto(worldIn.getBlockIdAt(pos2.x, pos2.y, pos2.z))) { - flag = false; - } - } else { - flag = false; - } - } - } - } - - if (!flag) { - return false; - } else { - BlockVector3 down = position.down(); - int block = worldIn.getBlockIdAt(down.x, down.y, down.z); - - if ((block == Block.GRASS || block == Block.DIRT) && position.getY() < 256 - i - 1) { - this.setDirtAt(worldIn, down); - - for (int k1 = position.getY() - 3 + i; k1 <= position.getY() + i; ++k1) { - int j2 = k1 - (position.getY() + i); - int l2 = 2 - (j2 >> 1); - - for (int j3 = position.getX() - l2; j3 <= position.getX() + l2; ++j3) { - int k3 = j3 - position.getX(); - - for (int i4 = position.getZ() - l2; i4 <= position.getZ() + l2; ++i4) { - int j1 = i4 - position.getZ(); - - if (Math.abs(k3) != l2 || Math.abs(j1) != l2 || rand.nextBoundedInt(2) != 0 && j2 != 0) { - BlockVector3 blockpos = new BlockVector3(j3, k1, i4); - int id = worldIn.getBlockIdAt(blockpos.x, blockpos.y, blockpos.z); - - if (id == Block.AIR || id == Block.LEAVES || id == Block.VINE) { - this.setBlockAndNotifyAdequately(worldIn, blockpos, this.metaLeaves); - } - } - } - } - } - - for (int l1 = 0; l1 < i; ++l1) { - BlockVector3 up = position.up(l1); - int id = worldIn.getBlockIdAt(up.x, up.y, up.z); - - if (id == Block.AIR || id == Block.LEAVES || id == Block.WATER || id == Block.STILL_WATER) { - this.setBlockAndNotifyAdequately(worldIn, up, this.metaWood); - } - } - - for (int i2 = position.getY() - 3 + i; i2 <= position.getY() + i; ++i2) { - int k2 = i2 - (position.getY() + i); - int i3 = 2 - (k2 >> 1); - BlockVector3 pos2 = new BlockVector3(); - - for (int l3 = position.getX() - i3; l3 <= position.getX() + i3; ++l3) { - for (int j4 = position.getZ() - i3; j4 <= position.getZ() + i3; ++j4) { - pos2.setComponents(l3, i2, j4); - - if (worldIn.getBlockIdAt(pos2.x, pos2.y, pos2.z) == Block.LEAVES) { - BlockVector3 blockpos2 = pos2.west(); - BlockVector3 blockpos3 = pos2.east(); - BlockVector3 blockpos4 = pos2.north(); - BlockVector3 blockpos1 = pos2.south(); - - if (rand.nextBoundedInt(4) == 0 && worldIn.getBlockIdAt(blockpos2.x, blockpos2.y, blockpos2.z) == Block.AIR) { - this.addHangingVine(worldIn, blockpos2, 8); - } - - if (rand.nextBoundedInt(4) == 0 && worldIn.getBlockIdAt(blockpos3.x, blockpos3.y, blockpos3.z) == Block.AIR) { - this.addHangingVine(worldIn, blockpos3, 2); - } - - if (rand.nextBoundedInt(4) == 0 && worldIn.getBlockIdAt(blockpos4.x, blockpos4.y, blockpos4.z) == Block.AIR) { - this.addHangingVine(worldIn, blockpos4, 1); - } - - if (rand.nextBoundedInt(4) == 0 && worldIn.getBlockIdAt(blockpos1.x, blockpos1.y, blockpos1.z) == Block.AIR) { - this.addHangingVine(worldIn, blockpos1, 4); - } - } - } - } - } - return true; - } else { - return false; - } - } - } else { - return false; - } - } - - private void addVine(ChunkManager worldIn, BlockVector3 pos, int meta) { - this.setBlockAndNotifyAdequately(worldIn, pos, Block.get(BlockID.VINE, meta)); - } - - private void addHangingVine(ChunkManager worldIn, BlockVector3 pos, int meta) { - this.addVine(worldIn, pos, meta); - int i = 4; - - for (pos = pos.down(); i > 0 && worldIn.getBlockIdAt(pos.x, pos.y, pos.z) == Block.AIR; --i) { - this.addVine(worldIn, pos, meta); - pos = pos.down(); - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectTallBirchTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectTallBirchTree.java deleted file mode 100644 index 72741d121..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectTallBirchTree.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ObjectTallBirchTree extends ObjectBirchTree { - - @Override - public void placeObject(ChunkManager level, int x, int y, int z, NukkitRandom random) { - this.treeHeight = random.nextBoundedInt(3) + 10; - super.placeObject(level, x, y, z, random); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectTree.java b/src/main/java/cn/nukkit/level/generator/object/tree/ObjectTree.java deleted file mode 100644 index 7011c1c10..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/ObjectTree.java +++ /dev/null @@ -1,128 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class ObjectTree { - - protected boolean overridable(int id) { - switch (id) { - case Block.AIR: - case Block.SAPLING: - case Block.LOG: - case Block.LEAVES: - case Block.SNOW_LAYER: - case Block.LOG2: - case Block.LEAVES2: - return true; - default: - return false; - } - } - - public int getType() { - return 0; - } - - public int getTrunkBlock() { - return Block.LOG; - } - - public int getLeafBlock() { - return Block.LEAVES; - } - - public int getTreeHeight() { - return 7; - } - - public static void growTree(ChunkManager level, int x, int y, int z, NukkitRandom random) { - growTree(level, x, y, z, random, 0); - } - - public static void growTree(ChunkManager level, int x, int y, int z, NukkitRandom random, int type) { - ObjectTree tree; - switch (type) { - case BlockSapling.SPRUCE: - tree = new ObjectSpruceTree(); - break; - case BlockSapling.BIRCH: - tree = new ObjectBirchTree(); - break; - case BlockSapling.JUNGLE: - tree = new ObjectJungleTree(); - break; - case BlockSapling.BIRCH_TALL: - tree = new ObjectTallBirchTree(); - break; - case BlockSapling.OAK: - default: - tree = new ObjectOakTree(); - //todo: more complex treeeeeeeeeeeeeeeee - break; - } - - if (tree.canPlaceObject(level, x, y, z, random)) { - tree.placeObject(level, x, y, z, random); - } - } - - - public boolean canPlaceObject(ChunkManager level, int x, int y, int z, NukkitRandom random) { - int radiusToCheck = 0; - for (int yy = 0; yy < this.getTreeHeight() + 3; ++yy) { - if (yy == 1 || yy == this.getTreeHeight()) { - ++radiusToCheck; - } - for (int xx = -radiusToCheck; xx < (radiusToCheck + 1); ++xx) { - for (int zz = -radiusToCheck; zz < (radiusToCheck + 1); ++zz) { - if (!this.overridable(level.getBlockIdAt(x + xx, y + yy, z + zz))) { - return false; - } - } - } - } - - return true; - } - - public void placeObject(ChunkManager level, int x, int y, int z, NukkitRandom random) { - - this.placeTrunk(level, x, y, z, random, this.getTreeHeight() - 1); - - for (int yy = y - 3 + this.getTreeHeight(); yy <= y + this.getTreeHeight(); ++yy) { - double yOff = yy - (y + this.getTreeHeight()); - int mid = (int) (1 - yOff / 2); - for (int xx = x - mid; xx <= x + mid; ++xx) { - int xOff = Math.abs(xx - x); - for (int zz = z - mid; zz <= z + mid; ++zz) { - int zOff = Math.abs(zz - z); - if (xOff == mid && zOff == mid && (yOff == 0 || random.nextBoundedInt(2) == 0)) { - continue; - } - if (!Block.solid[level.getBlockIdAt(xx, yy, zz)]) { - level.setBlockAt(xx, yy, zz, this.getLeafBlock(), this.getType()); - } - } - } - } - } - - protected void placeTrunk(ChunkManager level, int x, int y, int z, NukkitRandom random, int trunkHeight) { - // The base dirt block - level.setBlockAt(x, y - 1, z, Block.DIRT); - - for (int yy = 0; yy < trunkHeight; ++yy) { - int blockId = level.getBlockIdAt(x, y + yy, z); - if (this.overridable(blockId)) { - level.setBlockAt(x, y + yy, z, this.getTrunkBlock(), this.getType()); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/object/tree/TreeGenerator.java b/src/main/java/cn/nukkit/level/generator/object/tree/TreeGenerator.java deleted file mode 100644 index 6aaa25faa..000000000 --- a/src/main/java/cn/nukkit/level/generator/object/tree/TreeGenerator.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.level.generator.object.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockID; -import cn.nukkit.item.Item; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.math.Vector3; - -import java.util.Random; - -public abstract class TreeGenerator extends cn.nukkit.level.generator.object.BasicGenerator { - - /** - * returns whether or not a tree can grow into a block - * For example, a tree will not grow into stone - */ - protected boolean canGrowInto(int id) { - return id == Item.AIR || id == Item.LEAVES || id == Item.GRASS || id == Item.DIRT || id == Item.LOG || id == Item.LOG2 || id == Item.SAPLING || id == Item.VINE; - } - - public void generateSaplings(Level level, Random random, Vector3 pos) { - } - - protected void setDirtAt(ChunkManager level, BlockVector3 pos) { - setDirtAt(level, new Vector3(pos.x, pos.y, pos.z)); - } - - /** - * sets dirt at a specific location if it isn't already dirt - */ - protected void setDirtAt(ChunkManager level, Vector3 pos) { - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Item.DIRT) { - this.setBlockAndNotifyAdequately(level, pos, Block.get(BlockID.DIRT)); - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureBelow.java b/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureBelow.java deleted file mode 100644 index a35a11c70..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureBelow.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.nukkit.level.generator.populator.helper; - -import cn.nukkit.level.format.FullChunk; - -/** - * @author DaPorkchop_ - */ -public interface EnsureBelow { - - static boolean ensureBelow(int x, int y, int z, int id, FullChunk chunk) { - return chunk.getBlockId(x, y - 1, z) == id; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureCover.java b/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureCover.java deleted file mode 100644 index 82fe14ddf..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureCover.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.level.generator.populator.helper; - -import cn.nukkit.level.format.FullChunk; - -import static cn.nukkit.block.BlockID.AIR; -import static cn.nukkit.block.BlockID.SNOW_LAYER; - -/** - * @author DaPorkchop_ - */ -public interface EnsureCover { - - static boolean ensureCover(int x, int y, int z, FullChunk chunk) { - int id = chunk.getBlockId(x, y, z); - return id == AIR || id == SNOW_LAYER; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureGrassBelow.java b/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureGrassBelow.java deleted file mode 100644 index db7c0519a..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/helper/EnsureGrassBelow.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.level.generator.populator.helper; - -import cn.nukkit.level.format.FullChunk; - -import static cn.nukkit.block.BlockID.GRASS; - -/** - * @author DaPorkchop_ - */ -public interface EnsureGrassBelow { - - static boolean ensureGrassBelow(int x, int y, int z, FullChunk chunk) { - return EnsureBelow.ensureBelow(x, y, z, GRASS, chunk); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/helper/PopulatorHelpers.java b/src/main/java/cn/nukkit/level/generator/populator/helper/PopulatorHelpers.java deleted file mode 100644 index 44b706f11..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/helper/PopulatorHelpers.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.level.generator.populator.helper; - -import cn.nukkit.block.BlockID; -import cn.nukkit.level.format.FullChunk; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; - -/** - * @author DaPorkchop_ - */ -public final class PopulatorHelpers implements BlockID { - - private static final IntSet nonSolidBlocks = new IntOpenHashSet(); - - static { - nonSolidBlocks.add(AIR); - nonSolidBlocks.add(LEAVES); - nonSolidBlocks.add(LEAVES2); - nonSolidBlocks.add(SNOW_LAYER); - } - - private PopulatorHelpers() { - } - - public static boolean canGrassStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureGrassBelow.ensureGrassBelow(x, y, z, chunk); - } - - public static boolean isNonSolid(int id) { - return nonSolidBlocks.contains(id); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/MushroomPopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/MushroomPopulator.java deleted file mode 100644 index 4cb0d7c67..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/MushroomPopulator.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.mushroom.BigMushroom; -import cn.nukkit.level.generator.populator.type.PopulatorCount; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -/** - * @author DaPorkchop_ - */ -public class MushroomPopulator extends PopulatorCount { - - private final int type; - - public MushroomPopulator() { - this(-1); - } - - public MushroomPopulator(int type) { - this.type = type; - } - - @Override - public void populateCount(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - int x = (chunkX << 4) | random.nextBoundedInt(16); - int z = (chunkZ << 4) | random.nextBoundedInt(16); - int y = this.getHighestWorkableBlock(level, x, z, chunk); - if (y != -1) { - new BigMushroom(type).generate(level, random, new Vector3(x, y, z)); - } - } - - @Override - protected int getHighestWorkableBlock(ChunkManager level, int x, int z, FullChunk chunk) { - int y; - x &= 0xF; - z &= 0xF; - for (y = 254; y > 0; --y) { - int b = chunk.getBlockId(x, y, z); - if (b == Block.DIRT || b == Block.GRASS || b == Block.MYCELIUM) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorBedrock.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorBedrock.java deleted file mode 100644 index 88bbb4462..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorBedrock.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * - * Places bedrock on the bottom of the world - */ -public class PopulatorBedrock extends Populator { - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - chunk.setBlockId(x, 0, z, BEDROCK); - for (int i = 1; i < 5; i++) { - if (random.nextBoundedInt(i) == 0) { - chunk.setBlockId(x, i, z, BEDROCK); - } - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorCactus.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorCactus.java deleted file mode 100644 index f84e929c1..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorCactus.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureBelow; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - */ -public class PopulatorCactus extends PopulatorSurfaceBlock { - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureBelow.ensureBelow(x, y, z, SAND, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 1297; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorCaves.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorCaves.java deleted file mode 100644 index 973627caf..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorCaves.java +++ /dev/null @@ -1,267 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.biome.EnumBiome; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.biome.Biome; -import cn.nukkit.level.biome.type.CoveredBiome; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.NukkitRandom; - -import java.util.Random; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class PopulatorCaves extends Populator { - - protected int checkAreaSize = 8; - - private Random random; - - public static int caveRarity = 7; - public static int caveFrequency = 40; - public static int caveMinAltitude = 8; - public static int caveMaxAltitude = 67; - public static int individualCaveRarity = 25; - public static int caveSystemFrequency = 1; - public static int caveSystemPocketChance = 0; - public static int caveSystemPocketMinSize = 0; - public static int caveSystemPocketMaxSize = 4; - public static boolean evenCaveDistribution = false; - - public int worldHeightCap = 128; - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.random = new Random(); - this.random.setSeed(level.getSeed()); - long worldLong1 = this.random.nextLong(); - long worldLong2 = this.random.nextLong(); - - int size = this.checkAreaSize; - - for (int x = chunkX - size; x <= chunkX + size; x++) - for (int z = chunkZ - size; z <= chunkZ + size; z++) { - long randomX = x * worldLong1; - long randomZ = z * worldLong2; - this.random.setSeed(randomX ^ randomZ ^ level.getSeed()); - generateChunk(x, z, chunk); - } - } - - protected void generateLargeCaveNode(long seed, FullChunk chunk, double x, double y, double z) { - generateCaveNode(seed, chunk, x, y, z, 1.0F + this.random.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); - } - - protected void generateCaveNode(long seed, FullChunk chunk, double x, double y, double z, float radius, float angelOffset, float angel, int angle, int maxAngle, double scale) { - int chunkX = chunk.getX(); - int chunkZ = chunk.getZ(); - - double realX = (chunkX << 4) + 8; - double realZ = (chunkZ << 4) + 8; - - float f1 = 0.0F; - float f2 = 0.0F; - - Random localRandom = new Random(seed); - - if (maxAngle <= 0) { - int checkAreaSize = (this.checkAreaSize << 4) - 16; - maxAngle = checkAreaSize - localRandom.nextInt(checkAreaSize >> 2); - } - boolean isLargeCave = false; - - if (angle == -1) { - angle = maxAngle >> 1; - isLargeCave = true; - } - - int randomAngel = localRandom.nextInt(maxAngle >> 1) + (maxAngle >> 2); - boolean bigAngel = localRandom.nextInt(6) == 0; - - for (; angle < maxAngle; angle++) { - double offsetXZ = 1.5D + MathHelper.sin(angle * 3.141593F / maxAngle) * radius * 1.0F; - double offsetY = offsetXZ * scale; - - float cos = MathHelper.cos(angel); - float sin = MathHelper.sin(angel); - x += MathHelper.cos(angelOffset) * cos; - y += sin; - z += MathHelper.sin(angelOffset) * cos; - - if (bigAngel) - angel *= 0.92F; - else { - angel *= 0.7F; - } - angel += f2 * 0.1F; - angelOffset += f1 * 0.1F; - - f2 *= 0.9F; - f1 *= 0.75F; - f2 += (localRandom.nextFloat() - localRandom.nextFloat()) * localRandom.nextFloat() * 2.0F; - f1 += (localRandom.nextFloat() - localRandom.nextFloat()) * localRandom.nextFloat() * 4.0F; - - if ((!isLargeCave) && (angle == randomAngel) && (radius > 1.0F) && (maxAngle > 0)) { - generateCaveNode(localRandom.nextLong(), chunk, x, y, z, localRandom.nextFloat() * 0.5F + 0.5F, angelOffset - 1.570796F, angel / 3.0F, angle, maxAngle, 1.0D); - generateCaveNode(localRandom.nextLong(), chunk, x, y, z, localRandom.nextFloat() * 0.5F + 0.5F, angelOffset + 1.570796F, angel / 3.0F, angle, maxAngle, 1.0D); - return; - } - if ((!isLargeCave) && (localRandom.nextInt(4) == 0)) { - continue; - } - - // Check if distance to working point (x and z) too larger than working radius (maybe ??) - double distanceX = x - realX; - double distanceZ = z - realZ; - double angelDiff = maxAngle - angle; - double newRadius = radius + 2.0F + 16.0F; - if (distanceX * distanceX + distanceZ * distanceZ - angelDiff * angelDiff > newRadius * newRadius) { - return; - } - - //Boundaries check. - if ((x < realX - 16.0D - offsetXZ * 2.0D) || (z < realZ - 16.0D - offsetXZ * 2.0D) || (x > realX + 16.0D + offsetXZ * 2.0D) || (z > realZ + 16.0D + offsetXZ * 2.0D)) - continue; - - - int xFrom = MathHelper.floor(x - offsetXZ) - (chunkX << 4) - 1; - int xTo = MathHelper.floor(x + offsetXZ) - (chunkX << 4) + 1; - - int yFrom = MathHelper.floor(y - offsetY) - 1; - int yTo = MathHelper.floor(y + offsetY) + 1; - - int zFrom = MathHelper.floor(z - offsetXZ) - (chunkZ << 4) - 1; - int zTo = MathHelper.floor(z + offsetXZ) - (chunkZ << 4) + 1; - - if (xFrom < 0) - xFrom = 0; - if (xTo > 16) - xTo = 16; - - if (yFrom < 1) - yFrom = 1; - if (yTo > this.worldHeightCap - 8) { - yTo = this.worldHeightCap - 8; - } - if (zFrom < 0) - zFrom = 0; - if (zTo > 16) - zTo = 16; - - // Search for water - boolean waterFound = false; - for (int xx = xFrom; (!waterFound) && (xx < xTo); xx++) { - for (int zz = zFrom; (!waterFound) && (zz < zTo); zz++) { - for (int yy = yTo + 1; (!waterFound) && (yy >= yFrom - 1); yy--) { - if (yy >= 0 && yy < this.worldHeightCap) { - int block = chunk.getBlockId(xx, yy, zz); - if (block == Block.WATER || block == Block.STILL_WATER) { - waterFound = true; - } - if ((yy != yFrom - 1) && (xx != xFrom) && (xx != xTo - 1) && (zz != zFrom) && (zz != zTo - 1)) - yy = yFrom; - } - } - } - } - - if (waterFound) { - continue; - } - - // Generate cave - for (int xx = xFrom; xx < xTo; xx++) { - double modX = (xx + (chunkX << 4) + 0.5D - x) / offsetXZ; - for (int zz = zFrom; zz < zTo; zz++) { - double modZ = (zz + (chunkZ << 4) + 0.5D - z) / offsetXZ; - - boolean grassFound = false; - if (modX * modX + modZ * modZ < 1.0D) { - for (int yy = yTo; yy > yFrom; yy--) { - double modY = ((yy - 1) + 0.5D - y) / offsetY; - if ((modY > -0.7) && (modX * modX + modY * modY + modZ * modZ < 1.0D)) { - Biome biome = EnumBiome.getBiome(chunk.getBiomeId(xx, zz)); - if (!(biome instanceof CoveredBiome)) { - continue; - } - - int material = chunk.getBlockId(xx, yy, zz); - if (material == Block.GRASS || material == Block.MYCELIUM) { - grassFound = true; - } - //TODO: check this -// if (this.isSuitableBlock(material, materialAbove, biome)) - { - if (yy - 1 < 10) { - chunk.setBlock(xx, yy, zz, Block.LAVA); - } else { - chunk.setBlock(xx, yy, zz, Block.AIR); - - // If grass was just deleted, try to - // move it down - if (grassFound && (chunk.getBlockId(xx, yy - 1, zz) == Block.DIRT)) { - chunk.setFullBlockId(xx, yy - 1, zz, ((CoveredBiome) biome).getSurfaceId(xx, yy - 1, zz)); - } - } - } - } - } - } - } - } - - if (isLargeCave) { - break; - } - } - } - - protected void generateChunk(int chunkX, int chunkZ, FullChunk generatingChunkBuffer) { - int i = this.random.nextInt(this.random.nextInt(this.random.nextInt(caveFrequency) + 1) + 1); - if (evenCaveDistribution) - i = caveFrequency; - if (this.random.nextInt(100) >= caveRarity) - i = 0; - - for (int j = 0; j < i; j++) { - double x = (chunkX << 4) + this.random.nextInt(16); - - double y; - - if (evenCaveDistribution) - y = numberInRange(random, caveMinAltitude, caveMaxAltitude); - else - y = this.random.nextInt(this.random.nextInt(caveMaxAltitude - caveMinAltitude + 1) + 1) + caveMinAltitude; - - double z = (chunkZ << 4) + this.random.nextInt(16); - - int count = caveSystemFrequency; - boolean largeCaveSpawned = false; - if (this.random.nextInt(100) <= individualCaveRarity) { - generateLargeCaveNode(this.random.nextLong(), generatingChunkBuffer, x, y, z); - largeCaveSpawned = true; - } - - if ((largeCaveSpawned) || (this.random.nextInt(100) <= caveSystemPocketChance - 1)) { - count += numberInRange(random, caveSystemPocketMinSize, caveSystemPocketMaxSize); - } - while (count > 0) { - count--; - float f1 = this.random.nextFloat() * 6.283186f; - float f2 = (this.random.nextFloat() - 0.5F) * 2.0F / 8.0F; - float f3 = this.random.nextFloat() * 2.0F + this.random.nextFloat(); - - generateCaveNode(this.random.nextLong(), generatingChunkBuffer, x, y, z, f3, f1, f2, 0, 0, 1.0D); - } - } - } - - public static int numberInRange(Random random, int min, int max) { - return min + random.nextInt(max - min + 1); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDeadBush.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDeadBush.java deleted file mode 100644 index 5324ad3eb..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDeadBush.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureBelow; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - */ -public class PopulatorDeadBush extends PopulatorSurfaceBlock { - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureBelow.ensureBelow(x, y, z, SAND, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 512; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDoublePlant.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDoublePlant.java deleted file mode 100644 index 144b2abb1..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDoublePlant.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.helper.EnsureGrassBelow; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class PopulatorDoublePlant extends PopulatorSurfaceBlock { - - private int type; - - public PopulatorDoublePlant(int type) { - this.type = type; - } - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureCover.ensureCover(x, y + 1, z, chunk) && EnsureGrassBelow.ensureGrassBelow(x, y, z, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return (2800) | type; - } - - @Override - protected void placeBlock(int x, int y, int z, int id, FullChunk chunk, NukkitRandom random) { - super.placeBlock(x, y, z, id, chunk, random); - chunk.setFullBlockId(x, y + 1, z, 8 | id); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDungeon.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDungeon.java deleted file mode 100644 index 8a8509e53..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorDungeon.java +++ /dev/null @@ -1,246 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.blockentity.BlockEntityChest; -import cn.nukkit.entity.mob.EntitySkeleton; -import cn.nukkit.entity.mob.EntitySpider; -import cn.nukkit.entity.mob.EntityZombie; -import cn.nukkit.inventory.Inventory; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; -import java.util.Map; - -public class PopulatorDungeon extends Populator { - - private static final int[] MOBS = {EntitySkeleton.NETWORK_ID, EntityZombie.NETWORK_ID, EntityZombie.NETWORK_ID, EntitySpider.NETWORK_ID}; - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - int X = chunkX << 4; - int Z = chunkZ << 4; - - chance: - for (int chance = 0; chance < 8; ++chance) { - int x = X + random.nextBoundedInt(16) + 8; - int y = random.nextBoundedInt(256); - int z = Z + random.nextBoundedInt(16) + 8; - - int xv = random.nextBoundedInt(2) + 2; - int x1 = -xv - 1; - int x2 = xv + 1; - - int zv = random.nextBoundedInt(2) + 2; - int z1 = -zv - 1; - int z2 = zv + 1; - - int t = 0; - - for (int dx = x1; dx <= x2; ++dx) { - for (int dy = -1; dy <= 4; ++dy) { - for (int dz = z1; dz <= z2; ++dz) { - int tx = x + dx; - int ty = y + dy; - int tz = z + dz; - - int id = level.getBlockIdAt(tx, ty, tz); - boolean isSolid = Block.fullList[(id << 4) + level.getBlockDataAt(tx, ty, tz)].isSolid(); - - if (dy == -1 && !isSolid) { - continue chance; - } - if (dy == 4 && !isSolid) { - continue chance; - } - if ((dx == x1 || dx == x2 || dz == z1 || dz == z2) && dy == 0 && level.getBlockIdAt(tx, ty + 1, tz) == AIR) { - ++t; - } - } - } - } - - if (t >= 1 && t <= 5) { - for (int dx = x1; dx <= x2; ++dx) { - for (int dy = 3; dy >= -1; --dy) { - for (int dz = z1; dz <= z2; ++dz) { - int tx = x + dx; - int ty = y + dy; - int tz = z + dz; - - int id = level.getBlockIdAt(tx, ty, tz); - - if (dx != x1 && dy != -1 && dz != z1 && dx != x2 && dy != 4 && dz != z2) { - if (id != CHEST) { - level.setBlockAt(tx, ty, tz, AIR); - } - } else if (ty >= 0 && !Block.fullList[(level.getBlockIdAt(tx, ty - 1, tz) << 4) + level.getBlockDataAt(tx, ty - 1, tz)].isSolid()) { - level.setBlockAt(tx, ty, tz, AIR); - } else if (Block.fullList[(id << 4) + level.getBlockDataAt(tx, ty, tz)].isSolid() && id != CHEST) { - if (dy == -1 && random.nextBoundedInt(4) != 0) { - level.setBlockAt(tx, ty, tz, MOSSY_STONE); - } else { - level.setBlockAt(tx, ty, tz, COBBLESTONE); - } - } - } - } - } - - for (int xx = 0; xx < 2; ++xx) { - for (int zz = 0; zz < 3; ++zz) { - int tx = x + random.nextBoundedInt((xv << 1) + 1) - xv; - int tz = z + random.nextBoundedInt((zv << 1) + 1) - zv; - - if (level.getBlockIdAt(tx, y, tz) == AIR) { - int n = 0; - - if (Block.fullList[(level.getBlockIdAt(tx - 1, y, tz) << 4) + level.getBlockDataAt(tx - 1, y, tz)].isSolid()) { - ++n; - } - if (Block.fullList[(level.getBlockIdAt(tx + 1, y, tz) << 4) + level.getBlockDataAt(tx + 1, y, tz)].isSolid()) { - ++n; - } - if (Block.fullList[(level.getBlockIdAt(tx, y, tz - 1) << 4) + level.getBlockDataAt(tx, y, tz - 1)].isSolid()) { - ++n; - } - if (Block.fullList[(level.getBlockIdAt(tx, y, tz + 1) << 4) + level.getBlockDataAt(tx, y, tz + 1)].isSolid()) { - ++n; - } - - if (n == 1) { - level.setBlockAt(tx, y, tz, CHEST, 2); - Vector3 vec = new Vector3(tx, y, tz); - FullChunk ck = level.getChunk(vec.getChunkX(), vec.getChunkZ()); - BlockEntity be = BlockEntity.createBlockEntity(BlockEntity.CHEST, ck, BlockEntity.getDefaultCompound(vec, BlockEntity.CHEST)); - if (be != null) { - Inventory inv = ((BlockEntityChest) be).getInventory(); - inv.setContents(getChestLoot(inv.getSize())); - ck.addBlockEntity(be); - } - break; - } - } - } - } - - level.setBlockAt(x, y, z, MONSTER_SPAWNER); - BlockEntity be = BlockEntity.createBlockEntity(BlockEntity.MOB_SPAWNER, chunk, BlockEntity.getDefaultCompound(new Vector3(x, y, z), BlockEntity.MOB_SPAWNER).putInt("EntityId", MOBS[random.nextBoundedInt(MOBS.length)])); - if (be != null) { - chunk.addBlockEntity(be); - } - } - } - } - - private static Map getChestLoot(int size) { - Map items = new HashMap<>(); - boolean a = false, b = false, c = false, d = false, e = false, f = false, g = false, h = false, i = false, j = false, k = false, l = false, m = false, n = false, o = false, p = false, q = false, r = false, s = false, t = false, u = false, v = false, w = false; - for (int x = 0; x < size; x++) { - if (Utils.rand(1, 4) == 1) { - switch (Utils.rand(1, 23)) { - case 1: - if (!a) items.put(x, Item.get(ItemID.BONE, 0, Utils.rand(1, 8))); - a = true; - break; - case 2: - if (!b) items.put(x, Item.get(ItemID.GUNPOWDER, 0, Utils.rand(1, 8))); - b = true; - break; - case 3: - if (!c) items.put(x, Item.get(ItemID.ROTTEN_FLESH, 0, Utils.rand(1, 8))); - c = true; - break; - case 4: - if (!d) items.put(x, Item.get(ItemID.STRING, 0, Utils.rand(1, 8))); - d = true; - break; - case 5: - if (!e) items.put(x, Item.get(ItemID.WHEAT, 0, Utils.rand(1, 4))); - e = true; - break; - case 6: - if (!f) items.put(x, Item.get(ItemID.BREAD, 0, 1)); - f = true; - break; - case 7: - if (!g) items.put(x, Item.get(ItemID.NAME_TAG, 0, 1)); - g = true; - break; - case 8: - if (!h) items.put(x, Item.get(ItemID.SADDLE, 0, 1)); - h = true; - break; - case 9: - if (!i) items.put(x, Item.get(ItemID.COAL, 0, Utils.rand(1, 4))); - i = true; - break; - case 10: - if (!j) items.put(x, Item.get(ItemID.REDSTONE_DUST, 0, Utils.rand(1, 4))); - j = true; - break; - case 11: - if (!k && !l) items.put(x, Item.get(ItemID.RECORD_13, 0, 1)); - k = true; - break; - case 12: - if (!l && !k) items.put(x, Item.get(ItemID.RECORD_CAT, 0, 1)); - l = true; - break; - case 13: - if (!m) items.put(x, Item.get(ItemID.IRON_HORSE_ARMOR, 0, 1)); - m = true; - break; - case 14: - if (!n) items.put(x, Item.get(ItemID.GOLDEN_APPLE, 0, 1)); - n = true; - break; - case 15: - if (!o) items.put(x, Item.get(ItemID.BEETROOT_SEED, 0, Utils.rand(2, 4))); - o = true; - break; - case 16: - if (!p) items.put(x, Item.get(ItemID.MELON_SEEDS, 0, Utils.rand(2, 4))); - p = true; - break; - case 17: - if (!q) items.put(x, Item.get(ItemID.PUMPKIN_SEEDS, 0, Utils.rand(2, 4))); - q = true; - break; - case 18: - if (!r) items.put(x, Item.get(ItemID.IRON_INGOT, 0, Utils.rand(1, 4))); - r = true; - break; - case 19: - if (!s) items.put(x, Item.get(ItemID.BUCKET, 0, 1)); - s = true; - break; - case 20: - if (!t && !v) items.put(x, Item.get(ItemID.GOLD_HORSE_ARMOR, 0, 1)); - t = true; - break; - case 21: - if (!u) items.put(x, Item.get(ItemID.GOLD_INGOT, 0, Utils.rand(1, 4))); - u = true; - break; - case 22: - if (!v && !t && Utils.rand()) items.put(x, Item.get(ItemID.DIAMOND_HORSE_ARMOR, 0, 1)); - v = true; - break; - case 23: - if (!w && Utils.rand()) items.put(x, Item.get(ItemID.GOLDEN_APPLE_ENCHANTED, 0, 1)); - w = true; - break; - } - } - } - return items; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorFallenTree.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorFallenTree.java deleted file mode 100644 index a94dbc27c..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorFallenTree.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.structure.ObjectFallenTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; - -/** - * Created by PetteriM1 - */ -public class PopulatorFallenTree extends Populator { - - private ChunkManager level; - private int type; - - public void setType(int type) { //0 = oak, 1 = birch - this.type = type; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - if (random.nextRange(0, 3) != 1) return; - this.level = level; - int amount = 1; - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - if (level.getBlockIdAt(x, y, z) != Block.AIR || - level.getBlockIdAt(x + 1, y, z) != Block.AIR || - level.getBlockIdAt(x, y, z + 1) != Block.AIR || - level.getBlockIdAt(x - 1, y, z) != Block.AIR || - level.getBlockIdAt(x, y, z - 1) != Block.AIR || - level.getBlockIdAt(x + 1, y - 1, z) != Block.GRASS || - level.getBlockIdAt(x, y - 1, z + 1) != Block.GRASS || - level.getBlockIdAt(x - 1, y - 1, z) != Block.GRASS || - level.getBlockIdAt(x, y - 1, z - 1) != Block.GRASS || - level.getBlockIdAt(x + 2, y - 1, z) != Block.GRASS || - level.getBlockIdAt(x, y - 1, z + 2) != Block.GRASS || - level.getBlockIdAt(x - 2, y - 1, z) != Block.GRASS || - level.getBlockIdAt(x, y - 1, z - 2) != Block.GRASS || - level.getBlockIdAt(x - 3, y - 1, z) != Block.GRASS || - level.getBlockIdAt(x, y - 1, z - 3) != Block.GRASS || - level.getBlockIdAt(x + 2, y, z) != Block.AIR || - level.getBlockIdAt(x, y, z + 2) != Block.AIR || - level.getBlockIdAt(x + 3, y, z) != Block.AIR || - level.getBlockIdAt(x, y, z + 3) != Block.AIR) { - continue; - } - new ObjectFallenTree(this.level, x, y, z, type, random); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - - for (y = 127; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.GRASS) { - break; - } - } - - return ++y; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorFlower.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorFlower.java deleted file mode 100644 index 4a8afc112..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorFlower.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.helper.EnsureGrassBelow; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Angelic47, Niall Lindsay (Niall7459) - *

- * Nukkit Project - *

- */ -public class PopulatorFlower extends PopulatorSurfaceBlock { - - private final List flowerTypes = new ArrayList<>(); - - public void addType(int a, int b) { - int[] c = new int[2]; - c[0] = a; - c[1] = b; - this.flowerTypes.add(c); - } - - public List getTypes() { - return this.flowerTypes; - } - - @Override - protected void placeBlock(int x, int y, int z, int id, FullChunk chunk, NukkitRandom random) { - if (!flowerTypes.isEmpty()) { - int[] type = flowerTypes.get(Utils.random.nextInt(flowerTypes.size())); - chunk.setFullBlockId(x, y, z, (type[0] << 4) | type[1]); - if (type[0] == DOUBLE_PLANT) { - chunk.setFullBlockId(x, y + 1, z, (type[0] << 4) | (8 | type[1])); - } - } - } - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureGrassBelow.ensureGrassBelow(x, y, z, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 0; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGlowStone.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGlowStone.java deleted file mode 100644 index a972c6ba2..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGlowStone.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; - -public class PopulatorGlowStone extends Populator { - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = getHighestWorkableBlock(chunk, x & 0xF, z & 0xF); - if (y != -1 && level.getBlockIdAt(x, y, z) != NETHERRACK) { - int count = NukkitMath.randomRange(random, 40, 60); - for (int i = 0; i < count; i++) { - level.setBlockAt(x + (random.nextBoundedInt(7) - 3), y + (random.nextBoundedInt(9) - 4), z + (random.nextBoundedInt(7) - 3), GLOWSTONE); - } - } - } - - private static int getHighestWorkableBlock(FullChunk chunk, int x, int z) { - int y; - // Start scanning a bit lower down to allow space for placing on top - for (y = 120; y >= 0; y--) { - int b = chunk.getBlockId(x, y, z); - if (b == Block.AIR) { - break; - } - } - return y == 0 ? -1 : y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGrass.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGrass.java deleted file mode 100644 index ab865ba45..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGrass.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.PopulatorHelpers; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class PopulatorGrass extends PopulatorSurfaceBlock { - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return PopulatorHelpers.canGrassStay(x, y, z, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 497; // (TALL_GRASS << 4) | 1 - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGroundCover.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGroundCover.java deleted file mode 100644 index fc8ce18b2..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGroundCover.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.biome.EnumBiome; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.biome.Biome; -import cn.nukkit.level.biome.type.CoveredBiome; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class PopulatorGroundCover extends Populator { - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - for (int x = 15; x >= 0; x--) { - for (int z = 15; z >= 0; z--) { - Biome realBiome = EnumBiome.getBiome(chunk.getBiomeId(x, z)); - if (realBiome instanceof CoveredBiome) { - ((CoveredBiome) realBiome).doCover(x, z, chunk); - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGroundFire.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGroundFire.java deleted file mode 100644 index 84c5991df..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorGroundFire.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureBelow; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - */ -public class PopulatorGroundFire extends PopulatorSurfaceBlock { - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureBelow.ensureBelow(x, y, z, NETHERRACK, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 816; - } - - @Override - protected void placeBlock(int x, int y, int z, int id, FullChunk chunk, NukkitRandom random) { - super.placeBlock(x, y, z, id, chunk, random); - chunk.setBlockLight(x, y, z, Block.light[FIRE]); - } - - @Override - protected int getHighestWorkableBlock(ChunkManager level, int x, int z, FullChunk chunk) { - int y; - for (y = 0; y <= 127; ++y) { - int b = chunk.getBlockId(x, y, z); - if (b == Block.AIR) { - break; - } - } - return y == 0 ? -1 : y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorLava.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorLava.java deleted file mode 100644 index 9eda8d9bc..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorLava.java +++ /dev/null @@ -1,227 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; - -public class PopulatorLava extends Populator { - - private ChunkManager level; - private int randomAmount; - private int baseAmount; - private NukkitRandom random; - - public void setRandomAmount(int amount) { - this.randomAmount = amount; - } - - public void setBaseAmount(int amount) { - this.baseAmount = amount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.random = random; - if (random.nextRange(0, 100) < 5) { - this.level = level; - int amount = random.nextRange(0, this.randomAmount + 1) + this.baseAmount; - int bx = chunkX << 4; - int bz = chunkZ << 4; - for (int i = 0; i < amount; ++i) { - int x = random.nextRange(0, 15); - int z = random.nextRange(0, 15); - int y = getHighestWorkableBlock(chunk, x, z); - if (y != -1 && chunk.getBlockId(x, y, z) == Block.AIR) { - chunk.setBlock(x, y, z, Block.LAVA); - chunk.setBlockLight(x, y, z, Block.light[Block.LAVA]); - this.lavaSpread(bx + x, y, bz + z); - } - } - } - } - - private int getFlowDecay(int x1, int y1, int z1, int x2, int y2, int z2) { - if (this.level.getBlockIdAt(x1, y1, z1) != this.level.getBlockIdAt(x2, y2, z2)) { - return -1; - } else { - return this.level.getBlockDataAt(x2, y2, z2); - } - } - - private void lavaSpread(int x, int y, int z) { - if (this.level.getChunk(x >> 4, z >> 4) == null) { - return; - } - int decay = this.getFlowDecay(x, y, z, x, y, z); - int multiplier = 2; - if (decay > 0) { - int smallestFlowDecay = -100; - smallestFlowDecay = this.getSmallestFlowDecay(x, y, z, x, y, z - 1, smallestFlowDecay); - smallestFlowDecay = this.getSmallestFlowDecay(x, y, z, x, y, z + 1, smallestFlowDecay); - smallestFlowDecay = this.getSmallestFlowDecay(x, y, z, x - 1, y, z, smallestFlowDecay); - smallestFlowDecay = this.getSmallestFlowDecay(x, y, z, x + 1, y, z, smallestFlowDecay); - int k = smallestFlowDecay + multiplier; - if (k >= 8 || smallestFlowDecay < 0) { - k = -1; - } - int topFlowDecay = this.getFlowDecay(x, y, z, x, y + 1, z); - if (topFlowDecay >= 0) { - if (topFlowDecay >= 8) { - k = topFlowDecay; - } else { - k = topFlowDecay | 0x08; - } - } - if (decay < 8 && k < 8 && k > 1 && random.nextRange(0, 4) != 0) { - k = decay; - } - if (k != decay) { - decay = k; - if (decay < 0) { - this.level.setBlockAt(x, y, z, 0); - } else { - this.level.setBlockAt(x, y, z, Block.LAVA, decay); - this.lavaSpread(x, y, z); - return; - } - } - } - if (this.canFlowInto(x, y - 1, z)) { - if (decay >= 8) { - this.flowIntoBlock(x, y - 1, z, decay); - } else { - this.flowIntoBlock(x, y - 1, z, decay | 0x08); - } - } else if (decay >= 0 && (decay == 0 || !this.canFlowInto(x, y - 1, z))) { - boolean[] flags = this.getOptimalFlowDirections(x, y, z); - int l = decay + multiplier; - if (decay >= 8) { - l = 1; - } - if (l >= 8) { - return; - } - if (flags[0]) { - this.flowIntoBlock(x - 1, y, z, l); - } - if (flags[1]) { - this.flowIntoBlock(x + 1, y, z, l); - } - if (flags[2]) { - this.flowIntoBlock(x, y, z - 1, l); - } - if (flags[3]) { - this.flowIntoBlock(x, y, z + 1, l); - } - } - } - - private void flowIntoBlock(int x, int y, int z, int newFlowDecay) { - if (this.level.getBlockIdAt(x, y, z) == Block.AIR) { - this.level.setBlockAt(x, y, z, Block.LAVA, newFlowDecay); - this.lavaSpread(x, y, z); - } - } - - private boolean canFlowInto(int x, int y, int z) { - int id = this.level.getBlockIdAt(x, y, z); - return id == Block.AIR || id == Block.LAVA || id == Block.STILL_LAVA; - } - - private int calculateFlowCost(int xx, int yy, int zz, int accumulatedCost, int previousDirection) { - int cost = 1000; - for (int j = 0; j < 4; ++j) { - if ( - (j == 0 && previousDirection == 1) || - (j == 1 && previousDirection == 0) || - (j == 2 && previousDirection == 3) || - (j == 3 && previousDirection == 2) - ) { - int x = xx; - int z = zz; - if (j == 0) { - --x; - } else if (j == 1) { - ++x; - } else if (j == 2) { - --z; - } else if (j == 3) { - ++z; - } - if (!this.canFlowInto(x, yy, z)) { - continue; - } else if (this.canFlowInto(x, yy, z) && this.level.getBlockDataAt(x, yy, z) == 0) { - continue; - } else if (this.canFlowInto(x, yy - 1, z)) { - return accumulatedCost; - } - if (accumulatedCost >= 4) { - continue; - } - int realCost = this.calculateFlowCost(x, yy, z, accumulatedCost + 1, j); - if (realCost < cost) { - cost = realCost; - } - } - } - return cost; - } - - private boolean[] getOptimalFlowDirections(int xx, int yy, int zz) { - int[] flowCost = {0, 0, 0, 0}; - boolean[] isOptimalFlowDirection = {false, false, false, false}; - for (int j = 0; j < 4; ++j) { - flowCost[j] = 1000; - int x = xx; - int z = zz; - if (j == 0) { - --x; - } else if (j == 1) { - ++x; - } else if (j == 2) { - --z; - } else if (j == 3) { - ++z; - } - if (this.canFlowInto(x, yy - 1, z)) { - flowCost[j] = 0; - } else { - flowCost[j] = this.calculateFlowCost(x, yy, z, 1, j); - } - } - int minCost = flowCost[0]; - for (int i = 1; i < 4; ++i) { - if (flowCost[i] < minCost) { - minCost = flowCost[i]; - } - } - for (int i = 0; i < 4; ++i) { - isOptimalFlowDirection[i] = (flowCost[i] == minCost); - } - return isOptimalFlowDirection; - } - - private int getSmallestFlowDecay(int x1, int y1, int z1, int x2, int y2, int z2, int decay) { - int blockDecay = this.getFlowDecay(x1, y1, z1, x2, y2, z2); - if (blockDecay < 0) { - return decay; - } else if (blockDecay >= 8) { - blockDecay = 0; - } - return (decay >= 0 && blockDecay >= decay) ? decay : blockDecay; - } - - - private static int getHighestWorkableBlock(FullChunk chunk, int x, int z) { - int y; - for (y = 127; y >= 0; y--) { - int b = chunk.getBlockId(x, y, z); - if (b == Block.AIR) { - break; - } - } - return y == 0 ? -1 : y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorLilyPad.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorLilyPad.java deleted file mode 100644 index 79ed75ce9..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorLilyPad.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureBelow; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - */ -public class PopulatorLilyPad extends PopulatorSurfaceBlock { - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureBelow.ensureBelow(x, y, z, STILL_WATER, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 1776; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorMelon.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorMelon.java deleted file mode 100644 index 4fcb9991b..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorMelon.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.helper.EnsureGrassBelow; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - */ -public class PopulatorMelon extends PopulatorSurfaceBlock { - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureGrassBelow.ensureGrassBelow(x, y, z, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 1648; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorNetherWart.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorNetherWart.java deleted file mode 100644 index 384a40857..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorNetherWart.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; - -/** - * Created by PetteriM1 - */ -public class PopulatorNetherWart extends Populator { - - private int randomAmount; - private int baseAmount; - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - int amount = random.nextRange(0, this.randomAmount + 1) + this.baseAmount; - for (int i = 0; i < amount; ++i) { - int x = random.nextRange(0, 15); - int z = random.nextRange(0, 15); - int y = getHighestWorkableBlock(chunk, x, z); - if (y != -1 && canNetherWartStay(chunk, x, y, z)) { - chunk.setBlock(x, y, z, Block.NETHER_WART_BLOCK); - } - } - } - - private static boolean canNetherWartStay(FullChunk chunk, int x, int y, int z) { - return (chunk.getBlockId(x, y, z) == Block.AIR) && chunk.getBlockId(x, y - 1, z) == Block.SOUL_SAND; - } - - private static int getHighestWorkableBlock(FullChunk chunk, int x, int z) { - int y; - - for (y = 0; y <= 127; ++y) { - int b = chunk.getBlockId(x, y, z); - if (b == Block.AIR) { - break; - } - } - return y == 0 ? -1 : y; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorOre.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorOre.java deleted file mode 100644 index 2fcae2710..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorOre.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.ore.OreType; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - */ -public class PopulatorOre extends Populator { - - private final int replaceId; - private final OreType[] oreTypes; - - public PopulatorOre(int replaceId, OreType[] oreTypes) { - this.replaceId = replaceId; - this.oreTypes = oreTypes; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - int sx = chunkX << 4; - int ex = sx + 15; - int sz = chunkZ << 4; - int ez = sz + 15; - for (OreType type : this.oreTypes) { - for (int i = 0; i < type.clusterCount; i++) { - int x = NukkitMath.randomRange(random, sx, ex); - int z = NukkitMath.randomRange(random, sz, ez); - int y = NukkitMath.randomRange(random, type.minHeight, type.maxHeight); - if (level.getBlockIdAt(x, y, z) != replaceId) { - continue; - } - if (type.clusterSize == 1) { - level.setBlockFullIdAt(x, y, z, type.fullId); - } else { - type.spawn(level, random, replaceId, x, y, z); - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorPumpkin.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorPumpkin.java deleted file mode 100644 index 7bfaa828b..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorPumpkin.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.utils.Utils; - -/** - * Created by PetteriM1 - */ -public class PopulatorPumpkin extends Populator { - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - if (Utils.rand(0, 10) == 5) { - int x = random.nextRange(0, 15); - int z = random.nextRange(0, 15); - int y = getHighestWorkableBlock(chunk, x, z); - if (y != -1 && canPumpkinStay(chunk, x, y, z)) { - chunk.setBlock(x, y, z, Block.PUMPKIN); - } - } - } - - private static boolean canPumpkinStay(FullChunk chunk, int x, int y, int z) { - int b = chunk.getBlockId(x, y, z); - return (b == Block.AIR) && chunk.getBlockId(x, y - 1, z) == Block.GRASS; - } - - private static int getHighestWorkableBlock(FullChunk chunk, int x, int z) { - int y; - for (y = 0; y <= 127; ++y) { - int b = chunk.getBlockId(x, y, z); - if (b == Block.AIR) { - break; - } - } - return y == 0 ? -1 : y; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorSmallMushroom.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorSmallMushroom.java deleted file mode 100644 index b4d0cdd86..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorSmallMushroom.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.helper.EnsureGrassBelow; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - */ -public class PopulatorSmallMushroom extends PopulatorSurfaceBlock { - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - return EnsureCover.ensureCover(x, y, z, chunk) && EnsureGrassBelow.ensureGrassBelow(x, y, z, chunk); - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 624; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorSugarcane.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorSugarcane.java deleted file mode 100644 index b5013442b..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorSugarcane.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.EnsureBelow; -import cn.nukkit.level.generator.populator.helper.EnsureCover; -import cn.nukkit.level.generator.populator.helper.EnsureGrassBelow; -import cn.nukkit.level.generator.populator.type.PopulatorSurfaceBlock; -import cn.nukkit.math.NukkitRandom; - -/** - * @author Niall Lindsay (Niall7459) - *

- * Nukkit Project - *

- */ -public class PopulatorSugarcane extends PopulatorSurfaceBlock { - - private static boolean findWater(int x, int y, int z, Level level) { - int count = 0; - for (int i = x - 4; i < (x + 4); i++) { - for (int j = z - 4; j < (z + 4); j++) { - int b = level.getBlockIdAt(i, y, j); - if (b == Block.WATER || b == Block.STILL_WATER) { - count++; - } - if (count > 10) { - return true; - } - } - } - return false; - } - - @Override - protected boolean canStay(int x, int y, int z, FullChunk chunk) { - try { - return EnsureCover.ensureCover(x, y, z, chunk) && (EnsureGrassBelow.ensureGrassBelow(x, y, z, chunk) || EnsureBelow.ensureBelow(x, y, z, SAND, chunk)) && findWater(x, y - 1, z, chunk.getProvider().getLevel()); - } catch (Exception e) { - return false; - } - } - - @Override - protected int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk) { - return 1329; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorTallSugarcane.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorTallSugarcane.java deleted file mode 100644 index 616ec52cc..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorTallSugarcane.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.utils.Utils; - -/** - * @author Niall Lindsay (Niall7459) - *

- * Nukkit Project - *

- */ - -public class PopulatorTallSugarcane extends PopulatorSugarcane { - - @Override - protected void placeBlock(int x, int y, int z, int id, FullChunk chunk, NukkitRandom random) { - for (int i = 0; i < Utils.random.nextInt(3) + 1; i++) { - chunk.setFullBlockId(x, y + i, z, id); - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorTree.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorTree.java deleted file mode 100644 index 8b37e8464..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorTree.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectTree; -import cn.nukkit.level.generator.populator.type.PopulatorCount; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * Nukkit Project - */ -public class PopulatorTree extends PopulatorCount { - - private final int type; - private ChunkManager level; - - public PopulatorTree() { - this(BlockSapling.OAK); - } - - public PopulatorTree(int type) { - this.type = type; - } - - @Override - public void populateCount(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y < 3) { - return; - } - ObjectTree.growTree(this.level, x, y, z, random, this.type); - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 254; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorWell.java b/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorWell.java deleted file mode 100644 index daef4d2f5..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/PopulatorWell.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.structure.ObjectWell; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; - -/** - * Created by PetteriM1 - */ -public class PopulatorWell extends Populator { - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - if (random.nextBoundedInt(190) != 1) return; - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(chunk, x, z); - if (y == -1 || y > 128) { - return; - } - new ObjectWell(level, x, y, z); - } - - private int getHighestWorkableBlock(FullChunk chunk, int x, int z) { - int y; - - for (y = 127; y > 0; --y) { - int b = chunk.getBlockId(x & 0x0f, y & 0xff, z & 0x0f); - if (b == Block.SAND) { - break; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/WaterIcePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/WaterIcePopulator.java deleted file mode 100644 index 55d9f5393..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/WaterIcePopulator.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.level.generator.populator.impl; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.biome.Biome; -import cn.nukkit.level.biome.EnumBiome; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitRandom; - -public class WaterIcePopulator extends Populator { - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - Biome biome = EnumBiome.getBiome(chunk.getBiomeId(x, z)); - if (biome.isFreezing()) { - int topBlock = chunk.getHighestBlockAt(x, z); - if (chunk.getBlockId(x, topBlock, z) == STILL_WATER) { - chunk.setBlockId(x, topBlock, z, ICE); - } - } - } - } - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/DarkOakTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/tree/DarkOakTreePopulator.java deleted file mode 100644 index 8482a7dcc..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/DarkOakTreePopulator.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.level.generator.populator.impl.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectDarkOakTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class DarkOakTreePopulator extends Populator { - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public DarkOakTreePopulator() { - this(BlockSapling.DARK_OAK); - } - - public DarkOakTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - - new ObjectDarkOakTree().generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 255; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleBigTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleBigTreePopulator.java deleted file mode 100644 index 05f7f1c29..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleBigTreePopulator.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.nukkit.level.generator.populator.impl.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockLeaves; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.block.BlockWood; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectJungleBigTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - - -public class JungleBigTreePopulator extends Populator { - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public JungleBigTreePopulator() { - this(BlockSapling.JUNGLE); - } - - public JungleBigTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new ObjectJungleBigTree(10, 20, Block.get(WOOD, BlockWood.JUNGLE), Block.get(LEAVES, BlockLeaves.JUNGLE)).generate(this.level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 255; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleFloorPopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleFloorPopulator.java deleted file mode 100644 index 91e2b158e..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleFloorPopulator.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.level.generator.populator.impl.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.NewJungleTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -/** - * @author DaPorkchop_ - * - * Used for the dense foliage on the floor in the jungle M biome - */ -public class JungleFloorPopulator extends Populator { - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public JungleFloorPopulator() { - this(BlockSapling.JUNGLE); - } - - public JungleFloorPopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new NewJungleTree(1, 0).generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 255; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleTreePopulator.java deleted file mode 100644 index 1018a3f70..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/JungleTreePopulator.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.level.generator.populator.impl.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.NewJungleTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class JungleTreePopulator extends Populator { - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public JungleTreePopulator() { - this(BlockSapling.JUNGLE); - } - - public JungleTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new NewJungleTree(4 + random.nextBoundedInt(7), 3).generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 255; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SavannaTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SavannaTreePopulator.java deleted file mode 100644 index e83a8b572..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SavannaTreePopulator.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.level.generator.populator.impl.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectSavannaTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class SavannaTreePopulator extends Populator { - - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public SavannaTreePopulator() { - this(BlockSapling.ACACIA); - } - - public SavannaTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new ObjectSavannaTree().generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 127; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SpruceBigTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SpruceBigTreePopulator.java deleted file mode 100644 index d66382f37..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SpruceBigTreePopulator.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.nukkit.level.generator.populator.impl.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectBigSpruceTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - - -public class SpruceBigTreePopulator extends Populator { - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public SpruceBigTreePopulator() { - } - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new ObjectBigSpruceTree(0.75f, 4).placeObject(this.level, (int) (v.x = x), (int) (v.y = y), (int) (v.z = z), random); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 255; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SpruceMegaTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SpruceMegaTreePopulator.java deleted file mode 100644 index 7819acdbd..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SpruceMegaTreePopulator.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.nukkit.level.generator.populator.impl.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectBigSpruceTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -/** - * @author DaPorkchop_ - */ -public class SpruceMegaTreePopulator extends Populator { - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public SpruceMegaTreePopulator() { - } - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new ObjectBigSpruceTree(0.25f, 5).placeObject(this.level, (int) (v.x = x), (int) (v.y = y), (int) (v.z = z), random); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 255; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SwampTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SwampTreePopulator.java deleted file mode 100644 index 50828a5a2..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/impl/tree/SwampTreePopulator.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.level.generator.populator.impl.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectSwampTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class SwampTreePopulator extends Populator { - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public SwampTreePopulator() { - this(BlockSapling.OAK); - } - - public SwampTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new ObjectSwampTree().generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 127; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/tree/DarkOakTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/tree/DarkOakTreePopulator.java deleted file mode 100644 index b85f34d20..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/tree/DarkOakTreePopulator.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.nukkit.level.generator.populator.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectDarkOakTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class DarkOakTreePopulator extends Populator { - - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public DarkOakTreePopulator() { - this(BlockSapling.DARK_OAK); - } - - public DarkOakTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - - new ObjectDarkOakTree().generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 127; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/tree/JungleBigTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/tree/JungleBigTreePopulator.java deleted file mode 100644 index 65dd8f65d..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/tree/JungleBigTreePopulator.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.level.generator.populator.tree; - -import cn.nukkit.block.*; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectJungleBigTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class JungleBigTreePopulator extends Populator { - - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public JungleBigTreePopulator() { - this(BlockSapling.JUNGLE); - } - - public JungleBigTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new ObjectJungleBigTree(10, 20, Block.get(BlockID.WOOD, BlockWood.JUNGLE), Block.get(BlockID.LEAVES, BlockLeaves.JUNGLE)).generate(this.level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 127; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/tree/JungleTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/tree/JungleTreePopulator.java deleted file mode 100644 index 4882257ea..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/tree/JungleTreePopulator.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.level.generator.populator.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.NewJungleTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class JungleTreePopulator extends Populator { - - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public JungleTreePopulator() { - this(BlockSapling.JUNGLE); - } - - public JungleTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new NewJungleTree(4 + random.nextBoundedInt(7)).generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 127; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/tree/SavannaTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/tree/SavannaTreePopulator.java deleted file mode 100644 index d4d55213d..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/tree/SavannaTreePopulator.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.level.generator.populator.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectSavannaTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class SavannaTreePopulator extends Populator { - - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public SavannaTreePopulator() { - this(BlockSapling.ACACIA); - } - - public SavannaTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new ObjectSavannaTree().generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 127; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/tree/SwampTreePopulator.java b/src/main/java/cn/nukkit/level/generator/populator/tree/SwampTreePopulator.java deleted file mode 100644 index ab09530fe..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/tree/SwampTreePopulator.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.level.generator.populator.tree; - -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockSapling; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.object.tree.ObjectSwampTree; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.math.Vector3; - -public class SwampTreePopulator extends Populator { - - private ChunkManager level; - private int randomAmount; - private int baseAmount; - - public SwampTreePopulator() { - this(BlockSapling.OAK); - } - - public SwampTreePopulator(int type) {} - - public void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount; - } - - public void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - this.level = level; - int amount = random.nextBoundedInt(this.randomAmount + 1) + this.baseAmount; - Vector3 v = new Vector3(); - - for (int i = 0; i < amount; ++i) { - int x = NukkitMath.randomRange(random, chunkX << 4, (chunkX << 4) + 15); - int z = NukkitMath.randomRange(random, chunkZ << 4, (chunkZ << 4) + 15); - int y = this.getHighestWorkableBlock(x, z); - if (y == -1) { - continue; - } - new ObjectSwampTree().generate(level, random, v.setComponents(x, y, z)); - } - } - - private int getHighestWorkableBlock(int x, int z) { - int y; - for (y = 127; y > 0; --y) { - int b = this.level.getBlockIdAt(x, y, z); - if (b == Block.DIRT || b == Block.GRASS) { - break; - } else if (b != Block.AIR && b != Block.SNOW_LAYER) { - return -1; - } - } - - return ++y; - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/type/Populator.java b/src/main/java/cn/nukkit/level/generator/populator/type/Populator.java deleted file mode 100644 index 68b4407e3..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/type/Populator.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.generator.populator.type; - -import cn.nukkit.block.BlockID; -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.NukkitRandom; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Populator implements BlockID { - - public abstract void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk); - - protected int getHighestWorkableBlock(ChunkManager level, int x, int z, FullChunk chunk) { - return chunk.getHighestBlockAt(x & 0xF, z & 0xF); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/type/PopulatorCount.java b/src/main/java/cn/nukkit/level/generator/populator/type/PopulatorCount.java deleted file mode 100644 index c53799726..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/type/PopulatorCount.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.level.generator.populator.type; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * - * A populator that generates an object a certain amount of times. - * This prevents the exact same code from being repeated in nearly every single populator - */ -public abstract class PopulatorCount extends Populator { - - private int randomAmount; - private int baseAmount; - - public final void setRandomAmount(int randomAmount) { - this.randomAmount = randomAmount + 1; - } - - public final void setBaseAmount(int baseAmount) { - this.baseAmount = baseAmount; - } - - @Override - public final void populate(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - int count = baseAmount + random.nextBoundedInt(randomAmount); - for (int i = 0; i < count; i++) { - populateCount(level, chunkX, chunkZ, random, chunk); - } - } - - protected abstract void populateCount(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk); -} diff --git a/src/main/java/cn/nukkit/level/generator/populator/type/PopulatorSurfaceBlock.java b/src/main/java/cn/nukkit/level/generator/populator/type/PopulatorSurfaceBlock.java deleted file mode 100644 index 8cd56ac32..000000000 --- a/src/main/java/cn/nukkit/level/generator/populator/type/PopulatorSurfaceBlock.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.level.generator.populator.type; - -import cn.nukkit.level.ChunkManager; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.level.generator.populator.helper.PopulatorHelpers; -import cn.nukkit.math.NukkitRandom; - -/** - * @author DaPorkchop_ - * - * A populator that populates a single block type. - */ -public abstract class PopulatorSurfaceBlock extends PopulatorCount { - - @Override - protected void populateCount(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random, FullChunk chunk) { - int x = random.nextBoundedInt(16); - int z = random.nextBoundedInt(16); - int y = getHighestWorkableBlock(level, x, z, chunk); - if (y > 0 && canStay(x, y, z, chunk)) { - placeBlock(x, y, z, getBlockId(x, z, random, chunk), chunk, random); - } - } - - protected abstract boolean canStay(int x, int y, int z, FullChunk chunk); - - protected abstract int getBlockId(int x, int z, NukkitRandom random, FullChunk chunk); - - @Override - protected int getHighestWorkableBlock(ChunkManager level, int x, int z, FullChunk chunk) { - int y; - // Start at 254 because we add one afterwards - for (y = 254; y >= 0; --y) { - if (!PopulatorHelpers.isNonSolid(chunk.getBlockId(x, y, z))) { - break; - } - } - - return y == 0 ? -1 : ++y; - } - - protected void placeBlock(int x, int y, int z, int id, FullChunk chunk, NukkitRandom random) { - chunk.setFullBlockId(x, y, z, id); - } -} diff --git a/src/main/java/cn/nukkit/level/generator/task/GenerationTask.java b/src/main/java/cn/nukkit/level/generator/task/GenerationTask.java deleted file mode 100644 index ee311a508..000000000 --- a/src/main/java/cn/nukkit/level/generator/task/GenerationTask.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.nukkit.level.generator.task; - -import cn.nukkit.Server; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.level.generator.Generator; -import cn.nukkit.level.generator.SimpleChunkManager; -import cn.nukkit.scheduler.AsyncTask; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class GenerationTask extends AsyncTask { - - private final Level level; - public boolean state; - private BaseFullChunk chunk; - - - public GenerationTask(Level level, BaseFullChunk chunk) { - this.state = true; - this.chunk = chunk; - this.level = level; - } - - @Override - public void onRun() { - Generator generator = level.getGenerator(); - this.state = false; - if (generator == null) { - return; - } - - SimpleChunkManager manager = (SimpleChunkManager) generator.getChunkManager(); - - if (manager == null) { - this.state = false; - return; - } - - manager.cleanChunks(level.getSeed()); - synchronized (manager) { - try { - BaseFullChunk chunk = this.chunk; - - if (chunk == null) { - return; - } - - synchronized (chunk) { - if (!chunk.isGenerated()) { - manager.setChunk(chunk.getX(), chunk.getZ(), chunk); - generator.generateChunk(chunk.getX(), chunk.getZ()); - chunk = manager.getChunk(chunk.getX(), chunk.getZ()); - chunk.setGenerated(); - } - } - this.chunk = chunk; - state = true; - } finally { - manager.cleanChunks(level.getSeed()); - } - } - } - - @Override - public void onCompletion(Server server) { - if (level != null) { - if (!this.state) { - return; - } - - BaseFullChunk chunk = this.chunk; - - if (chunk == null) { - return; - } - - level.generateChunkCallback(chunk.getX(), chunk.getZ(), chunk); - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/task/LightPopulationTask.java b/src/main/java/cn/nukkit/level/generator/task/LightPopulationTask.java deleted file mode 100644 index 8c9c93a8c..000000000 --- a/src/main/java/cn/nukkit/level/generator/task/LightPopulationTask.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.level.generator.task; - -import cn.nukkit.Server; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.scheduler.AsyncTask; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class LightPopulationTask extends AsyncTask { - - public final int levelId; - public BaseFullChunk chunk; - - public LightPopulationTask(Level level, BaseFullChunk chunk) { - this.levelId = level.getId(); - this.chunk = chunk; - } - - @Override - public void onRun() { - BaseFullChunk chunk = this.chunk.clone(); - if (chunk == null) { - return; - } - - chunk.recalculateHeightMap(); - chunk.populateSkyLight(); - chunk.setLightPopulated(); - - this.chunk = chunk.clone(); - } - - @Override - public void onCompletion(Server server) { - Level level = server.getLevel(this.levelId); - - BaseFullChunk chunk = this.chunk.clone(); - if (level != null) { - if (chunk == null) { - return; - } - - level.generateChunkCallback(chunk.getX(), chunk.getZ(), chunk); - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/generator/task/PopulationTask.java b/src/main/java/cn/nukkit/level/generator/task/PopulationTask.java deleted file mode 100644 index d5cd30e64..000000000 --- a/src/main/java/cn/nukkit/level/generator/task/PopulationTask.java +++ /dev/null @@ -1,166 +0,0 @@ -package cn.nukkit.level.generator.task; - -import cn.nukkit.Server; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.level.generator.Generator; -import cn.nukkit.level.generator.SimpleChunkManager; -import cn.nukkit.scheduler.AsyncTask; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PopulationTask extends AsyncTask { - - private final long seed; - private final Level level; - private boolean state; - private BaseFullChunk centerChunk; - private boolean isPopulated; - - public final BaseFullChunk[] chunks = new BaseFullChunk[9]; - - public PopulationTask(Level level, BaseFullChunk chunk) { - this.state = true; - this.level = level; - this.centerChunk = chunk; - this.seed = level.getSeed(); - - chunks[4] = chunk; - - int i = 0; - for (int z = -1; z <= 1; z++) { - for (int x = -1; x <= 1; x++, i++) { - if (i == 4) continue; - BaseFullChunk ck = level.getChunk(chunk.getX() + x, chunk.getZ() + z, true); - this.chunks[i] = ck; - } - } - } - - - @Override - public void onRun() { - syncGen(0); - } - - private void syncGen(int i) { - if (i == chunks.length) { - generationTask(); - } else { - BaseFullChunk chunk = chunks[i]; - if (chunk != null) { - synchronized (chunk) { - syncGen(i + 1); - } - } - } - } - - private void generationTask() { - this.state = false; - Generator generator = level.getGenerator(); - if (generator == null) { - return; - } - - SimpleChunkManager manager = (SimpleChunkManager) generator.getChunkManager(); - - if (manager == null) { - this.state = false; - return; - } - - synchronized (manager) { - try { - manager.cleanChunks(this.seed); - BaseFullChunk centerChunk = this.centerChunk; - - if (centerChunk == null) { - return; - } - - int index = 0; - for (int x = -1; x < 2; x++) { - for (int z = -1; z < 2; z++, index++) { - BaseFullChunk ck = this.chunks[index]; - if (ck == centerChunk) continue; - if (ck == null) { - //try { - //this.chunks[index] = (BaseFullChunk) centerChunk.getClass().getMethod("getEmptyChunk", int.class, int.class).invoke(null, centerChunk.getX() + x, centerChunk.getZ() + z); - this.chunks[index] = level.getProvider().getEmptyChunk(centerChunk.getX() + x, centerChunk.getZ() + z); - //} catch (Exception e) { - // throw new RuntimeException(e); - //} - } else { - this.chunks[index] = ck; - } - } - } - - for (BaseFullChunk chunk : this.chunks) { - manager.setChunk(chunk.getX(), chunk.getZ(), chunk); - if (!chunk.isGenerated()) { - generator.generateChunk(chunk.getX(), chunk.getZ()); - BaseFullChunk newChunk = manager.getChunk(chunk.getX(), chunk.getZ()); - newChunk.setGenerated(); - if (newChunk != chunk) manager.setChunk(chunk.getX(), chunk.getZ(), newChunk); - } - } - - isPopulated = centerChunk.isPopulated(); - if (!isPopulated) { - generator.populateChunk(centerChunk.getX(), centerChunk.getZ()); - centerChunk = manager.getChunk(centerChunk.getX(), centerChunk.getZ()); - centerChunk.setPopulated(); - centerChunk.recalculateHeightMap(); - centerChunk.populateSkyLight(); - centerChunk.setLightPopulated(); - this.centerChunk = centerChunk; - } - - manager.setChunk(centerChunk.getX(), centerChunk.getZ()); - - index = 0; - for (int x = -1; x < 2; x++) { - for (int z = -1; z < 2; z++, index++) { - chunks[index] = null; - BaseFullChunk newChunk = manager.getChunk(centerChunk.getX() + x, centerChunk.getZ() + z); - if (newChunk != null) { - if (newChunk.hasChanged()) { - chunks[index] = newChunk; - } - } - } - } - this.state = true; - } finally { - manager.cleanChunks(this.seed); - } - } - } - - @Override - public void onCompletion(Server server) { - if (level != null) { - if (!this.state) { - return; - } - - BaseFullChunk centerChunk = this.centerChunk; - - if (centerChunk == null) { - return; - } - - for (BaseFullChunk chunk : this.chunks) { - if (chunk != null) { - level.generateChunkCallback(chunk.getX(), chunk.getZ(), chunk); - } - } - - level.generateChunkCallback(centerChunk.getX(), centerChunk.getZ(), centerChunk, isPopulated); - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/particle/AngryVillagerParticle.java b/src/main/java/cn/nukkit/level/particle/AngryVillagerParticle.java deleted file mode 100644 index 42506adab..000000000 --- a/src/main/java/cn/nukkit/level/particle/AngryVillagerParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class AngryVillagerParticle extends GenericParticle { - - public AngryVillagerParticle(Vector3 pos) { - super(pos, Particle.TYPE_VILLAGER_ANGRY); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/BlockForceFieldParticle.java b/src/main/java/cn/nukkit/level/particle/BlockForceFieldParticle.java deleted file mode 100644 index fd84ef2c6..000000000 --- a/src/main/java/cn/nukkit/level/particle/BlockForceFieldParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -public class BlockForceFieldParticle extends GenericParticle { - - public BlockForceFieldParticle(Vector3 pos) { - this(pos, 0); - } - - public BlockForceFieldParticle(Vector3 pos, int scale) { - super(pos, Particle.TYPE_BLOCK_FORCE_FIELD); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/BoneMealParticle.java b/src/main/java/cn/nukkit/level/particle/BoneMealParticle.java deleted file mode 100644 index 771db8a91..000000000 --- a/src/main/java/cn/nukkit/level/particle/BoneMealParticle.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created by CreeperFace on 15.4.2017. - */ -public class BoneMealParticle extends Particle { - - public BoneMealParticle(Vector3 pos) { - super(pos.x, pos.y, pos.z); - } - - @Override - public DataPacket[] mvEncode(int protocol) { - LevelEventPacket packet = new LevelEventPacket(); - packet.evid = LevelEventPacket.EVENT_PARTICLE_BONEMEAL; - packet.x = (float) this.x; - packet.y = (float) this.y; - packet.z = (float) this.z; - packet.data = 0; - packet.protocol = protocol; - packet.tryEncode(); - return new DataPacket[]{packet}; - } -} diff --git a/src/main/java/cn/nukkit/level/particle/BubbleParticle.java b/src/main/java/cn/nukkit/level/particle/BubbleParticle.java deleted file mode 100644 index 2991032c1..000000000 --- a/src/main/java/cn/nukkit/level/particle/BubbleParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class BubbleParticle extends GenericParticle { - - public BubbleParticle(Vector3 pos) { - super(pos, Particle.TYPE_BUBBLE); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/CriticalParticle.java b/src/main/java/cn/nukkit/level/particle/CriticalParticle.java deleted file mode 100644 index 088230e13..000000000 --- a/src/main/java/cn/nukkit/level/particle/CriticalParticle.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class CriticalParticle extends GenericParticle { - - public CriticalParticle(Vector3 pos) { - this(pos, 2); - } - - public CriticalParticle(Vector3 pos, int scale) { - super(pos, Particle.TYPE_CRITICAL, scale); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/DestroyBlockParticle.java b/src/main/java/cn/nukkit/level/particle/DestroyBlockParticle.java deleted file mode 100644 index 9832d2115..000000000 --- a/src/main/java/cn/nukkit/level/particle/DestroyBlockParticle.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.block.Block; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.network.protocol.ProtocolInfo; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class DestroyBlockParticle extends Particle { - - protected final Block block; - - public DestroyBlockParticle(Vector3 pos, Block block) { - super(pos.x, pos.y, pos.z); - this.block = block; - } - - @Override - public DataPacket[] mvEncode(int protocol) { - LevelEventPacket packet = new LevelEventPacket(); - packet.evid = LevelEventPacket.EVENT_PARTICLE_DESTROY; - packet.x = (float) this.x; - packet.y = (float) this.y; - packet.z = (float) this.z; - packet.data = protocol <= ProtocolInfo.v1_2_10 ? (block.getId() | (block.getDamage() << 8)) : GlobalBlockPalette.getOrCreateRuntimeId(protocol, block.getId(), block.getDamage()); - packet.protocol = protocol; - packet.tryEncode(); - return new DataPacket[]{packet}; - } -} diff --git a/src/main/java/cn/nukkit/level/particle/DustParticle.java b/src/main/java/cn/nukkit/level/particle/DustParticle.java deleted file mode 100644 index 1497b90aa..000000000 --- a/src/main/java/cn/nukkit/level/particle/DustParticle.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class DustParticle extends GenericParticle { - - public DustParticle(Vector3 pos, BlockColor blockColor) { - this(pos, blockColor.getRed(), blockColor.getGreen(), blockColor.getBlue(), blockColor.getAlpha()); - } - - public DustParticle(Vector3 pos, int r, int g, int b) { - this(pos, r, g, b, 255); - } - - public DustParticle(Vector3 pos, int r, int g, int b, int a) { - super(pos, Particle.TYPE_DUST, ((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/EnchantParticle.java b/src/main/java/cn/nukkit/level/particle/EnchantParticle.java deleted file mode 100644 index 87d26ef20..000000000 --- a/src/main/java/cn/nukkit/level/particle/EnchantParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class EnchantParticle extends GenericParticle { - - public EnchantParticle(Vector3 pos) { - super(pos, Particle.TYPE_MOB_SPELL); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/EnchantmentTableParticle.java b/src/main/java/cn/nukkit/level/particle/EnchantmentTableParticle.java deleted file mode 100644 index 2d7937060..000000000 --- a/src/main/java/cn/nukkit/level/particle/EnchantmentTableParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class EnchantmentTableParticle extends GenericParticle { - - public EnchantmentTableParticle(Vector3 pos) { - super(pos, Particle.TYPE_ENCHANTMENT_TABLE); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/EntityFlameParticle.java b/src/main/java/cn/nukkit/level/particle/EntityFlameParticle.java deleted file mode 100644 index e67c45267..000000000 --- a/src/main/java/cn/nukkit/level/particle/EntityFlameParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class EntityFlameParticle extends GenericParticle { - - public EntityFlameParticle(Vector3 pos) { - super(pos, Particle.TYPE_MOB_FLAME); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/ExplodeParticle.java b/src/main/java/cn/nukkit/level/particle/ExplodeParticle.java deleted file mode 100644 index a70ab352e..000000000 --- a/src/main/java/cn/nukkit/level/particle/ExplodeParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class ExplodeParticle extends GenericParticle { - - public ExplodeParticle(Vector3 pos) { - super(pos, Particle.TYPE_EXPLODE); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/FlameParticle.java b/src/main/java/cn/nukkit/level/particle/FlameParticle.java deleted file mode 100644 index b4a4cabd3..000000000 --- a/src/main/java/cn/nukkit/level/particle/FlameParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class FlameParticle extends GenericParticle { - - public FlameParticle(Vector3 pos) { - super(pos, Particle.TYPE_FLAME); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/FloatingTextParticle.java b/src/main/java/cn/nukkit/level/particle/FloatingTextParticle.java deleted file mode 100644 index 8bac0815c..000000000 --- a/src/main/java/cn/nukkit/level/particle/FloatingTextParticle.java +++ /dev/null @@ -1,173 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.data.EntityMetadata; -import cn.nukkit.entity.data.Skin; -import cn.nukkit.item.Item; -import cn.nukkit.level.Level; -import cn.nukkit.level.Location; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.*; -import cn.nukkit.utils.Binary; -import cn.nukkit.utils.SerializedImage; -import cn.nukkit.utils.Utils; -import com.google.common.base.Strings; - -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.UUID; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class FloatingTextParticle extends Particle { - - private static final Skin EMPTY_SKIN = new Skin(); - private static final SerializedImage SKIN_DATA = SerializedImage.fromLegacy(new byte[8192]); - private static final UUID SKIN_UUID = UUID.nameUUIDFromBytes(Binary.appendBytes(Skin.GEOMETRY_CUSTOM.getBytes(StandardCharsets.UTF_8), SKIN_DATA.data)); - - static { - EMPTY_SKIN.setSkinData(SKIN_DATA); - EMPTY_SKIN.setSkinResourcePatch(Skin.GEOMETRY_CUSTOM); - EMPTY_SKIN.setSkinId(SKIN_UUID + ".FloatingText"); - EMPTY_SKIN.setCapeData(SerializedImage.EMPTY); - EMPTY_SKIN.setCapeId(""); - } - - protected UUID uuid = UUID.randomUUID(); - protected final Level level; - protected long entityId = -1; - protected boolean invisible = false; - protected EntityMetadata metadata = new EntityMetadata(); - - public FloatingTextParticle(Location location, String title) { - this(location, title, null); - } - - public FloatingTextParticle(Location location, String title, String text) { - this(location.getLevel(), location, title, text); - } - - public FloatingTextParticle(Vector3 pos, String title) { - this(pos, title, null); - } - - public FloatingTextParticle(Vector3 pos, String title, String text) { - this(null, pos, title, text); - } - - private FloatingTextParticle(Level level, Vector3 pos, String title, String text) { - super(pos.x, pos.y, pos.z); - this.level = level; - - long flags = ( - 65536L - ); - metadata.putLong(Entity.DATA_FLAGS, flags) - .putLong(Entity.DATA_LEAD_HOLDER_EID,-1) - .putFloat(Entity.DATA_SCALE, 0.01f) - .putFloat(Entity.DATA_BOUNDING_BOX_HEIGHT, 0.01f) - .putFloat(Entity.DATA_BOUNDING_BOX_WIDTH, 0.01f); - if (!Strings.isNullOrEmpty(title)) { - metadata.putString(Entity.DATA_NAMETAG, title); - } - if (!Strings.isNullOrEmpty(text)) { - metadata.putString(Entity.DATA_SCORE_TAG, text); - } - } - - public String getText() { - return metadata.getString(Entity.DATA_SCORE_TAG); - } - - public void setText(String text) { - this.metadata.putString(Entity.DATA_SCORE_TAG, text); - sendMetadata(); - } - - public String getTitle() { - return metadata.getString(Entity.DATA_NAMETAG); - } - - public void setTitle(String title) { - this.metadata.putString(Entity.DATA_NAMETAG, title); - sendMetadata(); - } - - private void sendMetadata() { - if (level != null) { - SetEntityDataPacket packet = new SetEntityDataPacket(); - packet.eid = entityId; - packet.metadata = metadata; - level.addChunkPacket(getChunkX(), getChunkZ(), packet); - } - } - - public boolean isInvisible() { - return invisible; - } - - public void setInvisible(boolean invisible) { - this.invisible = invisible; - } - - public void setInvisible() { - this.setInvisible(true); - } - - public long getEntityId() { - return entityId; - } - - @Override - public DataPacket[] mvEncode(int protocol) { - ArrayList packets = new ArrayList<>(); - if (this.entityId == -1) { - this.entityId = 1095216660480L + Utils.random.nextLong(0, 0x7fffffffL); - } else { - RemoveEntityPacket pk = new RemoveEntityPacket(); - pk.eid = this.entityId; - - packets.add(pk); - } - - if (!this.invisible) { - PlayerListPacket.Entry[] entry = {new PlayerListPacket.Entry(uuid, entityId, - metadata.getString(Entity.DATA_NAMETAG), EMPTY_SKIN)}; - PlayerListPacket playerAdd = new PlayerListPacket(); - playerAdd.entries = entry; - playerAdd.type = PlayerListPacket.TYPE_ADD; - playerAdd.protocol = protocol; - playerAdd.tryEncode(); - packets.add(playerAdd); - - AddPlayerPacket pk = new AddPlayerPacket(); - pk.uuid = uuid; - pk.username = ""; - pk.entityUniqueId = this.entityId; - pk.entityRuntimeId = this.entityId; - pk.x = (float) this.x; - pk.y = (float) (this.y - 0.75); - pk.z = (float) this.z; - pk.speedX = 0; - pk.speedY = 0; - pk.speedZ = 0; - pk.yaw = 0; - pk.pitch = 0; - pk.metadata = this.metadata; - pk.item = Item.get(Item.AIR); - pk.protocol = protocol; - pk.tryEncode(); - packets.add(pk); - - PlayerListPacket playerRemove = new PlayerListPacket(); - playerRemove.entries = entry; - playerRemove.type = PlayerListPacket.TYPE_REMOVE; - playerRemove.protocol = protocol; - playerRemove.tryEncode(); - packets.add(playerRemove); - } - return packets.toArray(new DataPacket[0]); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/GenericParticle.java b/src/main/java/cn/nukkit/level/particle/GenericParticle.java deleted file mode 100644 index 2776a4074..000000000 --- a/src/main/java/cn/nukkit/level/particle/GenericParticle.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class GenericParticle extends Particle { - - protected int id; - - protected final int data; - - public GenericParticle(Vector3 pos, int id) { - this(pos, id, 0); - } - - public GenericParticle(Vector3 pos, int id, int data) { - super(pos.x, pos.y, pos.z); - this.id = id; - this.data = data; - } - - @Override - public DataPacket[] mvEncode(int protocol) { - LevelEventPacket packet = new LevelEventPacket(); - packet.evid = (short) (LevelEventPacket.EVENT_ADD_PARTICLE_MASK | getMultiversionId(protocol, this.id)); - packet.x = (float) this.x; - packet.y = (float) this.y; - packet.z = (float) this.z; - packet.data = this.data; - packet.protocol = protocol; - packet.tryEncode(); - return new DataPacket[]{packet}; - } -} diff --git a/src/main/java/cn/nukkit/level/particle/HappyVillagerParticle.java b/src/main/java/cn/nukkit/level/particle/HappyVillagerParticle.java deleted file mode 100644 index 0750ab67f..000000000 --- a/src/main/java/cn/nukkit/level/particle/HappyVillagerParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class HappyVillagerParticle extends GenericParticle { - - public HappyVillagerParticle(Vector3 pos) { - super(pos, Particle.TYPE_VILLAGER_HAPPY); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/HeartParticle.java b/src/main/java/cn/nukkit/level/particle/HeartParticle.java deleted file mode 100644 index 906401703..000000000 --- a/src/main/java/cn/nukkit/level/particle/HeartParticle.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class HeartParticle extends GenericParticle { - - public HeartParticle(Vector3 pos) { - this(pos, 0); - } - - public HeartParticle(Vector3 pos, int scale) { - super(pos, Particle.TYPE_HEART, scale); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/HugeExplodeParticle.java b/src/main/java/cn/nukkit/level/particle/HugeExplodeParticle.java deleted file mode 100644 index ad3109116..000000000 --- a/src/main/java/cn/nukkit/level/particle/HugeExplodeParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class HugeExplodeParticle extends GenericParticle { - - public HugeExplodeParticle(Vector3 pos) { - super(pos, Particle.TYPE_HUGE_EXPLODE); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/HugeExplodeSeedParticle.java b/src/main/java/cn/nukkit/level/particle/HugeExplodeSeedParticle.java deleted file mode 100644 index c3bd7105e..000000000 --- a/src/main/java/cn/nukkit/level/particle/HugeExplodeSeedParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class HugeExplodeSeedParticle extends GenericParticle { - - public HugeExplodeSeedParticle(Vector3 pos) { - super(pos, Particle.TYPE_HUGE_EXPLODE_SEED); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/InkParticle.java b/src/main/java/cn/nukkit/level/particle/InkParticle.java deleted file mode 100644 index 0c3a42589..000000000 --- a/src/main/java/cn/nukkit/level/particle/InkParticle.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class InkParticle extends GenericParticle { - - public InkParticle(Vector3 pos) { - this(pos, 0); - } - - public InkParticle(Vector3 pos, int scale) { - super(pos, Particle.TYPE_INK, scale); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/InstantEnchantParticle.java b/src/main/java/cn/nukkit/level/particle/InstantEnchantParticle.java deleted file mode 100644 index d5d46cdab..000000000 --- a/src/main/java/cn/nukkit/level/particle/InstantEnchantParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class InstantEnchantParticle extends GenericParticle { - - public InstantEnchantParticle(Vector3 pos) { - super(pos, Particle.TYPE_MOB_SPELL_INSTANTANEOUS); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/InstantSpellParticle.java b/src/main/java/cn/nukkit/level/particle/InstantSpellParticle.java deleted file mode 100644 index c8693d695..000000000 --- a/src/main/java/cn/nukkit/level/particle/InstantSpellParticle.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2016/1/4 by xtypr. - * Package cn.nukkit.level.particle in project nukkit . - */ -public class InstantSpellParticle extends SpellParticle { - - public InstantSpellParticle(Vector3 pos) { - this(pos, 0); - } - - public InstantSpellParticle(Vector3 pos, int data) { - super(pos, data); - } - - public InstantSpellParticle(Vector3 pos, BlockColor blockColor) { - //alpha is ignored - this(pos, blockColor.getRed(), blockColor.getGreen(), blockColor.getBlue()); - } - - public InstantSpellParticle(Vector3 pos, int r, int g, int b) { - //this 0x01 is the only difference between instant spell and non-instant one - super(pos, r, g, b, 0x01); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/ItemBreakParticle.java b/src/main/java/cn/nukkit/level/particle/ItemBreakParticle.java deleted file mode 100644 index 5625aabfd..000000000 --- a/src/main/java/cn/nukkit/level/particle/ItemBreakParticle.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.item.Item; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.network.protocol.ProtocolInfo; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class ItemBreakParticle extends Particle { - - private final Item item; - - public ItemBreakParticle(Vector3 pos, Item item) { - super(pos.x, pos.y, pos.z); - this.item = item; - } - - @Override - public DataPacket[] mvEncode(int protocol) { - int runtimeId = this.item.getId(); - if (protocol >= ProtocolInfo.v1_16_100) { - runtimeId = item.getNetworkId(protocol); - } - - LevelEventPacket packet = new LevelEventPacket(); - packet.evid = (short) (LevelEventPacket.EVENT_ADD_PARTICLE_MASK | getMultiversionId(protocol, Particle.TYPE_ITEM_BREAK)); - packet.x = (float) this.x; - packet.y = (float) this.y; - packet.z = (float) this.z; - packet.data = (runtimeId << 16 | item.getDamage()); - packet.protocol = protocol; - packet.tryEncode(); - return new DataPacket[]{packet}; - } -} diff --git a/src/main/java/cn/nukkit/level/particle/LavaDripParticle.java b/src/main/java/cn/nukkit/level/particle/LavaDripParticle.java deleted file mode 100644 index 89b57d03b..000000000 --- a/src/main/java/cn/nukkit/level/particle/LavaDripParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class LavaDripParticle extends GenericParticle { - - public LavaDripParticle(Vector3 pos) { - super(pos, Particle.TYPE_DRIP_LAVA); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/LavaParticle.java b/src/main/java/cn/nukkit/level/particle/LavaParticle.java deleted file mode 100644 index eb7bc8f2c..000000000 --- a/src/main/java/cn/nukkit/level/particle/LavaParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class LavaParticle extends GenericParticle { - - public LavaParticle(Vector3 pos) { - super(pos, Particle.TYPE_LAVA); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/MobSpawnParticle.java b/src/main/java/cn/nukkit/level/particle/MobSpawnParticle.java deleted file mode 100644 index 0d02f2d39..000000000 --- a/src/main/java/cn/nukkit/level/particle/MobSpawnParticle.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class MobSpawnParticle extends Particle { - - protected final int width; - protected final int height; - - public MobSpawnParticle(Vector3 pos, float width, float height) { - super(pos.x, pos.y, pos.z); - this.width = (int) width; - this.height = (int) height; - } - - @Override - public DataPacket[] mvEncode(int protocol) { - LevelEventPacket packet = new LevelEventPacket(); - packet.evid = LevelEventPacket.EVENT_PARTICLE_SPAWN; - packet.x = (float) this.x; - packet.y = (float) this.y; - packet.z = (float) this.z; - packet.data = (this.width & 0xff) + ((this.height & 0xff) << 8); - packet.protocol = protocol; - packet.tryEncode(); - return new DataPacket[]{packet}; - } -} diff --git a/src/main/java/cn/nukkit/level/particle/Particle.java b/src/main/java/cn/nukkit/level/particle/Particle.java deleted file mode 100644 index ce632686c..000000000 --- a/src/main/java/cn/nukkit/level/particle/Particle.java +++ /dev/null @@ -1,158 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.Server; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.ProtocolInfo; - -import java.lang.reflect.Field; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Particle extends Vector3 { - - public static final int TYPE_BUBBLE = 1; - public static final int TYPE_BUBBLE_MANUAL = 2; - public static final int TYPE_CRITICAL = 3; - public static final int TYPE_BLOCK_FORCE_FIELD = 4; - public static final int TYPE_SMOKE = 5; - public static final int TYPE_EXPLODE = 6; - public static final int TYPE_EVAPORATION = 7; - public static final int TYPE_FLAME = 8; - public static final int TYPE_CANDLE_FLAME = 9; - public static final int TYPE_LAVA = 10; - public static final int TYPE_LARGE_SMOKE = 11; - public static final int TYPE_REDSTONE = 12; - public static final int TYPE_RISING_RED_DUST = 13; - public static final int TYPE_ITEM_BREAK = 14; - public static final int TYPE_SNOWBALL_POOF = 15; - public static final int TYPE_HUGE_EXPLODE = 16; - public static final int TYPE_HUGE_EXPLODE_SEED = 17; - public static final int TYPE_MOB_FLAME = 18; - public static final int TYPE_HEART = 19; - public static final int TYPE_TERRAIN = 20; - public static final int TYPE_SUSPENDED_TOWN = 21, TYPE_TOWN_AURA = 21; - public static final int TYPE_PORTAL = 22; - // 22 same as 21 - public static final int TYPE_SPLASH = 24, TYPE_WATER_SPLASH = 24; - public static final int TYPE_WATER_SPLASH_MANUAL = 25; - public static final int TYPE_WATER_WAKE = 26; - public static final int TYPE_DRIP_WATER = 27; - public static final int TYPE_DRIP_LAVA = 28; - public static final int TYPE_DRIP_HONEY = 29; - public static final int TYPE_STALACTITE_DRIP_WATER = 30; - public static final int TYPE_STALACTITE_DRIP_LAVA = 31; - public static final int TYPE_FALLING_DUST = 32, TYPE_DUST = 32; - public static final int TYPE_MOB_SPELL = 33; - public static final int TYPE_MOB_SPELL_AMBIENT = 34; - public static final int TYPE_MOB_SPELL_INSTANTANEOUS = 35; - public static final int TYPE_INK = 36; - public static final int TYPE_SLIME = 37; - public static final int TYPE_RAIN_SPLASH = 38; - public static final int TYPE_VILLAGER_ANGRY = 39; - public static final int TYPE_VILLAGER_HAPPY = 40; - public static final int TYPE_ENCHANTMENT_TABLE = 41; - public static final int TYPE_TRACKING_EMITTER = 42; - public static final int TYPE_NOTE = 43; - public static final int TYPE_WITCH_SPELL = 44; - public static final int TYPE_CARROT = 45; - public static final int TYPE_MOB_APPEARANCE = 46; - public static final int TYPE_END_ROD = 47; - public static final int TYPE_RISING_DRAGONS_BREATH = 48; - public static final int TYPE_SPIT = 49; - public static final int TYPE_TOTEM = 50; - public static final int TYPE_FOOD = 51; - public static final int TYPE_FIREWORKS_STARTER = 52; - public static final int TYPE_FIREWORKS_SPARK = 53; - public static final int TYPE_FIREWORKS_OVERLAY = 54; - public static final int TYPE_BALLOON_GAS = 55; - public static final int TYPE_COLORED_FLAME = 56; - public static final int TYPE_SPARKLER = 57; - public static final int TYPE_CONDUIT = 58; - public static final int TYPE_BUBBLE_COLUMN_UP = 59; - public static final int TYPE_BUBBLE_COLUMN_DOWN = 60; - public static final int TYPE_SNEEZE = 61; - public static final int TYPE_SHULKER_BULLET = 62; - public static final int TYPE_BLEACH = 63; - public static final int TYPE_LARGE_EXPLOSION = 64; - public static final int TYPE_MYCELIUM_DUST = 65; - public static final int TYPE_FALLING_RED_DUST = 66; - public static final int TYPE_CAMPFIRE_SMOKE = 67; - public static final int TYPE_TALL_CAMPFIRE_SMOKE = 68; - public static final int TYPE_FALLING_DRAGONS_BREATH = 69; - public static final int TYPE_DRAGONS_BREATH = 70; - public static final int TYPE_BLUE_FLAME = 71; - public static final int TYPE_SOUL = 72; - public static final int TYPE_OBSIDIAN_TEAR = 73; - public static final int TYPE_PORTAL_REVERSE = 74; - public static final int TYPE_SNOWFLAKE = 75; - public static final int TYPE_VIBRATION_SIGNAL = 76; - public static final int TYPE_SCULK_SENSOR_REDSTONE = 77; - public static final int TYPE_SPORE_BLOSSOM_SHOWER = 78; - public static final int TYPE_SPORE_BLOSSOM_AMBIENT = 79; - public static final int TYPE_WAX = 80; - public static final int TYPE_ELECTRIC_SPARK = 81; - - public Particle() { - super(0, 0, 0); - } - - public Particle(double x) { - super(x, 0, 0); - } - - public Particle(double x, double y) { - super(x, y, 0); - } - - public Particle(double x, double y, double z) { - super(x, y, z); - } - - public DataPacket[] encode() { - Server.mvw("Particle#encode()"); - return this.mvEncode(ProtocolInfo.CURRENT_PROTOCOL); - } - - public static int getMultiversionId(int protocol, int particle) { - int id = particle; - if (protocol < ProtocolInfo.v1_17_10 && id >= 9) { - id -= 1; - } - if (protocol < ProtocolInfo.v1_16_220 && id > 28) { - id -= 2; - } - if (protocol == ProtocolInfo.v1_13_0) { - if (id > 27) { - return id - 1; - } else { - return id; - } - } else { - return id; - } - } - - public abstract DataPacket[] mvEncode(int protocol); - - public static Integer getParticleIdByName(String name) { - name = name.toUpperCase(); - - try { - Field field = Particle.class.getField((name.startsWith("TYPE_") ? name : ("TYPE_" + name))); - - Class type = field.getType(); - - if (type == int.class) { - return field.getInt(null); - } - } catch(NoSuchFieldException | IllegalAccessException ignored) {} - return null; - } - - public static boolean particleExists(String name) { - return getParticleIdByName(name) != null; - } -} diff --git a/src/main/java/cn/nukkit/level/particle/PortalParticle.java b/src/main/java/cn/nukkit/level/particle/PortalParticle.java deleted file mode 100644 index d3a8473ef..000000000 --- a/src/main/java/cn/nukkit/level/particle/PortalParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class PortalParticle extends GenericParticle { - - public PortalParticle(Vector3 pos) { - super(pos, Particle.TYPE_PORTAL); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/PunchBlockParticle.java b/src/main/java/cn/nukkit/level/particle/PunchBlockParticle.java deleted file mode 100644 index 9ba44b104..000000000 --- a/src/main/java/cn/nukkit/level/particle/PunchBlockParticle.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.block.Block; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.network.protocol.ProtocolInfo; - -public class PunchBlockParticle extends Particle { - - protected final int blockId; - protected final int blockDamage; - protected final int index; - protected final int face; - - public PunchBlockParticle(Vector3 pos, Block block, BlockFace face) { - this(pos, block.getId(), block.getDamage(), face); - } - - public PunchBlockParticle(Vector3 pos, int blockId, int blockDamage, BlockFace face) { - super(pos.x, pos.y, pos.z); - this.blockId = blockId; - this.blockDamage = blockDamage; - this.face = face.getIndex(); - this.index = this.face << 24; - } - - @Override - public DataPacket[] mvEncode(int protocol) { - LevelEventPacket packet = new LevelEventPacket(); - packet.evid = LevelEventPacket.EVENT_PARTICLE_PUNCH_BLOCK; - packet.x = (float) this.x; - packet.y = (float) this.y; - packet.z = (float) this.z; - packet.data = protocol <= ProtocolInfo.v1_2_10 ? (blockId | (blockDamage << 8) | (face << 16)) : GlobalBlockPalette.getOrCreateRuntimeId(protocol, blockId, blockDamage) | index; - packet.protocol = protocol; - packet.tryEncode(); - return new DataPacket[]{packet}; - } -} diff --git a/src/main/java/cn/nukkit/level/particle/RainSplashParticle.java b/src/main/java/cn/nukkit/level/particle/RainSplashParticle.java deleted file mode 100644 index 867301095..000000000 --- a/src/main/java/cn/nukkit/level/particle/RainSplashParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class RainSplashParticle extends GenericParticle { - - public RainSplashParticle(Vector3 pos) { - super(pos, Particle.TYPE_RAIN_SPLASH); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/RedstoneParticle.java b/src/main/java/cn/nukkit/level/particle/RedstoneParticle.java deleted file mode 100644 index c815dd7f4..000000000 --- a/src/main/java/cn/nukkit/level/particle/RedstoneParticle.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class RedstoneParticle extends GenericParticle { - - public RedstoneParticle(Vector3 pos) { - this(pos, 1); - } - - public RedstoneParticle(Vector3 pos, int lifetime) { - super(pos, Particle.TYPE_REDSTONE, lifetime); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/SmokeParticle.java b/src/main/java/cn/nukkit/level/particle/SmokeParticle.java deleted file mode 100644 index 5db5fe004..000000000 --- a/src/main/java/cn/nukkit/level/particle/SmokeParticle.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class SmokeParticle extends GenericParticle { - - public SmokeParticle(Vector3 pos) { - this(pos, 0); - } - - public SmokeParticle(Vector3 pos, int scale) { - super(pos, Particle.TYPE_SMOKE, scale); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/SpellParticle.java b/src/main/java/cn/nukkit/level/particle/SpellParticle.java deleted file mode 100644 index ddd1c4684..000000000 --- a/src/main/java/cn/nukkit/level/particle/SpellParticle.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.LevelEventPacket; -import cn.nukkit.utils.BlockColor; - -/** - * Created on 2015/12/27 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - * The name "spell" comes from minecraft wiki. - */ -public class SpellParticle extends Particle { - - protected final int data; - - public SpellParticle(Vector3 pos) { - this(pos, 0); - } - - public SpellParticle(Vector3 pos, int data) { - super(pos.x, pos.y, pos.z); - this.data = data; - } - - public SpellParticle(Vector3 pos, BlockColor blockColor) { - //alpha is ignored - this(pos, blockColor.getRed(), blockColor.getGreen(), blockColor.getBlue()); - } - - public SpellParticle(Vector3 pos, int r, int g, int b) { - this(pos, r, g, b, 0x00); - } - - protected SpellParticle(Vector3 pos, int r, int g, int b, int a) { - this(pos, ((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)); - } - - @Override - public DataPacket[] mvEncode(int protocol) { - LevelEventPacket packet = new LevelEventPacket(); - packet.evid = LevelEventPacket.EVENT_PARTICLE_SPLASH; - packet.x = (float) this.x; - packet.y = (float) this.y; - packet.z = (float) this.z; - packet.data = this.data; - packet.protocol = protocol; - packet.tryEncode(); - return new DataPacket[]{packet}; - } -} diff --git a/src/main/java/cn/nukkit/level/particle/SplashParticle.java b/src/main/java/cn/nukkit/level/particle/SplashParticle.java deleted file mode 100644 index 8e8f825f0..000000000 --- a/src/main/java/cn/nukkit/level/particle/SplashParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class SplashParticle extends GenericParticle { - - public SplashParticle(Vector3 pos) { - super(pos, Particle.TYPE_WATER_SPLASH); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/SporeParticle.java b/src/main/java/cn/nukkit/level/particle/SporeParticle.java deleted file mode 100644 index 3557c1d84..000000000 --- a/src/main/java/cn/nukkit/level/particle/SporeParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class SporeParticle extends GenericParticle { - - public SporeParticle(Vector3 pos) { - super(pos, Particle.TYPE_TOWN_AURA); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/TerrainParticle.java b/src/main/java/cn/nukkit/level/particle/TerrainParticle.java deleted file mode 100644 index fca0c280d..000000000 --- a/src/main/java/cn/nukkit/level/particle/TerrainParticle.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.block.Block; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.ProtocolInfo; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class TerrainParticle extends GenericParticle { - - public TerrainParticle(Vector3 pos, Block block) { - super(pos, Particle.TYPE_TERRAIN, GlobalBlockPalette.getOrCreateRuntimeId(ProtocolInfo.CURRENT_PROTOCOL, block.getId(), block.getDamage())); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/WaterDripParticle.java b/src/main/java/cn/nukkit/level/particle/WaterDripParticle.java deleted file mode 100644 index b8c780387..000000000 --- a/src/main/java/cn/nukkit/level/particle/WaterDripParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class WaterDripParticle extends GenericParticle { - - public WaterDripParticle(Vector3 pos) { - super(pos, Particle.TYPE_DRIP_WATER); - } -} diff --git a/src/main/java/cn/nukkit/level/particle/WaterParticle.java b/src/main/java/cn/nukkit/level/particle/WaterParticle.java deleted file mode 100644 index 7446fe1c8..000000000 --- a/src/main/java/cn/nukkit/level/particle/WaterParticle.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.level.particle; - -import cn.nukkit.math.Vector3; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.particle in project Nukkit . - */ -public class WaterParticle extends GenericParticle { - - public WaterParticle(Vector3 pos) { - super(pos, Particle.TYPE_WATER_WAKE); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/AnvilFallSound.java b/src/main/java/cn/nukkit/level/sound/AnvilFallSound.java deleted file mode 100644 index aef2a9fca..000000000 --- a/src/main/java/cn/nukkit/level/sound/AnvilFallSound.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.sound in project Nukkit . - */ -public class AnvilFallSound extends LevelEventSound { - - public AnvilFallSound(Vector3 pos) { - this(pos, 0); - } - - public AnvilFallSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_ANVIL_FALL, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/ButtonClickSound.java b/src/main/java/cn/nukkit/level/sound/ButtonClickSound.java deleted file mode 100644 index 4337c10aa..000000000 --- a/src/main/java/cn/nukkit/level/sound/ButtonClickSound.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class ButtonClickSound extends LevelEventSound { - - public ButtonClickSound(Vector3 pos) { - this(pos, 0); - } - - public ButtonClickSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_BUTTON_CLICK, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/ClickSound.java b/src/main/java/cn/nukkit/level/sound/ClickSound.java deleted file mode 100644 index 28e08beb9..000000000 --- a/src/main/java/cn/nukkit/level/sound/ClickSound.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.sound in project Nukkit . - */ -public class ClickSound extends LevelEventSound { - - public ClickSound(Vector3 pos) { - this(pos, 0); - } - - public ClickSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_CLICK, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/DoorSound.java b/src/main/java/cn/nukkit/level/sound/DoorSound.java deleted file mode 100644 index 8b358e0ff..000000000 --- a/src/main/java/cn/nukkit/level/sound/DoorSound.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.sound in project Nukkit . - */ -public class DoorSound extends LevelEventSound { - - public DoorSound(Vector3 pos) { - this(pos, 0); - } - - public DoorSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_DOOR, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/EndermanTeleportSound.java b/src/main/java/cn/nukkit/level/sound/EndermanTeleportSound.java deleted file mode 100644 index 5476b448e..000000000 --- a/src/main/java/cn/nukkit/level/sound/EndermanTeleportSound.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.sound in project Nukkit . - */ -public class EndermanTeleportSound extends LevelEventSound { - - public EndermanTeleportSound(Vector3 pos) { - this(pos, 0); - } - - public EndermanTeleportSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_ENDERMAN_TELEPORT, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/ExperienceOrbSound.java b/src/main/java/cn/nukkit/level/sound/ExperienceOrbSound.java deleted file mode 100644 index 4694b7d0a..000000000 --- a/src/main/java/cn/nukkit/level/sound/ExperienceOrbSound.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created by Pub4Game on 28.06.2016. - */ -public class ExperienceOrbSound extends LevelEventSound { - - public ExperienceOrbSound(Vector3 pos) { - this(pos, 0); - } - - public ExperienceOrbSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_EXPERIENCE_ORB, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/FizzSound.java b/src/main/java/cn/nukkit/level/sound/FizzSound.java deleted file mode 100644 index fb91a5430..000000000 --- a/src/main/java/cn/nukkit/level/sound/FizzSound.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.sound in project Nukkit . - */ -public class FizzSound extends LevelEventSound { - - public FizzSound(Vector3 pos) { - this(pos, 0); - } - - public FizzSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_FIZZ, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/ItemFrameItemAddedSound.java b/src/main/java/cn/nukkit/level/sound/ItemFrameItemAddedSound.java deleted file mode 100644 index e65e28141..000000000 --- a/src/main/java/cn/nukkit/level/sound/ItemFrameItemAddedSound.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created by Pub4Game on 03.07.2016. - */ -public class ItemFrameItemAddedSound extends LevelEventSound { - - public ItemFrameItemAddedSound(Vector3 pos) { - this(pos, 0); - } - - public ItemFrameItemAddedSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_ITEM_FRAME_ITEM_ADDED, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/ItemFrameItemRotated.java b/src/main/java/cn/nukkit/level/sound/ItemFrameItemRotated.java deleted file mode 100644 index b9ad7340d..000000000 --- a/src/main/java/cn/nukkit/level/sound/ItemFrameItemRotated.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created by Pub4Game on 03.07.2016. - */ -public class ItemFrameItemRotated extends LevelEventSound { - - public ItemFrameItemRotated(Vector3 pos) { - this(pos, 0); - } - - public ItemFrameItemRotated(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_ITEM_FRAME_ITEM_ROTATED, pitch); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/level/sound/ItemFramePlacedSound.java b/src/main/java/cn/nukkit/level/sound/ItemFramePlacedSound.java deleted file mode 100644 index 6d3a78ec6..000000000 --- a/src/main/java/cn/nukkit/level/sound/ItemFramePlacedSound.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created by Pub4Game on 03.07.2016. - */ -public class ItemFramePlacedSound extends LevelEventSound { - - public ItemFramePlacedSound(Vector3 pos) { - this(pos, 0); - } - - public ItemFramePlacedSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_ITEM_FRAME_PLACED, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/ItemFrameRemovedSound.java b/src/main/java/cn/nukkit/level/sound/ItemFrameRemovedSound.java deleted file mode 100644 index a451e362b..000000000 --- a/src/main/java/cn/nukkit/level/sound/ItemFrameRemovedSound.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created by Pub4Game on 03.07.2016. - */ -public class ItemFrameRemovedSound extends LevelEventSound { - - public ItemFrameRemovedSound(Vector3 pos) { - this(pos, 0); - } - - public ItemFrameRemovedSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_ITEM_FRAME_REMOVED, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/LevelEventSound.java b/src/main/java/cn/nukkit/level/sound/LevelEventSound.java deleted file mode 100644 index 5f6fb63ab..000000000 --- a/src/main/java/cn/nukkit/level/sound/LevelEventSound.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created on 2015/11/21 by xtypr. - * Package cn.nukkit.level.sound in project Nukkit . - */ -public class LevelEventSound extends Sound { - - protected final int id; - protected float pitch; - - public LevelEventSound(Vector3 pos, int id) { - this(pos, id, 0); - } - - public LevelEventSound(Vector3 pos, int id, float pitch) { - super(pos.x, pos.y, pos.z); - this.id = id; - this.pitch = pitch * 1000f; - } - - public float getPitch() { - return this.pitch / 1000f; - } - - public void setPitch(float pitch) { - this.pitch = pitch * 1000f; - } - - @Override - public DataPacket encode() { - LevelEventPacket pk = new LevelEventPacket(); - pk.evid = this.id; - pk.x = (float) this.x; - pk.y = (float) this.y; - pk.z = (float) this.z; - pk.data = (int) this.pitch; - return pk; - } -} diff --git a/src/main/java/cn/nukkit/level/sound/LeverSound.java b/src/main/java/cn/nukkit/level/sound/LeverSound.java deleted file mode 100644 index 769f67e05..000000000 --- a/src/main/java/cn/nukkit/level/sound/LeverSound.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class LeverSound extends LevelEventSound { - - public LeverSound(Vector3 pos, boolean isPowerOn) { - super(pos, LevelEventPacket.EVENT_SOUND_BUTTON_CLICK, isPowerOn ? 0.6f : 0.5f); - } -} diff --git a/src/main/java/cn/nukkit/level/sound/Sound.java b/src/main/java/cn/nukkit/level/sound/Sound.java deleted file mode 100644 index a636d1c33..000000000 --- a/src/main/java/cn/nukkit/level/sound/Sound.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.DataPacket; - -/** - * Legacy sound class - * - * Everything in package cn.nukkit.level.sound will be removed in the future. - * Please use cn.nukkit.level.Sound class instead. - * - * @author MagicDroidX - * Nukkit Project - */ -public abstract class Sound extends Vector3 { - - public Sound() { - super(0, 0, 0); - } - - public Sound(double x) { - super(x, 0, 0); - } - - public Sound(double x, double y) { - super(x, y, 0); - } - - public Sound(double x, double y, double z) { - super(x, y, z); - } - - abstract public DataPacket encode(); -} diff --git a/src/main/java/cn/nukkit/level/sound/TNTPrimeSound.java b/src/main/java/cn/nukkit/level/sound/TNTPrimeSound.java deleted file mode 100644 index 29bdca8f1..000000000 --- a/src/main/java/cn/nukkit/level/sound/TNTPrimeSound.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.level.sound; - -import cn.nukkit.math.Vector3; -import cn.nukkit.network.protocol.LevelEventPacket; - -/** - * Created by Pub4Game on 04.03.2016. - */ -public class TNTPrimeSound extends LevelEventSound { - - public TNTPrimeSound(Vector3 pos) { - this(pos, 0); - } - - public TNTPrimeSound(Vector3 pos, float pitch) { - super(pos, LevelEventPacket.EVENT_SOUND_TNT, pitch); - } -} diff --git a/src/main/java/cn/nukkit/level/util/BitArray.java b/src/main/java/cn/nukkit/level/util/BitArray.java deleted file mode 100644 index 1b62f35bb..000000000 --- a/src/main/java/cn/nukkit/level/util/BitArray.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.level.util; - -public interface BitArray { - - void set(int index, int value); - - int get(int index); - - int size(); - - int[] getWords(); - - BitArrayVersion getVersion(); - - BitArray copy(); -} diff --git a/src/main/java/cn/nukkit/level/util/BitArrayVersion.java b/src/main/java/cn/nukkit/level/util/BitArrayVersion.java deleted file mode 100644 index b5d979535..000000000 --- a/src/main/java/cn/nukkit/level/util/BitArrayVersion.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.level.util; - -public enum BitArrayVersion { - - V16(16, 2, null), - V8(8, 4, V16), - V6(6, 5, V8), // 2 bit padding - V5(5, 6, V6), // 2 bit padding - V4(4, 8, V5), - V3(3, 10, V4), // 2 bit padding - V2(2, 16, V3), - V1(1, 32, V2); - - final byte bits; - final byte entriesPerWord; - final int maxEntryValue; - final BitArrayVersion next; - final int wordsForSize; - - BitArrayVersion(int bits, int entriesPerWord, BitArrayVersion next) { - this.bits = (byte) bits; - this.entriesPerWord = (byte) entriesPerWord; - this.maxEntryValue = (1 << this.bits) - 1; - this.next = next; - this.wordsForSize = getWordsForSize(4096); - } - - public static BitArrayVersion get(int version, boolean read) { - for (BitArrayVersion ver : values()) { - if ((!read && ver.entriesPerWord <= version) || (read && ver.bits == version)) { - return ver; - } - } - throw new IllegalArgumentException("Invalid palette version: " + version); - } - - public BitArray createPalette() { - return this.createPalette(4096, new int[wordsForSize]); - } - - public BitArray createPalette(int size) { - return this.createPalette(size, new int[this.getWordsForSize(size)]); - } - - public byte getId() { - return bits; - } - - public int getWordsForSize(int size) { - return (size / entriesPerWord) + (size % entriesPerWord == 0 ? 0 : 1); - } - - public int getMaxEntryValue() { - return maxEntryValue; - } - - public BitArrayVersion next() { - return next; - } - - public BitArray createPalette(int size, int[] words) { - if (this == V3 || this == V5 || this == V6) { - // Padded palettes aren't able to use bitwise operations due to their padding. - return new PaddedBitArray(this, size, words); - } else { - return new Pow2BitArray(this, size, words); - } - } -} diff --git a/src/main/java/cn/nukkit/level/util/PaddedBitArray.java b/src/main/java/cn/nukkit/level/util/PaddedBitArray.java deleted file mode 100644 index 20a9e53b8..000000000 --- a/src/main/java/cn/nukkit/level/util/PaddedBitArray.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.nukkit.level.util; - -import cn.nukkit.math.MathHelper; -import com.google.common.base.Preconditions; - -import java.util.Arrays; - -public class PaddedBitArray implements BitArray { - - /** - * Array used to store data - */ - private final int[] words; - - /** - * Palette version information - */ - private final BitArrayVersion version; - - /** - * Number of entries in this palette (not the length of the words array that internally backs this palette) - */ - private final int size; - - PaddedBitArray(BitArrayVersion version, int size, int[] words) { - this.size = size; - this.version = version; - this.words = words; - int expectedWordsLength = MathHelper.ceil((float) size / version.entriesPerWord); - if (words.length != expectedWordsLength) { - throw new IllegalArgumentException("Invalid length given for storage, got: " + words.length + - " but expected: " + expectedWordsLength); - } - } - - @Override - public void set(int index, int value) { - Preconditions.checkElementIndex(index, this.size); - Preconditions.checkArgument(value >= 0 && value <= this.version.maxEntryValue, - "Max value: %s. Received value", this.version.maxEntryValue, value); - int arrayIndex = index / this.version.entriesPerWord; - int offset = (index % this.version.entriesPerWord) * this.version.bits; - - this.words[arrayIndex] = this.words[arrayIndex] & ~(this.version.maxEntryValue << offset) | (value & this.version.maxEntryValue) << offset; - } - - @Override - public int get(int index) { - Preconditions.checkElementIndex(index, this.size); - int arrayIndex = index / this.version.entriesPerWord; - int offset = (index % this.version.entriesPerWord) * this.version.bits; - - return (this.words[arrayIndex] >>> offset) & this.version.maxEntryValue; - } - - @Override - public int size() { - return this.size; - } - - @Override - public int[] getWords() { - return this.words; - } - - @Override - public BitArrayVersion getVersion() { - return this.version; - } - - @Override - public BitArray copy() { - return new PaddedBitArray(this.version, this.size, Arrays.copyOf(this.words, this.words.length)); - } -} diff --git a/src/main/java/cn/nukkit/level/util/PalettedBlockStorage.java b/src/main/java/cn/nukkit/level/util/PalettedBlockStorage.java deleted file mode 100644 index 79c273f83..000000000 --- a/src/main/java/cn/nukkit/level/util/PalettedBlockStorage.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.nukkit.level.util; - -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.BinaryStream; -import it.unimi.dsi.fastutil.ints.IntArrayList; -import it.unimi.dsi.fastutil.ints.IntList; - -import java.util.function.IntConsumer; - -public class PalettedBlockStorage { - - private static final int SIZE = 4096; - - private final IntList palette; - private BitArray bitArray; - - public PalettedBlockStorage() { - this(0); - } - - public PalettedBlockStorage(int protocol) { - this(BitArrayVersion.V2, protocol); - } - - public PalettedBlockStorage(BitArrayVersion version) { - this(version, 0); - } - - public PalettedBlockStorage(BitArrayVersion version, int protocol) { - this.bitArray = version.createPalette(); - this.palette = new IntArrayList(16); - - // Air is at the start of every palette. - if (protocol >= ProtocolInfo.v1_16_100) { - this.palette.add(GlobalBlockPalette.getOrCreateRuntimeId(protocol, 0)); - } else { - this.palette.add(0); - } - } - - private PalettedBlockStorage(BitArray bitArray, IntList palette) { - this.palette = palette; - this.bitArray = bitArray; - } - - private int getPaletteHeader(BitArrayVersion version) { - return (version.getId() << 1) | 1; - } - - public void setBlock(int index, int runtimeId) { - try { - int id = this.idFor(runtimeId); - this.bitArray.set(index, id); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("Unable to set block runtime ID: " + runtimeId + ", palette: " + palette, e); - } - } - - public void writeTo(int protocol, BinaryStream stream) { - stream.putByte((byte) getPaletteHeader(bitArray.getVersion())); - - for (int word : bitArray.getWords()) { - stream.putLInt(word); - } - - stream.putVarInt(palette.size()); - palette.forEach((IntConsumer) stream::putVarInt); - } - - private void onResize(BitArrayVersion version) { - BitArray newBitArray = version.createPalette(); - - for (int i = 0; i < SIZE; i++) { - newBitArray.set(i, this.bitArray.get(i)); - } - this.bitArray = newBitArray; - } - - private int idFor(int runtimeId) { - int index = this.palette.indexOf(runtimeId); - if (index != -1) { - return index; - } - - index = this.palette.size(); - BitArrayVersion version = this.bitArray.getVersion(); - if (index > version.getMaxEntryValue()) { - BitArrayVersion next = version.next(); - if (next != null) { - this.onResize(next); - } - } - this.palette.add(runtimeId); - return index; - } - - public boolean isEmpty() { - if (this.palette.size() == 1) { - return true; - } - for (int word : this.bitArray.getWords()) { - if (Integer.toUnsignedLong(word) != 0L) { - return false; - } - } - return true; - } - - public PalettedBlockStorage copy() { - return new PalettedBlockStorage(this.bitArray.copy(), new IntArrayList(this.palette)); - } -} diff --git a/src/main/java/cn/nukkit/level/util/Pow2BitArray.java b/src/main/java/cn/nukkit/level/util/Pow2BitArray.java deleted file mode 100644 index 6e2c1a029..000000000 --- a/src/main/java/cn/nukkit/level/util/Pow2BitArray.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.nukkit.level.util; - -import cn.nukkit.math.MathHelper; -import com.google.common.base.Preconditions; - -import java.util.Arrays; - -public class Pow2BitArray implements BitArray { - - /** - * Array used to store data - */ - private final int[] words; - - /** - * Palette version information - */ - private final BitArrayVersion version; - - /** - * Number of entries in this palette (not the length of the words array that internally backs this palette) - */ - private final int size; - - Pow2BitArray(BitArrayVersion version, int size, int[] words) { - this.size = size; - this.version = version; - this.words = words; - int expectedWordsLength = MathHelper.ceil((float) size / version.entriesPerWord); - if (words.length != expectedWordsLength) { - throw new IllegalArgumentException("Invalid length given for storage, got: " + words.length + - " but expected: " + expectedWordsLength); - } - } - - /** - * Sets the entry at the given location to the given value - */ - public void set(int index, int value) { - Preconditions.checkElementIndex(index, this.size); - Preconditions.checkArgument(value >= 0 && value <= this.version.maxEntryValue, - "Max value: %s. Received value", this.version.maxEntryValue, value); - int bitIndex = index * this.version.bits; - int arrayIndex = bitIndex >> 5; - int offset = bitIndex & 31; - this.words[arrayIndex] = this.words[arrayIndex] & ~(this.version.maxEntryValue << offset) | (value & this.version.maxEntryValue) << offset; - } - - /** - * Gets the entry at the given index - */ - public int get(int index) { - Preconditions.checkElementIndex(index, this.size); - int bitIndex = index * this.version.bits; - int arrayIndex = bitIndex >> 5; - int wordOffset = bitIndex & 31; - return this.words[arrayIndex] >>> wordOffset & this.version.maxEntryValue; - } - - /** - * Gets the long array that is used to store the data in this BitArray. This is useful for sending packet data. - */ - public int size() { - return this.size; - } - - /** - * {@inheritDoc} - * - * @return {@inheritDoc} - */ - @Override - public int[] getWords() { - return this.words; - } - - public BitArrayVersion getVersion() { - return version; - } - - @Override - public BitArray copy() { - return new Pow2BitArray(this.version, this.size, Arrays.copyOf(this.words, this.words.length)); - } -} diff --git a/src/main/java/cn/nukkit/math/Angle.java b/src/main/java/cn/nukkit/math/Angle.java deleted file mode 100644 index 8f6bb38da..000000000 --- a/src/main/java/cn/nukkit/math/Angle.java +++ /dev/null @@ -1,147 +0,0 @@ -package cn.nukkit.math; - -import java.util.Locale; - -import static java.lang.Math.PI; - -/** - * Copyright 2017 lmlstarqaq - * All rights reserved. - */ -public final class Angle implements Comparable { - - public static Angle fromDegree(float floatDegree) { - return new Angle(floatDegree, true); - } - - public static Angle fromDegree(double doubleDegree) { - return new Angle(doubleDegree, true); - } - - public static Angle fromRadian(float floatRadian) { - return new Angle(floatRadian, false); - } - - public static Angle fromRadian(double doubleRadian) { - return new Angle(doubleRadian, false); - } - - public static Angle asin(double v) { - return fromRadian(Math.asin(v)); - } - - public static Angle acos(double v) { - return fromRadian(Math.acos(v)); - } - - public static Angle atan(double v) { - return fromRadian(Math.atan(v)); - } - - public double sin() { - return Math.sin(asDoubleRadian()); - } - - public double cos() { - return Math.cos(asDoubleRadian()); - } - - public double tan() { - return Math.tan(asDoubleRadian()); - } - - public float asFloatRadian() { - if (isOriginDouble) { - if (isDegree) return (float) (doubleValue * PI / 180.0); - else return (float) doubleValue; - } else { - if (isDegree) return floatValue * (float) PI / 180.0f; - else return floatValue; - } - } - - public double asDoubleRadian() { - if (isOriginDouble) { - if (isDegree) return doubleValue * PI / 180.0; - else return doubleValue; - } else { - if (isDegree) return floatValue * PI / 180.0; - else return floatValue; - } - } - - public float asFloatDegree() { - if (isOriginDouble) { - if (isDegree) return (float) doubleValue; - else return (float) (doubleValue * 180.0 / PI); - } else { - if (isDegree) return floatValue; - else return floatValue * 180.0f / (float) PI; - } - } - - public double asDoubleDegree() { - if (isOriginDouble) { - if (isDegree) return doubleValue; - else return doubleValue * 180.0 / PI; - } else { - if (isDegree) return floatValue; - else return floatValue * 180.0 / PI; - } - } - - public static int compare(Angle a, Angle b) { - return a.compareTo(b); - } - - @Override - public String toString() { - return String.format(Locale.ROOT, - "Angle[%s, %f%s = %f%s] [%d]", - isOriginDouble ? "Double" : "Float", - isOriginDouble ? doubleValue : floatValue, - isDegree ? "deg" : "rad", - isDegree ? (isOriginDouble ? asDoubleRadian() : asFloatRadian()) : - (isOriginDouble ? asDoubleDegree() : asFloatDegree()), - isDegree ? "rad" : "deg", - hashCode() - ); - } - - @Override - public int compareTo(Angle o) { - return Double.compare(asDoubleRadian(), o.asDoubleRadian()); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof Angle && this.compareTo((Angle) obj) == 0; - } - - @Override - public int hashCode() { - int hash; - if (isOriginDouble) hash = Double.hashCode(doubleValue); - else hash = Float.hashCode(floatValue); - if (isDegree) hash = hash ^ 0xABCD1234; - return hash; - } - - private final float floatValue; - private final double doubleValue; - private final boolean isDegree, isOriginDouble; - - private Angle(float floatValue, boolean isDegree) { - this.isOriginDouble = false; - this.floatValue = floatValue; - this.doubleValue = 0.0; - this.isDegree = isDegree; - } - - private Angle(double doubleValue, boolean isDegree) { - this.isOriginDouble = true; - this.floatValue = 0.0f; - this.doubleValue = doubleValue; - this.isDegree = isDegree; - } -} diff --git a/src/main/java/cn/nukkit/math/AxisAlignedBB.java b/src/main/java/cn/nukkit/math/AxisAlignedBB.java deleted file mode 100644 index 0366f6217..000000000 --- a/src/main/java/cn/nukkit/math/AxisAlignedBB.java +++ /dev/null @@ -1,396 +0,0 @@ -package cn.nukkit.math; - -import cn.nukkit.Server; -import cn.nukkit.level.MovingObjectPosition; - -/** - * auth||: MagicDroidX - * Nukkit Project - */ -public class AxisAlignedBB implements Cloneable { - - public double minX; - public double minY; - public double minZ; - public double maxX; - public double maxY; - public double maxZ; - - public AxisAlignedBB(Vector3 pos1, Vector3 pos2) { - this.minX = Math.min(pos1.x, pos2.x); - this.minY = Math.min(pos1.y, pos2.y); - this.minZ = Math.min(pos1.z, pos2.z); - this.maxX = Math.max(pos1.x, pos2.x); - this.maxY = Math.max(pos1.y, pos2.y); - this.maxZ = Math.max(pos1.z, pos2.z); - } - - public AxisAlignedBB(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { - this.minX = minX; - this.minY = minY; - this.minZ = minZ; - this.maxX = maxX; - this.maxY = maxY; - this.maxZ = maxZ; - } - - public AxisAlignedBB setBounds(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { - this.minX = minX; - this.minY = minY; - this.minZ = minZ; - this.maxX = maxX; - this.maxY = maxY; - this.maxZ = maxZ; - return this; - } - - public AxisAlignedBB addCoord(double x, double y, double z) { - double minX = this.minX; - double minY = this.minY; - double minZ = this.minZ; - double maxX = this.maxX; - double maxY = this.maxY; - double maxZ = this.maxZ; - - if (x < 0) minX += x; - if (x > 0) maxX += x; - - if (y < 0) minY += y; - if (y > 0) maxY += y; - - if (z < 0) minZ += z; - if (z > 0) maxZ += z; - - return new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); - } - - public AxisAlignedBB grow(double x, double y, double z) { - return new AxisAlignedBB(this.minX - x, this.minY - y, this.minZ - z, this.maxX + x, this.maxY + y, this.maxZ + z); - } - - public AxisAlignedBB growNoUp(double x, double y, double z) { - return new AxisAlignedBB(this.minX - x, this.minY - y, this.minZ - z, this.maxX + x, this.maxY, this.maxZ + z); - } - - public AxisAlignedBB expand(double x, double y, double z) { - this.minX -= x; - this.minY -= y; - this.minZ -= z; - this.maxX += x; - this.maxY += y; - this.maxZ += z; - - return this; - } - - public AxisAlignedBB offset(double x, double y, double z) { - this.minX += x; - this.minY += y; - this.minZ += z; - this.maxX += x; - this.maxY += y; - this.maxZ += z; - - return this; - } - - public AxisAlignedBB shrink(double x, double y, double z) { - return new AxisAlignedBB(this.minX + x, this.minY + y, this.minZ + z, this.maxX - x, this.maxY - y, this.maxZ - z); - } - - public AxisAlignedBB contract(double x, double y, double z) { - this.minX += x; - this.minY += y; - this.minZ += z; - this.maxX -= x; - this.maxY -= y; - this.maxZ -= z; - - return this; - } - - public AxisAlignedBB setBB(AxisAlignedBB bb) { - this.minX = bb.minX; - this.minY = bb.minY; - this.minZ = bb.minZ; - this.maxX = bb.maxX; - this.maxY = bb.maxY; - this.maxZ = bb.maxZ; - return this; - } - - public AxisAlignedBB getOffsetBoundingBox(double x, double y, double z) { - return new AxisAlignedBB(this.minX + x, this.minY + y, this.minZ + z, this.maxX + x, this.maxY + y, this.maxZ + z); - } - - public double calculateXOffset(AxisAlignedBB bb, double x) { - if (bb.maxY <= this.minY || bb.minY >= this.maxY) { - return x; - } - if (bb.maxZ <= this.minZ || bb.minZ >= this.maxZ) { - return x; - } - if (x > 0 && bb.maxX <= this.minX) { - double x1 = this.minX - bb.maxX; - if (x1 < x) { - x = x1; - } - } - if (x < 0 && bb.minX >= this.maxX) { - double x2 = this.maxX - bb.minX; - if (x2 > x) { - x = x2; - } - } - - return x; - } - - public double calculateYOffset(AxisAlignedBB bb, double y) { - if (bb.maxX <= this.minX || bb.minX >= this.maxX) { - return y; - } - if (bb.maxZ <= this.minZ || bb.minZ >= this.maxZ) { - return y; - } - if (y > 0 && bb.maxY <= this.minY) { - double y1 = this.minY - bb.maxY; - if (y1 < y) { - y = y1; - } - } - if (y < 0 && bb.minY >= this.maxY) { - double y2 = this.maxY - bb.minY; - if (y2 > y) { - y = y2; - } - } - - return y; - } - - public double calculateZOffset(AxisAlignedBB bb, double z) { - if (bb.maxX <= this.minX || bb.minX >= this.maxX) { - return z; - } - if (bb.maxY <= this.minY || bb.minY >= this.maxY) { - return z; - } - if (z > 0 && bb.maxZ <= this.minZ) { - double z1 = this.minZ - bb.maxZ; - if (z1 < z) { - z = z1; - } - } - if (z < 0 && bb.minZ >= this.maxZ) { - double z2 = this.maxZ - bb.minZ; - if (z2 > z) { - z = z2; - } - } - - return z; - } - - public boolean intersectsWith(AxisAlignedBB bb) { - if (bb.maxX > this.minX && bb.minX < this.maxX) { - if (bb.maxY > this.minY && bb.minY < this.maxY) { - return bb.maxZ > this.minZ && bb.minZ < this.maxZ; - } - } - - return false; - } - - public boolean isVectorInside(Vector3 vector) { - return vector.x >= this.minX && vector.x <= this.maxX && vector.y >= this.minY && vector.y <= this.maxY && vector.z >= this.minZ && vector.z <= this.maxZ; - - } - - public double getAverageEdgeLength() { - return (this.maxX - this.minX + this.maxY - this.minY + this.maxZ - this.minZ) / 3; - } - - public boolean isVectorInYZ(Vector3 vector) { - return vector.y >= this.minY && vector.y <= this.maxY && vector.z >= this.minZ && vector.z <= this.maxZ; - } - - public boolean isVectorInXZ(Vector3 vector) { - return vector.x >= this.minX && vector.x <= this.maxX && vector.z >= this.minZ && vector.z <= this.maxZ; - } - - public boolean isVectorInXY(Vector3 vector) { - return vector.x >= this.minX && vector.x <= this.maxX && vector.y >= this.minY && vector.y <= this.maxY; - } - - public MovingObjectPosition calculateIntercept(Vector3 pos1, Vector3 pos2) { - Vector3 v1 = pos1.getIntermediateWithXValue(pos2, this.minX); - Vector3 v2 = pos1.getIntermediateWithXValue(pos2, this.maxX); - Vector3 v3 = pos1.getIntermediateWithYValue(pos2, this.minY); - Vector3 v4 = pos1.getIntermediateWithYValue(pos2, this.maxY); - Vector3 v5 = pos1.getIntermediateWithZValue(pos2, this.minZ); - Vector3 v6 = pos1.getIntermediateWithZValue(pos2, this.maxZ); - - if (v1 != null && !this.isVectorInYZ(v1)) { - v1 = null; - } - - if (v2 != null && !this.isVectorInYZ(v2)) { - v2 = null; - } - - if (v3 != null && !this.isVectorInXZ(v3)) { - v3 = null; - } - - if (v4 != null && !this.isVectorInXZ(v4)) { - v4 = null; - } - - if (v5 != null && !this.isVectorInXY(v5)) { - v5 = null; - } - - if (v6 != null && !this.isVectorInXY(v6)) { - v6 = null; - } - - Vector3 vector = null; - - if (v1 != null) { - vector = v1; - } - - if (v2 != null && (vector == null || pos1.distanceSquared(v2) < pos1.distanceSquared(vector))) { - vector = v2; - } - - if (v3 != null && (vector == null || pos1.distanceSquared(v3) < pos1.distanceSquared(vector))) { - vector = v3; - } - - if (v4 != null && (vector == null || pos1.distanceSquared(v4) < pos1.distanceSquared(vector))) { - vector = v4; - } - - if (v5 != null && (vector == null || pos1.distanceSquared(v5) < pos1.distanceSquared(vector))) { - vector = v5; - } - - if (v6 != null && (vector == null || pos1.distanceSquared(v6) < pos1.distanceSquared(vector))) { - vector = v6; - } - - if (vector == null) { - return null; - } - - int face = -1; - - if (vector == v1) { - face = 4; - } else if (vector == v2) { - face = 5; - } else if (vector == v3) { - face = 0; - } else if (vector == v4) { - face = 1; - } else if (vector == v5) { - face = 2; - } else if (vector == v6) { - face = 3; - } - - return MovingObjectPosition.fromBlock(0, 0, 0, face, vector); - } - - @Override - public String toString() { - return "AxisAlignedBB(" + this.minX + ", " + this.minY + ", " + this.minZ + ", " + this.maxX + ", " + this.maxY + ", " + this.maxZ + ')'; - } - - @Override - public AxisAlignedBB clone() { - try { - return (AxisAlignedBB) super.clone(); - } catch (CloneNotSupportedException e) { - Server.getInstance().getLogger().logException(e); - } - return null; - } - - public void forEach(BBConsumer action) { - int minX = NukkitMath.floorDouble(this.minX); - int minY = NukkitMath.floorDouble(this.minY); - int minZ = NukkitMath.floorDouble(this.minZ); - - int maxX = NukkitMath.floorDouble(this.maxX); - int maxY = NukkitMath.floorDouble(this.maxY); - int maxZ = NukkitMath.floorDouble(this.maxZ); - - for (int x = minX; x <= maxX; x++) { - for (int y = minY; y <= maxY; y++) { - for (int z = minZ; z <= maxZ; z++) { - action.accept(x, y, z); - } - } - } - } - - public double getMaxX() { - return maxX; - } - - public double getMaxY() { - return maxY; - } - - public double getMaxZ() { - return maxZ; - } - - public double getMinX() { - return minX; - } - - public double getMinY() { - return minY; - } - - public double getMinZ() { - return minZ; - } - - public void setMaxX(double maxX) { - this.maxX = maxX; - } - - public void setMaxY(double maxY) { - this.maxY = maxY; - } - - public void setMaxZ(double maxZ) { - this.maxZ = maxZ; - } - - public void setMinX(double minX) { - this.minX = minX; - } - - public void setMinY(double minY) { - this.minY = minY; - } - - public void setMinZ(double minZ) { - this.minZ = minZ; - } - - public interface BBConsumer { - - void accept(int x, int y, int z); - - default T get() { - return null; - } - } -} diff --git a/src/main/java/cn/nukkit/math/BlockFace.java b/src/main/java/cn/nukkit/math/BlockFace.java deleted file mode 100644 index 8e8c02b70..000000000 --- a/src/main/java/cn/nukkit/math/BlockFace.java +++ /dev/null @@ -1,363 +0,0 @@ -package cn.nukkit.math; - -import com.google.common.collect.Iterators; - -import java.util.Iterator; -import java.util.Random; -import java.util.function.Predicate; - -public enum BlockFace { - - DOWN(0, 1, -1, "down", AxisDirection.NEGATIVE, new Vector3(0, -1, 0)), - UP(1, 0, -1, "up", AxisDirection.POSITIVE, new Vector3(0, 1, 0)), - NORTH(2, 3, 2, "north", AxisDirection.NEGATIVE, new Vector3(0, 0, -1)), - SOUTH(3, 2, 0, "south", AxisDirection.POSITIVE, new Vector3(0, 0, 1)), - WEST(4, 5, 1, "west", AxisDirection.NEGATIVE, new Vector3(-1, 0, 0)), - EAST(5, 4, 3, "east", AxisDirection.POSITIVE, new Vector3(1, 0, 0)); - - /** - * All faces in D-U-N-S-W-E order - */ - private static final BlockFace[] VALUES = new BlockFace[6]; - - /** - * All faces with horizontal axis in order S-W-N-E - */ - public static final BlockFace[] HORIZONTALS = new BlockFace[4]; - - static { - DOWN.axis = Axis.Y; - UP.axis = Axis.Y; - NORTH.axis = Axis.Z; - SOUTH.axis = Axis.Z; - WEST.axis = Axis.X; - EAST.axis = Axis.X; - - for (BlockFace face : values()) { - VALUES[face.index] = face; - - if (face.axis.isHorizontal()) { - HORIZONTALS[face.horizontalIndex] = face; - } - } - } - - /** - * Ordering index for D-U-N-S-W-E - */ - private final int index; - - /** - * Index of the opposite BlockFace in the VALUES array - */ - private final int opposite; - - /** - * Ordering index for the HORIZONTALS field (S-W-N-E) - */ - private final int horizontalIndex; - - /** - * The name of this BlockFace (up, down, north, etc.) - */ - private final String name; - - - private Axis axis; - private final AxisDirection axisDirection; - - /** - * Normalized vector that points in the direction of this BlockFace - */ - private final Vector3 unitVector; - - BlockFace(int index, int opposite, int horizontalIndex, String name, AxisDirection axisDirection, Vector3 unitVector) { - this.index = index; - this.opposite = opposite; - this.horizontalIndex = horizontalIndex; - this.name = name; - this.axisDirection = axisDirection; - this.unitVector = unitVector; - } - - /** - * Get a BlockFace by it's index (0-5). The order is D-U-N-S-W-E - * - * @param index BlockFace index - * @return block face - */ - public static BlockFace fromIndex(int index) { - return VALUES[MathHelper.abs(index % VALUES.length)]; - } - - /** - * Get a BlockFace by it's horizontal index (0-3). The order is S-W-N-E - * - * @param index BlockFace index - * @return block face - */ - public static BlockFace fromHorizontalIndex(int index) { - return HORIZONTALS[MathHelper.abs(index % HORIZONTALS.length)]; - } - - /** - * Get the BlockFace corresponding to the given angle (0-360). An angle of 0 is SOUTH, an angle of 90 would be WEST - * - * @param angle horizontal angle - * @return block face - */ - public static BlockFace fromHorizontalAngle(double angle) { - return fromHorizontalIndex(NukkitMath.floorDouble(angle / 90.0D + 0.5D) & 3); - } - - public static BlockFace fromAxis(AxisDirection axisDirection, Axis axis) { - for (BlockFace face : VALUES) { - if (face.axisDirection == axisDirection && face.axis == axis) { - return face; - } - } - - throw new RuntimeException("Unable to get face from axis: " + axisDirection + ' ' + axis); - } - - /** - * Choose a random BlockFace using the given Random - * - * @param rand random number generator - * @return block face - */ - public static BlockFace random(Random rand) { - return VALUES[rand.nextInt(VALUES.length)]; - } - - /** - * Get the index of this BlockFace (0-5). The order is D-U-N-S-W-E - * - * @return index - */ - public int getIndex() { - return index; - } - - /** - * Get the horizontal index of this BlockFace (0-3). The order is S-W-N-E - * - * @return horizontal index - */ - public int getHorizontalIndex() { - return horizontalIndex; - } - - /** - * Get the angle of this BlockFace (0-360) - * - * @return horizontal angle - */ - public float getHorizontalAngle() { - return (float) ((horizontalIndex & 3) * 90); - } - - /** - * Get the name of this BlockFace (up, down, north, etc.) - * - * @return name - */ - public String getName() { - return name; - } - - /** - * Get the Axis of this BlockFace - * - * @return axis - */ - public Axis getAxis() { - return axis; - } - - /** - * Get the AxisDirection of this BlockFace - * - * @return axis direction - */ - public AxisDirection getAxisDirection() { - return axisDirection; - } - - /** - * Get the unit vector of this BlockFace - * - * @return vector - */ - public Vector3 getUnitVector() { - return unitVector; - } - - /** - * Returns an offset that addresses the block in front of this BlockFace - * - * @return x offset - */ - public int getXOffset() { - return axis == Axis.X ? axisDirection.getOffset() : 0; - } - - /** - * Returns an offset that addresses the block in front of this BlockFace - * - * @return y offset - */ - public int getYOffset() { - return axis == Axis.Y ? axisDirection.getOffset() : 0; - } - - /** - * Returns an offset that addresses the block in front of this BlockFace - * - * @return z offset - */ - public int getZOffset() { - return axis == Axis.Z ? axisDirection.getOffset() : 0; - } - - /** - * Get the opposite BlockFace (e.g. DOWN ==> UP) - * - * @return block face - */ - public BlockFace getOpposite() { - return fromIndex(opposite); - } - - /** - * Rotate this BlockFace around the Y axis clockwise (NORTH => EAST => SOUTH => WEST => NORTH) - * - * @return block face - */ - public BlockFace rotateY() { - switch (this) { - case NORTH: - return EAST; - case EAST: - return SOUTH; - case SOUTH: - return WEST; - case WEST: - return NORTH; - default: - throw new RuntimeException("Unable to get Y-rotated face of " + this); - } - } - - /** - * Rotate this BlockFace around the Y axis counter-clockwise (NORTH => WEST => SOUTH => EAST => NORTH) - * - * @return block face - */ - public BlockFace rotateYCCW() { - switch (this) { - case NORTH: - return WEST; - case EAST: - return NORTH; - case SOUTH: - return EAST; - case WEST: - return SOUTH; - default: - throw new RuntimeException("Unable to get counter-clockwise Y-rotated face of " + this); - } - } - - public String toString() { - return name; - } - - public enum Axis implements Predicate { - X("x"), - Y("y"), - Z("z"); - - private final String name; - private Plane plane; - - static { - X.plane = Plane.HORIZONTAL; - Y.plane = Plane.VERTICAL; - Z.plane = Plane.HORIZONTAL; - } - - Axis(String name) { - this.name = name; - } - - public boolean isVertical() { - return plane == Plane.VERTICAL; - } - - public boolean isHorizontal() { - return plane == Plane.HORIZONTAL; - } - - public Plane getPlane() { - return plane; - } - - public String getName() { - return name; - } - - public boolean test(BlockFace face) { - return face != null && face.getAxis() == this; - } - - public String toString() { - return name; - } - } - - public enum AxisDirection { - POSITIVE(1, "Towards positive"), - NEGATIVE(-1, "Towards negative"); - - private final int offset; - private final String description; - - AxisDirection(int offset, String description) { - this.offset = offset; - this.description = description; - } - - public int getOffset() { - return offset; - } - - public String toString() { - return description; - } - } - - public enum Plane implements Predicate, Iterable { - HORIZONTAL, - VERTICAL; - - static { - HORIZONTAL.faces = new BlockFace[]{NORTH, EAST, SOUTH, WEST}; - VERTICAL.faces = new BlockFace[]{UP, DOWN}; - } - - private BlockFace[] faces; - - public BlockFace random(NukkitRandom rand) { - return faces[rand.nextBoundedInt(faces.length)]; - } - - public boolean test(BlockFace face) { - return face != null && face.getAxis().getPlane() == this; - } - - public Iterator iterator() { - return Iterators.forArray(faces); - } - } -} diff --git a/src/main/java/cn/nukkit/math/BlockVector3.java b/src/main/java/cn/nukkit/math/BlockVector3.java deleted file mode 100644 index 40e4aa065..000000000 --- a/src/main/java/cn/nukkit/math/BlockVector3.java +++ /dev/null @@ -1,243 +0,0 @@ -package cn.nukkit.math; - -public class BlockVector3 implements Cloneable { - - public int x; - public int y; - public int z; - - public BlockVector3(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - } - - public BlockVector3() { - } - - public BlockVector3 setComponents(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - return this; - } - - public int getX() { - return this.x; - } - - public int getY() { - return this.y; - } - - public int getZ() { - return this.z; - } - - public BlockVector3 setX(int x) { - this.x = x; - return this; - } - - public BlockVector3 setY(int y) { - this.y = y; - return this; - } - - public BlockVector3 setZ(int z) { - this.z = z; - return this; - } - - public Vector3 add(double x) { - return this.add(x, 0, 0); - } - - public Vector3 add(double x, double y) { - return this.add(x, y, 0); - } - - public Vector3 add(double x, double y, double z) { - return new Vector3(this.x + x, this.y + y, this.z + z); - } - - public Vector3 add(Vector3 x) { - return new Vector3(this.x + x.getX(), this.y + x.getY(), this.z + x.getZ()); - } - - public Vector3 subtract(double x) { - return this.subtract(x, 0, 0); - } - - public Vector3 subtract(double x, double y) { - return this.subtract(x, y, 0); - } - - public Vector3 subtract(double x, double y, double z) { - return this.add(-x, -y, -z); - } - - public Vector3 subtract(Vector3 x) { - return this.add(-x.getX(), -x.getY(), -x.getZ()); - } - - public BlockVector3 add(int x) { - return this.add(x, 0, 0); - } - - public BlockVector3 add(int x, int y) { - return this.add(x, y, 0); - } - - public BlockVector3 add(int x, int y, int z) { - return new BlockVector3(this.x + x, this.y + y, this.z + z); - } - - public BlockVector3 add(BlockVector3 x) { - return new BlockVector3(this.x + x.x, this.y + x.y, this.z + x.z); - } - - public BlockVector3 subtract() { - return this.subtract(0, 0, 0); - } - - public BlockVector3 subtract(int x) { - return this.subtract(x, 0, 0); - } - - public BlockVector3 subtract(int x, int y) { - return this.subtract(x, y, 0); - } - - public BlockVector3 subtract(int x, int y, int z) { - return this.add(-x, -y, -z); - } - - public BlockVector3 subtract(BlockVector3 x) { - return this.add(-x.x, -x.y, -x.z); - } - - public BlockVector3 multiply(int number) { - return new BlockVector3(this.x * number, this.y * number, this.z * number); - } - - public BlockVector3 divide(int number) { - return new BlockVector3(this.x / number, this.y / number, this.z / number); - } - - public BlockVector3 getSide(BlockFace face) { - return this.getSide(face, 1); - } - - public BlockVector3 getSide(BlockFace face, int step) { - return new BlockVector3(this.x + face.getXOffset() * step, this.y + face.getYOffset() * step, this.z + face.getZOffset() * step); - } - - public BlockVector3 up() { - return up(1); - } - - public BlockVector3 up(int step) { - return getSide(BlockFace.UP, step); - } - - public BlockVector3 down() { - return down(1); - } - - public BlockVector3 down(int step) { - return getSide(BlockFace.DOWN, step); - } - - public BlockVector3 north() { - return north(1); - } - - public BlockVector3 north(int step) { - return getSide(BlockFace.NORTH, step); - } - - public BlockVector3 south() { - return south(1); - } - - public BlockVector3 south(int step) { - return getSide(BlockFace.SOUTH, step); - } - - public BlockVector3 east() { - return east(1); - } - - public BlockVector3 east(int step) { - return getSide(BlockFace.EAST, step); - } - - public BlockVector3 west() { - return west(1); - } - - public BlockVector3 west(int step) { - return getSide(BlockFace.WEST, step); - } - - public double distance(Vector3 pos) { - return Math.sqrt(this.distanceSquared(pos)); - } - - public double distance(BlockVector3 pos) { - return Math.sqrt(this.distanceSquared(pos)); - } - - public double distanceSquared(Vector3 pos) { - return distanceSquared(pos.x, pos.y, pos.z); - } - - public double distanceSquared(BlockVector3 pos) { - return distanceSquared(pos.x, pos.y, pos.z); - } - - public double distanceSquared(double x, double y, double z) { - return Math.pow(this.x - x, 2) + Math.pow(this.y - y, 2) + Math.pow(this.z - z, 2); - } - - @Override - public boolean equals(Object o) { - if (o == null) return false; - if (o == this) return true; - - if (!(o instanceof BlockVector3)) return false; - BlockVector3 that = (BlockVector3) o; - - return this.x == that.x && - this.y == that.y && - this.z == that.z; - } - - @Override - public final int hashCode() { - return (x ^ (z << 12)) ^ (y << 24); - } - - @Override - public String toString() { - return "BlockPosition(level=" + ",x=" + this.x + ",y=" + this.y + ",z=" + this.z + ')'; - } - - @Override - public BlockVector3 clone() { - try { - return (BlockVector3) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - - public Vector3 asVector3() { - return new Vector3(this.x, this.y, this.z); - } - - public Vector3f asVector3f() { - return new Vector3f(this.x, this.y, this.z); - } -} diff --git a/src/main/java/cn/nukkit/math/MathHelper.java b/src/main/java/cn/nukkit/math/MathHelper.java deleted file mode 100644 index dc522342f..000000000 --- a/src/main/java/cn/nukkit/math/MathHelper.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.nukkit.math; - -import java.util.Random; - -public class MathHelper { - - private static float[] a = new float[65536]; - - static { - for (int i = 0; i < 65536; i++) - a[i] = (float) Math.sin(i * 3.141592653589793D * 2.0D / 65536.0D); - } - - private MathHelper() { - } - - public static float sqrt(float paramFloat) { - return (float) Math.sqrt(paramFloat); - } - - public static float sin(float paramFloat) { - return a[((int) (paramFloat * 10430.378F) & 0xFFFF)]; - } - - public static float cos(float paramFloat) { - return a[((int) (paramFloat * 10430.378F + 16384.0F) & 0xFFFF)]; - } - - public static float sin(double paramFloat) { - return a[((int) (paramFloat * 10430.378F) & 0xFFFF)]; - } - - public static float cos(double paramFloat) { - return a[((int) (paramFloat * 10430.378F + 16384.0F) & 0xFFFF)]; - } - - public static int floor(double d0) { - int i = (int) d0; - - return d0 < (double) i ? i - 1 : i; - } - - public static long floor_double_long(double d) { - long l = (long) d; - return d >= (double) l ? l : l - 1L; - } - - public static int floor_float_int(float f) { - int i = (int) f; - return f >= i ? i : i - 1; - } - - public static int abs(int number) { - if (number > 0) { - return number; - } else { - return -number; - } - } - - public static int log2(int bits) { - return Integer.SIZE - Integer.numberOfLeadingZeros(bits); - } - - /** - * Returns a random number between min and max, inclusive. - * - * @param random The random number generator. - * @param min The minimum value. - * @param max The maximum value. - * @return A random number between min and max, inclusive. - */ - public static int getRandomNumberInRange(Random random, int min, int max) { - return min + random.nextInt(max - min + 1); - } - - public static double max(double first, double second, double third, double fourth) { - if (first > second && first > third && first > fourth) { - return first; - } - if (second > third && second > fourth) { - return second; - } - return Math.max(third, fourth); - } - - public static int ceil(float floatNumber) { - int truncated = (int) floatNumber; - return floatNumber > truncated ? truncated + 1 : truncated; - } - - public static int clamp(int check, int min, int max) { - return check > max ? max : (Math.max(check, min)); - } - - public static double denormalizeClamp(double lowerBnd, double upperBnd, double slide) { - return slide < 0.0D ? lowerBnd : (slide > 1.0D ? upperBnd : lowerBnd + (upperBnd - lowerBnd) * slide); - } - - public static float denormalizeClamp(float lowerBnd, float upperBnd, float slide) { - return slide < 0.0f ? lowerBnd : (slide > 1.0f ? upperBnd : lowerBnd + (upperBnd - lowerBnd) * slide); - } - - public static int log2nlz(int bits) { - if (bits == 0) return 0; - return 31 - Integer.numberOfLeadingZeros(bits); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/math/NukkitMath.java b/src/main/java/cn/nukkit/math/NukkitMath.java deleted file mode 100644 index b3a7d6f48..000000000 --- a/src/main/java/cn/nukkit/math/NukkitMath.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.math; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class NukkitMath { - - public static int floorDouble(double n) { - int i = (int) n; - return n >= i ? i : i - 1; - } - - public static int ceilDouble(double n) { - int i = (int) (n + 1); - return n >= i ? i : i - 1; - } - - public static int floorFloat(float n) { - int i = (int) n; - return n >= i ? i : i - 1; - } - - public static int ceilFloat(float n) { - int i = (int) (n + 1); - return n >= i ? i : i - 1; - } - - public static int randomRange(NukkitRandom random) { - return randomRange(random, 0); - } - - public static int randomRange(NukkitRandom random, int start) { - return randomRange(random, 0, 0x7fffffff); - } - - public static int randomRange(NukkitRandom random, int start, int end) { - return start + (random.nextInt() % (end + 1 - start)); - } - - public static double round(double d) { - return round(d, 0); - } - - public static double round(double d, int precision) { - return ((double) Math.round(d * Math.pow(10, precision))) / Math.pow(10, precision); - } - - public static double clamp(double value, double min, double max) { - return value < min ? min : (Math.min(value, max)); - } - - public static int clamp(int value, int min, int max) { - return value < min ? min : (Math.min(value, max)); - } - - public static double getDirection(double diffX, double diffZ) { - diffX = Math.abs(diffX); - diffZ = Math.abs(diffZ); - - return Math.max(diffX, diffZ); - } -} diff --git a/src/main/java/cn/nukkit/math/NukkitRandom.java b/src/main/java/cn/nukkit/math/NukkitRandom.java deleted file mode 100644 index 917f87668..000000000 --- a/src/main/java/cn/nukkit/math/NukkitRandom.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.nukkit.math; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.zip.CRC32; - -/** - * @author Angelic47 - * Nukkit Project - */ -public class NukkitRandom { - - protected long seed; - - public NukkitRandom() { - this(-1); - } - - public NukkitRandom(long seeds) { - if (seeds == -1) { - seeds = System.currentTimeMillis() / 1000L; - } - this.setSeed(seeds); - } - - public void setSeed(long seeds) { - CRC32 crc32 = new CRC32(); - ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN); - buffer.putInt((int) seeds); - crc32.update(buffer.array()); - this.seed = crc32.getValue(); - } - - public int nextSignedInt() { - int t = (((int) ((this.seed * 65535) + 31337) >> 8) + 1337); - this.seed ^= t; - return t; - } - - public int nextInt() { - return this.nextSignedInt() & 0x7fffffff; - } - - public double nextDouble() { - return (double) this.nextInt() / 0x7fffffff; - } - - public float nextFloat() { - return (float) this.nextInt() / 0x7fffffff; - } - - public float nextSignedFloat() { - return (float) this.nextInt() / 0x7fffffff; - } - - public double nextSignedDouble() { - return (double) this.nextSignedInt() / 0x7fffffff; - } - - public boolean nextBoolean() { - return (this.nextSignedInt() & 0x01) == 0; - } - - public int nextRange() { - return nextRange(0, 0x7fffffff); - } - - public int nextRange(int start) { - return nextRange(start, 0x7fffffff); - } - - public int nextRange(int start, int end) { - return start + (this.nextInt() % (end + 1 - start)); - } - - public int nextBoundedInt(int bound) { - return bound == 0 ? 0 : this.nextInt() % bound; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/math/Vector2.java b/src/main/java/cn/nukkit/math/Vector2.java deleted file mode 100644 index 29dece471..000000000 --- a/src/main/java/cn/nukkit/math/Vector2.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.math; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Vector2 { - - public final double x; - public final double y; - - public Vector2() { - this(0, 0); - } - - public Vector2(double x) { - this(x, 0); - } - - public Vector2(double x, double y) { - this.x = x; - this.y = y; - } - - public double getX() { - return this.x; - } - - public double getY() { - return this.y; - } - - public int getFloorX() { - return (int) Math.floor(this.x); - } - - public int getFloorY() { - return (int) Math.floor(this.y); - } - - public Vector2 add(double x) { - return this.add(x, 0); - } - - public Vector2 add(double x, double y) { - return new Vector2(this.x + x, this.y + y); - } - - public Vector2 add(Vector2 x) { - return this.add(x.x, x.y); - } - - public Vector2 subtract(double x) { - return this.subtract(x, 0); - } - - public Vector2 subtract(double x, double y) { - return this.add(-x, -y); - } - - public Vector2 subtract(Vector2 x) { - return this.add(-x.x, -x.y); - } - - public Vector2 ceil() { - return new Vector2((int) (this.x + 1), (int) (this.y + 1)); - } - - public Vector2 floor() { - return new Vector2((int) Math.floor(this.x), (int) Math.floor(this.y)); - } - - public Vector2 round() { - return new Vector2(Math.round(this.x), Math.round(this.y)); - } - - public Vector2 abs() { - return new Vector2(Math.abs(this.x), Math.abs(this.y)); - } - - public Vector2 multiply(double number) { - return new Vector2(this.x * number, this.y * number); - } - - public Vector2 divide(double number) { - return new Vector2(this.x / number, this.y / number); - } - - public double distance(double x) { - return this.distance(x, 0); - } - - public double distance(double x, double y) { - return Math.sqrt(this.distanceSquared(x, y)); - } - - public double distance(Vector2 vector) { - return Math.sqrt(this.distanceSquared(vector.x, vector.y)); - } - - public double distanceSquared(double x) { - return this.distanceSquared(x, 0); - } - - public double distanceSquared(double x, double y) { - return Math.pow(this.x - x, 2) + Math.pow(this.y - y, 2); - } - - public double distanceSquared(Vector2 vector) { - return this.distanceSquared(vector.x, vector.y); - } - - public double length() { - return Math.sqrt(this.lengthSquared()); - } - - public double lengthSquared() { - return this.x * this.x + this.y * this.y; - } - - public Vector2 normalize() { - double len = this.lengthSquared(); - if (len != 0) { - return this.divide(Math.sqrt(len)); - } - return new Vector2(0, 0); - } - - public double dot(Vector2 v) { - return this.x * v.x + this.y * v.y; - } - - @Override - public String toString() { - return "Vector2(x=" + this.x + ",y=" + this.y + ')'; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/math/Vector2f.java b/src/main/java/cn/nukkit/math/Vector2f.java deleted file mode 100644 index 44e9dacac..000000000 --- a/src/main/java/cn/nukkit/math/Vector2f.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.nukkit.math; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Vector2f { - - public final float x; - public final float y; - - public Vector2f() { - this(0, 0); - } - - public Vector2f(float x) { - this(x, 0); - } - - public Vector2f(float x, float y) { - this.x = x; - this.y = y; - } - - public float getX() { - return this.x; - } - - public float getY() { - return this.y; - } - - public int getFloorX() { - return NukkitMath.floorFloat(this.x); - } - - public int getFloorY() { - return NukkitMath.floorFloat(this.y); - } - - public Vector2f add(float x) { - return this.add(x, 0); - } - - public Vector2f add(float x, float y) { - return new Vector2f(this.x + x, this.y + y); - } - - public Vector2f add(Vector2f x) { - return this.add(x.x, x.y); - } - - public Vector2f subtract(float x) { - return this.subtract(x, 0); - } - - public Vector2f subtract(float x, float y) { - return this.add(-x, -y); - } - - public Vector2f subtract(Vector2f x) { - return this.add(-x.x, -x.y); - } - - public Vector2f ceil() { - return new Vector2f((int) (this.x + 1), (int) (this.y + 1)); - } - - public Vector2f floor() { - return new Vector2f(this.getFloorX(), this.getFloorY()); - } - - public Vector2f round() { - return new Vector2f(Math.round(this.x), Math.round(this.y)); - } - - public Vector2f abs() { - return new Vector2f(Math.abs(this.x), Math.abs(this.y)); - } - - public Vector2f multiply(float number) { - return new Vector2f(this.x * number, this.y * number); - } - - public Vector2f divide(float number) { - return new Vector2f(this.x / number, this.y / number); - } - - public double distance(float x) { - return this.distance(x, 0); - } - - public double distance(float x, float y) { - return Math.sqrt(this.distanceSquared(x, y)); - } - - public double distance(Vector2f vector) { - return Math.sqrt(this.distanceSquared(vector.x, vector.y)); - } - - public double distanceSquared(float x) { - return this.distanceSquared(x, 0); - } - - public double distanceSquared(float x, float y) { - return Math.pow(this.x - x, 2) + Math.pow(this.y - y, 2); - } - - public double distanceSquared(Vector2f vector) { - return this.distanceSquared(vector.x, vector.y); - } - - public double length() { - return Math.sqrt(this.lengthSquared()); - } - - public float lengthSquared() { - return this.x * this.x + this.y * this.y; - } - - public Vector2f normalize() { - float len = this.lengthSquared(); - if (len != 0) { - return this.divide((float) Math.sqrt(len)); - } - return new Vector2f(0, 0); - } - - public float dot(Vector2f v) { - return this.x * v.x + this.y * v.y; - } - - @Override - public String toString() { - return "Vector2(x=" + this.x + ",y=" + this.y + ')'; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/math/Vector3.java b/src/main/java/cn/nukkit/math/Vector3.java deleted file mode 100644 index 08f6b49cb..000000000 --- a/src/main/java/cn/nukkit/math/Vector3.java +++ /dev/null @@ -1,415 +0,0 @@ -package cn.nukkit.math; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Vector3 implements Cloneable { - - public double x; - public double y; - public double z; - - public Vector3() { - this(0, 0, 0); - } - - public Vector3(double x) { - this(x, 0, 0); - } - - public Vector3(double x, double y) { - this(x, y, 0); - } - - public Vector3(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - } - - public double getX() { - return this.x; - } - - public double getY() { - return this.y; - } - - public double getZ() { - return this.z; - } - - public Vector3 setX(double x) { - this.x = x; - return this; - } - - public Vector3 setY(double y) { - this.y = y; - return this; - } - - public Vector3 setZ(double z) { - this.z = z; - return this; - } - - - public int getFloorX() { - return (int) Math.floor(this.x); - } - - public int getFloorY() { - return (int) Math.floor(this.y); - } - - public int getFloorZ() { - return (int) Math.floor(this.z); - } - - public int getChunkX() { - return getFloorX() >> 4; - } - - public int getChunkZ() { - return getFloorZ() >> 4; - } - - public double getRight() { - return this.x; - } - - public double getUp() { - return this.y; - } - - public double getForward() { - return this.z; - } - - public double getSouth() { - return this.x; - } - - public double getWest() { - return this.z; - } - - public Vector3 add(double x) { - return this.add(x, 0, 0); - } - - public Vector3 add(double x, double y) { - return this.add(x, y, 0); - } - - public Vector3 add(double x, double y, double z) { - return new Vector3(this.x + x, this.y + y, this.z + z); - } - - public Vector3 add(Vector3 x) { - return new Vector3(this.x + x.x, this.y + x.y, this.z + x.z); - } - - public Vector3 subtract() { - return this.subtract(0, 0, 0); - } - - public Vector3 subtract(double x) { - return this.subtract(x, 0, 0); - } - - public Vector3 subtract(double x, double y) { - return this.subtract(x, y, 0); - } - - public Vector3 subtract(double x, double y, double z) { - return this.add(-x, -y, -z); - } - - public Vector3 subtract(Vector3 x) { - return this.add(-x.x, -x.y, -x.z); - } - - public Vector3 multiply(double number) { - return new Vector3(this.x * number, this.y * number, this.z * number); - } - - public Vector3 divide(double number) { - return new Vector3(this.x / number, this.y / number, this.z / number); - } - - public Vector3 ceil() { - return new Vector3((int) Math.ceil(this.x), (int) Math.ceil(this.y), (int) Math.ceil(this.z)); - } - - public Vector3 floor() { - return new Vector3(this.getFloorX(), this.getFloorY(), this.getFloorZ()); - } - - public Vector3 round() { - return new Vector3(Math.round(this.x), Math.round(this.y), Math.round(this.z)); - } - - public Vector3 abs() { - return new Vector3((int) Math.abs(this.x), (int) Math.abs(this.y), (int) Math.abs(this.z)); - } - - public Vector3 getSide(BlockFace face) { - return this.getSide(face, 1); - } - - public Vector3 getSide(BlockFace face, int step) { - return new Vector3(this.x + face.getXOffset() * step, this.y + face.getYOffset() * step, this.z + face.getZOffset() * step); - } - - public Vector3 up() { - return up(1); - } - - public Vector3 up(int step) { - return getSide(BlockFace.UP, step); - } - - public Vector3 down() { - return down(1); - } - - public Vector3 down(int step) { - return getSide(BlockFace.DOWN, step); - } - - public Vector3 north() { - return north(1); - } - - public Vector3 north(int step) { - return getSide(BlockFace.NORTH, step); - } - - public Vector3 south() { - return south(1); - } - - public Vector3 south(int step) { - return getSide(BlockFace.SOUTH, step); - } - - public Vector3 east() { - return east(1); - } - - public Vector3 east(int step) { - return getSide(BlockFace.EAST, step); - } - - public Vector3 west() { - return west(1); - } - - public Vector3 west(int step) { - return getSide(BlockFace.WEST, step); - } - - public double distance(Vector3 pos) { - return Math.sqrt(this.distanceSquared(pos)); - } - - public double distanceSquared(Vector3 pos) { - return Math.pow(this.x - pos.x, 2) + Math.pow(this.y - pos.y, 2) + Math.pow(this.z - pos.z, 2); - } - - public double maxPlainDistance() { - return this.maxPlainDistance(0, 0); - } - - public double maxPlainDistance(double x) { - return this.maxPlainDistance(x, 0); - } - - public double maxPlainDistance(double x, double z) { - return Math.max(Math.abs(this.x - x), Math.abs(this.z - z)); - } - - public double maxPlainDistance(Vector2 vector) { - return this.maxPlainDistance(vector.x, vector.y); - } - - public double maxPlainDistance(Vector3 x) { - return this.maxPlainDistance(x.x, x.z); - } - - /** - * Calculates the Length of this Vector - * - * @return The Length of this Vector. - */ - public double length() { - return Math.sqrt(this.lengthSquared()); - } - - public double lengthSquared() { - return this.x * this.x + this.y * this.y + this.z * this.z; - } - - public Vector3 normalize() { - double len = this.lengthSquared(); - if (len > 0) { - return this.divide(Math.sqrt(len)); - } - return new Vector3(0, 0, 0); - } - - /** - * Scalar Product of this Vector and the Vector supplied. - * - * @param v Vector to calculate the scalar product to. - * @return Scalar Product - */ - public double dot(Vector3 v) { - return this.x * v.x + this.y * v.y + this.z * v.z; - } - - /** - * Calculates the cross product of this Vector and the given Vector - * - * @param v the vector to calculate the cross product with. - * @return a Vector at right angle to this and other - */ - public Vector3 cross(Vector3 v) { - return new Vector3( - this.y * v.z - this.z * v.y, - this.z * v.x - this.x * v.z, - this.x * v.y - this.y * v.x - ); - } - - /** - * Calculates the angle between this and the supplied Vector. - * - * @param v the Vector to calculate the angle to. - * @return the Angle between the two Vectors. - */ - public Angle angleBetween(Vector3 v) { - return Angle.fromRadian(Math.acos(Math.min(Math.max(this.normalize().dot(v.normalize()), -1.0d), 1.0d))); - } - - /** - * Returns a new vector with x value equal to the second parameter, along the line between this vector and the - * passed in vector, or null if not possible. - * - * @param v vector - * @param x x value - * @return intermediate vector - */ - public Vector3 getIntermediateWithXValue(Vector3 v, double x) { - double xDiff = v.x - this.x; - double yDiff = v.y - this.y; - double zDiff = v.z - this.z; - if (xDiff * xDiff < 0.0000001) { - return null; - } - double f = (x - this.x) / xDiff; - if (f < 0 || f > 1) { - return null; - } else { - return new Vector3(this.x + xDiff * f, this.y + yDiff * f, this.z + zDiff * f); - } - } - - /** - * Returns a new vector with y value equal to the second parameter, along the line between this vector and the - * passed in vector, or null if not possible. - * - * @param v vector - * @param y y value - * @return intermediate vector - */ - public Vector3 getIntermediateWithYValue(Vector3 v, double y) { - double xDiff = v.x - this.x; - double yDiff = v.y - this.y; - double zDiff = v.z - this.z; - if (yDiff * yDiff < 0.0000001) { - return null; - } - double f = (y - this.y) / yDiff; - if (f < 0 || f > 1) { - return null; - } else { - return new Vector3(this.x + xDiff * f, this.y + yDiff * f, this.z + zDiff * f); - } - } - - /** - * Returns a new vector with z value equal to the second parameter, along the line between this vector and the - * passed in vector, or null if not possible. - * - * @param v vector - * @param z z value - * @return intermediate vector - */ - public Vector3 getIntermediateWithZValue(Vector3 v, double z) { - double xDiff = v.x - this.x; - double yDiff = v.y - this.y; - double zDiff = v.z - this.z; - if (zDiff * zDiff < 0.0000001) { - return null; - } - double f = (z - this.z) / zDiff; - if (f < 0 || f > 1) { - return null; - } else { - return new Vector3(this.x + xDiff * f, this.y + yDiff * f, this.z + zDiff * f); - } - } - - public Vector3 setComponents(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - return this; - } - - @Override - public String toString() { - return "Vector3(x=" + this.x + ",y=" + this.y + ",z=" + this.z + ')'; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Vector3)) { - return false; - } - - Vector3 other = (Vector3) obj; - - return this.x == other.x && this.y == other.y && this.z == other.z; - } - - @Override - public int hashCode() { - return ((int) x ^ ((int) z << 12)) ^ ((int) y << 24); - } - - public int rawHashCode() { - return super.hashCode(); - } - - @Override - public Vector3 clone() { - try { - return (Vector3) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - - public Vector3f asVector3f() { - return new Vector3f((float) this.x, (float) this.y, (float) this.z); - } - - public BlockVector3 asBlockVector3() { - return new BlockVector3(this.getFloorX(), this.getFloorY(), this.getFloorZ()); - } -} diff --git a/src/main/java/cn/nukkit/math/Vector3f.java b/src/main/java/cn/nukkit/math/Vector3f.java deleted file mode 100644 index 2d686e5c4..000000000 --- a/src/main/java/cn/nukkit/math/Vector3f.java +++ /dev/null @@ -1,390 +0,0 @@ -package cn.nukkit.math; - -public class Vector3f implements Cloneable { - - public static final int SIDE_DOWN = 0; - public static final int SIDE_UP = 1; - public static final int SIDE_NORTH = 2; - public static final int SIDE_SOUTH = 3; - public static final int SIDE_WEST = 4; - public static final int SIDE_EAST = 5; - - public float x; - public float y; - public float z; - - public Vector3f() { - this(0, 0, 0); - } - - public Vector3f(float x) { - this(x, 0, 0); - } - - public Vector3f(float x, float y) { - this(x, y, 0); - } - - public Vector3f(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - } - - public float getX() { - return this.x; - } - - public float getY() { - return this.y; - } - - public float getZ() { - return this.z; - } - - public Vector3f setX(float x) { - this.x = x; - return this; - } - - public Vector3f setY(float y) { - this.y = y; - return this; - } - - public Vector3f setZ(float z) { - this.z = z; - return this; - } - - public int getFloorX() { - return NukkitMath.floorFloat(this.x); - } - - public int getFloorY() { - return NukkitMath.floorFloat(this.y); - } - - public int getFloorZ() { - return NukkitMath.floorFloat(this.z); - } - - public float getRight() { - return this.x; - } - - public float getUp() { - return this.y; - } - - public float getForward() { - return this.z; - } - - public float getSouth() { - return this.x; - } - - public float getWest() { - return this.z; - } - - public Vector3f add(float x) { - return this.add(x, 0, 0); - } - - public Vector3f add(float x, float y) { - return this.add(x, y, 0); - } - - public Vector3f add(float x, float y, float z) { - return new Vector3f(this.x + x, this.y + y, this.z + z); - } - - public Vector3f add(Vector3f x) { - return new Vector3f(this.x + x.x, this.y + x.y, this.z + x.z); - } - - public Vector3f subtract() { - return this.subtract(0, 0, 0); - } - - public Vector3f subtract(float x) { - return this.subtract(x, 0, 0); - } - - public Vector3f subtract(float x, float y) { - return this.subtract(x, y, 0); - } - - public Vector3f subtract(float x, float y, float z) { - return this.add(-x, -y, -z); - } - - public Vector3f subtract(Vector3f x) { - return this.add(-x.x, -x.y, -x.z); - } - - public Vector3f multiply(float number) { - return new Vector3f(this.x * number, this.y * number, this.z * number); - } - - public Vector3f divide(float number) { - return new Vector3f(this.x / number, this.y / number, this.z / number); - } - - public Vector3f ceil() { - return new Vector3f((int) Math.ceil(this.x), (int) Math.ceil(this.y), (int) Math.ceil(this.z)); - } - - public Vector3f floor() { - return new Vector3f(this.getFloorX(), this.getFloorY(), this.getFloorZ()); - } - - public Vector3f round() { - return new Vector3f(Math.round(this.x), Math.round(this.y), Math.round(this.z)); - } - - public Vector3f abs() { - return new Vector3f((int) Math.abs(this.x), (int) Math.abs(this.y), (int) Math.abs(this.z)); - } - - public Vector3f getSide(int side) { - return this.getSide(side, 1); - } - - public Vector3f getSide(int side, int step) { - switch (side) { - case Vector3f.SIDE_DOWN: - return new Vector3f(this.x, this.y - step, this.z); - case Vector3f.SIDE_UP: - return new Vector3f(this.x, this.y + step, this.z); - case Vector3f.SIDE_NORTH: - return new Vector3f(this.x, this.y, this.z - step); - case Vector3f.SIDE_SOUTH: - return new Vector3f(this.x, this.y, this.z + step); - case Vector3f.SIDE_WEST: - return new Vector3f(this.x - step, this.y, this.z); - case Vector3f.SIDE_EAST: - return new Vector3f(this.x + step, this.y, this.z); - default: - return this; - } - } - - public static int getOppositeSide(int side) { - switch (side) { - case Vector3f.SIDE_DOWN: - return Vector3f.SIDE_UP; - case Vector3f.SIDE_UP: - return Vector3f.SIDE_DOWN; - case Vector3f.SIDE_NORTH: - return Vector3f.SIDE_SOUTH; - case Vector3f.SIDE_SOUTH: - return Vector3f.SIDE_NORTH; - case Vector3f.SIDE_WEST: - return Vector3f.SIDE_EAST; - case Vector3f.SIDE_EAST: - return Vector3f.SIDE_WEST; - default: - return -1; - } - } - - public double distance(Vector3f pos) { - return Math.sqrt(this.distanceSquared(pos)); - } - - public double distanceSquared(Vector3f pos) { - return Math.pow(this.x - pos.x, 2) + Math.pow(this.y - pos.y, 2) + Math.pow(this.z - pos.z, 2); - } - - public float maxPlainDistance() { - return this.maxPlainDistance(0, 0); - } - - public float maxPlainDistance(float x) { - return this.maxPlainDistance(x, 0); - } - - public float maxPlainDistance(float x, float z) { - return Math.max(Math.abs(this.x - x), Math.abs(this.z - z)); - } - - public float maxPlainDistance(Vector2f vector) { - return this.maxPlainDistance(vector.x, vector.y); - } - - public float maxPlainDistance(Vector3f x) { - return this.maxPlainDistance(x.x, x.z); - } - - /** - * Calculates the Length of this Vector - * - * @return The Length of this Vector. - */ - public double length() { - return Math.sqrt(this.lengthSquared()); - } - - public float lengthSquared() { - return this.x * this.x + this.y * this.y + this.z * this.z; - } - - public Vector3f normalize() { - float len = this.lengthSquared(); - if (len > 0) { - return this.divide((float) Math.sqrt(len)); - } - return new Vector3f(0, 0, 0); - } - - /** - * Scalar Product of this Vector and the Vector supplied. - * - * @param v Vector to calculate the scalar product to. - * @return Scalar Product - */ - public float dot(Vector3f v) { - return this.x * v.x + this.y * v.y + this.z * v.z; - } - - /** - * Calculates the cross product of this Vector and the given Vector - * - * @param v the vector to calculate the cross product with. - * @return a Vector at right angle to this and other - */ - public Vector3f cross(Vector3f v) { - return new Vector3f( - this.y * v.z - this.z * v.y, - this.z * v.x - this.x * v.z, - this.x * v.y - this.y * v.x - ); - } - - /** - * Calculates the angle between this and the supplied Vector. - * - * @param v the Vector to calculate the angle to. - * @return the Angle between the two Vectors. - */ - public Angle angleBetween(Vector3f v) { - return Angle.fromRadian(Math.acos(Math.min(Math.max(this.normalize().dot(v.normalize()), -1.0f), 1.0f))); - } - - /** - * Returns a new vector with x value equal to the second parameter, along the line between this vector and the - * passed in vector, or null if not possible. - * - * @param v vector - * @param x x value - * @return intermediate vector - */ - public Vector3f getIntermediateWithXValue(Vector3f v, float x) { - float xDiff = v.x - this.x; - float yDiff = v.y - this.y; - float zDiff = v.z - this.z; - if (xDiff * xDiff < 0.0000001) { - return null; - } - float f = (x - this.x) / xDiff; - if (f < 0 || f > 1) { - return null; - } else { - return new Vector3f(this.x + xDiff * f, this.y + yDiff * f, this.z + zDiff * f); - } - } - - /** - * Returns a new vector with y value equal to the second parameter, along the line between this vector and the - * passed in vector, or null if not possible. - * - * @param v vector - * @param y y value - * @return intermediate vector - */ - public Vector3f getIntermediateWithYValue(Vector3f v, float y) { - float xDiff = v.x - this.x; - float yDiff = v.y - this.y; - float zDiff = v.z - this.z; - if (yDiff * yDiff < 0.0000001) { - return null; - } - float f = (y - this.y) / yDiff; - if (f < 0 || f > 1) { - return null; - } else { - return new Vector3f(this.x + xDiff * f, this.y + yDiff * f, this.z + zDiff * f); - } - } - - /** - * Returns a new vector with z value equal to the second parameter, along the line between this vector and the - * passed in vector, or null if not possible. - * - * @param v vector - * @param z z value - * @return intermediate vector - */ - public Vector3f getIntermediateWithZValue(Vector3f v, float z) { - float xDiff = v.x - this.x; - float yDiff = v.y - this.y; - float zDiff = v.z - this.z; - if (zDiff * zDiff < 0.0000001) { - return null; - } - float f = (z - this.z) / zDiff; - if (f < 0 || f > 1) { - return null; - } else { - return new Vector3f(this.x + xDiff * f, this.y + yDiff * f, this.z + zDiff * f); - } - } - - public Vector3f setComponents(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - return this; - } - - @Override - public String toString() { - return "Vector3(x=" + this.x + ",y=" + this.y + ",z=" + this.z + ')'; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Vector3f)) { - return false; - } - - Vector3f other = (Vector3f) obj; - - return this.x == other.x && this.y == other.y && this.z == other.z; - } - - public int rawHashCode() { - return super.hashCode(); - } - - @Override - public Vector3f clone() { - try { - return (Vector3f) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - - public Vector3 asVector3() { - return new Vector3(this.x, this.y, this.z); - } - - public BlockVector3 asBlockVector3() { - return new BlockVector3(getFloorX(), getFloorY(), getFloorZ()); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/math/VectorMath.java b/src/main/java/cn/nukkit/math/VectorMath.java deleted file mode 100644 index 6e8d873b9..000000000 --- a/src/main/java/cn/nukkit/math/VectorMath.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.nukkit.math; - -/** - * @author MagicDroidX - * Nukkit Project - */ - -public abstract class VectorMath { - - public static Vector2 getDirection2D(double azimuth) { - return new Vector2(Math.cos(azimuth), Math.sin(azimuth)); - } -} diff --git a/src/main/java/cn/nukkit/metadata/BlockMetadataStore.java b/src/main/java/cn/nukkit/metadata/BlockMetadataStore.java deleted file mode 100644 index 8d19484b6..000000000 --- a/src/main/java/cn/nukkit/metadata/BlockMetadataStore.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.metadata; - -import cn.nukkit.block.Block; -import cn.nukkit.level.Level; -import cn.nukkit.plugin.Plugin; - -import java.util.List; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BlockMetadataStore extends MetadataStore { - - private final Level owningLevel; - - public BlockMetadataStore(Level owningLevel) { - this.owningLevel = owningLevel; - } - - @Override - protected String disambiguate(Metadatable block, String metadataKey) { - if (!(block instanceof Block)) { - throw new IllegalArgumentException("Argument must be a Block instance"); - } - return ((Block) block).x + ":" + ((Block) block).y + ':' + ((Block) block).z + ':' + metadataKey; - } - - @Override - public List getMetadata(Object block, String metadataKey) { - if (!(block instanceof Block)) { - throw new IllegalArgumentException("Object must be a Block"); - } - if (((Block) block).getLevel() == this.owningLevel) { - return super.getMetadata(block, metadataKey); - } else { - throw new IllegalStateException("Block does not belong to world " + this.owningLevel.getName()); - } - } - - @Override - public boolean hasMetadata(Object block, String metadataKey) { - if (!(block instanceof Block)) { - throw new IllegalArgumentException("Object must be a Block"); - } - if (((Block) block).getLevel() == this.owningLevel) { - return super.hasMetadata(block, metadataKey); - } else { - throw new IllegalStateException("Block does not belong to world " + this.owningLevel.getName()); - } - } - - @Override - public void removeMetadata(Object block, String metadataKey, Plugin owningPlugin) { - if (!(block instanceof Block)) { - throw new IllegalArgumentException("Object must be a Block"); - } - if (((Block) block).getLevel() == this.owningLevel) { - super.removeMetadata(block, metadataKey, owningPlugin); - } else { - throw new IllegalStateException("Block does not belong to world " + this.owningLevel.getName()); - } - } - - @Override - public void setMetadata(Object block, String metadataKey, MetadataValue newMetadataValue) { - if (!(block instanceof Block)) { - throw new IllegalArgumentException("Object must be a Block"); - } - if (((Block) block).getLevel() == this.owningLevel) { - super.setMetadata(block, metadataKey, newMetadataValue); - } else { - throw new IllegalStateException("Block does not belong to world " + this.owningLevel.getName()); - } - } -} diff --git a/src/main/java/cn/nukkit/metadata/EntityMetadataStore.java b/src/main/java/cn/nukkit/metadata/EntityMetadataStore.java deleted file mode 100644 index 6102a9d3d..000000000 --- a/src/main/java/cn/nukkit/metadata/EntityMetadataStore.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.metadata; - -import cn.nukkit.entity.Entity; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class EntityMetadataStore extends MetadataStore { - - @Override - protected String disambiguate(Metadatable entity, String metadataKey) { - if (!(entity instanceof Entity)) { - throw new IllegalArgumentException("Argument must be an Entity instance"); - } - return ((Entity) entity).getId() + ":" + metadataKey; - } -} diff --git a/src/main/java/cn/nukkit/metadata/LevelMetadataStore.java b/src/main/java/cn/nukkit/metadata/LevelMetadataStore.java deleted file mode 100644 index 74569d533..000000000 --- a/src/main/java/cn/nukkit/metadata/LevelMetadataStore.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.metadata; - -import cn.nukkit.level.Level; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class LevelMetadataStore extends MetadataStore { - - @Override - protected String disambiguate(Metadatable level, String metadataKey) { - if (!(level instanceof Level)) { - throw new IllegalArgumentException("Argument must be a Level instance"); - } - return (((Level) level).getName() + ':' + metadataKey).toLowerCase(); - } -} diff --git a/src/main/java/cn/nukkit/metadata/MetadataStore.java b/src/main/java/cn/nukkit/metadata/MetadataStore.java deleted file mode 100644 index 5eb412195..000000000 --- a/src/main/java/cn/nukkit/metadata/MetadataStore.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.nukkit.metadata; - -import cn.nukkit.plugin.Plugin; -import cn.nukkit.utils.PluginException; -import cn.nukkit.utils.ServerException; - -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class MetadataStore { - - private final Map> metadataMap = new HashMap<>(); - - public void setMetadata(Object subject, String metadataKey, MetadataValue newMetadataValue) { - if (newMetadataValue == null) { - throw new ServerException("Value cannot be null"); - } - Plugin owningPlugin = newMetadataValue.getOwningPlugin(); - if (owningPlugin == null) { - throw new PluginException("Plugin cannot be null"); - } - String key = this.disambiguate((Metadatable) subject, metadataKey); - Map entry = this.metadataMap.computeIfAbsent(key, k -> new WeakHashMap<>(1)); - entry.put(owningPlugin, newMetadataValue); - } - - public List getMetadata(Object subject, String metadataKey) { - String key = this.disambiguate((Metadatable) subject, metadataKey); - if (this.metadataMap.containsKey(key)) { - Collection values = ((Map) this.metadataMap.get(key)).values(); - return Collections.unmodifiableList(new ArrayList<>(values)); - } - return Collections.emptyList(); - } - - public boolean hasMetadata(Object subject, String metadataKey) { - return this.metadataMap.containsKey(this.disambiguate((Metadatable) subject, metadataKey)); - } - - public void removeMetadata(Object subject, String metadataKey, Plugin owningPlugin) { - if (owningPlugin == null) { - throw new PluginException("Plugin cannot be null"); - } - String key = this.disambiguate((Metadatable) subject, metadataKey); - Map entry = this.metadataMap.get(key); - if (entry == null) { - return; - } - entry.remove(owningPlugin); - if (entry.isEmpty()) { - this.metadataMap.remove(key); - } - } - - public void invalidateAll(Plugin owningPlugin) { - if (owningPlugin == null) { - throw new PluginException("Plugin cannot be null"); - } - for (Map value : this.metadataMap.values()) { - if (value.containsKey(owningPlugin)) { - ((MetadataValue) value.get(owningPlugin)).invalidate(); - } - } - } - - protected abstract String disambiguate(Metadatable subject, String metadataKey); -} diff --git a/src/main/java/cn/nukkit/metadata/MetadataValue.java b/src/main/java/cn/nukkit/metadata/MetadataValue.java deleted file mode 100644 index 7bf3df4f9..000000000 --- a/src/main/java/cn/nukkit/metadata/MetadataValue.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.metadata; - -import cn.nukkit.plugin.Plugin; - -import java.lang.ref.WeakReference; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class MetadataValue { - - protected final WeakReference owningPlugin; - - protected MetadataValue(Plugin owningPlugin) { - this.owningPlugin = new WeakReference<>(owningPlugin); - } - - public Plugin getOwningPlugin() { - return this.owningPlugin.get(); - } - - public abstract Object value(); - - public abstract void invalidate(); -} diff --git a/src/main/java/cn/nukkit/metadata/Metadatable.java b/src/main/java/cn/nukkit/metadata/Metadatable.java deleted file mode 100644 index 63165c97c..000000000 --- a/src/main/java/cn/nukkit/metadata/Metadatable.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.nukkit.metadata; - -import cn.nukkit.plugin.Plugin; - -import java.util.List; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface Metadatable { - - void setMetadata(String metadataKey, MetadataValue newMetadataValue) throws Exception; - - List getMetadata(String metadataKey) throws Exception; - - boolean hasMetadata(String metadataKey) throws Exception; - - void removeMetadata(String metadataKey, Plugin owningPlugin) throws Exception; -} diff --git a/src/main/java/cn/nukkit/metadata/PlayerMetadataStore.java b/src/main/java/cn/nukkit/metadata/PlayerMetadataStore.java deleted file mode 100644 index c2933ee0a..000000000 --- a/src/main/java/cn/nukkit/metadata/PlayerMetadataStore.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.metadata; - -import cn.nukkit.IPlayer; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PlayerMetadataStore extends MetadataStore { - - @Override - protected String disambiguate(Metadatable player, String metadataKey) { - if (!(player instanceof IPlayer)) { - throw new IllegalArgumentException("Argument must be an IPlayer instance"); - } - return (((IPlayer) player).getName() + ':' + metadataKey).toLowerCase(); - } -} diff --git a/src/main/java/cn/nukkit/metrics/Metrics.java b/src/main/java/cn/nukkit/metrics/Metrics.java deleted file mode 100644 index a5bbf8a2e..000000000 --- a/src/main/java/cn/nukkit/metrics/Metrics.java +++ /dev/null @@ -1,522 +0,0 @@ -package cn.nukkit.metrics; - -import cn.nukkit.utils.MainLogger; -import com.nimbusds.jose.shaded.json.JSONArray; -import com.nimbusds.jose.shaded.json.JSONObject; - -import javax.net.ssl.HttpsURLConnection; -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.zip.GZIPOutputStream; - -/** - * bStats collects some data for plugin authors. - * - * Check out https://bStats.org/ to learn more about bStats! - */ -public class Metrics { - - public static final int B_STATS_VERSION = 1; - - private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - - // The url to which the data is sent - private static final String URL = "https://bStats.org/submitData/server-implementation"; - - // A list with all custom charts - private final List charts = new ArrayList<>(); - - // The name of the server software - private final String name; - - // The uuid of the server - private final String serverUUID; - - // The logger for the failed requests - private final MainLogger logger; - - public Metrics(String name, String serverUUID, boolean logFailedRequests, MainLogger logger) { - this.name = name; - this.serverUUID = serverUUID; - this.logger = logger; - this.startSubmitting(); - } - - /** - * Adds a custom chart. - * - * @param chart The chart to add. - */ - public void addCustomChart(CustomChart chart) { - if (chart == null) { - throw new IllegalArgumentException("Chart cannot be null!"); - } - charts.add(chart); - } - - /** - * Starts the Scheduler which submits our data every 30 minutes. - */ - private void startSubmitting() { - final Runnable submitTask = this::submitData; - - // Many servers tend to restart at a fixed time at xx:00 which causes an uneven distribution of requests on the - // bStats backend. To circumvent this problem, we introduce some randomness into the initial and second delay. - // WARNING: You must not modify and part of this Metrics class, including the submit delay or frequency! - // WARNING: Modifying this code will get your plugin banned on bStats. Just don't do it! - long initialDelay = (long) (60000 * (3 + Math.random() * 3)); - long secondDelay = (long) (60000 * (Math.random() * 30)); - scheduler.schedule(submitTask, initialDelay, TimeUnit.MILLISECONDS); - scheduler.scheduleAtFixedRate(submitTask, initialDelay + secondDelay, 1800000, TimeUnit.MILLISECONDS); - - logger.debug("Metrics started"); - } - - /** - * Gets the plugin specific data. - * - * @return The plugin specific data. - */ - private JSONObject getPluginData() { - JSONObject data = new JSONObject(); - data.put("pluginName", name); // Append the name of the server software - JSONArray customCharts = new JSONArray(); - for (CustomChart customChart : charts) { - // Add the data of the custom charts - JSONObject chart = customChart.getRequestJsonObject(); - if (chart == null) { // If the chart is null, we skip it - continue; - } - customCharts.add(chart); - } - data.put("customCharts", customCharts); - return data; - } - - /** - * Gets the server specific data. - * - * @return The server specific data. - */ - private JSONObject getServerData() { - // OS specific data - String osName = System.getProperty("os.name"); - String osArch = System.getProperty("os.arch"); - String osVersion = System.getProperty("os.version"); - int coreCount = Runtime.getRuntime().availableProcessors(); - JSONObject data = new JSONObject(); - data.put("serverUUID", serverUUID); - data.put("osName", osName); - data.put("osArch", osArch); - data.put("osVersion", osVersion); - data.put("coreCount", coreCount); - return data; - } - - /** - * Collects the data and sends it afterwards. - */ - private void submitData() { - final JSONObject data = getServerData(); - - JSONArray pluginData = new JSONArray(); - pluginData.add(getPluginData()); - data.put("plugins", pluginData); - - try { - // We are still in the Thread of the timer, so nothing get blocked :) - sendData(data); - } catch (Exception e) { - logger.debug("Could not submit stats of " + name, e); - } - } - - /** - * Sends the data to the bStats server. - * - * @param data The data to send. - * @throws Exception If the request failed. - */ - private static void sendData(JSONObject data) throws Exception { - if (data == null) { - throw new IllegalArgumentException("Data cannot be null!"); - } - - HttpsURLConnection connection = (HttpsURLConnection) new java.net.URL(URL).openConnection(); - - // Compress the data to save bandwidth - byte[] compressedData = compress(data.toString()); - - // Add headers - connection.setRequestMethod("POST"); - connection.addRequestProperty("Accept", "application/json"); - connection.addRequestProperty("Connection", "close"); - connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request - connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); - connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format - connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); - - // Send data - connection.setDoOutput(true); - DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); - outputStream.write(compressedData); - outputStream.flush(); - outputStream.close(); - - connection.getInputStream().close(); // We don't care about the response - Just send our data :) - } - - /** - * Gzips the given String. - * - * @param str The string to gzip. - * @return The gzipped String. - * @throws IOException If the compression failed. - */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { - return null; - } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - GZIPOutputStream gzip = new GZIPOutputStream(outputStream); - gzip.write(str.getBytes(StandardCharsets.UTF_8)); - gzip.close(); - return outputStream.toByteArray(); - } - - /** - * Represents a custom chart. - */ - public static abstract class CustomChart { - - // The id of the chart - final String chartId; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - */ - CustomChart(String chartId) { - if (chartId == null || chartId.isEmpty()) { - throw new IllegalArgumentException("ChartId cannot be null or empty!"); - } - this.chartId = chartId; - } - - private JSONObject getRequestJsonObject() { - JSONObject chart = new JSONObject(); - chart.put("chartId", chartId); - try { - JSONObject data = getChartData(); - if (data == null) { - // If the data is null we don't send the chart. - return null; - } - chart.put("data", data); - } catch (Throwable t) { - return null; - } - return chart; - } - - protected abstract JSONObject getChartData() throws Exception; - - } - - /** - * Represents a custom simple pie. - */ - public static class SimplePie extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimplePie(String chartId, Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - String value = callable.call(); - if (value == null || value.isEmpty()) { - // Null = skip the chart - return null; - } - data.put("value", value); - return data; - } - } - - /** - * Represents a custom advanced pie. - */ - public static class AdvancedPie extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedPie(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.put(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.put("values", values); - return data; - } - } - - /** - * Represents a custom drilldown pie. - */ - public static class DrilldownPie extends CustomChart { - - private final Callable>> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public DrilldownPie(String chartId, Callable>> callable) { - super(chartId); - this.callable = callable; - } - - @Override - public JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map> map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean reallyAllSkipped = true; - for (Map.Entry> entryValues : map.entrySet()) { - JSONObject value = new JSONObject(); - boolean allSkipped = true; - for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { - value.put(valueEntry.getKey(), valueEntry.getValue()); - allSkipped = false; - } - if (!allSkipped) { - reallyAllSkipped = false; - values.put(entryValues.getKey(), value); - } - } - if (reallyAllSkipped) { - // Null = skip the chart - return null; - } - data.put("values", values); - return data; - } - } - - /** - * Represents a custom single line chart. - */ - public static class SingleLineChart extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SingleLineChart(String chartId, Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - int value = callable.call(); - if (value == 0) { - // Null = skip the chart - return null; - } - data.put("value", value); - return data; - } - - } - - /** - * Represents a custom multi line chart. - */ - public static class MultiLineChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public MultiLineChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.put(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.put("values", values); - return data; - } - - } - - /** - * Represents a custom simple bar chart. - */ - public static class SimpleBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimpleBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - for (Map.Entry entry : map.entrySet()) { - JSONArray categoryValues = new JSONArray(); - categoryValues.add(entry.getValue()); - values.put(entry.getKey(), categoryValues); - } - data.put("values", values); - return data; - } - - } - - /** - * Represents a custom advanced bar chart. - */ - public static class AdvancedBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().length == 0) { - continue; // Skip this invalid - } - allSkipped = false; - JSONArray categoryValues = new JSONArray(); - for (int categoryValue : entry.getValue()) { - categoryValues.add(categoryValue); - } - values.put(entry.getKey(), categoryValues); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.put("values", values); - return data; - } - } -} diff --git a/src/main/java/cn/nukkit/metrics/NukkitMetrics.java b/src/main/java/cn/nukkit/metrics/NukkitMetrics.java deleted file mode 100644 index d7b57da94..000000000 --- a/src/main/java/cn/nukkit/metrics/NukkitMetrics.java +++ /dev/null @@ -1,89 +0,0 @@ -package cn.nukkit.metrics; - -import cn.nukkit.Server; -import cn.nukkit.utils.Utils; - -import java.util.HashMap; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class NukkitMetrics { - - private static boolean metricsStarted = false; - - public NukkitMetrics(Server server) { - if (metricsStarted) { - return; - } - - Metrics metrics = new Metrics("Nukkit", server.getServerUniqueId().toString(), true, server.getLogger()); - - metrics.addCustomChart(new Metrics.SingleLineChart("players", server::getOnlinePlayersCount)); - metrics.addCustomChart(new Metrics.SimplePie("codename", () -> "PM1E")); - metrics.addCustomChart(new Metrics.SimplePie("nukkit_version", () -> "PM1E")); - metrics.addCustomChart(new Metrics.SimplePie("xbox_auth", () -> server.xboxAuth ? "Required" : "Not required")); - - metrics.addCustomChart(new Metrics.AdvancedPie("player_platform", () -> { - Map valueMap = new HashMap<>(); - - server.getOnlinePlayers().forEach((uuid, player) -> { - String deviceOS = Utils.getOS(player); - if (!valueMap.containsKey(deviceOS)) { - valueMap.put(deviceOS, 1); - } else { - valueMap.put(deviceOS, valueMap.get(deviceOS) + 1); - } - }); - return valueMap; - })); - - metrics.addCustomChart(new Metrics.AdvancedPie("player_game_version", () -> { - Map valueMap = new HashMap<>(); - - server.getOnlinePlayers().forEach((uuid, player) -> { - String gameVersion = player.getLoginChainData().getGameVersion(); - if (!valueMap.containsKey(gameVersion)) { - valueMap.put(gameVersion, 1); - } else { - valueMap.put(gameVersion, valueMap.get(gameVersion) + 1); - } - }); - return valueMap; - })); - - // The following code can be attributed to the PaperMC project - // https://github.com/PaperMC/Paper/blob/master/Spigot-Server-Patches/0005-Paper-Metrics.patch#L614 - metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> { - Map> map = new HashMap<>(); - String javaVersion = System.getProperty("java.version"); - Map entry = new HashMap<>(); - entry.put(javaVersion, 1); - - // http://openjdk.java.net/jeps/223 - // Java decided to change their versioning scheme and in doing so modified the java.version system - // property to return $major[.$minor][.$secuity][-ea], as opposed to 1.$major.0_$identifier - // we can handle pre-9 by checking if the "major" is equal to "1", otherwise, 9+ - String majorVersion = javaVersion.split("\\.")[0]; - String release; - - int indexOf = javaVersion.lastIndexOf('.'); - - if (majorVersion.equals("1")) { - release = "Java " + javaVersion.substring(0, indexOf); - } else { - // of course, it really wouldn't be all that simple if they didn't add a quirk, now would it - // valid strings for the major may potentially include values such as -ea to deannotate a pre release - Matcher versionMatcher = Pattern.compile("\\d+").matcher(majorVersion); - if (versionMatcher.find()) { - majorVersion = versionMatcher.group(0); - } - release = "Java " + majorVersion; - } - map.put(release, entry); - return map; - })); - - metricsStarted = true; - } -} diff --git a/src/main/java/cn/nukkit/nbt/NBTIO.java b/src/main/java/cn/nukkit/nbt/NBTIO.java deleted file mode 100644 index 30b3a8818..000000000 --- a/src/main/java/cn/nukkit/nbt/NBTIO.java +++ /dev/null @@ -1,281 +0,0 @@ -package cn.nukkit.nbt; - -import cn.nukkit.item.Item; -import cn.nukkit.nbt.stream.*; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.Tag; -import cn.nukkit.utils.ThreadCache; - -import java.io.*; -import java.nio.ByteOrder; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.util.Collection; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.GZIPInputStream; - -/** - * A Named Binary Tag library for Nukkit Project - */ -public class NBTIO { - - public static CompoundTag putItemHelper(Item item) { - return putItemHelper(item, null); - } - - public static CompoundTag putItemHelper(Item item, Integer slot) { - CompoundTag tag = new CompoundTag(null) - .putShort("id", item.getId()) - .putByte("Count", item.getCount()) - .putShort("Damage", item.getDamage()); - if (slot != null) { - tag.putByte("Slot", slot); - } - - if (item.hasCompoundTag()) { - tag.putCompound("tag", item.getNamedTag()); - } - - return tag; - } - - public static Item getItemHelper(CompoundTag tag) { - if (!tag.contains("id") || !tag.contains("Count")) { - return Item.get(0); - } - - Item item; - try { - item = Item.get(tag.getShort("id"), !tag.contains("Damage") ? 0 : tag.getShort("Damage"), tag.getByte("Count")); - } catch (Exception e) { - item = Item.fromString(tag.getString("id")); - item.setDamage(!tag.contains("Damage") ? 0 : tag.getShort("Damage")); - item.setCount(tag.getByte("Count")); - } - - if (item.count > item.getMaxStackSize()) { - item.count = item.getMaxStackSize(); - tag.putByte("Count", item.getMaxStackSize()); - } - - Tag tagTag = tag.get("tag"); - if (tagTag instanceof CompoundTag) { - item.setNamedTag((CompoundTag) tagTag); - } - - return item; - } - - public static CompoundTag read(File file) throws IOException { - return read(file, ByteOrder.BIG_ENDIAN); - } - - public static CompoundTag read(File file, ByteOrder endianness) throws IOException { - if (!file.exists()) return null; - return read(new FileInputStream(file), endianness); - } - - public static CompoundTag read(InputStream inputStream) throws IOException { - return read(inputStream, ByteOrder.BIG_ENDIAN); - } - - public static CompoundTag read(InputStream inputStream, ByteOrder endianness) throws IOException { - return read(inputStream, endianness, false); - } - - public static CompoundTag read(InputStream inputStream, ByteOrder endianness, boolean network) throws IOException { - try (NBTInputStream stream = new NBTInputStream(inputStream, endianness, network)) { - Tag tag = Tag.readNamedTag(stream); - if (tag instanceof CompoundTag) { - return (CompoundTag) tag; - } - throw new IOException("Root tag must be a named compound tag"); - } - } - - public static Tag readNetwork(InputStream inputStream) throws IOException { - try (NBTInputStream stream = new NBTInputStream(inputStream, ByteOrder.LITTLE_ENDIAN, true)) { - return Tag.readNamedTag(stream); - } - } - - public static Tag readTag(InputStream inputStream, ByteOrder endianness, boolean network) throws IOException { - try (NBTInputStream stream = new NBTInputStream(inputStream, endianness, network)) { - return Tag.readNamedTag(stream); - } - } - - public static CompoundTag read(byte[] data) throws IOException { - return read(data, ByteOrder.BIG_ENDIAN); - } - - public static CompoundTag read(byte[] data, ByteOrder endianness) throws IOException { - return read(new ByteArrayInputStream(data), endianness); - } - - public static CompoundTag read(byte[] data, ByteOrder endianness, boolean network) throws IOException { - return read(new ByteArrayInputStream(data), endianness, network); - } - - public static CompoundTag readCompressed(InputStream inputStream) throws IOException { - return readCompressed(inputStream, ByteOrder.BIG_ENDIAN); - } - - public static CompoundTag readCompressed(InputStream inputStream, ByteOrder endianness) throws IOException { - return read(new BufferedInputStream(new GZIPInputStream(inputStream)), endianness); - } - - public static CompoundTag readCompressed(byte[] data) throws IOException { - return readCompressed(data, ByteOrder.BIG_ENDIAN); - } - - public static CompoundTag readCompressed(byte[] data, ByteOrder endianness) throws IOException { - return read(new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(data))), endianness, true); - } - - public static CompoundTag readNetworkCompressed(InputStream inputStream) throws IOException { - return readNetworkCompressed(inputStream, ByteOrder.BIG_ENDIAN); - } - - public static CompoundTag readNetworkCompressed(InputStream inputStream, ByteOrder endianness) throws IOException { - return read(new BufferedInputStream(new GZIPInputStream(inputStream)), endianness); - } - - public static CompoundTag readNetworkCompressed(byte[] data) throws IOException { - return readNetworkCompressed(data, ByteOrder.BIG_ENDIAN); - } - - public static CompoundTag readNetworkCompressed(byte[] data, ByteOrder endianness) throws IOException { - return read(new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(data))), endianness, true); - } - - public static byte[] write(CompoundTag tag) throws IOException { - return write(tag, ByteOrder.BIG_ENDIAN); - } - - public static byte[] write(CompoundTag tag, ByteOrder endianness) throws IOException { - return write(tag, endianness, false); - } - - public static byte[] write(CompoundTag tag, ByteOrder endianness, boolean network) throws IOException { - return write((Tag) tag, endianness, network); - } - - public static byte[] write(Tag tag, ByteOrder endianness, boolean network) throws IOException { - FastByteArrayOutputStream baos = ThreadCache.fbaos.get().reset(); - try (NBTOutputStream stream = new NBTOutputStream(baos, endianness, network)) { - Tag.writeNamedTag(tag, stream); - return baos.toByteArray(); - } - } - - public static byte[] write(Collection tags) throws IOException { - return write(tags, ByteOrder.BIG_ENDIAN); - } - - public static byte[] write(Collection tags, ByteOrder endianness) throws IOException { - return write(tags, endianness, false); - } - - public static byte[] write(Collection tags, ByteOrder endianness, boolean network) throws IOException { - FastByteArrayOutputStream baos = ThreadCache.fbaos.get().reset(); - try (NBTOutputStream stream = new NBTOutputStream(baos, endianness, network)) { - for (CompoundTag tag : tags) { - Tag.writeNamedTag(tag, stream); - } - return baos.toByteArray(); - } - } - - public static void write(CompoundTag tag, File file) throws IOException { - write(tag, file, ByteOrder.BIG_ENDIAN); - } - - public static void write(CompoundTag tag, File file, ByteOrder endianness) throws IOException { - write(tag, new FileOutputStream(file), endianness); - } - - public static void write(CompoundTag tag, OutputStream outputStream) throws IOException { - write(tag, outputStream, ByteOrder.BIG_ENDIAN); - } - - public static void write(CompoundTag tag, OutputStream outputStream, ByteOrder endianness) throws IOException { - write(tag, outputStream, endianness, false); - } - - public static void write(CompoundTag tag, OutputStream outputStream, ByteOrder endianness, boolean network) throws IOException { - try (NBTOutputStream stream = new NBTOutputStream(outputStream, endianness, network)) { - Tag.writeNamedTag(tag, stream); - } - } - - public static byte[] writeNetwork(Tag tag) throws IOException { - FastByteArrayOutputStream baos = ThreadCache.fbaos.get().reset(); - try (NBTOutputStream stream = new NBTOutputStream(baos, ByteOrder.LITTLE_ENDIAN, true)) { - Tag.writeNamedTag(tag, stream); - } - return baos.toByteArray(); - } - - public static byte[] writeGZIPCompressed(CompoundTag tag) throws IOException { - return writeGZIPCompressed(tag, ByteOrder.BIG_ENDIAN); - } - - public static byte[] writeGZIPCompressed(CompoundTag tag, ByteOrder endianness) throws IOException { - FastByteArrayOutputStream baos = ThreadCache.fbaos.get().reset(); - writeGZIPCompressed(tag, baos, endianness); - return baos.toByteArray(); - } - - public static void writeGZIPCompressed(CompoundTag tag, OutputStream outputStream) throws IOException { - writeGZIPCompressed(tag, outputStream, ByteOrder.BIG_ENDIAN); - } - - public static void writeGZIPCompressed(CompoundTag tag, OutputStream outputStream, ByteOrder endianness) throws IOException { - write(tag, new PGZIPOutputStream(outputStream), endianness); - } - - public static byte[] writeNetworkGZIPCompressed(CompoundTag tag) throws IOException { - return writeNetworkGZIPCompressed(tag, ByteOrder.BIG_ENDIAN); - } - - public static byte[] writeNetworkGZIPCompressed(CompoundTag tag, ByteOrder endianness) throws IOException { - FastByteArrayOutputStream baos = ThreadCache.fbaos.get().reset(); - writeNetworkGZIPCompressed(tag, baos, endianness); - return baos.toByteArray(); - } - - public static void writeNetworkGZIPCompressed(CompoundTag tag, OutputStream outputStream) throws IOException { - writeNetworkGZIPCompressed(tag, outputStream, ByteOrder.BIG_ENDIAN); - } - - public static void writeNetworkGZIPCompressed(CompoundTag tag, OutputStream outputStream, ByteOrder endianness) throws IOException { - write(tag, new PGZIPOutputStream(outputStream), endianness, true); - } - - public static void writeZLIBCompressed(CompoundTag tag, OutputStream outputStream) throws IOException { - writeZLIBCompressed(tag, outputStream, ByteOrder.BIG_ENDIAN); - } - - public static void writeZLIBCompressed(CompoundTag tag, OutputStream outputStream, ByteOrder endianness) throws IOException { - writeZLIBCompressed(tag, outputStream, Deflater.DEFAULT_COMPRESSION, endianness); - } - - public static void writeZLIBCompressed(CompoundTag tag, OutputStream outputStream, int level) throws IOException { - writeZLIBCompressed(tag, outputStream, level, ByteOrder.BIG_ENDIAN); - } - - public static void writeZLIBCompressed(CompoundTag tag, OutputStream outputStream, int level, ByteOrder endianness) throws IOException { - write(tag, new DeflaterOutputStream(outputStream, new Deflater(level)), endianness); - } - - public static void safeWrite(CompoundTag tag, File file) throws IOException { - File tmpFile = new File(file.getAbsolutePath() + "_tmp"); - if (tmpFile.exists()) { - tmpFile.delete(); - } - write(tag, tmpFile); - Files.move(tmpFile.toPath(), file.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); - } -} diff --git a/src/main/java/cn/nukkit/nbt/stream/FastByteArrayOutputStream.java b/src/main/java/cn/nukkit/nbt/stream/FastByteArrayOutputStream.java deleted file mode 100644 index e8dcbf942..000000000 --- a/src/main/java/cn/nukkit/nbt/stream/FastByteArrayOutputStream.java +++ /dev/null @@ -1,140 +0,0 @@ -package cn.nukkit.nbt.stream; - - -/* - * fastutil: Fast & compact type-specific collections for Java - * - * Copyright (C) 2003-2011 Sebastiano Vigna - * - * This library 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 2.1 of the License, or (at your option) - * any later version. - * - * This library 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -import java.io.IOException; -import java.io.OutputStream; -import java.util.Arrays; - -/** Simple, fast byte-array output stream that exposes the backing array. - * - *

{@link java.io.ByteArrayOutputStream} is nice, but to get its content you - * must generate each time a new object. This doesn't happen here. - * - *

This class will automatically enlarge the backing array, doubling its - * size whenever new space is needed. The {@link #reset()} method will - * mark the content as empty, but will not decrease the capacity - * - * @author Sebastiano Vigna - */ - -public class FastByteArrayOutputStream extends OutputStream { - - public static final long ONEOVERPHI = 106039; - - /** The array backing the output stream. */ - public final static int DEFAULT_INITIAL_CAPACITY = 16; - - /** The array backing the output stream. */ - public byte[] array; - - /** The number of valid bytes in {@link #array}. */ - public int length; - - /** The current writing position. */ - private int position; - - /** Creates a new array output stream with an initial capacity of {@link #DEFAULT_INITIAL_CAPACITY} bytes. */ - public FastByteArrayOutputStream() { - this( DEFAULT_INITIAL_CAPACITY ); - } - - /** Creates a new array output stream with a given initial capacity. - * - * @param initialCapacity the initial length of the backing array. - */ - public FastByteArrayOutputStream( final int initialCapacity ) { - array = new byte[ initialCapacity ]; - } - - /** Creates a new array output stream wrapping a given byte array. - * - * @param a the byte array to wrap. - */ - public FastByteArrayOutputStream( final byte[] a ) { - array = a; - } - - /** Marks this array output stream as empty. */ - public FastByteArrayOutputStream reset() { - length = 0; - position = 0; - return this; - } - - public void write( final int b ) { - if ( position == length ) { - length++; - if ( position == array.length ) array = grow( array, length ); - } - array[ position++ ] = (byte)b; - } - - public static void ensureOffsetLength( final int arrayLength, final int offset, final int length ) { - if ( offset < 0 ) throw new ArrayIndexOutOfBoundsException( "Offset (" + offset + ") is negative" ); - if ( length < 0 ) throw new IllegalArgumentException( "Length (" + length + ") is negative" ); - if ( offset + length > arrayLength ) throw new ArrayIndexOutOfBoundsException( "Last index (" + ( offset + length ) + ") is greater than array length (" + arrayLength + ')'); - } - - public static byte[] grow( final byte[] array, final int length ) { - if ( length > array.length ) { - final byte[] t = new byte[(int) Math.min( Math.max( ( ONEOVERPHI * array.length ) >>> 16, length ), Integer.MAX_VALUE )]; - System.arraycopy( array, 0, t, 0, array.length ); - return t; - } - return array; - } - - public static byte[] grow( final byte[] array, final int length, final int preserve ) { - if ( length > array.length ) { - final byte[] t = new byte[(int) Math.min( Math.max( ( ONEOVERPHI * array.length ) >>> 16, length ), Integer.MAX_VALUE )]; - System.arraycopy( array, 0, t, 0, preserve ); - return t; - } - return array; - } - - public void write( final byte[] b, final int off, final int len ) throws IOException { - if ( position + len > array.length ) array = grow( array, position + len, position ); - System.arraycopy( b, off, array, position, len ); - if ( position + len > length ) length = position += len; - } - - public void position( long newPosition ) { - if ( position > Integer.MAX_VALUE ) throw new IllegalArgumentException( "Position too large: " + newPosition ); - position = (int)newPosition; - } - - public long position() { - return position; - } - - public long length() throws IOException { - return length; - } - - public byte[] toByteArray() { - if (position == array.length) return array; - return Arrays.copyOfRange(array, 0, position); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/nbt/stream/NBTInputStream.java b/src/main/java/cn/nukkit/nbt/stream/NBTInputStream.java deleted file mode 100644 index 5966fe283..000000000 --- a/src/main/java/cn/nukkit/nbt/stream/NBTInputStream.java +++ /dev/null @@ -1,165 +0,0 @@ -package cn.nukkit.nbt.stream; - -import cn.nukkit.utils.VarInt; - -import java.io.DataInput; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class NBTInputStream implements DataInput, AutoCloseable { - - private final DataInputStream stream; - private final ByteOrder endianness; - private final boolean network; - - public NBTInputStream(InputStream stream) { - this(stream, ByteOrder.BIG_ENDIAN); - } - - public NBTInputStream(InputStream stream, ByteOrder endianness) { - this(stream, endianness, false); - } - - public NBTInputStream(InputStream stream, ByteOrder endianness, boolean network) { - this.stream = stream instanceof DataInputStream ? (DataInputStream) stream : new DataInputStream(stream); - this.endianness = endianness; - this.network = network; - } - - public ByteOrder getEndianness() { - return endianness; - } - - public boolean isNetwork() { - return network; - } - - @Override - public void readFully(byte[] b) throws IOException { - this.stream.readFully(b); - } - - @Override - public void readFully(byte[] b, int off, int len) throws IOException { - this.stream.readFully(b, off, len); - } - - @Override - public int skipBytes(int n) throws IOException { - return this.stream.skipBytes(n); - } - - @Override - public boolean readBoolean() throws IOException { - return this.stream.readBoolean(); - } - - @Override - public byte readByte() throws IOException { - return this.stream.readByte(); - } - - @Override - public int readUnsignedByte() throws IOException { - return this.stream.readUnsignedByte(); - } - - @Override - public short readShort() throws IOException { - short s = this.stream.readShort(); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - s = Short.reverseBytes(s); - } - return s; - } - - @Override - public int readUnsignedShort() throws IOException { - int s = this.stream.readUnsignedShort(); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - s = Integer.reverseBytes(s) >> 16; - } - return s; - } - - @Override - public char readChar() throws IOException { - char c = this.stream.readChar(); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - c = Character.reverseBytes(c); - } - return c; - } - - @Override - public int readInt() throws IOException { - if (network) { - return VarInt.readVarInt(this.stream); - } - int i = this.stream.readInt(); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - i = Integer.reverseBytes(i); - } - return i; - } - - @Override - public long readLong() throws IOException { - if (network) { - return VarInt.readVarLong(this.stream); - } - long l = this.stream.readLong(); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - l = Long.reverseBytes(l); - } - return l; - } - - @Override - public float readFloat() throws IOException { - int i = this.stream.readInt(); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - i = Integer.reverseBytes(i); - } - return Float.intBitsToFloat(i); - } - - @Override - public double readDouble() throws IOException { - long l = this.stream.readLong(); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - l = Long.reverseBytes(l); - } - return Double.longBitsToDouble(l); - } - - @Override - @SuppressWarnings("deprecation") - public String readLine() throws IOException { - return this.stream.readLine(); - } - - @Override - public String readUTF() throws IOException { - int length = (int) (network ? VarInt.readUnsignedVarInt(stream) : this.readUnsignedShort()); - byte[] bytes = new byte[length]; - this.stream.read(bytes); - return new String(bytes, StandardCharsets.UTF_8); - } - - public int available() throws IOException { - return this.stream.available(); - } - - @Override - public void close() throws IOException { - this.stream.close(); - } -} diff --git a/src/main/java/cn/nukkit/nbt/stream/NBTOutputStream.java b/src/main/java/cn/nukkit/nbt/stream/NBTOutputStream.java deleted file mode 100644 index bc8846ab0..000000000 --- a/src/main/java/cn/nukkit/nbt/stream/NBTOutputStream.java +++ /dev/null @@ -1,152 +0,0 @@ -package cn.nukkit.nbt.stream; - -import cn.nukkit.utils.VarInt; - -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class NBTOutputStream implements DataOutput, AutoCloseable { - - private final DataOutputStream stream; - private final ByteOrder endianness; - private final boolean network; - - public NBTOutputStream(OutputStream stream) { - this(stream, ByteOrder.BIG_ENDIAN); - } - - public NBTOutputStream(OutputStream stream, ByteOrder endianness) { - this(stream, endianness, false); - } - - public NBTOutputStream(OutputStream stream, ByteOrder endianness, boolean network) { - this.stream = stream instanceof DataOutputStream ? (DataOutputStream) stream : new DataOutputStream(stream); - this.endianness = endianness; - this.network = network; - } - - public ByteOrder getEndianness() { - return endianness; - } - - public boolean isNetwork() { - return network; - } - - @Override - public void write(byte[] bytes) throws IOException { - this.stream.write(bytes); - } - - @Override - public void write(byte[] b, int off, int len) throws IOException { - this.stream.write(b, off, len); - } - - @Override - public void write(int b) throws IOException { - this.stream.write(b); - } - - @Override - public void writeBoolean(boolean v) throws IOException { - this.stream.writeBoolean(v); - } - - @Override - public void writeByte(int v) throws IOException { - this.stream.writeByte(v); - } - - @Override - public void writeShort(int v) throws IOException { - if (endianness == ByteOrder.LITTLE_ENDIAN) { - v = Integer.reverseBytes(v) >> 16; - } - this.stream.writeShort(v); - } - - @Override - public void writeChar(int v) throws IOException { - if (endianness == ByteOrder.LITTLE_ENDIAN) { - v = Character.reverseBytes((char) v); - } - this.stream.writeChar(v); - } - - @Override - public void writeInt(int v) throws IOException { - if (network) { - VarInt.writeVarInt(this.stream, v); - } else { - if (endianness == ByteOrder.LITTLE_ENDIAN) { - v = Integer.reverseBytes(v); - } - this.stream.writeInt(v); - } - } - - @Override - public void writeLong(long v) throws IOException { - if (network) { - VarInt.writeVarLong(this.stream, v); - } else { - if (endianness == ByteOrder.LITTLE_ENDIAN) { - v = Long.reverseBytes(v); - } - this.stream.writeLong(v); - } - } - - @Override - public void writeFloat(float v) throws IOException { - int i = Float.floatToIntBits(v); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - i = Integer.reverseBytes(i); - } - this.stream.writeInt(i); - } - - @Override - public void writeDouble(double v) throws IOException { - long l = Double.doubleToLongBits(v); - if (endianness == ByteOrder.LITTLE_ENDIAN) { - l = Long.reverseBytes(l); - } - this.stream.writeLong(l); - } - - @Override - public void writeBytes(String s) throws IOException { - this.stream.writeBytes(s); - } - - @Override - public void writeChars(String s) throws IOException { - this.stream.writeChars(s); - } - - @Override - public void writeUTF(String s) throws IOException { - byte[] bytes = s.getBytes(StandardCharsets.UTF_8); - if (network) { - VarInt.writeUnsignedVarInt(stream, bytes.length); - } else { - this.writeShort(bytes.length); - } - this.stream.write(bytes); - } - - @Override - public void close() throws IOException { - this.stream.close(); - } -} diff --git a/src/main/java/cn/nukkit/nbt/stream/PGZIPBlock.java b/src/main/java/cn/nukkit/nbt/stream/PGZIPBlock.java deleted file mode 100644 index 4bd6a1f2d..000000000 --- a/src/main/java/cn/nukkit/nbt/stream/PGZIPBlock.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.nbt.stream; - -import java.util.concurrent.Callable; - -public class PGZIPBlock implements Callable { - - public PGZIPBlock(final PGZIPOutputStream parent) { - STATE = new PGZIPThreadLocal(parent); - } - - /** - * This ThreadLocal avoids the recycling of a lot of memory, causing lumpy performance. - */ - protected final ThreadLocal STATE; - public static final int SIZE = 65536; // 64 * 1024 - protected final byte[] in = new byte[SIZE]; - protected int in_length = 0; - - @Override - public byte[] call() throws Exception { - - PGZIPState state = STATE.get(); - state.def.reset(); - state.buf.reset(); - state.str.write(in, 0, in_length); - state.str.flush(); - - return state.buf.toByteArray(); - } - - @Override - public String toString() { - return "Block" + '(' + in_length + '/' + in.length + " bytes)"; - } -} diff --git a/src/main/java/cn/nukkit/nbt/stream/PGZIPOutputStream.java b/src/main/java/cn/nukkit/nbt/stream/PGZIPOutputStream.java deleted file mode 100644 index f5354c648..000000000 --- a/src/main/java/cn/nukkit/nbt/stream/PGZIPOutputStream.java +++ /dev/null @@ -1,229 +0,0 @@ -package cn.nukkit.nbt.stream; - -import it.unimi.dsi.fastutil.ints.IntArrayList; -import it.unimi.dsi.fastutil.ints.IntList; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.InterruptedIOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.concurrent.*; -import java.util.zip.CRC32; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; - -/** - * A multi-threaded version of {@link java.util.zip.GZIPOutputStream}. - * - * @author shevek - */ -public class PGZIPOutputStream extends FilterOutputStream { - - private static final ExecutorService EXECUTOR = Executors.newCachedThreadPool(); - - public static ExecutorService getSharedThreadPool() { - return EXECUTOR; - } - - private final static int GZIP_MAGIC = 0x8b1f; - - private IntList blockSizes = new IntArrayList(); - - private int level = Deflater.BEST_SPEED; - private int strategy = Deflater.DEFAULT_STRATEGY; - - protected Deflater newDeflater() { - Deflater def = new Deflater(level, true); - def.setStrategy(strategy); - return def; - } - - public void setStrategy(int strategy) { - this.strategy = strategy; - } - - public void setLevel(int level) { - this.level = level; - } - - protected static DeflaterOutputStream newDeflaterOutputStream(OutputStream out, Deflater deflater) { - return new DeflaterOutputStream(out, deflater, 512, true); - } - - private final ExecutorService executor; - private final int nthreads; - private final CRC32 crc = new CRC32(); - private final BlockingQueue> emitQueue; - private PGZIPBlock block = new PGZIPBlock(this/* 0 */); - /** - * Used as a sentinel for 'closed'. - */ - private int bytesWritten = 0; - - // Master thread only - public PGZIPOutputStream(OutputStream out, ExecutorService executor, int nthreads) throws IOException { - super(out); - this.executor = executor; - this.nthreads = nthreads; - this.emitQueue = new ArrayBlockingQueue>(nthreads); - writeHeader(); - } - - /** - * Creates a PGZIPOutputStream - * using {@link PGZIPOutputStream#getSharedThreadPool()}. - * - * @param out the eventual output stream for the compressed data. - * @throws java.io.IOException if it all goes wrong. - */ - public PGZIPOutputStream(OutputStream out, int nthreads) throws IOException { - this(out, PGZIPOutputStream.getSharedThreadPool(), nthreads); - } - - /** - * Creates a PGZIPOutputStream - * using {@link PGZIPOutputStream#getSharedThreadPool()} - * and {@link Runtime#availableProcessors()}. - * - * @param out the eventual output stream for the compressed data. - * @throws java.io.IOException if it all goes wrong. - */ - public PGZIPOutputStream(OutputStream out) throws IOException { - this(out, Runtime.getRuntime().availableProcessors()); - } - - /* - * @see http://www.gzip.org/zlib/rfc-gzip.html#file-format - */ - private void writeHeader() throws IOException { - out.write(new byte[]{ - (byte) GZIP_MAGIC, // ID1: Magic number (little-endian short) - (byte) (GZIP_MAGIC >> 8), // ID2: Magic number (little-endian short) - Deflater.DEFLATED, // CM: Compression method - 0, // FLG: Flags (byte) - 0, 0, 0, 0, // MTIME: Modification time (int) - 0, // XFL: Extra flags - 3 // OS: Operating system (3 = Linux) - }); - } - - // Master thread only - @Override - public void write(int b) throws IOException { - byte[] single = new byte[1]; - single[0] = (byte) (b & 0xFF); - write(single); - } - - // Master thread only - @Override - public void write(byte[] b) throws IOException { - write(b, 0, b.length); - } - - // Master thread only - @Override - public void write(byte[] b, int off, int len) throws IOException { - crc.update(b, off, len); - bytesWritten += len; - while (len > 0) { - // assert block.in_length < block.in.length - int capacity = block.in.length - block.in_length; - if (len >= capacity) { - System.arraycopy(b, off, block.in, block.in_length, capacity); - block.in_length += capacity; // == block.in.length - off += capacity; - len -= capacity; - submit(); - } else { - System.arraycopy(b, off, block.in, block.in_length, len); - block.in_length += len; - // off += len; - // len = 0; - break; - } - } - } - - // Master thread only - private void submit() throws IOException { - emitUntil(nthreads - 1); - emitQueue.add(executor.submit(block)); - block = new PGZIPBlock(this/* block.index + 1 */); - } - - // Emit If Available - submit always - // Emit At Least one - submit when executor is full - // Emit All Remaining - flush(), close() - // Master thread only - private void tryEmit() throws IOException, InterruptedException, ExecutionException { - for (; ; ) { - Future future = emitQueue.peek(); - // LOG.info("Peeked future " + future); - if (future == null) - return; - if (!future.isDone()) - return; - // It's an ordered queue. This MUST be the same element as above. - emitQueue.remove(); - byte[] toWrite = future.get(); - blockSizes.add(toWrite.length); // todo: remove after block guessing is implemented - out.write(toWrite); - } - } - - // Master thread only - - /** - * Emits any opportunistically available blocks. Furthermore, emits blocks until the number of executing tasks is less than taskCountAllowed. - */ - private void emitUntil(int taskCountAllowed) throws IOException { - try { - while (emitQueue.size() > taskCountAllowed) { - Future future = emitQueue.remove(); // Valid because emitQueue.size() > 0 - byte[] toWrite = future.get(); // Blocks until this task is done. - blockSizes.add(toWrite.length); // todo: remove after block guessing is implemented - out.write(toWrite); - } - // We may have achieved more opportunistically available blocks - // while waiting for a block above. Let's emit them here. - tryEmit(); - } catch (ExecutionException e) { - throw new IOException(e); - } catch (InterruptedException e) { - throw new InterruptedIOException(); - } - } - - // Master thread only - @Override - public void flush() throws IOException { - if (block.in_length > 0) - submit(); - emitUntil(0); - super.flush(); - } - - // Master thread only - @Override - public void close() throws IOException { - if (bytesWritten >= 0) { - flush(); - - newDeflaterOutputStream(out, newDeflater()).finish(); - - ByteBuffer buf = ByteBuffer.allocate(8); - buf.order(ByteOrder.LITTLE_ENDIAN); - buf.putInt((int) crc.getValue()); - buf.putInt(bytesWritten); - out.write(buf.array()); - - out.flush(); - out.close(); - - bytesWritten = Integer.MIN_VALUE; - } - } -} diff --git a/src/main/java/cn/nukkit/nbt/stream/PGZIPState.java b/src/main/java/cn/nukkit/nbt/stream/PGZIPState.java deleted file mode 100644 index f98be44bb..000000000 --- a/src/main/java/cn/nukkit/nbt/stream/PGZIPState.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.nbt.stream; - -import java.io.ByteArrayOutputStream; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; - -public class PGZIPState { - - protected final DeflaterOutputStream str; - protected final ByteArrayOutputStream buf; - protected final Deflater def; - - public PGZIPState(PGZIPOutputStream parent) { - this.def = parent.newDeflater(); - this.buf = new ByteArrayOutputStream(PGZIPBlock.SIZE); - this.str = PGZIPOutputStream.newDeflaterOutputStream(buf, def); - } -} diff --git a/src/main/java/cn/nukkit/nbt/stream/PGZIPThreadLocal.java b/src/main/java/cn/nukkit/nbt/stream/PGZIPThreadLocal.java deleted file mode 100644 index 5027bfaee..000000000 --- a/src/main/java/cn/nukkit/nbt/stream/PGZIPThreadLocal.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.nbt.stream; - -public class PGZIPThreadLocal extends ThreadLocal { - - private final PGZIPOutputStream parent; - - public PGZIPThreadLocal(PGZIPOutputStream parent) { - this.parent = parent; - } - - @Override - protected PGZIPState initialValue() { - return new PGZIPState(parent); - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/ByteArrayTag.java b/src/main/java/cn/nukkit/nbt/tag/ByteArrayTag.java deleted file mode 100644 index 149a606ac..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/ByteArrayTag.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; -import cn.nukkit.utils.Binary; - -import java.io.IOException; -import java.util.Arrays; - -public class ByteArrayTag extends Tag { - - public byte[] data; - - public ByteArrayTag(String name) { - super(name); - } - - public ByteArrayTag(String name, byte[] data) { - super(name); - this.data = data; - } - - @Override - void write(NBTOutputStream dos) throws IOException { - if (data == null) { - dos.writeInt(0); - return; - } - dos.writeInt(data.length); - dos.write(data); - } - - @Override - void load(NBTInputStream dis) throws IOException { - int length = dis.readInt(); - data = new byte[length]; - dis.readFully(data); - } - - public byte[] getData() { - return data; - } - - @Override - public byte getId() { - return TAG_Byte_Array; - } - - @Override - public String toString() { - return "ByteArrayTag " + this.getName() + " (data: 0x" + Binary.bytesToHexString(data, true) + " [" + data.length + " bytes])"; - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - ByteArrayTag byteArrayTag = (ByteArrayTag) obj; - return ((data == null && byteArrayTag.data == null) || (data != null && Arrays.equals(data, byteArrayTag.data))); - } - return false; - } - - @Override - public Tag copy() { - byte[] cp = new byte[data.length]; - System.arraycopy(data, 0, cp, 0, data.length); - return new ByteArrayTag(getName(), cp); - } - - @Override - public byte[] parseValue() { - return this.data; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/ByteTag.java b/src/main/java/cn/nukkit/nbt/tag/ByteTag.java deleted file mode 100644 index 317b59587..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/ByteTag.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; - -public class ByteTag extends NumberTag { - - public int data; - - @Override - public Integer getData() { - return data; - } - - @Override - public void setData(Integer data) { - this.data = data == null ? 0 : data; - } - - public ByteTag(String name) { - super(name); - } - - public ByteTag(String name, int data) { - super(name); - this.data = data; - } - - @Override - void write(NBTOutputStream dos) throws IOException { - dos.writeByte(data); - } - - @Override - void load(NBTInputStream dis) throws IOException { - data = dis.readByte(); - } - - @Override - public byte getId() { - return TAG_Byte; - } - - @Override - public Integer parseValue() { - return this.data; - } - - @Override - public String toString() { - String hex = Integer.toHexString(this.data); - if (hex.length() < 2) { - hex = '0' + hex; - } - return "ByteTag " + this.getName() + " (data: 0x" + hex + ')'; - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - ByteTag byteTag = (ByteTag) obj; - return data == byteTag.data; - } - return false; - } - - @Override - public Tag copy() { - return new ByteTag(getName(), data); - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/CompoundTag.java b/src/main/java/cn/nukkit/nbt/tag/CompoundTag.java deleted file mode 100644 index 80711cc29..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/CompoundTag.java +++ /dev/null @@ -1,280 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; -import java.io.PrintStream; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.StringJoiner; - -public class CompoundTag extends Tag implements Cloneable { - - private final Map tags = new HashMap<>(); - - public CompoundTag() { - super(""); - } - - public CompoundTag(String name) { - super(name); - } - - @Override - public void write(NBTOutputStream dos) throws IOException { - for (Map.Entry entry : this.tags.entrySet()) { - Tag.writeNamedTag(entry.getValue(), entry.getKey(), dos); - } - - dos.writeByte(Tag.TAG_End); - } - - @Override - public void load(NBTInputStream dis) throws IOException { - tags.clear(); - Tag tag; - while ((tag = Tag.readNamedTag(dis)).getId() != Tag.TAG_End) { - tags.put(tag.getName(), tag); - } - } - - public Collection getAllTags() { - return tags.values(); - } - - @Override - public byte getId() { - return TAG_Compound; - } - - public CompoundTag put(String name, Tag tag) { - tags.put(name, tag.setName(name)); - return this; - } - - public CompoundTag putByte(String name, int value) { - tags.put(name, new ByteTag(name, value)); - return this; - } - - public CompoundTag putShort(String name, int value) { - tags.put(name, new ShortTag(name, value)); - return this; - } - - public CompoundTag putInt(String name, int value) { - tags.put(name, new IntTag(name, value)); - return this; - } - - public CompoundTag putLong(String name, long value) { - tags.put(name, new LongTag(name, value)); - return this; - } - - public CompoundTag putFloat(String name, float value) { - tags.put(name, new FloatTag(name, value)); - return this; - } - - public CompoundTag putDouble(String name, double value) { - tags.put(name, new DoubleTag(name, value)); - return this; - } - - public CompoundTag putString(String name, String value) { - tags.put(name, new StringTag(name, value)); - return this; - } - - public CompoundTag putByteArray(String name, byte[] value) { - tags.put(name, new ByteArrayTag(name, value)); - return this; - } - - public CompoundTag putIntArray(String name, int[] value) { - tags.put(name, new IntArrayTag(name, value)); - return this; - } - - public CompoundTag putList(ListTag listTag) { - tags.put(listTag.getName(), listTag); - return this; - } - - public CompoundTag putCompound(String name, CompoundTag value) { - tags.put(name, value.setName(name)); - return this; - } - - public CompoundTag putBoolean(String string, boolean val) { - putByte(string, val ? 1 : 0); - return this; - } - - public Tag get(String name) { - return tags.get(name); - } - - public boolean contains(String name) { - return tags.containsKey(name); - } - - public CompoundTag remove(String name) { - tags.remove(name); - return this; - } - - public T removeAndGet(String name) { - return (T) tags.remove(name); - } - - public int getByte(String name) { - if (!tags.containsKey(name)) return (byte) 0; - return ((NumberTag) tags.get(name)).getData().intValue(); - } - - public int getShort(String name) { - if (!tags.containsKey(name)) return 0; - return ((NumberTag) tags.get(name)).getData().intValue(); - } - - public int getInt(String name) { - if (!tags.containsKey(name)) return 0; - return ((NumberTag) tags.get(name)).getData().intValue(); - } - - public long getLong(String name) { - if (!tags.containsKey(name)) return 0; - return ((NumberTag) tags.get(name)).getData().longValue(); - } - - public float getFloat(String name) { - if (!tags.containsKey(name)) return (float) 0; - return ((NumberTag) tags.get(name)).getData().floatValue(); - } - - public double getDouble(String name) { - if (!tags.containsKey(name)) return 0; - return ((NumberTag) tags.get(name)).getData().doubleValue(); - } - - public String getString(String name) { - if (!tags.containsKey(name)) return ""; - Tag tag = tags.get(name); - if (tag instanceof NumberTag) { - return String.valueOf(((NumberTag) tag).getData()); - } - return ((StringTag) tag).data; - } - - public byte[] getByteArray(String name) { - if (!tags.containsKey(name)) return new byte[0]; - return ((ByteArrayTag) tags.get(name)).data; - } - - public int[] getIntArray(String name) { - if (!tags.containsKey(name)) return new int[0]; - return ((IntArrayTag) tags.get(name)).data; - } - - public CompoundTag getCompound(String name) { - if (!tags.containsKey(name)) return new CompoundTag(name); - return (CompoundTag) tags.get(name); - } - - public ListTag getList(String name) { - if (!tags.containsKey(name)) return new ListTag<>(name); - return (ListTag) tags.get(name); - } - - @SuppressWarnings("unchecked") - public ListTag getList(String name, Class type) { - if (tags.containsKey(name)) { - return (ListTag) tags.get(name); - } - return new ListTag<>(name); - } - - public Map getTags() { - return new HashMap<>(this.tags); - } - - @Override - public Map parseValue() { - Map value = new HashMap<>(this.tags.size()); - - for (Entry entry : this.tags.entrySet()) { - value.put(entry.getKey(), entry.getValue().parseValue()); - } - - return value; - } - - public boolean getBoolean(String name) { - return getByte(name) != 0; - } - - public boolean getBoolean(String name, boolean def) { - if (!tags.containsKey(name)) return def; - return (((NumberTag) tags.get(name)).getData().intValue()) != 0; - } - - public String toString() { - StringJoiner joiner = new StringJoiner(",\n\t"); - tags.forEach((key, tag) -> joiner.add('\'' + key + "' : " + tag.toString().replace("\n", "\n\t"))); - return "CompoundTag '" + this.getName() + "' (" + tags.size() + " entries) {\n\t" + joiner.toString() + "\n}"; - } - - public void print(String prefix, PrintStream out) { - super.print(prefix, out); - out.println(prefix + '{'); - String orgPrefix = prefix; - prefix += " "; - for (Tag tag : tags.values()) { - tag.print(prefix, out); - } - out.println(orgPrefix + '}'); - } - - public boolean isEmpty() { - return tags.isEmpty(); - } - - public CompoundTag copy() { - CompoundTag tag = new CompoundTag(getName()); - for (Entry entry : tags.entrySet()) { - tag.put(entry.getKey(), entry.getValue().copy()); - } - return tag; - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - CompoundTag o = (CompoundTag) obj; - return tags.entrySet().equals(o.tags.entrySet()); - } - return false; - } - - /** - * Check existence of NBT tag - * - * @param name - NBT tag Id. - * @return - true, if tag exists - */ - public boolean exist(String name) { - return tags.containsKey(name); - } - - @Override - public CompoundTag clone() { - CompoundTag nbt = new CompoundTag(); - this.getTags().forEach((key, value) -> nbt.put(key, value.copy())); - return nbt; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/nbt/tag/DoubleTag.java b/src/main/java/cn/nukkit/nbt/tag/DoubleTag.java deleted file mode 100644 index 84d2947b5..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/DoubleTag.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; - -public class DoubleTag extends NumberTag { - - public double data; - - @Override - public Double getData() { - return data; - } - - @Override - public void setData(Double data) { - this.data = data == null ? 0 : data; - } - - public DoubleTag(String name) { - super(name); - } - - public DoubleTag(String name, double data) { - super(name); - this.data = data; - } - - @Override - void write(NBTOutputStream dos) throws IOException { - dos.writeDouble(data); - } - - @Override - void load(NBTInputStream dis) throws IOException { - data = dis.readDouble(); - } - - @Override - public Double parseValue() { - return this.data; - } - - @Override - public byte getId() { - return TAG_Double; - } - - @Override - public String toString() { - return "DoubleTag " + this.getName() + " (data: " + data + ')'; - } - - @Override - public Tag copy() { - return new DoubleTag(getName(), data); - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - DoubleTag o = (DoubleTag) obj; - return data == o.data; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/EndTag.java b/src/main/java/cn/nukkit/nbt/tag/EndTag.java deleted file mode 100644 index 8f4851a2d..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/EndTag.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; - -public class EndTag extends Tag { - - public EndTag() { - super(null); - } - - @Override - void load(NBTInputStream dis) throws IOException { - } - - @Override - void write(NBTOutputStream dos) throws IOException { - } - - @Override - public byte getId() { - return TAG_End; - } - - @Override - public String toString() { - return "EndTag"; - } - - @Override - public Tag copy() { - return new EndTag(); - } - - @Override - public Object parseValue() { - return null; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/FloatTag.java b/src/main/java/cn/nukkit/nbt/tag/FloatTag.java deleted file mode 100644 index 2bfce9e6c..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/FloatTag.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; - -public class FloatTag extends NumberTag { - - public float data; - - @Override - public Float getData() { - return data; - } - - @Override - public void setData(Float data) { - this.data = data == null ? 0 : data; - } - - public FloatTag(String name) { - super(name); - } - - public FloatTag(String name, float data) { - super(name); - this.data = data; - } - - @Override - void write(NBTOutputStream dos) throws IOException { - dos.writeFloat(data); - } - - @Override - void load(NBTInputStream dis) throws IOException { - data = dis.readFloat(); - } - - @Override - public Float parseValue() { - return this.data; - } - - @Override - public byte getId() { - return TAG_Float; - } - - @Override - public String toString() { - return "FloatTag " + this.getName() + " (data: " + data + ')'; - } - - @Override - public Tag copy() { - return new FloatTag(getName(), data); - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - FloatTag o = (FloatTag) obj; - return data == o.data; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/IntArrayTag.java b/src/main/java/cn/nukkit/nbt/tag/IntArrayTag.java deleted file mode 100644 index 00e27313d..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/IntArrayTag.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; -import java.util.Arrays; - -public class IntArrayTag extends Tag { - - public int[] data; - - public IntArrayTag(String name) { - super(name); - } - - public IntArrayTag(String name, int[] data) { - super(name); - this.data = data; - } - - @Override - void write(NBTOutputStream dos) throws IOException { - dos.writeInt(data.length); - for (int aData : data) { - dos.writeInt(aData); - } - } - - @Override - void load(NBTInputStream dis) throws IOException { - int length = dis.readInt(); - data = new int[length]; - for (int i = 0; i < length; i++) { - data[i] = dis.readInt(); - } - } - - public int[] getData() { - return data; - } - - @Override - public int[] parseValue() { - return this.data; - } - - @Override - public byte getId() { - return TAG_Int_Array; - } - - @Override - public String toString() { - return "IntArrayTag " + this.getName() + " [" + data.length + " bytes]"; - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - IntArrayTag intArrayTag = (IntArrayTag) obj; - return ((data == null && intArrayTag.data == null) || (data != null && Arrays.equals(data, intArrayTag.data))); - } - return false; - } - - @Override - public Tag copy() { - int[] cp = new int[data.length]; - System.arraycopy(data, 0, cp, 0, data.length); - return new IntArrayTag(getName(), cp); - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/IntTag.java b/src/main/java/cn/nukkit/nbt/tag/IntTag.java deleted file mode 100644 index fb35eb12d..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/IntTag.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; - -public class IntTag extends NumberTag { - - public int data; - - @Override - public Integer getData() { - return data; - } - - @Override - public void setData(Integer data) { - this.data = data == null ? 0 : data; - } - - public IntTag(String name) { - super(name); - } - - public IntTag(String name, int data) { - super(name); - this.data = data; - } - - @Override - void write(NBTOutputStream dos) throws IOException { - dos.writeInt(data); - } - - @Override - void load(NBTInputStream dis) throws IOException { - data = dis.readInt(); - } - - @Override - public Integer parseValue() { - return this.data; - } - - @Override - public byte getId() { - return TAG_Int; - } - - @Override - public String toString() { - return "IntTag " + this.getName() + "(data: " + data + ')'; - } - - @Override - public Tag copy() { - return new IntTag(getName(), data); - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - IntTag o = (IntTag) obj; - return data == o.data; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/ListTag.java b/src/main/java/cn/nukkit/nbt/tag/ListTag.java deleted file mode 100644 index 25b4b9291..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/ListTag.java +++ /dev/null @@ -1,155 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.StringJoiner; - -public class ListTag extends Tag { - - private List list = new ArrayList<>(); - - public byte type; - - public ListTag() { - super(""); - } - - public ListTag(String name) { - super(name); - } - - @Override - void write(NBTOutputStream dos) throws IOException { - if (!list.isEmpty()) type = list.get(0).getId(); - else type = 1; - - dos.writeByte(type); - dos.writeInt(list.size()); - for (T aList : list) aList.write(dos); - } - - @Override - @SuppressWarnings("unchecked") - void load(NBTInputStream dis) throws IOException { - type = dis.readByte(); - int size = dis.readInt(); - - list = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - Tag tag = Tag.newTag(type, null); - tag.load(dis); - tag.setName(""); - list.add((T) tag); - } - } - - @Override - public byte getId() { - return TAG_List; - } - - @Override - public String toString() { - StringJoiner joiner = new StringJoiner(",\n\t"); - list.forEach(tag -> joiner.add(tag.toString().replace("\n", "\n\t"))); - return "ListTag '" + this.getName() + "' (" + list.size() + " entries of type " + Tag.getTagName(type) + ") {\n\t" + joiner.toString() + "\n}"; - } - - public void print(String prefix, PrintStream out) { - super.print(prefix, out); - - out.println(prefix + '{'); - String orgPrefix = prefix; - prefix += " "; - for (T aList : list) aList.print(prefix, out); - out.println(orgPrefix + '}'); - } - - public ListTag add(T tag) { - type = tag.getId(); - tag.setName(""); - list.add(tag); - return this; - } - - public ListTag add(int index, T tag) { - type = tag.getId(); - tag.setName(""); - - if (index >= list.size()) { - list.add(index, tag); - } else { - list.set(index, tag); - } - return this; - } - - @Override - public List parseValue() { - List value = new ArrayList<>(this.list.size()); - - for (T t : this.list) { - value.add(t.parseValue()); - } - - return value; - } - - public T get(int index) { - return list.get(index); - } - - public List getAll() { - return new ArrayList<>(list); - } - - public void setAll(List tags) { - this.list = new ArrayList<>(tags); - } - - public void remove(T tag) { - list.remove(tag); - } - - public void remove(int index) { - list.remove(index); - } - - public void removeAll(Collection tags) { - list.remove(tags); - } - - public int size() { - return list.size(); - } - - @Override - public Tag copy() { - ListTag res = new ListTag<>(getName()); - res.type = type; - for (T t : list) { - @SuppressWarnings("unchecked") - T copy = (T) t.copy(); - res.list.add(copy); - } - return res; - } - - @SuppressWarnings("rawtypes") - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - ListTag o = (ListTag) obj; - if (type == o.type) { - return list.equals(o.list); - } - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/LongTag.java b/src/main/java/cn/nukkit/nbt/tag/LongTag.java deleted file mode 100644 index 6a5d5411f..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/LongTag.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; - -public class LongTag extends NumberTag { - - public long data; - - @Override - public Long getData() { - return data; - } - - @Override - public void setData(Long data) { - this.data = data == null ? 0 : data; - } - - public LongTag(String name) { - super(name); - } - - public LongTag(String name, long data) { - super(name); - this.data = data; - } - - @Override - void write(NBTOutputStream dos) throws IOException { - dos.writeLong(data); - } - - @Override - void load(NBTInputStream dis) throws IOException { - data = dis.readLong(); - } - - @Override - public Long parseValue() { - return this.data; - } - - @Override - public byte getId() { - return TAG_Long; - } - - @Override - public String toString() { - return "LongTag " + this.getName() + " (data:" + data + ')'; - } - - @Override - public Tag copy() { - return new LongTag(getName(), data); - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - LongTag o = (LongTag) obj; - return data == o.data; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/NumberTag.java b/src/main/java/cn/nukkit/nbt/tag/NumberTag.java deleted file mode 100644 index 6e91d2aea..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/NumberTag.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.nbt.tag; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class NumberTag extends Tag { - - protected NumberTag(String name) { - super(name); - } - - public abstract T getData(); - - public abstract void setData(T data); -} diff --git a/src/main/java/cn/nukkit/nbt/tag/ShortTag.java b/src/main/java/cn/nukkit/nbt/tag/ShortTag.java deleted file mode 100644 index a82686971..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/ShortTag.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; - -public class ShortTag extends NumberTag { - - public int data; - - @Override - public Integer getData() { - return data; - } - - @Override - public void setData(Integer data) { - this.data = data == null ? 0 : data; - } - - public ShortTag(String name) { - super(name); - } - - public ShortTag(String name, int data) { - super(name); - this.data = data; - } - - @Override - void write(NBTOutputStream dos) throws IOException { - dos.writeShort(data); - } - - @Override - void load(NBTInputStream dis) throws IOException { - data = dis.readShort(); - } - - @Override - public Integer parseValue() { - return this.data; - } - - @Override - public byte getId() { - return TAG_Short; - } - - @Override - public String toString() { - return "ShortTag " + this.getName() + "(data: " + data + ')'; - } - - @Override - public Tag copy() { - return new ShortTag(getName(), data); - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - ShortTag o = (ShortTag) obj; - return data == o.data; - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/StringTag.java b/src/main/java/cn/nukkit/nbt/tag/StringTag.java deleted file mode 100644 index d4e80f886..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/StringTag.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; - -public class StringTag extends Tag { - - public String data; - - public StringTag(String name) { - super(name); - } - - public StringTag(String name, String data) { - super(name); - this.data = data; - if (data == null) throw new IllegalArgumentException("Empty string not allowed"); - } - - @Override - void write(NBTOutputStream dos) throws IOException { - dos.writeUTF(data); - } - - @Override - void load(NBTInputStream dis) throws IOException { - data = dis.readUTF(); - } - - @Override - public String parseValue() { - return this.data; - } - - @Override - public byte getId() { - return TAG_String; - } - - @Override - public String toString() { - return "StringTag " + this.getName() + " (data: " + data + ')'; - } - - @Override - public Tag copy() { - return new StringTag(getName(), data); - } - - @Override - public boolean equals(Object obj) { - if (super.equals(obj)) { - StringTag o = (StringTag) obj; - return ((data == null && o.data == null) || (data != null && data.equals(o.data))); - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/nbt/tag/Tag.java b/src/main/java/cn/nukkit/nbt/tag/Tag.java deleted file mode 100644 index 15662823e..000000000 --- a/src/main/java/cn/nukkit/nbt/tag/Tag.java +++ /dev/null @@ -1,168 +0,0 @@ -package cn.nukkit.nbt.tag; - -import cn.nukkit.nbt.stream.NBTInputStream; -import cn.nukkit.nbt.stream.NBTOutputStream; - -import java.io.IOException; -import java.io.PrintStream; - -public abstract class Tag { - - public static final byte TAG_End = 0; - public static final byte TAG_Byte = 1; - public static final byte TAG_Short = 2; - public static final byte TAG_Int = 3; - public static final byte TAG_Long = 4; - public static final byte TAG_Float = 5; - public static final byte TAG_Double = 6; - public static final byte TAG_Byte_Array = 7; - public static final byte TAG_String = 8; - public static final byte TAG_List = 9; - public static final byte TAG_Compound = 10; - public static final byte TAG_Int_Array = 11; - - private String name; - - abstract void write(NBTOutputStream dos) throws IOException; - - abstract void load(NBTInputStream dis) throws IOException; - - public abstract String toString(); - - public abstract byte getId(); - - protected Tag(String name) { - if (name == null) { - this.name = ""; - } else { - this.name = name; - } - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Tag)) { - return false; - } - Tag o = (Tag) obj; - return getId() == o.getId() && !(name == null && o.name != null || name != null && o.name == null) && !(name != null && !name.equals(o.name)); - } - - public void print(PrintStream out) { - print("", out); - } - - public void print(String prefix, PrintStream out) { - String name = getName(); - - out.print(prefix); - out.print(getTagName(getId())); - if (!name.isEmpty()) { - out.print("(\"" + name + "\")"); - } - out.print(": "); - out.println(toString()); - } - - public Tag setName(String name) { - if (name == null) { - this.name = ""; - } else { - this.name = name; - } - return this; - } - - public String getName() { - if (name == null) return ""; - return name; - } - - public static Tag readNamedTag(NBTInputStream dis) throws IOException { - byte type = dis.readByte(); - if (type == 0) return new EndTag(); - - String name = dis.readUTF(); - - Tag tag = newTag(type, name); - - tag.load(dis); - return tag; - } - - public static void writeNamedTag(Tag tag, NBTOutputStream dos) throws IOException { - writeNamedTag(tag, tag.getName(), dos); - } - - public static void writeNamedTag(Tag tag, String name, NBTOutputStream dos) throws IOException { - dos.writeByte(tag.getId()); - if (tag.getId() == Tag.TAG_End) return; - dos.writeUTF(name); - - tag.write(dos); - } - - public static Tag newTag(byte type, String name) { - switch (type) { - case TAG_End: - return new EndTag(); - case TAG_Byte: - return new ByteTag(name); - case TAG_Short: - return new ShortTag(name); - case TAG_Int: - return new IntTag(name); - case TAG_Long: - return new LongTag(name); - case TAG_Float: - return new FloatTag(name); - case TAG_Double: - return new DoubleTag(name); - case TAG_Byte_Array: - return new ByteArrayTag(name); - case TAG_Int_Array: - return new IntArrayTag(name); - case TAG_String: - return new StringTag(name); - case TAG_List: - return new ListTag<>(name); - case TAG_Compound: - return new CompoundTag(name); - } - return new EndTag(); - } - - public static String getTagName(byte type) { - switch (type) { - case TAG_End: - return "TAG_End"; - case TAG_Byte: - return "TAG_Byte"; - case TAG_Short: - return "TAG_Short"; - case TAG_Int: - return "TAG_Int"; - case TAG_Long: - return "TAG_Long"; - case TAG_Float: - return "TAG_Float"; - case TAG_Double: - return "TAG_Double"; - case TAG_Byte_Array: - return "TAG_Byte_Array"; - case TAG_Int_Array: - return "TAG_Int_Array"; - case TAG_String: - return "TAG_String"; - case TAG_List: - return "TAG_List"; - case TAG_Compound: - return "TAG_Compound"; - } - return "UNKNOWN"; - } - - public abstract Tag copy(); - - public abstract Object parseValue(); -} diff --git a/src/main/java/cn/nukkit/network/AdvancedSourceInterface.java b/src/main/java/cn/nukkit/network/AdvancedSourceInterface.java deleted file mode 100644 index 240c2ea3d..000000000 --- a/src/main/java/cn/nukkit/network/AdvancedSourceInterface.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.network; - -import io.netty.buffer.ByteBuf; - -import java.net.InetAddress; -import java.net.InetSocketAddress; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface AdvancedSourceInterface extends SourceInterface { - - void blockAddress(InetAddress address); - - void blockAddress(InetAddress address, int timeout); - - void unblockAddress(InetAddress address); - - void setNetwork(Network network); - - void sendRawPacket(InetSocketAddress socketAddress, ByteBuf payload); -} diff --git a/src/main/java/cn/nukkit/network/BatchingHelper.java b/src/main/java/cn/nukkit/network/BatchingHelper.java deleted file mode 100644 index 838265b62..000000000 --- a/src/main/java/cn/nukkit/network/BatchingHelper.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.nukkit.network; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.network.protocol.BatchPacket; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.Binary; -import cn.nukkit.utils.BinaryStream; -import cn.nukkit.utils.Zlib; -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import it.unimi.dsi.fastutil.ints.Int2IntMap; -import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import it.unimi.dsi.fastutil.objects.ObjectList; - -import java.util.concurrent.*; - -public class BatchingHelper { - - private final ExecutorService threadedExecutor; - - public BatchingHelper() { - ThreadFactoryBuilder builder = new ThreadFactoryBuilder(); - builder.setNameFormat("Batching Executor"); - this.threadedExecutor = Executors.newSingleThreadExecutor(builder.build()); - } - - public void batchPackets(Player[] players, DataPacket[] packets) { - if (players.length > 0 && packets.length > 0) { - this.threadedExecutor.execute(() -> this.batchAndSendPackets(players, packets)); - } - } - - private void batchAndSendPackets(Player[] players, DataPacket[] packets) { - Int2ObjectMap> targets = new Int2ObjectOpenHashMap<>(); - for (Player player : players) { - targets.computeIfAbsent(player.protocol, i -> new ObjectArrayList<>()).add(player); - } - - // Encoded packets by encoding protocol - Int2ObjectMap> encodedPackets = new Int2ObjectOpenHashMap<>(); - - for (DataPacket packet : packets) { - Int2IntMap encodingProtocols = new Int2IntOpenHashMap(); - for (int protocolId : targets.keySet()) { - // TODO: encode only by encoding protocols - // No need to have all versions here - encodingProtocols.put(protocolId, protocolId); - } - - Int2ObjectMap encodedPacket = new Int2ObjectOpenHashMap<>(); - for (int encodingProtocol : encodingProtocols.values()) { - if (!encodedPacket.containsKey(encodingProtocol)) { - DataPacket pk = packet.clone(); - pk.protocol = encodingProtocol; - pk.tryEncode(); - encodedPacket.put(encodingProtocol, pk); - } - } - - for (int protocolId : encodingProtocols.values()) { - int encodingProtocol = encodingProtocols.get(protocolId); - encodedPackets.computeIfAbsent(protocolId, i -> new ObjectArrayList<>()).add(encodedPacket.get(encodingProtocol)); - } - } - - for (int protocolId : targets.keySet()) { - ObjectList packetList = encodedPackets.get(protocolId); - ObjectList finalTargets = targets.get(protocolId); - - BinaryStream batched = new BinaryStream(); - for (DataPacket packet : packetList) { - if (packet instanceof BatchPacket) { - throw new RuntimeException("Cannot batch BatchPacket"); - } - packet.tryEncode(); - byte[] buf = packet.getBuffer(); - batched.putUnsignedVarInt(buf.length); - batched.put(buf); - } - - try { - byte[] bytes = Binary.appendBytes(batched.getBuffer()); - BatchPacket pk = new BatchPacket(); - if (protocolId >= ProtocolInfo.v1_16_0) { - pk.payload = Zlib.deflateRaw(bytes, Server.getInstance().networkCompressionLevel); - } else { - pk.payload = Zlib.deflate(bytes, Server.getInstance().networkCompressionLevel); - } - for (Player pl : finalTargets) { - pl.directDataPacket(pk); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - public void shutdown() { - this.threadedExecutor.shutdownNow(); - } -} diff --git a/src/main/java/cn/nukkit/network/LittleEndianByteBufInputStream.java b/src/main/java/cn/nukkit/network/LittleEndianByteBufInputStream.java deleted file mode 100644 index f2194b676..000000000 --- a/src/main/java/cn/nukkit/network/LittleEndianByteBufInputStream.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.network; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufInputStream; - -import java.io.IOException; - -public class LittleEndianByteBufInputStream extends ByteBufInputStream { - - private final ByteBuf buffer; - - public LittleEndianByteBufInputStream(ByteBuf buffer) { - super(buffer); - this.buffer = buffer; - } - - @Override - public char readChar() throws IOException { - return Character.reverseBytes(buffer.readChar()); - } - - @Override - public double readDouble() throws IOException { - return buffer.readDoubleLE(); - } - - @Override - public float readFloat() throws IOException { - return buffer.readFloatLE(); - } - - @Override - public short readShort() throws IOException { - return buffer.readShortLE(); - } - - @Override - public int readUnsignedShort() throws IOException { - return buffer.readUnsignedShortLE(); - } - - @Override - public long readLong() throws IOException { - return buffer.readLongLE(); - } - - @Override - public int readInt() throws IOException { - return buffer.readIntLE(); - } -} diff --git a/src/main/java/cn/nukkit/network/LittleEndianByteBufOutputStream.java b/src/main/java/cn/nukkit/network/LittleEndianByteBufOutputStream.java deleted file mode 100644 index 0e4c65d66..000000000 --- a/src/main/java/cn/nukkit/network/LittleEndianByteBufOutputStream.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.network; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufOutputStream; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -public class LittleEndianByteBufOutputStream extends ByteBufOutputStream { - - private final ByteBuf buffer; - - public LittleEndianByteBufOutputStream(ByteBuf buffer) { - super(buffer); - this.buffer = buffer; - } - - @Override - public void writeChar(int v) throws IOException { - this.buffer.writeChar(Character.reverseBytes((char) v)); - } - - @Override - public void writeDouble(double v) throws IOException { - this.buffer.writeDoubleLE(v); - } - - @Override - public void writeFloat(float v) throws IOException { - this.buffer.writeFloatLE(v); - } - - @Override - public void writeShort(int val) throws IOException { - this.buffer.writeShortLE(val); - } - - @Override - public void writeLong(long val) throws IOException { - this.buffer.writeLongLE(val); - } - - @Override - public void writeInt(int val) throws IOException { - this.buffer.writeIntLE(val); - } - - @Override - public void writeUTF(String string) throws IOException { - byte[] bytes = string.getBytes(StandardCharsets.UTF_8); - this.writeShort(bytes.length); - this.write(bytes); - } -} diff --git a/src/main/java/cn/nukkit/network/Network.java b/src/main/java/cn/nukkit/network/Network.java deleted file mode 100644 index d67e23a12..000000000 --- a/src/main/java/cn/nukkit/network/Network.java +++ /dev/null @@ -1,382 +0,0 @@ -package cn.nukkit.network; - -import cn.nukkit.Nukkit; -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.network.protocol.*; -import cn.nukkit.utils.BinaryStream; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.VarInt; -import cn.nukkit.utils.Zlib; -import io.netty.buffer.ByteBuf; -import lombok.extern.log4j.Log4j2; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@Log4j2 -@SuppressWarnings("unchecked") -public class Network { - - public static final byte CHANNEL_NONE = 0; - public static final byte CHANNEL_PRIORITY = 1; //Priority channel, only to be used when it matters - public static final byte CHANNEL_WORLD_CHUNKS = 2; //Chunk sending - public static final byte CHANNEL_MOVEMENT = 3; //Movement sending - public static final byte CHANNEL_BLOCKS = 4; //Block updates or explosions - public static final byte CHANNEL_WORLD_EVENTS = 5; //Entity, level or blockentity entity events - public static final byte CHANNEL_ENTITY_SPAWNING = 6; //Entity spawn/despawn channel - public static final byte CHANNEL_TEXT = 7; //Chat and other text stuff - public static final byte CHANNEL_END = 31; - - private Class[] packetPool = new Class[256]; - - private final Server server; - - private final Set interfaces = new HashSet<>(); - - private final Set advancedInterfaces = new HashSet<>(); - - private double upload = 0; - private double download = 0; - - private String name; - private String subName; - - public Network(Server server) { - this.registerPackets(); - this.server = server; - } - - public void addStatistics(double upload, double download) { - this.upload += upload; - this.download += download; - } - - public double getUpload() { - return upload; - } - - public double getDownload() { - return download; - } - - public void resetStatistics() { - this.upload = 0; - this.download = 0; - } - - public Set getInterfaces() { - return interfaces; - } - - public void processInterfaces() { - for (SourceInterface interfaz : this.interfaces) { - try { - interfaz.process(); - } catch (Exception e) { - if (Nukkit.DEBUG > 1) { - this.server.getLogger().logException(e); - } - - interfaz.emergencyShutdown(); - this.unregisterInterface(interfaz); - log.fatal(this.server.getLanguage().translateString("nukkit.server.networkError", new String[]{interfaz.getClass().getName(), Utils.getExceptionMessage(e)})); - } - } - } - - public void registerInterface(SourceInterface interfaz) { - this.interfaces.add(interfaz); - if (interfaz instanceof AdvancedSourceInterface) { - this.advancedInterfaces.add((AdvancedSourceInterface) interfaz); - ((AdvancedSourceInterface) interfaz).setNetwork(this); - } - interfaz.setName(this.name + "!@#" + this.subName); - } - - public void unregisterInterface(SourceInterface sourceInterface) { - this.interfaces.remove(sourceInterface); - if (sourceInterface instanceof AdvancedSourceInterface) { - this.advancedInterfaces.remove(sourceInterface); - } - } - - public void setName(String name) { - this.name = name; - this.updateName(); - } - - public String getName() { - return name; - } - - public String getSubName() { - return subName; - } - - public void setSubName(String subName) { - this.subName = subName; - } - - public void updateName() { - for (SourceInterface interfaz : this.interfaces) { - interfaz.setName(this.name + "!@#" + this.subName); - } - } - - public void registerPacket(byte id, Class clazz) { - this.packetPool[id & 0xff] = clazz; - } - - public Server getServer() { - return server; - } - - public void processBatch(BatchPacket packet, Player player) { - byte[] data; - try { - if (player.raknetProtocol >= 10) { - data = Zlib.inflateRaw(packet.payload, 2097152); // 2 * 1024 * 1024 - } else { - data = Zlib.inflate(packet.payload, 2097152); - } - } catch (Exception e) { - return; - } - - int len = data.length; - BinaryStream stream = new BinaryStream(data); - try { - List packets = new ArrayList<>(); - int count = 0; - while (stream.offset < len) { - count++; - if (count > 780) { - player.close("", "Illegal Batch Packet"); - return; - } - byte[] buf = stream.getByteArray(); - - DataPacket pk = this.getPacketFromBuffer(player.protocol, buf); - - if (pk != null) { - pk.protocol = player.protocol; - - if (player.raknetProtocol > 8) { - pk.decode(); - } else { // version < 1.6 - pk.setBuffer(buf, 3); - pk.decode(); - } - - packets.add(pk); - } - } - - processPackets(player, packets); - - } catch (Exception e) { - if (Nukkit.DEBUG > 1) { - log.debug("Error whilst decoding batch packet", e); - } - } - } - - /** - * Process packets obtained from batch packets - * Required to perform additional analyses and filter unnecessary packets - * - * @param packets packets - */ - public void processPackets(Player player, List packets) { - if (packets.isEmpty()) return; - packets.forEach(player::handleDataPacket); - } - - private DataPacket getPacketFromBuffer(int protocol, byte[] buffer) throws IOException { - ByteArrayInputStream stream = new ByteArrayInputStream(buffer); - DataPacket pk = this.getPacket((byte) VarInt.readUnsignedVarInt(stream)); - if (pk != null) { - if (protocol >= 388) { - pk.setBuffer(buffer, buffer.length - stream.available()); - } else { - pk.setBuffer(buffer, protocol <= 274 ? 3 : 1); - } - } - return pk; - } - - public DataPacket getPacket(byte id) { - Class clazz = this.packetPool[id & 0xff]; - if (clazz != null) { - try { - return clazz.newInstance(); - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - } - return null; - } - - public DataPacket getPacket(int id) { - Class clazz = this.packetPool[id]; - if (clazz != null) { - try { - return clazz.newInstance(); - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - } - return null; - } - - public void sendPacket(InetSocketAddress socketAddress, ByteBuf payload) { - for (AdvancedSourceInterface sourceInterface : this.advancedInterfaces) { - sourceInterface.sendRawPacket(socketAddress, payload); - } - } - - public void blockAddress(InetAddress address) { - for (AdvancedSourceInterface sourceInterface : this.advancedInterfaces) { - sourceInterface.blockAddress(address); - } - } - - public void blockAddress(InetAddress address, int timeout) { - for (AdvancedSourceInterface sourceInterface : this.advancedInterfaces) { - sourceInterface.blockAddress(address, timeout); - } - } - - public void unblockAddress(InetAddress address) { - for (AdvancedSourceInterface sourceInterface : this.advancedInterfaces) { - sourceInterface.unblockAddress(address); - } - } - - private void registerPackets() { - this.packetPool = new Class[256]; - - this.registerPacket(ProtocolInfo.ADD_ENTITY_PACKET, AddEntityPacket.class); - this.registerPacket(ProtocolInfo.ADD_ITEM_ENTITY_PACKET, AddItemEntityPacket.class); - this.registerPacket(ProtocolInfo.ADD_PAINTING_PACKET, AddPaintingPacket.class); - this.registerPacket(ProtocolInfo.ADD_PLAYER_PACKET, AddPlayerPacket.class); - this.registerPacket(ProtocolInfo.ADVENTURE_SETTINGS_PACKET, AdventureSettingsPacket.class); - this.registerPacket(ProtocolInfo.ANIMATE_PACKET, AnimatePacket.class); - this.registerPacket(ProtocolInfo.ANVIL_DAMAGE_PACKET, AnvilDamagePacket.class); - this.registerPacket(ProtocolInfo.AVAILABLE_COMMANDS_PACKET, AvailableCommandsPacket.class); - this.registerPacket(ProtocolInfo.BATCH_PACKET, BatchPacket.class); - this.registerPacket(ProtocolInfo.BLOCK_ENTITY_DATA_PACKET, BlockEntityDataPacket.class); - this.registerPacket(ProtocolInfo.BLOCK_EVENT_PACKET, BlockEventPacket.class); - this.registerPacket(ProtocolInfo.BLOCK_PICK_REQUEST_PACKET, BlockPickRequestPacket.class); - this.registerPacket(ProtocolInfo.BOOK_EDIT_PACKET, BookEditPacket.class); - this.registerPacket(ProtocolInfo.BOSS_EVENT_PACKET, BossEventPacket.class); - this.registerPacket(ProtocolInfo.CHANGE_DIMENSION_PACKET, ChangeDimensionPacket.class); - this.registerPacket(ProtocolInfo.CHUNK_RADIUS_UPDATED_PACKET, ChunkRadiusUpdatedPacket.class); - this.registerPacket(ProtocolInfo.CLIENTBOUND_MAP_ITEM_DATA_PACKET, ClientboundMapItemDataPacket.class); - this.registerPacket(ProtocolInfo.COMMAND_REQUEST_PACKET, CommandRequestPacket.class); - this.registerPacket(ProtocolInfo.CONTAINER_CLOSE_PACKET, ContainerClosePacket.class); - this.registerPacket(ProtocolInfo.CONTAINER_OPEN_PACKET, ContainerOpenPacket.class); - this.registerPacket(ProtocolInfo.CONTAINER_SET_DATA_PACKET, ContainerSetDataPacket.class); - this.registerPacket(ProtocolInfo.CRAFTING_DATA_PACKET, CraftingDataPacket.class); - this.registerPacket(ProtocolInfo.CRAFTING_EVENT_PACKET, CraftingEventPacket.class); - this.registerPacket(ProtocolInfo.DISCONNECT_PACKET, DisconnectPacket.class); - this.registerPacket(ProtocolInfo.ENTITY_EVENT_PACKET, EntityEventPacket.class); - this.registerPacket(ProtocolInfo.ENTITY_FALL_PACKET, EntityFallPacket.class); - this.registerPacket(ProtocolInfo.FULL_CHUNK_DATA_PACKET, LevelChunkPacket.class); - this.registerPacket(ProtocolInfo.GAME_RULES_CHANGED_PACKET, GameRulesChangedPacket.class); - this.registerPacket(ProtocolInfo.HURT_ARMOR_PACKET, HurtArmorPacket.class); - this.registerPacket(ProtocolInfo.INTERACT_PACKET, InteractPacket.class); - this.registerPacket(ProtocolInfo.INVENTORY_CONTENT_PACKET, InventoryContentPacket.class); - this.registerPacket(ProtocolInfo.INVENTORY_SLOT_PACKET, InventorySlotPacket.class); - this.registerPacket(ProtocolInfo.INVENTORY_TRANSACTION_PACKET, InventoryTransactionPacket.class); - this.registerPacket(ProtocolInfo.ITEM_FRAME_DROP_ITEM_PACKET, ItemFrameDropItemPacket.class); - this.registerPacket(ProtocolInfo.LEVEL_EVENT_PACKET, LevelEventPacket.class); - this.registerPacket(ProtocolInfo.LEVEL_SOUND_EVENT_PACKET_V1, LevelSoundEventPacketV1.class); - this.registerPacket(ProtocolInfo.LOGIN_PACKET, LoginPacket.class); - this.registerPacket(ProtocolInfo.MAP_INFO_REQUEST_PACKET, MapInfoRequestPacket.class); - this.registerPacket(ProtocolInfo.MOB_ARMOR_EQUIPMENT_PACKET, MobArmorEquipmentPacket.class); - this.registerPacket(ProtocolInfo.MOB_EQUIPMENT_PACKET, MobEquipmentPacket.class); - this.registerPacket(ProtocolInfo.MODAL_FORM_REQUEST_PACKET, ModalFormRequestPacket.class); - this.registerPacket(ProtocolInfo.MODAL_FORM_RESPONSE_PACKET, ModalFormResponsePacket.class); - this.registerPacket(ProtocolInfo.MOVE_ENTITY_ABSOLUTE_PACKET, MoveEntityAbsolutePacket.class); - this.registerPacket(ProtocolInfo.MOVE_PLAYER_PACKET, MovePlayerPacket.class); - this.registerPacket(ProtocolInfo.PLAYER_ACTION_PACKET, PlayerActionPacket.class); - this.registerPacket(ProtocolInfo.PLAYER_INPUT_PACKET, PlayerInputPacket.class); - this.registerPacket(ProtocolInfo.PLAYER_LIST_PACKET, PlayerListPacket.class); - this.registerPacket(ProtocolInfo.PLAYER_HOTBAR_PACKET, PlayerHotbarPacket.class); - this.registerPacket(ProtocolInfo.PLAY_SOUND_PACKET, PlaySoundPacket.class); - this.registerPacket(ProtocolInfo.PLAY_STATUS_PACKET, PlayStatusPacket.class); - this.registerPacket(ProtocolInfo.REMOVE_ENTITY_PACKET, RemoveEntityPacket.class); - this.registerPacket(ProtocolInfo.REQUEST_CHUNK_RADIUS_PACKET, RequestChunkRadiusPacket.class); - this.registerPacket(ProtocolInfo.RESOURCE_PACKS_INFO_PACKET, ResourcePacksInfoPacket.class); - this.registerPacket(ProtocolInfo.RESOURCE_PACK_STACK_PACKET, ResourcePackStackPacket.class); - this.registerPacket(ProtocolInfo.RESOURCE_PACK_CLIENT_RESPONSE_PACKET, ResourcePackClientResponsePacket.class); - this.registerPacket(ProtocolInfo.RESOURCE_PACK_DATA_INFO_PACKET, ResourcePackDataInfoPacket.class); - this.registerPacket(ProtocolInfo.RESOURCE_PACK_CHUNK_DATA_PACKET, ResourcePackChunkDataPacket.class); - this.registerPacket(ProtocolInfo.RESOURCE_PACK_CHUNK_REQUEST_PACKET, ResourcePackChunkRequestPacket.class); - this.registerPacket(ProtocolInfo.PLAYER_SKIN_PACKET, PlayerSkinPacket.class); - this.registerPacket(ProtocolInfo.RESPAWN_PACKET, RespawnPacket.class); - this.registerPacket(ProtocolInfo.RIDER_JUMP_PACKET, RiderJumpPacket.class); - this.registerPacket(ProtocolInfo.SET_COMMANDS_ENABLED_PACKET, SetCommandsEnabledPacket.class); - this.registerPacket(ProtocolInfo.SET_DIFFICULTY_PACKET, SetDifficultyPacket.class); - this.registerPacket(ProtocolInfo.SET_ENTITY_DATA_PACKET, SetEntityDataPacket.class); - this.registerPacket(ProtocolInfo.SET_ENTITY_LINK_PACKET, SetEntityLinkPacket.class); - this.registerPacket(ProtocolInfo.SET_ENTITY_MOTION_PACKET, SetEntityMotionPacket.class); - this.registerPacket(ProtocolInfo.SET_HEALTH_PACKET, SetHealthPacket.class); - this.registerPacket(ProtocolInfo.SET_PLAYER_GAME_TYPE_PACKET, SetPlayerGameTypePacket.class); - this.registerPacket(ProtocolInfo.SET_SPAWN_POSITION_PACKET, SetSpawnPositionPacket.class); - this.registerPacket(ProtocolInfo.SET_TITLE_PACKET, SetTitlePacket.class); - this.registerPacket(ProtocolInfo.SET_TIME_PACKET, SetTimePacket.class); - this.registerPacket(ProtocolInfo.SERVER_SETTINGS_REQUEST_PACKET, ServerSettingsRequestPacket.class); - this.registerPacket(ProtocolInfo.SERVER_SETTINGS_RESPONSE_PACKET, ServerSettingsResponsePacket.class); - this.registerPacket(ProtocolInfo.SHOW_CREDITS_PACKET, ShowCreditsPacket.class); - this.registerPacket(ProtocolInfo.SPAWN_EXPERIENCE_ORB_PACKET, SpawnExperienceOrbPacket.class); - this.registerPacket(ProtocolInfo.START_GAME_PACKET, StartGamePacket.class); - this.registerPacket(ProtocolInfo.TAKE_ITEM_ENTITY_PACKET, TakeItemEntityPacket.class); - this.registerPacket(ProtocolInfo.TEXT_PACKET, TextPacket.class); - this.registerPacket(ProtocolInfo.TRANSFER_PACKET, TransferPacket.class); - this.registerPacket(ProtocolInfo.UPDATE_ATTRIBUTES_PACKET, UpdateAttributesPacket.class); - this.registerPacket(ProtocolInfo.UPDATE_BLOCK_PACKET, UpdateBlockPacket.class); - this.registerPacket(ProtocolInfo.UPDATE_TRADE_PACKET, UpdateTradePacket.class); - this.registerPacket(ProtocolInfo.MOVE_ENTITY_DELTA_PACKET, MoveEntityDeltaPacket.class); - this.registerPacket(ProtocolInfo.SET_LOCAL_PLAYER_AS_INITIALIZED_PACKET, SetLocalPlayerAsInitializedPacket.class); - this.registerPacket(ProtocolInfo.NETWORK_STACK_LATENCY_PACKET, NetworkStackLatencyPacket.class); - this.registerPacket(ProtocolInfo.UPDATE_SOFT_ENUM_PACKET, UpdateSoftEnumPacket.class); - this.registerPacket(ProtocolInfo.NETWORK_CHUNK_PUBLISHER_UPDATE_PACKET, NetworkChunkPublisherUpdatePacket.class); - this.registerPacket(ProtocolInfo.AVAILABLE_ENTITY_IDENTIFIERS_PACKET, AvailableEntityIdentifiersPacket.class); - this.registerPacket(ProtocolInfo.LEVEL_SOUND_EVENT_PACKET_V2, LevelSoundEventPacket.class); - this.registerPacket(ProtocolInfo.SCRIPT_CUSTOM_EVENT_PACKET, ScriptCustomEventPacket.class); - this.registerPacket(ProtocolInfo.SPAWN_PARTICLE_EFFECT_PACKET, SpawnParticleEffectPacket.class); - this.registerPacket(ProtocolInfo.BIOME_DEFINITION_LIST_PACKET, BiomeDefinitionListPacket.class); - this.registerPacket(ProtocolInfo.LEVEL_SOUND_EVENT_PACKET, LevelSoundEventPacket.class); - this.registerPacket(ProtocolInfo.LEVEL_EVENT_GENERIC_PACKET, LevelEventGenericPacket.class); - this.registerPacket(ProtocolInfo.LECTERN_UPDATE_PACKET, LecternUpdatePacket.class); - this.registerPacket(ProtocolInfo.VIDEO_STREAM_CONNECT_PACKET, VideoStreamConnectPacket.class); - this.registerPacket(ProtocolInfo.CLIENT_CACHE_STATUS_PACKET, ClientCacheStatusPacket.class); - this.registerPacket(ProtocolInfo.MAP_CREATE_LOCKED_COPY_PACKET, MapCreateLockedCopyPacket.class); - this.registerPacket(ProtocolInfo.ON_SCREEN_TEXTURE_ANIMATION_PACKET, OnScreenTextureAnimationPacket.class); - this.registerPacket(ProtocolInfo.COMPLETED_USING_ITEM_PACKET, CompletedUsingItemPacket.class); - this.registerPacket(ProtocolInfo.CODE_BUILDER_PACKET, CodeBuilderPacket.class); - this.registerPacket(ProtocolInfo.CREATIVE_CONTENT_PACKET, CreativeContentPacket.class); - this.registerPacket(ProtocolInfo.DEBUG_INFO_PACKET, DebugInfoPacket.class); - this.registerPacket(ProtocolInfo.EMOTE_LIST_PACKET, EmoteListPacket.class); - this.registerPacket(ProtocolInfo.PACKET_VIOLATION_WARNING_PACKET, PacketViolationWarningPacket.class); - this.registerPacket(ProtocolInfo.PLAYER_ARMOR_DAMAGE_PACKET, PlayerArmorDamagePacket.class); - this.registerPacket(ProtocolInfo.PLAYER_ENCHANT_OPTIONS_PACKET, PlayerEnchantOptionsPacket.class); - this.registerPacket(ProtocolInfo.UPDATE_PLAYER_GAME_TYPE_PACKET, UpdatePlayerGameTypePacket.class); - this.registerPacket(ProtocolInfo.EMOTE_PACKET, EmotePacket.class); - this.registerPacket(ProtocolInfo.ITEM_COMPONENT_PACKET, ItemComponentPacket.class); - this.registerPacket(ProtocolInfo.FILTER_TEXT_PACKET, FilterTextPacket.class); - } -} diff --git a/src/main/java/cn/nukkit/network/RakNetInterface.java b/src/main/java/cn/nukkit/network/RakNetInterface.java deleted file mode 100644 index 4b1055155..000000000 --- a/src/main/java/cn/nukkit/network/RakNetInterface.java +++ /dev/null @@ -1,273 +0,0 @@ -package cn.nukkit.network; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.event.player.PlayerCreationEvent; -import cn.nukkit.event.server.QueryRegenerateEvent; -import cn.nukkit.network.protocol.BatchPacket; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.utils.Utils; -import com.google.common.base.Strings; -import com.nukkitx.network.raknet.*; -import com.nukkitx.network.util.DisconnectReason; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.PooledByteBufAllocator; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.socket.DatagramPacket; -import io.netty.util.internal.PlatformDependent; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.apache.logging.log4j.message.FormattedMessage; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.concurrent.TimeUnit; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@Log4j2 -public class RakNetInterface implements RakNetServerListener, AdvancedSourceInterface { - - private final Server server; - - private Network network; - private final RakNetServer raknet; - private byte[] advertisement; - - private final Map sessions = new HashMap<>(); - private final Queue sessionCreationQueue = PlatformDependent.newMpscQueue(); - - public RakNetInterface(Server server) { - this.server = server; - this.raknet = new RakNetServer(new InetSocketAddress(Strings.isNullOrEmpty(this.server.getIp()) ? "0.0.0.0" : this.server.getIp(), this.server.getPort()), Runtime.getRuntime().availableProcessors()); - this.raknet.bind().join(); - this.raknet.setListener(this); - } - - @Override - public void setNetwork(Network network) { - this.network = network; - } - - @Override - public boolean process() { - NukkitRakNetSession session; - while ((session = this.sessionCreationQueue.poll()) != null) { - InetSocketAddress address = session.raknet.getAddress(); - PlayerCreationEvent ev = new PlayerCreationEvent(this, Player.class, Player.class, null, address); - this.server.getPluginManager().callEvent(ev); - Class clazz = ev.getPlayerClass(); - - try { - Constructor constructor = clazz.getConstructor(SourceInterface.class, Long.class, InetSocketAddress.class); - Player player = constructor.newInstance(this, ev.getClientId(), ev.getSocketAddress()); - player.raknetProtocol = session.raknet.getProtocolVersion(); - session.player = player; - this.server.addPlayer(address, player); - this.sessions.put(address, session); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { - Server.getInstance().getLogger().logException(e); - } - } - - Iterator iterator = this.sessions.values().iterator(); - while (iterator.hasNext()) { - NukkitRakNetSession nukkitSession = iterator.next(); - Player player = nukkitSession.player; - if (nukkitSession.disconnectReason != null) { - player.close(player.getLeaveMessage(), nukkitSession.disconnectReason, false); - iterator.remove(); - continue; - } - DataPacket packet; - while ((packet = nukkitSession.packets.poll()) != null) { - try { - nukkitSession.player.handleDataPacket(packet); - } catch (Exception e) { - log.error(new FormattedMessage("An error occurred whilst handling {} for {}", - new Object[]{packet.getClass().getSimpleName(), nukkitSession.player.getName()}, e)); - } - } - } - return true; - } - - @Override - public int getNetworkLatency(Player player) { - RakNetServerSession session = this.raknet.getSession(player.getSocketAddress()); - return session == null ? -1 : (int) session.getPing(); - } - - @Override - public void close(Player player) { - this.close(player, "unknown reason"); - } - - @Override - public void close(Player player, String reason) { - RakNetServerSession session = this.raknet.getSession(player.getSocketAddress()); - if (session != null) { - session.close(); - } - } - - @Override - public void shutdown() { - this.raknet.close(); - } - - @Override - public void emergencyShutdown() { - this.raknet.close(); - } - - @Override - public void blockAddress(InetAddress address) { - this.raknet.block(address); - } - - @Override - public void blockAddress(InetAddress address, int timeout) { - this.raknet.block(address, timeout, TimeUnit.SECONDS); - } - - @Override - public void unblockAddress(InetAddress address) { - this.raknet.unblock(address); - } - - @Override - public void sendRawPacket(InetSocketAddress socketAddress, ByteBuf payload) { - this.raknet.send(socketAddress, payload); - } - - @Override - public void setName(String name) { - QueryRegenerateEvent info = this.server.getQueryInformation(); - String[] names = name.split("!@#"); // Split double names within the program - String motd = Utils.rtrim(names[0].replace(";", "\\;"), '\\'); - String subMotd = names.length > 1 ? Utils.rtrim(names[1].replace(";", "\\;"), '\\') : ""; - StringJoiner joiner = new StringJoiner(";") - .add("MCPE") - .add(motd) - .add(Integer.toString(ProtocolInfo.CURRENT_PROTOCOL)) - .add(ProtocolInfo.MINECRAFT_VERSION_NETWORK) - .add(Integer.toString(info.getPlayerCount())) - .add(Integer.toString(info.getMaxPlayerCount())) - .add(Long.toString(this.raknet.getGuid())) - .add(subMotd) - .add(Server.getGamemodeString(this.server.getDefaultGamemode(), true)) - .add("1"); - - this.advertisement = joiner.toString().getBytes(StandardCharsets.UTF_8); - } - - @Override - public Integer putPacket(Player player, DataPacket packet) { - return this.putPacket(player, packet, false); - } - - @Override - public Integer putPacket(Player player, DataPacket packet, boolean needACK) { - return this.putPacket(player, packet, needACK, false); - } - - @Override - public Integer putPacket(Player player, DataPacket packet, boolean needACK, boolean immediate) { - RakNetServerSession session = this.raknet.getSession(player.getSocketAddress()); - if (session == null) { - return null; - } - - byte[] buffer; - if (packet.pid() == ProtocolInfo.BATCH_PACKET) { - buffer = ((BatchPacket) packet).payload; - if (buffer == null) { - return null; - } - } else { - this.server.batchPackets(new Player[]{player}, new DataPacket[]{packet}, true); - return null; - } - - ByteBuf byteBuf = PooledByteBufAllocator.DEFAULT.directBuffer(1 + buffer.length); - byteBuf.writeByte(0xfe); - byteBuf.writeBytes(buffer); - //byteBuf.readerIndex(0); - - session.send(byteBuf, immediate ? RakNetPriority.IMMEDIATE : RakNetPriority.MEDIUM, packet.reliability, packet.getChannel()); - return null; - } - - @Override - public boolean onConnectionRequest(InetSocketAddress inetSocketAddress) { - return true; - } - - @Override - public byte[] onQuery(InetSocketAddress inetSocketAddress) { - return this.advertisement; - } - - @Override - public void onSessionCreation(RakNetServerSession session) { - NukkitRakNetSession nukkitSession = new NukkitRakNetSession(session); - session.setListener(nukkitSession); - this.sessionCreationQueue.offer(nukkitSession); - } - - @Override - public void onUnhandledDatagram(ChannelHandlerContext ctx, DatagramPacket datagramPacket) { - this.server.handlePacket(datagramPacket.sender(), datagramPacket.content()); - } - - @RequiredArgsConstructor - private class NukkitRakNetSession implements RakNetSessionListener { - - private final RakNetServerSession raknet; - private final Queue packets = PlatformDependent.newSpscQueue(); - private String disconnectReason = null; - private Player player; - - @Override - public void onSessionChangeState(RakNetState rakNetState) { - } - - @Override - public void onDisconnect(DisconnectReason disconnectReason) { - if (disconnectReason == DisconnectReason.TIMED_OUT) { - this.disconnectReason = "Timed out"; - } else { - this.disconnectReason = "Disconnected from Server"; - } - } - - public void onEncapsulated(EncapsulatedPacket packet) { - ByteBuf buffer = packet.getBuffer(); - if (buffer.readUnsignedByte() == 0xfe) { - DataPacket batchPacket = RakNetInterface.this.network.getPacket(ProtocolInfo.BATCH_PACKET); - if (batchPacket == null) { - return; - } - - byte[] packetBuffer = new byte[buffer.readableBytes()]; - buffer.readBytes(packetBuffer); - batchPacket.setBuffer(packetBuffer); - batchPacket.decode(); - this.packets.add(batchPacket); - } - } - - @Override - public void onDirect(ByteBuf byteBuf) { - // We don't allow any direct packets so ignore - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/network/SourceInterface.java b/src/main/java/cn/nukkit/network/SourceInterface.java deleted file mode 100644 index 998c11aea..000000000 --- a/src/main/java/cn/nukkit/network/SourceInterface.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.network; - -import cn.nukkit.Player; -import cn.nukkit.network.protocol.DataPacket; - - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface SourceInterface { - - Integer putPacket(Player player, DataPacket packet); - - Integer putPacket(Player player, DataPacket packet, boolean needACK); - - Integer putPacket(Player player, DataPacket packet, boolean needACK, boolean immediate); - - int getNetworkLatency(Player player); - - void close(Player player); - - void close(Player player, String reason); - - void setName(String name); - - boolean process(); - - void shutdown(); - - void emergencyShutdown(); -} diff --git a/src/main/java/cn/nukkit/network/protocol/AddBehaviorTreePacket.java b/src/main/java/cn/nukkit/network/protocol/AddBehaviorTreePacket.java deleted file mode 100644 index e2005c16e..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AddBehaviorTreePacket.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class AddBehaviorTreePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ADD_BEHAVIOR_TREE_PACKET; - - public String behaviorTreeJson; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.behaviorTreeJson = this.getString(); - } - - @Override - public void encode() { - this.reset(); - this.putString(behaviorTreeJson); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AddEntityPacket.java b/src/main/java/cn/nukkit/network/protocol/AddEntityPacket.java deleted file mode 100644 index 9255ad841..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AddEntityPacket.java +++ /dev/null @@ -1,220 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.entity.Attribute; -import cn.nukkit.entity.data.EntityMetadata; -import cn.nukkit.entity.item.*; -import cn.nukkit.entity.mob.*; -import cn.nukkit.entity.passive.*; -import cn.nukkit.entity.projectile.*; -import cn.nukkit.entity.weather.EntityLightning; -import cn.nukkit.network.protocol.types.EntityLink; -import cn.nukkit.utils.Binary; -import com.google.common.collect.ImmutableMap; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class AddEntityPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ADD_ENTITY_PACKET; - - public static final ImmutableMap LEGACY_IDS = ImmutableMap.builder() - .put(51, "minecraft:npc") - .put(63, "minecraft:player") - .put(EntityWitherSkeleton.NETWORK_ID, "minecraft:wither_skeleton") - .put(EntityHusk.NETWORK_ID, "minecraft:husk") - .put(EntityStray.NETWORK_ID, "minecraft:stray") - .put(EntityWitch.NETWORK_ID, "minecraft:witch") - .put(EntityZombieVillager.NETWORK_ID, "minecraft:zombie_villager") - .put(EntityBlaze.NETWORK_ID, "minecraft:blaze") - .put(EntityMagmaCube.NETWORK_ID, "minecraft:magma_cube") - .put(EntityGhast.NETWORK_ID, "minecraft:ghast") - .put(EntityCaveSpider.NETWORK_ID, "minecraft:cave_spider") - .put(EntitySilverfish.NETWORK_ID, "minecraft:silverfish") - .put(EntityEnderman.NETWORK_ID, "minecraft:enderman") - .put(EntitySlime.NETWORK_ID, "minecraft:slime") - .put(EntityZombiePigman.NETWORK_ID, "minecraft:zombie_pigman") - .put(EntitySpider.NETWORK_ID, "minecraft:spider") - .put(EntitySkeleton.NETWORK_ID, "minecraft:skeleton") - .put(EntityCreeper.NETWORK_ID, "minecraft:creeper") - .put(EntityZombie.NETWORK_ID, "minecraft:zombie") - .put(EntitySkeletonHorse.NETWORK_ID, "minecraft:skeleton_horse") - .put(EntityMule.NETWORK_ID, "minecraft:mule") - .put(EntityDonkey.NETWORK_ID, "minecraft:donkey") - .put(EntityDolphin.NETWORK_ID, "minecraft:dolphin") - .put(EntityTropicalFish.NETWORK_ID, "minecraft:tropicalfish") - .put(EntityWolf.NETWORK_ID, "minecraft:wolf") - .put(EntitySquid.NETWORK_ID, "minecraft:squid") - .put(EntityDrowned.NETWORK_ID, "minecraft:drowned") - .put(EntitySheep.NETWORK_ID, "minecraft:sheep") - .put(EntityMooshroom.NETWORK_ID, "minecraft:mooshroom") - .put(EntityPanda.NETWORK_ID, "minecraft:panda") - .put(EntitySalmon.NETWORK_ID, "minecraft:salmon") - .put(EntityPig.NETWORK_ID, "minecraft:pig") - .put(EntityVillager.NETWORK_ID, "minecraft:villager") - .put(EntityCod.NETWORK_ID, "minecraft:cod") - .put(EntityPufferfish.NETWORK_ID, "minecraft:pufferfish") - .put(EntityCow.NETWORK_ID, "minecraft:cow") - .put(EntityChicken.NETWORK_ID, "minecraft:chicken") - .put(107, "minecraft:balloon") - .put(EntityLlama.NETWORK_ID, "minecraft:llama") - .put(EntityIronGolem.NETWORK_ID, "minecraft:iron_golem") - .put(EntityRabbit.NETWORK_ID, "minecraft:rabbit") - .put(EntitySnowGolem.NETWORK_ID, "minecraft:snow_golem") - .put(EntityBat.NETWORK_ID, "minecraft:bat") - .put(EntityOcelot.NETWORK_ID, "minecraft:ocelot") - .put(EntityHorse.NETWORK_ID, "minecraft:horse") - .put(EntityCat.NETWORK_ID, "minecraft:cat") - .put(EntityPolarBear.NETWORK_ID, "minecraft:polar_bear") - .put(EntityZombieHorse.NETWORK_ID, "minecraft:zombie_horse") - .put(EntityTurtle.NETWORK_ID, "minecraft:turtle") - .put(EntityParrot.NETWORK_ID, "minecraft:parrot") - .put(EntityGuardian.NETWORK_ID, "minecraft:guardian") - .put(EntityElderGuardian.NETWORK_ID, "minecraft:elder_guardian") - .put(EntityVindicator.NETWORK_ID, "minecraft:vindicator") - .put(EntityWither.NETWORK_ID, "minecraft:wither") - .put(EntityEnderDragon.NETWORK_ID, "minecraft:ender_dragon") - .put(EntityShulker.NETWORK_ID, "minecraft:shulker") - .put(EntityEndermite.NETWORK_ID, "minecraft:endermite") - .put(EntityMinecartEmpty.NETWORK_ID, "minecraft:minecart") - .put(EntityMinecartHopper.NETWORK_ID, "minecraft:hopper_minecart") - .put(EntityMinecartTNT.NETWORK_ID, "minecraft:tnt_minecart") - .put(EntityMinecartChest.NETWORK_ID, "minecraft:chest_minecart") - .put(100, "minecraft:command_block_minecart") - .put(EntityArmorStand.NETWORK_ID, "minecraft:armor_stand") - .put(EntityItem.NETWORK_ID, "minecraft:item") - .put(EntityPrimedTNT.NETWORK_ID, "minecraft:tnt") - .put(EntityFallingBlock.NETWORK_ID, "minecraft:falling_block") - .put(EntityExpBottle.NETWORK_ID, "minecraft:xp_bottle") - .put(EntityXPOrb.NETWORK_ID, "minecraft:xp_orb") - .put(70, "minecraft:eye_of_ender_signal") - .put(EntityEndCrystal.NETWORK_ID, "minecraft:ender_crystal") - .put(EntityShulkerBullet.NETWORK_ID, "minecraft:shulker_bullet") - .put(EntityFishingHook.NETWORK_ID, "minecraft:fishing_hook") - .put(EntityEnderCharge.NETWORK_ID, "minecraft:dragon_fireball") - .put(EntityArrow.NETWORK_ID, "minecraft:arrow") - .put(EntitySnowball.NETWORK_ID, "minecraft:snowball") - .put(EntityEgg.NETWORK_ID, "minecraft:egg") - .put(EntityPainting.NETWORK_ID, "minecraft:painting") - .put(EntityThrownTrident.NETWORK_ID, "minecraft:thrown_trident") - .put(EntityGhastFireBall.NETWORK_ID, "minecraft:fireball") - .put(EntityPotion.NETWORK_ID, "minecraft:splash_potion") - .put(EntityEnderPearl.NETWORK_ID, "minecraft:ender_pearl") - .put(88, "minecraft:leash_knot") - .put(EntityWitherSkull.NETWORK_ID, "minecraft:wither_skull") - .put(EntityBlueWitherSkull.NETWORK_ID, "minecraft:wither_skull_dangerous") - .put(EntityBoat.NETWORK_ID, "minecraft:boat") - .put(EntityLightning.NETWORK_ID, "minecraft:lightning_bolt") - .put(EntityBlazeFireBall.NETWORK_ID, "minecraft:small_fireball") - .put(EntityLlamaSpit.NETWORK_ID, "minecraft:llama_spit") - .put(95, "minecraft:area_effect_cloud") - .put(EntityPotionLingering.NETWORK_ID, "minecraft:lingering_potion") - .put(EntityFirework.NETWORK_ID, "minecraft:fireworks_rocket") - .put(EntityEvocationFangs.NETWORK_ID, "minecraft:evocation_fang") - .put(104, "minecraft:evocation_illager") - .put(EntityVex.NETWORK_ID, "minecraft:vex") - .put(56, "minecraft:agent") - .put(106, "minecraft:ice_bomb") - .put(EntityPhantom.NETWORK_ID, "minecraft:phantom") - .put(62, "minecraft:tripod_camera") - .put(EntityPillager.NETWORK_ID, "minecraft:pillager") - .put(EntityWanderingTrader.NETWORK_ID, "minecraft:wandering_trader") - .put(EntityRavager.NETWORK_ID, "minecraft:ravager") - .put(EntityVillagerV2.NETWORK_ID, "minecraft:villager_v2") - .put(EntityZombieVillagerV2.NETWORK_ID, "minecraft:zombie_villager_v2") - .put(EntityFox.NETWORK_ID, "minecraft:fox") - .put(EntityBee.NETWORK_ID, "minecraft:bee") - .put(EntityPiglin.NETWORK_ID, "minecraft:piglin") - .put(EntityHoglin.NETWORK_ID, "minecraft:hoglin") - .put(EntityStrider.NETWORK_ID, "minecraft:strider") - .put(EntityZoglin.NETWORK_ID, "minecraft:zoglin") - .put(EntityPiglinBrute.NETWORK_ID, "minecraft:piglin_brute") - .put(EntityGoat.NETWORK_ID, "minecraft:goat") - .put(EntityGlowSquid.NETWORK_ID, "minecraft:glow_squid") - .put(EntityAxolotl.NETWORK_ID, "minecraft:axolotl") - .build(); - - private static final ImmutableMap MV_PRE_407 = ImmutableMap.builder() - .put(EntityPiglin.NETWORK_ID, "minecraft:zombie_pigman") - .put(EntityHoglin.NETWORK_ID, "minecraft:pig") - .put(EntityStrider.NETWORK_ID, "minecraft:pig") - .put(EntityZoglin.NETWORK_ID, "minecraft:pig") - .put(EntityPiglinBrute.NETWORK_ID, "minecraft:zombie_pigman") - .build(); - - @Override - public byte pid() { - return NETWORK_ID; - } - - public long entityUniqueId; - public long entityRuntimeId; - public int type; - public String id; - public float x; - public float y; - public float z; - public float speedX = 0f; - public float speedY = 0f; - public float speedZ = 0f; - public float yaw; - public float pitch; - public float headYaw; - public EntityMetadata metadata = new EntityMetadata(); - public Attribute[] attributes = new Attribute[0]; - public EntityLink[] links = new EntityLink[0]; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(this.entityUniqueId); - this.putEntityRuntimeId(this.entityRuntimeId); - if (this.protocol < 313) { - this.putUnsignedVarInt(this.type); - } else { - if (id == null) { - if (protocol < ProtocolInfo.v1_17_0 && type == EntityGoat.NETWORK_ID) { - id = "minecraft:sheep"; - } else if (protocol < ProtocolInfo.v1_17_0 && type == EntityAxolotl.NETWORK_ID) { - id = "minecraft:tropicalfish"; - } else if (protocol < ProtocolInfo.v1_17_0 && type == EntityGlowSquid.NETWORK_ID) { - id = "minecraft:squid"; - } else { - if (protocol < ProtocolInfo.v1_16_0) { - if (protocol < ProtocolInfo.v1_14_0 && type == EntityBee.NETWORK_ID) { - id = "minecraft:bat"; - } else if (protocol < ProtocolInfo.v1_13_0 && type == EntityFox.NETWORK_ID) { - id = "minecraft:wolf"; - } else { - id = MV_PRE_407.get(type); - } - } - if (id == null) { - id = LEGACY_IDS.get(type); - } - } - } - this.putString(this.id); - } - this.putVector3f(this.x, this.y, this.z); - this.putVector3f(this.speedX, this.speedY, this.speedZ); - this.putLFloat(this.pitch); - this.putLFloat(this.yaw); - if (protocol >= 274) { - this.putLFloat(this.headYaw); - } - this.putAttributeList(this.attributes); - this.put(Binary.writeMetadata(protocol, this.metadata)); - this.putUnsignedVarInt(this.links.length); - for (EntityLink link : links) { - putEntityLink(protocol, link); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AddItemEntityPacket.java b/src/main/java/cn/nukkit/network/protocol/AddItemEntityPacket.java deleted file mode 100644 index 7f13ba1a4..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AddItemEntityPacket.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.entity.data.EntityMetadata; -import cn.nukkit.item.Item; -import cn.nukkit.utils.Binary; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class AddItemEntityPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ADD_ITEM_ENTITY_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public long entityUniqueId; - public long entityRuntimeId; - public Item item; - public float x; - public float y; - public float z; - public float speedX; - public float speedY; - public float speedZ; - public EntityMetadata metadata = new EntityMetadata(); - public boolean isFromFishing = false; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(this.entityUniqueId); - this.putEntityRuntimeId(this.entityRuntimeId); - this.putSlot(protocol, this.item); - this.putVector3f(this.x, this.y, this.z); - this.putVector3f(this.speedX, this.speedY, this.speedZ); - this.put(Binary.writeMetadata(protocol, metadata)); - if (protocol >= 223) { - this.putBoolean(this.isFromFishing); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AddPaintingPacket.java b/src/main/java/cn/nukkit/network/protocol/AddPaintingPacket.java deleted file mode 100644 index 5dac022c2..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AddPaintingPacket.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class AddPaintingPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ADD_PAINTING_PACKET; - - public long entityUniqueId; - public long entityRuntimeId; - public float x; - public float y; - public float z; - public int direction; - public String title; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(this.entityUniqueId); - this.putEntityRuntimeId(this.entityRuntimeId); - if (protocol < 361) { - this.putBlockVector3((int) this.x, (int) this.y, (int) this.z); - } else { - this.putVector3f(this.x, this.y, this.z); - } - this.putVarInt(this.direction); - this.putString(this.title); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AddPlayerPacket.java b/src/main/java/cn/nukkit/network/protocol/AddPlayerPacket.java deleted file mode 100644 index 06a20c1bb..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AddPlayerPacket.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.entity.data.EntityMetadata; -import cn.nukkit.item.Item; -import cn.nukkit.utils.Binary; -import lombok.ToString; - -import java.util.UUID; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class AddPlayerPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ADD_PLAYER_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public UUID uuid; - public String username; - public long entityUniqueId; - public long entityRuntimeId; - public String platformChatId = ""; - public float x; - public float y; - public float z; - public float speedX; - public float speedY; - public float speedZ; - public float pitch; - public float yaw; - public Item item; - public EntityMetadata metadata = new EntityMetadata(); - public String deviceId = ""; - public int buildPlatform = -1; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putUUID(this.uuid); - this.putString(this.username); - if (protocol >= 223 && protocol <= 282) { - this.putString(""); - this.putVarInt(0); - } - this.putEntityUniqueId(this.entityUniqueId); - this.putEntityRuntimeId(this.entityRuntimeId); - if (protocol >= 223) { - this.putString(this.platformChatId); - } - this.putVector3f(this.x, this.y, this.z); - this.putVector3f(this.speedX, this.speedY, this.speedZ); - this.putLFloat(this.pitch); - this.putLFloat(this.yaw); - this.putLFloat(this.yaw); - this.putSlot(protocol, this.item); - this.put(Binary.writeMetadata(protocol, this.metadata)); - if (protocol > 274) { - this.putUnsignedVarInt(0); - this.putUnsignedVarInt(0); - this.putUnsignedVarInt(0); - this.putUnsignedVarInt(0); - this.putUnsignedVarInt(0); - this.putLLong(entityUniqueId); - this.putUnsignedVarInt(0); - this.putString(deviceId); - if (protocol >= 388) { - this.putLInt(buildPlatform); - } - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AdventureSettingsPacket.java b/src/main/java/cn/nukkit/network/protocol/AdventureSettingsPacket.java deleted file mode 100644 index 1f9cf0903..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AdventureSettingsPacket.java +++ /dev/null @@ -1,103 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.Player; -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class AdventureSettingsPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ADVENTURE_SETTINGS_PACKET; - - public static final int PERMISSION_NORMAL = 0; - public static final int PERMISSION_OPERATOR = 1; - public static final int PERMISSION_HOST = 2; - public static final int PERMISSION_AUTOMATION = 3; - public static final int PERMISSION_ADMIN = 4; - - /** - * This constant is used to identify flags that should be set on the second field. In a sensible world, these - * flags would all be set on the same packet field, but as of MCPE 1.2, the new abilities flags have for some - * reason been assigned a separate field. - */ - public static final int BITFLAG_SECOND_SET = 65536; - - public static final int WORLD_IMMUTABLE = 0x01; - public static final int NO_PVP = 0x02; - public static final int AUTO_JUMP = 0x20; - public static final int ALLOW_FLIGHT = 0x40; - public static final int NO_CLIP = 0x80; - public static final int WORLD_BUILDER = 0x100; - public static final int FLYING = 0x200; - public static final int MUTED = 0x400; - public static final int BUILD_AND_MINE = 65537; - public static final int DOORS_AND_SWITCHES = 65538; - public static final int OPEN_CONTAINERS = 65540; - public static final int ATTACK_PLAYERS = 65544; - public static final int ATTACK_MOBS = 65552; - public static final int OPERATOR = 65568; - public static final int TELEPORT = 65664; - - public long flags = 0; - - public long commandPermission = PERMISSION_NORMAL; - - public long flags2 = -1; // This may be incorrect but DON'T TOUCH IT! - - public long playerPermission = Player.PERMISSION_MEMBER; - - public long customFlags; - - public long entityUniqueId; //This is a little-endian long, NOT a var-long. (WTF Mojang) - - public void decode() { - this.flags = getUnsignedVarInt(); - this.commandPermission = getUnsignedVarInt(); - this.flags2 = getUnsignedVarInt(); - this.playerPermission = getUnsignedVarInt(); - this.customFlags = getUnsignedVarInt(); - this.entityUniqueId = getLLong(); - } - - public void encode() { - this.reset(); - this.putUnsignedVarInt(this.flags); - this.putUnsignedVarInt(this.commandPermission); - this.putUnsignedVarInt(this.flags2); - this.putUnsignedVarInt(this.playerPermission); - this.putUnsignedVarInt(this.customFlags); - this.putLLong(this.entityUniqueId); - } - - public boolean getFlag(int flag) { - if ((flag & BITFLAG_SECOND_SET) != 0) { - return (this.flags2 & flag) != 0; - } - return (this.flags & flag) != 0; - } - - public void setFlag(int flag, boolean value) { - boolean flags = (flag & BITFLAG_SECOND_SET) != 0; - - if (value) { - if (flags) { - this.flags2 |= flag; - } else { - this.flags |= flag; - } - } else { - if (flags) { - this.flags2 &= ~flag; - } else { - this.flags &= ~flag; - } - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AnimatePacket.java b/src/main/java/cn/nukkit/network/protocol/AnimatePacket.java deleted file mode 100644 index 09898e7cc..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AnimatePacket.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit.network.protocol; - -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class AnimatePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ANIMATE_PACKET; - - public long eid; - public Action action; - public float rowingTime; - - @Override - public void decode() { - this.action = Action.fromId(this.getVarInt()); - this.eid = getEntityRuntimeId(); - if (this.action == Action.ROW_RIGHT || this.action == Action.ROW_LEFT) { - this.rowingTime = this.getLFloat(); - } - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.action.getId()); - this.putEntityRuntimeId(this.eid); - if (this.action == Action.ROW_RIGHT || this.action == Action.ROW_LEFT) { - this.putLFloat(this.rowingTime); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } - - public enum Action { - NO_ACTION(0), - SWING_ARM(1), - WAKE_UP(3), - CRITICAL_HIT(4), - MAGIC_CRITICAL_HIT(5), - ROW_RIGHT(128), - ROW_LEFT(129); - - private static final Int2ObjectMap ID_LOOKUP = new Int2ObjectOpenHashMap<>(); - - static { - for (Action value : values()) { - ID_LOOKUP.put(value.id, value); - } - } - - private final int id; - - Action(int id) { - this.id = id; - } - - public int getId() { - return id; - } - - public static Action fromId(int id) { - return ID_LOOKUP.get(id); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AnvilDamagePacket.java b/src/main/java/cn/nukkit/network/protocol/AnvilDamagePacket.java deleted file mode 100644 index 33098b28e..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AnvilDamagePacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -@ToString -public class AnvilDamagePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ANVIL_DAMAGE_PACKET; - - public int damage; - public int x; - public int y; - public int z; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.damage = this.getByte(); - BlockVector3 vec = this.getBlockVector3(); - this.x = vec.x; - this.y = vec.y; - this.z = vec.z; - } - - @Override - public void encode() { - - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AvailableCommandsPacket.java b/src/main/java/cn/nukkit/network/protocol/AvailableCommandsPacket.java deleted file mode 100644 index 3fd531c19..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AvailableCommandsPacket.java +++ /dev/null @@ -1,364 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.command.data.*; -import cn.nukkit.utils.BinaryStream; -import lombok.ToString; - -import java.util.*; -import java.util.function.ObjIntConsumer; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class AvailableCommandsPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.AVAILABLE_COMMANDS_PACKET; - - private static final ObjIntConsumer WRITE_BYTE = (s, v) -> s.putByte((byte) v); - private static final ObjIntConsumer WRITE_SHORT = BinaryStream::putLShort; - private static final ObjIntConsumer WRITE_INT = BinaryStream::putLInt; - //private static final ToIntFunction READ_BYTE = BinaryStream::getByte; - //private static final ToIntFunction READ_SHORT = BinaryStream::getLShort; - //private static final ToIntFunction READ_INT = BinaryStream::getLInt; - - public static final int ARG_FLAG_VALID = 0x100000; - public static final int ARG_FLAG_ENUM = 0x200000; - public static final int ARG_FLAG_POSTFIX = 0x1000000; - public static final int ARG_FLAG_SOFT_ENUM = 0x4000000; - - /* From < 1.16.100 */ - public static final int ARG_TYPE_INT = 1; - public static final int ARG_TYPE_FLOAT = 2; - public static final int ARG_TYPE_VALUE = 3; - public static final int ARG_TYPE_WILDCARD_INT = 4; - public static final int ARG_TYPE_OPERATOR = 5; - public static final int ARG_TYPE_TARGET = 6; - public static final int ARG_TYPE_WILDCARD_TARGET = 7; - public static final int ARG_TYPE_FILE_PATH = 14; - public static final int ARG_TYPE_STRING = 29; - public static final int ARG_TYPE_BLOCK_POSITION = 37; - public static final int ARG_TYPE_POSITION = 38; - public static final int ARG_TYPE_MESSAGE = 41; - public static final int ARG_TYPE_RAWTEXT = 43; - public static final int ARG_TYPE_JSON = 47; - public static final int ARG_TYPE_COMMAND = 54; - - public Map commands; - public final Map> softEnums = new HashMap<>(); - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - /*commands = new HashMap<>(); - - List enumValues = new ArrayList<>(); - List postFixes = new ArrayList<>(); - List enums = new ArrayList<>(); - - int len = (int) getUnsignedVarInt(); - while (len-- > 0) { - enumValues.add(getString()); - } - - len = (int) getUnsignedVarInt(); - while (len-- > 0) { - postFixes.add(getString()); - } - - ToIntFunction indexReader; - if (enumValues.size() < 256) { - indexReader = READ_BYTE; - } else if (enumValues.size() < 65536) { - indexReader = READ_SHORT; - } else { - indexReader = READ_INT; - } - - len = (int) getUnsignedVarInt(); - while (len-- > 0) { - String enumName = getString(); - int enumLength = (int) getUnsignedVarInt(); - - List values = new ArrayList<>(); - - while (enumLength-- > 0) { - int index = indexReader.applyAsInt(this); - - String enumValue; - - if (index < 0 || (enumValue = enumValues.get(index)) == null) { - throw new IllegalStateException("Enum value not found for index " + index); - } - - values.add(enumValue); - } - - enums.add(new CommandEnum(enumName, values)); - } - - len = (int) getUnsignedVarInt(); - - while (len-- > 0) { - String name = getString(); - String description = getString(); - int flags = getByte(); - int permission = getByte(); - CommandEnum alias = null; - - int aliasIndex = getLInt(); - if (aliasIndex >= 0) { - alias = enums.get(aliasIndex); - } - - Map overloads = new HashMap<>(); - - int length = (int) getUnsignedVarInt(); - while (length-- > 0) { - CommandOverload overload = new CommandOverload(); - - int paramLen = (int) getUnsignedVarInt(); - - overload.input.parameters = new CommandParameter[paramLen]; - for (int i = 0; i < paramLen; i++) { - String paramName = getString(); - int type = getLInt(); - boolean optional = getBoolean(); - - CommandParameter parameter = new CommandParameter(paramName, optional); - - if ((type & ARG_FLAG_POSTFIX) != 0) { - parameter.postFix = postFixes.get(type & 0xffff); - } else if ((type & ARG_FLAG_VALID) == 0) { - throw new IllegalStateException("Invalid parameter type received"); - } else { - int index = type & 0xffff; - if ((type & ARG_FLAG_ENUM) != 0) { - parameter.enumData = enums.get(index); - } else if ((type & ARG_FLAG_SOFT_ENUM) != 0) { - // TODO: soft enums - } else { - throw new IllegalStateException("Unknown parameter type!"); - } - } - - overload.input.parameters[i] = parameter; - } - - overloads.put(Integer.toString(length), overload); - } - - CommandData data = new CommandData(); - data.aliases = alias; - data.overloads = overloads; - data.description = description; - data.flags = flags; - data.permission = permission; - - CommandDataVersions versions = new CommandDataVersions(); - versions.versions.add(data); - - this.commands.put(name, versions); - }*/ - } - - @Override - public void encode() { - this.reset(); - - LinkedHashSet enumValuesSet = new LinkedHashSet<>(); - LinkedHashSet postFixesSet = new LinkedHashSet<>(); - LinkedHashSet enumsSet = new LinkedHashSet<>(); - - commands.forEach((name, data) -> { - CommandData cmdData = data.versions.get(0); - - if (cmdData.aliases != null) { - enumsSet.add(cmdData.aliases); - - enumValuesSet.addAll(cmdData.aliases.getValues()); - } - - for (CommandOverload overload : cmdData.overloads.values()) { - for (CommandParameter parameter : overload.input.parameters) { - if (parameter.enumData != null) { - enumsSet.add(parameter.enumData); - - enumValuesSet.addAll(parameter.enumData.getValues()); - } - - if (parameter.postFix != null) { - postFixesSet.add(parameter.postFix); - } - } - } - }); - - List enumValues = new ArrayList<>(enumValuesSet); - List enums = new ArrayList<>(enumsSet); - List postFixes = new ArrayList<>(postFixesSet); - - this.putUnsignedVarInt(enumValues.size()); - enumValues.forEach(this::putString); - - this.putUnsignedVarInt(postFixes.size()); - postFixes.forEach(this::putString); - - ObjIntConsumer indexWriter; - if (enumValues.size() < 256) { - indexWriter = WRITE_BYTE; - } else if (enumValues.size() < 65536) { - indexWriter = WRITE_SHORT; - } else { - indexWriter = WRITE_INT; - } - - this.putUnsignedVarInt(enums.size()); - enums.forEach((cmdEnum) -> { - putString(cmdEnum.getName()); - - List values = cmdEnum.getValues(); - putUnsignedVarInt(values.size()); - - for (String val : values) { - int i = enumValues.indexOf(val); - - if (i < 0) { - throw new IllegalStateException("Enum value '" + val + "' not found"); - } - - indexWriter.accept(this, i); - } - }); - - putUnsignedVarInt(commands.size()); - - commands.forEach((name, cmdData) -> { - CommandData data = cmdData.versions.get(0); - - putString(name); - putString(data.description); - if (protocol >= ProtocolInfo.v1_17_10) { - putLShort(data.flags); - } else { - putByte((byte) data.flags); - } - putByte((byte) data.permission); - - putLInt(data.aliases == null ? -1 : enums.indexOf(data.aliases)); - - putUnsignedVarInt(data.overloads.size()); - for (CommandOverload overload : data.overloads.values()) { - putUnsignedVarInt(overload.input.parameters.length); - - for (CommandParameter parameter : overload.input.parameters) { - putString(parameter.name); - - int type = 0; - if (parameter.postFix != null) { - int i = postFixes.indexOf(parameter.postFix); - if (i < 0) { - throw new IllegalStateException( - "Postfix '" + parameter.postFix + "' isn't in postfix array"); - } - type = ARG_FLAG_POSTFIX | i; - } else { - type |= ARG_FLAG_VALID; - if (parameter.enumData != null) { - type |= ARG_FLAG_ENUM | enums.indexOf(parameter.enumData); - } else { - int id = parameter.type.getId(); - if (protocol < ProtocolInfo.v1_8_0) { - switch (parameter.type) { - case STRING: - id = 0x0f; - break; - case POSITION: - case BLOCK_POSITION: - id = 0x10; - break; - case MESSAGE: - id = 0x13; - break; - case RAWTEXT: - id = 0x15; - break; - case JSON: - id = 0x18; - break; - case COMMAND: - id = 0x1f; - break; - } - } else if (protocol < ProtocolInfo.v1_13_0) { - switch (parameter.type) { - case STRING: - id = 27; - break; - case POSITION: - case BLOCK_POSITION: - id = 29; - break; - case MESSAGE: - id = 32; - break; - case RAWTEXT: - id = 34; - break; - case JSON: - id = 37; - break; - case COMMAND: - id = 44; - break; - } - } else if (protocol >= ProtocolInfo.v1_16_210) { //TODO: proper implementation for 1.16.210 command params - if (id == ARG_TYPE_COMMAND) { - id = 63; - } else if (id == ARG_TYPE_FILE_PATH) { - id = id + 2; // +1 from .100 and +1 from .210 - } else if (id >= ARG_TYPE_STRING) { - id = id + 3; // +2 from .100 and +1 from .210 - } else if (id >= ARG_TYPE_FLOAT) { - id++; - } - } else if (protocol >= ProtocolInfo.v1_16_100) { //TODO: proper implementation for 1.16.100 command params - if (id == ARG_TYPE_FILE_PATH) { - id++; - } else if (id >= ARG_TYPE_STRING) { - id = id + 2; - } - } - type |= id; - } - } - - putLInt(type); - putBoolean(parameter.optional); - if (protocol >= 340) { - putByte(parameter.options); - } - } - } - }); - - if (protocol > 274) { - this.putUnsignedVarInt(softEnums.size()); - - softEnums.forEach((name, values) -> { - this.putString(name); - this.putUnsignedVarInt(values.size()); - values.forEach(this::putString); - }); - } - - if (protocol >= 407) { - this.putUnsignedVarInt(0); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/AvailableEntityIdentifiersPacket.java b/src/main/java/cn/nukkit/network/protocol/AvailableEntityIdentifiersPacket.java deleted file mode 100644 index c014002d7..000000000 --- a/src/main/java/cn/nukkit/network/protocol/AvailableEntityIdentifiersPacket.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.Nukkit; -import com.google.common.io.ByteStreams; - -import java.io.InputStream; -import java.util.Base64; - -public class AvailableEntityIdentifiersPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.AVAILABLE_ENTITY_IDENTIFIERS_PACKET; - - public static final String NBT313 = "CgAJBmlkbGlzdArEAQgDYmlkCm1pbmVjcmFmdDoBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQQbWluZWNyYWZ0OnBsYXllcgMDcmlkhgQBCnN1bW1vbmFibGUAAAgDYmlkCm1pbmVjcmFmdDoBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQXbWluZWNyYWZ0OnRyaXBvZF9jYW1lcmEDA3JpZIQEAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkGW1pbmVjcmFmdDp3aXRoZXJfc2tlbGV0b24DA3JpZGABCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQObWluZWNyYWZ0Omh1c2sDA3JpZF4BCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQPbWluZWNyYWZ0OnN0cmF5AwNyaWRcAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDp3aXRjaAMDcmlkWgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBltaW5lY3JhZnQ6em9tYmllX3ZpbGxhZ2VyAwNyaWRYAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDpibGF6ZQMDcmlkVgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBRtaW5lY3JhZnQ6bWFnbWFfY3ViZQMDcmlkVAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA9taW5lY3JhZnQ6Z2hhc3QDA3JpZFIBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQVbWluZWNyYWZ0OmNhdmVfc3BpZGVyAwNyaWRQAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkFG1pbmVjcmFmdDpzaWx2ZXJmaXNoAwNyaWROAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkEm1pbmVjcmFmdDplbmRlcm1hbgMDcmlkTAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA9taW5lY3JhZnQ6c2xpbWUDA3JpZEoBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQXbWluZWNyYWZ0OnpvbWJpZV9waWdtYW4DA3JpZEgBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OnNwaWRlcgMDcmlkRgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBJtaW5lY3JhZnQ6c2tlbGV0b24DA3JpZEQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQRbWluZWNyYWZ0OmNyZWVwZXIDA3JpZEIBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OnpvbWJpZQMDcmlkQAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBhtaW5lY3JhZnQ6c2tlbGV0b25faG9yc2UDA3JpZDQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQObWluZWNyYWZ0Om11bGUDA3JpZDIBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OmRvbmtleQMDcmlkMAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBFtaW5lY3JhZnQ6ZG9scGhpbgMDcmlkPgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBZtaW5lY3JhZnQ6dHJvcGljYWxmaXNoAwNyaWTeAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA5taW5lY3JhZnQ6d29sZgMDcmlkHAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA9taW5lY3JhZnQ6c3F1aWQDA3JpZCIBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQRbWluZWNyYWZ0OmRyb3duZWQDA3JpZNwBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDpzaGVlcAMDcmlkGgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBNtaW5lY3JhZnQ6bW9vc2hyb29tAwNyaWQgAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDpwYW5kYQMDcmlk4gEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OnNhbG1vbgMDcmlk2gEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQNbWluZWNyYWZ0OnBpZwMDcmlkGAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBJtaW5lY3JhZnQ6dmlsbGFnZXIDA3JpZB4BCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQNbWluZWNyYWZ0OmNvZAMDcmlk4AEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQUbWluZWNyYWZ0OnB1ZmZlcmZpc2gDA3JpZNgBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkDW1pbmVjcmFmdDpjb3cDA3JpZBYBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQRbWluZWNyYWZ0OmNoaWNrZW4DA3JpZBQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQRbWluZWNyYWZ0OmJhbGxvb24DA3JpZNYBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDpsbGFtYQMDcmlkOgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBRtaW5lY3JhZnQ6aXJvbl9nb2xlbQMDcmlkKAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBBtaW5lY3JhZnQ6cmFiYml0AwNyaWQkAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkFG1pbmVjcmFmdDpzbm93X2dvbGVtAwNyaWQqAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkDW1pbmVjcmFmdDpiYXQDA3JpZCYBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0Om9jZWxvdAMDcmlkLAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA9taW5lY3JhZnQ6aG9yc2UDA3JpZC4BCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQNbWluZWNyYWZ0OmNhdAMDcmlklgEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQUbWluZWNyYWZ0OnBvbGFyX2JlYXIDA3JpZDgBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQWbWluZWNyYWZ0OnpvbWJpZV9ob3JzZQMDcmlkNgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBBtaW5lY3JhZnQ6dHVydGxlAwNyaWSUAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBBtaW5lY3JhZnQ6cGFycm90AwNyaWQ8AQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkEm1pbmVjcmFmdDpndWFyZGlhbgMDcmlkYgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBhtaW5lY3JhZnQ6ZWxkZXJfZ3VhcmRpYW4DA3JpZGQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQUbWluZWNyYWZ0OnZpbmRpY2F0b3IDA3JpZHIBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQQbWluZWNyYWZ0OndpdGhlcgMDcmlkaAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBZtaW5lY3JhZnQ6ZW5kZXJfZHJhZ29uAwNyaWRqAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkEW1pbmVjcmFmdDpzaHVsa2VyAwNyaWRsAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkE21pbmVjcmFmdDplbmRlcm1pdGUDA3JpZG4BCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQSbWluZWNyYWZ0Om1pbmVjYXJ0AwNyaWSoAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBltaW5lY3JhZnQ6aG9wcGVyX21pbmVjYXJ0AwNyaWTAAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBZtaW5lY3JhZnQ6dG50X21pbmVjYXJ0AwNyaWTCAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBhtaW5lY3JhZnQ6Y2hlc3RfbWluZWNhcnQDA3JpZMQBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkIG1pbmVjcmFmdDpjb21tYW5kX2Jsb2NrX21pbmVjYXJ0AwNyaWTIAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBVtaW5lY3JhZnQ6YXJtb3Jfc3RhbmQDA3JpZHoBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQObWluZWNyYWZ0Oml0ZW0DA3JpZIABAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkDW1pbmVjcmFmdDp0bnQDA3JpZIIBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkF21pbmVjcmFmdDpmYWxsaW5nX2Jsb2NrAwNyaWSEAQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBNtaW5lY3JhZnQ6eHBfYm90dGxlAwNyaWSIAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBBtaW5lY3JhZnQ6eHBfb3JiAwNyaWSKAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZB1taW5lY3JhZnQ6ZXllX29mX2VuZGVyX3NpZ25hbAMDcmlkjAEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQXbWluZWNyYWZ0OmVuZGVyX2NyeXN0YWwDA3JpZI4BAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkGG1pbmVjcmFmdDpzaHVsa2VyX2J1bGxldAMDcmlkmAEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQWbWluZWNyYWZ0OmZpc2hpbmdfaG9vawMDcmlkmgEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQZbWluZWNyYWZ0OmRyYWdvbl9maXJlYmFsbAMDcmlkngEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQPbWluZWNyYWZ0OmFycm93AwNyaWSgAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBJtaW5lY3JhZnQ6c25vd2JhbGwDA3JpZKIBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkDW1pbmVjcmFmdDplZ2cDA3JpZKQBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkEm1pbmVjcmFmdDpwYWludGluZwMDcmlkpgEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQYbWluZWNyYWZ0OnRocm93bl90cmlkZW50AwNyaWSSAQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBJtaW5lY3JhZnQ6ZmlyZWJhbGwDA3JpZKoBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkF21pbmVjcmFmdDpzcGxhc2hfcG90aW9uAwNyaWSsAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBVtaW5lY3JhZnQ6ZW5kZXJfcGVhcmwDA3JpZK4BAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkFG1pbmVjcmFmdDpsZWFzaF9rbm90AwNyaWSwAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBZtaW5lY3JhZnQ6d2l0aGVyX3NrdWxsAwNyaWSyAQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZCBtaW5lY3JhZnQ6d2l0aGVyX3NrdWxsX2Rhbmdlcm91cwMDcmlktgEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQObWluZWNyYWZ0OmJvYXQDA3JpZLQBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkGG1pbmVjcmFmdDpsaWdodG5pbmdfYm9sdAMDcmlkugEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQYbWluZWNyYWZ0OnNtYWxsX2ZpcmViYWxsAwNyaWS8AQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBRtaW5lY3JhZnQ6bGxhbWFfc3BpdAMDcmlkzAEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQbbWluZWNyYWZ0OmFyZWFfZWZmZWN0X2Nsb3VkAwNyaWS+AQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBptaW5lY3JhZnQ6bGluZ2VyaW5nX3BvdGlvbgMDcmlkygEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQabWluZWNyYWZ0OmZpcmV3b3Jrc19yb2NrZXQDA3JpZJABAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkGG1pbmVjcmFmdDpldm9jYXRpb25fZmFuZwMDcmlkzgEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQbbWluZWNyYWZ0OmV2b2NhdGlvbl9pbGxhZ2VyAwNyaWTQAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA1taW5lY3JhZnQ6dmV4AwNyaWTSAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZA9taW5lY3JhZnQ6YWdlbnQDA3JpZHABCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQSbWluZWNyYWZ0OmljZV9ib21iAwNyaWTUAQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBFtaW5lY3JhZnQ6cGhhbnRvbQMDcmlkdAEKc3VtbW9uYWJsZQEACANiaWQKbWluZWNyYWZ0OgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZA1taW5lY3JhZnQ6bnBjAwNyaWSCBAEKc3VtbW9uYWJsZQEAAA=="; - public static final String NBT340 = "CgAJBmlkbGlzdArOAQgDYmlkCm1pbmVjcmFmdDoBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQQbWluZWNyYWZ0OnBsYXllcgMDcmlkhgQBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQNbWluZWNyYWZ0OmNvdwMDcmlkFgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAQELaGFzc3Bhd25lZ2cACAJpZBptaW5lY3JhZnQ6d2FuZGVyaW5nX3RyYWRlcgMDcmlk7AEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQRbWluZWNyYWZ0OmJhbGxvb24DA3JpZNYBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkEm1pbmVjcmFmdDppY2VfYm9tYgMDcmlk1AEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQObWluZWNyYWZ0Omh1c2sDA3JpZF4BCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQPbWluZWNyYWZ0OnN0cmF5AwNyaWRcAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDp3aXRjaAMDcmlkWgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBltaW5lY3JhZnQ6em9tYmllX3ZpbGxhZ2VyAwNyaWRYAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDpibGF6ZQMDcmlkVgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBRtaW5lY3JhZnQ6bWFnbWFfY3ViZQMDcmlkVAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA9taW5lY3JhZnQ6Z2hhc3QDA3JpZFIBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQVbWluZWNyYWZ0OmNhdmVfc3BpZGVyAwNyaWRQAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkFG1pbmVjcmFmdDpzaWx2ZXJmaXNoAwNyaWROAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkEm1pbmVjcmFmdDplbmRlcm1hbgMDcmlkTAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA9taW5lY3JhZnQ6c2xpbWUDA3JpZEoBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQXbWluZWNyYWZ0OnpvbWJpZV9waWdtYW4DA3JpZEgBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OnNwaWRlcgMDcmlkRgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBJtaW5lY3JhZnQ6c2tlbGV0b24DA3JpZEQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQRbWluZWNyYWZ0OmNyZWVwZXIDA3JpZEIBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OnpvbWJpZQMDcmlkQAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBhtaW5lY3JhZnQ6c2tlbGV0b25faG9yc2UDA3JpZDQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQObWluZWNyYWZ0Om11bGUDA3JpZDIBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OmRvbmtleQMDcmlkMAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBFtaW5lY3JhZnQ6ZG9scGhpbgMDcmlkPgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBZtaW5lY3JhZnQ6em9tYmllX2hvcnNlAwNyaWQ2AQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkEG1pbmVjcmFmdDp0dXJ0bGUDA3JpZJQBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkE21pbmVjcmFmdDptb29zaHJvb20DA3JpZCABCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQPbWluZWNyYWZ0OnBhbmRhAwNyaWTiAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA9taW5lY3JhZnQ6aG9yc2UDA3JpZC4BCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OnNhbG1vbgMDcmlk2gEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQNbWluZWNyYWZ0OnBpZwMDcmlkGAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBJtaW5lY3JhZnQ6dmlsbGFnZXIDA3JpZB4BCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQNbWluZWNyYWZ0OmNvZAMDcmlk4AEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQUbWluZWNyYWZ0OnB1ZmZlcmZpc2gDA3JpZNgBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkDm1pbmVjcmFmdDp3b2xmAwNyaWQcAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkFm1pbmVjcmFmdDp0cm9waWNhbGZpc2gDA3JpZN4BAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDpzaGVlcAMDcmlkGgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBFtaW5lY3JhZnQ6ZHJvd25lZAMDcmlk3AEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQRbWluZWNyYWZ0OmNoaWNrZW4DA3JpZBQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQPbWluZWNyYWZ0OmxsYW1hAwNyaWQ6AQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkD21pbmVjcmFmdDpzcXVpZAMDcmlkIgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBJtaW5lY3JhZnQ6cGlsbGFnZXIDA3JpZOQBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkFG1pbmVjcmFmdDppcm9uX2dvbGVtAwNyaWQoAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkEG1pbmVjcmFmdDpyYWJiaXQDA3JpZCQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAEBC2hhc3NwYXduZWdnAAgCaWQVbWluZWNyYWZ0OnZpbGxhZ2VyX3YyAwNyaWTmAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBRtaW5lY3JhZnQ6c25vd19nb2xlbQMDcmlkKgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZA1taW5lY3JhZnQ6YmF0AwNyaWQmAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwBAQtoYXNzcGF3bmVnZwAIAmlkHG1pbmVjcmFmdDp6b21iaWVfdmlsbGFnZXJfdjIDA3JpZOgBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkEG1pbmVjcmFmdDpvY2Vsb3QDA3JpZCwBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQNbWluZWNyYWZ0OmNhdAMDcmlklgEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQUbWluZWNyYWZ0OnBvbGFyX2JlYXIDA3JpZDgBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQQbWluZWNyYWZ0OnBhcnJvdAMDcmlkPAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBltaW5lY3JhZnQ6d2l0aGVyX3NrZWxldG9uAwNyaWRgAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkEm1pbmVjcmFmdDpndWFyZGlhbgMDcmlkYgEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBhtaW5lY3JhZnQ6ZWxkZXJfZ3VhcmRpYW4DA3JpZGQBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQUbWluZWNyYWZ0OnZpbmRpY2F0b3IDA3JpZHIBCnN1bW1vbmFibGUBAAgDYmlkCm1pbmVjcmFmdDoBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQNbWluZWNyYWZ0Om5wYwMDcmlkggQBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQRbWluZWNyYWZ0OnBoYW50b20DA3JpZHQBCnN1bW1vbmFibGUBAAgDYmlkCm1pbmVjcmFmdDoBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQXbWluZWNyYWZ0OnRyaXBvZF9jYW1lcmEDA3JpZIQEAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwBAQtoYXNzcGF3bmVnZwAIAmlkF21pbmVjcmFmdDppbGxhZ2VyX2JlYXN0AwNyaWR2AQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkEG1pbmVjcmFmdDp3aXRoZXIDA3JpZGgBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQWbWluZWNyYWZ0OmVuZGVyX2RyYWdvbgMDcmlkagEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBFtaW5lY3JhZnQ6c2h1bGtlcgMDcmlkbAEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cBCAJpZBNtaW5lY3JhZnQ6ZW5kZXJtaXRlAwNyaWRuAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkEm1pbmVjcmFmdDptaW5lY2FydAMDcmlkqAEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQZbWluZWNyYWZ0OmhvcHBlcl9taW5lY2FydAMDcmlkwAEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQWbWluZWNyYWZ0OnRudF9taW5lY2FydAMDcmlkwgEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQYbWluZWNyYWZ0OmNoZXN0X21pbmVjYXJ0AwNyaWTEAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZCBtaW5lY3JhZnQ6Y29tbWFuZF9ibG9ja19taW5lY2FydAMDcmlkyAEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQVbWluZWNyYWZ0OmFybW9yX3N0YW5kAwNyaWR6AQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkDm1pbmVjcmFmdDppdGVtAwNyaWSAAQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZA1taW5lY3JhZnQ6dG50AwNyaWSCAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBdtaW5lY3JhZnQ6ZmFsbGluZ19ibG9jawMDcmlkhAEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQTbWluZWNyYWZ0OnhwX2JvdHRsZQMDcmlkiAEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQQbWluZWNyYWZ0OnhwX29yYgMDcmlkigEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQdbWluZWNyYWZ0OmV5ZV9vZl9lbmRlcl9zaWduYWwDA3JpZIwBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkF21pbmVjcmFmdDplbmRlcl9jcnlzdGFsAwNyaWSOAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBhtaW5lY3JhZnQ6c2h1bGtlcl9idWxsZXQDA3JpZJgBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkFm1pbmVjcmFmdDpmaXNoaW5nX2hvb2sDA3JpZJoBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkGW1pbmVjcmFmdDpkcmFnb25fZmlyZWJhbGwDA3JpZJ4BAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkD21pbmVjcmFmdDphcnJvdwMDcmlkoAEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQSbWluZWNyYWZ0OnNub3diYWxsAwNyaWSiAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZA1taW5lY3JhZnQ6ZWdnAwNyaWSkAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBJtaW5lY3JhZnQ6cGFpbnRpbmcDA3JpZKYBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkGG1pbmVjcmFmdDp0aHJvd25fdHJpZGVudAMDcmlkkgEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQSbWluZWNyYWZ0OmZpcmViYWxsAwNyaWSqAQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBdtaW5lY3JhZnQ6c3BsYXNoX3BvdGlvbgMDcmlkrAEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQVbWluZWNyYWZ0OmVuZGVyX3BlYXJsAwNyaWSuAQEKc3VtbW9uYWJsZQAACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBRtaW5lY3JhZnQ6bGVhc2hfa25vdAMDcmlksAEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQWbWluZWNyYWZ0OndpdGhlcl9za3VsbAMDcmlksgEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQgbWluZWNyYWZ0OndpdGhlcl9za3VsbF9kYW5nZXJvdXMDA3JpZLYBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkDm1pbmVjcmFmdDpib2F0AwNyaWS0AQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBhtaW5lY3JhZnQ6bGlnaHRuaW5nX2JvbHQDA3JpZLoBAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkGG1pbmVjcmFmdDpzbWFsbF9maXJlYmFsbAMDcmlkvAEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQUbWluZWNyYWZ0OmxsYW1hX3NwaXQDA3JpZMwBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkG21pbmVjcmFmdDphcmVhX2VmZmVjdF9jbG91ZAMDcmlkvgEBCnN1bW1vbmFibGUAAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQabWluZWNyYWZ0OmxpbmdlcmluZ19wb3Rpb24DA3JpZMoBAQpzdW1tb25hYmxlAAAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwAIAmlkGm1pbmVjcmFmdDpmaXJld29ya3Nfcm9ja2V0AwNyaWSQAQEKc3VtbW9uYWJsZQEACANiaWQBOgEMZXhwZXJpbWVudGFsAAELaGFzc3Bhd25lZ2cACAJpZBhtaW5lY3JhZnQ6ZXZvY2F0aW9uX2ZhbmcDA3JpZM4BAQpzdW1tb25hYmxlAQAIA2JpZAE6AQxleHBlcmltZW50YWwAAQtoYXNzcGF3bmVnZwEIAmlkG21pbmVjcmFmdDpldm9jYXRpb25faWxsYWdlcgMDcmlk0AEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAQgCaWQNbWluZWNyYWZ0OnZleAMDcmlk0gEBCnN1bW1vbmFibGUBAAgDYmlkAToBDGV4cGVyaW1lbnRhbAABC2hhc3NwYXduZWdnAAgCaWQPbWluZWNyYWZ0OmFnZW50AwNyaWRwAQpzdW1tb25hYmxlAAAA"; - private static byte[] TAG313; - private static byte[] TAG340; - private static final byte[] TAG419; - - static { - try { - InputStream inputStream = Nukkit.class.getClassLoader().getResourceAsStream("entity_identifiers_419.dat"); - if (inputStream == null) throw new AssertionError("Could not find entity_identifiers_419.dat"); - TAG419 = ByteStreams.toByteArray(inputStream); - } catch (Exception e) { - throw new AssertionError("Error whilst loading entity_identifiers.dat", e); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - if (protocol >= ProtocolInfo.v1_16_100) { - this.put(TAG419); - } else if (protocol >= ProtocolInfo.v1_10_0) { - this.put(TAG340 != null ? TAG340 : (TAG340 = Base64.getDecoder().decode(NBT340))); - } else { - this.put(TAG313 != null ? TAG313 : (TAG313 = Base64.getDecoder().decode(NBT313))); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/BatchPacket.java b/src/main/java/cn/nukkit/network/protocol/BatchPacket.java deleted file mode 100644 index d56982c3c..000000000 --- a/src/main/java/cn/nukkit/network/protocol/BatchPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BatchPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.BATCH_PACKET; - - public byte[] payload; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.payload = this.get(); - } - - @Override - public void encode() { - } - - public void trim() { - setBuffer(null); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/BiomeDefinitionListPacket.java b/src/main/java/cn/nukkit/network/protocol/BiomeDefinitionListPacket.java deleted file mode 100644 index 82e3b317d..000000000 --- a/src/main/java/cn/nukkit/network/protocol/BiomeDefinitionListPacket.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.Nukkit; -import com.google.common.io.ByteStreams; -import lombok.ToString; - -@ToString() -public class BiomeDefinitionListPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.BIOME_DEFINITION_LIST_PACKET; - - // Call the latest version "TAG" - private static final byte[] TAG; // 361 - - static { - try { - TAG = ByteStreams.toByteArray(Nukkit.class.getClassLoader().getResourceAsStream("biome_definitions_361.dat")); - } catch (Exception e) { - throw new AssertionError("Error whilst loading biome definitions", e); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.put(TAG); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/BlockEntityDataPacket.java b/src/main/java/cn/nukkit/network/protocol/BlockEntityDataPacket.java deleted file mode 100644 index ecfe75151..000000000 --- a/src/main/java/cn/nukkit/network/protocol/BlockEntityDataPacket.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString(exclude = "namedTag") -public class BlockEntityDataPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.BLOCK_ENTITY_DATA_PACKET; - - public int x; - public int y; - public int z; - public byte[] namedTag; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - BlockVector3 v = this.getBlockVector3(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.namedTag = this.get(); - } - - @Override - public void encode() { - this.reset(); - this.putBlockVector3(this.x, this.y, this.z); - this.put(this.namedTag); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/network/protocol/BlockEventPacket.java b/src/main/java/cn/nukkit/network/protocol/BlockEventPacket.java deleted file mode 100644 index 3d9b6f9d4..000000000 --- a/src/main/java/cn/nukkit/network/protocol/BlockEventPacket.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class BlockEventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.BLOCK_EVENT_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public int x; - public int y; - public int z; - public int case1; - public int case2; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putBlockVector3(this.x, this.y, this.z); - this.putVarInt(this.case1); - this.putVarInt(this.case2); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/BlockPickRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/BlockPickRequestPacket.java deleted file mode 100644 index a23995c93..000000000 --- a/src/main/java/cn/nukkit/network/protocol/BlockPickRequestPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -@ToString -public class BlockPickRequestPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.BLOCK_PICK_REQUEST_PACKET; - - public int x; - public int y; - public int z; - public boolean addUserData; - public int selectedSlot; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - BlockVector3 v = this.getSignedBlockPosition(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.putBoolean(this.addUserData); - this.selectedSlot = this.getByte(); - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/BookEditPacket.java b/src/main/java/cn/nukkit/network/protocol/BookEditPacket.java deleted file mode 100644 index b9ec95c70..000000000 --- a/src/main/java/cn/nukkit/network/protocol/BookEditPacket.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class BookEditPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.BOOK_EDIT_PACKET; - - public Action action; - public int inventorySlot; - public int pageNumber; - public int secondaryPageNumber; - - public String text; - public String photoName; - - public String title; - public String author; - public String xuid; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.action = Action.values()[this.getByte()]; - this.inventorySlot = this.getByte(); - - switch (this.action) { - case REPLACE_PAGE: - case ADD_PAGE: - this.pageNumber = this.getByte(); - this.text = this.getString(); - this.photoName = this.getString(); - break; - case DELETE_PAGE: - this.pageNumber = this.getByte(); - break; - case SWAP_PAGES: - this.pageNumber = this.getByte(); - this.secondaryPageNumber = this.getByte(); - break; - case SIGN_BOOK: - this.title = this.getString(); - this.author = this.getString(); - this.xuid = this.getString(); - break; - } - } - - @Override - public void encode() { - - } - - public enum Action { - REPLACE_PAGE, - ADD_PAGE, - DELETE_PAGE, - SWAP_PAGES, - SIGN_BOOK - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/BossEventPacket.java b/src/main/java/cn/nukkit/network/protocol/BossEventPacket.java deleted file mode 100644 index 1c2c73f44..000000000 --- a/src/main/java/cn/nukkit/network/protocol/BossEventPacket.java +++ /dev/null @@ -1,100 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * Created by CreeperFace on 30. 10. 2016. - */ -@ToString -public class BossEventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.BOSS_EVENT_PACKET; - - /** Shows the bossbar to the player. */ - public static final int TYPE_SHOW = 0; - /** Registers a player to a boss fight. */ - public static final int TYPE_REGISTER_PLAYER = 1; - /** Not sure on this. */ - public static final int TYPE_UPDATE = 1; - /** Removes the bossbar from the client. */ - public static final int TYPE_HIDE = 2; - /** Unregisters a player from a boss fight. */ - public static final int TYPE_UNREGISTER_PLAYER = 3; - /** Sets the bar percentage. */ - public static final int TYPE_HEALTH_PERCENT = 4; - /** Sets title of the bar. */ - public static final int TYPE_TITLE = 5; - /** Not sure on this. Includes color and overlay fields, plus an unknown short. */ - public static final int TYPE_UNKNOWN_6 = 6; - /** Not implemented :( Intended to alter bar appearance, but these currently produce no effect on clientside whatsoever. */ - public static final int TYPE_TEXTURE = 7; - - public long bossEid; - public int type; - public long playerEid; - public float healthPercent; - public String title = ""; - public short unknown; - public int color; - public int overlay; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.bossEid = this.getEntityUniqueId(); - this.type = (int) this.getUnsignedVarInt(); - switch (this.type) { - case TYPE_REGISTER_PLAYER: - case TYPE_UNREGISTER_PLAYER: - this.playerEid = this.getEntityUniqueId(); - break; - case TYPE_SHOW: - this.title = this.getString(); - this.healthPercent = this.getLFloat(); - case TYPE_UNKNOWN_6: - this.unknown = (short) this.getShort(); - case TYPE_TEXTURE: - this.color = (int) this.getUnsignedVarInt(); - this.overlay = (int) this.getUnsignedVarInt(); - break; - case TYPE_HEALTH_PERCENT: - this.healthPercent = this.getLFloat(); - break; - case TYPE_TITLE: - this.title = this.getString(); - break; - } - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(this.bossEid); - this.putUnsignedVarInt(this.type); - switch (this.type) { - case TYPE_REGISTER_PLAYER: - case TYPE_UNREGISTER_PLAYER: - this.putEntityUniqueId(this.playerEid); - break; - case TYPE_SHOW: - this.putString(this.title); - this.putLFloat(this.healthPercent); - case TYPE_UNKNOWN_6: - this.putShort(this.unknown); - case TYPE_TEXTURE: - this.putUnsignedVarInt(this.color); - this.putUnsignedVarInt(this.overlay); - break; - case TYPE_HEALTH_PERCENT: - this.putLFloat(this.healthPercent); - break; - case TYPE_TITLE: - this.putString(this.title); - break; - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/CameraPacket.java b/src/main/java/cn/nukkit/network/protocol/CameraPacket.java deleted file mode 100644 index cc12aa0a9..000000000 --- a/src/main/java/cn/nukkit/network/protocol/CameraPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class CameraPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CAMERA_PACKET; - - public long cameraUniqueId; - public long playerUniqueId; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.cameraUniqueId = this.getVarLong(); - this.playerUniqueId = this.getVarLong(); - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(this.cameraUniqueId); - this.putEntityUniqueId(this.playerUniqueId); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ChangeDimensionPacket.java b/src/main/java/cn/nukkit/network/protocol/ChangeDimensionPacket.java deleted file mode 100644 index d3b6cd6da..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ChangeDimensionPacket.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * Created on 2016/1/5 by xtypr. - * Package cn.nukkit.network.protocol in project nukkit . - */ -@ToString -public class ChangeDimensionPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CHANGE_DIMENSION_PACKET; - - public int dimension; - - public float x; - public float y; - public float z; - - public boolean respawn; - - @Override - public void decode() { - this.dimension = this.getVarInt(); - this.x = this.getVector3f().x; - this.y = this.getVector3f().y; - this.z = this.getVector3f().z; - this.respawn = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.dimension); - this.putVector3f(this.x, this.y, this.z); - this.putBoolean(this.respawn); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ChunkRadiusUpdatedPacket.java b/src/main/java/cn/nukkit/network/protocol/ChunkRadiusUpdatedPacket.java deleted file mode 100644 index f4449ad48..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ChunkRadiusUpdatedPacket.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class ChunkRadiusUpdatedPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CHUNK_RADIUS_UPDATED_PACKET; - - public int radius; - - @Override - public void decode() { - this.radius = this.getVarInt(); - } - - @Override - public void encode() { - super.reset(); - this.putVarInt(this.radius); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ClientCacheStatusPacket.java b/src/main/java/cn/nukkit/network/protocol/ClientCacheStatusPacket.java deleted file mode 100644 index 47518091b..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ClientCacheStatusPacket.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.network.protocol; - -public class ClientCacheStatusPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CLIENT_CACHE_STATUS_PACKET; - - public boolean supported; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.supported = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putBoolean(this.supported); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ClientToServerHandshakePacket.java b/src/main/java/cn/nukkit/network/protocol/ClientToServerHandshakePacket.java deleted file mode 100644 index e19f11b6a..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ClientToServerHandshakePacket.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class ClientToServerHandshakePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CLIENT_TO_SERVER_HANDSHAKE_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ClientboundMapItemDataPacket.java b/src/main/java/cn/nukkit/network/protocol/ClientboundMapItemDataPacket.java deleted file mode 100644 index af9fdbce1..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ClientboundMapItemDataPacket.java +++ /dev/null @@ -1,151 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.utils.Utils; -import lombok.ToString; - -import java.awt.*; -import java.awt.image.BufferedImage; - -/** - * Created by CreeperFace on 5.3.2017. - */ -@ToString -public class ClientboundMapItemDataPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CLIENTBOUND_MAP_ITEM_DATA_PACKET; - - public int[] eids = new int[0]; - - public long mapId; - public int update; - public byte scale; - public boolean isLocked; - public int width; - public int height; - public int offsetX; - public int offsetZ; - - public byte dimensionId; - - public MapDecorator[] decorators = new MapDecorator[0]; - public MapTrackedObject[] trackedEntities = new MapTrackedObject[0]; - public int[] colors = new int[0]; - public BufferedImage image = null; - - public static final int TEXTURE_UPDATE = 2; - public static final int DECORATIONS_UPDATE = 4; - public static final int ENTITIES_UPDATE = 8; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(mapId); - - int update = 0; - if (eids.length > 0) { - update |= 0x08; - } - if (decorators.length > 0) { - update |= DECORATIONS_UPDATE; - } - - if (image != null || colors.length > 0) { - update |= TEXTURE_UPDATE; - } - - this.putUnsignedVarInt(update); - this.putByte(this.dimensionId); - if (protocol >= 354) { - this.putBoolean(this.isLocked); - } - - if ((update & 0x08) != 0) { - this.putUnsignedVarInt(eids.length); - for (int eid : eids) { - this.putEntityUniqueId(eid); - } - } - if ((update & (6)) != 0) { - this.putByte(this.scale); - } - - if ((update & DECORATIONS_UPDATE) != 0) { - this.putUnsignedVarInt(trackedEntities.length); - for (MapTrackedObject object : trackedEntities) { - this.putLInt(object.type); - if (object.type == MapTrackedObject.TYPE_BLOCK) { - this.putBlockVector3(object.x, object.y, object.z); - } else if (object.type == MapTrackedObject.TYPE_ENTITY) { - this.putEntityUniqueId(object.entityUniqueId); - } else { - throw new IllegalArgumentException("Unknown map object type " + object.type); - } - } - - this.putUnsignedVarInt(decorators.length); - - for (MapDecorator decorator : decorators) { - this.putByte(decorator.icon); - this.putByte(decorator.rotation); - this.putByte(decorator.offsetX); - this.putByte(decorator.offsetZ); - this.putString(decorator.label); - this.putUnsignedVarInt(decorator.color.getRGB()); - } - } - - if ((update & TEXTURE_UPDATE) != 0) { - this.putVarInt(width); - this.putVarInt(height); - this.putVarInt(offsetX); - this.putVarInt(offsetZ); - - this.putUnsignedVarInt((long) width * height); - - if (image != null) { - for (int y = 0; y < width; y++) { - for (int x = 0; x < height; x++) { - this.putUnsignedVarInt(Utils.toABGR(this.image.getRGB(x, y))); - } - } - - image.flush(); - } else if (colors.length > 0) { - for (int color : colors) { - this.putUnsignedVarInt(color); - } - } - } - } - - public static class MapDecorator { - public byte rotation; - public byte icon; - public byte offsetX; - public byte offsetZ; - public String label; - public Color color; - } - - public static class MapTrackedObject { - public static final int TYPE_ENTITY = 0; - public static final int TYPE_BLOCK = 1; - - public int type; - public long entityUniqueId; - - public int x; - public int y; - public int z; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/CodeBuilderPacket.java b/src/main/java/cn/nukkit/network/protocol/CodeBuilderPacket.java deleted file mode 100644 index 90921a054..000000000 --- a/src/main/java/cn/nukkit/network/protocol/CodeBuilderPacket.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.network.protocol; - -public class CodeBuilderPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CODE_BUILDER_PACKET; - - public boolean isOpening; - public String url = ""; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.url = this.getString(); - this.isOpening = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putString(url); - this.putBoolean(isOpening); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/CommandBlockUpdatePacket.java b/src/main/java/cn/nukkit/network/protocol/CommandBlockUpdatePacket.java deleted file mode 100644 index faca28de0..000000000 --- a/src/main/java/cn/nukkit/network/protocol/CommandBlockUpdatePacket.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -@ToString -public class CommandBlockUpdatePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.COMMAND_BLOCK_UPDATE_PACKET; - - public boolean isBlock; - public int x; - public int y; - public int z; - public int commandBlockMode; - public boolean isRedstoneMode; - public boolean isConditional; - public long minecartEid; - public String command; - public String lastOutput; - public String name; - public boolean shouldTrackOutput; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.isBlock = this.getBoolean(); - if (this.isBlock) { - BlockVector3 v = this.getBlockVector3(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.commandBlockMode = (int) this.getUnsignedVarInt(); - this.isRedstoneMode = this.getBoolean(); - this.isConditional = this.getBoolean(); - } else { - this.minecartEid = this.getEntityRuntimeId(); - } - this.command = this.getString(); - this.lastOutput = this.getString(); - this.name = this.getString(); - this.shouldTrackOutput = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putBoolean(this.isBlock); - if (this.isBlock) { - this.putBlockVector3(this.x, this.y, this.z); - this.putUnsignedVarInt(this.commandBlockMode); - this.putBoolean(this.isRedstoneMode); - this.putBoolean(this.isConditional); - } else { - this.putEntityRuntimeId(this.minecartEid); - } - this.putString(this.command); - this.putString(this.lastOutput); - this.putString(this.name); - this.putBoolean(this.shouldTrackOutput); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/CommandRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/CommandRequestPacket.java deleted file mode 100644 index 665760554..000000000 --- a/src/main/java/cn/nukkit/network/protocol/CommandRequestPacket.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.network.protocol.types.CommandOriginData; -import lombok.ToString; - -import java.util.UUID; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class CommandRequestPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.COMMAND_REQUEST_PACKET; - - public static final int TYPE_PLAYER = 0; - public static final int TYPE_COMMAND_BLOCK = 1; - public static final int TYPE_MINECART_COMMAND_BLOCK = 2; - public static final int TYPE_DEV_CONSOLE = 3; - public static final int TYPE_AUTOMATION_PLAYER = 4; - public static final int TYPE_CLIENT_AUTOMATION = 5; - public static final int TYPE_DEDICATED_SERVER = 6; - public static final int TYPE_ENTITY = 7; - public static final int TYPE_VIRTUAL = 8; - public static final int TYPE_GAME_ARGUMENT = 9; - public static final int TYPE_INTERNAL = 10; - - public String command; - public CommandOriginData data; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.command = this.getString(); - - CommandOriginData.Origin type = CommandOriginData.Origin.values()[this.getVarInt()]; - UUID uuid = protocol > ProtocolInfo.v1_2_0 ? this.getUUID() : null; - String requestId = this.getString(); - Long varLong = null; - if (type == CommandOriginData.Origin.DEV_CONSOLE || type == CommandOriginData.Origin.TEST) { - varLong = this.getVarLong(); - } - this.data = new CommandOriginData(type, uuid, requestId, varLong); - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/CompletedUsingItemPacket.java b/src/main/java/cn/nukkit/network/protocol/CompletedUsingItemPacket.java deleted file mode 100644 index c561d18aa..000000000 --- a/src/main/java/cn/nukkit/network/protocol/CompletedUsingItemPacket.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class CompletedUsingItemPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.COMPLETED_USING_ITEM_PACKET; - - public static final int ACTION_UNKNOWN = -1; - public static final int ACTION_EQUIP_ARMOR = 0; - public static final int ACTION_EAT = 1; - public static final int ACTION_ATTACK = 2; - public static final int ACTION_CONSUME = 3; - public static final int ACTION_THROW = 4; - public static final int ACTION_SHOOT = 5; - public static final int ACTION_PLACE = 6; - public static final int ACTION_FILL_BOTTLE = 7; - public static final int ACTION_FILL_BUCKET = 8; - public static final int ACTION_POUR_BUCKET = 9; - public static final int ACTION_USE_TOOL = 10; - public static final int ACTION_INTERACT = 11; - public static final int ACTION_RETRIEVE = 12; - public static final int ACTION_DYED = 13; - public static final int ACTION_TRADED = 14; - - public int itemId; - public int action; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putLShort(itemId); - this.putLInt(action); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ContainerClosePacket.java b/src/main/java/cn/nukkit/network/protocol/ContainerClosePacket.java deleted file mode 100644 index 62f39b5ff..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ContainerClosePacket.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class ContainerClosePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CONTAINER_CLOSE_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public int windowId; - public boolean wasServerInitiated; - - @Override - public void decode() { - this.windowId = (byte) this.getByte(); - if (protocol >= ProtocolInfo.v1_16_100) { - this.wasServerInitiated = this.getBoolean(); - } - } - - @Override - public void encode() { - this.reset(); - this.putByte((byte) this.windowId); - if (protocol >= ProtocolInfo.v1_16_100) { - this.putBoolean(this.wasServerInitiated); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ContainerOpenPacket.java b/src/main/java/cn/nukkit/network/protocol/ContainerOpenPacket.java deleted file mode 100644 index f69a1d3a7..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ContainerOpenPacket.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class ContainerOpenPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CONTAINER_OPEN_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public int windowId; - public int type; - public int x; - public int y; - public int z; - public long entityId = -1; - - @Override - public void decode() { - this.windowId = this.getByte(); - this.type = this.getByte(); - BlockVector3 v = this.getBlockVector3(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.entityId = this.getEntityUniqueId(); - } - - @Override - public void encode() { - this.reset(); - this.putByte((byte) this.windowId); - this.putByte((byte) this.type); - this.putBlockVector3(this.x, this.y, this.z); - this.putEntityUniqueId(this.entityId); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ContainerSetDataPacket.java b/src/main/java/cn/nukkit/network/protocol/ContainerSetDataPacket.java deleted file mode 100644 index 627eab8d7..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ContainerSetDataPacket.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class ContainerSetDataPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CONTAINER_SET_DATA_PACKET; - - public static final int PROPERTY_FURNACE_TICK_COUNT = 0; - public static final int PROPERTY_FURNACE_LIT_TIME = 1; - public static final int PROPERTY_FURNACE_LIT_DURATION = 2; - public static final int PROPERTY_UNKNOWN = 3; - public static final int PROPERTY_FURNACE_FUEL_AUX = 4; - - public static final int PROPERTY_BREWING_STAND_BREW_TIME = 0; - public static final int PROPERTY_BREWING_STAND_FUEL_AMOUNT = 1; - public static final int PROPERTY_BREWING_STAND_FUEL_TOTAL = 2; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public int windowId; - public int property; - public int value; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putByte((byte) this.windowId); - this.putVarInt(this.property); - this.putVarInt(this.value); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/CraftingDataPacket.java b/src/main/java/cn/nukkit/network/protocol/CraftingDataPacket.java deleted file mode 100644 index 35003abb6..000000000 --- a/src/main/java/cn/nukkit/network/protocol/CraftingDataPacket.java +++ /dev/null @@ -1,256 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.inventory.*; -import cn.nukkit.item.Item; -import cn.nukkit.utils.BinaryStream; -import lombok.ToString; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * @author Nukkit Project Team - */ -@ToString -public class CraftingDataPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CRAFTING_DATA_PACKET; - - public static final String CRAFTING_TAG_CRAFTING_TABLE = "crafting_table"; - public static final String CRAFTING_TAG_CARTOGRAPHY_TABLE = "cartography_table"; - public static final String CRAFTING_TAG_STONECUTTER = "stonecutter"; - public static final String CRAFTING_TAG_FURNACE = "furnace"; - public static final String CRAFTING_TAG_CAMPFIRE = "campfire"; - public static final String CRAFTING_TAG_BLAST_FURNACE = "blast_furnace"; - public static final String CRAFTING_TAG_SMOKER = "smoker"; - - private List entries = new ArrayList<>(); - private final List brewingEntries = new ArrayList<>(); - private final List containerEntries = new ArrayList<>(); - public boolean cleanRecipes = true; - - public void addShapelessRecipe(ShapelessRecipe... recipe) { - Collections.addAll(entries, recipe); - } - - public void addShapedRecipe(ShapedRecipe... recipe) { - Collections.addAll(entries, recipe); - } - - public void addFurnaceRecipe(FurnaceRecipe... recipe) { - Collections.addAll(entries, recipe); - } - - public void addBrewingRecipe(BrewingRecipe... recipe) { - Collections.addAll(brewingEntries, recipe); - } - - public void addMultiRecipe(MultiRecipe... recipe) { - Collections.addAll(entries, recipe); - } - - public void addContainerRecipe(ContainerRecipe... recipe) { - Collections.addAll(containerEntries, recipe); - } - - @Override - public DataPacket clean() { - entries = new ArrayList<>(); - return super.clean(); - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(entries.size()); - - if (protocol < 354) { - BinaryStream writer = new BinaryStream(); - for (Object entry : entries) { - int entryType = writeEntryLegacy(entry, writer); - if (entryType >= 0) { - this.putVarInt(entryType); - this.put(writer.getBuffer()); - } else { - this.putVarInt(-1); - } - writer.reset(); - } - } else { - for (Recipe recipe : entries) { - this.putVarInt(recipe.getType().ordinal()); - switch (recipe.getType()) { - case SHAPELESS: - ShapelessRecipe shapeless = (ShapelessRecipe) recipe; - if (protocol >= 361) { - this.putString(shapeless.getRecipeId()); - } - List ingredients = shapeless.getIngredientList(); - this.putUnsignedVarInt(ingredients.size()); - for (Item ingredient : ingredients) { - if (protocol < 361) { - this.putSlot(protocol, ingredient); - } else { - this.putRecipeIngredient(this.protocol, ingredient); - } - } - this.putUnsignedVarInt(1); - this.putSlot(protocol, shapeless.getResult(), protocol >= ProtocolInfo.v1_16_100); - this.putUUID(shapeless.getId()); - if (protocol >= 354) { - this.putString(CRAFTING_TAG_CRAFTING_TABLE); - if (protocol >= 361) { - this.putVarInt(shapeless.getPriority()); - if (protocol >= 407) { - this.putUnsignedVarInt(shapeless.getNetworkId()); - } - } - } - break; - case SHAPED: - ShapedRecipe shaped = (ShapedRecipe) recipe; - if (protocol >= 361) { - this.putString(shaped.getRecipeId()); - } - this.putVarInt(shaped.getWidth()); - this.putVarInt(shaped.getHeight()); - - for (int z = 0; z < shaped.getHeight(); ++z) { - for (int x = 0; x < shaped.getWidth(); ++x) { - if (protocol < 361) { - this.putSlot(protocol, shaped.getIngredient(x, z)); - } else { - this.putRecipeIngredient(this.protocol, shaped.getIngredient(x, z)); - } - } - } - List outputs = new ArrayList<>(); - outputs.add(shaped.getResult()); - outputs.addAll(shaped.getExtraResults()); - this.putUnsignedVarInt(outputs.size()); - for (Item output : outputs) { - this.putSlot(protocol, output, protocol >= ProtocolInfo.v1_16_100); - } - this.putUUID(shaped.getId()); - if (protocol >= 354) { - this.putString(CRAFTING_TAG_CRAFTING_TABLE); - if (protocol >= 361) { - this.putVarInt(shaped.getPriority()); - if (protocol >= 407) { - this.putUnsignedVarInt(shaped.getNetworkId()); - } - } - } - break; - case FURNACE: - case FURNACE_DATA: - FurnaceRecipe furnace = (FurnaceRecipe) recipe; - Item input = furnace.getInput(); - this.putVarInt(input.getId()); - if (recipe.getType() == RecipeType.FURNACE_DATA) { - this.putVarInt(input.getDamage()); - } - this.putSlot(protocol, furnace.getResult(), protocol >= ProtocolInfo.v1_16_100); - if (protocol >= 354) { - this.putString(CRAFTING_TAG_FURNACE); - } - break; - case MULTI: - if (protocol >= ProtocolInfo.v1_16_0) { // ?? - this.putUUID(((MultiRecipe) recipe).getId()); - this.putUnsignedVarInt(((MultiRecipe) recipe).getNetworkId()); - break; - } - } - } - - if (protocol >= 388) { - this.putUnsignedVarInt(this.brewingEntries.size()); - for (BrewingRecipe recipe : brewingEntries) { - if (protocol >= 407) { - this.putVarInt(recipe.getInput().getNetworkId(protocol)); - } - this.putVarInt(recipe.getInput().getDamage()); - this.putVarInt(recipe.getIngredient().getNetworkId(protocol)); - if (protocol >= 407) { - this.putVarInt(recipe.getIngredient().getDamage()); - this.putVarInt(recipe.getResult().getNetworkId(protocol)); - } - this.putVarInt(recipe.getResult().getDamage()); - } - - this.putUnsignedVarInt(this.containerEntries.size()); - for (ContainerRecipe recipe : containerEntries) { - this.putVarInt(recipe.getInput().getNetworkId(protocol)); - this.putVarInt(recipe.getIngredient().getNetworkId(protocol)); - this.putVarInt(recipe.getResult().getNetworkId(protocol)); - } - - if (protocol >= ProtocolInfo.v1_17_30) { - this.putUnsignedVarInt(0); // Material reducers size - } - } - } - - this.putBoolean(cleanRecipes); - } - - @Override - public byte pid() { - return NETWORK_ID; - } - - private int writeEntryLegacy(Object entry, BinaryStream stream) { - if (entry instanceof ShapelessRecipe) { - return writeShapelessRecipeLegacy(((ShapelessRecipe) entry), stream); - } else if (entry instanceof ShapedRecipe) { - return writeShapedRecipeLegacy(((ShapedRecipe) entry), stream); - } else if (entry instanceof FurnaceRecipe) { - return writeFurnaceRecipeLegacy(((FurnaceRecipe) entry), stream); - } - return -1; - } - - private int writeShapelessRecipeLegacy(ShapelessRecipe recipe, BinaryStream stream) { - stream.putUnsignedVarInt(recipe.getIngredientCount()); - for (Item item : recipe.getIngredientList()) { - stream.putSlot(0, item); - } - stream.putUnsignedVarInt(1); - stream.putSlot(0, recipe.getResult()); - stream.putUUID(recipe.getId()); - return 0; - } - - private int writeShapedRecipeLegacy(ShapedRecipe recipe, BinaryStream stream) { - stream.putVarInt(recipe.getWidth()); - stream.putVarInt(recipe.getHeight()); - for (int z = 0; z < recipe.getHeight(); ++z) { - for (int x = 0; x < recipe.getWidth(); ++x) { - stream.putSlot(0, recipe.getIngredient(x, z)); - } - } - stream.putUnsignedVarInt(1); - stream.putSlot(0, recipe.getResult()); - stream.putUUID(recipe.getId()); - return 1; - } - - private int writeFurnaceRecipeLegacy(FurnaceRecipe recipe, BinaryStream stream) { - if (recipe.getInput().hasMeta()) { - stream.putVarInt(recipe.getInput().getId()); - stream.putVarInt(recipe.getInput().getDamage()); - stream.putSlot(0, recipe.getResult()); - return 3; - } else { - stream.putVarInt(recipe.getInput().getId()); - stream.putSlot(0, recipe.getResult()); - return 2; - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/CraftingEventPacket.java b/src/main/java/cn/nukkit/network/protocol/CraftingEventPacket.java deleted file mode 100644 index 96540500d..000000000 --- a/src/main/java/cn/nukkit/network/protocol/CraftingEventPacket.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.nukkit.network.protocol; - - -import cn.nukkit.item.Item; -import lombok.ToString; - -import java.util.UUID; - -/** - * @author Nukkit Project Team - */ -@ToString -public class CraftingEventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CRAFTING_EVENT_PACKET; - - public static final int TYPE_SHAPELESS = 0; - public static final int TYPE_SHAPED = 1; - public static final int TYPE_FURNACE = 2; - public static final int TYPE_FURNACE_DATA = 3; - public static final int TYPE_MULTI = 4; - public static final int TYPE_SHULKER_BOX = 5; - - public int windowId; - public int type; - public UUID id; - - public Item[] input; - public Item[] output; - - @Override - public void decode() { - this.windowId = this.getByte(); - this.type = (int) this.getUnsignedVarInt(); - this.id = this.getUUID(); - - int inputSize = (int) this.getUnsignedVarInt(); - this.input = new Item[Math.min(inputSize, 128)]; - for (int i = 0; i < this.input.length; ++i) { - this.input[i] = this.getSlot(this.protocol); - } - - int outputSize = (int) this.getUnsignedVarInt(); - this.output = new Item[Math.min(outputSize, 128)]; - for (int i = 0; i < this.output.length; ++i) { - this.output[i] = this.getSlot(this.protocol); - } - } - - @Override - public void encode() { - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/CreativeContentPacket.java b/src/main/java/cn/nukkit/network/protocol/CreativeContentPacket.java deleted file mode 100644 index 713f1ca9d..000000000 --- a/src/main/java/cn/nukkit/network/protocol/CreativeContentPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.item.Item; - -public class CreativeContentPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.CREATIVE_CONTENT_PACKET; - - public Item[] entries; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(entries.length); - int i = 1; //HACK around since 0 is not indexed by client - for (Item entry : entries) { - this.putUnsignedVarInt(i++); - this.putSlot(protocol, entry, protocol >= ProtocolInfo.v1_16_220); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/DataPacket.java b/src/main/java/cn/nukkit/network/protocol/DataPacket.java deleted file mode 100644 index 52dfe98ff..000000000 --- a/src/main/java/cn/nukkit/network/protocol/DataPacket.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.Server; -import cn.nukkit.network.Network; -import cn.nukkit.utils.Binary; -import cn.nukkit.utils.BinaryStream; -import cn.nukkit.utils.Zlib; -import com.nukkitx.network.raknet.RakNetReliability; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class DataPacket extends BinaryStream implements Cloneable { - - public int protocol = 999; - - public volatile boolean isEncoded = false; - private int channel = Network.CHANNEL_NONE; - - public RakNetReliability reliability = RakNetReliability.RELIABLE_ORDERED; - - public abstract byte pid(); - - public abstract void decode(); - - public abstract void encode(); - - @Override - public DataPacket reset() { - super.reset(); - if (protocol <= 274) { - this.putByte(this.pid()); - this.putShort(0); - } else { - this.putUnsignedVarInt(this.pid() & 0xff); - } - return this; - } - - public void setChannel(int channel) { - this.channel = channel; - } - - public int getChannel() { - return channel; - } - - public DataPacket clean() { - this.setBuffer(null); - this.setOffset(0); - this.isEncoded = false; - return this; - } - - @Override - public DataPacket clone() { - try { - return (DataPacket) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - - public BatchPacket compress() { - return compress(Server.getInstance().networkCompressionLevel); - } - - public BatchPacket compress(int level) { - BatchPacket batch = new BatchPacket(); - byte[][] batchPayload = new byte[2][]; - byte[] buf = getBuffer(); - batchPayload[0] = Binary.writeUnsignedVarInt(buf.length); - batchPayload[1] = buf; - byte[] data = Binary.appendBytes(batchPayload); - try { - if (protocol >= ProtocolInfo.v1_16_0) { - batch.payload = Zlib.deflateRaw(data, level); - } else { - batch.payload = Zlib.deflate(data, level); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - return batch; - } - - public final void tryEncode() { - if (!this.isEncoded) { - this.isEncoded = true; - this.encode(); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/DebugInfoPacket.java b/src/main/java/cn/nukkit/network/protocol/DebugInfoPacket.java deleted file mode 100644 index 9bcb6d535..000000000 --- a/src/main/java/cn/nukkit/network/protocol/DebugInfoPacket.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.network.protocol; - -public class DebugInfoPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.DEBUG_INFO_PACKET; - - public long entityId; - public String data; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.entityId = this.getLong(); - this.data = this.getString(); - } - - @Override - public void encode() { - this.reset(); - this.putLong(this.entityId); - this.putString(this.data); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/DisconnectPacket.java b/src/main/java/cn/nukkit/network/protocol/DisconnectPacket.java deleted file mode 100644 index 10f9c871e..000000000 --- a/src/main/java/cn/nukkit/network/protocol/DisconnectPacket.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class DisconnectPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.DISCONNECT_PACKET; - - public boolean hideDisconnectionScreen = false; - public String message; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.hideDisconnectionScreen = this.getBoolean(); - this.message = this.getString(); - } - - @Override - public void encode() { - this.reset(); - this.putBoolean(this.hideDisconnectionScreen); - if (!this.hideDisconnectionScreen) { - this.putString(this.message); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/EmoteListPacket.java b/src/main/java/cn/nukkit/network/protocol/EmoteListPacket.java deleted file mode 100644 index b78abc625..000000000 --- a/src/main/java/cn/nukkit/network/protocol/EmoteListPacket.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.network.protocol; - -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -import java.util.List; -import java.util.UUID; - -public class EmoteListPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.EMOTE_LIST_PACKET; - - public long runtimeId; - public final List pieceIds = new ObjectArrayList<>(); - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.runtimeId = this.getEntityRuntimeId(); - int size = (int) this.getUnsignedVarInt(); - if (size > 1000) { - throw new RuntimeException("Too big EmoteListPacket: " + size); - } - for (int i = 0; i < size; i++) { - UUID id = this.getUUID(); - pieceIds.add(id); - } - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(runtimeId); - this.putUnsignedVarInt(pieceIds.size()); - for (UUID id : pieceIds) { - this.putUUID(id); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/EmotePacket.java b/src/main/java/cn/nukkit/network/protocol/EmotePacket.java deleted file mode 100644 index 1f2300209..000000000 --- a/src/main/java/cn/nukkit/network/protocol/EmotePacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -public class EmotePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.EMOTE_PACKET; - - public long runtimeId; - public String emoteID; - public byte flags; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.runtimeId = this.getEntityRuntimeId(); - this.emoteID = this.getString(); - this.flags = (byte) this.getByte(); - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.runtimeId); - this.putString(this.emoteID); - this.putByte(flags); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/EntityEventPacket.java b/src/main/java/cn/nukkit/network/protocol/EntityEventPacket.java deleted file mode 100644 index 973b8dc13..000000000 --- a/src/main/java/cn/nukkit/network/protocol/EntityEventPacket.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class EntityEventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ENTITY_EVENT_PACKET; - - public static final int HURT_ANIMATION = 2; - public static final int DEATH_ANIMATION = 3; - public static final int ARM_SWING = 4; - - public static final int TAME_FAIL = 6; - public static final int TAME_SUCCESS = 7; - public static final int SHAKE_WET = 8; - public static final int USE_ITEM = 9; - public static final int EAT_GRASS_ANIMATION = 10; - public static final int FISH_HOOK_BUBBLE = 11; - public static final int FISH_HOOK_POSITION = 12; - public static final int FISH_HOOK_HOOK = 13; - public static final int FISH_HOOK_TEASE = 14; - public static final int SQUID_INK_CLOUD = 15; - public static final int ZOMBIE_VILLAGER_CURE = 16; - public static final int AMBIENT_SOUND = 17; - public static final int RESPAWN = 18; - public static final int IRON_GOLEM_OFFER_FLOWER = 19; - public static final int IRON_GOLEM_WITHDRAW_FLOWER = 20; - public static final int LOVE_PARTICLES = 21; - - public static final int WITCH_SPELL_PARTICLES = 24; - public static final int FIREWORK_EXPLOSION = 25; - - public static final int SILVERFISH_SPAWN_ANIMATION = 27; - - public static final int WITCH_DRINK_POTION = 29; - public static final int WITCH_THROW_POTION = 30; - public static final int MINECART_TNT_PRIME_FUSE = 31; - - public static final int ENCHANT = 34; - public static final int ELDER_GUARDIAN_CURSE = 35; - public static final int AGENT_ARM_SWING = 36; - public static final int ENDER_DRAGON_DEATH = 37; - public static final int DUST_PARTICLES = 38; - public static final int ARROW_SHAKE = 39; - - public static final int EATING_ITEM = 57; - - public static final int BABY_ANIMAL_FEED = 60; - public static final int DEATH_SMOKE_CLOUD = 61; - public static final int COMPLETE_TRADE = 62; - public static final int REMOVE_LEASH = 63; - - public static final int CONSUME_TOTEM = 65; - public static final int PLAYER_CHECK_TREASURE_HUNTER_ACHIEVEMENT = 66; - public static final int ENTITY_SPAWN = 67; - public static final int DRAGON_PUKE = 68; - public static final int MERGE_ITEMS = 69; - public static final int START_SWIM = 70; - public static final int BALLOON_POP = 71; - public static final int TREASURE_HUNT = 72; - public static final int AGENT_SUMMON = 73; - public static final int CHARGED_CROSSBOW = 74; - public static final int FALL = 75; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public long eid; - public int event; - public int data = 0; - - @Override - public void decode() { - this.eid = this.getEntityRuntimeId(); - this.event = this.getByte(); - this.data = this.getVarInt(); - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.putByte((byte) this.event); - this.putVarInt(this.data); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/EntityFallPacket.java b/src/main/java/cn/nukkit/network/protocol/EntityFallPacket.java deleted file mode 100644 index ddfc0cffa..000000000 --- a/src/main/java/cn/nukkit/network/protocol/EntityFallPacket.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class EntityFallPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ENTITY_FALL_PACKET; - - public long eid; - public float fallDistance; - public boolean isInVoid; - - @Override - public void decode() { - this.eid = this.getEntityRuntimeId(); - this.fallDistance = this.getLFloat(); - this.isInVoid = this.getBoolean(); - } - - @Override - public void encode() { - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/EntityPickRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/EntityPickRequestPacket.java deleted file mode 100644 index cb949fc8b..000000000 --- a/src/main/java/cn/nukkit/network/protocol/EntityPickRequestPacket.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class EntityPickRequestPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ENTITY_PICK_REQUEST_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/EventPacket.java b/src/main/java/cn/nukkit/network/protocol/EventPacket.java deleted file mode 100644 index 88b16b9fd..000000000 --- a/src/main/java/cn/nukkit/network/protocol/EventPacket.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class EventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.EVENT_PACKET; - - public long eid; - public int unknown1; // event data - public byte unknown2; // event type - - public static final int TYPE_ACHIEVEMENT_AWARDED = 0; - public static final int TYPE_ENTITY_INTERACT = 1; - public static final int TYPE_PORTAL_BUILT = 2; - public static final int TYPE_PORTAL_USED = 3; - public static final int TYPE_MOB_KILLED = 4; - public static final int TYPE_CAULDRON_USED = 5; - public static final int TYPE_PLAYER_DEATH = 6; - public static final int TYPE_BOSS_KILLED = 7; - public static final int TYPE_AGENT_COMMAND = 8; - public static final int TYPE_AGENT_CREATED = 9; - public static final int TYPE_PATTERN_REMOVED = 10; - public static final int TYPE_COMMANED_EXECUTED = 11; - public static final int TYPE_FISH_BUCKETED = 12; - public static final int TYPE_MOB_BORN = 13; - public static final int TYPE_PET_DIED = 14; - public static final int TYPE_CAULDRON_BLOCK_USED = 15; - public static final int TYPE_COMPOSTER_BLOCK_USED = 16; - public static final int TYPE_BELL_BLOCK_USED = 17; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putVarLong(this.eid); - this.putVarInt(this.unknown1); - this.putByte(this.unknown2); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/FilterTextPacket.java b/src/main/java/cn/nukkit/network/protocol/FilterTextPacket.java deleted file mode 100644 index 0d73c3b01..000000000 --- a/src/main/java/cn/nukkit/network/protocol/FilterTextPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class FilterTextPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.FILTER_TEXT_PACKET; - - public String text; - public boolean fromServer; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.text = this.getString(); - this.fromServer = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putString(this.text); - this.putBoolean(this.fromServer); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/GUIDataPickItemPacket.java b/src/main/java/cn/nukkit/network/protocol/GUIDataPickItemPacket.java deleted file mode 100644 index 2a77b7ab1..000000000 --- a/src/main/java/cn/nukkit/network/protocol/GUIDataPickItemPacket.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class GUIDataPickItemPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.GUI_DATA_PICK_ITEM_PACKET; - - public int hotbarSlot; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void encode() { - this.reset(); - this.putLInt(this.hotbarSlot); - } - - @Override - public void decode() { - this.hotbarSlot = this.getLInt(); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/GameRulesChangedPacket.java b/src/main/java/cn/nukkit/network/protocol/GameRulesChangedPacket.java deleted file mode 100644 index ddf7a8a42..000000000 --- a/src/main/java/cn/nukkit/network/protocol/GameRulesChangedPacket.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.level.GameRule; -import cn.nukkit.level.GameRules; -import lombok.ToString; - -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class GameRulesChangedPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.GAME_RULES_CHANGED_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public GameRules gameRules; - public Map gameRulesMap; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - if (gameRulesMap == null) { // For compatibility - putGameRules(protocol, gameRules); - } else { - putGameRulesMap(protocol, gameRulesMap); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/HurtArmorPacket.java b/src/main/java/cn/nukkit/network/protocol/HurtArmorPacket.java deleted file mode 100644 index 356daba0b..000000000 --- a/src/main/java/cn/nukkit/network/protocol/HurtArmorPacket.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class HurtArmorPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.HURT_ARMOR_PACKET; - - public int cause; - public int damage; - public long armorSlots; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - if (protocol >= ProtocolInfo.v1_16_0) { - this.putVarInt(this.cause); - } - this.putVarInt(this.damage); - if (protocol >= ProtocolInfo.v1_17_30) { - this.putUnsignedVarLong(this.armorSlots); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/InitiateWebSocketConnectionPacket.java b/src/main/java/cn/nukkit/network/protocol/InitiateWebSocketConnectionPacket.java deleted file mode 100644 index 529906ca7..000000000 --- a/src/main/java/cn/nukkit/network/protocol/InitiateWebSocketConnectionPacket.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class InitiateWebSocketConnectionPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.INITIATE_WEB_SOCKET_CONNECTION_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/InteractPacket.java b/src/main/java/cn/nukkit/network/protocol/InteractPacket.java deleted file mode 100644 index c51dc32c3..000000000 --- a/src/main/java/cn/nukkit/network/protocol/InteractPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class InteractPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.INTERACT_PACKET; - - public static final int ACTION_VEHICLE_EXIT = 3; - public static final int ACTION_MOUSEOVER = 4; - public static final int ACTION_OPEN_NPC = 5; - public static final int ACTION_OPEN_INVENTORY = 6; - - public int action; - public long target; - - @Override - public void decode() { - this.action = this.getByte(); - this.target = this.getEntityRuntimeId(); - } - - @Override - public void encode() { - this.reset(); - this.putByte((byte) this.action); - this.putEntityRuntimeId(this.target); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/InventoryContentPacket.java b/src/main/java/cn/nukkit/network/protocol/InventoryContentPacket.java deleted file mode 100644 index a05ebea12..000000000 --- a/src/main/java/cn/nukkit/network/protocol/InventoryContentPacket.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.item.Item; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class InventoryContentPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.INVENTORY_CONTENT_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public static final int SPECIAL_INVENTORY = 0; - public static final int SPECIAL_OFFHAND = 0x77; - public static final int SPECIAL_ARMOR = 0x78; - public static final int SPECIAL_CREATIVE = 0x79; - public static final int SPECIAL_HOTBAR = 0x7a; - public static final int SPECIAL_FIXED_INVENTORY = 0x7b; - - public int inventoryId; - public int networkId; - public Item[] slots = new Item[0]; - - @Override - public DataPacket clean() { - this.slots = new Item[0]; - return super.clean(); - } - - @Override - public void decode() { - /*this.inventoryId = (int) this.getUnsignedVarInt(); - int count = (int) this.getUnsignedVarInt(); - this.slots = new Item[count]; - - for (int s = 0; s < count && !this.feof(); ++s) { - this.slots[s] = this.getSlot(); - }*/ - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(this.inventoryId); - this.putUnsignedVarInt(this.slots.length); - for (Item slot : this.slots) { - if (protocol >= 407 && protocol < ProtocolInfo.v1_16_220) { - this.putVarInt(networkId); - } - this.putSlot(protocol, slot); - } - } - - @Override - public InventoryContentPacket clone() { - InventoryContentPacket pk = (InventoryContentPacket) super.clone(); - pk.slots = this.slots.clone(); - return pk; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/InventorySlotPacket.java b/src/main/java/cn/nukkit/network/protocol/InventorySlotPacket.java deleted file mode 100644 index 7ebc2371a..000000000 --- a/src/main/java/cn/nukkit/network/protocol/InventorySlotPacket.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.item.Item; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class InventorySlotPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.INVENTORY_SLOT_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public int inventoryId; - public int networkId; - public int slot; - public Item item; - - @Override - public void decode() { - this.inventoryId = (int) this.getUnsignedVarInt(); - this.slot = (int) this.getUnsignedVarInt(); - this.item = this.getSlot(this.protocol); - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(this.inventoryId); - this.putUnsignedVarInt(this.slot); - if (protocol >= 407 && protocol < ProtocolInfo.v1_16_220) { - this.putVarInt(networkId); - } - this.putSlot(protocol, this.item); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/InventoryTransactionPacket.java b/src/main/java/cn/nukkit/network/protocol/InventoryTransactionPacket.java deleted file mode 100644 index 8ca577d94..000000000 --- a/src/main/java/cn/nukkit/network/protocol/InventoryTransactionPacket.java +++ /dev/null @@ -1,190 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.inventory.transaction.data.ReleaseItemData; -import cn.nukkit.inventory.transaction.data.TransactionData; -import cn.nukkit.inventory.transaction.data.UseItemData; -import cn.nukkit.inventory.transaction.data.UseItemOnEntityData; -import cn.nukkit.network.protocol.types.NetworkInventoryAction; -import lombok.ToString; - -@ToString -public class InventoryTransactionPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.INVENTORY_TRANSACTION_PACKET; - - public static final int TYPE_NORMAL = 0; - public static final int TYPE_MISMATCH = 1; - public static final int TYPE_USE_ITEM = 2; - public static final int TYPE_USE_ITEM_ON_ENTITY = 3; - public static final int TYPE_RELEASE_ITEM = 4; - - public static final int USE_ITEM_ACTION_CLICK_BLOCK = 0; - public static final int USE_ITEM_ACTION_CLICK_AIR = 1; - public static final int USE_ITEM_ACTION_BREAK_BLOCK = 2; - - public static final int RELEASE_ITEM_ACTION_RELEASE = 0; //bow shoot - public static final int RELEASE_ITEM_ACTION_CONSUME = 1; //eat food, drink potion - - public static final int USE_ITEM_ON_ENTITY_ACTION_INTERACT = 0; - public static final int USE_ITEM_ON_ENTITY_ACTION_ATTACK = 1; - - - public static final int ACTION_MAGIC_SLOT_DROP_ITEM = 0; - public static final int ACTION_MAGIC_SLOT_PICKUP_ITEM = 1; - - public static final int ACTION_MAGIC_SLOT_CREATIVE_DELETE_ITEM = 0; - public static final int ACTION_MAGIC_SLOT_CREATIVE_CREATE_ITEM = 1; - - public int transactionType; - public NetworkInventoryAction[] actions; - public TransactionData transactionData; - public boolean hasNetworkIds = false; - public int legacyRequestId; - - /** - * NOTE: THESE FIELDS DO NOT EXIST IN THE PROTOCOL, it's merely used for convenience for us to easily - * determine whether we're doing a crafting or enchanting transaction. - */ - public boolean isCraftingPart = false; - public boolean isEnchantingPart = false; - public boolean isRepairItemPart = false; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void encode() { - this.reset(); - - if (protocol >= 407) { - this.putVarInt(this.legacyRequestId); - if (this.legacyRequestId > 0 && protocol >= 407) { - //TODO - } - } - - this.putUnsignedVarInt(this.transactionType); - if (protocol >= 407) { - this.putBoolean(this.hasNetworkIds); - } - this.putUnsignedVarInt(this.actions.length); - - for (NetworkInventoryAction action : this.actions) { - action.write(this); - } - - switch (this.transactionType) { - case TYPE_NORMAL: - case TYPE_MISMATCH: - break; - case TYPE_USE_ITEM: - UseItemData useItemData = (UseItemData) this.transactionData; - - this.putUnsignedVarInt(useItemData.actionType); - this.putBlockVector3(useItemData.blockPos); - this.putBlockFace(useItemData.face); - this.putVarInt(useItemData.hotbarSlot); - this.putSlot(protocol, useItemData.itemInHand); - this.putVector3f(useItemData.playerPos.asVector3f()); - this.putVector3f(useItemData.clickPos); - if (protocol >= 354) { // Idk in which version this added - this.putUnsignedVarInt(useItemData.blockRuntimeId); - } - break; - case TYPE_USE_ITEM_ON_ENTITY: - UseItemOnEntityData useItemOnEntityData = (UseItemOnEntityData) this.transactionData; - - this.putEntityRuntimeId(useItemOnEntityData.entityRuntimeId); - this.putUnsignedVarInt(useItemOnEntityData.actionType); - this.putVarInt(useItemOnEntityData.hotbarSlot); - this.putSlot(protocol, useItemOnEntityData.itemInHand); - this.putVector3f(useItemOnEntityData.playerPos.asVector3f()); - this.putVector3f(useItemOnEntityData.clickPos.asVector3f()); - break; - case TYPE_RELEASE_ITEM: - ReleaseItemData releaseItemData = (ReleaseItemData) this.transactionData; - - this.putUnsignedVarInt(releaseItemData.actionType); - this.putVarInt(releaseItemData.hotbarSlot); - this.putSlot(protocol, releaseItemData.itemInHand); - this.putVector3f(releaseItemData.headRot.asVector3f()); - break; - default: - throw new RuntimeException("Unknown transaction type " + this.transactionType); - } - } - - @Override - public void decode() { - if (protocol >= 407) { - this.legacyRequestId = this.getVarInt(); - if (legacyRequestId < -1 && (legacyRequestId & 1) == 0) { - int length = (int) this.getUnsignedVarInt(); - for (int i = 0; i < length; i++) { - this.getByte(); - int bufLen = (int) this.getUnsignedVarInt(); - this.get(bufLen); - } - - } - } - - this.transactionType = (int) this.getUnsignedVarInt(); - - if (protocol >= 407 && protocol < ProtocolInfo.v1_16_220) { - this.hasNetworkIds = this.getBoolean(); - } - - this.actions = new NetworkInventoryAction[Math.min((int) this.getUnsignedVarInt(), 4096)]; - for (int i = 0; i < this.actions.length; i++) { - this.actions[i] = new NetworkInventoryAction().read(this); - } - - switch (this.transactionType) { - case TYPE_NORMAL: - case TYPE_MISMATCH: - //Regular ComplexInventoryTransaction doesn't read any extra data - break; - case TYPE_USE_ITEM: - UseItemData itemData = new UseItemData(); - - itemData.actionType = (int) this.getUnsignedVarInt(); - itemData.blockPos = this.getBlockVector3(); - itemData.face = this.getBlockFace(); - itemData.hotbarSlot = this.getVarInt(); - itemData.itemInHand = this.getSlot(this.protocol); - itemData.playerPos = this.getVector3f().asVector3(); - itemData.clickPos = this.getVector3f(); - try { itemData.blockRuntimeId = (int) this.getUnsignedVarInt(); } catch (Exception ignore) {} - - this.transactionData = itemData; - break; - case TYPE_USE_ITEM_ON_ENTITY: - UseItemOnEntityData useItemOnEntityData = new UseItemOnEntityData(); - - useItemOnEntityData.entityRuntimeId = this.getEntityRuntimeId(); - useItemOnEntityData.actionType = (int) this.getUnsignedVarInt(); - useItemOnEntityData.hotbarSlot = this.getVarInt(); - useItemOnEntityData.itemInHand = this.getSlot(this.protocol); - useItemOnEntityData.playerPos = this.getVector3f().asVector3(); - useItemOnEntityData.clickPos = this.getVector3f().asVector3(); - - this.transactionData = useItemOnEntityData; - break; - case TYPE_RELEASE_ITEM: - ReleaseItemData releaseItemData = new ReleaseItemData(); - - releaseItemData.actionType = (int) getUnsignedVarInt(); - releaseItemData.hotbarSlot = getVarInt(); - releaseItemData.itemInHand = this.getSlot(this.protocol); - releaseItemData.headRot = this.getVector3f().asVector3(); - - this.transactionData = releaseItemData; - break; - default: - throw new RuntimeException("Unknown transaction type " + this.transactionType); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ItemComponentPacket.java b/src/main/java/cn/nukkit/network/protocol/ItemComponentPacket.java deleted file mode 100644 index 1ae1d9a7d..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ItemComponentPacket.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.network.protocol; - -public class ItemComponentPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ITEM_COMPONENT_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(0); // Send an empty array for now - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ItemFrameDropItemPacket.java b/src/main/java/cn/nukkit/network/protocol/ItemFrameDropItemPacket.java deleted file mode 100644 index a4ed3ae27..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ItemFrameDropItemPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -/** - * Created by Pub4Game on 03.07.2016. - */ -@ToString -public class ItemFrameDropItemPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ITEM_FRAME_DROP_ITEM_PACKET; - - public int x; - public int y; - public int z; - - @Override - public void decode() { - BlockVector3 v = this.getBlockVector3(); - this.z = v.z; - this.y = v.y; - this.x = v.x; - } - - @Override - public void encode() { - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/LecternUpdatePacket.java b/src/main/java/cn/nukkit/network/protocol/LecternUpdatePacket.java deleted file mode 100644 index 5b3a959f9..000000000 --- a/src/main/java/cn/nukkit/network/protocol/LecternUpdatePacket.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -@ToString -public class LecternUpdatePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.LECTERN_UPDATE_PACKET; - - public int page; - public int totalPages; - public BlockVector3 blockPosition; - public boolean dropBook; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - if (protocol < 354) { - this.page = this.getByte(); - this.blockPosition = this.getBlockVector3(); - this.dropBook = this.getBoolean(); - } else { - this.page = this.getByte(); - this.totalPages = this.getByte(); - this.blockPosition = this.getBlockVector3(); - this.dropBook = this.getBoolean(); - } - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/LevelChunkPacket.java b/src/main/java/cn/nukkit/network/protocol/LevelChunkPacket.java deleted file mode 100644 index 668731f79..000000000 --- a/src/main/java/cn/nukkit/network/protocol/LevelChunkPacket.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString(exclude = "data") -public class LevelChunkPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.FULL_CHUNK_DATA_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public int chunkX; - public int chunkZ; - public int subChunkCount; - public boolean cacheEnabled; - public long[] blobIds; - public byte[] data; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.chunkX); - this.putVarInt(this.chunkZ); - if (protocol >= 361) { - this.putUnsignedVarInt(this.subChunkCount); - this.putBoolean(cacheEnabled); - if (this.cacheEnabled) { - this.putUnsignedVarInt(blobIds.length); - for (long blobId : blobIds) { - this.putLLong(blobId); - } - } - } - this.putByteArray(this.data); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/LevelEventGenericPacket.java b/src/main/java/cn/nukkit/network/protocol/LevelEventGenericPacket.java deleted file mode 100644 index b77c0e5cb..000000000 --- a/src/main/java/cn/nukkit/network/protocol/LevelEventGenericPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; - -import java.io.IOException; -import java.nio.ByteOrder; - -public class LevelEventGenericPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.LEVEL_EVENT_GENERIC_PACKET; - - public int eventId; - public CompoundTag tag; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(eventId); - try { - this.put(NBTIO.write(tag, ByteOrder.LITTLE_ENDIAN, true)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/LevelEventPacket.java b/src/main/java/cn/nukkit/network/protocol/LevelEventPacket.java deleted file mode 100644 index 41546eb88..000000000 --- a/src/main/java/cn/nukkit/network/protocol/LevelEventPacket.java +++ /dev/null @@ -1,131 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.Vector3f; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class LevelEventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.LEVEL_EVENT_PACKET; - - public static final int EVENT_SOUND_CLICK = 1000; - public static final int EVENT_SOUND_CLICK_FAIL = 1001; - public static final int EVENT_SOUND_SHOOT = 1002; - public static final int EVENT_SOUND_DOOR = 1003; - public static final int EVENT_SOUND_FIZZ = 1004; - public static final int EVENT_SOUND_TNT = 1005; - - public static final int EVENT_SOUND_GHAST = 1007; - public static final int EVENT_SOUND_BLAZE_SHOOT = 1008; - public static final int EVENT_SOUND_GHAST_SHOOT = 1009; - public static final int EVENT_SOUND_DOOR_BUMP = 1010; - public static final int EVENT_SOUND_DOOR_CRASH = 1012; - - public static final int EVENT_SOUND_ENDERMAN_TELEPORT = 1018; - - public static final int EVENT_SOUND_ANVIL_BREAK = 1020; - public static final int EVENT_SOUND_ANVIL_USE = 1021; - public static final int EVENT_SOUND_ANVIL_FALL = 1022; - - public static final int EVENT_SOUND_ITEM_DROP = 1030; - public static final int EVENT_SOUND_ITEM_THROWN = 1031; - - public static final int EVENT_SOUND_PORTAL = 1032; - - public static final int EVENT_SOUND_ITEM_FRAME_ITEM_ADDED = 1040; - public static final int EVENT_SOUND_ITEM_FRAME_PLACED = 1041; - public static final int EVENT_SOUND_ITEM_FRAME_REMOVED = 1042; - public static final int EVENT_SOUND_ITEM_FRAME_ITEM_REMOVED = 1043; - public static final int EVENT_SOUND_ITEM_FRAME_ITEM_ROTATED = 1044; - - public static final int EVENT_SOUND_CAMERA_TAKE_PICTURE = 1050; - public static final int EVENT_SOUND_EXPERIENCE_ORB = 1051; - public static final int EVENT_SOUND_TOTEM = 1052; - - public static final int EVENT_SOUND_ARMOR_STAND_BREAK = 1060; - public static final int EVENT_SOUND_ARMOR_STAND_HIT = 1061; - public static final int EVENT_SOUND_ARMOR_STAND_FALL = 1062; - public static final int EVENT_SOUND_ARMOR_STAND_PLACE = 1063; - - public static final int EVENT_GUARDIAN_CURSE = 2006; - - public static final int EVENT_PARTICLE_BLOCK_FORCE_FIELD = 2008; - public static final int EVENT_PARTICLE_PROJECTILE_HIT = 2009; - public static final int EVENT_PARTICLE_DRAGON_EGG_TELEPORT = 2010; - - public static final int EVENT_PARTICLE_ENDERMAN_TELEPORT = 2013; - public static final int EVENT_PARTICLE_PUNCH_BLOCK = 2014; - - public static final int EVENT_SOUND_BUTTON_CLICK = 3500; - public static final int EVENT_SOUND_EXPLODE = 3501; - public static final int EVENT_CAULDRON_DYE_ARMOR = 3502; - public static final int EVENT_CAULDRON_CLEAN_ARMOR = 3503; - public static final int EVENT_CAULDRON_FILL_POTION = 3504; - public static final int EVENT_CAULDRON_TAKE_POTION = 3505; - public static final int EVENT_SOUND_SPLASH = 3506; - public static final int EVENT_CAULDRON_TAKE_WATER = 3507; - public static final int EVENT_CAULDRON_ADD_DYE = 3508; - public static final int EVENT_CAULDRON_CLEAN_BANNER = 3509; - - public static final int EVENT_PARTICLE_SHOOT = 2000; - public static final int EVENT_PARTICLE_DESTROY = 2001; - public static final int EVENT_PARTICLE_SPLASH = 2002; - public static final int EVENT_PARTICLE_EYE_DESPAWN = 2003; - public static final int EVENT_PARTICLE_SPAWN = 2004; - public static final int EVENT_PARTICLE_BONEMEAL = 2005; - - public static final int EVENT_START_RAIN = 3001; - public static final int EVENT_START_THUNDER = 3002; - public static final int EVENT_STOP_RAIN = 3003; - public static final int EVENT_STOP_THUNDER = 3004; - - public static final int EVENT_PAUSE_GAME_NO_SCREEN = 3006; - public static final int EVENT_SET_GAME_SPEED = 3007; - - public static final int EVENT_SOUND_CAULDRON = 3501; - public static final int EVENT_SOUND_CAULDRON_DYE_ARMOR = 3502; - public static final int EVENT_SOUND_CAULDRON_FILL_POTION = 3504; - public static final int EVENT_SOUND_CAULDRON_FILL_WATER = 3506; - - public static final int EVENT_BLOCK_START_BREAK = 3600; - public static final int EVENT_BLOCK_STOP_BREAK = 3601; - - public static final int EVENT_SET_DATA = 4000; - - public static final int EVENT_PLAYERS_SLEEPING = 9800; - - public static final int EVENT_ADD_PARTICLE_MASK = 0x4000; - - public int evid; - public float x = 0; - public float y = 0; - public float z = 0; - public int data = 0; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.evid = this.getVarInt(); - Vector3f v = this.getVector3f(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.data = this.getVarInt(); - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.evid); - this.putVector3f(this.x, this.y, this.z); - this.putVarInt(this.data); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacket.java b/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacket.java deleted file mode 100644 index ad1747cf7..000000000 --- a/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacket.java +++ /dev/null @@ -1,325 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.Vector3f; -import lombok.ToString; - -@ToString -public class LevelSoundEventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.LEVEL_SOUND_EVENT_PACKET; - - public static final int SOUND_ITEM_USE_ON = 0; - public static final int SOUND_HIT = 1; - public static final int SOUND_STEP = 2; - public static final int SOUND_FLY = 3; - public static final int SOUND_JUMP = 4; - public static final int SOUND_BREAK = 5; - public static final int SOUND_PLACE = 6; - public static final int SOUND_HEAVY_STEP = 7; - public static final int SOUND_GALLOP = 8; - public static final int SOUND_FALL = 9; - public static final int SOUND_AMBIENT = 10; - public static final int SOUND_AMBIENT_BABY = 11; - public static final int SOUND_AMBIENT_IN_WATER = 12; - public static final int SOUND_BREATHE = 13; - public static final int SOUND_DEATH = 14; - public static final int SOUND_DEATH_IN_WATER = 15; - public static final int SOUND_DEATH_TO_ZOMBIE = 16; - public static final int SOUND_HURT = 17; - public static final int SOUND_HURT_IN_WATER = 18; - public static final int SOUND_MAD = 19; - public static final int SOUND_BOOST = 20; - public static final int SOUND_BOW = 21; - public static final int SOUND_SQUISH_BIG = 22; - public static final int SOUND_SQUISH_SMALL = 23; - public static final int SOUND_FALL_BIG = 24; - public static final int SOUND_FALL_SMALL = 25; - public static final int SOUND_SPLASH = 26; - public static final int SOUND_FIZZ = 27; - public static final int SOUND_FLAP = 28; - public static final int SOUND_SWIM = 29; - public static final int SOUND_DRINK = 30; - public static final int SOUND_EAT = 31; - public static final int SOUND_TAKEOFF = 32; - public static final int SOUND_SHAKE = 33; - public static final int SOUND_PLOP = 34; - public static final int SOUND_LAND = 35; - public static final int SOUND_SADDLE = 36; - public static final int SOUND_ARMOR = 37; - public static final int SOUND_MOB_ARMOR_STAND_PLACE = 38; - public static final int SOUND_ADD_CHEST = 39; - public static final int SOUND_THROW = 40; - public static final int SOUND_ATTACK = 41; - public static final int SOUND_ATTACK_NODAMAGE = 42; - public static final int SOUND_ATTACK_STRONG = 43; - public static final int SOUND_WARN = 44; - public static final int SOUND_SHEAR = 45; - public static final int SOUND_MILK = 46; - public static final int SOUND_THUNDER = 47; - public static final int SOUND_EXPLODE = 48; - public static final int SOUND_FIRE = 49; - public static final int SOUND_IGNITE = 50; - public static final int SOUND_FUSE = 51; - public static final int SOUND_STARE = 52; - public static final int SOUND_SPAWN = 53; - public static final int SOUND_SHOOT = 54; - public static final int SOUND_BREAK_BLOCK = 55; - public static final int SOUND_LAUNCH = 56; - public static final int SOUND_BLAST = 57; - public static final int SOUND_LARGE_BLAST = 58; - public static final int SOUND_TWINKLE = 59; - public static final int SOUND_REMEDY = 60; - public static final int SOUND_UNFECT = 61; - public static final int SOUND_LEVELUP = 62; - public static final int SOUND_BOW_HIT = 63; - public static final int SOUND_BULLET_HIT = 64; - public static final int SOUND_EXTINGUISH_FIRE = 65; - public static final int SOUND_ITEM_FIZZ = 66; - public static final int SOUND_CHEST_OPEN = 67; - public static final int SOUND_CHEST_CLOSED = 68; - public static final int SOUND_SHULKERBOX_OPEN = 69; - public static final int SOUND_SHULKERBOX_CLOSED = 70; - public static final int SOUND_ENDERCHEST_OPEN = 71; - public static final int SOUND_ENDERCHEST_CLOSED = 72; - public static final int SOUND_POWER_ON = 73; - public static final int SOUND_POWER_OFF = 74; - public static final int SOUND_ATTACH = 75; - public static final int SOUND_DETACH = 76; - public static final int SOUND_DENY = 77; - public static final int SOUND_TRIPOD = 78; - public static final int SOUND_POP = 79; - public static final int SOUND_DROP_SLOT = 80; - public static final int SOUND_NOTE = 81; - public static final int SOUND_THORNS = 82; - public static final int SOUND_PISTON_IN = 83; - public static final int SOUND_PISTON_OUT = 84; - public static final int SOUND_PORTAL = 85; - public static final int SOUND_WATER = 86; - public static final int SOUND_LAVA_POP = 87; - public static final int SOUND_LAVA = 88; - public static final int SOUND_BURP = 89; - public static final int SOUND_BUCKET_FILL_WATER = 90; - public static final int SOUND_BUCKET_FILL_LAVA = 91; - public static final int SOUND_BUCKET_EMPTY_WATER = 92; - public static final int SOUND_BUCKET_EMPTY_LAVA = 93; - public static final int SOUND_ARMOR_EQUIP_CHAIN = 94; - public static final int SOUND_ARMOR_EQUIP_DIAMOND = 95; - public static final int SOUND_ARMOR_EQUIP_GENERIC = 96; - public static final int SOUND_ARMOR_EQUIP_GOLD = 97; - public static final int SOUND_ARMOR_EQUIP_IRON = 98; - public static final int SOUND_ARMOR_EQUIP_LEATHER = 99; - public static final int SOUND_ARMOR_EQUIP_ELYTRA = 100; - public static final int SOUND_RECORD_13 = 101; - public static final int SOUND_RECORD_CAT = 102; - public static final int SOUND_RECORD_BLOCKS = 103; - public static final int SOUND_RECORD_CHIRP = 104; - public static final int SOUND_RECORD_FAR = 105; - public static final int SOUND_RECORD_MALL = 106; - public static final int SOUND_RECORD_MELLOHI = 107; - public static final int SOUND_RECORD_STAL = 108; - public static final int SOUND_RECORD_STRAD = 109; - public static final int SOUND_RECORD_WARD = 110; - public static final int SOUND_RECORD_11 = 111; - public static final int SOUND_RECORD_WAIT = 112; - public static final int SOUND_STOP_RECORD = 113; - public static final int SOUND_GUARDIAN_FLOP = 114; - public static final int SOUND_ELDERGUARDIAN_CURSE = 115; - public static final int SOUND_MOB_WARNING = 116; - public static final int SOUND_MOB_WARNING_BABY = 117; - public static final int SOUND_TELEPORT = 118; - public static final int SOUND_SHULKER_OPEN = 119; - public static final int SOUND_SHULKER_CLOSE = 120; - public static final int SOUND_HAGGLE = 121; - public static final int SOUND_HAGGLE_YES = 122; - public static final int SOUND_HAGGLE_NO = 123; - public static final int SOUND_HAGGLE_IDLE = 124; - public static final int SOUND_CHORUSGROW = 125; - public static final int SOUND_CHORUSDEATH = 126; - public static final int SOUND_GLASS = 127; - public static final int SOUND_POTION_BREWED = 128; - public static final int SOUND_CAST_SPELL = 129; - public static final int SOUND_PREPARE_ATTACK = 130; - public static final int SOUND_PREPARE_SUMMON = 131; - public static final int SOUND_PREPARE_WOLOLO = 132; - public static final int SOUND_FANG = 133; - public static final int SOUND_CHARGE = 134; - public static final int SOUND_CAMERA_TAKE_PICTURE = 135; - public static final int SOUND_LEASHKNOT_PLACE = 136; - public static final int SOUND_LEASHKNOT_BREAK = 137; - public static final int SOUND_GROWL = 138; - public static final int SOUND_WHINE = 139; - public static final int SOUND_PANT = 140; - public static final int SOUND_PURR = 141; - public static final int SOUND_PURREOW = 142; - public static final int SOUND_DEATH_MIN_VOLUME = 143; - public static final int SOUND_DEATH_MID_VOLUME = 144; - public static final int SOUND_IMITATE_BLAZE = 145; - public static final int SOUND_IMITATE_CAVE_SPIDER = 146; - public static final int SOUND_IMITATE_CREEPER = 147; - public static final int SOUND_IMITATE_ELDER_GUARDIAN = 148; - public static final int SOUND_IMITATE_ENDER_DRAGON = 149; - public static final int SOUND_IMITATE_ENDERMAN = 150; - public static final int SOUND_IMITATE_EVOCATION_ILLAGER = 152; - public static final int SOUND_IMITATE_GHAST = 153; - public static final int SOUND_IMITATE_HUSK = 154; - public static final int SOUND_IMITATE_ILLUSION_ILLAGER = 155; - public static final int SOUND_IMITATE_MAGMA_CUBE = 156; - public static final int SOUND_IMITATE_POLAR_BEAR = 157; - public static final int SOUND_IMITATE_SHULKER = 158; - public static final int SOUND_IMITATE_SILVERFISH = 159; - public static final int SOUND_IMITATE_SKELETON = 160; - public static final int SOUND_IMITATE_SLIME = 161; - public static final int SOUND_IMITATE_SPIDER = 162; - public static final int SOUND_IMITATE_STRAY = 163; - public static final int SOUND_IMITATE_VEX = 164; - public static final int SOUND_IMITATE_VINDICATION_ILLAGER = 165; - public static final int SOUND_IMITATE_WITCH = 166; - public static final int SOUND_IMITATE_WITHER = 167; - public static final int SOUND_IMITATE_WITHER_SKELETON = 168; - public static final int SOUND_IMITATE_WOLF = 169; - public static final int SOUND_IMITATE_ZOMBIE = 170; - public static final int SOUND_IMITATE_ZOMBIE_PIGMAN = 171; - public static final int SOUND_IMITATE_ZOMBIE_VILLAGER = 172; - public static final int SOUND_BLOCK_END_PORTAL_FRAME_FILL = 173; - public static final int SOUND_BLOCK_END_PORTAL_SPAWN = 174; - public static final int SOUND_RANDOM_ANVIL_USE = 175; - public static final int SOUND_BOTTLE_DRAGONBREATH = 176; - public static final int SOUND_PORTAL_TRAVEL = 177; - public static final int SOUND_ITEM_TRIDENT_HIT = 178; - public static final int SOUND_ITEM_TRIDENT_RETURN = 179; - public static final int SOUND_ITEM_TRIDENT_RIPTIDE_1 = 180; - public static final int SOUND_ITEM_TRIDENT_RIPTIDE_2 = 181; - public static final int SOUND_ITEM_TRIDENT_RIPTIDE_3 = 182; - public static final int SOUND_ITEM_TRIDENT_THROW = 183; - public static final int SOUND_ITEM_TRIDENT_THUNDER = 184; - public static final int SOUND_ITEM_TRIDENT_HIT_GROUND = 185; - public static final int SOUND_DEFAULT = 186; - public static final int SOUND_BLOCK_FLETCHING_TABLE_USE = 187; - public static final int SOUND_ELEMCONSTRUCT_OPEN = 188; - public static final int SOUND_ICEBOMB_HIT = 189; - public static final int SOUND_BALLOONPOP = 190; - public static final int SOUND_LT_REACTION_ICEBOMB = 191; - public static final int SOUND_LT_REACTION_BLEACH = 192; - public static final int SOUND_LT_REACTION_EPASTE = 193; - public static final int SOUND_LT_REACTION_EPASTE2 = 194; - public static final int SOUND_LT_REACTION_FERTILIZER = 199; - public static final int SOUND_LT_REACTION_FIREBALL = 200; - public static final int SOUND_LT_REACTION_MGSALT = 201; - public static final int SOUND_LT_REACTION_MISCFIRE = 202; - public static final int SOUND_LT_REACTION_FIRE = 203; - public static final int SOUND_LT_REACTION_MISCEXPLOSION = 204; - public static final int SOUND_LT_REACTION_MISCMYSTICAL = 205; - public static final int SOUND_LT_REACTION_MISCMYSTICAL2 = 206; - public static final int SOUND_LT_REACTION_PRODUCT = 207; - public static final int SOUND_SPARKLER_USE = 208; - public static final int SOUND_GLOWSTICK_USE = 209; - public static final int SOUND_SPARKLER_ACTIVE = 210; - public static final int SOUND_CONVERT_TO_DROWNED = 211; - public static final int SOUND_BUCKET_FILL_FISH = 212; - public static final int SOUND_BUCKET_EMPTY_FISH = 213; - public static final int SOUND_BUBBLE_UP = 214; - public static final int SOUND_BUBBLE_DOWN = 215; - public static final int SOUND_BUBBLE_POP = 216; - public static final int SOUND_BUBBLE_UPINSIDE = 217; - public static final int SOUND_BUBBLE_DOWNINSIDE = 218; - public static final int SOUND_HURT_BABY = 219; - public static final int SOUND_DEATH_BABY = 220; - public static final int SOUND_STEP_BABY = 221; - public static final int SOUND_BORN = 223; - public static final int SOUND_BLOCK_TURTLE_EGG_BREAK = 224; - public static final int SOUND_BLOCK_TURTLE_EGG_CRACK = 225; - public static final int SOUND_BLOCK_TURTLE_EGG_HATCH = 226; - public static final int SOUND_BLOCK_TURTLE_EGG_ATTACK = 228; - public static final int SOUND_BEACON_ACTIVATE = 229; - public static final int SOUND_BEACON_AMBIENT = 230; - public static final int SOUND_BEACON_DEACTIVATE = 231; - public static final int SOUND_BEACON_POWER = 232; - public static final int SOUND_CONDUIT_ACTIVATE = 233; - public static final int SOUND_CONDUIT_AMBIENT = 234; - public static final int SOUND_CONDUIT_ATTACK = 235; - public static final int SOUND_CONDUIT_DEACTIVATE = 236; - public static final int SOUND_CONDUIT_SHORT = 237; - public static final int SOUND_SWOOP = 238; - public static final int SOUND_BLOCK_BAMBOO_SAPLING_PLACE = 239; - public static final int SOUND_PRESNEEZE = 240; - public static final int SOUND_SNEEZE = 241; - public static final int SOUND_AMBIENT_TAME = 242; - public static final int SOUND_SCARED = 243; - public static final int SOUND_BLOCK_SCAFFOLDING_CLIMB = 244; - public static final int SOUND_CROSSBOW_LOADING_START = 245; - public static final int SOUND_CROSSBOW_LOADING_MIDDLE = 246; - public static final int SOUND_CROSSBOW_LOADING_END = 247; - public static final int SOUND_CROSSBOW_SHOOT = 248; - public static final int SOUND_CROSSBOW_QUICK_CHARGE_START = 249; - public static final int SOUND_CROSSBOW_QUICK_CHARGE_MIDDLE = 250; - public static final int SOUND_CROSSBOW_QUICK_CHARGE_END = 251; - public static final int SOUND_AMBIENT_AGGRESSIVE = 252; - public static final int SOUND_AMBIENT_WORRIED = 253; - public static final int SOUND_CANT_BREED = 254; - public static final int SOUND_ITEM_SHIELD_BLOCK = 255; - public static final int SOUND_ITEM_BOOK_PUT = 256; - public static final int SOUND_BLOCK_GRINDSTONE_USE = 257; - public static final int SOUND_BLOCK_BELL_HIT = 258; - public static final int SOUND_BLOCK_CAMPFIRE_CRACKLE = 259; - public static final int SOUND_ROAR = 260; - public static final int SOUND_STUN = 261; - public static final int SOUND_BLOCK_SWEET_BERRY_BUSH_HURT = 262; - public static final int SOUND_BLOCK_SWEET_BERRY_BUSH_PICK = 263; - public static final int SOUND_BLOCK_CARTOGRAPHY_TABLE_USE = 264; - public static final int SOUND_BLOCK_STONECUTTER_USE = 265; - public static final int SOUND_BLOCK_COMPOSTER_EMPTY = 266; - public static final int SOUND_BLOCK_COMPOSTER_FILL = 267; - public static final int SOUND_BLOCK_COMPOSTER_FILL_SUCCESS = 268; - public static final int SOUND_BLOCK_COMPOSTER_READY = 269; - public static final int SOUND_BLOCK_BARREL_OPEN = 270; - public static final int SOUND_BLOCK_BARREL_CLOSE = 271; - public static final int SOUND_RAID_HORN = 272; - public static final int SOUND_BLOCK_LOOM_USE = 273; - public static final int SOUND_AMBIENT_IN_RAID = 274; - public static final int SOUND_UI_CARTOGRAPHY_TABLE_TAKE_RESULT = 275; - public static final int SOUND_UI_STONECUTTER_TAKE_RESULT = 276; - public static final int SOUND_UI_LOOM_TAKE_RESULT = 277; - public static final int SOUND_BLOCK_SMOKER_SMOKE = 278; - public static final int SOUND_BLOCK_BLASTFURNACE_FIRE_CRACKLE = 279; - public static final int SOUND_BLOCK_SMITHING_TABLE_USE = 280; - public static final int SOUND_UNDEFINED = 281; - public static final int SOUND_RECORD_PIGSTEP = 314; - - public int sound; - public float x; - public float y; - public float z; - public int extraData = -1; - public String entityIdentifier; - public boolean isBabyMob; - public boolean isGlobal; - - @Override - public void decode() { - this.sound = (int) this.getUnsignedVarInt(); - Vector3f v = this.getVector3f(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.extraData = this.getVarInt(); - this.entityIdentifier = this.getString(); - this.isBabyMob = this.getBoolean(); - this.isGlobal = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(this.sound); - this.putVector3f(this.x, this.y, this.z); - this.putVarInt(this.extraData); - this.putString(this.entityIdentifier); - this.putBoolean(this.isBabyMob); - this.putBoolean(this.isGlobal); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacketV1.java b/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacketV1.java deleted file mode 100644 index 6c56245c6..000000000 --- a/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacketV1.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.network.protocol; - - -import cn.nukkit.math.Vector3f; -import lombok.ToString; - -@ToString -public class LevelSoundEventPacketV1 extends LevelSoundEventPacket { - - public static final byte NETWORK_ID = ProtocolInfo.LEVEL_SOUND_EVENT_PACKET_V1; - - public int sound; - public float x; - public float y; - public float z; - public int extraData = -1; - public int pitch = 1; - public boolean isBabyMob; - public boolean isGlobal; - - @Override - public void decode() { - this.sound = this.getByte(); - Vector3f v = this.getVector3f(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.extraData = this.getVarInt(); - this.pitch = this.getVarInt(); - this.isBabyMob = this.getBoolean(); - this.isGlobal = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putByte((byte) this.sound); - this.putVector3f(this.x, this.y, this.z); - this.putVarInt(this.extraData); - this.putVarInt(this.pitch); - this.putBoolean(this.isBabyMob); - this.putBoolean(this.isGlobal); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacketV2.java b/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacketV2.java deleted file mode 100644 index 30955fea2..000000000 --- a/src/main/java/cn/nukkit/network/protocol/LevelSoundEventPacketV2.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.Vector3f; -import lombok.ToString; - -@ToString -public class LevelSoundEventPacketV2 extends LevelSoundEventPacket { - - public static final byte NETWORK_ID = ProtocolInfo.LEVEL_SOUND_EVENT_PACKET_V2; - - public int sound; - public float x; - public float y; - public float z; - public int extraData = -1; - public String entityIdentifier; - public boolean isBabyMob; - public boolean isGlobal; - - @Override - public void decode() { - this.sound = this.getByte(); - Vector3f v = this.getVector3f(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.extraData = this.getVarInt(); - this.entityIdentifier = this.getString(); - this.isBabyMob = this.getBoolean(); - this.isGlobal = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putByte((byte) this.sound); - this.putVector3f(this.x, this.y, this.z); - this.putVarInt(this.extraData); - this.putString(this.entityIdentifier); - this.putBoolean(this.isBabyMob); - this.putBoolean(this.isGlobal); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/LoginPacket.java b/src/main/java/cn/nukkit/network/protocol/LoginPacket.java deleted file mode 100644 index f8591126b..000000000 --- a/src/main/java/cn/nukkit/network/protocol/LoginPacket.java +++ /dev/null @@ -1,229 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.entity.data.Skin; -import cn.nukkit.utils.PersonaPiece; -import cn.nukkit.utils.PersonaPieceTint; -import cn.nukkit.utils.SerializedImage; -import cn.nukkit.utils.SkinAnimation; -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; -import lombok.ToString; - -import java.nio.charset.StandardCharsets; -import java.util.*; - -@ToString -public class LoginPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.LOGIN_PACKET; - - public String username; - private int protocol_; - public UUID clientUUID; - public long clientId; - public Skin skin; - - private static final Gson GSON = new Gson(); - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.protocol_ = this.getInt(); - if (this.protocol_ == 0) { - setOffset(getOffset() + 2); - this.protocol_ = getInt(); - } - if (ProtocolInfo.SUPPORTED_PROTOCOLS.contains(this.protocol_)) { // Avoid errors with unsupported versions - this.setBuffer(this.getByteArray(), 0); - decodeChainData(); - decodeSkinData(); - } - } - - @Override - public void encode() { - } - - public int getProtocol() { - return protocol_; - } - - private void decodeChainData() { - int size = this.getLInt(); - if (size > 3000000) { - throw new IllegalArgumentException("The chain data is too big: " + size); - } - - String data = new String(this.get(size), StandardCharsets.UTF_8); - - Map> map = GSON.fromJson(data, new MapTypeToken().getType()); - if (map.isEmpty() || !map.containsKey("chain") || map.get("chain").isEmpty()) return; - for (String c : map.get("chain")) { - JsonObject chainMap = decodeToken(c); - if (chainMap == null) continue; - if (chainMap.has("extraData")) { - JsonObject extra = chainMap.get("extraData").getAsJsonObject(); - if (extra.has("displayName")) this.username = extra.get("displayName").getAsString(); - if (extra.has("identity")) this.clientUUID = UUID.fromString(extra.get("identity").getAsString()); - } - } - } - - private void decodeSkinData() { - int size = this.getLInt(); - if (size > 3000000) { - throw new IllegalArgumentException("The skin data is too big: " + size); - } - - String data = new String(this.get(size)); - JsonObject skinToken = decodeToken(data); - - if (skinToken == null) return; - - if (skinToken.has("ClientRandomId")) { - this.clientId = skinToken.get("ClientRandomId").getAsLong(); - } - - skin = new Skin(); - - if (skinToken.has("SkinId")) { - skin.setSkinId(skinToken.get("SkinId").getAsString()); - } - - if (protocol_ < 388) { - if (skinToken.has("SkinData")) { - skin.setSkinData(Base64.getDecoder().decode(skinToken.get("SkinData").getAsString())); - } - - if (skinToken.has("CapeData")) { - skin.setCapeData(Base64.getDecoder().decode(skinToken.get("CapeData").getAsString())); - } - - if (skinToken.has("SkinGeometryName")) { - skin.setGeometryName(skinToken.get("SkinGeometryName").getAsString()); - } - - if (skinToken.has("SkinGeometry")) { - skin.setGeometryData(new String(Base64.getDecoder().decode(skinToken.get("SkinGeometry").getAsString()), StandardCharsets.UTF_8)); - } - } else { - if (skinToken.has("PlayFabID")) { - skin.setPlayFabId(skinToken.get("PlayFabID").getAsString()); - } - - if (skinToken.has("CapeId")) { - skin.setCapeId(skinToken.get("CapeId").getAsString()); - } - - skin.setSkinData(getImage(skinToken, "Skin")); - skin.setCapeData(getImage(skinToken, "Cape")); - - if (skinToken.has("PremiumSkin")) { - skin.setPremium(skinToken.get("PremiumSkin").getAsBoolean()); - } - - if (skinToken.has("PersonaSkin")) { - skin.setPersona(skinToken.get("PersonaSkin").getAsBoolean()); - } - - if (skinToken.has("CapeOnClassicSkin")) { - skin.setCapeOnClassic(skinToken.get("CapeOnClassicSkin").getAsBoolean()); - } - - if (skinToken.has("SkinResourcePatch")) { - skin.setSkinResourcePatch(new String(Base64.getDecoder().decode(skinToken.get("SkinResourcePatch").getAsString()), StandardCharsets.UTF_8)); - } - - if (skinToken.has("SkinGeometryData")) { - skin.setGeometryData(new String(Base64.getDecoder().decode(skinToken.get("SkinGeometryData").getAsString()), StandardCharsets.UTF_8)); - } - - if (skinToken.has("AnimationData")) { - skin.setAnimationData(new String(Base64.getDecoder().decode(skinToken.get("AnimationData").getAsString()), StandardCharsets.UTF_8)); - } - - if (skinToken.has("AnimatedImageData")) { - for (JsonElement element : skinToken.get("AnimatedImageData").getAsJsonArray()) { - skin.getAnimations().add(getAnimation(protocol_, element.getAsJsonObject())); - } - } - - if (skinToken.has("SkinColor")) { - skin.setSkinColor(skinToken.get("SkinColor").getAsString()); - } - - if (skinToken.has("ArmSize")) { - skin.setArmSize(skinToken.get("ArmSize").getAsString()); - } - - if (skinToken.has("PersonaPieces")) { - for (JsonElement object : skinToken.get("PersonaPieces").getAsJsonArray()) { - skin.getPersonaPieces().add(getPersonaPiece(object.getAsJsonObject())); - } - } - - if (skinToken.has("PieceTintColors")) { - for (JsonElement object : skinToken.get("PieceTintColors").getAsJsonArray()) { - skin.getTintColors().add(getTint(object.getAsJsonObject())); - } - } - } - } - - private static JsonObject decodeToken(String token) { - String[] base = token.split("\\."); - if (base.length < 2) return null; - return GSON.fromJson(new String(Base64.getDecoder().decode(base[1]), StandardCharsets.UTF_8), JsonObject.class); - } - - private static SkinAnimation getAnimation(int protocol, JsonObject element) { - float frames = element.get("Frames").getAsFloat(); - int type = element.get("Type").getAsInt(); - byte[] data = Base64.getDecoder().decode(element.get("Image").getAsString()); - int width = element.get("ImageWidth").getAsInt(); - int height = element.get("ImageHeight").getAsInt(); - int expression = protocol >= ProtocolInfo.v1_16_100 ? element.get("AnimationExpression").getAsInt() : 0; - return new SkinAnimation(new SerializedImage(width, height, data), type, frames, expression); - } - - private static SerializedImage getImage(JsonObject token, String name) { - if (token.has(name + "Data")) { - byte[] skinImage = Base64.getDecoder().decode(token.get(name + "Data").getAsString()); - if (token.has(name + "ImageHeight") && token.has(name + "ImageWidth")) { - int width = token.get(name + "ImageWidth").getAsInt(); - int height = token.get(name + "ImageHeight").getAsInt(); - return new SerializedImage(width, height, skinImage); - } else { - return SerializedImage.fromLegacy(skinImage); - } - } - return SerializedImage.EMPTY; - } - - private static PersonaPiece getPersonaPiece(JsonObject object) { - String pieceId = object.get("PieceId").getAsString(); - String pieceType = object.get("PieceType").getAsString(); - String packId = object.get("PackId").getAsString(); - boolean isDefault = object.get("IsDefault").getAsBoolean(); - String productId = object.get("ProductId").getAsString(); - return new PersonaPiece(pieceId, pieceType, packId, isDefault, productId); - } - - public static PersonaPieceTint getTint(JsonObject object) { - String pieceType = object.get("PieceType").getAsString(); - List colors = new ArrayList<>(); - for (JsonElement element : object.get("Colors").getAsJsonArray()) { - colors.add(element.getAsString()); // remove # - } - return new PersonaPieceTint(pieceType, colors); - } - - private static class MapTypeToken extends TypeToken>> { - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/network/protocol/MapCreateLockedCopyPacket.java b/src/main/java/cn/nukkit/network/protocol/MapCreateLockedCopyPacket.java deleted file mode 100644 index c6fa230f2..000000000 --- a/src/main/java/cn/nukkit/network/protocol/MapCreateLockedCopyPacket.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.network.protocol; - -public class MapCreateLockedCopyPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MAP_CREATE_LOCKED_COPY_PACKET; - - public long originalMapId; - public long newMapId; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.originalMapId = this.getVarLong(); - this.newMapId = this.getVarLong(); - } - - @Override - public void encode() { - this.reset(); - this.putVarLong(this.originalMapId); - this.putVarLong(this.newMapId); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/MapInfoRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/MapInfoRequestPacket.java deleted file mode 100644 index e5af63d03..000000000 --- a/src/main/java/cn/nukkit/network/protocol/MapInfoRequestPacket.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * Created by CreeperFace on 5.3.2017. - */ -@ToString -public class MapInfoRequestPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MAP_INFO_REQUEST_PACKET; - - public long mapId; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - mapId = this.getEntityUniqueId(); - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/MobArmorEquipmentPacket.java b/src/main/java/cn/nukkit/network/protocol/MobArmorEquipmentPacket.java deleted file mode 100644 index b34e1d408..000000000 --- a/src/main/java/cn/nukkit/network/protocol/MobArmorEquipmentPacket.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.item.Item; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class MobArmorEquipmentPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MOB_ARMOR_EQUIPMENT_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public long eid; - public Item[] slots = new Item[4]; - - @Override - public void decode() { - this.eid = this.getEntityRuntimeId(); - this.slots = new Item[4]; - this.slots[0] = this.getSlot(this.protocol); - this.slots[1] = this.getSlot(this.protocol); - this.slots[2] = this.getSlot(this.protocol); - this.slots[3] = this.getSlot(this.protocol); - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.putSlot(protocol, this.slots[0]); - this.putSlot(protocol, this.slots[1]); - this.putSlot(protocol, this.slots[2]); - this.putSlot(protocol, this.slots[3]); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/MobEffectPacket.java b/src/main/java/cn/nukkit/network/protocol/MobEffectPacket.java deleted file mode 100644 index 3495f4296..000000000 --- a/src/main/java/cn/nukkit/network/protocol/MobEffectPacket.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class MobEffectPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MOB_EFFECT_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public static final byte EVENT_ADD = 1; - public static final byte EVENT_MODIFY = 2; - public static final byte EVENT_REMOVE = 3; - - public long eid; - public int eventId; - public int effectId; - public int amplifier = 0; - public boolean particles = true; - public int duration = 0; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.putByte((byte) this.eventId); - this.putVarInt(this.effectId); - this.putVarInt(this.amplifier); - this.putBoolean(this.particles); - this.putVarInt(this.duration); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/MobEquipmentPacket.java b/src/main/java/cn/nukkit/network/protocol/MobEquipmentPacket.java deleted file mode 100644 index c24f74717..000000000 --- a/src/main/java/cn/nukkit/network/protocol/MobEquipmentPacket.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.item.Item; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class MobEquipmentPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MOB_EQUIPMENT_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public long eid; - public Item item; - public int inventorySlot; - public int hotbarSlot; - public int windowId; - - @Override - public void decode() { - this.eid = this.getEntityRuntimeId(); - this.item = this.getSlot(this.protocol); - this.inventorySlot = this.getByte(); - this.hotbarSlot = this.getByte(); - this.windowId = this.getByte(); - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.putSlot(protocol, this.item); - this.putByte((byte) this.inventorySlot); - this.putByte((byte) this.hotbarSlot); - this.putByte((byte) this.windowId); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ModalFormRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/ModalFormRequestPacket.java deleted file mode 100644 index fd2297504..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ModalFormRequestPacket.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class ModalFormRequestPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MODAL_FORM_REQUEST_PACKET; - - public int formId; - public String data; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.formId); - this.putString(this.data); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ModalFormResponsePacket.java b/src/main/java/cn/nukkit/network/protocol/ModalFormResponsePacket.java deleted file mode 100644 index 9fe336ef7..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ModalFormResponsePacket.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class ModalFormResponsePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MODAL_FORM_RESPONSE_PACKET; - - public int formId; - public String data; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.formId = this.getVarInt(); - this.data = this.getString(); // Data will be null if player close form without submit (by cross button or ESC) - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/MoveEntityAbsolutePacket.java b/src/main/java/cn/nukkit/network/protocol/MoveEntityAbsolutePacket.java deleted file mode 100644 index 79a4e5553..000000000 --- a/src/main/java/cn/nukkit/network/protocol/MoveEntityAbsolutePacket.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.Vector3f; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class MoveEntityAbsolutePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MOVE_ENTITY_ABSOLUTE_PACKET; - - public long eid; - public double x; - public double y; - public double z; - public double yaw; - public double headYaw; - public double pitch; - public boolean onGround; - public boolean teleport; - public boolean forceMoveLocalEntity; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.eid = this.getEntityRuntimeId(); - if (protocol >= 274) { - int flags = this.getByte(); - onGround = (flags & 0x01) != 0; - teleport = (flags & 0x02) != 0; - forceMoveLocalEntity = (flags & 0x04) != 0; - } - Vector3f v = this.getVector3f(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.pitch = this.getByte() * 1.40625; - this.headYaw = this.getByte() * 1.40625; - this.yaw = this.getByte() * 1.40625; - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - if (protocol >= 274) { - byte flags = 0; - if (onGround) { - flags |= 0x01; - } - if (teleport) { - flags |= 0x02; - } - if (forceMoveLocalEntity) { - flags |= 0x04; - } - this.putByte(flags); - } - this.putVector3f((float) this.x, (float) this.y, (float) this.z); - this.putByte((byte) (this.pitch / 1.40625)); - this.putByte((byte) (this.headYaw / 1.40625)); - this.putByte((byte) (this.yaw / 1.40625)); - if (protocol <= 261) { - this.putBoolean(this.onGround); - this.putBoolean(this.teleport); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/MoveEntityDeltaPacket.java b/src/main/java/cn/nukkit/network/protocol/MoveEntityDeltaPacket.java deleted file mode 100644 index 88039be87..000000000 --- a/src/main/java/cn/nukkit/network/protocol/MoveEntityDeltaPacket.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class MoveEntityDeltaPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MOVE_ENTITY_DELTA_PACKET; - - public static final int FLAG_HAS_X = 0b1; - public static final int FLAG_HAS_Y = 0b10; - public static final int FLAG_HAS_Z = 0b100; - public static final int FLAG_HAS_YAW = 0b1000; - public static final int FLAG_HAS_HEAD_YAW = 0b10000; - public static final int FLAG_HAS_PITCH = 0b100000; - - public long eid; - public int flags = 0; - public float x = 0; - public float y = 0; - public float z = 0; - public double yawDelta = 0; - public double headYawDelta = 0; - public double pitchDelta = 0; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.getEntityRuntimeId(); - this.flags = this.getByte(); - this.x = getCoordinate(FLAG_HAS_X); - this.y = getCoordinate(FLAG_HAS_Y); - this.z = getCoordinate(FLAG_HAS_Z); - this.yawDelta = getRotation(FLAG_HAS_YAW); - this.headYawDelta = getRotation(FLAG_HAS_HEAD_YAW); - this.pitchDelta = getRotation(FLAG_HAS_PITCH); - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.putByte((byte) flags); - putCoordinate(FLAG_HAS_X, this.x); - putCoordinate(FLAG_HAS_Y, this.y); - putCoordinate(FLAG_HAS_Z, this.z); - putRotation(FLAG_HAS_YAW, this.yawDelta); - putRotation(FLAG_HAS_HEAD_YAW, this.headYawDelta); - putRotation(FLAG_HAS_PITCH, this.pitchDelta); - } - - private float getCoordinate(int flag) { - if ((flags & flag) != 0) { - if (protocol < ProtocolInfo.v1_16_100) { - return (float) this.getVarInt(); - } - return this.getLFloat(); - } - return 0; - } - - private double getRotation(int flag) { - if ((flags & flag) != 0) { - return this.getByte() * 1.40625; - } - return 0d; - } - - private void putCoordinate(int flag, float value) { - if ((flags & flag) != 0) { - if (protocol < ProtocolInfo.v1_16_100) { - this.putVarInt((int) value); - } else { - this.putLFloat(value); - } - } - } - - private void putRotation(int flag, double value) { - if ((flags & flag) != 0) { - this.putByte((byte) (value / 1.40625)); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/MovePlayerPacket.java b/src/main/java/cn/nukkit/network/protocol/MovePlayerPacket.java deleted file mode 100644 index 5c8cae2dc..000000000 --- a/src/main/java/cn/nukkit/network/protocol/MovePlayerPacket.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.Vector3f; -import lombok.ToString; - -@ToString -public class MovePlayerPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.MOVE_PLAYER_PACKET; - - public static final int MODE_NORMAL = 0; - public static final int MODE_RESET = 1; - public static final int MODE_TELEPORT = 2; - public static final int MODE_PITCH = 3; - - public long eid; - public float x; - public float y; - public float z; - public float yaw; - public float headYaw; - public float pitch; - public int mode = MODE_NORMAL; - public boolean onGround; - public long ridingEid; - public int teleportCause = 0; - public int teleportItem = 0; - public long frame; - - @Override - public void decode() { - this.eid = this.getEntityRuntimeId(); - Vector3f v = this.getVector3f(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.pitch = this.getLFloat(); - this.yaw = this.getLFloat(); - this.headYaw = this.getLFloat(); - this.mode = this.getByte(); - this.onGround = this.getBoolean(); - this.ridingEid = this.getEntityRuntimeId(); - if (this.mode == MODE_TELEPORT) { - this.teleportCause = this.getLInt(); - this.teleportItem = this.getLInt(); - } - if (protocol >= ProtocolInfo.v1_16_100) { - this.frame = this.getUnsignedVarLong(); - } - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.putVector3f(this.x, this.y, this.z); - this.putLFloat(this.pitch); - this.putLFloat(this.yaw); - this.putLFloat(this.headYaw); - this.putByte((byte) this.mode); - this.putBoolean(this.onGround); - this.putEntityRuntimeId(this.ridingEid); - if (this.mode == MODE_TELEPORT) { - this.putLInt(this.teleportCause); - this.putLInt(this.teleportItem); - } - if (protocol >= ProtocolInfo.v1_16_100) { - this.putUnsignedVarLong(this.frame); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/NPCRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/NPCRequestPacket.java deleted file mode 100644 index 8869445a3..000000000 --- a/src/main/java/cn/nukkit/network/protocol/NPCRequestPacket.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class NPCRequestPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.NPC_REQUEST_PACKET; - - public long entityRuntimeId; - public RequestType requestType; - public String commandString; - public int actionType; - public String sceneName; - - public enum RequestType { - SET_ACTIONS, - EXECUTE_ACTION, - EXECUTE_CLOSING_COMMANDS, - SET_NAME, - SET_SKIN, - SET_INTERACTION_TEXT - } - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.entityRuntimeId = this.getEntityRuntimeId(); - this.requestType = RequestType.values()[this.getByte()]; - this.commandString = this.getString(); - this.actionType = this.getByte(); - if (this.protocol >= ProtocolInfo.v1_17_10) { - this.sceneName = this.getString(); - } - } - - @Override - public void encode() { - this.putEntityRuntimeId(this.entityRuntimeId); - this.putByte((byte) requestType.ordinal()); - this.putString(this.commandString); - this.putByte((byte) this.actionType); - if (this.protocol >= ProtocolInfo.v1_17_10) { - this.putString(this.sceneName); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/NetworkChunkPublisherUpdatePacket.java b/src/main/java/cn/nukkit/network/protocol/NetworkChunkPublisherUpdatePacket.java deleted file mode 100644 index 73575ed0e..000000000 --- a/src/main/java/cn/nukkit/network/protocol/NetworkChunkPublisherUpdatePacket.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -@ToString -public class NetworkChunkPublisherUpdatePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.NETWORK_CHUNK_PUBLISHER_UPDATE_PACKET; - - public BlockVector3 position; - public int radius; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.position = this.getSignedBlockPosition(); - this.radius = (int) this.getUnsignedVarInt(); - } - - @Override - public void encode() { - this.reset(); - this.putSignedBlockPosition(position); - this.putUnsignedVarInt(radius); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/NetworkStackLatencyPacket.java b/src/main/java/cn/nukkit/network/protocol/NetworkStackLatencyPacket.java deleted file mode 100644 index 96339ff3e..000000000 --- a/src/main/java/cn/nukkit/network/protocol/NetworkStackLatencyPacket.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class NetworkStackLatencyPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.NETWORK_STACK_LATENCY_PACKET; - - public long timestamp; - public boolean unknownBool; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - timestamp = this.getLLong(); - } - - @Override - public void encode() { - this.reset(); - this.putLLong(timestamp); - if (protocol >= 332) { - this.putBoolean(unknownBool); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/OnScreenTextureAnimationPacket.java b/src/main/java/cn/nukkit/network/protocol/OnScreenTextureAnimationPacket.java deleted file mode 100644 index 6317d8352..000000000 --- a/src/main/java/cn/nukkit/network/protocol/OnScreenTextureAnimationPacket.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.network.protocol; - -public class OnScreenTextureAnimationPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.ON_SCREEN_TEXTURE_ANIMATION_PACKET; - - public int effectId; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.effectId = this.getLInt(); - } - - @Override - public void encode() { - this.reset(); - this.putLInt(this.effectId); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PacketViolationWarningPacket.java b/src/main/java/cn/nukkit/network/protocol/PacketViolationWarningPacket.java deleted file mode 100644 index 05b57ec2c..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PacketViolationWarningPacket.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class PacketViolationWarningPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PACKET_VIOLATION_WARNING_PACKET; - - public PacketViolationType type; - public PacketViolationSeverity severity; - public int packetId; - public String context; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.type = PacketViolationType.values()[this.getVarInt() + 1]; - this.severity = PacketViolationSeverity.values()[this.getVarInt()]; - this.packetId = this.getVarInt(); - this.context = this.getString(); - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.type.ordinal() - 1); - this.putVarInt(this.severity.ordinal()); - this.putVarInt(this.packetId); - this.putString(this.context); - } - - public enum PacketViolationType { - UNKNOWN, - MALFORMED_PACKET - } - - public enum PacketViolationSeverity { - UNKNOWN, - WARNING, - FINAL_WARNING, - TERMINATING_CONNECTION - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlaySoundPacket.java b/src/main/java/cn/nukkit/network/protocol/PlaySoundPacket.java deleted file mode 100644 index 3ca718e4f..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlaySoundPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class PlaySoundPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAY_SOUND_PACKET; - - public String name; - public int x; - public int y; - public int z; - public float volume; - public float pitch; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putString(this.name); - this.putBlockVector3(this.x << 3, this.y << 3, this.z << 3); - this.putLFloat(this.volume); - this.putLFloat(this.pitch); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlayStatusPacket.java b/src/main/java/cn/nukkit/network/protocol/PlayStatusPacket.java deleted file mode 100644 index 556eb4943..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlayStatusPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class PlayStatusPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAY_STATUS_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public static final int LOGIN_SUCCESS = 0; - public static final int LOGIN_FAILED_CLIENT = 1; - public static final int LOGIN_FAILED_SERVER = 2; - public static final int PLAYER_SPAWN = 3; - public static final int LOGIN_FAILED_INVALID_TENANT = 4; - public static final int LOGIN_FAILED_VANILLA_EDU = 5; - public static final int LOGIN_FAILED_EDU_VANILLA = 6; - public static final int LOGIN_FAILED_SERVER_FULL = 7; - - public int status; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putInt(this.status); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlayerActionPacket.java b/src/main/java/cn/nukkit/network/protocol/PlayerActionPacket.java deleted file mode 100644 index d0fe6adcd..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlayerActionPacket.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.BlockVector3; -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class PlayerActionPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAYER_ACTION_PACKET; - - public static final int ACTION_START_BREAK = 0; - public static final int ACTION_ABORT_BREAK = 1; - public static final int ACTION_STOP_BREAK = 2; - public static final int ACTION_GET_UPDATED_BLOCK = 3; - public static final int ACTION_DROP_ITEM = 4; - public static final int ACTION_START_SLEEPING = 5; - public static final int ACTION_STOP_SLEEPING = 6; - public static final int ACTION_RESPAWN = 7; - public static final int ACTION_JUMP = 8; - public static final int ACTION_START_SPRINT = 9; - public static final int ACTION_STOP_SPRINT = 10; - public static final int ACTION_START_SNEAK = 11; - public static final int ACTION_STOP_SNEAK = 12; - public static final int ACTION_DIMENSION_CHANGE_REQUEST = 13; //sent when dying in different dimension - public static final int ACTION_DIMENSION_CHANGE_ACK = 14; //sent when spawning in a different dimension to tell the server we spawned - public static final int ACTION_START_GLIDE = 15; - public static final int ACTION_STOP_GLIDE = 16; - public static final int ACTION_BUILD_DENIED = 17; - public static final int ACTION_CONTINUE_BREAK = 18; - public static final int ACTION_CHANGE_SKIN = 19; - public static final int ACTION_SET_ENCHANTMENT_SEED = 20; - public static final int ACTION_START_SWIMMING = 21; - public static final int ACTION_STOP_SWIMMING = 22; - public static final int ACTION_START_SPIN_ATTACK = 23; - public static final int ACTION_STOP_SPIN_ATTACK = 24; - - public long entityId; - public int action; - public int x; - public int y; - public int z; - public int face; - - @Override - public void decode() { - this.entityId = this.getEntityRuntimeId(); - this.action = this.getVarInt(); - BlockVector3 v = this.getBlockVector3(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.face = this.getVarInt(); - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.entityId); - this.putVarInt(this.action); - this.putBlockVector3(this.x, this.y, this.z); - this.putVarInt(this.face); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlayerArmorDamagePacket.java b/src/main/java/cn/nukkit/network/protocol/PlayerArmorDamagePacket.java deleted file mode 100644 index 2babab4fa..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlayerArmorDamagePacket.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.network.protocol; - -import java.util.EnumSet; -import java.util.Set; - -public class PlayerArmorDamagePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAYER_ARMOR_DAMAGE_PACKET; - - public final Set flags = EnumSet.noneOf(PlayerArmorDamageFlag.class); - public final int[] damage = new int[4]; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - int flagsval = this.getByte(); - for (int i = 0; i < 4; i++) { - if ((flagsval & (1 << i)) != 0) { - this.flags.add(PlayerArmorDamageFlag.values()[i]); - this.damage[i] = this.getVarInt(); - } - } - } - - @Override - public void encode() { - this.reset(); - int outflags = 0; - for (PlayerArmorDamageFlag flag : this.flags) { - outflags |= 1 << flag.ordinal(); - } - this.putByte((byte) outflags); - - for (PlayerArmorDamageFlag flag : this.flags) { - this.putVarInt(this.damage[flag.ordinal()]); - } - } - - public enum PlayerArmorDamageFlag { - HELMET, - CHESTPLATE, - LEGGINGS, - BOOTS - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlayerEnchantOptionsPacket.java b/src/main/java/cn/nukkit/network/protocol/PlayerEnchantOptionsPacket.java deleted file mode 100644 index 249ac05b1..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlayerEnchantOptionsPacket.java +++ /dev/null @@ -1,110 +0,0 @@ -package cn.nukkit.network.protocol; - -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import lombok.Value; - -import java.util.ArrayList; -import java.util.List; - -public class PlayerEnchantOptionsPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAYER_ENCHANT_OPTIONS_PACKET; - - public final List options = new ArrayList<>(); - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - int size = (int) this.getUnsignedVarInt(); - if (size > 1000) { - throw new RuntimeException("EnchantOptions too big: " + size); - } - for (int i = 0; i < size; i++) { - int minLevel = this.getVarInt(); - int slot = this.getInt(); - - int eSize = (int) this.getUnsignedVarInt(); - if (eSize > 1000) { - throw new RuntimeException("Enchantment list too big: " + eSize); - } - List list1 = new ObjectArrayList<>(); - for (int j = 0; j < eSize; j++) { - EnchantData data = new EnchantData(this.getByte(), this.getByte()); - list1.add(data); - } - - eSize = (int) this.getUnsignedVarInt(); - if (eSize > 1000) { - throw new RuntimeException("Enchantment list too big: " + eSize); - } - List list2 = new ObjectArrayList<>(); - for (int j = 0; j < eSize; j++) { - EnchantData data = new EnchantData(this.getByte(), this.getByte()); - list2.add(data); - } - - eSize = (int) this.getUnsignedVarInt(); - if (eSize > 1000) { - throw new RuntimeException("Enchantment list too big: " + eSize); - } - List list3 = new ObjectArrayList<>(); - for (int j = 0; j < eSize; j++) { - EnchantData data = new EnchantData(this.getByte(), this.getByte()); - list3.add(data); - } - String enchantName = this.getString(); - int eNetId = (int) this.getUnsignedVarInt(); - this.options.add(new EnchantOptionData(minLevel, slot, list1, list2, list3, enchantName, eNetId)); - } - - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(this.options.size()); - for (EnchantOptionData option : this.options) { - this.putVarInt(option.getMinLevel()); - this.putInt(option.getPrimarySlot()); - this.putUnsignedVarInt(option.getEnchants0().size()); - for (EnchantData data : option.getEnchants0()) { - this.putByte((byte) data.getType()); - this.putByte((byte) data.getLevel()); - } - this.putUnsignedVarInt(option.getEnchants1().size()); - for (EnchantData data : option.getEnchants1()) { - this.putByte((byte) data.getType()); - this.putByte((byte) data.getLevel()); - } - this.putUnsignedVarInt(option.getEnchants2().size()); - for (EnchantData data : option.getEnchants2()) { - this.putByte((byte) data.getType()); - this.putByte((byte) data.getLevel()); - } - this.putString(option.getEnchantName()); - this.putUnsignedVarInt(option.getEnchantNetId()); - } - - } - - @Value - public class EnchantOptionData { - private final int minLevel; - private final int primarySlot; - private final List enchants0; - private final List enchants1; - private final List enchants2; - private final String enchantName; - private final int enchantNetId; - } - - @Value - public class EnchantData { - private final int type; - private final int level; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlayerHotbarPacket.java b/src/main/java/cn/nukkit/network/protocol/PlayerHotbarPacket.java deleted file mode 100644 index c0752ff8e..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlayerHotbarPacket.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.network.protocol.types.ContainerIds; -import lombok.ToString; - -@ToString -public class PlayerHotbarPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAYER_HOTBAR_PACKET; - - public int selectedHotbarSlot; - public int windowId = ContainerIds.INVENTORY; - public boolean selectHotbarSlot = true; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.selectedHotbarSlot = (int) this.getUnsignedVarInt(); - this.windowId = this.getByte(); - this.selectHotbarSlot = this.getBoolean(); - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(this.selectedHotbarSlot); - this.putByte((byte) this.windowId); - if (protocol == 201) { - this.putUnsignedVarInt(0); - } - this.putBoolean(this.selectHotbarSlot); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlayerInputPacket.java b/src/main/java/cn/nukkit/network/protocol/PlayerInputPacket.java deleted file mode 100644 index 50fa59fa9..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlayerInputPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class PlayerInputPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAYER_INPUT_PACKET; - - public float motionX; - public float motionY; - - public boolean jumping; - public boolean sneaking; - - @Override - public void decode() { - this.motionX = this.getLFloat(); - this.motionY = this.getLFloat(); - this.jumping = this.getBoolean(); - this.sneaking = this.getBoolean(); - } - - @Override - public void encode() { - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlayerListPacket.java b/src/main/java/cn/nukkit/network/protocol/PlayerListPacket.java deleted file mode 100644 index e54e715c8..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlayerListPacket.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.entity.data.Skin; -import lombok.ToString; - -import java.util.UUID; - -/** - * @author Nukkit Project Team - */ -@ToString -public class PlayerListPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAYER_LIST_PACKET; - - public static final byte TYPE_ADD = 0; - public static final byte TYPE_REMOVE = 1; - - public byte type; - public Entry[] entries = new Entry[0]; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putByte(this.type); - this.putUnsignedVarInt(this.entries.length); - switch (type) { - case TYPE_ADD: - for (Entry entry : this.entries) { - if (protocol >= 223) { - this.putUUID(entry.uuid); - } - this.putVarLong(entry.entityId); - this.putString(entry.name); - if (protocol >= 223 && protocol <= 282) { - this.putString(""); - this.putVarInt(0); - } - if (protocol < 388) { - this.putSkin(protocol, entry.skin); - if (protocol < 223) { - this.putByteArray(new byte[0]); - } - } - this.putString(entry.xboxUserId); - if (protocol >= 223) { - this.putString(entry.platformChatId); - if (protocol >= 388) { - this.putLInt(entry.buildPlatform); - this.putSkin(protocol, entry.skin); - this.putBoolean(entry.isTeacher); - this.putBoolean(entry.isHost); - } - } - } - if (protocol >= ProtocolInfo.v1_14_60) { - for (Entry entry : this.entries) { // WTF Mojang - this.putBoolean(true); - } - } - break; - case TYPE_REMOVE: - for (Entry entry : this.entries) { - if (protocol >= 223) { - this.putUUID(entry.uuid); - } - } - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } - - @ToString - public static class Entry { - - public final UUID uuid; - public long entityId = 0; - public String name = ""; - public Skin skin; - public String xboxUserId = ""; - public String platformChatId = ""; - public int buildPlatform = -1; - public boolean isTeacher; - public boolean isHost; - - public Entry(UUID uuid) { - this.uuid = uuid; - } - - public Entry(UUID uuid, long entityId, String name, Skin skin) { - this(uuid, entityId, name, skin, ""); - } - - public Entry(UUID uuid, long entityId, String name, Skin skin, String xboxUserId) { - this.uuid = uuid; - this.entityId = entityId; - this.name = name; - this.skin = skin; - this.xboxUserId = xboxUserId == null ? "" : xboxUserId; - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/PlayerSkinPacket.java b/src/main/java/cn/nukkit/network/protocol/PlayerSkinPacket.java deleted file mode 100644 index 4618e774a..000000000 --- a/src/main/java/cn/nukkit/network/protocol/PlayerSkinPacket.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.entity.data.Skin; -import lombok.ToString; - -import java.util.UUID; - -@ToString -public class PlayerSkinPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.PLAYER_SKIN_PACKET; - - public UUID uuid; - public Skin skin; - public String newSkinName; - public String oldSkinName; - public boolean premium; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - uuid = getUUID(); - if (protocol < 388) { - skin = new Skin(); - skin.setSkinId(getString()); - newSkinName = getString(); - oldSkinName = getString(); - skin.setSkinData(getByteArray()); - skin.setCapeData(getByteArray()); - skin.setGeometryName(getString()); - skin.setGeometryData(getString()); - if (protocol > 274) { - premium = getBoolean(); - } - } else { - skin = getSkin(protocol); - newSkinName = getString(); - oldSkinName = getString(); - if (!feof()) { - skin.setTrusted(getBoolean()); - } - } - } - - @Override - public void encode() { - reset(); - putUUID(uuid); - if (protocol < 388) { - putString(skin.isLegacySlim ? "geometry.humanoid.customSlim" : "geometry.humanoid.custom"); - putString(newSkinName); - putString(oldSkinName); - putByteArray(skin.getSkinData().data); - putByteArray(skin.getCapeData().data); - putString(skin.isLegacySlim ? "geometry.humanoid.customSlim" : "geometry.humanoid.custom"); - putString(skin.getGeometryData()); - if (protocol > 274) { - putBoolean(premium); - } - } else { - putSkin(protocol, skin); - putString(newSkinName); - putString(oldSkinName); - if (protocol >= ProtocolInfo.v1_14_60) { - putBoolean(skin.isTrusted()); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/network/protocol/ProtocolInfo.java b/src/main/java/cn/nukkit/network/protocol/ProtocolInfo.java deleted file mode 100644 index 64617d734..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ProtocolInfo.java +++ /dev/null @@ -1,228 +0,0 @@ -package cn.nukkit.network.protocol; - -import com.google.common.primitives.Ints; - -import java.util.List; - -/** - * @author MagicDroidX & iNevet - * Nukkit Project - */ -public interface ProtocolInfo { - - int v1_2_0 = 137; - int v1_2_5_11 = 140; - int v1_2_5 = 141; - int v1_2_6 = 150; - int v1_2_7 = 160; - int v1_2_10 = 201; - int v1_2_13 = 223; - int v1_2_13_11 = 224; - int v1_4_0 = 261; - int v1_5_0 = 274; - int v1_6_0_5 = 281; - int v1_6_0 = 282; - int v1_7_0 = 291; - int v1_8_0 = 313; - int v1_9_0 = 332; - int v1_10_0 = 340; - int v1_11_0 = 354; - int v1_12_0 = 361; - int v1_13_0 = 388; - int v1_14_0 = 389; - int v1_14_60 = 390; - int v1_16_0 = 407; - int v1_16_20 = 408; - int v1_16_100_0 = 409; - int v1_16_100_51 = 410; - int v1_16_100_52 = 411; - int v1_16_100 = 419; - int v1_16_200_51 = 420; - int v1_16_200 = 422; - int v1_16_210_50 = 423; - int v1_16_210_53 = 424; - int v1_16_210 = 428; - int v1_16_220 = 431; - int v1_16_230_50 = 433; - int v1_16_230 = 434; - int v1_16_230_54 = 435; - int v1_17_0 = 440; - int v1_17_10 = 448; - int v1_17_20_20 = 453; - int v1_17_30 = 465; - int v1_17_40 = 471; - - int CURRENT_PROTOCOL = v1_17_40; - - List SUPPORTED_PROTOCOLS = Ints.asList( - v1_2_0, v1_2_5_11, v1_2_5, v1_2_6, v1_2_7, v1_2_10, v1_2_13, v1_2_13_11, v1_4_0, v1_5_0, v1_6_0_5, v1_6_0, v1_7_0, - v1_8_0, v1_9_0, v1_10_0, v1_11_0, v1_12_0, v1_13_0, v1_14_0, v1_14_60, v1_16_0, v1_16_20, v1_16_100_0, v1_16_100_51, - v1_16_100_52, v1_16_100, v1_16_200_51, v1_16_200, v1_16_210_50, v1_16_210_53, v1_16_210, v1_16_220, v1_16_230_50, v1_16_230, - v1_16_230_54, v1_17_0, v1_17_10, v1_17_20_20, v1_17_30, v1_17_40 - ); - - String MINECRAFT_VERSION_NETWORK = "1.17.40"; - String MINECRAFT_VERSION = 'v' + MINECRAFT_VERSION_NETWORK; - - byte BATCH_PACKET = (byte) 0xff; - byte LOGIN_PACKET = 0x01; - byte PLAY_STATUS_PACKET = 0x02; - byte SERVER_TO_CLIENT_HANDSHAKE_PACKET = 0x03; - byte CLIENT_TO_SERVER_HANDSHAKE_PACKET = 0x04; - byte DISCONNECT_PACKET = 0x05; - byte RESOURCE_PACKS_INFO_PACKET = 0x06; - byte RESOURCE_PACK_STACK_PACKET = 0x07; - byte RESOURCE_PACK_CLIENT_RESPONSE_PACKET = 0x08; - byte TEXT_PACKET = 0x09; - byte SET_TIME_PACKET = 0x0a; - byte START_GAME_PACKET = 0x0b; - byte ADD_PLAYER_PACKET = 0x0c; - byte ADD_ENTITY_PACKET = 0x0d; - byte REMOVE_ENTITY_PACKET = 0x0e; - byte ADD_ITEM_ENTITY_PACKET = 0x0f; - byte TAKE_ITEM_ENTITY_PACKET = 0x11; - byte MOVE_ENTITY_ABSOLUTE_PACKET = 0x12; - byte MOVE_PLAYER_PACKET = 0x13; - byte RIDER_JUMP_PACKET = 0x14; - byte UPDATE_BLOCK_PACKET = 0x15; - byte ADD_PAINTING_PACKET = 0x16; - byte TICK_SYNC_PACKET = 0x17; - byte LEVEL_SOUND_EVENT_PACKET_V1 = 0x18; - byte LEVEL_EVENT_PACKET = 0x19; - byte BLOCK_EVENT_PACKET = 0x1a; - byte ENTITY_EVENT_PACKET = 0x1b; - byte MOB_EFFECT_PACKET = 0x1c; - byte UPDATE_ATTRIBUTES_PACKET = 0x1d; - byte INVENTORY_TRANSACTION_PACKET = 0x1e; - byte MOB_EQUIPMENT_PACKET = 0x1f; - byte MOB_ARMOR_EQUIPMENT_PACKET = 0x20; - byte INTERACT_PACKET = 0x21; - byte BLOCK_PICK_REQUEST_PACKET = 0x22; - byte ENTITY_PICK_REQUEST_PACKET = 0x23; - byte PLAYER_ACTION_PACKET = 0x24; - byte ENTITY_FALL_PACKET = 0x25; - byte HURT_ARMOR_PACKET = 0x26; - byte SET_ENTITY_DATA_PACKET = 0x27; - byte SET_ENTITY_MOTION_PACKET = 0x28; - byte SET_ENTITY_LINK_PACKET = 0x29; - byte SET_HEALTH_PACKET = 0x2a; - byte SET_SPAWN_POSITION_PACKET = 0x2b; - byte ANIMATE_PACKET = 0x2c; - byte RESPAWN_PACKET = 0x2d; - byte CONTAINER_OPEN_PACKET = 0x2e; - byte CONTAINER_CLOSE_PACKET = 0x2f; - byte PLAYER_HOTBAR_PACKET = 0x30; - byte INVENTORY_CONTENT_PACKET = 0x31; - byte INVENTORY_SLOT_PACKET = 0x32; - byte CONTAINER_SET_DATA_PACKET = 0x33; - byte CRAFTING_DATA_PACKET = 0x34; - byte CRAFTING_EVENT_PACKET = 0x35; - byte GUI_DATA_PICK_ITEM_PACKET = 0x36; - byte ADVENTURE_SETTINGS_PACKET = 0x37; - byte BLOCK_ENTITY_DATA_PACKET = 0x38; - byte PLAYER_INPUT_PACKET = 0x39; - byte FULL_CHUNK_DATA_PACKET = 0x3a; - byte SET_COMMANDS_ENABLED_PACKET = 0x3b; - byte SET_DIFFICULTY_PACKET = 0x3c; - byte CHANGE_DIMENSION_PACKET = 0x3d; - byte SET_PLAYER_GAME_TYPE_PACKET = 0x3e; - byte PLAYER_LIST_PACKET = 0x3f; - byte SIMPLE_EVENT_PACKET = 0x40; - byte EVENT_PACKET = 0x41; - byte SPAWN_EXPERIENCE_ORB_PACKET = 0x42; - byte CLIENTBOUND_MAP_ITEM_DATA_PACKET = 0x43; - byte MAP_INFO_REQUEST_PACKET = 0x44; - byte REQUEST_CHUNK_RADIUS_PACKET = 0x45; - byte CHUNK_RADIUS_UPDATED_PACKET = 0x46; - byte ITEM_FRAME_DROP_ITEM_PACKET = 0x47; - byte GAME_RULES_CHANGED_PACKET = 0x48; - byte CAMERA_PACKET = 0x49; - byte BOSS_EVENT_PACKET = 0x4a; - byte SHOW_CREDITS_PACKET = 0x4b; - byte AVAILABLE_COMMANDS_PACKET = 0x4c; - byte COMMAND_REQUEST_PACKET = 0x4d; - byte COMMAND_BLOCK_UPDATE_PACKET = 0x4e; - byte COMMAND_OUTPUT_PACKET = 0x4f; - byte UPDATE_TRADE_PACKET = 0x50; - byte UPDATE_EQUIPMENT_PACKET = 0x51; - byte RESOURCE_PACK_DATA_INFO_PACKET = 0x52; - byte RESOURCE_PACK_CHUNK_DATA_PACKET = 0x53; - byte RESOURCE_PACK_CHUNK_REQUEST_PACKET = 0x54; - byte TRANSFER_PACKET = 0x55; - byte PLAY_SOUND_PACKET = 0x56; - byte STOP_SOUND_PACKET = 0x57; - byte SET_TITLE_PACKET = 0x58; - byte ADD_BEHAVIOR_TREE_PACKET = 0x59; - byte STRUCTURE_BLOCK_UPDATE_PACKET = 0x5a; - byte SHOW_STORE_OFFER_PACKET = 0x5b; - byte PURCHASE_RECEIPT_PACKET = 0x5c; - byte PLAYER_SKIN_PACKET = 0x5d; - byte SUB_CLIENT_LOGIN_PACKET = 0x5e; - byte INITIATE_WEB_SOCKET_CONNECTION_PACKET = 0x5f; - byte SET_LAST_HURT_BY_PACKET = 0x60; - byte BOOK_EDIT_PACKET = 0x61; - byte NPC_REQUEST_PACKET = 0x62; - byte PHOTO_TRANSFER_PACKET = 0x63; - byte MODAL_FORM_REQUEST_PACKET = 0x64; - byte MODAL_FORM_RESPONSE_PACKET = 0x65; - byte SERVER_SETTINGS_REQUEST_PACKET = 0x66; - byte SERVER_SETTINGS_RESPONSE_PACKET = 0x67; - byte SHOW_PROFILE_PACKET = 0x68; - byte SET_DEFAULT_GAME_TYPE_PACKET = 0x69; - byte REMOVE_OBJECTIVE_PACKET = 0x6a; - byte SET_DISPLAY_OBJECTIVE_PACKET = 0x6b; - byte SET_SCORE_PACKET = 0x6c; - byte LAB_TABLE_PACKET = 0x6d; - byte UPDATE_BLOCK_SYNCED_PACKET = 0x6e; - byte MOVE_ENTITY_DELTA_PACKET = 0x6f; - byte SET_SCOREBOARD_IDENTITY_PACKET = 0x70; - byte SET_LOCAL_PLAYER_AS_INITIALIZED_PACKET = 0x71; - byte UPDATE_SOFT_ENUM_PACKET = 0x72; - byte NETWORK_STACK_LATENCY_PACKET = 0x73; - byte SCRIPT_CUSTOM_EVENT_PACKET = 0x75; - byte SPAWN_PARTICLE_EFFECT_PACKET = 0x76; - byte AVAILABLE_ENTITY_IDENTIFIERS_PACKET = 0x77; - byte LEVEL_SOUND_EVENT_PACKET_V2 = 0x78; - byte NETWORK_CHUNK_PUBLISHER_UPDATE_PACKET = 0x79; - byte BIOME_DEFINITION_LIST_PACKET = 0x7a; - byte LEVEL_SOUND_EVENT_PACKET = 0x7b; - byte LEVEL_EVENT_GENERIC_PACKET = 0x7c; - byte LECTERN_UPDATE_PACKET = 0x7d; - byte VIDEO_STREAM_CONNECT_PACKET = 0x7e; - byte CLIENT_CACHE_STATUS_PACKET = (byte) 0x81; - byte ON_SCREEN_TEXTURE_ANIMATION_PACKET = (byte) 0x82; - byte MAP_CREATE_LOCKED_COPY_PACKET = (byte) 0x83; - byte STRUCTURE_TEMPLATE_DATA_EXPORT_REQUEST = (byte) 0x84; - byte STRUCTURE_TEMPLATE_DATA_EXPORT_RESPONSE = (byte) 0x85; - byte UPDATE_BLOCK_PROPERTIES = (byte) 0x86; - byte CLIENT_CACHE_BLOB_STATUS_PACKET = (byte) 0x87; - byte CLIENT_CACHE_MISS_RESPONSE_PACKET = (byte) 0x88; - byte EDUCATION_SETTINGS_PACKET = (byte) 0x89; - byte EMOTE_PACKET = (byte) 0x8a; - byte MULTIPLAYER_SETTINGS_PACKET = (byte) 0x8b; - byte SETTINGS_COMMAND_PACKET = (byte) 0x8c; - byte ANVIL_DAMAGE_PACKET = (byte) 0x8d; - byte COMPLETED_USING_ITEM_PACKET = (byte) 0x8e; - byte NETWORK_SETTINGS_PACKET = (byte) 0x8f; - byte PLAYER_AUTH_INPUT_PACKET = (byte) 0x90; - byte CREATIVE_CONTENT_PACKET = (byte) 0x91; - byte PLAYER_ENCHANT_OPTIONS_PACKET = (byte) 0x92; - byte ITEM_STACK_REQUEST_PACKET = (byte) 0x93; - byte ITEM_STACK_RESPONSE_PACKET = (byte) 0x94; - byte PLAYER_ARMOR_DAMAGE_PACKET = (byte) 0x95; - byte CODE_BUILDER_PACKET = (byte) 0x96; - byte UPDATE_PLAYER_GAME_TYPE_PACKET = (byte) 0x97; - byte EMOTE_LIST_PACKET = (byte) 0x98; - byte POS_TRACKING_SERVER_BROADCAST_PACKET = (byte) 0x99; - byte POS_TRACKING_CLIENT_REQUEST_PACKET = (byte) 0x9a; - byte DEBUG_INFO_PACKET = (byte) 0x9b; - byte PACKET_VIOLATION_WARNING_PACKET = (byte) 0x9c; - byte MOTION_PREDICTION_HINTS_PACKET = (byte) 0x9d; - byte ANIMATE_ENTITY_PACKET = (byte) 0x9e; - byte CAMERA_SHAKE_PACKET = (byte) 0x9f; - byte PLAYER_FOG_PACKET = (byte) 0xa0; - byte CORRECT_PLAYER_MOVE_PREDICTION_PACKET = (byte) 0xa1; - byte ITEM_COMPONENT_PACKET = (byte) 0xa2; - byte FILTER_TEXT_PACKET = (byte) 0xa3; - byte CLIENTBOUND_DEBUG_RENDERER_PACKET = (byte) 0xa4; -} diff --git a/src/main/java/cn/nukkit/network/protocol/RemoveEntityPacket.java b/src/main/java/cn/nukkit/network/protocol/RemoveEntityPacket.java deleted file mode 100644 index ec15b3679..000000000 --- a/src/main/java/cn/nukkit/network/protocol/RemoveEntityPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class RemoveEntityPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.REMOVE_ENTITY_PACKET; - - public long eid; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(this.eid); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/RequestChunkRadiusPacket.java b/src/main/java/cn/nukkit/network/protocol/RequestChunkRadiusPacket.java deleted file mode 100644 index 0d1fb62b0..000000000 --- a/src/main/java/cn/nukkit/network/protocol/RequestChunkRadiusPacket.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class RequestChunkRadiusPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.REQUEST_CHUNK_RADIUS_PACKET; - - public int radius; - - @Override - public void decode() { - this.radius = this.getVarInt(); - } - - @Override - public void encode() { - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ResourcePackChunkDataPacket.java b/src/main/java/cn/nukkit/network/protocol/ResourcePackChunkDataPacket.java deleted file mode 100644 index ed67bdcc8..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ResourcePackChunkDataPacket.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -import java.util.UUID; - -@ToString(exclude = "data") -public class ResourcePackChunkDataPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.RESOURCE_PACK_CHUNK_DATA_PACKET; - - public UUID packId; - public int chunkIndex; - public long progress; - public byte[] data; - - @Override - public void decode() { - this.packId = UUID.fromString(this.getString()); - this.chunkIndex = this.getLInt(); - this.progress = this.getLLong(); - if (protocol < 388) { - this.data = this.get(this.getLInt()); - } else { - this.data = this.getByteArray(); - } - } - - @Override - public void encode() { - this.reset(); - this.putString(this.packId.toString()); - this.putLInt(this.chunkIndex); - this.putLLong(this.progress); - if (protocol < 388) { - this.putLInt(this.data.length); - this.put(this.data); - } else { - this.putByteArray(this.data); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ResourcePackChunkRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/ResourcePackChunkRequestPacket.java deleted file mode 100644 index ebed714e1..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ResourcePackChunkRequestPacket.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -import java.util.UUID; - -@ToString -public class ResourcePackChunkRequestPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.RESOURCE_PACK_CHUNK_REQUEST_PACKET; - - public UUID packId; - public int chunkIndex; - - @Override - public void decode() { - this.packId = UUID.fromString(this.getString()); - this.chunkIndex = this.getLInt(); - } - - @Override - public void encode() { - this.reset(); - this.putString(this.packId.toString()); - this.putLInt(this.chunkIndex); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ResourcePackClientResponsePacket.java b/src/main/java/cn/nukkit/network/protocol/ResourcePackClientResponsePacket.java deleted file mode 100644 index dcccc3182..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ResourcePackClientResponsePacket.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -import java.util.UUID; - -@ToString -public class ResourcePackClientResponsePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.RESOURCE_PACK_CLIENT_RESPONSE_PACKET; - - public static final byte STATUS_REFUSED = 1; - public static final byte STATUS_SEND_PACKS = 2; - public static final byte STATUS_HAVE_ALL_PACKS = 3; - public static final byte STATUS_COMPLETED = 4; - - public byte responseStatus; - public Entry[] packEntries; - - @Override - public void decode() { - this.responseStatus = (byte) this.getByte(); - this.packEntries = new Entry[Math.min(this.getLShort(), 1024)]; - for (int i = 0; i < this.packEntries.length; i++) { - String[] entry = this.getString().split("_"); - this.packEntries[i] = new Entry(UUID.fromString(entry[0]), entry[1]); - } - } - - @Override - public void encode() { - this.reset(); - this.putByte(this.responseStatus); - this.putLShort(this.packEntries.length); - for (Entry entry : this.packEntries) { - this.putString(entry.uuid.toString() + '_' + entry.version); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } - - @ToString - public static class Entry { - - public final UUID uuid; - public final String version; - - public Entry(UUID uuid, String version) { - this.uuid = uuid; - this.version = version; - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ResourcePackDataInfoPacket.java b/src/main/java/cn/nukkit/network/protocol/ResourcePackDataInfoPacket.java deleted file mode 100644 index a4ae6b116..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ResourcePackDataInfoPacket.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -import java.util.UUID; - -@ToString(exclude = "sha256") -public class ResourcePackDataInfoPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.RESOURCE_PACK_DATA_INFO_PACKET; - - public static final int TYPE_INVALID = 0; - public static final int TYPE_ADDON = 1; - public static final int TYPE_CACHED = 2; - public static final int TYPE_COPY_PROTECTED = 3; - public static final int TYPE_BEHAVIOR = 4; - public static final int TYPE_PERSONA_PIECE = 5; - public static final int TYPE_RESOURCE = 6; - public static final int TYPE_SKINS = 7; - public static final int TYPE_WORLD_TEMPLATE = 8; - public static final int TYPE_COUNT = 9; - - public UUID packId; - public int maxChunkSize; - public int chunkCount; - public long compressedPackSize; - public byte[] sha256; - public boolean premium; - public int type = protocol < ProtocolInfo.v1_13_0 ? 1 : TYPE_RESOURCE; - - @Override - public void decode() { - this.packId = UUID.fromString(this.getString()); - this.maxChunkSize = this.getLInt(); - this.chunkCount = this.getLInt(); - this.compressedPackSize = this.getLLong(); - this.sha256 = this.getByteArray(); - if (protocol >= ProtocolInfo.v1_12_0) { - this.premium = this.getBoolean(); - this.type = this.getByte(); - } - } - - @Override - public void encode() { - this.reset(); - this.putString(this.packId.toString()); - this.putLInt(this.maxChunkSize); - this.putLInt(this.chunkCount); - this.putLLong(this.compressedPackSize); - this.putByteArray(this.sha256); - if (protocol >= ProtocolInfo.v1_12_0) { - this.putBoolean(this.premium); - this.putByte((byte) this.type); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ResourcePackStackPacket.java b/src/main/java/cn/nukkit/network/protocol/ResourcePackStackPacket.java deleted file mode 100644 index 8148025e5..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ResourcePackStackPacket.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.resourcepacks.ResourcePack; -import cn.nukkit.utils.Utils; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import lombok.ToString; -import lombok.Value; - -import java.util.List; - -@ToString -public class ResourcePackStackPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.RESOURCE_PACK_STACK_PACKET; - - public boolean mustAccept = false; - public ResourcePack[] behaviourPackStack = new ResourcePack[0]; - public ResourcePack[] resourcePackStack = new ResourcePack[0]; - /** - * Below v1.16.100 - */ - public boolean isExperimental = false; - /** - * v1.16.100 and above - */ - public final List experiments = new ObjectArrayList<>(); - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putBoolean(this.mustAccept); - this.putUnsignedVarInt(this.behaviourPackStack.length); - for (ResourcePack entry : this.behaviourPackStack) { - this.putString(entry.getPackId().toString()); - this.putString(entry.getPackVersion()); - if (this.protocol >= 313) { - this.putString(""); - } - } - this.putUnsignedVarInt(this.resourcePackStack.length); - for (ResourcePack entry : this.resourcePackStack) { - this.putString(entry.getPackId().toString()); - this.putString(entry.getPackVersion()); - if (this.protocol >= 313) { - this.putString(""); - } - } - if (this.protocol >= 313) { - if (protocol < ProtocolInfo.v1_16_100) { - this.putBoolean(isExperimental); - } - if (protocol >= 388) { - this.putString(Utils.getVersionByProtocol(protocol)); - } - if (protocol >= ProtocolInfo.v1_16_100) { - this.putLInt(this.experiments.size()); - for (ExperimentData experimentData : this.experiments) { - this.putString(experimentData.getName()); - this.putBoolean(experimentData.isEnabled()); - } - this.putBoolean(false); // Were experiments previously toggled - } - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Value - public static class ExperimentData { - String name; - boolean enabled; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ResourcePacksInfoPacket.java b/src/main/java/cn/nukkit/network/protocol/ResourcePacksInfoPacket.java deleted file mode 100644 index 5550dbc64..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ResourcePacksInfoPacket.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.resourcepacks.ResourcePack; -import lombok.ToString; - -@ToString -public class ResourcePacksInfoPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.RESOURCE_PACKS_INFO_PACKET; - - public boolean mustAccept; - public boolean scripting; - public boolean forceServerPacks; - public ResourcePack[] behaviourPackEntries = new ResourcePack[0]; - public ResourcePack[] resourcePackEntries = new ResourcePack[0]; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putBoolean(this.mustAccept); - if (protocol >= ProtocolInfo.v1_9_0) { - this.putBoolean(this.scripting); - if (protocol >= ProtocolInfo.v1_17_10) { - this.putBoolean(this.forceServerPacks); - } - } - - encodePacks(this.behaviourPackEntries); - encodePacks(this.resourcePackEntries); - } - - private void encodePacks(ResourcePack[] packs) { - this.putLShort(packs.length); - for (ResourcePack entry : packs) { - this.putString(entry.getPackId().toString()); - this.putString(entry.getPackVersion()); - this.putLLong(entry.getPackSize()); - this.putString(""); // encryption key - this.putString(""); // sub-pack name - if (protocol > ProtocolInfo.v1_5_0) { - this.putString(""); // content identity - if (protocol >= ProtocolInfo.v1_9_0) { - this.putBoolean(false); // scripting - if (protocol >= ProtocolInfo.v1_16_200) { - this.putBoolean(false); // raytracing capable - } - } - } - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/network/protocol/RespawnPacket.java b/src/main/java/cn/nukkit/network/protocol/RespawnPacket.java deleted file mode 100644 index de353632c..000000000 --- a/src/main/java/cn/nukkit/network/protocol/RespawnPacket.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.Vector3f; -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class RespawnPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.RESPAWN_PACKET; - - public static final int STATE_SEARCHING_FOR_SPAWN = 0; - public static final int STATE_READY_TO_SPAWN = 1; - public static final int STATE_CLIENT_READY_TO_SPAWN = 2; - - public float x; - public float y; - public float z; - public int respawnState = STATE_SEARCHING_FOR_SPAWN; - public long runtimeEntityId; - - @Override - public void decode() { - Vector3f v = this.getVector3f(); - this.x = v.x; - this.y = v.y; - this.z = v.z; - if (protocol >= 388) { - this.respawnState = this.getByte(); - this.runtimeEntityId = this.getEntityRuntimeId(); - } - } - - @Override - public void encode() { - this.reset(); - this.putVector3f(this.x, this.y, this.z); - if (protocol >= 388) { - this.putByte((byte) respawnState); - this.putEntityRuntimeId(runtimeEntityId); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/RiderJumpPacket.java b/src/main/java/cn/nukkit/network/protocol/RiderJumpPacket.java deleted file mode 100644 index d810349d4..000000000 --- a/src/main/java/cn/nukkit/network/protocol/RiderJumpPacket.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class RiderJumpPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.RIDER_JUMP_PACKET; - - public int jumpStrength; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.jumpStrength = this.getVarInt(); - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.jumpStrength); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ScriptCustomEventPacket.java b/src/main/java/cn/nukkit/network/protocol/ScriptCustomEventPacket.java deleted file mode 100644 index 59875d19d..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ScriptCustomEventPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class ScriptCustomEventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SCRIPT_CUSTOM_EVENT_PACKET; - - public String eventName; - public byte[] eventData; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.eventName = this.getString(); - this.eventData = this.getByteArray(); - } - - @Override - public void encode() { - this.reset(); - this.putString(this.eventName); - this.putByteArray(this.eventData); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ServerSettingsRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/ServerSettingsRequestPacket.java deleted file mode 100644 index 635c5f891..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ServerSettingsRequestPacket.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class ServerSettingsRequestPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SERVER_SETTINGS_REQUEST_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ServerSettingsResponsePacket.java b/src/main/java/cn/nukkit/network/protocol/ServerSettingsResponsePacket.java deleted file mode 100644 index 4987ddf1b..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ServerSettingsResponsePacket.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class ServerSettingsResponsePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SERVER_SETTINGS_RESPONSE_PACKET; - - public int formId; - public String data; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.formId); - this.putString(this.data); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ServerToClientHandshakePacket.java b/src/main/java/cn/nukkit/network/protocol/ServerToClientHandshakePacket.java deleted file mode 100644 index 812024f59..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ServerToClientHandshakePacket.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class ServerToClientHandshakePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SERVER_TO_CLIENT_HANDSHAKE_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public String publicKey; - public String serverToken; - public String privateKey; - - @Override - public void decode() { - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetCommandsEnabledPacket.java b/src/main/java/cn/nukkit/network/protocol/SetCommandsEnabledPacket.java deleted file mode 100644 index d626ff144..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetCommandsEnabledPacket.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class SetCommandsEnabledPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_COMMANDS_ENABLED_PACKET; - - public boolean enabled; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putBoolean(this.enabled); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetDifficultyPacket.java b/src/main/java/cn/nukkit/network/protocol/SetDifficultyPacket.java deleted file mode 100644 index 40eb48d2d..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetDifficultyPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class SetDifficultyPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_DIFFICULTY_PACKET; - - public int difficulty; - - @Override - public void decode() { - this.difficulty = (int) this.getUnsignedVarInt(); - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(this.difficulty); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetEntityDataPacket.java b/src/main/java/cn/nukkit/network/protocol/SetEntityDataPacket.java deleted file mode 100644 index 7e60a9af1..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetEntityDataPacket.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.entity.data.EntityMetadata; -import cn.nukkit.utils.Binary; -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class SetEntityDataPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_ENTITY_DATA_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public long eid; - public EntityMetadata metadata; - public long frame; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.put(Binary.writeMetadata(protocol, this.metadata)); - if (protocol >= ProtocolInfo.v1_16_100) { - this.putUnsignedVarLong(this.frame); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetEntityLinkPacket.java b/src/main/java/cn/nukkit/network/protocol/SetEntityLinkPacket.java deleted file mode 100644 index 70b637601..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetEntityLinkPacket.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class SetEntityLinkPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_ENTITY_LINK_PACKET; - - public static final byte TYPE_REMOVE = 0; - public static final byte TYPE_RIDE = 1; - public static final byte TYPE_PASSENGER = 2; - - public long vehicleUniqueId; - public long riderUniqueId; - public byte type; - public byte immediate; - public boolean riderInitiated = false; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(this.vehicleUniqueId); - this.putEntityUniqueId(this.riderUniqueId); - this.putByte(this.type); - this.putByte(this.immediate); - if (protocol >= 407) { - this.putBoolean(this.riderInitiated); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetEntityMotionPacket.java b/src/main/java/cn/nukkit/network/protocol/SetEntityMotionPacket.java deleted file mode 100644 index f87802e63..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetEntityMotionPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class SetEntityMotionPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_ENTITY_MOTION_PACKET; - - public long eid; - public float motionX; - public float motionY; - public float motionZ; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.putVector3f(this.motionX, this.motionY, this.motionZ); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetHealthPacket.java b/src/main/java/cn/nukkit/network/protocol/SetHealthPacket.java deleted file mode 100644 index 8933c3872..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetHealthPacket.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class SetHealthPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_HEALTH_PACKET; - - public int health; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putUnsignedVarInt(this.health); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetLastHurtByPacket.java b/src/main/java/cn/nukkit/network/protocol/SetLastHurtByPacket.java deleted file mode 100644 index 9658c8776..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetLastHurtByPacket.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class SetLastHurtByPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_LAST_HURT_BY_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetLocalPlayerAsInitializedPacket.java b/src/main/java/cn/nukkit/network/protocol/SetLocalPlayerAsInitializedPacket.java deleted file mode 100644 index 6e8ce6289..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetLocalPlayerAsInitializedPacket.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class SetLocalPlayerAsInitializedPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_LOCAL_PLAYER_AS_INITIALIZED_PACKET; - - public long eid; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.eid = this.getUnsignedVarLong(); - } - - @Override - public void encode() { - this.putUnsignedVarLong(eid); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetPlayerGameTypePacket.java b/src/main/java/cn/nukkit/network/protocol/SetPlayerGameTypePacket.java deleted file mode 100644 index 9c363bbf5..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetPlayerGameTypePacket.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class SetPlayerGameTypePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_PLAYER_GAME_TYPE_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public int gamemode; - - @Override - public void decode() { - this.gamemode = this.getVarInt(); - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.gamemode); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetSpawnPositionPacket.java b/src/main/java/cn/nukkit/network/protocol/SetSpawnPositionPacket.java deleted file mode 100644 index e15d8218c..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetSpawnPositionPacket.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class SetSpawnPositionPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_SPAWN_POSITION_PACKET; - - public static final int TYPE_PLAYER_SPAWN = 0; - public static final int TYPE_WORLD_SPAWN = 1; - - public int spawnType; - public int y; - public int z; - public int x; - public int dimension = 0; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.spawnType); - this.putBlockVector3(this.x, this.y, this.z); - if (protocol >= 407) { - this.putVarInt(this.dimension); - this.putBlockVector3(this.x, this.y, this.z); - } else { - this.putBoolean(false); - } - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetTimePacket.java b/src/main/java/cn/nukkit/network/protocol/SetTimePacket.java deleted file mode 100644 index 7ddd69241..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetTimePacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class SetTimePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_TIME_PACKET; - - public int time; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.time); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SetTitlePacket.java b/src/main/java/cn/nukkit/network/protocol/SetTitlePacket.java deleted file mode 100644 index 6733b87d0..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SetTitlePacket.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author Tee7even - */ -@ToString -public class SetTitlePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SET_TITLE_PACKET; - - public static final int TYPE_CLEAR = 0; - public static final int TYPE_RESET = 1; - public static final int TYPE_TITLE = 2; - public static final int TYPE_SUBTITLE = 3; - public static final int TYPE_ACTION_BAR = 4; - public static final int TYPE_ANIMATION_TIMES = 5; - - public int type; - public String text = ""; - public int fadeInTime = 0; - public int stayTime = 0; - public int fadeOutTime = 0; - private String xuid = ""; - private String platformOnlineId = ""; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.type = this.getVarInt(); - this.text = this.getString(); - this.fadeInTime = this.getVarInt(); - this.stayTime = this.getVarInt(); - this.fadeOutTime = this.getVarInt(); - if (protocol >= ProtocolInfo.v1_17_10) { - this.xuid = this.getString(); - this.platformOnlineId = this.getString(); - } - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(type); - this.putString(text); - this.putVarInt(fadeInTime); - this.putVarInt(stayTime); - this.putVarInt(fadeOutTime); - if (protocol >= ProtocolInfo.v1_17_10) { - this.putString(xuid); - this.putString(platformOnlineId); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ShowCreditsPacket.java b/src/main/java/cn/nukkit/network/protocol/ShowCreditsPacket.java deleted file mode 100644 index 64469e10d..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ShowCreditsPacket.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class ShowCreditsPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SHOW_CREDITS_PACKET; - - public static final int STATUS_START_CREDITS = 0; - public static final int STATUS_END_CREDITS = 1; - - public long eid; - public int status; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.eid = this.getEntityRuntimeId(); - this.status = this.getVarInt(); - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.eid); - this.putVarInt(this.status); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/ShowProfilePacket.java b/src/main/java/cn/nukkit/network/protocol/ShowProfilePacket.java deleted file mode 100644 index 7c4c9ab00..000000000 --- a/src/main/java/cn/nukkit/network/protocol/ShowProfilePacket.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class ShowProfilePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SHOW_PROFILE_PACKET; - - public String xuid; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.xuid = this.getString(); - } - - @Override - public void encode() { - this.reset(); - this.putString(this.xuid); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SimpleEventPacket.java b/src/main/java/cn/nukkit/network/protocol/SimpleEventPacket.java deleted file mode 100644 index ebcccfa39..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SimpleEventPacket.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class SimpleEventPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SIMPLE_EVENT_PACKET; - - public static final int TYPE_ENABLE_COMMANDS = 1; - public static final int TYPE_DISABLE_COMMANDS = 2; - - public short eventType; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putShort(this.eventType); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SpawnExperienceOrbPacket.java b/src/main/java/cn/nukkit/network/protocol/SpawnExperienceOrbPacket.java deleted file mode 100644 index f44ef4c9e..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SpawnExperienceOrbPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class SpawnExperienceOrbPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SPAWN_EXPERIENCE_ORB_PACKET; - - public float x; - public float y; - public float z; - public int amount; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putVector3f(this.x, this.y, this.z); - this.putUnsignedVarInt(this.amount); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SpawnParticleEffectPacket.java b/src/main/java/cn/nukkit/network/protocol/SpawnParticleEffectPacket.java deleted file mode 100644 index 2dc3a0421..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SpawnParticleEffectPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.math.Vector3f; -import lombok.ToString; - -@ToString -public class SpawnParticleEffectPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SPAWN_PARTICLE_EFFECT_PACKET; - - public int dimensionId; - public long uniqueEntityId = -1; - public Vector3f position; - public String identifier; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putByte((byte) this.dimensionId); - if (protocol >= 332) { - this.putEntityUniqueId(uniqueEntityId); - } - this.putVector3f(this.position); - this.putString(this.identifier); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/StartGamePacket.java b/src/main/java/cn/nukkit/network/protocol/StartGamePacket.java deleted file mode 100644 index b3dbe2e73..000000000 --- a/src/main/java/cn/nukkit/network/protocol/StartGamePacket.java +++ /dev/null @@ -1,232 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.item.RuntimeItems; -import cn.nukkit.level.GameRules; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.utils.Utils; -import lombok.ToString; - -@ToString -public class StartGamePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.START_GAME_PACKET; - - public static final int GAME_PUBLISH_SETTING_NO_MULTI_PLAY = 0; - public static final int GAME_PUBLISH_SETTING_INVITE_ONLY = 1; - public static final int GAME_PUBLISH_SETTING_FRIENDS_ONLY = 2; - public static final int GAME_PUBLISH_SETTING_FRIENDS_OF_FRIENDS = 3; - public static final int GAME_PUBLISH_SETTING_PUBLIC = 4; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public String version; - - public long entityUniqueId; - public long entityRuntimeId; - public int playerGamemode; - public float x; - public float y; - public float z; - public float yaw; - public float pitch; - public int seed; - public byte dimension; - public int generator = 1; - public int worldGamemode; - public int difficulty; - public int spawnX; - public int spawnY; - public int spawnZ; - public boolean hasAchievementsDisabled = true; - public int dayCycleStopTime = -1; - public boolean eduMode = false; - public int eduEditionOffer = 0; - public boolean hasEduFeaturesEnabled = false; - public float rainLevel; - public float lightningLevel; - public boolean hasConfirmedPlatformLockedContent = false; - public boolean multiplayerGame = true; - public boolean broadcastToLAN = true; - public boolean broadcastToXboxLive = true; - public int xblBroadcastIntent = GAME_PUBLISH_SETTING_PUBLIC; - public int platformBroadcastIntent = GAME_PUBLISH_SETTING_PUBLIC; - public boolean commandsEnabled; - public boolean isTexturePacksRequired = false; - public GameRules gameRules; - public boolean bonusChest = false; - public boolean hasStartWithMapEnabled = false; - public boolean trustPlayers = false; - public int permissionLevel = 1; - public int gamePublish = 4; - public int serverChunkTickRange = 4; - public boolean broadcastToPlatform; - public int platformBroadcastMode = 4; - public boolean xblBroadcastIntentOld = true; - public boolean hasLockedBehaviorPack = false; - public boolean hasLockedResourcePack = false; - public boolean isFromLockedWorldTemplate = false; - public boolean isUsingMsaGamertagsOnly = false; - public boolean isFromWorldTemplate = false; - public boolean isWorldTemplateOptionLocked = false; - public String levelId = ""; - public String worldName; - public String premiumWorldTemplateId = ""; - public boolean isTrial = false; - public boolean isMovementServerAuthoritative; - public long currentTick; - public int enchantmentSeed; - public String multiplayerCorrelationId = ""; - public boolean isOnlySpawningV1Villagers = false; - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putEntityUniqueId(this.entityUniqueId); - this.putEntityRuntimeId(this.entityRuntimeId); - this.putVarInt(this.playerGamemode); - this.putVector3f(this.x, this.y, this.z); - this.putLFloat(this.yaw); - this.putLFloat(this.pitch); - this.putVarInt(this.seed); - if (protocol >= 407) { - this.putLShort(0x00); // SpawnBiomeType - Default - this.putString(protocol >= ProtocolInfo.v1_16_100 ? "plains" : ""); // UserDefinedBiomeName - } - this.putVarInt(this.dimension); - this.putVarInt(this.generator); - this.putVarInt(this.worldGamemode); - this.putVarInt(this.difficulty); - this.putBlockVector3(this.spawnX, this.spawnY, this.spawnZ); - this.putBoolean(this.hasAchievementsDisabled); - this.putVarInt(this.dayCycleStopTime); - if (protocol >= 388) { - this.putVarInt(this.eduEditionOffer); - } else { - this.putBoolean(this.eduMode); - } - if (protocol > 224) { - this.putBoolean(this.hasEduFeaturesEnabled); - if (protocol >= 407) { - this.putString(""); // Education Edition Product ID - } - } - this.putLFloat(this.rainLevel); - this.putLFloat(this.lightningLevel); - if (protocol >= 332) { - this.putBoolean(this.hasConfirmedPlatformLockedContent); - } - this.putBoolean(this.multiplayerGame); - this.putBoolean(this.broadcastToLAN); - if (protocol >= 332) { - this.putVarInt(this.xblBroadcastIntent); - this.putVarInt(this.platformBroadcastIntent); - } else { - this.putBoolean(this.broadcastToXboxLive); - } - this.putBoolean(this.commandsEnabled); - this.putBoolean(this.isTexturePacksRequired); - this.putGameRules(protocol, gameRules); - if (protocol >= ProtocolInfo.v1_16_100) { - this.putLInt(0); // Experiment count - this.putBoolean(false); // Were experiments previously toggled - } - this.putBoolean(this.bonusChest); - if (protocol > 201) { - this.putBoolean(this.hasStartWithMapEnabled); - } - if (protocol < 332) { - this.putBoolean(this.trustPlayers); - } - this.putVarInt(this.permissionLevel); - if (protocol < 332) { - this.putVarInt(this.gamePublish); - } - if (protocol >= 201) { - this.putLInt(this.serverChunkTickRange); - } - if (protocol >= 223 && protocol < 332) { - this.putBoolean(this.broadcastToPlatform); - this.putVarInt(this.platformBroadcastMode); - this.putBoolean(this.xblBroadcastIntentOld); - } - if (protocol > 224) { - this.putBoolean(this.hasLockedBehaviorPack); - this.putBoolean(this.hasLockedResourcePack); - this.putBoolean(this.isFromLockedWorldTemplate); - } - if (protocol >= 291) { - this.putBoolean(this.isUsingMsaGamertagsOnly); - if (protocol >= 313) { - this.putBoolean(this.isFromWorldTemplate); - this.putBoolean(this.isWorldTemplateOptionLocked); - if (protocol >= 361) { - this.putBoolean(this.isOnlySpawningV1Villagers); - if (protocol >= 388) { - this.putString(Utils.getVersionByProtocol(protocol)); - } - } - } - if (protocol >= 407) { - this.putLInt(protocol >= ProtocolInfo.v1_16_100 ? 16 : 0); // Limited world width - this.putLInt(protocol >= ProtocolInfo.v1_16_100 ? 16 : 0); // Limited world height - this.putBoolean(false); // Nether type - if (protocol >= ProtocolInfo.v1_17_30) { // EduSharedUriResource - this.putString(""); // buttonName - this.putString(""); // linkUri - } - this.putBoolean(false); // Experimental Gameplay - } - } - this.putString(this.levelId); - this.putString(this.worldName); - this.putString(this.premiumWorldTemplateId); - this.putBoolean(this.isTrial); - if (protocol >= 388) { - if (protocol >= ProtocolInfo.v1_16_100) { - if (protocol >= ProtocolInfo.v1_16_210) { - this.putUnsignedVarInt(this.isMovementServerAuthoritative ? 1 : 0); // 2 - rewind - this.putVarInt(0); // RewindHistorySize - this.putBoolean(false); // isServerAuthoritativeBlockBreaking - } else { - this.putVarInt(this.isMovementServerAuthoritative ? 1 : 0); // 2 - rewind - } - } else { - this.putBoolean(this.isMovementServerAuthoritative); - } - } - this.putLLong(this.currentTick); - this.putVarInt(this.enchantmentSeed); - if (protocol > 274) { - if (protocol >= ProtocolInfo.v1_16_100) { - this.putUnsignedVarInt(0); // Custom blocks - } else { - this.put(GlobalBlockPalette.getCompiledTable(this.protocol)); - } - if (protocol >= 361) { - this.put(RuntimeItems.getMapping(protocol).getItemPalette()); - } - this.putString(this.multiplayerCorrelationId); - if (protocol == 354 && version != null && version.startsWith("1.11.4")) { - this.putBoolean(this.isOnlySpawningV1Villagers); - } else if (protocol >= 407) { - this.putBoolean(false); // isInventoryServerAuthoritative - if (protocol >= ProtocolInfo.v1_16_230_50) { - this.putString(""); // serverEngine - } - } - } - } - - @SuppressWarnings("unused") - private static class ItemData { - private String name; - private int id; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/StopSoundPacket.java b/src/main/java/cn/nukkit/network/protocol/StopSoundPacket.java deleted file mode 100644 index a7d9f86e9..000000000 --- a/src/main/java/cn/nukkit/network/protocol/StopSoundPacket.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class StopSoundPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.STOP_SOUND_PACKET; - - public String name; - public boolean stopAll; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putString(this.name); - this.putBoolean(this.stopAll); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/StructureBlockUpdatePacket.java b/src/main/java/cn/nukkit/network/protocol/StructureBlockUpdatePacket.java deleted file mode 100644 index 35b32df9a..000000000 --- a/src/main/java/cn/nukkit/network/protocol/StructureBlockUpdatePacket.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class StructureBlockUpdatePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.STRUCTURE_BLOCK_UPDATE_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/SubClientLoginPacket.java b/src/main/java/cn/nukkit/network/protocol/SubClientLoginPacket.java deleted file mode 100644 index 2ae9e80be..000000000 --- a/src/main/java/cn/nukkit/network/protocol/SubClientLoginPacket.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class SubClientLoginPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.SUB_CLIENT_LOGIN_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/TakeItemEntityPacket.java b/src/main/java/cn/nukkit/network/protocol/TakeItemEntityPacket.java deleted file mode 100644 index 9ef6aa506..000000000 --- a/src/main/java/cn/nukkit/network/protocol/TakeItemEntityPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class TakeItemEntityPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.TAKE_ITEM_ENTITY_PACKET; - - public long entityId; - public long target; - - @Override - public void decode() { - this.target = this.getEntityRuntimeId(); - this.entityId = this.getEntityRuntimeId(); - } - - @Override - public void encode() { - this.reset(); - this.putEntityRuntimeId(this.target); - this.putEntityRuntimeId(this.entityId); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/TextPacket.java b/src/main/java/cn/nukkit/network/protocol/TextPacket.java deleted file mode 100644 index bc4752a29..000000000 --- a/src/main/java/cn/nukkit/network/protocol/TextPacket.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class TextPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.TEXT_PACKET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public static final byte TYPE_RAW = 0; - public static final byte TYPE_CHAT = 1; - public static final byte TYPE_TRANSLATION = 2; - public static final byte TYPE_POPUP = 3; - public static final byte TYPE_JUKEBOX_POPUP = 4; - public static final byte TYPE_TIP = 5; - public static final byte TYPE_SYSTEM = 6; - public static final byte TYPE_WHISPER = 7; - public static final byte TYPE_ANNOUNCEMENT = 8; - public static final byte TYPE_OBJECT = 9; - public static final byte TYPE_OBJECT_WHISPER = 10; - - public byte type; - public String source = ""; - public String message = ""; - public String[] parameters = new String[0]; - public boolean isLocalized = false; - public String xboxUserId = ""; - public String platformChatId = ""; - - @Override - public void decode() { - this.type = (byte) getByte(); - this.isLocalized = this.getBoolean() || type == TYPE_TRANSLATION; - switch (type) { - case TYPE_CHAT: - case TYPE_WHISPER: - case TYPE_ANNOUNCEMENT: - this.source = this.getString(); - if (protocol > 201 && protocol <= 282) { - this.getString(); - this.getVarInt(); - } - case TYPE_RAW: - case TYPE_TIP: - case TYPE_SYSTEM: - case TYPE_OBJECT: - case TYPE_OBJECT_WHISPER: - this.message = this.getString(); - break; - - case TYPE_TRANSLATION: - case TYPE_POPUP: - case TYPE_JUKEBOX_POPUP: - this.message = this.getString(); - int count = (int) this.getUnsignedVarInt(); - this.parameters = new String[Math.min(count, 128)]; - for (int i = 0; i < this.parameters.length; i++) { - this.parameters[i] = this.getString(); - } - } - if (protocol >= 223) { - this.xboxUserId = this.getString(); - this.platformChatId = this.getString(); - } - } - - @Override - public void encode() { - this.reset(); - this.putByte(this.type); - this.putBoolean(this.isLocalized || type == TYPE_TRANSLATION); - switch (this.type) { - case TYPE_CHAT: - case TYPE_WHISPER: - case TYPE_ANNOUNCEMENT: - this.putString(this.source); - if (protocol > 201 && protocol <= 282) { - this.putString(""); - this.putVarInt(0); - } - case TYPE_RAW: - case TYPE_TIP: - case TYPE_SYSTEM: - case TYPE_OBJECT: - case TYPE_OBJECT_WHISPER: - this.putString(this.message); - break; - - case TYPE_TRANSLATION: - case TYPE_POPUP: - case TYPE_JUKEBOX_POPUP: - this.putString(this.message); - this.putUnsignedVarInt(this.parameters.length); - for (String parameter : this.parameters) { - this.putString(parameter); - } - } - if (protocol >= 223) { - this.putString(this.xboxUserId); - this.putString(this.platformChatId); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/TransferPacket.java b/src/main/java/cn/nukkit/network/protocol/TransferPacket.java deleted file mode 100644 index 600642c6f..000000000 --- a/src/main/java/cn/nukkit/network/protocol/TransferPacket.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class TransferPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.TRANSFER_PACKET; - - public String address; - public int port = 19132; - - @Override - public void decode() { - this.address = this.getString(); - this.port = (short) this.getLShort(); - } - - @Override - public void encode() { - this.reset(); - this.putString(address); - this.putLShort(port); - } - - @Override - public byte pid() { - return NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/UpdateAttributesPacket.java b/src/main/java/cn/nukkit/network/protocol/UpdateAttributesPacket.java deleted file mode 100644 index f1cf0901b..000000000 --- a/src/main/java/cn/nukkit/network/protocol/UpdateAttributesPacket.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.network.protocol; - -import cn.nukkit.entity.Attribute; -import lombok.ToString; - -/** - * @author Nukkit Project Team - */ -@ToString -public class UpdateAttributesPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.UPDATE_ATTRIBUTES_PACKET; - - public Attribute[] entries; - public long entityId; - public long frame; - - @Override - public byte pid() { - return NETWORK_ID; - } - - public void decode() { - } - - public void encode() { - this.reset(); - - this.putEntityRuntimeId(this.entityId); - - if (this.entries == null) { - this.putUnsignedVarInt(0); - } else { - this.putUnsignedVarInt(this.entries.length); - for (Attribute entry : this.entries) { - this.putLFloat(entry.getMinValue()); - this.putLFloat(entry.getMaxValue()); - this.putLFloat(entry.getValue()); - this.putLFloat(entry.getDefaultValue()); - this.putString(entry.getName()); - } - } - - if (protocol >= ProtocolInfo.v1_16_100) { - this.putUnsignedVarInt(this.frame); - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/UpdateBlockPacket.java b/src/main/java/cn/nukkit/network/protocol/UpdateBlockPacket.java deleted file mode 100644 index d27b282e9..000000000 --- a/src/main/java/cn/nukkit/network/protocol/UpdateBlockPacket.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -/** - * @author MagicDroidX - * Nukkit Project - */ -@ToString -public class UpdateBlockPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.UPDATE_BLOCK_PACKET; - - public static final int FLAG_NONE = 0b0000; - public static final int FLAG_NEIGHBORS = 0b0001; - public static final int FLAG_NETWORK = 0b0010; - public static final int FLAG_NOGRAPHIC = 0b0100; - public static final int FLAG_PRIORITY = 0b1000; - - public static final int FLAG_ALL = 3; // FLAG_NEIGHBORS | FLAG_NETWORK - public static final int FLAG_ALL_PRIORITY = 11; // FLAG_ALL | FLAG_PRIORITY - - public int x; - public int z; - public int y; - public int blockId; - public int blockData; - public int blockRuntimeId; - public int flags; - public int dataLayer = 0; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putBlockVector3(x, y, z); - if (protocol > 201) { - this.putUnsignedVarInt(blockRuntimeId); - this.putUnsignedVarInt(flags); - } else { - this.putUnsignedVarInt(blockId); - this.putUnsignedVarInt(176 | blockData & 0xf); // (0xb << 4) | blockData & 0xf - } - if (protocol > 224) { - this.putUnsignedVarInt(dataLayer); - } - } - - public static class Entry { - public final int x; - public final int z; - public final int y; - public final int blockId; - public final int blockData; - public final int flags; - - public Entry(int x, int z, int y, int blockId, int blockData, int flags) { - this.x = x; - this.z = z; - this.y = y; - this.blockId = blockId; - this.blockData = blockData; - this.flags = flags; - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/UpdateEquipmentPacket.java b/src/main/java/cn/nukkit/network/protocol/UpdateEquipmentPacket.java deleted file mode 100644 index 52c7d1c2c..000000000 --- a/src/main/java/cn/nukkit/network/protocol/UpdateEquipmentPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString(exclude = "namedtag") -public class UpdateEquipmentPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.UPDATE_EQUIPMENT_PACKET; - - public int windowId; - public int windowType; - public int unknown; - public long eid; - public byte[] namedtag; - - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putByte((byte) this.windowId); - this.putByte((byte) this.windowType); - this.putEntityUniqueId(this.eid); - this.put(this.namedtag); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/UpdatePlayerGameTypePacket.java b/src/main/java/cn/nukkit/network/protocol/UpdatePlayerGameTypePacket.java deleted file mode 100644 index 8290e2c71..000000000 --- a/src/main/java/cn/nukkit/network/protocol/UpdatePlayerGameTypePacket.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.network.protocol; - -public class UpdatePlayerGameTypePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.UPDATE_PLAYER_GAME_TYPE_PACKET; - - public GameType gameType; - public long entityId; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - this.gameType = GameType.from(this.getVarInt()); - this.entityId = this.getVarLong(); - } - - @Override - public void encode() { - this.reset(); - this.putVarInt(this.gameType.ordinal()); - this.putVarLong(entityId); - } - - public enum GameType { - SURVIVAL, - CREATIVE, - ADVENTURE, - SURVIVAL_VIEWER, - CREATIVE_VIEWER, - DEFAULT, - WORLD_DEFAULT; - - private static final GameType[] VALUES = values(); - - public static GameType from(int id) { - return VALUES[id]; - } - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/UpdateSoftEnumPacket.java b/src/main/java/cn/nukkit/network/protocol/UpdateSoftEnumPacket.java deleted file mode 100644 index fdc8d8d20..000000000 --- a/src/main/java/cn/nukkit/network/protocol/UpdateSoftEnumPacket.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class UpdateSoftEnumPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.UPDATE_SOFT_ENUM_PACKET; - - public final String[] values = new String[0]; - public String name = ""; - public Type type = Type.SET; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putString(name); - this.putUnsignedVarInt(values.length); - - for (String value : values) { - this.putString(value); - } - this.putByte((byte) type.ordinal()); - } - - public enum Type { - ADD, - REMOVE, - SET - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/UpdateTradePacket.java b/src/main/java/cn/nukkit/network/protocol/UpdateTradePacket.java deleted file mode 100644 index 6d5749b91..000000000 --- a/src/main/java/cn/nukkit/network/protocol/UpdateTradePacket.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class UpdateTradePacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.UPDATE_TRADE_PACKET; - - public byte windowId; - public byte windowType = 15; - public int unknownVarInt1; - public int unknownVarInt2; - public int unknownVarInt3; - public int tradeTier; - public long trader; - public long player; - public String displayName; - public boolean screen2; - public boolean isWilling; - public byte[] offers; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putByte(windowId); - this.putByte(windowType); - this.putVarInt(unknownVarInt1); - if (protocol < 354) { - this.putVarInt(unknownVarInt2); - if (this.protocol >= 313) { - this.putVarInt(unknownVarInt3); - } - this.putBoolean(isWilling); - } else { - this.putVarInt(tradeTier); - } - this.putEntityUniqueId(trader); - this.putEntityUniqueId(player); - this.putString(displayName); - if (protocol >= 354) { - this.putBoolean(screen2); - this.putBoolean(isWilling); - } - this.put(this.offers); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/VideoStreamConnectPacket.java b/src/main/java/cn/nukkit/network/protocol/VideoStreamConnectPacket.java deleted file mode 100644 index b24e7b64e..000000000 --- a/src/main/java/cn/nukkit/network/protocol/VideoStreamConnectPacket.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.network.protocol; - -import lombok.ToString; - -@ToString -public class VideoStreamConnectPacket extends DataPacket { - - public static final byte NETWORK_ID = ProtocolInfo.VIDEO_STREAM_CONNECT_PACKET; - - public static final byte ACTION_OPEN = 0; - public static final byte ACTION_CLOSE = 1; - - public String address; - public float screenshotFrequency; - public byte action; - - @Override - public byte pid() { - return NETWORK_ID; - } - - @Override - public void decode() { - } - - @Override - public void encode() { - this.reset(); - this.putString(address); - this.putLFloat(screenshotFrequency); - this.putByte(action); - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/types/CommandOriginData.java b/src/main/java/cn/nukkit/network/protocol/types/CommandOriginData.java deleted file mode 100644 index e00ab1edf..000000000 --- a/src/main/java/cn/nukkit/network/protocol/types/CommandOriginData.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.nukkit.network.protocol.types; - -import lombok.ToString; - -import java.util.OptionalLong; -import java.util.UUID; - -/** - * @author SupremeMortal - * Nukkit project - */ -@ToString -public final class CommandOriginData { - - public final Origin type; - public final UUID uuid; - public final String requestId; - private final Long varlong; - - public CommandOriginData(Origin type, UUID uuid, String requestId, Long varlong) { - this.type = type; - this.uuid = uuid; - this.requestId = requestId; - this.varlong = varlong; - } - - public OptionalLong getVarLong() { - if (varlong == null) { - return OptionalLong.empty(); - } - return OptionalLong.of(varlong); - } - - public enum Origin { - PLAYER, - BLOCK, - MINECART_BLOCK, - DEV_CONSOLE, - TEST, - AUTOMATION_PLAYER, - CLIENT_AUTOMATION, - DEDICATED_SERVER, - ENTITY, - VIRTUAL, - GAME_ARGUMENT, - ENTITY_SERVER - } -} diff --git a/src/main/java/cn/nukkit/network/protocol/types/ContainerIds.java b/src/main/java/cn/nukkit/network/protocol/types/ContainerIds.java deleted file mode 100644 index 06861e967..000000000 --- a/src/main/java/cn/nukkit/network/protocol/types/ContainerIds.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.network.protocol.types; - -/** - * @author CreeperFace - */ -public interface ContainerIds { - - int NONE = -1; - int INVENTORY = 0; - int FIRST = 1; - int LAST = 100; - int OFFHAND = 119; - int ARMOR = 120; - int CREATIVE = 121; - int HOTBAR = 122; - int FIXED_INVENTORY = 123; - int UI = 124; -} diff --git a/src/main/java/cn/nukkit/network/protocol/types/EntityLink.java b/src/main/java/cn/nukkit/network/protocol/types/EntityLink.java deleted file mode 100644 index f37424aa0..000000000 --- a/src/main/java/cn/nukkit/network/protocol/types/EntityLink.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.network.protocol.types; - -public class EntityLink { - - public static final byte TYPE_REMOVE = 0; - public static final byte TYPE_RIDER = 1; - public static final byte TYPE_PASSENGER = 2; - - public long fromEntityUniquieId; - public long toEntityUniquieId; - public byte type; - public boolean immediate; - public boolean riderInitiated; - - public EntityLink(long fromEntityUniquieId, long toEntityUniquieId, byte type, boolean immediate, boolean riderInitiated) { - this.fromEntityUniquieId = fromEntityUniquieId; - this.toEntityUniquieId = toEntityUniquieId; - this.type = type; - this.immediate = immediate; - this.riderInitiated = riderInitiated; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/network/protocol/types/NetworkInventoryAction.java b/src/main/java/cn/nukkit/network/protocol/types/NetworkInventoryAction.java deleted file mode 100644 index 7516d2431..000000000 --- a/src/main/java/cn/nukkit/network/protocol/types/NetworkInventoryAction.java +++ /dev/null @@ -1,370 +0,0 @@ -package cn.nukkit.network.protocol.types; - -import cn.nukkit.Player; -import cn.nukkit.inventory.*; -import cn.nukkit.inventory.transaction.action.*; -import cn.nukkit.item.Item; -import cn.nukkit.item.ItemID; -import cn.nukkit.network.protocol.InventoryTransactionPacket; -import cn.nukkit.network.protocol.ProtocolInfo; -import lombok.ToString; - -import java.util.Optional; - -/** - * @author CreeperFace - */ -@ToString -public class NetworkInventoryAction { - - public static final int SOURCE_CONTAINER = 0; - - public static final int SOURCE_WORLD = 2; - public static final int SOURCE_CREATIVE = 3; - public static final int SOURCE_TODO = 99999; - public static final int SOURCE_CRAFT_SLOT = 100; - - /** - * Fake window IDs for the SOURCE_TODO type (99999) - *

- * These identifiers are used for inventory source types which are not currently implemented server-side in MCPE. - * As a general rule of thumb, anything that doesn't have a permanent inventory is client-side. These types are - * to allow servers to track what is going on in client-side windows. - *

- * Expect these to change in the future. - */ - public static final int SOURCE_TYPE_CRAFTING_ADD_INGREDIENT = -2; - public static final int SOURCE_TYPE_CRAFTING_REMOVE_INGREDIENT = -3; - public static final int SOURCE_TYPE_CRAFTING_RESULT = -4; - public static final int SOURCE_TYPE_CRAFTING_USE_INGREDIENT = -5; - - public static final int SOURCE_TYPE_ANVIL_INPUT = -10; - public static final int SOURCE_TYPE_ANVIL_MATERIAL = -11; - public static final int SOURCE_TYPE_ANVIL_RESULT = -12; - public static final int SOURCE_TYPE_ANVIL_OUTPUT = -13; - - public static final int SOURCE_TYPE_ENCHANT_INPUT = -15; - public static final int SOURCE_TYPE_ENCHANT_MATERIAL = -16; - public static final int SOURCE_TYPE_ENCHANT_OUTPUT = -17; - - public static final int SOURCE_TYPE_TRADING_INPUT_1 = -20; - public static final int SOURCE_TYPE_TRADING_INPUT_2 = -21; - public static final int SOURCE_TYPE_TRADING_USE_INPUTS = -22; - public static final int SOURCE_TYPE_TRADING_OUTPUT = -23; - - public static final int SOURCE_TYPE_BEACON = -24; - - /** - * Any client-side window dropping its contents when the player closes it - */ - public static final int SOURCE_TYPE_CONTAINER_DROP_CONTENTS = -100; - - - public int sourceType; - public int windowId; - public long unknown; - public int inventorySlot; - public Item oldItem; - public Item newItem; - public int stackNetworkId; - - public NetworkInventoryAction read(InventoryTransactionPacket packet) { - this.sourceType = (int) packet.getUnsignedVarInt(); - - switch (this.sourceType) { - case SOURCE_CONTAINER: - this.windowId = packet.getVarInt(); - break; - case SOURCE_WORLD: - this.unknown = packet.getUnsignedVarInt(); - break; - case SOURCE_CREATIVE: - break; - case SOURCE_CRAFT_SLOT: - case SOURCE_TODO: - this.windowId = packet.getVarInt(); - - switch (this.windowId) { - case SOURCE_TYPE_CRAFTING_RESULT: - case SOURCE_TYPE_CRAFTING_USE_INGREDIENT: - packet.isCraftingPart = true; - break; - case SOURCE_TYPE_ENCHANT_INPUT: - case SOURCE_TYPE_ENCHANT_OUTPUT: - case SOURCE_TYPE_ENCHANT_MATERIAL: - packet.isEnchantingPart = true; - break; - case SOURCE_TYPE_ANVIL_INPUT: - case SOURCE_TYPE_ANVIL_MATERIAL: - case SOURCE_TYPE_ANVIL_RESULT: - packet.isRepairItemPart = true; - break; - } - break; - } - - this.inventorySlot = (int) packet.getUnsignedVarInt(); - this.oldItem = packet.getSlot(packet.protocol); - this.newItem = packet.getSlot(packet.protocol); - - if (packet.hasNetworkIds && packet.protocol >= 407 && packet.protocol < ProtocolInfo.v1_16_220) { - this.stackNetworkId = packet.getVarInt(); - } - - return this; - } - - public void write(InventoryTransactionPacket packet) { - packet.putUnsignedVarInt(this.sourceType); - - switch (this.sourceType) { - case SOURCE_CONTAINER: - packet.putVarInt(this.windowId); - break; - case SOURCE_WORLD: - packet.putUnsignedVarInt(this.unknown); - break; - case SOURCE_CREATIVE: - break; - case SOURCE_CRAFT_SLOT: - case SOURCE_TODO: - packet.putVarInt(this.windowId); - break; - } - - packet.putUnsignedVarInt(this.inventorySlot); - packet.putSlot(packet.protocol, this.oldItem); - packet.putSlot(packet.protocol, this.newItem); - - if (packet.hasNetworkIds && packet.protocol >= 407 && packet.protocol < ProtocolInfo.v1_16_220) { - packet.putVarInt(this.stackNetworkId); - } - } - - public InventoryAction createInventoryAction(Player player) { - switch (this.sourceType) { - case SOURCE_CONTAINER: - if (this.windowId == ContainerIds.ARMOR) { - this.inventorySlot += 36; - this.windowId = ContainerIds.INVENTORY; - if (this.newItem == null || - (this.inventorySlot == 36 && !this.newItem.canBePutInHelmetSlot() && !this.oldItem.canBePutInHelmetSlot()) || - (this.inventorySlot == 37 && !this.newItem.isChestplate() && !this.oldItem.isChestplate()) || - (this.inventorySlot == 38 && !this.newItem.isLeggings() && !this.oldItem.isLeggings()) || - (this.inventorySlot == 39 && !this.newItem.isBoots()) && !this.oldItem.isBoots()) { - player.getServer().getLogger().error("Player " + player.getName() + " tried to set an invalid armor item"); - return null; - } - } - - // ID 124 with slot 14/15 is enchant inventory - if (this.windowId == ContainerIds.UI && player.protocol >= ProtocolInfo.v1_16_0) { - switch (this.inventorySlot) { - case PlayerUIComponent.CREATED_ITEM_OUTPUT_UI_SLOT: - if (player.getWindowById(Player.ANVIL_WINDOW_ID) != null) { - this.windowId = Player.ANVIL_WINDOW_ID; - this.inventorySlot = 2; - } - break; - case EnchantInventory.ENCHANT_INPUT_ITEM_UI_SLOT: - if (player.getWindowById(Player.ENCHANT_WINDOW_ID) == null) { - player.getServer().getLogger().error("Player " + player.getName() + " does not have enchant window open"); - return null; - } - this.windowId = Player.ENCHANT_WINDOW_ID; - this.inventorySlot = 0; - // TODO, check if unenchanted item and send EnchantOptionsPacket - break; - case EnchantInventory.ENCHANT_REAGENT_UI_SLOT: - if (player.getWindowById(Player.ENCHANT_WINDOW_ID) == null) { - player.getServer().getLogger().error("Player " + player.getName() + " does not have enchant window open"); - return null; - } - this.windowId = Player.ENCHANT_WINDOW_ID; - this.inventorySlot = 1; - break; - case AnvilInventory.ANVIL_INPUT_UI_SLOT: - if (player.getWindowById(Player.ANVIL_WINDOW_ID) == null) { - player.getServer().getLogger().error("Player " + player.getName() + " does not have anvil window open"); - return null; - } - this.windowId = Player.ANVIL_WINDOW_ID; - this.inventorySlot = 0; - break; - case AnvilInventory.ANVIL_MATERIAL_UI_SLOT: - if (player.getWindowById(Player.ANVIL_WINDOW_ID) == null) { - player.getServer().getLogger().error("Player " + player.getName() + " does not have anvil window open"); - return null; - } - this.windowId = Player.ANVIL_WINDOW_ID; - this.inventorySlot = 1; - break; - } - } - - Inventory window = player.getWindowById(this.windowId); - if (window != null) { - if (window instanceof BaseInventory) { - if (((BaseInventory) window).destroyed) { - player.getServer().getLogger().debug("Player " + player.getName() + " has an invalid open container with window ID " + this.windowId); - return null; - } - } - return new SlotChangeAction(window, this.inventorySlot, this.oldItem, this.newItem); - } - - player.getServer().getLogger().debug("Player " + player.getName() + " has no open container with window ID " + this.windowId); - return null; - case SOURCE_WORLD: - if (this.inventorySlot != InventoryTransactionPacket.ACTION_MAGIC_SLOT_DROP_ITEM) { - player.getServer().getLogger().debug("Only expecting drop-item world actions from the client!"); - return null; - } - - return new DropItemAction(this.oldItem, this.newItem); - case SOURCE_CREATIVE: - int type; - - switch (this.inventorySlot) { - case InventoryTransactionPacket.ACTION_MAGIC_SLOT_CREATIVE_DELETE_ITEM: - type = CreativeInventoryAction.TYPE_DELETE_ITEM; - break; - case InventoryTransactionPacket.ACTION_MAGIC_SLOT_CREATIVE_CREATE_ITEM: - type = CreativeInventoryAction.TYPE_CREATE_ITEM; - break; - default: - player.getServer().getLogger().debug("Unexpected creative action type " + this.inventorySlot); - return null; - } - - return new CreativeInventoryAction(this.oldItem, this.newItem, type); - case SOURCE_CRAFT_SLOT: - case SOURCE_TODO: - switch (this.windowId) { - case SOURCE_TYPE_CRAFTING_ADD_INGREDIENT: - case SOURCE_TYPE_CRAFTING_REMOVE_INGREDIENT: - return new SlotChangeAction(player.getCraftingGrid(), this.inventorySlot, this.oldItem, this.newItem); - case SOURCE_TYPE_CONTAINER_DROP_CONTENTS: - Optional inventory = player.getTopWindow(); - if (!inventory.isPresent()) { - // No window open? - return null; - } - return new SlotChangeAction(inventory.get(), this.inventorySlot, this.oldItem, this.newItem); - case SOURCE_TYPE_CRAFTING_RESULT: - return new CraftingTakeResultAction(this.oldItem, this.newItem); - case SOURCE_TYPE_CRAFTING_USE_INGREDIENT: - return new CraftingTransferMaterialAction(this.oldItem, this.newItem, this.inventorySlot); - } - - if (this.windowId >= SOURCE_TYPE_ANVIL_OUTPUT && this.windowId <= SOURCE_TYPE_ANVIL_INPUT) { - Inventory inv = player.getWindowById(Player.ANVIL_WINDOW_ID); - - if (!(inv instanceof AnvilInventory)) { - player.getServer().getLogger().debug("Player " + player.getName() + " has no open anvil inventory"); - return null; - } - AnvilInventory anvil = (AnvilInventory) inv; - - switch (this.windowId) { - case SOURCE_TYPE_ANVIL_INPUT: - case SOURCE_TYPE_ANVIL_MATERIAL: - case SOURCE_TYPE_ANVIL_RESULT: - return new RepairItemAction(this.oldItem, this.newItem, this.windowId); - } - - return new SlotChangeAction(anvil, this.inventorySlot, this.oldItem, this.newItem); - } - - if (this.windowId >= SOURCE_TYPE_ENCHANT_OUTPUT && this.windowId <= SOURCE_TYPE_ENCHANT_INPUT) { - Inventory inv = player.getWindowById(Player.ENCHANT_WINDOW_ID); - - if (!(inv instanceof EnchantInventory)) { - player.getServer().getLogger().debug("Player " + player.getName() + " has no open enchant inventory"); - return null; - } - EnchantInventory enchant = (EnchantInventory) inv; - - switch (this.windowId) { - case SOURCE_TYPE_ENCHANT_INPUT: - if (player.protocol < 407) { - if (this.inventorySlot != 0) { - // Input should only be in slot 0 - return null; - } - break; - } else { - return new EnchantingAction(this.oldItem, this.newItem, SOURCE_TYPE_ENCHANT_INPUT); - } - case SOURCE_TYPE_ENCHANT_MATERIAL: - if (player.protocol < 407) { - if (this.inventorySlot != 1) { - // Material should only be in slot 1 - return null; - } - } else { - return new EnchantingAction(this.newItem, this.oldItem, SOURCE_TYPE_ENCHANT_MATERIAL); // Mojang ish backwards? - } - break; - case SOURCE_TYPE_ENCHANT_OUTPUT: - if (player.protocol < 407) { - if (this.inventorySlot != 0) { - // Outputs should only be in slot 0 - return null; - } - if (Item.get(ItemID.DYE, 4).equals(this.newItem, true, false)) { - this.inventorySlot = 2; // Fake slot to store used material - if (this.newItem.getCount() < 1 || this.newItem.getCount() > 3) { - // Invalid material - return null; - } - Item material = enchant.getItem(1); - // Material to take away. - int toRemove = this.newItem.getCount(); - if (material.getId() != ItemID.DYE && material.getDamage() != 4 && - material.getCount() < toRemove) { - // Invalid material or not enough - return null; - } - } else { - Item toEnchant = enchant.getItem(0); - Item material = enchant.getItem(1); - if (toEnchant.equals(this.newItem, true, true) && - (material.getId() == ItemID.DYE && material.getDamage() == 4 || player.isCreative())) { - this.inventorySlot = 3; // Fake slot to store the resultant item - - //TODO: Check (old) item has valid enchantments - enchant.setItem(3, this.oldItem, false); - } else { - return null; - } - } - } else { - return new EnchantingAction(this.oldItem, this.newItem, SOURCE_TYPE_ENCHANT_OUTPUT); - } - } - - return new SlotChangeAction(enchant, this.inventorySlot, this.oldItem, this.newItem); - } - - if (this.windowId == SOURCE_TYPE_BEACON) { - Inventory inv = player.getWindowById(Player.BEACON_WINDOW_ID); - - if (!(inv instanceof BeaconInventory)) { - player.getServer().getLogger().debug("Player " + player.getName() + " has no open beacon inventory"); - return null; - } - BeaconInventory beacon = (BeaconInventory) inv; - - this.inventorySlot = 0; - return new SlotChangeAction(beacon, this.inventorySlot, this.oldItem, this.newItem); - } - - player.getServer().getLogger().debug("Player " + player.getName() + " has no open container with window ID " + this.windowId); - return null; - default: - player.getServer().getLogger().debug("Unknown inventory source type " + this.sourceType); - return null; - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/network/query/QueryHandler.java b/src/main/java/cn/nukkit/network/query/QueryHandler.java deleted file mode 100644 index e5ada2f92..000000000 --- a/src/main/java/cn/nukkit/network/query/QueryHandler.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.nukkit.network.query; - -import cn.nukkit.Server; -import cn.nukkit.event.server.QueryRegenerateEvent; -import cn.nukkit.utils.Utils; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.PooledByteBufAllocator; - -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class QueryHandler { - - public static final byte HANDSHAKE = 0x09; - public static final byte STATISTICS = 0x00; - - private final Server server; - private byte[] lastToken; - private byte[] token; - private byte[] longData; - private byte[] shortData; - private long timeout; - - public QueryHandler() { - this.server = Server.getInstance(); - - this.regenerateToken(); - this.lastToken = this.token; - this.regenerateInfo(); - } - - public void regenerateInfo() { - QueryRegenerateEvent ev = this.server.getQueryInformation(); - this.longData = ev.getLongQuery(); - this.shortData = ev.getShortQuery(); - this.timeout = System.currentTimeMillis() + ev.getTimeout(); - } - - public void regenerateToken() { - this.lastToken = this.token; - byte[] token = new byte[16]; - for (int i = 0; i < 16; i++) { - token[i] = (byte) Utils.random.nextInt(255); - } - this.token = token; - } - - public static byte[] getTokenString(String token, InetAddress address) { - return getTokenString(token.getBytes(StandardCharsets.UTF_8), address); - } - - - public static byte[] getTokenString(byte[] token, InetAddress address) { - try { - MessageDigest digest = MessageDigest.getInstance("MD5"); - digest.update(address.toString().getBytes(StandardCharsets.UTF_8)); - digest.update(token); - return Arrays.copyOf(digest.digest(), 4); - } catch (NoSuchAlgorithmException e) { - return ByteBuffer.allocate(4).putInt(Utils.random.nextInt()).array(); - } - } - - public void handle(InetSocketAddress address, ByteBuf packet) { - short packetId = packet.readUnsignedByte(); - int sessionId = packet.readInt(); - - switch (packetId) { - case HANDSHAKE: - ByteBuf reply = PooledByteBufAllocator.DEFAULT.ioBuffer(10); // 1 + 4 + 4 + 1 - reply.writeByte(HANDSHAKE); - reply.writeInt(sessionId); - reply.writeBytes(getTokenString(this.token, address.getAddress())); - reply.writeByte(0); - - this.server.getNetwork().sendPacket(address, reply); - break; - case STATISTICS: - byte[] token = new byte[4]; - packet.readBytes(token); - - if (!Arrays.equals(token, getTokenString(this.token, address.getAddress())) && - !Arrays.equals(token, getTokenString(this.lastToken, address.getAddress()))) { - break; - } - - if (this.timeout < System.currentTimeMillis()) { - this.regenerateInfo(); - } - - reply = PooledByteBufAllocator.DEFAULT.directBuffer(64); - reply.writeByte(STATISTICS); - reply.writeInt(sessionId); - if (packet.readableBytes() == 8) { - reply.writeBytes(this.longData); - } else { - reply.writeBytes(this.shortData); - } - - this.server.getNetwork().sendPacket(address, reply); - break; - } - } -} diff --git a/src/main/java/cn/nukkit/network/rcon/RCON.java b/src/main/java/cn/nukkit/network/rcon/RCON.java deleted file mode 100644 index 49d47d84b..000000000 --- a/src/main/java/cn/nukkit/network/rcon/RCON.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.network.rcon; - -import cn.nukkit.Server; -import cn.nukkit.command.RemoteConsoleCommandSender; -import cn.nukkit.event.server.RemoteServerCommandEvent; -import cn.nukkit.utils.TextFormat; - -import java.io.IOException; - -/** - * Implementation of Source RCON protocol. - * https://developer.valvesoftware.com/wiki/Source_RCON_Protocol - * - * Wrapper for RCONServer. Handles data. - * - * @author Tee7even - */ -public class RCON { - - private final Server server; - private final RCONServer serverThread; - - public RCON(Server server, String password, String address, int port) { - if (password.isEmpty()) { - throw new IllegalArgumentException("nukkit.server.rcon.emptyPasswordError"); - } - - this.server = server; - - try { - this.serverThread = new RCONServer(address, port, password); - this.serverThread.start(); - } catch (IOException e) { - throw new IllegalArgumentException("nukkit.server.rcon.startupError", e); - } - - this.server.getLogger().info(this.server.getLanguage().translateString("nukkit.server.rcon.running", new String[]{address, String.valueOf(port)})); - } - - public void check() { - if (this.serverThread == null) { - return; - } else if (!this.serverThread.isAlive()) { - return; - } - - RCONCommand command; - while ((command = serverThread.receive()) != null) { - RemoteConsoleCommandSender sender = new RemoteConsoleCommandSender(); - RemoteServerCommandEvent event = new RemoteServerCommandEvent(sender, command.getCommand()); - this.server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.server.dispatchCommand(sender, command.getCommand()); - } - - this.serverThread.respond(command.getSender(), command.getId(), TextFormat.clean(sender.getMessages())); - } - } - - public void close() { - try { - synchronized (serverThread) { - serverThread.close(); - serverThread.wait(5000); - } - } catch (InterruptedException ignored) {} - } -} diff --git a/src/main/java/cn/nukkit/network/rcon/RCONCommand.java b/src/main/java/cn/nukkit/network/rcon/RCONCommand.java deleted file mode 100644 index b85eb5cbe..000000000 --- a/src/main/java/cn/nukkit/network/rcon/RCONCommand.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.network.rcon; - -import java.nio.channels.SocketChannel; - -/** - * A data structure to hold sender, request ID and command itself. - * - * @author Tee7even - */ -public class RCONCommand { - - private final SocketChannel sender; - private final int id; - private final String command; - - public RCONCommand(SocketChannel sender, int id, String command) { - this.sender = sender; - this.id = id; - this.command = command; - } - - public SocketChannel getSender() { - return this.sender; - } - - public int getId() { - return this.id; - } - - public String getCommand() { - return this.command; - } -} diff --git a/src/main/java/cn/nukkit/network/rcon/RCONPacket.java b/src/main/java/cn/nukkit/network/rcon/RCONPacket.java deleted file mode 100644 index c5ac7b4f8..000000000 --- a/src/main/java/cn/nukkit/network/rcon/RCONPacket.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.nukkit.network.rcon; - -import java.io.IOException; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -/** - * A data structure representing an RCON packet. - * - * @author Tee7even - */ -public class RCONPacket { - - private final int id; - private final int type; - private final byte[] payload; - - public RCONPacket(int id, int type, byte[] payload) { - this.id = id; - this.type = type; - this.payload = payload; - } - - public RCONPacket(ByteBuffer buffer) throws IOException { - int size = buffer.getInt(); - - if (size > 250000) { - throw new RuntimeException("Too big RCON packet: " + size); - } - - this.id = buffer.getInt(); - this.type = buffer.getInt(); - this.payload = new byte[size - 10]; - buffer.get(this.payload); - - buffer.get(new byte[2]); - } - - public ByteBuffer toBuffer() { - ByteBuffer buffer = ByteBuffer.allocate(this.payload.length + 14); - buffer.order(ByteOrder.LITTLE_ENDIAN); - - buffer.putInt(this.payload.length + 10); - buffer.putInt(this.id); - buffer.putInt(this.type); - buffer.put(this.payload); - - buffer.put((byte) 0); - buffer.put((byte) 0); - - ((Buffer) buffer).flip(); // do not remove the cast - return buffer; - } - - public int getId() { - return id; - } - - public int getType() { - return type; - } - - public byte[] getPayload() { - return payload; - } -} diff --git a/src/main/java/cn/nukkit/network/rcon/RCONServer.java b/src/main/java/cn/nukkit/network/rcon/RCONServer.java deleted file mode 100644 index 7a6cb1308..000000000 --- a/src/main/java/cn/nukkit/network/rcon/RCONServer.java +++ /dev/null @@ -1,219 +0,0 @@ -package cn.nukkit.network.rcon; - -import cn.nukkit.Server; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.Buffer; -import java.nio.BufferUnderflowException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.nio.channels.spi.SelectorProvider; -import java.nio.charset.StandardCharsets; -import java.util.*; - -/** - * Thread that performs all RCON network work. A server. - * - * @author Tee7even - */ -public class RCONServer extends Thread { - - private static final int SERVERDATA_AUTH = 3; - private static final int SERVERDATA_AUTH_RESPONSE = 2; - private static final int SERVERDATA_EXECCOMMAND = 2; - private static final int SERVERDATA_RESPONSE_VALUE = 0; - - private volatile boolean running; - - private ServerSocketChannel serverChannel; - private Selector selector; - - private String password; - private final Set rconSessions = new HashSet<>(); - - private final List receiveQueue = new ArrayList<>(); - private final Map> sendQueues = new HashMap<>(); - - public RCONServer(String address, int port, String password) throws IOException { - this.setName("RCON"); - this.running = true; - - this.serverChannel = ServerSocketChannel.open(); - this.serverChannel.configureBlocking(false); - this.serverChannel.socket().bind(new InetSocketAddress(address, port)); - - this.selector = SelectorProvider.provider().openSelector(); - this.serverChannel.register(this.selector, SelectionKey.OP_ACCEPT); - - this.password = password; - } - - public RCONCommand receive() { - synchronized (this.receiveQueue) { - if (!this.receiveQueue.isEmpty()) { - RCONCommand command = this.receiveQueue.get(0); - this.receiveQueue.remove(0); - return command; - } - - return null; - } - } - - public void respond(SocketChannel channel, int id, String response) { - this.send(channel, new RCONPacket(id, SERVERDATA_RESPONSE_VALUE, response.getBytes())); - } - - public void close() { - this.running = false; - this.selector.wakeup(); - } - - public void run() { - while (this.running) { - try { - synchronized (this.sendQueues) { - for (SocketChannel channel : this.sendQueues.keySet()) { - channel.keyFor(this.selector).interestOps(SelectionKey.OP_WRITE); - } - } - - this.selector.select(); - - Iterator selectedKeys = this.selector.selectedKeys().iterator(); - while (selectedKeys.hasNext()) { - SelectionKey key = selectedKeys.next(); - selectedKeys.remove(); - - if (key.isAcceptable()) { - ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel(); - - SocketChannel socketChannel = serverSocketChannel.accept(); - socketChannel.socket(); - socketChannel.configureBlocking(false); - socketChannel.register(this.selector, SelectionKey.OP_READ); - } else if (key.isReadable()) { - this.read(key); - } else if (key.isWritable()) { - this.write(key); - } - } - } catch (BufferUnderflowException ignored) { - } catch (Exception exception) { - Server.getInstance().getLogger().logException(exception); - } - } - - try { - this.serverChannel.keyFor(this.selector).cancel(); - this.serverChannel.close(); - this.selector.close(); - } catch (IOException exception) { - Server.getInstance().getLogger().logException(exception); - } - - synchronized (this) { - this.notify(); - } - } - - private void read(SelectionKey key) throws IOException { - SocketChannel channel = (SocketChannel) key.channel(); - ByteBuffer buffer = ByteBuffer.allocate(4096); - buffer.order(ByteOrder.LITTLE_ENDIAN); - - int bytesRead; - try { - bytesRead = channel.read(buffer); - } catch (IOException exception) { - key.cancel(); - channel.close(); - this.rconSessions.remove(channel); - this.sendQueues.remove(channel); - return; - } - - if (bytesRead == -1) { - key.cancel(); - channel.close(); - this.rconSessions.remove(channel); - this.sendQueues.remove(channel); - return; - } - - ((Buffer) buffer).flip(); // do not remove the cast - this.handle(channel, new RCONPacket(buffer)); - } - - private void handle(SocketChannel channel, RCONPacket packet) { - switch (packet.getType()) { - case SERVERDATA_AUTH: - byte[] payload = new byte[1]; - - if (new String(packet.getPayload(), StandardCharsets.UTF_8).equals(this.password)) { - this.rconSessions.add(channel); - this.send(channel, new RCONPacket(packet.getId(), SERVERDATA_AUTH_RESPONSE, payload)); - try { Server.getInstance().getLogger().info("[RCON] " + channel.getRemoteAddress().toString() + " connected"); } catch (Exception ignored) {} - return; - } - - try { Server.getInstance().getLogger().info("[RCON] Authentication failed for " + channel.getRemoteAddress().toString()); } catch (Exception ignored) {} - this.send(channel, new RCONPacket(-1, SERVERDATA_AUTH_RESPONSE, payload)); - break; - case SERVERDATA_EXECCOMMAND: - if (!this.rconSessions.contains(channel)) { - return; - } - - String command = new String(packet.getPayload(), StandardCharsets.UTF_8).trim(); - synchronized (this.receiveQueue) { - this.receiveQueue.add(new RCONCommand(channel, packet.getId(), command)); - } - break; - } - } - - private void write(SelectionKey key) throws IOException { - SocketChannel channel = (SocketChannel) key.channel(); - - synchronized (this.sendQueues) { - List queue = this.sendQueues.get(channel); - - ByteBuffer buffer = queue.get(0).toBuffer(); - try { - channel.write(buffer); - queue.remove(0); - } catch (IOException exception) { - key.cancel(); - channel.close(); - this.rconSessions.remove(channel); - this.sendQueues.remove(channel); - return; - } - - if (queue.isEmpty()) { - this.sendQueues.remove(channel); - } - - key.interestOps(SelectionKey.OP_READ); - } - } - - private void send(SocketChannel channel, RCONPacket packet) { - if (!channel.keyFor(this.selector).isValid()) { - return; - } - - synchronized (this.sendQueues) { - List queue = sendQueues.computeIfAbsent(channel, k -> new ArrayList<>()); - queue.add(packet); - } - - this.selector.wakeup(); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/permission/BanEntry.java b/src/main/java/cn/nukkit/permission/BanEntry.java deleted file mode 100644 index 12de6220e..000000000 --- a/src/main/java/cn/nukkit/permission/BanEntry.java +++ /dev/null @@ -1,115 +0,0 @@ -package cn.nukkit.permission; - -import cn.nukkit.Server; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.TreeMap; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BanEntry { - - public static final String format = "yyyy-MM-dd HH:mm:ss Z"; - - private final String name; - private Date creationDate; - private String source = "(Unknown)"; - private Date expirationDate = null; - private String reason = "Banned"; - - public BanEntry(String name) { - this.name = name.toLowerCase(); - this.creationDate = new Date(); - } - - public String getName() { - return name; - } - - public Date getCreationDate() { - return creationDate; - } - - public void setCreationDate(Date creationDate) { - this.creationDate = creationDate; - } - - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - - public Date getExpirationDate() { - return expirationDate; - } - - public void setExpirationDate(Date expirationDate) { - this.expirationDate = expirationDate; - } - - public boolean hasExpired() { - Date now = new Date(); - return this.expirationDate != null && this.expirationDate.before(now); - } - - public String getReason() { - return reason; - } - - public void setReason(String reason) { - this.reason = reason; - } - - public LinkedHashMap getMap() { - LinkedHashMap map = new LinkedHashMap<>(); - map.put("name", name); - map.put("creationDate", new SimpleDateFormat(format).format(creationDate)); - map.put("source", this.source); - map.put("expireDate", expirationDate != null ? new SimpleDateFormat(format).format(expirationDate) : "Forever"); - map.put("reason", this.reason); - return map; - } - - public static BanEntry fromMap(Map map) { - BanEntry banEntry = new BanEntry(map.get("name")); - try { - banEntry.setCreationDate(new SimpleDateFormat(format).parse(map.get("creationDate"))); - banEntry.setExpirationDate(!map.get("expireDate").equals("Forever") ? new SimpleDateFormat(format).parse(map.get("expireDate")) : null); - } catch (ParseException e) { - Server.getInstance().getLogger().logException(e); - } - banEntry.setSource(map.get("source")); - banEntry.setReason(map.get("reason")); - return banEntry; - } - - public String getString() { - return new Gson().toJson(this.getMap()); - } - - public static BanEntry fromString(String str) { - Map map = new Gson().fromJson(str, new TypeToken>() { - }.getType()); - BanEntry banEntry = new BanEntry(map.get("name")); - try { - banEntry.setCreationDate(new SimpleDateFormat(format).parse(map.get("creationDate"))); - banEntry.setExpirationDate(!map.get("expireDate").equals("Forever") ? new SimpleDateFormat(format).parse(map.get("expireDate")) : null); - } catch (ParseException e) { - Server.getInstance().getLogger().logException(e); - } - banEntry.setSource(map.get("source")); - banEntry.setReason(map.get("reason")); - return banEntry; - } -} diff --git a/src/main/java/cn/nukkit/permission/BanList.java b/src/main/java/cn/nukkit/permission/BanList.java deleted file mode 100644 index 03c565e64..000000000 --- a/src/main/java/cn/nukkit/permission/BanList.java +++ /dev/null @@ -1,141 +0,0 @@ -package cn.nukkit.permission; - -import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.Utils; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class BanList { - - private LinkedHashMap list = new LinkedHashMap<>(); - - private final String file; - - private boolean enable = true; - - public BanList(String file) { - this.file = file; - } - - public boolean isEnable() { - return enable; - } - - public void setEnable(boolean enable) { - this.enable = enable; - } - - public LinkedHashMap getEntires() { - removeExpired(); - return this.list; - } - - public boolean isBanned(String name) { - if (!this.enable || name == null) { - return false; - } else { - this.removeExpired(); - - return this.list.containsKey(name.toLowerCase()); - } - } - - public void add(BanEntry entry) { - this.list.put(entry.getName(), entry); - this.save(); - } - - public BanEntry addBan(String target) { - return this.addBan(target, null); - } - - public BanEntry addBan(String target, String reason) { - return this.addBan(target, reason, null); - } - - public BanEntry addBan(String target, String reason, Date expireDate) { - return this.addBan(target, reason, expireDate, null); - } - - public BanEntry addBan(String target, String reason, Date expireDate, String source) { - BanEntry entry = new BanEntry(target); - entry.setSource(source != null ? source : entry.getSource()); - entry.setExpirationDate(expireDate); - entry.setReason(reason != null ? reason : entry.getReason()); - - this.add(entry); - - return entry; - } - - public void remove(String name) { - name = name.toLowerCase(); - if (this.list.containsKey(name)) { - this.list.remove(name); - this.save(); - } - } - - - public void removeExpired() { - for (String name : new ArrayList<>(this.list.keySet())) { - BanEntry entry = this.list.get(name); - if (entry.hasExpired()) { - list.remove(name); - } - } - } - - public void load() { - this.list = new LinkedHashMap<>(); - File file = new File(this.file); - try { - if (!file.exists()) { - file.createNewFile(); - this.save(); - } else { - - LinkedList> list = new Gson().fromJson(Utils.readFile(this.file), new LinkedListTypeToken().getType()); - for (TreeMap map : list) { - BanEntry entry = BanEntry.fromMap(map); - this.list.put(entry.getName(), entry); - } - } - } catch (IOException e) { - MainLogger.getLogger().error("Could not load ban list: ", e); - } - } - - public void save() { - this.removeExpired(); - - try { - File file = new File(this.file); - if (!file.exists()) { - file.createNewFile(); - } - - LinkedList> list = new LinkedList<>(); - for (BanEntry entry : this.list.values()) { - list.add(entry.getMap()); - } - Utils.writeFile(this.file, new ByteArrayInputStream(new GsonBuilder().setPrettyPrinting().create().toJson(list).getBytes(StandardCharsets.UTF_8))); - } catch (IOException e) { - MainLogger.getLogger().error("Could not save ban list ", e); - } - } - - private static class LinkedListTypeToken extends TypeToken>> { - } -} diff --git a/src/main/java/cn/nukkit/permission/DefaultPermissions.java b/src/main/java/cn/nukkit/permission/DefaultPermissions.java deleted file mode 100644 index e7f3b2944..000000000 --- a/src/main/java/cn/nukkit/permission/DefaultPermissions.java +++ /dev/null @@ -1,133 +0,0 @@ -package cn.nukkit.permission; - -import cn.nukkit.Server; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public abstract class DefaultPermissions { - - public static final String ROOT = "nukkit"; - - public static Permission registerPermission(Permission perm) { - return registerPermission(perm, null); - } - - public static Permission registerPermission(Permission perm, Permission parent) { - if (parent != null) { - parent.getChildren().put(perm.getName(), true); - } - Server.getInstance().getPluginManager().addPermission(perm); - - return Server.getInstance().getPluginManager().getPermission(perm.getName()); - } - - public static void registerCorePermissions() { - Permission parent = registerPermission(new Permission(ROOT, "Allows using all Nukkit commands and utilities")); - - Permission broadcasts = registerPermission(new Permission("nukkit.broadcast", "Allows the user to receive all broadcast messages"), parent); - - registerPermission(new Permission("nukkit.broadcast.admin", "Allows the user to receive administrative broadcasts", Permission.DEFAULT_OP), broadcasts); - registerPermission(new Permission("nukkit.broadcast.user", "Allows the user to receive user broadcasts", Permission.DEFAULT_TRUE), broadcasts); - - broadcasts.recalculatePermissibles(); - - Permission commands = registerPermission(new Permission("nukkit.command", "Allows using all Nukkit commands"), parent); - - Permission whitelist = registerPermission(new Permission("nukkit.command.whitelist", "Allows the user to modify the server whitelist", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.whitelist.add", "Allows the user to add a player to the server whitelist"), whitelist); - registerPermission(new Permission("nukkit.command.whitelist.remove", "Allows the user to remove a player to the server whitelist"), whitelist); - registerPermission(new Permission("nukkit.command.whitelist.reload", "Allows the user to reload the server whitelist"), whitelist); - registerPermission(new Permission("nukkit.command.whitelist.enable", "Allows the user to enable the server whitelist"), whitelist); - registerPermission(new Permission("nukkit.command.whitelist.disable", "Allows the user to disable the server whitelist"), whitelist); - registerPermission(new Permission("nukkit.command.whitelist.list", "Allows the user to list all the players on the server whitelist"), whitelist); - whitelist.recalculatePermissibles(); - - Permission ban = registerPermission(new Permission("nukkit.command.ban", "Allows the user to ban people", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.ban.player", "Allows the user to ban players"), ban); - registerPermission(new Permission("nukkit.command.ban.ip", "Allows the user to ban IP addresses"), ban); - registerPermission(new Permission("nukkit.command.ban.list", "Allows the user to list all the banned ips or players"), ban); - ban.recalculatePermissibles(); - - Permission unban = registerPermission(new Permission("nukkit.command.unban", "Allows the user to unban people", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.unban.player", "Allows the user to unban players"), unban); - registerPermission(new Permission("nukkit.command.unban.ip", "Allows the user to unban IP addresses"), unban); - unban.recalculatePermissibles(); - - Permission op = registerPermission(new Permission("nukkit.command.op", "Allows the user to change operators", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.op.give", "Allows the user to give a player operator status"), op); - registerPermission(new Permission("nukkit.command.op.take", "Allows the user to take a players operator status"), op); - op.recalculatePermissibles(); - - Permission save = registerPermission(new Permission("nukkit.command.save", "Allows the user to save the worlds", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.save.enable", "Allows the user to enable automatic saving"), save); - registerPermission(new Permission("nukkit.command.save.disable", "Allows the user to disable automatic saving"), save); - registerPermission(new Permission("nukkit.command.save.perform", "Allows the user to perform a manual save"), save); - save.recalculatePermissibles(); - - Permission time = registerPermission(new Permission("nukkit.command.time", "Allows the user to alter the time", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.time.add", "Allows the user to fast-forward time"), time); - registerPermission(new Permission("nukkit.command.time.set", "Allows the user to change the time"), time); - registerPermission(new Permission("nukkit.command.time.start", "Allows the user to restart the time"), time); - registerPermission(new Permission("nukkit.command.time.stop", "Allows the user to stop the time"), time); - registerPermission(new Permission("nukkit.command.time.query", "Allows the user query the time"), time); - time.recalculatePermissibles(); - - Permission kill = registerPermission(new Permission("nukkit.command.kill", "Allows the user to kill players", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.kill.self", "Allows the user to commit suicide", Permission.DEFAULT_TRUE), kill); - registerPermission(new Permission("nukkit.command.kill.other", "Allows the user to kill other players"), kill); - kill.recalculatePermissibles(); - - Permission gamemode = registerPermission(new Permission("nukkit.command.gamemode", "Allows the user to change the gamemode of players", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.gamemode.survival", "Allows the user to change the gamemode to survival", Permission.DEFAULT_OP), gamemode); - registerPermission(new Permission("nukkit.command.gamemode.creative", "Allows the user to change the gamemode to creative", Permission.DEFAULT_OP), gamemode); - registerPermission(new Permission("nukkit.command.gamemode.adventure", "Allows the user to change the gamemode to adventure", Permission.DEFAULT_OP), gamemode); - registerPermission(new Permission("nukkit.command.gamemode.spectator", "Allows the user to change the gamemode to spectator", Permission.DEFAULT_OP), gamemode); - registerPermission(new Permission("nukkit.command.gamemode.other", "Allows the user to change the gamemode of other players", Permission.DEFAULT_OP), gamemode); - gamemode.recalculatePermissibles(); - - registerPermission(new Permission("nukkit.command.me", "Allows the user to perform a chat action", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.tell", "Allows the user to privately message another player", Permission.DEFAULT_TRUE), commands); - registerPermission(new Permission("nukkit.command.say", "Allows the user to talk as the console", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.give", "Allows the user to give items to players", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.effect", "Allows the user to give/take potion effects", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.particle", "Allows the user to create particle effects", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.teleport", "Allows the user to teleport players", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.kick", "Allows the user to kick players", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.stop", "Allows the user to stop the server", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.list", "Allows the user to list all online players", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.help", "Allows the user to view the help menu", Permission.DEFAULT_TRUE), commands); - registerPermission(new Permission("nukkit.command.plugins", "Allows the user to view the list of plugins", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.reload", "Allows the user to reload the server settings", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.version", "Allows the user to view the version of the server", Permission.DEFAULT_TRUE), commands); - registerPermission(new Permission("nukkit.command.version.plugins", "Allows the user to view the version of the plugins", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.defaultgamemode", "Allows the user to change the default gamemode", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.status", "Allows the user to view the server performance", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.gc", "Allows the user to fire garbage collection tasks", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.timings", "Allows the user to records timings for all plugin events", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.title", "Allows the user to send titles to players", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.spawnpoint", "Allows the user to change player's spawnpoint", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.setworldspawn", "Allows the user to change the world spawn", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.weather", "Allows the user to change the weather", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.xp", "Allows the user to give experience", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.transferserver", "Allows the user to transfer to other server", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.summon", "Allows the user to summon entities", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.world", "Allows the user to switch world", Server.getInstance().suomiCraftPEMode() ? Permission.DEFAULT_TRUE : Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.world.others", "Allows the user to switch world for other players", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.generateworld", "Allows the user to generate new world", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.seed", "Allows the user to see world's seed", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.playsound", "Allows the user to play sounds", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.debug.perform", "Allows the user to create debug paste", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.gamerule", "Allows the user to change game rules", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.spawn", "Allows the user to use spawn command", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.enchant", "Allows the user to enchant items", Permission.DEFAULT_OP), commands); - registerPermission(new Permission("nukkit.command.difficulty", "Allows the user to change difficulty", Permission.DEFAULT_OP), commands); - - registerPermission(new Permission("nukkit.textcolor", "Allows the user to write colored text", Permission.DEFAULT_OP), commands); - - commands.recalculatePermissibles(); - - parent.recalculatePermissibles(); - } -} diff --git a/src/main/java/cn/nukkit/permission/Permissible.java b/src/main/java/cn/nukkit/permission/Permissible.java deleted file mode 100644 index 795c8d3c6..000000000 --- a/src/main/java/cn/nukkit/permission/Permissible.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.permission; - -import cn.nukkit.plugin.Plugin; - -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface Permissible extends ServerOperator { - - boolean isPermissionSet(String name); - - boolean isPermissionSet(Permission permission); - - boolean hasPermission(String name); - - boolean hasPermission(Permission permission); - - PermissionAttachment addAttachment(Plugin plugin); - - PermissionAttachment addAttachment(Plugin plugin, String name); - - PermissionAttachment addAttachment(Plugin plugin, String name, Boolean value); - - void removeAttachment(PermissionAttachment attachment); - - void recalculatePermissions(); - - Map getEffectivePermissions(); -} diff --git a/src/main/java/cn/nukkit/permission/PermissibleBase.java b/src/main/java/cn/nukkit/permission/PermissibleBase.java deleted file mode 100644 index 6c9442e7b..000000000 --- a/src/main/java/cn/nukkit/permission/PermissibleBase.java +++ /dev/null @@ -1,170 +0,0 @@ -package cn.nukkit.permission; - -import cn.nukkit.Server; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.utils.PluginException; -import cn.nukkit.utils.ServerException; -import co.aikar.timings.Timings; -import io.netty.util.internal.ConcurrentSet; - -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PermissibleBase implements Permissible { - - ServerOperator opable; - - private Permissible parent = null; - - private final Set attachments = new ConcurrentSet<>(); - - private final Map permissions = new ConcurrentHashMap<>(); - - public PermissibleBase(ServerOperator opable) { - this.opable = opable; - if (opable instanceof Permissible) { - this.parent = (Permissible) opable; - } - } - - @Override - public boolean isOp() { - return this.opable != null && this.opable.isOp(); - } - - @Override - public void setOp(boolean value) { - if (this.opable == null) { - throw new ServerException("Cannot change op value as no ServerOperator is set"); - } else { - this.opable.setOp(value); - } - } - - @Override - public boolean isPermissionSet(String name) { - return this.permissions.containsKey(name); - } - - @Override - public boolean isPermissionSet(Permission permission) { - return this.isPermissionSet(permission.getName()); - } - - @Override - public boolean hasPermission(String name) { - if (this.isPermissionSet(name)) { - return this.permissions.get(name).getValue(); - } - - Permission perm = Server.getInstance().getPluginManager().getPermission(name); - - if (perm != null) { - String permission = perm.getDefault(); - - return Permission.DEFAULT_TRUE.equals(permission) || (this.isOp() && Permission.DEFAULT_OP.equals(permission)) || (!this.isOp() && Permission.DEFAULT_NOT_OP.equals(permission)); - } else { - return Permission.DEFAULT_TRUE.equals(Permission.DEFAULT_PERMISSION) || (this.isOp() && Permission.DEFAULT_OP.equals(Permission.DEFAULT_PERMISSION)) || (!this.isOp() && Permission.DEFAULT_NOT_OP.equals(Permission.DEFAULT_PERMISSION)); - } - } - - @Override - public boolean hasPermission(Permission permission) { - return this.hasPermission(permission.getName()); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin) { - return this.addAttachment(plugin, null, null); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, String name) { - return this.addAttachment(plugin, name, null); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, String name, Boolean value) { - if (!plugin.isEnabled()) { - throw new PluginException("Plugin " + plugin.getDescription().getName() + " is disabled"); - } - - PermissionAttachment result = new PermissionAttachment(plugin, this.parent != null ? this.parent : this); - this.attachments.add(result); - if (name != null && value != null) { - result.setPermission(name, value); - } - this.recalculatePermissions(); - - return result; - } - - @Override - public void removeAttachment(PermissionAttachment attachment) { - if (this.attachments.contains(attachment)) { - this.attachments.remove(attachment); - PermissionRemovedExecutor ex = attachment.getRemovalCallback(); - if (ex != null) { - ex.attachmentRemoved(attachment); - } - this.recalculatePermissions(); - } - } - - @Override - public void recalculatePermissions() { - if (Timings.permissibleCalculationTimer != null) Timings.permissibleCalculationTimer.startTiming(); - - this.clearPermissions(); - Map defaults = Server.getInstance().getPluginManager().getDefaultPermissions(this.isOp()); - Server.getInstance().getPluginManager().subscribeToDefaultPerms(this.isOp(), this.parent != null ? this.parent : this); - - for (Permission perm : defaults.values()) { - String name = perm.getName(); - this.permissions.put(name, new PermissionAttachmentInfo(this.parent != null ? this.parent : this, name, null, true)); - Server.getInstance().getPluginManager().subscribeToPermission(name, this.parent != null ? this.parent : this); - this.calculateChildPermissions(perm.getChildren(), false, null); - } - - for (PermissionAttachment attachment : this.attachments) { - this.calculateChildPermissions(attachment.getPermissions(), false, attachment); - } - if (Timings.permissibleCalculationTimer != null) Timings.permissibleCalculationTimer.stopTiming(); - } - - public void clearPermissions() { - for (String name : this.permissions.keySet()) { - Server.getInstance().getPluginManager().unsubscribeFromPermission(name, this.parent != null ? this.parent : this); - } - - Server.getInstance().getPluginManager().unsubscribeFromDefaultPerms(false, this.parent != null ? this.parent : this); - Server.getInstance().getPluginManager().unsubscribeFromDefaultPerms(true, this.parent != null ? this.parent : this); - - this.permissions.clear(); - } - - private void calculateChildPermissions(Map children, boolean invert, PermissionAttachment attachment) { - for (Map.Entry entry : children.entrySet()) { - String name = entry.getKey(); - Permission perm = Server.getInstance().getPluginManager().getPermission(name); - boolean v = entry.getValue(); - boolean value = (v ^ invert); - this.permissions.put(name, new PermissionAttachmentInfo(this.parent != null ? this.parent : this, name, attachment, value)); - Server.getInstance().getPluginManager().subscribeToPermission(name, this.parent != null ? this.parent : this); - - if (perm != null) { - this.calculateChildPermissions(perm.getChildren(), !value, attachment); - } - } - } - - @Override - public Map getEffectivePermissions() { - return this.permissions; - } -} diff --git a/src/main/java/cn/nukkit/permission/Permission.java b/src/main/java/cn/nukkit/permission/Permission.java deleted file mode 100644 index e3cbaf346..000000000 --- a/src/main/java/cn/nukkit/permission/Permission.java +++ /dev/null @@ -1,191 +0,0 @@ -package cn.nukkit.permission; - -import cn.nukkit.Server; - -import java.util.*; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Permission { - - public final static String DEFAULT_OP = "op"; - public final static String DEFAULT_NOT_OP = "notop"; - public final static String DEFAULT_TRUE = "true"; - public final static String DEFAULT_FALSE = "false"; - - public static final String DEFAULT_PERMISSION = DEFAULT_OP; - - public static String getByName(String value) { - switch (value.toLowerCase()) { - case "op": - case "isop": - case "operator": - case "isoperator": - case "admin": - case "isadmin": - return DEFAULT_OP; - - case "!op": - case "notop": - case "!operator": - case "notoperator": - case "!admin": - case "notadmin": - return DEFAULT_NOT_OP; - - case "true": - return DEFAULT_TRUE; - - default: - return DEFAULT_FALSE; - } - } - - private final String name; - - private String description; - - private final Map children; - - private String defaultValue; - - public Permission(String name) { - this(name, null, null, new HashMap<>()); - } - - public Permission(String name, String description) { - this(name, description, null, new HashMap<>()); - } - - public Permission(String name, String description, String defualtValue) { - this(name, description, defualtValue, new HashMap<>()); - } - - public Permission(String name, String description, String defualtValue, Map children) { - this.name = name; - this.description = description != null ? description : ""; - this.defaultValue = defualtValue != null ? defualtValue : DEFAULT_PERMISSION; - this.children = children; - - this.recalculatePermissibles(); - } - - public String getName() { - return name; - } - - public Map getChildren() { - return children; - } - - public String getDefault() { - return defaultValue; - } - - public void setDefault(String value) { - if (!value.equals(this.defaultValue)) { - this.defaultValue = value; - this.recalculatePermissibles(); - } - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Set getPermissibles() { - return Server.getInstance().getPluginManager().getPermissionSubscriptions(this.name); - } - - public void recalculatePermissibles() { - Set perms = this.getPermissibles(); - - Server.getInstance().getPluginManager().recalculatePermissionDefaults(this); - - for (Permissible p : perms) { - p.recalculatePermissions(); - } - } - - public void addParent(Permission permission, boolean value) { - this.children.put(this.name, value); - permission.recalculatePermissibles(); - } - - public Permission addParent(String name, boolean value) { - Permission perm = Server.getInstance().getPluginManager().getPermission(name); - if (perm == null) { - perm = new Permission(name); - Server.getInstance().getPluginManager().addPermission(perm); - } - - this.addParent(perm, value); - - return perm; - } - - public static List loadPermissions(Map data) { - return loadPermissions(data, DEFAULT_OP); - } - - public static List loadPermissions(Map data, String defaultValue) { - List result = new ArrayList<>(); - if (data != null) { - for (Map.Entry e : data.entrySet()) { - String key = (String) e.getKey(); - Map entry = (Map) e.getValue(); - result.add(loadPermission(key, entry, defaultValue, result)); - } - } - return result; - } - - public static Permission loadPermission(String name, Map data) { - return loadPermission(name, data, DEFAULT_OP, new ArrayList<>()); - } - - public static Permission loadPermission(String name, Map data, String defaultValue) { - return loadPermission(name, data, defaultValue, new ArrayList<>()); - } - - public static Permission loadPermission(String name, Map data, String defaultValue, List output) { - String desc = null; - Map children = new HashMap<>(); - if (data.containsKey("default")) { - String value = Permission.getByName(String.valueOf(data.get("default"))); - if (value != null) { - defaultValue = value; - } else { - throw new IllegalStateException("'default' key contained unknown value"); - } - } - - if (data.containsKey("children")) { - if (data.get("children") instanceof Map) { - for (Map.Entry entry : ((Map) data.get("children")).entrySet()) { - String k = (String) entry.getKey(); - Object v = entry.getValue(); - if (v instanceof Map) { - Permission permission = loadPermission(k, (Map) v, defaultValue, output); - output.add(permission); - } - children.put(k, true); - } - } else { - throw new IllegalStateException("'children' key is of wrong type"); - } - } - - if (data.containsKey("description")) { - desc = (String) data.get("description"); - } - - return new Permission(name, desc, defaultValue, children); - } -} diff --git a/src/main/java/cn/nukkit/permission/PermissionAttachment.java b/src/main/java/cn/nukkit/permission/PermissionAttachment.java deleted file mode 100644 index 05afd75b4..000000000 --- a/src/main/java/cn/nukkit/permission/PermissionAttachment.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.nukkit.permission; - -import cn.nukkit.plugin.Plugin; -import cn.nukkit.utils.PluginException; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PermissionAttachment { - - private PermissionRemovedExecutor removed = null; - - private final Map permissions = new HashMap<>(); - - private Permissible permissible; - - private Plugin plugin; - - public PermissionAttachment(Plugin plugin, Permissible permissible) { - if (!plugin.isEnabled()) { - throw new PluginException("Plugin " + plugin.getDescription().getName() + " is disabled"); - } - this.permissible = permissible; - this.plugin = plugin; - } - - public Plugin getPlugin() { - return plugin; - } - - public void setRemovalCallback(PermissionRemovedExecutor executor) { - this.removed = executor; - } - - public PermissionRemovedExecutor getRemovalCallback() { - return removed; - } - - public Map getPermissions() { - return permissions; - } - - public void clearPermissions() { - this.permissions.clear(); - this.permissible.recalculatePermissions(); - } - - public void setPermissions(Map permissions) { - for (Map.Entry entry : permissions.entrySet()) { - String key = entry.getKey(); - Boolean value = entry.getValue(); - this.permissions.put(key, value); - } - this.permissible.recalculatePermissions(); - } - - public void unsetPermissions(List permissions) { - for (String node : permissions) { - this.permissions.remove(node); - } - this.permissible.recalculatePermissions(); - } - - public void setPermission(Permission permission, boolean value) { - this.setPermission(permission.getName(), value); - } - - public void setPermission(String name, boolean value) { - if (this.permissions.containsKey(name)) { - if (this.permissions.get(name).equals(value)) { - return; - } - this.permissions.remove(name); - } - this.permissions.put(name, value); - this.permissible.recalculatePermissions(); - } - - public void unsetPermission(Permission permission, boolean value) { - this.unsetPermission(permission.getName(), value); - } - - public void unsetPermission(String name, boolean value) { - if (this.permissions.containsKey(name)) { - this.permissions.remove(name); - this.permissible.recalculatePermissions(); - } - } - - public void remove() { - this.permissible.removeAttachment(this); - } -} diff --git a/src/main/java/cn/nukkit/permission/PermissionAttachmentInfo.java b/src/main/java/cn/nukkit/permission/PermissionAttachmentInfo.java deleted file mode 100644 index e60de2f63..000000000 --- a/src/main/java/cn/nukkit/permission/PermissionAttachmentInfo.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.permission; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PermissionAttachmentInfo { - - private Permissible permissible; - - private String permission; - - private PermissionAttachment attachment; - - private boolean value; - - public PermissionAttachmentInfo(Permissible permissible, String permission, PermissionAttachment attachment, boolean value) { - if (permission == null) { - throw new IllegalStateException("Permission may not be null"); - } - - this.permissible = permissible; - this.permission = permission; - this.attachment = attachment; - this.value = value; - } - - public Permissible getPermissible() { - return permissible; - } - - public String getPermission() { - return permission; - } - - public PermissionAttachment getAttachment() { - return attachment; - } - - public boolean getValue() { - return value; - } -} diff --git a/src/main/java/cn/nukkit/permission/PermissionRemovedExecutor.java b/src/main/java/cn/nukkit/permission/PermissionRemovedExecutor.java deleted file mode 100644 index 8d6affbe4..000000000 --- a/src/main/java/cn/nukkit/permission/PermissionRemovedExecutor.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.nukkit.permission; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public interface PermissionRemovedExecutor { - - void attachmentRemoved(PermissionAttachment attachment); -} diff --git a/src/main/java/cn/nukkit/permission/ServerOperator.java b/src/main/java/cn/nukkit/permission/ServerOperator.java deleted file mode 100644 index 1051458a4..000000000 --- a/src/main/java/cn/nukkit/permission/ServerOperator.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.permission; - -/** - * 能成为服务器管理员(OP)的对象。
- * Who can be an operator(OP). - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.permission.Permissible - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface ServerOperator { - - /** - * 返回这个对象是不是服务器管理员。
- * Returns if this object is an operator. - * - * @return 这个对象是不是服务器管理员。
if this object is an operator. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean isOp(); - - /** - * 把这个对象设置成服务器管理员。
- * Sets this object to be an operator or not to be. - * - * @param value {@code true}为授予管理员,{@code false}为取消管理员。
- * {@code true} for giving this operator or {@code false} for cancelling. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void setOp(boolean value); -} diff --git a/src/main/java/cn/nukkit/plugin/EventExecutor.java b/src/main/java/cn/nukkit/plugin/EventExecutor.java deleted file mode 100644 index 297e0e4a2..000000000 --- a/src/main/java/cn/nukkit/plugin/EventExecutor.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.event.Event; -import cn.nukkit.event.Listener; -import cn.nukkit.utils.EventException; - -/** - * @author iNevet - * Nukkit Project - */ -public interface EventExecutor { - - void execute(Listener listener, Event event) throws EventException; -} diff --git a/src/main/java/cn/nukkit/plugin/JavaPluginLoader.java b/src/main/java/cn/nukkit/plugin/JavaPluginLoader.java deleted file mode 100644 index 274a520fa..000000000 --- a/src/main/java/cn/nukkit/plugin/JavaPluginLoader.java +++ /dev/null @@ -1,163 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.Server; -import cn.nukkit.event.plugin.PluginDisableEvent; -import cn.nukkit.event.plugin.PluginEnableEvent; -import cn.nukkit.utils.PluginException; -import cn.nukkit.utils.Utils; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.regex.Pattern; - -/** - * Created by Nukkit Team. - */ -public class JavaPluginLoader implements PluginLoader { - - private final Server server; - - private final Map classes = new HashMap<>(); - private final Map classLoaders = new HashMap<>(); - - public JavaPluginLoader(Server server) { - this.server = server; - } - - @Override - public Plugin loadPlugin(File file) throws Exception { - PluginDescription description = this.getPluginDescription(file); - if (description != null) { - this.server.getLogger().info(this.server.getLanguage().translateString("nukkit.plugin.load", description.getFullName())); - File dataFolder = new File(file.getParentFile(), description.getName()); - if (dataFolder.exists() && !dataFolder.isDirectory()) { - throw new IllegalStateException("Projected dataFolder '" + dataFolder.toString() + "' for " + description.getName() + " exists and is not a directory"); - } - - String className = description.getMain(); - PluginClassLoader classLoader = new PluginClassLoader(this, this.getClass().getClassLoader(), file); - this.classLoaders.put(description.getName(), classLoader); - PluginBase plugin; - try { - Class javaClass = classLoader.loadClass(className); - - if (!PluginBase.class.isAssignableFrom(javaClass)) { - throw new PluginException("Main class `" + description.getMain() + "' does not extend PluginBase"); - } - - try { - Class pluginClass = (Class) javaClass.asSubclass(PluginBase.class); - - plugin = pluginClass.newInstance(); - this.initPlugin(plugin, description, dataFolder, file); - - return plugin; - } catch (ClassCastException e) { - throw new PluginException("Error whilst initializing main class `" + description.getMain() + '\'', e); - } catch (InstantiationException | IllegalAccessException e) { - Server.getInstance().getLogger().logException(e); - } - } catch (ClassNotFoundException e) { - throw new PluginException("Couldn't load plugin " + description.getName() + ": main class not found"); - } - } - - return null; - } - - @Override - public Plugin loadPlugin(String filename) throws Exception { - return this.loadPlugin(new File(filename)); - } - - @Override - public PluginDescription getPluginDescription(File file) { - try (JarFile jar = new JarFile(file)) { - JarEntry entry = jar.getJarEntry("server.properties"); - if (entry == null) { - entry = jar.getJarEntry("nukkit.yml"); - if (entry == null) { - entry = jar.getJarEntry("plugin.yml"); - if (entry == null) { - return null; - } - } - } - try (InputStream stream = jar.getInputStream(entry)) { - return new PluginDescription(Utils.readFile(stream)); - } - } catch (IOException e) { - return null; - } - } - - @Override - public PluginDescription getPluginDescription(String filename) { - return this.getPluginDescription(new File(filename)); - } - - @Override - public Pattern[] getPluginFilters() { - return new Pattern[]{Pattern.compile("^.+\\.jar$")}; - } - - private void initPlugin(PluginBase plugin, PluginDescription description, File dataFolder, File file) { - plugin.init(this, this.server, description, dataFolder, file); - plugin.onLoad(); - } - - @Override - public void enablePlugin(Plugin plugin) { - if (plugin instanceof PluginBase && !plugin.isEnabled()) { - this.server.getLogger().info(this.server.getLanguage().translateString("nukkit.plugin.enable", plugin.getDescription().getFullName())); - - ((PluginBase) plugin).setEnabled(true); - - this.server.getPluginManager().callEvent(new PluginEnableEvent(plugin)); - } - } - - @Override - public void disablePlugin(Plugin plugin) { - if (plugin instanceof PluginBase && plugin.isEnabled()) { - this.server.getLogger().info(this.server.getLanguage().translateString("nukkit.plugin.disable", plugin.getDescription().getFullName())); - - this.server.getServiceManager().cancel(plugin); - - this.server.getPluginManager().callEvent(new PluginDisableEvent(plugin)); - - ((PluginBase) plugin).setEnabled(false); - } - } - - Class getClassByName(final String name) { - Class cachedClass = classes.get(name); - - if (cachedClass != null) { - return cachedClass; - } else { - for (PluginClassLoader loader : this.classLoaders.values()) { - - try { - cachedClass = loader.findClass(name, false); - } catch (ClassNotFoundException ignored) { - } - if (cachedClass != null) { - return cachedClass; - } - } - } - return null; - } - - void setClass(final String name, final Class clazz) { - if (!classes.containsKey(name)) { - classes.put(name, clazz); - } - } -} diff --git a/src/main/java/cn/nukkit/plugin/Library.java b/src/main/java/cn/nukkit/plugin/Library.java deleted file mode 100644 index b5f8eff95..000000000 --- a/src/main/java/cn/nukkit/plugin/Library.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.nukkit.plugin; - -public interface Library { - - String getGroupId(); - - String getArtifactId(); - - String getVersion(); -} diff --git a/src/main/java/cn/nukkit/plugin/LibraryLoadException.java b/src/main/java/cn/nukkit/plugin/LibraryLoadException.java deleted file mode 100644 index 509dc852f..000000000 --- a/src/main/java/cn/nukkit/plugin/LibraryLoadException.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.nukkit.plugin; - -@SuppressWarnings("serial") -public class LibraryLoadException extends RuntimeException { - - public LibraryLoadException(Library library) { - super("Load library " + library.getArtifactId() + " failed!"); - } -} diff --git a/src/main/java/cn/nukkit/plugin/LibraryLoader.java b/src/main/java/cn/nukkit/plugin/LibraryLoader.java deleted file mode 100644 index 81fb87676..000000000 --- a/src/main/java/cn/nukkit/plugin/LibraryLoader.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.nukkit.plugin; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.file.Files; -import java.util.logging.Logger; - -public class LibraryLoader { - - private static final File BASE_FOLDER = new File("./libraries"); - private static final Logger LOGGER = Logger.getLogger("LibraryLoader"); - private static final String SUFFIX = ".jar"; - - static { - if (BASE_FOLDER.mkdir()) { - LOGGER.info("Created libraries folder."); - } - } - - public static void load(String library) { - String[] split = library.split(":"); - if (split.length != 3) { - throw new IllegalArgumentException(library); - } - load(new Library() { - public String getGroupId() { - return split[0]; - } - - public String getArtifactId() { - return split[1]; - } - - public String getVersion() { - return split[2]; - } - }); - } - - public static void load(Library library) { - String filePath = library.getGroupId().replace('.', '/') + '/' + library.getArtifactId() + '/' + library.getVersion(); - String fileName = library.getArtifactId() + '-' + library.getVersion() + SUFFIX; - - File folder = new File(BASE_FOLDER, filePath); - if (folder.mkdirs()) { - LOGGER.info("Created " + folder.getPath() + '.'); - } - - File file = new File(folder, fileName); - if (!file.isFile()) try { - URL url = new URL("https://repo1.maven.org/maven2/" + filePath + '/' + fileName); - LOGGER.info("Get library from " + url + '.'); - Files.copy(url.openStream(), file.toPath()); - LOGGER.info("Get library " + fileName + " done!"); - } catch (IOException e) { - throw new LibraryLoadException(library); - } - - try { - Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); - boolean accessible = method.isAccessible(); - if (!accessible) { - method.setAccessible(true); - } - URLClassLoader classLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader(); - URL url = file.toURI().toURL(); - method.invoke(classLoader, url); - method.setAccessible(accessible); - } catch (NoSuchMethodException | MalformedURLException | IllegalAccessException | InvocationTargetException e) { - throw new LibraryLoadException(library); - } - - LOGGER.info("Load library " + fileName + " done!"); - } - - public static File getBaseFolder() { - return BASE_FOLDER; - } -} diff --git a/src/main/java/cn/nukkit/plugin/MethodEventExecutor.java b/src/main/java/cn/nukkit/plugin/MethodEventExecutor.java deleted file mode 100644 index 5efd61626..000000000 --- a/src/main/java/cn/nukkit/plugin/MethodEventExecutor.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.event.Event; -import cn.nukkit.event.Listener; -import cn.nukkit.utils.EventException; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class MethodEventExecutor implements EventExecutor { - - private final Method method; - - public MethodEventExecutor(Method method) { - this.method = method; - } - - @SuppressWarnings("unchecked") - @Override - public void execute(Listener listener, Event event) throws EventException { - try { - Class[] params = (Class[]) method.getParameterTypes(); - for (Class param : params) { - if (param.isAssignableFrom(event.getClass())) { - method.invoke(listener, event); - break; - } - } - } catch (InvocationTargetException ex) { - throw new EventException(ex.getCause()); - } catch (ClassCastException ex) { - // We are going to ignore ClassCastException because EntityDamageEvent can't be cast to EntityDamageByEntityEvent - } catch (Throwable t) { - throw new EventException(t); - } - } - - public Method getMethod() { - return method; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/plugin/Plugin.java b/src/main/java/cn/nukkit/plugin/Plugin.java deleted file mode 100644 index 4310e3b9c..000000000 --- a/src/main/java/cn/nukkit/plugin/Plugin.java +++ /dev/null @@ -1,279 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.Server; -import cn.nukkit.command.CommandExecutor; -import cn.nukkit.utils.Config; - -import java.io.File; -import java.io.InputStream; - -/** - * 所有Nukkit插件必须实现的接口。
- * An interface what must be implemented by all Nukkit plugins. - * - * 对于插件作者,我们建议让插件主类继承{@link cn.nukkit.plugin.PluginBase}类,而不是实现这个接口。
- * For plugin developers: it's recommended to use {@link cn.nukkit.plugin.PluginBase} for an actual plugin - * instead of implement this interface. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.plugin.PluginBase - * @see cn.nukkit.plugin.PluginDescription - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface Plugin extends CommandExecutor { - /** - * 在一个Nukkit插件被加载时调用的方法。这个方法会在{@link Plugin#onEnable()}之前调用。
- * Called when a Nukkit plugin is loaded, before {@link Plugin#onEnable()} . - * - * 应该填写加载插件时需要作出的动作。例如:初始化数组、初始化数据库连接。
- * Use this to init a Nukkit plugin, such as init arrays or init database connections. - * - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void onLoad(); - - /** - * 在一个Nukkit插件被启用时调用的方法。
- * Called when a Nukkit plugin is enabled. - * - * 应该填写插件启用时需要作出的动作。例如:读取配置文件、读取资源、连接数据库。
- * Use this to open config files, open resources, connect databases. - * - * 注意到可能存在的插件管理器插件,这个方法在插件多次重启时可能被调用多次。
- * Notes that there may be plugin manager plugins, - * this method can be called many times when a plugin is restarted many times. - * - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void onEnable(); - - /** - * 返回这个Nukkit插件是否已启用。
- * Whether this Nukkit plugin is enabled. - * - * @return 这个插件是否已经启用。
Whether this plugin is enabled. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean isEnabled(); - - /** - * 在一个Nukkit插件被停用时调用的方法。
- * Called when a Nukkit plugin is disabled. - * - * 应该填写插件停用时需要作出的动作。例如:关闭数据库,断开资源。
- * Use this to free open things and finish actions, - * such as disconnecting databases and close resources. - * - * 注意到可能存在的插件管理器插件,这个方法在插件多次重启时可能被调用多次。
- * Notes that there may be plugin manager plugins, - * this method can be called many times when a plugin is restarted many times. - * - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void onDisable(); - - /** - * 返回这个Nukkit插件是否已停用。
- * Whether this Nukkit plugin is disabled. - * - * @return 这个插件是否已经停用。
Whether this plugin is disabled. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean isDisabled(); - - /** - * 返回这个Nukkit插件的数据文件夹。
- * The data folder of this Nukkit plugin. - * - * 一般情况下,数据文件夹名字与插件名字相同,而且都放在nukkit安装目录下的plugins文件夹里。
- * Under normal circumstances, the data folder has the same name with the plugin, - * and is placed in the 'plugins' folder inside the nukkit installation directory. - * - * @return 这个插件的数据文件夹。
The data folder of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - File getDataFolder(); - - /** - * 返回描述这个Nukkit插件的{@link PluginDescription}对象。
- * The description this Nukkit plugin as a {@link PluginDescription} object. - * - * 对于jar格式的Nukkit插件,插件的描述在plugin.yml文件内定义。
- * For jar-packed Nukkit plugins, the description is defined in the 'plugin.yml' file. - * - * @return 这个插件的描述。
A description of this plugin. - * @see cn.nukkit.plugin.PluginDescription - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - PluginDescription getDescription(); - - /** - * 读取这个插件特定的资源文件,并返回为{@code InputStream}对象。
- * Reads a resource of this plugin, and returns as an {@code InputStream} object. - * - * 对于jar格式的Nukkit插件,Nukkit会在jar包内的资源文件夹(一般为resources文件夹)寻找资源文件。
- * For jar-packed Nukkit plugins, Nukkit will look for your resource file in the resources folder, - * which is normally named 'resources' and placed in plugin jar file. - * - * 当你需要把一个文件的所有内容读取为字符串,可以使用 函数, - * 来从{@code InputStream}读取所有内容为字符串。例如:
- * When you need to read the whole file content as a String, you can use - * to read from a {@code InputStream} and get whole content as a String. For example: - * {@code String string = Utils.readFile(this.getResource("string.txt"));} - * - * @param filename 要读取的资源文件名字。
The name of the resource file to read. - * @return 读取的资源文件的 {@code InputStream}对象。若错误会返回{@code null}
- * The resource as an {@code InputStream} object, or {@code null} when an error occurred. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - InputStream getResource(String filename); - - /** - * 保存这个Nukkit插件的资源。
- * Saves the resource of this plugin. - * - * 对于jar格式的Nukkit插件,Nukkit会在jar包内的资源文件夹寻找资源文件,然后保存到数据文件夹。
- * For jar-packed Nukkit plugins, Nukkit will look for your resource file in the resources folder, - * which is normally named 'resources' and placed in plugin jar file, and copy it into data folder. - * - * 这个函数通常用来在插件被加载(load)时,保存默认的资源文件。这样插件在启用(enable)时不会错误读取空的资源文件, - * 用户也无需从开发者处手动下载资源文件后再使用插件。
- * This is usually used to save the default plugin resource when the plugin is LOADED .If this is used, - * it won't happen to load an empty resource when plugin is ENABLED, and plugin users are not required to get - * default resources from the developer and place it manually. - * - * 如果需要替换已存在的资源文件,建议使用{@link cn.nukkit.plugin.Plugin#saveResource(String, boolean)}
- * If you need to REPLACE an existing resource file, it's recommended - * to use {@link cn.nukkit.plugin.Plugin#saveResource(String, boolean)}. - * - * @param filename 要保存的资源文件名字。
The name of the resource file to save. - * @return 保存是否成功。
true if the saving action is successful. - * @see cn.nukkit.plugin.Plugin#saveDefaultConfig - * @see cn.nukkit.plugin.Plugin#saveResource(String, boolean) - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - boolean saveResource(String filename); - - /** - * 保存或替换这个Nukkit插件的资源。
- * Saves or replaces the resource of this plugin. - * - * 对于jar格式的Nukkit插件,Nukkit会在jar包内的资源文件夹寻找资源文件,然后保存到数据文件夹。
- * For jar-packed Nukkit plugins, Nukkit will look for your resource file in the resources folder, - * which is normally named 'resources' and placed in plugin jar file, and copy it into data folder. - * - * 如果需要保存默认的资源文件,建议使用{@link cn.nukkit.plugin.Plugin#saveResource(String)}
- * If you need to SAVE DEFAULT resource file, it's recommended - * to use {@link cn.nukkit.plugin.Plugin#saveResource(String)}. - * - * @param filename 要保存的资源文件名字。
The name of the resource file to save. - * @param replace 是否替换目标文件。
if true, Nukkit will replace the target resource file. - * @return 保存是否成功。
true if the saving action is successful. - * @see cn.nukkit.plugin.Plugin#saveResource(String) - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - - boolean saveResource(String filename, boolean replace); - - boolean saveResource(String filename, String outputName, boolean replace); - - /** - * 返回这个Nukkit插件配置文件的{@link cn.nukkit.utils.Config}对象。
- * The config file this Nukkit plugin as a {@link cn.nukkit.utils.Config} object. - * - * 一般地,插件的配置保存在数据文件夹下的config.yml文件。
- * Normally, the plugin config is saved in the 'config.yml' file in its data folder. - * - * @return 插件的配置文件。
The configuration of this plugin. - * @see cn.nukkit.plugin.Plugin#getDataFolder - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Config getConfig(); - - /** - * 保存这个Nukkit插件的配置文件。
- * Saves the plugin config. - * - * @see cn.nukkit.plugin.Plugin#getDataFolder - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void saveConfig(); - - /** - * 保存这个Nukkit插件的默认配置文件。
- * Saves the DEFAULT plugin config. - * - * 执行这个函数时,Nukkit会在资源文件夹内寻找开发者配置好的默认配置文件config.yml,然后保存在数据文件夹。 - * 如果数据文件夹已经有一个config.yml文件,Nukkit不会替换这个文件。
- * When this is used, Nukkit will look for the default 'config.yml' file which is configured by plugin developer - * and save it to the data folder. If a config.yml file exists in the data folder, Nukkit won't replace it. - * - * 这个函数通常用来在插件被加载(load)时,保存默认的配置文件。这样插件在启用(enable)时不会错误读取空的配置文件, - * 用户也无需从开发者处手动下载配置文件保存后再使用插件。
- * This is usually used to save the default plugin config when the plugin is LOADED .If this is used, - * it won't happen to load an empty config when plugin is ENABLED, and plugin users are not required to get - * default config from the developer and place it manually. - * - * @see cn.nukkit.plugin.Plugin#getDataFolder - * @see cn.nukkit.plugin.Plugin#saveResource - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void saveDefaultConfig(); - - /** - * 重新读取这个Nukkit插件的默认配置文件。
- * Reloads the plugin config. - * - * 执行这个函数时,Nukkit会从数据文件夹中的config.yml文件重新加载配置。 - * 这样用户在调整插件配置后,无需重启就可以马上使用新的配置。
- * By using this, Nukkit will reload the config from 'config.yml' file, then it isn't necessary to restart - * for plugin user who changes the config and needs to use new config at once. - * - * @see cn.nukkit.plugin.Plugin#getDataFolder - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void reloadConfig(); - - /** - * 返回运行这个插件的服务器的{@link cn.nukkit.Server}对象。
- * Gets the server which is running this plugin, and returns as a {@link cn.nukkit.Server} object. - * - * @see cn.nukkit.Server - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Server getServer(); - - /** - * 返回这个插件的名字。
- * Returns the name of this plugin. - * - * Nukkit会从已经读取的插件描述中获取插件的名字。
- * Nukkit will read plugin name from plugin description. - * - * @see cn.nukkit.plugin.Plugin#getDescription - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - String getName(); - - /** - * 返回这个插件的日志记录器为{@link cn.nukkit.plugin.PluginLogger}对象。
- * Returns the logger of this plugin as a {@link cn.nukkit.plugin.PluginLogger} object. - * - * 使用日志记录器,你可以在控制台和日志文件输出信息。
- * You can use a plugin logger to output messages to the console and log file. - * - * @see cn.nukkit.plugin.PluginLogger - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - PluginLogger getLogger(); - - /** - * 返回这个插件的加载器为{@link cn.nukkit.plugin.PluginLoader}对象。
- * Returns the loader of this plugin as a {@link cn.nukkit.plugin.PluginLoader} object. - * - * @see cn.nukkit.plugin.PluginLoader - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - PluginLoader getPluginLoader(); -} diff --git a/src/main/java/cn/nukkit/plugin/PluginBase.java b/src/main/java/cn/nukkit/plugin/PluginBase.java deleted file mode 100644 index 9b32de7c6..000000000 --- a/src/main/java/cn/nukkit/plugin/PluginBase.java +++ /dev/null @@ -1,294 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.Server; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.PluginIdentifiableCommand; -import cn.nukkit.utils.Config; -import cn.nukkit.utils.Utils; -import com.google.common.base.Preconditions; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.LinkedHashMap; - -/** - * 一般的Nukkit插件需要继承的类。
- * A class to be extended by a normal Nukkit plugin. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see cn.nukkit.plugin.PluginDescription - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -abstract public class PluginBase implements Plugin { - - private PluginLoader loader; - - private Server server; - - private boolean isEnabled = false; - - private boolean initialized = false; - - private PluginDescription description; - - private File dataFolder; - private Config config; - private File configFile; - private File file; - private PluginLogger logger; - - - public void onLoad() { - - } - - public void onEnable() { - - } - - public void onDisable() { - - } - - public final boolean isEnabled() { - return isEnabled; - } - - /** - * 加载这个插件。
- * Enables this plugin. - * - * 如果你需要卸载这个插件,建议使用{@link #setEnabled(boolean)}
- * If you need to disable this plugin, it's recommended to use {@link #setEnabled(boolean)} - * - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public final void setEnabled() { - this.setEnabled(true); - } - - /** - * 加载或卸载这个插件。
- * Enables or disables this plugin. - * - * 插件管理器插件常常使用这个方法。
- * It's normally used by a plugin manager plugin to manage plugins. - * - * @param value {@code true}为加载,{@code false}为卸载。
{@code true} for enable, {@code false} for disable. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public final void setEnabled(boolean value) { - if (isEnabled != value) { - isEnabled = value; - if (isEnabled) { - onEnable(); - } else { - onDisable(); - } - } - } - - public final boolean isDisabled() { - return !isEnabled; - } - - public final File getDataFolder() { - return dataFolder; - } - - public final PluginDescription getDescription() { - return description; - } - - /** - * 初始化这个插件。
- * Initialize the plugin. - * - * 这个方法会在加载(load)之前被插件加载器调用,初始化关于插件的一些事项,不能被重写。
- * Called by plugin loader before load, and initialize the plugin. Can't be overridden. - * - * @param loader 加载这个插件的插件加载器的{@code PluginLoader}对象。
- * The plugin loader ,which loads this plugin, as a {@code PluginLoader} object. - * @param server 运行这个插件的服务器的{@code Server}对象。
- * The server running this plugin, as a {@code Server} object. - * @param description 描述这个插件的{@code PluginDescription}对象。
- * A {@code PluginDescription} object that describes this plugin. - * @param dataFolder 这个插件的数据的文件夹。
- * The data folder of this plugin. - * @param file 这个插件的文件{@code File}对象。对于jar格式的插件,就是jar文件本身。
- * The {@code File} object of this plugin itself. For jar-packed plugins, it is the jar file itself. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public final void init(PluginLoader loader, Server server, PluginDescription description, File dataFolder, File file) { - if (!initialized) { - initialized = true; - this.loader = loader; - this.server = server; - this.description = description; - this.dataFolder = dataFolder; - this.file = file; - this.configFile = new File(this.dataFolder, "config.yml"); - this.logger = new PluginLogger(this); - } - } - - public PluginLogger getLogger() { - return logger; - } - - /** - * 返回这个插件是否已经初始化。
- * Returns if this plugin is initialized. - * - * @return 这个插件是否已初始化。
if this plugin is initialized. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public final boolean isInitialized() { - return initialized; - } - - /** - * TODO: FINISH JAVADOC - */ - public PluginIdentifiableCommand getCommand(String name) { - PluginIdentifiableCommand command = this.server.getPluginCommand(name); - if (command == null || !command.getPlugin().equals(this)) { - command = this.server.getPluginCommand(this.description.getName().toLowerCase() + ':' + name); - } - - if (command != null && command.getPlugin().equals(this)) { - return command; - } else { - return null; - } - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - return false; - } - - @Override - public InputStream getResource(String filename) { - return this.getClass().getClassLoader().getResourceAsStream(filename); - } - - @Override - public boolean saveResource(String filename) { - return saveResource(filename, false); - } - - @Override - public boolean saveResource(String filename, boolean replace) { - return saveResource(filename, filename, replace); - } - - @Override - public boolean saveResource(String filename, String outputName, boolean replace) { - Preconditions.checkArgument(filename != null && outputName != null, "Filename can not be null!"); - Preconditions.checkArgument(!filename.trim().isEmpty() && !outputName.trim().isEmpty(), "Filename can not be empty!"); - - File out = new File(dataFolder, outputName); - if (!out.exists() || replace) { - try (InputStream resource = getResource(filename)) { - if (resource != null) { - File outFolder = out.getParentFile(); - if (!outFolder.exists()) { - outFolder.mkdirs(); - } - Utils.writeFile(out, resource); - - return true; - } - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - } - } - return false; - } - - @Override - public Config getConfig() { - if (this.config == null) { - this.reloadConfig(); - } - return this.config; - } - - @Override - public void saveConfig() { - if (!this.getConfig().save()) { - this.logger.critical("Could not save config to " + this.configFile.toString()); - } - } - - @Override - public void saveDefaultConfig() { - if (!this.configFile.exists()) { - this.saveResource("config.yml", false); - } - } - - @Override - public void reloadConfig() { - this.config = new Config(this.configFile); - InputStream configStream = this.getResource("config.yml"); - if (configStream != null) { - DumperOptions dumperOptions = new DumperOptions(); - dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - Yaml yaml = new Yaml(dumperOptions); - try { - this.config.setDefault(yaml.loadAs(Utils.readFile(this.configFile), LinkedHashMap.class)); - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - } - } - } - - @Override - public Server getServer() { - return server; - } - - @Override - public String getName() { - return this.description.getName(); - } - - /** - * 返回这个插件完整的名字。
- * Returns the full name of this plugin. - * - * 一个插件完整的名字由{@code 名字+" v"+版本号}组成。比如:
- * A full name of a plugin is composed by {@code name+" v"+version}.for example: - * {@code HelloWorld v1.0.0} - * - * @return 这个插件完整的名字。
The full name of this plugin. - * @see cn.nukkit.plugin.PluginDescription#getFullName - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public final String getFullName() { - return this.description.getFullName(); - } - - /** - * 返回这个插件的文件{@code File}对象。对于jar格式的插件,就是jar文件本身。
- * Returns the {@code File} object of this plugin itself. For jar-packed plugins, it is the jar file itself. - * - * @return 这个插件的文件 {@code File}对象。
The {@code File} object of this plugin itself. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public File getFile() { - return file; - } - - @Override - public PluginLoader getPluginLoader() { - return this.loader; - } -} diff --git a/src/main/java/cn/nukkit/plugin/PluginClassLoader.java b/src/main/java/cn/nukkit/plugin/PluginClassLoader.java deleted file mode 100644 index 90f0f08dc..000000000 --- a/src/main/java/cn/nukkit/plugin/PluginClassLoader.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.nukkit.plugin; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.HashMap; -import java.util.Map; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PluginClassLoader extends URLClassLoader { - - private JavaPluginLoader loader; - - private final Map classes = new HashMap<>(); - - public PluginClassLoader(JavaPluginLoader loader, ClassLoader parent, File file) throws MalformedURLException { - super(new URL[]{file.toURI().toURL()}, parent); - this.loader = loader; - } - - @Override - protected Class findClass(String name) throws ClassNotFoundException { - return this.findClass(name, true); - - } - - protected Class findClass(String name, boolean checkGlobal) throws ClassNotFoundException { - if (name.startsWith("cn.nukkit.") || name.startsWith("net.minecraft.")) { - throw new ClassNotFoundException(name); - } - Class result = classes.get(name); - - if (result == null) { - if (checkGlobal) { - result = loader.getClassByName(name); - } - - if (result == null) { - result = super.findClass(name); - - if (result != null) { - loader.setClass(name, result); - } - } - - classes.put(name, result); - } - - return result; - } -} diff --git a/src/main/java/cn/nukkit/plugin/PluginDescription.java b/src/main/java/cn/nukkit/plugin/PluginDescription.java deleted file mode 100644 index d6349ca30..000000000 --- a/src/main/java/cn/nukkit/plugin/PluginDescription.java +++ /dev/null @@ -1,388 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.permission.Permission; -import cn.nukkit.utils.PluginException; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; - -import java.util.*; - -/** - * 描述一个Nukkit插件的类。
- * Describes a Nukkit plugin. - * - * 在jar格式的插件中,插件的描述内容可以在plugin.yml中定义。比如这个:
- * The description of a jar-packed plugin can be defined in the 'plugin.yml' file. For example: - *

- * name: HelloWorldPlugin
- * main: com.cnblogs.xtypr.helloworldplugin.HelloWorldPlugin
- * version: "1.0.0"
- * api: ["1.0.0"]
- * load: POSTWORLD
- * @author 粉鞋大妈
- * description: A simple Hello World plugin for Nukkit
- * website: http://www.cnblogs.com/xtypr
- * permissions:
- *  helloworldplugin.command.helloworld:
- *   description: Allows to use helloworld command.
- *   default: true
- * commands:
- *  helloworld:
- *   description: the helloworld command
- *   usage: "/helloworld"
- *   permission: helloworldplugin.command.helloworld
- * depend:
- * - TestPlugin1
- * 
- * 在使用plugin.yml来定义插件时,{@code name}、{@code main}、{@code version}、{@code api}这几个字段是必需的, - * 要让Nukkit能够正常加载你的插件,必须要合理地填写这几个字段。
- * When using plugin.yml file to define your plugin, it's REQUIRED to fill these items: - * {@code name},{@code main},{@code version} and {@code api}.You are supposed to fill these items to make sure - * your plugin can be normally loaded by Nukkit.
- * - * 接下来对所有的字段做一些说明,加粗的字段表示必需,斜体表示可选:(来自 - * 粉鞋大妈的博客文章
- * Here are some instructions for there items, bold means required, italic means optional: (From - * a blog article of @粉鞋大妈) - *
    - *
  • name
    - * 字符串,表示这个插件的名字,名字是区分不同插件的标准之一。 - * 插件的名字不能包含“nukkit”“minecraft”“mojang”这几个字符串,而且不应该包含空格。
    - * String, the plugin name. Name is one of the ways to distinguish different plugins. - * A plugin name can't contain 'nukkit' 'minecraft' 'mojang', and shouldn't contain spaces.
  • - *
  • version
    - * 字符串,表示这个插件的版本号。使用类似于1.0.0这样的版本号时,应该使用引号包围来防止误识别。
    - * String, the version string of plugin. When using the version string like "1.0.0", - * quotation marks are required to add, or there will be an exception.
  • - *
  • api
    - * 字符串序列,表示这个插件支持的Nukkit API版本号列表。插件作者应该调试能支持的API,然后把版本号添加到这个列表。
    - * A set of String, the Nukkit API versions that the plugin supports. Plugin developers should debug in different - * Nukkit APIs and try out the versions supported, and add them to this list.
  • - *
  • main
    - * 字符串,表示这个插件的主类。插件的主类不能放在“cn.nukkit”包下
    - * String, the main class of plugin. The main class can't be placed at 'cn.nukkit' package.
  • - *
  • author or authors
    - * 字符串/字符串序列,两个任选一个,表示这个插件的作者/作者列表。
    - * String or A set of String. One of two is chosen, to describe the author or the list of authors.
  • - *
  • website
    - * 字符串,表示这个插件的网站。插件使用者或者开发者可以访问这个网站来获取插件更多的信息。 - * 这个网站可以是插件发布帖子或者插件官网等。
    - * String, the website of plugin. More information can be found by visiting this website. The website - * can be a forum post or the official website.
  • - *
  • description
    - * 字符串,表示这个插件的一些描述。
    - * String, some description of plugin.
  • - *
  • depend
    - * 序列,表示这个插件所依赖的一个或一些插件的名字的列表。参见:{@link PluginDescription#getDepend()}
    - * List, strings for plugin names, what is depended on by this plugin. See: - * {@link PluginDescription#getDepend()}
  • - *
  • prefix
    - * 字符串,表示这个插件的消息头衔。参见:{@link PluginDescription#getPrefix()}
    - * String, the message title of the plugin. See: {@link PluginDescription#getPrefix()}
  • - *
  • load
    - * 字符串,表示这个插件的加载顺序,或者说在什么时候加载。参见:{@link PluginLoadOrder}
    - * String, the load order of plugin, or when the plugin loads. See: {@link PluginLoadOrder}
  • - *
  • commands
    - * 序列,表示这个插件的命令列表。
    - * List, the command list.
  • - *
  • permissions
    - * 序列,表示这个插件的权限组列表。
    - * List, the list of permission groups defined.
  • - *
- * - * @author MagicDroidX(code) @ Nukkit Project - * @author iNevet(code and javadoc) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see Plugin - * @see PluginLoadOrder - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public class PluginDescription { - - private String name; - private String main; - private List api; - private List depend = new ArrayList<>(); - private List softDepend = new ArrayList<>(); - private List loadBefore = new ArrayList<>(); - private String version; - private Map commands = new HashMap<>(); - private String description; - private final List authors = new ArrayList<>(); - private String website; - private String prefix; - private PluginLoadOrder order = PluginLoadOrder.POSTWORLD; - - private List permissions = new ArrayList<>(); - - public PluginDescription(Map yamlMap) { - this.loadMap(yamlMap); - } - - public PluginDescription(String yamlString) { - DumperOptions dumperOptions = new DumperOptions(); - dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - Yaml yaml = new Yaml(dumperOptions); - this.loadMap(yaml.loadAs(yamlString, LinkedHashMap.class)); - } - - private void loadMap(Map plugin) throws PluginException { - this.name = ((String) plugin.get("name")).replaceAll("[^A-Za-z0-9 _.-]", ""); - if (this.name.isEmpty()) { - throw new PluginException("Invalid PluginDescription name"); - } - this.name = this.name.replace(" ", "_"); - this.version = String.valueOf(plugin.get("version")); - this.main = (String) plugin.get("main"); - Object api = plugin.get("api"); - if (api instanceof List) { - this.api = (List) api; - } else { - List list = new ArrayList<>(); - list.add((String) api); - this.api = list; - } - if (this.main.startsWith("cn.nukkit.")) { - throw new PluginException("Invalid PluginDescription main, cannot start within the cn.nukkit. package"); - } - - if (plugin.containsKey("commands") && plugin.get("commands") instanceof Map) { - this.commands = (Map) plugin.get("commands"); - } - - if (plugin.containsKey("depend")) { - this.depend = (List) plugin.get("depend"); - } - - if (plugin.containsKey("softdepend")) { - this.softDepend = (List) plugin.get("softdepend"); - } - - if (plugin.containsKey("loadbefore")) { - this.loadBefore = (List) plugin.get("loadbefore"); - } - - if (plugin.containsKey("website")) { - this.website = (String) plugin.get("website"); - } - - if (plugin.containsKey("description")) { - this.description = (String) plugin.get("description"); - } - - if (plugin.containsKey("prefix")) { - this.prefix = (String) plugin.get("prefix"); - } - - if (plugin.containsKey("load")) { - String order = (String) plugin.get("load"); - try { - this.order = PluginLoadOrder.valueOf(order); - } catch (Exception e) { - throw new PluginException("Invalid PluginDescription load"); - } - } - - if (plugin.containsKey("author")) { - this.authors.add((String) plugin.get("author")); - } - - if (plugin.containsKey("authors")) { - this.authors.addAll((Collection) plugin.get("authors")); - } - - if (plugin.containsKey("permissions")) { - this.permissions = Permission.loadPermissions((Map) plugin.get("permissions")); - } - } - - /** - * 返回这个插件完整的名字。
- * Returns the full name of this plugin. - * - * 一个插件完整的名字由{@code 名字+" v"+版本号}组成。比如:
- * A full name of a plugin is composed by {@code name+" v"+version}.for example: - * {@code HelloWorld v1.0.0} - * - * @return 这个插件完整的名字。
The full name of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public String getFullName() { - return this.name + " v" + this.version; - } - - /** - * 返回这个插件支持的Nukkit API版本列表。
- * Returns all Nukkit API versions this plugin supports. - * - * @return 这个插件支持的Nukkit API版本列表。
A list of all Nukkit API versions String this plugin supports. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public List getCompatibleAPIs() { - return api; - } - - /** - * 返回这个插件的作者列表。
- * Returns all the authors of this plugin. - * - * @return 这个插件的作者列表。
A list of all authors of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public List getAuthors() { - return authors; - } - - /** - * 返回这个插件的信息前缀。
- * Returns the message title of this plugin. - * - * 插件的信息前缀在记录器记录信息时,会作为信息头衔使用。如果没有定义记录器,会使用插件的名字作为信息头衔。
- * When a PluginLogger logs, the message title is used as the prefix of message. If prefix is undefined, - * the plugin name will be used instead. - * - * @return 这个插件的作信息前缀。如果没定义,返回{@code null}。
- * The message title of this plugin, or{@code null} if undefined. - * @see PluginLogger - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public String getPrefix() { - return prefix; - } - - /** - * 返回这个插件定义的命令列表。
- * Returns all the defined commands of this plugin. - * - * @return 这个插件定义的命令列表。
A map of all defined commands of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public Map getCommands() { - return commands; - } - - /** - * 返回这个插件所依赖的插件名字。
- * The names of the plugins what is depended by this plugin. - * - * Nukkit插件的依赖有这些注意事项:
Here are some note for Nukkit plugin depending: - *
    - *
  • 一个插件不能依赖自己(否则会报错)。
    A plugin can not depend on itself (or there will be an exception).
  • - *
  • 如果一个插件依赖另一个插件,那么必须要安装依赖的插件后才能加载这个插件。
    - * If a plugin relies on another one, the another one must be installed at the same time, or Nukkit - * won't load this plugin.
  • - *
  • 当一个插件所依赖的插件不存在时,Nukkit不会加载这个插件,但是会提醒用户去安装所依赖的插件。
    - * When the required dependency plugin does not exists, Nukkit won't load this plugin, but will tell the - * user that this dependency is required.
  • - *
- * - * 举个例子,如果A插件依赖于B插件,在没有安装B插件而安装A插件的情况下,Nukkit会阻止A插件的加载。 - * 只有在安装B插件前安装了它所依赖的A插件,Nukkit才会允许加载B插件。
- * For example, there is a Plugin A which relies on Plugin B. If you installed A without installing B, - * Nukkit won't load A because its dependency B is lost. Only when B is installed, A will be loaded - * by Nukkit. - * - * @return 插件名字列表的 {@code List}对象。
A {@code List} object carries the plugin names. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public List getDepend() { - return depend; - } - - /** - * 返回这个插件的描述文字。
- * Returns the description text of this plugin. - * - * @return 这个插件的描述文字。
The description text of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public String getDescription() { - return description; - } - - /** - * TODO finish javadoc - */ - public List getLoadBefore() { - return loadBefore; - } - - /** - * 返回这个插件的主类名。
- * Returns the main class name of this plugin. - * - * 一个插件的加载都是从主类开始的。主类的名字在插件的配置文件中定义后可以通过这个函数返回。一个返回值例子:
- * The load action of a Nukkit plugin begins from main class. The name of main class should be defined - * in the plugin configuration, and it can be returned by this function. An example for return value:
- * {@code "com.example.ExamplePlugin"} - * - * @return 这个插件的主类名。
The main class name of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public String getMain() { - return main; - } - - /** - * 返回这个插件的名字。
- * Returns the name of this plugin. - * - * @return 这个插件的名字。
The name of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public String getName() { - return name; - } - - /** - * 返回这个插件加载的顺序,即插件应该在什么时候加载。
- * Returns the order the plugin loads, or when the plugin is loaded. - * - * @return 这个插件加载的顺序。
The order the plugin loads. - * @see PluginLoadOrder - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public PluginLoadOrder getOrder() { - return order; - } - - /** - * 返回这个插件定义的权限列表。
- * Returns all the defined permissions of this plugin. - * - * @return 这个插件定义的权限列表。
A map of all defined permissions of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public List getPermissions() { - return permissions; - } - - /** - * TODO finish javadoc - */ - public List getSoftDepend() { - return softDepend; - } - - /** - * 返回这个插件的版本号。
- * Returns the version string of this plugin. - * - * @return 这个插件的版本号。
The version string od this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public String getVersion() { - return version; - } - - /** - * 返回这个插件的网站。
- * Returns the website of this plugin. - * - * @return 这个插件的网站。
The website of this plugin. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public String getWebsite() { - return website; - } -} diff --git a/src/main/java/cn/nukkit/plugin/PluginLoadOrder.java b/src/main/java/cn/nukkit/plugin/PluginLoadOrder.java deleted file mode 100644 index 53aef8c4b..000000000 --- a/src/main/java/cn/nukkit/plugin/PluginLoadOrder.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.plugin; - -/** - * 描述一个Nukkit插件加载顺序的类。
- * Describes a Nukkit plugin load order. - * - * Nukkit插件的加载顺序有两个:{@link cn.nukkit.plugin.PluginLoadOrder#STARTUP} - * 和 {@link cn.nukkit.plugin.PluginLoadOrder#POSTWORLD}。
- * The load order of a Nukkit plugin can be {@link cn.nukkit.plugin.PluginLoadOrder#STARTUP} - * or {@link cn.nukkit.plugin.PluginLoadOrder#POSTWORLD}. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author iNevet(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public enum PluginLoadOrder { - /** - * 表示这个插件在服务器启动时就开始加载。
- * Indicates that the plugin will be loaded at startup. - * - * @see cn.nukkit.plugin.PluginLoadOrder - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - STARTUP, - /** - * 表示这个插件在第一个世界加载完成后开始加载。
- * Indicates that the plugin will be loaded after the first/default world was created. - * - * @see cn.nukkit.plugin.PluginLoadOrder - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - POSTWORLD -} diff --git a/src/main/java/cn/nukkit/plugin/PluginLoader.java b/src/main/java/cn/nukkit/plugin/PluginLoader.java deleted file mode 100644 index 2ea9fed27..000000000 --- a/src/main/java/cn/nukkit/plugin/PluginLoader.java +++ /dev/null @@ -1,135 +0,0 @@ -package cn.nukkit.plugin; - -import java.io.File; -import java.util.regex.Pattern; - -/** - * 描述一个插件加载器的接口。
- * An interface to describe a plugin loader. - * - * @author iNevet(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @see JavaPluginLoader - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public interface PluginLoader { - - /** - * 通过文件名字的字符串,来加载和初始化一个插件。
- * Loads and initializes a plugin by its file name. - * - * 这个方法应该设置好插件的相关属性。比如,插件所在的服务器对象,插件的加载器对象,插件的描述对象,插件的数据文件夹。
- * Properties for loaded plugin should be set in this method. Such as, the {@code Server} object for which this - * plugin is running in, the {@code PluginLoader} object for its loader, and the {@code File} object for its - * data folder. - * - * 如果插件加载失败,这个方法应该返回{@code null},或者抛出异常。
- * If the plugin loader does not load this plugin successfully, a {@code null} should be returned, - * or an exception should be thrown. - * - * @param filename 这个插件的文件名字字符串。
A string of its file name. - * @return 加载完毕的插件的 {@code Plugin}对象。
The loaded plugin as a {@code Plugin} object. - * @throws java.lang.Exception 插件加载失败所抛出的异常。
Thrown when an error occurred. - * @see #loadPlugin(File) - * @see cn.nukkit.plugin.PluginBase#init(PluginLoader, cn.nukkit.Server, PluginDescription, File, File) - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Plugin loadPlugin(String filename) throws Exception; - - /** - * 通过插件的 {@code File}对象,来加载和初始化一个插件。
- * Loads and initializes a plugin by a {@code File} object describes the file. - * - * 这个方法应该设置好插件的相关属性。比如,插件所在的服务器对象,插件的加载器对象,插件的描述对象,插件的数据文件夹。
- * Properties for loaded plugin should be set in this method. Such as, the {@code Server} object for which this - * plugin is running in, the {@code PluginLoader} object for its loader, and the {@code File} object for its - * data folder. - * - * 如果插件加载失败,这个方法应该返回{@code null},或者抛出异常。
- * If the plugin loader does not load this plugin successfully, a {@code null} should be returned, - * or an exception should be thrown. - * - * @param file 这个插件的文件的 {@code File}对象。
A {@code File} object for this plugin. - * @return 加载完毕的插件的 {@code Plugin}对象。
The loaded plugin as a {@code Plugin} object. - * @throws java.lang.Exception 插件加载失败所抛出的异常。
Thrown when an error occurred. - * @see #loadPlugin(String) - * @see cn.nukkit.plugin.PluginBase#init(PluginLoader, cn.nukkit.Server, PluginDescription, File, File) - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Plugin loadPlugin(File file) throws Exception; - - /** - * 通过插件文件名的字符串,来获得描述这个插件的 {@code PluginDescription}对象。
- * Gets a {@code PluginDescription} object describes the plugin by its file name. - * - * 如果插件的描述对象获取失败,这个方法应该返回{@code null}。
- * If the plugin loader does not get its description successfully, a {@code null} should be returned. - * - * @param filename 这个插件的文件名字。
A string of its file name. - * @return 描述这个插件的 {@code PluginDescription}对象。
- * A {@code PluginDescription} object describes the plugin. - * @see #getPluginDescription(File) - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - PluginDescription getPluginDescription(String filename); - - /** - * 通过插件的 {@code File}对象,来获得描述这个插件的 {@code PluginDescription}对象。
- * Gets a {@code PluginDescription} object describes the plugin by a {@code File} object describes the plugin file. - * - * 如果插件的描述对象获取失败,这个方法应该返回{@code null}。
- * If the plugin loader does not get its description successfully, a {@code null} should be returned. - * - * @param file 这个插件的文件的 {@code File}对象。
A {@code File} object for this plugin. - * @return 描述这个插件的 {@code PluginDescription}对象。
- * A {@code PluginDescription} object describes the plugin. - * @see #getPluginDescription(String) - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - PluginDescription getPluginDescription(File file); - - /** - * 返回这个插件加载器支持的文件类型。
- * Returns the file types this plugin loader supports. - * - * 在Nukkit读取所有插件时,插件管理器会查找所有已经安装的插件加载器,通过识别这个插件是否满足下面的条件, - * 来选择对应的插件加载器。
- * When Nukkit is trying to load all its plugins, the plugin manager will look for all installed plugin loader, - * and choose the correct one by checking if this plugin matches the filters given below. - * - * 举个例子,识别这个文件是否以jar为扩展名,它的正则表达式是:
- * For example, to check if this file is has a "jar" extension, the regular expression should be:
- * {@code ^.+\\.jar$}
- * 所以只读取jar扩展名的插件加载器,这个函数应该写成:
- * So, for a jar-extension-only file plugin loader, this method should be: - *
 {@code           @Override}
-     *      public Pattern[] getPluginFilters() {
-     *          return new Pattern[]{Pattern.compile("^.+\\.jar$")};
-     *      }
- * - * @return 表达这个插件加载器支持的文件类型的正则表达式数组。
- * An array of regular expressions, that describes what kind of file this plugin loader supports. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - Pattern[] getPluginFilters(); - - /** - * 启用一个插件。
- * Enables a plugin. - * - * @param plugin 要被启用的插件。
The plugin to enable. - * @see #disablePlugin - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void enablePlugin(Plugin plugin); - - /** - * 停用一个插件。
- * Disables a plugin. - * - * @param plugin 要被停用的插件。
The plugin to disable. - * @see #enablePlugin - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - void disablePlugin(Plugin plugin); -} diff --git a/src/main/java/cn/nukkit/plugin/PluginLogger.java b/src/main/java/cn/nukkit/plugin/PluginLogger.java deleted file mode 100644 index 950647131..000000000 --- a/src/main/java/cn/nukkit/plugin/PluginLogger.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.Server; -import cn.nukkit.utils.LogLevel; -import cn.nukkit.utils.Logger; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class PluginLogger implements Logger { - - private final String pluginName; - - public PluginLogger(Plugin context) { - String prefix = context.getDescription().getPrefix(); - this.pluginName = prefix != null ? '[' + prefix + "] " : '[' + context.getDescription().getName() + "] "; - } - - @Override - public void emergency(String message) { - this.log(LogLevel.EMERGENCY, message); - } - - @Override - public void alert(String message) { - this.log(LogLevel.ALERT, message); - } - - @Override - public void critical(String message) { - this.log(LogLevel.CRITICAL, message); - } - - @Override - public void error(String message) { - this.log(LogLevel.ERROR, message); - } - - @Override - public void warning(String message) { - this.log(LogLevel.WARNING, message); - } - - @Override - public void notice(String message) { - this.log(LogLevel.NOTICE, message); - } - - @Override - public void info(String message) { - this.log(LogLevel.INFO, message); - } - - @Override - public void debug(String message) { - this.log(LogLevel.DEBUG, message); - } - - @Override - public void log(LogLevel level, String message) { - Server.getInstance().getLogger().log(level, this.pluginName + message); - } - - @Override - public void emergency(String message, Throwable t) { - this.log(LogLevel.EMERGENCY, message, t); - } - - @Override - public void alert(String message, Throwable t) { - this.log(LogLevel.ALERT, message, t); - } - - @Override - public void critical(String message, Throwable t) { - this.log(LogLevel.CRITICAL, message, t); - } - - @Override - public void error(String message, Throwable t) { - this.log(LogLevel.ERROR, message, t); - } - - @Override - public void warning(String message, Throwable t) { - this.log(LogLevel.WARNING, message, t); - } - - @Override - public void notice(String message, Throwable t) { - this.log(LogLevel.NOTICE, message, t); - } - - @Override - public void info(String message, Throwable t) { - this.log(LogLevel.INFO, message, t); - } - - @Override - public void debug(String message, Throwable t) { - this.log(LogLevel.DEBUG, message, t); - } - - @Override - public void log(LogLevel level, String message, Throwable t) { - Server.getInstance().getLogger().log(level, this.pluginName + message, t); - } -} diff --git a/src/main/java/cn/nukkit/plugin/PluginManager.java b/src/main/java/cn/nukkit/plugin/PluginManager.java deleted file mode 100644 index 73fa4651b..000000000 --- a/src/main/java/cn/nukkit/plugin/PluginManager.java +++ /dev/null @@ -1,608 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.Server; -import cn.nukkit.command.PluginCommand; -import cn.nukkit.command.SimpleCommandMap; -import cn.nukkit.event.*; -import cn.nukkit.permission.Permissible; -import cn.nukkit.permission.Permission; -import cn.nukkit.utils.MainLogger; -import cn.nukkit.utils.PluginException; -import cn.nukkit.utils.Utils; -import co.aikar.timings.Timing; -import co.aikar.timings.Timings; -import io.netty.util.internal.ConcurrentSet; - -import java.io.File; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.regex.Pattern; - -/** - * @author MagicDroidX - */ -public class PluginManager { - - private final Server server; - - private final SimpleCommandMap commandMap; - - protected final Map plugins = new LinkedHashMap<>(); - - protected final Map permissions = new ConcurrentHashMap<>(); - - protected final Map defaultPerms = new ConcurrentHashMap<>(); - - protected final Map defaultPermsOp = new ConcurrentHashMap<>(); - - protected final Map> permSubs = new ConcurrentHashMap<>(); - - protected final Set defSubs = new ConcurrentSet<>(); - - protected final Set defSubsOp = new ConcurrentSet<>(); - - protected final Map fileAssociations = new HashMap<>(); - - public PluginManager(Server server, SimpleCommandMap commandMap) { - this.server = server; - this.commandMap = commandMap; - } - - public Plugin getPlugin(String name) { - if (this.plugins.containsKey(name)) { - return this.plugins.get(name); - } - return null; - } - - public boolean registerInterface(Class loaderClass) { - if (loaderClass != null) { - try { - Constructor constructor = loaderClass.getDeclaredConstructor(Server.class); - constructor.setAccessible(true); - this.fileAssociations.put(loaderClass.getName(), (PluginLoader) constructor.newInstance(this.server)); - return true; - } catch (Exception e) { - return false; - } - } - return false; - } - - public Map getPlugins() { - return plugins; - } - - public Plugin loadPlugin(String path) { - return this.loadPlugin(path, null); - } - - public Plugin loadPlugin(File file) { - return this.loadPlugin(file, null); - } - - public Plugin loadPlugin(String path, Map loaders) { - return this.loadPlugin(new File(path), loaders); - } - - public Plugin loadPlugin(File file, Map loaders) { - for (PluginLoader loader : (loaders == null ? this.fileAssociations : loaders).values()) { - for (Pattern pattern : loader.getPluginFilters()) { - if (pattern.matcher(file.getName()).matches()) { - PluginDescription description = loader.getPluginDescription(file); - if (description != null) { - try { - Plugin plugin = loader.loadPlugin(file); - if (plugin != null) { - this.plugins.put(plugin.getDescription().getName(), plugin); - - List pluginCommands = this.parseYamlCommands(plugin); - - if (!pluginCommands.isEmpty()) { - this.commandMap.registerAll(plugin.getDescription().getName(), pluginCommands); - } - - return plugin; - } - } catch (Exception e) { - Server.getInstance().getLogger().critical("Could not load plugin", e); - return null; - } - } - } - } - } - - return null; - } - - public Map loadPlugins(String dictionary) { - return this.loadPlugins(new File(dictionary)); - } - - public Map loadPlugins(File dictionary) { - return this.loadPlugins(dictionary, null); - } - - public Map loadPlugins(String dictionary, List newLoaders) { - return this.loadPlugins(new File(dictionary), newLoaders); - } - - public Map loadPlugins(File dictionary, List newLoaders) { - return this.loadPlugins(dictionary, newLoaders, false); - } - - public Map loadPlugins(File dictionary, List newLoaders, boolean includeDir) { - if (dictionary.isDirectory()) { - Map plugins = new LinkedHashMap<>(); - Map loadedPlugins = new LinkedHashMap<>(); - Map> dependencies = new LinkedHashMap<>(); - Map> softDependencies = new LinkedHashMap<>(); - Map loaders = new LinkedHashMap<>(); - if (newLoaders != null) { - for (String key : newLoaders) { - if (this.fileAssociations.containsKey(key)) { - loaders.put(key, this.fileAssociations.get(key)); - } - } - } else { - loaders = this.fileAssociations; - } - - for (final PluginLoader loader : loaders.values()) { - for (File file : dictionary.listFiles((dir, name) -> { - for (Pattern pattern : loader.getPluginFilters()) { - if (pattern.matcher(name).matches()) { - return true; - } - } - return false; - })) { - if (file.isDirectory() && !includeDir) { - continue; - } - try { - PluginDescription description = loader.getPluginDescription(file); - if (description != null) { - String name = description.getName(); - - if (plugins.containsKey(name) || this.getPlugin(name) != null) { - this.server.getLogger().error(this.server.getLanguage().translateString("nukkit.plugin.duplicateError", name)); - continue; - } - - plugins.put(name, file); - - softDependencies.put(name, description.getSoftDepend()); - - dependencies.put(name, description.getDepend()); - - for (String before : description.getLoadBefore()) { - if (softDependencies.containsKey(before)) { - softDependencies.get(before).add(name); - } else { - List list = new ArrayList<>(); - list.add(name); - softDependencies.put(before, list); - } - } - } - } catch (Exception e) { - this.server.getLogger().error(this.server.getLanguage().translateString("nukkit.plugin.fileError", file.getName(), dictionary.toString(), Utils - .getExceptionMessage(e))); - MainLogger logger = this.server.getLogger(); - if (logger != null) { - logger.logException(e); - } - } - } - } - - while (!plugins.isEmpty()) { - boolean missingDependency = true; - for (String name : new ArrayList<>(plugins.keySet())) { - File file = plugins.get(name); - if (dependencies.containsKey(name)) { - for (String dependency : new ArrayList<>(dependencies.get(name))) { - if (loadedPlugins.containsKey(dependency) || this.getPlugin(dependency) != null) { - dependencies.get(name).remove(dependency); - } else if (!plugins.containsKey(dependency)) { - this.server.getLogger().critical(this.server.getLanguage().translateString("nukkit.plugin.loadError", new String[]{name, "%nukkit.plugin.unknownDependency"}) + ' ' + dependency); - break; - } - } - - if (dependencies.get(name).isEmpty()) { - dependencies.remove(name); - } - } - - if (softDependencies.containsKey(name)) { - for (String dependency : new ArrayList<>(softDependencies.get(name))) { - if (loadedPlugins.containsKey(dependency) || this.getPlugin(dependency) != null) { - softDependencies.get(name).remove(dependency); - } - } - - if (softDependencies.get(name).isEmpty()) { - softDependencies.remove(name); - } - } - - if (!dependencies.containsKey(name) && !softDependencies.containsKey(name)) { - plugins.remove(name); - missingDependency = false; - Plugin plugin = this.loadPlugin(file, loaders); - if (plugin != null) { - loadedPlugins.put(name, plugin); - } else { - this.server.getLogger().critical(this.server.getLanguage().translateString("nukkit.plugin.genericLoadError", name)); - } - } - } - - if (missingDependency) { - for (String name : new ArrayList<>(plugins.keySet())) { - File file = plugins.get(name); - if (!dependencies.containsKey(name)) { - softDependencies.remove(name); - plugins.remove(name); - missingDependency = false; - Plugin plugin = this.loadPlugin(file, loaders); - if (plugin != null) { - loadedPlugins.put(name, plugin); - } else { - this.server.getLogger().critical(this.server.getLanguage().translateString("nukkit.plugin.genericLoadError", name)); - } - } - } - - if (missingDependency) { - for (String name : plugins.keySet()) { - this.server.getLogger().critical(this.server.getLanguage().translateString("nukkit.plugin.loadError", new String[]{name, "%nukkit.plugin.circularDependency"})); - } - plugins.clear(); - } - } - } - - return loadedPlugins; - } else { - return new HashMap<>(); - } - } - - public Permission getPermission(String name) { - if (this.permissions.containsKey(name)) { - return this.permissions.get(name); - } - return null; - } - - public boolean addPermission(Permission permission) { - if (!this.permissions.containsKey(permission.getName())) { - this.permissions.put(permission.getName(), permission); - this.calculatePermissionDefault(permission); - - return true; - } - - return false; - } - - public void removePermission(String name) { - this.permissions.remove(name); - } - - public void removePermission(Permission permission) { - this.removePermission(permission.getName()); - } - - public Map getDefaultPermissions(boolean op) { - if (op) { - return this.defaultPermsOp; - } else { - return this.defaultPerms; - } - } - - public void recalculatePermissionDefaults(Permission permission) { - if (this.permissions.containsKey(permission.getName())) { - this.defaultPermsOp.remove(permission.getName()); - this.defaultPerms.remove(permission.getName()); - this.calculatePermissionDefault(permission); - } - } - - private void calculatePermissionDefault(Permission permission) { - if (Timings.permissionDefaultTimer != null) Timings.permissionDefaultTimer.startTiming(); - if (permission.getDefault().equals(Permission.DEFAULT_OP) || permission.getDefault().equals(Permission.DEFAULT_TRUE)) { - this.defaultPermsOp.put(permission.getName(), permission); - this.dirtyPermissibles(true); - } - - if (permission.getDefault().equals(Permission.DEFAULT_NOT_OP) || permission.getDefault().equals(Permission.DEFAULT_TRUE)) { - this.defaultPerms.put(permission.getName(), permission); - this.dirtyPermissibles(false); - } - if (Timings.permissionDefaultTimer != null) Timings.permissionDefaultTimer.stopTiming(); - } - - private void dirtyPermissibles(boolean op) { - for (Permissible p : this.getDefaultPermSubscriptions(op)) { - p.recalculatePermissions(); - } - } - - public void subscribeToPermission(String permission, Permissible permissible) { - if (!this.permSubs.containsKey(permission)) { - this.permSubs.put(permission, new ConcurrentSet<>()); - } - this.permSubs.get(permission).add(permissible); - } - - public void unsubscribeFromPermission(String permission, Permissible permissible) { - if (this.permSubs.containsKey(permission)) { - this.permSubs.get(permission).remove(permissible); - if (this.permSubs.get(permission).isEmpty()) { - this.permSubs.remove(permission); - } - } - } - - public Set getPermissionSubscriptions(String permission) { - if (this.permSubs.containsKey(permission)) { - return new HashSet<>(this.permSubs.get(permission)); - } - return new HashSet<>(); - } - - public void subscribeToDefaultPerms(boolean op, Permissible permissible) { - if (op) { - this.defSubsOp.add(permissible); - } else { - this.defSubs.add(permissible); - } - } - - public void unsubscribeFromDefaultPerms(boolean op, Permissible permissible) { - if (op) { - this.defSubsOp.remove(permissible); - } else { - this.defSubs.remove(permissible); - } - } - - public Set getDefaultPermSubscriptions(boolean op) { - if (op) { - return new HashSet<>(this.defSubsOp); - } else { - return new HashSet<>(this.defSubs); - } - } - - public Map getPermissions() { - return permissions; - } - - public boolean isPluginEnabled(Plugin plugin) { - if (plugin != null && this.plugins.containsKey(plugin.getDescription().getName())) { - return plugin.isEnabled(); - } else { - return false; - } - } - - public void enablePlugin(Plugin plugin) { - if (!plugin.isEnabled()) { - try { - for (Permission permission : plugin.getDescription().getPermissions()) { - this.addPermission(permission); - } - plugin.getPluginLoader().enablePlugin(plugin); - } catch (Throwable e) { - MainLogger logger = this.server.getLogger(); - if (logger != null) { - logger.logException(new RuntimeException(e)); - } - this.disablePlugin(plugin); - } - } - } - - @SuppressWarnings("unchecked") - protected List parseYamlCommands(Plugin plugin) { - List pluginCmds = new ArrayList<>(); - - for (Map.Entry entry : plugin.getDescription().getCommands().entrySet()) { - String key = (String) entry.getKey(); - Object data = entry.getValue(); - if (key.contains(":")) { - this.server.getLogger().critical(this.server.getLanguage().translateString("nukkit.plugin.commandError", new String[]{key, plugin.getDescription().getFullName()})); - continue; - } - if (data instanceof Map) { - PluginCommand newCmd = new PluginCommand<>(key, plugin); - - if (((Map) data).containsKey("description")) { - newCmd.setDescription((String) ((Map) data).get("description")); - } - - if (((Map) data).containsKey("usage")) { - newCmd.setUsage((String) ((Map) data).get("usage")); - } - - if (((Map) data).containsKey("aliases")) { - Object aliases = ((Map) data).get("aliases"); - if (aliases instanceof List) { - List aliasList = new ArrayList<>(); - for (String alias : (List) aliases) { - if (alias.contains(":")) { - this.server.getLogger().critical(this.server.getLanguage().translateString("nukkit.plugin.aliasError", new String[]{alias, plugin.getDescription().getFullName()})); - continue; - } - aliasList.add(alias); - } - - newCmd.setAliases(aliasList.toArray(new String[0])); - } - } - - if (((Map) data).containsKey("permission")) { - newCmd.setPermission((String) ((Map) data).get("permission")); - } - - if (((Map) data).containsKey("permission-message")) { - newCmd.setPermissionMessage((String) ((Map) data).get("permission-message")); - } - - pluginCmds.add(newCmd); - } - } - - return pluginCmds; - } - - public void disablePlugins() { - ListIterator plugins = new ArrayList<>(this.plugins.values()).listIterator(this.plugins.size()); - - while (plugins.hasPrevious()) { - this.disablePlugin(plugins.previous()); - } - } - - public void disablePlugin(Plugin plugin) { - if (plugin.isEnabled()) { - try { - plugin.getPluginLoader().disablePlugin(plugin); - } catch (Exception e) { - MainLogger logger = this.server.getLogger(); - if (logger != null) { - logger.logException(e); - } - } - - this.server.getScheduler().cancelTask(plugin); - HandlerList.unregisterAll(plugin); - for (Permission permission : plugin.getDescription().getPermissions()) { - this.removePermission(permission); - } - } - } - - public void clearPlugins() { - this.disablePlugins(); - this.plugins.clear(); - this.fileAssociations.clear(); - this.permissions.clear(); - this.defaultPerms.clear(); - this.defaultPermsOp.clear(); - } - - public void callEvent(Event event) { - try { - for (RegisteredListener registration : getEventListeners(event.getClass()).getRegisteredListeners()) { - if (!registration.getPlugin().isEnabled()) { - continue; - } - - try { - registration.callEvent(event); - } catch (Exception e) { - this.server.getLogger().critical(this.server.getLanguage().translateString("nukkit.plugin.eventError", event.getEventName(), registration.getPlugin().getDescription().getFullName(), e.getMessage(), registration.getListener().getClass().getName())); - this.server.getLogger().logException(e); - } - } - } catch (IllegalAccessException e) { - this.server.getLogger().logException(e); - } - } - - public void registerEvents(Listener listener, Plugin plugin) { - if (!plugin.isEnabled()) { - throw new PluginException("Plugin attempted to register " + listener.getClass().getName() + " while not enabled"); - } - - Set methods; - try { - Method[] publicMethods = listener.getClass().getMethods(); - Method[] privateMethods = listener.getClass().getDeclaredMethods(); - methods = new HashSet<>(publicMethods.length + privateMethods.length, 1.0f); - Collections.addAll(methods, publicMethods); - Collections.addAll(methods, privateMethods); - } catch (NoClassDefFoundError e) { - plugin.getLogger().error("Plugin " + plugin.getDescription().getFullName() + " has failed to register events for " + listener.getClass() + " because " + e.getMessage() + " does not exist."); - return; - } - - for (final Method method : methods) { - final EventHandler eh = method.getAnnotation(EventHandler.class); - if (eh == null) continue; - if (method.isBridge() || method.isSynthetic()) { - continue; - } - final Class checkClass; - - if (method.getParameterTypes().length != 1 || !Event.class.isAssignableFrom(checkClass = method.getParameterTypes()[0])) { - plugin.getLogger().error(plugin.getDescription().getFullName() + " attempted to register an invalid EventHandler method signature \"" + method.toGenericString() + "\" in " + listener.getClass()); - continue; - } - - final Class eventClass = checkClass.asSubclass(Event.class); - method.setAccessible(true); - - for (Class clazz = eventClass; Event.class.isAssignableFrom(clazz); clazz = clazz.getSuperclass()) { - if (clazz.getAnnotation(Deprecated.class) != null) { - break; - } - } - this.registerEvent(eventClass, listener, eh.priority(), new MethodEventExecutor(method), plugin, eh.ignoreCancelled()); - } - } - - public void registerEvent(Class event, Listener listener, EventPriority priority, EventExecutor executor, Plugin plugin) throws PluginException { - this.registerEvent(event, listener, priority, executor, plugin, false); - } - - public void registerEvent(Class event, Listener listener, EventPriority priority, EventExecutor executor, Plugin plugin, boolean ignoreCancelled) throws PluginException { - if (!plugin.isEnabled()) { - throw new PluginException("Plugin attempted to register " + event + " while not enabled"); - } - - try { - Timing timing = Timings.getPluginEventTiming(event, listener, executor, plugin); - this.getEventListeners(event).register(new RegisteredListener(listener, executor, priority, plugin, ignoreCancelled, timing)); - } catch (IllegalAccessException e) { - Server.getInstance().getLogger().logException(e); - } - } - - private HandlerList getEventListeners(Class type) throws IllegalAccessException { - try { - Method method = getRegistrationClass(type).getDeclaredMethod("getHandlers"); - method.setAccessible(true); - return (HandlerList) method.invoke(null); - } catch (NullPointerException e) { - throw new IllegalArgumentException("getHandlers method in " + type.getName() + " was not static!"); - } catch (Exception e) { - throw new IllegalAccessException(Utils.getExceptionMessage(e)); - } - } - - private Class getRegistrationClass(Class clazz) throws IllegalAccessException { - try { - clazz.getDeclaredMethod("getHandlers"); - return clazz; - } catch (NoSuchMethodException e) { - if (clazz.getSuperclass() != null - && clazz.getSuperclass() != Event.class - && Event.class.isAssignableFrom(clazz.getSuperclass())) { - return getRegistrationClass(clazz.getSuperclass().asSubclass(Event.class)); - } else { - throw new IllegalAccessException("Unable to find handler list for event " + clazz.getName() + ". Static getHandlers method required!"); - } - } - } -} diff --git a/src/main/java/cn/nukkit/plugin/RegisteredListener.java b/src/main/java/cn/nukkit/plugin/RegisteredListener.java deleted file mode 100644 index 994a9e11b..000000000 --- a/src/main/java/cn/nukkit/plugin/RegisteredListener.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.nukkit.plugin; - -import cn.nukkit.event.Cancellable; -import cn.nukkit.event.Event; -import cn.nukkit.event.EventPriority; -import cn.nukkit.event.Listener; -import cn.nukkit.utils.EventException; -import co.aikar.timings.Timing; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class RegisteredListener { - - private final Listener listener; - - private final EventPriority priority; - - private final Plugin plugin; - - private final EventExecutor executor; - - private final boolean ignoreCancelled; - - private final Timing timing; - - public RegisteredListener(Listener listener, EventExecutor executor, EventPriority priority, Plugin plugin, boolean ignoreCancelled, Timing timing) { - this.listener = listener; - this.priority = priority; - this.plugin = plugin; - this.executor = executor; - this.ignoreCancelled = ignoreCancelled; - this.timing = timing; - } - - public Listener getListener() { - return listener; - } - - public Plugin getPlugin() { - return plugin; - } - - public EventPriority getPriority() { - return priority; - } - - public void callEvent(Event event) throws EventException { - if (event instanceof Cancellable) { - if (event.isCancelled() && ignoreCancelled) { - return; - } - } - if (this.timing != null) this.timing.startTiming(); - executor.execute(listener, event); - if (this.timing != null) this.timing.stopTiming(); - } - - public boolean isIgnoringCancelled() { - return ignoreCancelled; - } -} diff --git a/src/main/java/cn/nukkit/plugin/service/NKServiceManager.java b/src/main/java/cn/nukkit/plugin/service/NKServiceManager.java deleted file mode 100644 index 05529baad..000000000 --- a/src/main/java/cn/nukkit/plugin/service/NKServiceManager.java +++ /dev/null @@ -1,140 +0,0 @@ -package cn.nukkit.plugin.service; - -import cn.nukkit.Server; -import cn.nukkit.plugin.Plugin; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; - -import java.util.*; - -public class NKServiceManager implements ServiceManager { - - private final Map, List>> handle = new HashMap<>(); - - @Override - public boolean register(Class service, T provider, Plugin plugin, ServicePriority priority) { - Preconditions.checkNotNull(provider); - Preconditions.checkNotNull(priority); - Preconditions.checkNotNull(service); - - // build-in service provider needn't plugin param - if (plugin == null && provider.getClass().getClassLoader() != Server.class.getClassLoader()) { - throw new NullPointerException("plugin"); - } - - return provide(service, provider, plugin, priority); - } - - protected boolean provide(Class service, T instance, Plugin plugin, ServicePriority priority) { - synchronized (handle) { - List> list = handle.computeIfAbsent(service, k -> new ArrayList<>()); - - RegisteredServiceProvider registered = new RegisteredServiceProvider<>(service, instance, priority, plugin); - - int position = Collections.binarySearch(list, registered); - - if (position > -1) return false; - - list.add(-(position + 1), registered); - } - - return true; - } - - @Override - public List> cancel(Plugin plugin) { - ImmutableList.Builder> builder = ImmutableList.builder(); - - Iterator> it; - RegisteredServiceProvider registered; - - synchronized (handle) { - for (List> list : handle.values()) { - it = list.iterator(); - - while (it.hasNext()) { - registered = it.next(); - if (registered.getPlugin() == plugin) { - it.remove(); - builder.add(registered); - } - } - } - } - - return builder.build(); - } - - @Override - @SuppressWarnings("unchecked") - public RegisteredServiceProvider cancel(Class service, T provider) { - RegisteredServiceProvider result = null; - - synchronized (handle) { - Iterator> it = handle.get(service).iterator(); - RegisteredServiceProvider next; - - while (it.hasNext() && result == null) { - next = it.next(); - if (next.getProvider() == provider) { - it.remove(); - result = next; - } - } - } - - return result; - } - - @Override - @SuppressWarnings("unchecked") - public RegisteredServiceProvider getProvider(Class service) { - synchronized (handle) { - List> list = handle.get(service); - if (list == null || list.isEmpty()) return null; - return (RegisteredServiceProvider) list.get(0); - } - } - - @Override - public List> getKnownService() { - return ImmutableList.copyOf(handle.keySet()); - } - - @Override - public List> getRegistrations(Plugin plugin) { - ImmutableList.Builder> builder = ImmutableList.builder(); - synchronized (handle) { - for (List> registered : handle.values()) { - for (RegisteredServiceProvider provider : registered) { - if (provider.getPlugin().equals(plugin)) { - builder.add(provider); - } - } - } - } - return builder.build(); - } - - @Override - public List> getRegistrations(Class service) { - ImmutableList.Builder> builder = ImmutableList.builder(); - synchronized (handle) { - List> registered = handle.get(service); - if (registered == null) { - return ImmutableList.of(); - } - for (RegisteredServiceProvider provider : registered) { - builder.add((RegisteredServiceProvider)provider); - } - } - return builder.build(); - } - - @Override - public boolean isProvidedFor(Class service) { - synchronized (handle) { - return handle.containsKey(service); - } - } -} diff --git a/src/main/java/cn/nukkit/plugin/service/RegisteredServiceProvider.java b/src/main/java/cn/nukkit/plugin/service/RegisteredServiceProvider.java deleted file mode 100644 index 113b01986..000000000 --- a/src/main/java/cn/nukkit/plugin/service/RegisteredServiceProvider.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.nukkit.plugin.service; - -import cn.nukkit.plugin.Plugin; - -public class RegisteredServiceProvider implements Comparable> { - - private Plugin plugin; - private ServicePriority priority; - private Class service; - private T provider; - - RegisteredServiceProvider(Class service, T provider, ServicePriority priority, Plugin plugin) { - this.plugin = plugin; - this.provider = provider; - this.service = service; - this.priority = priority; - } - - /** - * Return the provided service. - * - * @return the provided service - */ - public Class getService() { - return this.service; - } - - /** - * Return the plugin provide this service. - * - * @return the plugin provide this service, or {@code null} - * only if this service provided by server - */ - public Plugin getPlugin() { - return plugin; - } - - /** - * Return the service provider. - * - * @return the service provider - */ - public T getProvider() { - return provider; - } - - public ServicePriority getPriority() { - return priority; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - RegisteredServiceProvider that = (RegisteredServiceProvider) o; - - return provider == that.provider || provider.equals(that.provider); - } - - @Override - public int hashCode() { - return provider.hashCode(); - } - - public int compareTo(RegisteredServiceProvider other) { - return other.priority.ordinal() - priority.ordinal(); - } -} diff --git a/src/main/java/cn/nukkit/plugin/service/ServiceManager.java b/src/main/java/cn/nukkit/plugin/service/ServiceManager.java deleted file mode 100644 index 2478c9074..000000000 --- a/src/main/java/cn/nukkit/plugin/service/ServiceManager.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.nukkit.plugin.service; - -import cn.nukkit.plugin.Plugin; - -import java.util.List; - -public interface ServiceManager { - - /** - * Register an object as a service's provider. - * - * @param service the service - * @param provider the service provider - * @param plugin the plugin - * @param priority the priority - * @return {@code true}, or {@code false} only if {@code provider} - * already registered - */ - boolean register(Class service, T provider, Plugin plugin, ServicePriority priority); - - /** - * Cancel service's provider(s) offered this plugin. - * - * @param plugin the plugin - * @return a {@link com.google.common.collect.ImmutableList} - * contains cancelled {@link RegisteredServiceProvider} - */ - List> cancel(Plugin plugin); - - /** - * Cancel a service's provider. - * - * @param service the service - * @param provider the provider - * @return the cancelled {@link RegisteredServiceProvider}, or {@code null} if not - * any provider cancelled - */ - RegisteredServiceProvider cancel(Class service, T provider); - - /** - * Return the service's provider. - * - * @param service the target service - * @return a {@link RegisteredServiceProvider} registered highest priority, or - * {@code null} if not exists - */ - RegisteredServiceProvider getProvider(Class service); - - /** - * Return the known service(s). - * - * @return a {@link com.google.common.collect.ImmutableList} contains the - * known service(s) - */ - List> getKnownService(); - - List> getRegistrations(Plugin plugin); - - List> getRegistrations(Class service); - - boolean isProvidedFor(Class service); -} diff --git a/src/main/java/cn/nukkit/plugin/service/ServicePriority.java b/src/main/java/cn/nukkit/plugin/service/ServicePriority.java deleted file mode 100644 index d4b9db365..000000000 --- a/src/main/java/cn/nukkit/plugin/service/ServicePriority.java +++ /dev/null @@ -1,6 +0,0 @@ -package cn.nukkit.plugin.service; - -public enum ServicePriority { - - LOWEST, LOWER, NORMAL, HIGHER, HIGHEST, -} diff --git a/src/main/java/cn/nukkit/potion/Effect.java b/src/main/java/cn/nukkit/potion/Effect.java deleted file mode 100644 index 1f866d369..000000000 --- a/src/main/java/cn/nukkit/potion/Effect.java +++ /dev/null @@ -1,321 +0,0 @@ -package cn.nukkit.potion; - -import cn.nukkit.Player; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityBoss; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.EntityRegainHealthEvent; -import cn.nukkit.network.protocol.MobEffectPacket; -import cn.nukkit.utils.ServerException; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Effect implements Cloneable { - - public static final int SPEED = 1; - public static final int SLOWNESS = 2; - public static final int HASTE = 3; - public static final int SWIFTNESS = 3; // incorrect? - public static final int FATIGUE = 4; - public static final int MINING_FATIGUE = 4; - public static final int STRENGTH = 5; - public static final int HEALING = 6; - public static final int INSTANT_HEALTH = 6; - public static final int HARMING = 7; - public static final int INSTANT_DAMAGE = 7; - public static final int JUMP = 8; - public static final int JUMP_BOOST = 8; - public static final int NAUSEA = 9; - public static final int REGENERATION = 10; - public static final int DAMAGE_RESISTANCE = 11; - public static final int RESISTANCE = 11; - public static final int FIRE_RESISTANCE = 12; - public static final int WATER_BREATHING = 13; - public static final int INVISIBILITY = 14; - public static final int BLINDNESS = 15; - public static final int NIGHT_VISION = 16; - public static final int HUNGER = 17; - public static final int WEAKNESS = 18; - public static final int POISON = 19; - public static final int WITHER = 20; - public static final int HEALTH_BOOST = 21; - public static final int ABSORPTION = 22; - public static final int SATURATION = 23; - public static final int LEVITATION = 24; - public static final int FATAL_POISON = 25; - public static final int CONDUIT_POWER = 26; - public static final int SLOW_FALLING = 27; - public static final int BAD_OMEN = 28; - public static final int VILLAGE_HERO = 29; - - protected static Effect[] effects; - - public static void init() { - effects = new Effect[256]; - - effects[Effect.SPEED] = new Effect(Effect.SPEED, "%potion.moveSpeed", 124, 175, 198); - effects[Effect.SLOWNESS] = new Effect(Effect.SLOWNESS, "%potion.moveSlowdown", 90, 108, 129, true); - effects[Effect.HASTE] = new Effect(Effect.HASTE, "%potion.digSpeed", 217, 192, 67); - effects[Effect.FATIGUE] = new Effect(Effect.FATIGUE, "%potion.digSlowDown", 74, 66, 23, true); - effects[Effect.STRENGTH] = new Effect(Effect.STRENGTH, "%potion.damageBoost", 147, 36, 35); - effects[Effect.HEALING] = new InstantEffect(Effect.HEALING, "%potion.heal", 248, 36, 35); - effects[Effect.HARMING] = new InstantEffect(Effect.HARMING, "%potion.harm", 67, 10, 9, true); - effects[Effect.JUMP] = new Effect(Effect.JUMP, "%potion.jump", 34, 255, 76); - effects[Effect.NAUSEA] = new Effect(Effect.NAUSEA, "%potion.confusion", 85, 29, 74, true); - effects[Effect.REGENERATION] = new Effect(Effect.REGENERATION, "%potion.regeneration", 205, 92, 171); - effects[Effect.DAMAGE_RESISTANCE] = new Effect(Effect.DAMAGE_RESISTANCE, "%potion.resistance", 153, 69, 58); - effects[Effect.FIRE_RESISTANCE] = new Effect(Effect.FIRE_RESISTANCE, "%potion.fireResistance", 228, 154, 58); - effects[Effect.WATER_BREATHING] = new Effect(Effect.WATER_BREATHING, "%potion.waterBreathing", 46, 82, 153); - effects[Effect.INVISIBILITY] = new Effect(Effect.INVISIBILITY, "%potion.invisibility", 127, 131, 146); - effects[Effect.BLINDNESS] = new Effect(Effect.BLINDNESS, "%potion.blindness", 191, 192, 192); - effects[Effect.NIGHT_VISION] = new Effect(Effect.NIGHT_VISION, "%potion.nightVision", 0, 0, 139); - effects[Effect.HUNGER] = new Effect(Effect.HUNGER, "%potion.hunger", 46, 139, 87); - effects[Effect.WEAKNESS] = new Effect(Effect.WEAKNESS, "%potion.weakness", 72, 77, 72, true); - effects[Effect.POISON] = new Effect(Effect.POISON, "%potion.poison", 78, 147, 49, true); - effects[Effect.WITHER] = new Effect(Effect.WITHER, "%potion.wither", 53, 42, 39, true); - effects[Effect.HEALTH_BOOST] = new Effect(Effect.HEALTH_BOOST, "%potion.healthBoost", 248, 125, 35); - effects[Effect.ABSORPTION] = new Effect(Effect.ABSORPTION, "%potion.absorption", 36, 107, 251); - effects[Effect.SATURATION] = new Effect(Effect.SATURATION, "%potion.saturation", 255, 0, 255); - effects[Effect.LEVITATION] = new Effect(Effect.LEVITATION, "%potion.levitation", 206, 255, 255, true); - effects[Effect.FATAL_POISON] = new Effect(Effect.FATAL_POISON, "%potion.poison", 78, 147, 49, true); - effects[Effect.CONDUIT_POWER] = new Effect(Effect.CONDUIT_POWER, "%potion.conduitPower", 29, 194, 209); - effects[Effect.SLOW_FALLING] = new Effect(Effect.SLOW_FALLING, "%potion.slowFalling", 206, 255, 255); - effects[Effect.BAD_OMEN] = new Effect(Effect.BAD_OMEN, "%effect.badOmen", 11, 97, 56, true); - effects[Effect.VILLAGE_HERO] = new Effect(Effect.VILLAGE_HERO, "%effect.villageHero", 68, 255, 68); - } - - public static Effect getEffect(int id) { - if (id >= 0 && id < effects.length && effects[id] != null) { - return effects[id].clone(); - } else { - throw new ServerException("Effect id: " + id + " not found"); - } - } - - public static Effect getEffectByName(String name) { - name = name.trim().replace(' ', '_').replace("minecraft:", ""); - try { - int id = Effect.class.getField(name.toUpperCase()).getInt(null); - return getEffect(id); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - protected final int id; - - protected final String name; - - protected int duration; - - protected int amplifier = 0; - - protected int color; - - protected boolean show = true; - - protected boolean ambient = false; - - protected final boolean bad; - - public Effect(int id, String name, int r, int g, int b) { - this(id, name, r, g, b, false); - } - - public Effect(int id, String name, int r, int g, int b, boolean isBad) { - this.id = id; - this.name = name; - this.bad = isBad; - this.setColor(r, g, b); - } - - public String getName() { - return name; - } - - public int getId() { - return id; - } - - public Effect setDuration(int ticks) { - this.duration = ticks; - return this; - } - - public int getDuration() { - return duration; - } - - public boolean isVisible() { - return show; - } - - public Effect setVisible(boolean visible) { - this.show = visible; - return this; - } - - public int getAmplifier() { - return amplifier; - } - - public Effect setAmplifier(int amplifier) { - this.amplifier = amplifier; - return this; - } - - public boolean isAmbient() { - return ambient; - } - - public Effect setAmbient(boolean ambient) { - this.ambient = ambient; - return this; - } - - public boolean isBad() { - return bad; - } - - public boolean canTick() { - int interval; - switch (this.id) { - case Effect.POISON: - case Effect.FATAL_POISON: - if ((interval = (25 >> this.amplifier)) > 0) { - return (this.duration % interval) == 0; - } - return true; - case Effect.WITHER: - if ((interval = (50 >> this.amplifier)) > 0) { - return (this.duration % interval) == 0; - } - return true; - case Effect.REGENERATION: - if ((interval = (40 >> this.amplifier)) > 0) { - return (this.duration % interval) == 0; - } - return true; - } - return false; - } - - public void applyEffect(Entity entity) { - if (entity instanceof EntityBoss) return; // Boss mobs are immune to poison, wither and regeneration - switch (this.id) { - case Effect.POISON: - case Effect.FATAL_POISON: - if (entity.getHealth() > 1 || this.id == FATAL_POISON) { - entity.attack(new EntityDamageEvent(entity, DamageCause.MAGIC, 1)); - } - break; - case Effect.WITHER: - entity.attack(new EntityDamageEvent(entity, DamageCause.MAGIC, 1)); - break; - case Effect.REGENERATION: - if (entity.getHealth() < entity.getMaxHealth()) { - entity.heal(new EntityRegainHealthEvent(entity, 1, EntityRegainHealthEvent.CAUSE_MAGIC)); - } - break; - } - } - - public int[] getColor() { - return new int[]{this.color >> 16, (this.color >> 8) & 0xff, this.color & 0xff}; - } - - public void setColor(int r, int g, int b) { - this.color = ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff); - } - - public void add(Entity entity) { - Effect oldEffect = entity.getEffect(id); - if (oldEffect != null && (Math.abs(this.amplifier) < Math.abs(oldEffect.amplifier) || - Math.abs(this.amplifier) == Math.abs(oldEffect.amplifier) - && this.duration < oldEffect.duration)) { - return; - } - if (entity instanceof Player) { - Player player = (Player) entity; - - MobEffectPacket pk = new MobEffectPacket(); - pk.eid = entity.getId(); - pk.effectId = this.id; - pk.amplifier = this.amplifier; - pk.particles = this.show; - pk.duration = this.duration; - if (oldEffect != null) { - pk.eventId = MobEffectPacket.EVENT_MODIFY; - } else { - pk.eventId = MobEffectPacket.EVENT_ADD; - } - - player.dataPacket(pk); - - if (this.id == Effect.SPEED) { - /*if (oldEffect != null) { - player.setMovementSpeed(player.getMovementSpeed() / (1 + 0.2f * (oldEffect.amplifier + 1)), false); - } - player.setMovementSpeed(player.getMovementSpeed() * (1 + 0.2f * (this.amplifier + 1)));*/ - player.setMovementSpeed(0.1f * (1 + 0.2f * (this.amplifier + 1))); //HACK: Fix beacon exploit - } - - if (this.id == Effect.SLOWNESS) { - /*if (oldEffect != null) { - player.setMovementSpeed(player.getMovementSpeed() / (1 - 0.15f * (oldEffect.amplifier + 1)), false); - } - player.setMovementSpeed(player.getMovementSpeed() * (1 - 0.15f * (this.amplifier + 1)));*/ - player.setMovementSpeed(0.1f * (1 - 0.15f * (this.amplifier + 1))); - } - } - - if (this.id == Effect.INVISIBILITY) { - entity.setDataFlag(Entity.DATA_FLAGS, Entity.DATA_FLAG_INVISIBLE, true); - entity.setNameTagVisible(false); - } - - if (this.id == Effect.ABSORPTION) { - int add = (this.amplifier + 1) << 2; - if (add > entity.getAbsorption()) entity.setAbsorption(add); - } - } - - public void remove(Entity entity) { - if (entity instanceof Player) { - MobEffectPacket pk = new MobEffectPacket(); - pk.eid = entity.getId(); - pk.effectId = this.id; - pk.eventId = MobEffectPacket.EVENT_REMOVE; - - ((Player) entity).dataPacket(pk); - - if (this.id == Effect.SPEED) { - ((Player) entity).setMovementSpeed(((Player) entity).getMovementSpeed() / (1 + 0.2f * (this.amplifier + 1))); - } - if (this.id == Effect.SLOWNESS) { - ((Player) entity).setMovementSpeed(((Player) entity).getMovementSpeed() / (1 - 0.15f * (this.amplifier + 1))); - } - } - - if (this.id == Effect.INVISIBILITY) { - entity.setDataFlag(Entity.DATA_FLAGS, Entity.DATA_FLAG_INVISIBLE, false); - entity.setNameTagVisible(true); - } - - if (this.id == Effect.ABSORPTION) { - entity.setAbsorption(0); - } - } - - @Override - public Effect clone() { - try { - return (Effect) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } -} diff --git a/src/main/java/cn/nukkit/potion/InstantEffect.java b/src/main/java/cn/nukkit/potion/InstantEffect.java deleted file mode 100644 index db549b51c..000000000 --- a/src/main/java/cn/nukkit/potion/InstantEffect.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.potion; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class InstantEffect extends Effect { - - public InstantEffect(int id, String name, int r, int g, int b) { - super(id, name, r, g, b); - } - - public InstantEffect(int id, String name, int r, int g, int b, boolean isBad) { - super(id, name, r, g, b, isBad); - } -} diff --git a/src/main/java/cn/nukkit/potion/Potion.java b/src/main/java/cn/nukkit/potion/Potion.java deleted file mode 100644 index 116692f5c..000000000 --- a/src/main/java/cn/nukkit/potion/Potion.java +++ /dev/null @@ -1,532 +0,0 @@ -package cn.nukkit.potion; - -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.EntityLiving; -import cn.nukkit.entity.EntitySmite; -import cn.nukkit.entity.mob.EntityBlaze; -import cn.nukkit.entity.mob.EntityEnderman; -import cn.nukkit.entity.passive.EntitySnowGolem; -import cn.nukkit.entity.passive.EntityStrider; -import cn.nukkit.event.entity.EntityDamageEvent; -import cn.nukkit.event.entity.EntityDamageEvent.DamageCause; -import cn.nukkit.event.entity.EntityRegainHealthEvent; -import cn.nukkit.event.potion.PotionApplyEvent; -import cn.nukkit.utils.ServerException; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class Potion implements Cloneable { - - public static final int NO_EFFECTS = 0; - public static final int WATER = 0; - public static final int MUNDANE = 1; - public static final int MUNDANE_II = 2; - public static final int THICK = 3; - public static final int AWKWARD = 4; - public static final int NIGHT_VISION = 5; - public static final int NIGHT_VISION_LONG = 6; - public static final int INVISIBLE = 7; - public static final int INVISIBLE_LONG = 8; - public static final int LEAPING = 9; - public static final int LEAPING_LONG = 10; - public static final int LEAPING_II = 11; - public static final int FIRE_RESISTANCE = 12; - public static final int FIRE_RESISTANCE_LONG = 13; - public static final int SPEED = 14; - public static final int SPEED_LONG = 15; - public static final int SPEED_II = 16; - public static final int SLOWNESS = 17; - public static final int SLOWNESS_LONG = 18; - public static final int WATER_BREATHING = 19; - public static final int WATER_BREATHING_LONG = 20; - public static final int INSTANT_HEALTH = 21; - public static final int INSTANT_HEALTH_II = 22; - public static final int HARMING = 23; - public static final int HARMING_II = 24; - public static final int POISON = 25; - public static final int POISON_LONG = 26; - public static final int POISON_II = 27; - public static final int REGENERATION = 28; - public static final int REGENERATION_LONG = 29; - public static final int REGENERATION_II = 30; - public static final int STRENGTH = 31; - public static final int STRENGTH_LONG = 32; - public static final int STRENGTH_II = 33; - public static final int WEAKNESS = 34; - public static final int WEAKNESS_LONG = 35; - public static final int WITHER_II = 36; - public static final int TURTLE_MASTER = 37; - public static final int TURTLE_MASTER_LONG = 38; - public static final int TURTLE_MASTER_II = 39; - public static final int SLOW_FALLING = 40; - public static final int SLOW_FALLING_LONG = 41; - public static final int SLOWNESS_LONG_II = 42; - public static final int SLOWNESS_IV = 43; - - protected static Potion[] potions; - - public static void init() { - potions = new Potion[256]; - - potions[Potion.WATER] = new Potion(Potion.WATER); - potions[Potion.MUNDANE] = new Potion(Potion.MUNDANE); - potions[Potion.MUNDANE_II] = new Potion(Potion.MUNDANE_II, 2); - potions[Potion.THICK] = new Potion(Potion.THICK); - potions[Potion.AWKWARD] = new Potion(Potion.AWKWARD); - potions[Potion.NIGHT_VISION] = new Potion(Potion.NIGHT_VISION); - potions[Potion.NIGHT_VISION_LONG] = new Potion(Potion.NIGHT_VISION_LONG); - potions[Potion.INVISIBLE] = new Potion(Potion.INVISIBLE); - potions[Potion.INVISIBLE_LONG] = new Potion(Potion.INVISIBLE_LONG); - potions[Potion.LEAPING] = new Potion(Potion.LEAPING); - potions[Potion.LEAPING_LONG] = new Potion(Potion.LEAPING_LONG); - potions[Potion.LEAPING_II] = new Potion(Potion.LEAPING_II, 2); - potions[Potion.FIRE_RESISTANCE] = new Potion(Potion.FIRE_RESISTANCE); - potions[Potion.FIRE_RESISTANCE_LONG] = new Potion(Potion.FIRE_RESISTANCE_LONG); - potions[Potion.SPEED] = new Potion(Potion.SPEED); - potions[Potion.SPEED_LONG] = new Potion(Potion.SPEED_LONG); - potions[Potion.SPEED_II] = new Potion(Potion.SPEED_II, 2); - potions[Potion.SLOWNESS] = new Potion(Potion.SLOWNESS); - potions[Potion.SLOWNESS_LONG] = new Potion(Potion.SLOWNESS_LONG); - potions[Potion.WATER_BREATHING] = new Potion(Potion.WATER_BREATHING); - potions[Potion.WATER_BREATHING_LONG] = new Potion(Potion.WATER_BREATHING_LONG); - potions[Potion.INSTANT_HEALTH] = new Potion(Potion.INSTANT_HEALTH); - potions[Potion.INSTANT_HEALTH_II] = new Potion(Potion.INSTANT_HEALTH_II, 2); - potions[Potion.HARMING] = new Potion(Potion.HARMING); - potions[Potion.HARMING_II] = new Potion(Potion.HARMING_II, 2); - potions[Potion.POISON] = new Potion(Potion.POISON); - potions[Potion.POISON_LONG] = new Potion(Potion.POISON_LONG); - potions[Potion.POISON_II] = new Potion(Potion.POISON_II, 2); - potions[Potion.REGENERATION] = new Potion(Potion.REGENERATION); - potions[Potion.REGENERATION_LONG] = new Potion(Potion.REGENERATION_LONG); - potions[Potion.REGENERATION_II] = new Potion(Potion.REGENERATION_II, 2); - potions[Potion.STRENGTH] = new Potion(Potion.STRENGTH); - potions[Potion.STRENGTH_LONG] = new Potion(Potion.STRENGTH_LONG); - potions[Potion.STRENGTH_II] = new Potion(Potion.STRENGTH_II, 2); - potions[Potion.WEAKNESS] = new Potion(Potion.WEAKNESS); - potions[Potion.WEAKNESS_LONG] = new Potion(Potion.WEAKNESS_LONG); - potions[Potion.WITHER_II] = new Potion(Potion.WITHER_II, 2); - potions[Potion.TURTLE_MASTER] = new Potion(Potion.TURTLE_MASTER); - potions[Potion.TURTLE_MASTER_LONG] = new Potion(Potion.TURTLE_MASTER_LONG); - potions[Potion.TURTLE_MASTER_II] = new Potion(Potion.TURTLE_MASTER_II, 2); - potions[Potion.SLOW_FALLING] = new Potion(Potion.SLOW_FALLING); - potions[Potion.SLOW_FALLING_LONG] = new Potion(Potion.SLOW_FALLING_LONG); - potions[Potion.SLOWNESS_LONG_II] = new Potion(Potion.SLOWNESS_LONG_II, 2); - potions[Potion.SLOWNESS_IV] = new Potion(Potion.SLOWNESS, 4); - } - - public static Potion getPotion(int id) { - if (id >= 0 && id < potions.length && potions[id] != null) { - return potions[id].clone(); - } else { - throw new ServerException("Effect id: " + id + " not found"); - } - } - - public static Potion getPotionByName(String name) { - try { - byte id = Potion.class.getField(name.toUpperCase()).getByte(null); - return getPotion(id); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - protected final int id; - - protected final int level; - - protected boolean splash; - - public Potion(int id) { - this(id, 1); - } - - public Potion(int id, int level) { - this(id, level, false); - } - - public Potion(int id, int level, boolean splash) { - this.id = id; - this.level = level; - this.splash = splash; - } - - public Effect getEffect() { - return getEffect(this.id, this.splash); - } - - public int getId() { - return id; - } - - public int getLevel() { - return level; - } - - public boolean isSplash() { - return splash; - } - - public Potion setSplash(boolean splash) { - this.splash = splash; - return this; - } - - public void applyPotion(Entity entity) { - applyPotion(entity, 0.5); - } - - public void applyPotion(Entity entity, double health) { - if (!(entity instanceof EntityLiving)) { - return; - } - - if (this.id == WATER && (entity instanceof EntityEnderman || entity instanceof EntityStrider || entity instanceof EntitySnowGolem || entity instanceof EntityBlaze)) { - entity.attack(new EntityDamageEvent(entity, DamageCause.MAGIC, 1f)); - return; - } - - Effect applyEffect = getEffect(this.id, this.splash); - - if (applyEffect == null) { - return; - } - - /*if (entity instanceof Player) { - if (!((Player) entity).isSurvival() && !((Player) entity).isAdventure() && applyEffect.isBad()) { - return; - } - }*/ - - PotionApplyEvent event = new PotionApplyEvent(this, applyEffect, entity); - - entity.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - - applyEffect = event.getApplyEffect(); - - switch (this.id) { - case INSTANT_HEALTH: - case INSTANT_HEALTH_II: - if (entity instanceof EntitySmite) { - entity.attack(new EntityDamageEvent(entity, DamageCause.MAGIC, (float) (health * (6 << (applyEffect.getAmplifier() + 1))))); - } else { - entity.heal(new EntityRegainHealthEvent(entity, (float) (health * (double) (4 << (applyEffect.getAmplifier() + 1))), EntityRegainHealthEvent.CAUSE_MAGIC)); - } - break; - case HARMING: - if (entity instanceof EntitySmite) { - entity.heal(new EntityRegainHealthEvent(entity, (float) (health * (double) (4 << (applyEffect.getAmplifier() + 1))), EntityRegainHealthEvent.CAUSE_MAGIC)); - } else { - entity.attack(new EntityDamageEvent(entity, DamageCause.MAGIC, (float) (health * 6))); - } - break; - case HARMING_II: - if (entity instanceof EntitySmite) { - entity.heal(new EntityRegainHealthEvent(entity, (float) (health * (double) (4 << (applyEffect.getAmplifier() + 1))), EntityRegainHealthEvent.CAUSE_MAGIC)); - } else { - entity.attack(new EntityDamageEvent(entity, DamageCause.MAGIC, (float) (health * 12))); - } - break; - default: - applyEffect.setDuration((int) ((splash ? health : 1) * (double) applyEffect.getDuration() + 0.5)); - entity.addEffect(applyEffect); - } - } - - @Override - public Potion clone() { - try { - return (Potion) super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - - public static Effect getEffect(int potionType, boolean isSplash) { - Effect effect; - switch (potionType) { - case NO_EFFECTS: - case MUNDANE: - case MUNDANE_II: - case THICK: - case AWKWARD: - return null; - case NIGHT_VISION: - case NIGHT_VISION_LONG: - effect = Effect.getEffect(Effect.NIGHT_VISION); - break; - case INVISIBLE: - case INVISIBLE_LONG: - effect = Effect.getEffect(Effect.INVISIBILITY); - break; - case LEAPING: - case LEAPING_LONG: - case LEAPING_II: - effect = Effect.getEffect(Effect.JUMP); - break; - case FIRE_RESISTANCE: - case FIRE_RESISTANCE_LONG: - effect = Effect.getEffect(Effect.FIRE_RESISTANCE); - break; - case SPEED: - case SPEED_LONG: - case SPEED_II: - effect = Effect.getEffect(Effect.SPEED); - break; - case SLOWNESS: - case SLOWNESS_LONG: - case SLOWNESS_LONG_II: - case SLOWNESS_IV: - effect = Effect.getEffect(Effect.SLOWNESS); - break; - case WATER_BREATHING: - case WATER_BREATHING_LONG: - effect = Effect.getEffect(Effect.WATER_BREATHING); - break; - case INSTANT_HEALTH: - case INSTANT_HEALTH_II: - return Effect.getEffect(Effect.HEALING); - case HARMING: - case HARMING_II: - return Effect.getEffect(Effect.HARMING); - case POISON: - case POISON_LONG: - case POISON_II: - effect = Effect.getEffect(Effect.POISON); - break; - case REGENERATION: - case REGENERATION_LONG: - case REGENERATION_II: - effect = Effect.getEffect(Effect.REGENERATION); - break; - case STRENGTH: - case STRENGTH_LONG: - case STRENGTH_II: - effect = Effect.getEffect(Effect.STRENGTH); - break; - case WEAKNESS: - case WEAKNESS_LONG: - effect = Effect.getEffect(Effect.WEAKNESS); - break; - case WITHER_II: - effect = Effect.getEffect(Effect.WITHER); - break; - default: - return null; - } - - if (getLevel(potionType) > 1) { - effect.setAmplifier(1); - } - - if (!isInstant(potionType)) { - effect.setDuration(20 * getApplySeconds(potionType, isSplash)); - } - - return effect; - } - - public static int getLevel(int potionType) { - switch (potionType) { - case SLOWNESS_IV: - return 4; - case MUNDANE_II: - case LEAPING_II: - case SPEED_II: - case INSTANT_HEALTH_II: - case HARMING_II: - case POISON_II: - case REGENERATION_II: - case STRENGTH_II: - case WITHER_II: - case TURTLE_MASTER_II: - case SLOWNESS_LONG_II: - return 2; - default: - return 1; - } - } - - public static boolean isInstant(int potionType) { - switch (potionType) { - case INSTANT_HEALTH: - case INSTANT_HEALTH_II: - case HARMING: - case HARMING_II: - return true; - default: - return false; - } - } - - public static int getApplySeconds(int potionType, boolean isSplash) { - if (isSplash) { - switch (potionType) { - case NO_EFFECTS: - return 0; - case MUNDANE: - return 0; - case MUNDANE_II: - return 0; - case THICK: - return 0; - case AWKWARD: - return 0; - case NIGHT_VISION: - return 135; - case NIGHT_VISION_LONG: - return 360; - case INVISIBLE: - return 135; - case INVISIBLE_LONG: - return 360; - case LEAPING: - return 135; - case LEAPING_LONG: - return 360; - case LEAPING_II: - return 67; - case FIRE_RESISTANCE: - return 135; - case FIRE_RESISTANCE_LONG: - return 360; - case SPEED: - return 135; - case SPEED_LONG: - return 360; - case SPEED_II: - return 67; - case SLOWNESS: - return 67; - case SLOWNESS_LONG: - return 180; - case WATER_BREATHING: - return 135; - case WATER_BREATHING_LONG: - return 360; - case INSTANT_HEALTH: - return 0; - case INSTANT_HEALTH_II: - return 0; - case HARMING: - return 0; - case HARMING_II: - return 0; - case POISON: - return 33; - case POISON_LONG: - return 90; - case POISON_II: - return 16; - case REGENERATION: - return 33; - case REGENERATION_LONG: - return 90; - case REGENERATION_II: - return 16; - case STRENGTH: - return 135; - case STRENGTH_LONG: - return 360; - case STRENGTH_II: - return 67; - case WEAKNESS: - return 67; - case WEAKNESS_LONG: - return 180; - case WITHER_II: - return 30; - case SLOWNESS_IV: - return 15; - default: - return 0; - } - } else { - switch (potionType) { - case NO_EFFECTS: - return 0; - case MUNDANE: - return 0; - case MUNDANE_II: - return 0; - case THICK: - return 0; - case AWKWARD: - return 0; - case NIGHT_VISION: - return 180; - case NIGHT_VISION_LONG: - return 480; - case INVISIBLE: - return 180; - case INVISIBLE_LONG: - return 480; - case LEAPING: - return 180; - case LEAPING_LONG: - return 480; - case LEAPING_II: - return 90; - case FIRE_RESISTANCE: - return 180; - case FIRE_RESISTANCE_LONG: - return 480; - case SPEED: - return 180; - case SPEED_LONG: - return 480; - case SPEED_II: - return 480; - case SLOWNESS: - return 90; - case SLOWNESS_LONG: - return 240; - case WATER_BREATHING: - return 180; - case WATER_BREATHING_LONG: - return 480; - case INSTANT_HEALTH: - return 0; - case INSTANT_HEALTH_II: - return 0; - case HARMING: - return 0; - case HARMING_II: - return 0; - case POISON: - return 45; - case POISON_LONG: - return 120; - case POISON_II: - return 22; - case REGENERATION: - return 45; - case REGENERATION_LONG: - return 120; - case REGENERATION_II: - return 22; - case STRENGTH: - return 180; - case STRENGTH_LONG: - return 480; - case STRENGTH_II: - return 90; - case WEAKNESS: - return 90; - case WEAKNESS_LONG: - return 240; - case WITHER_II: - return 30; - case SLOWNESS_IV: - return 20; - default: - return 0; - } - } - } -} diff --git a/src/main/java/cn/nukkit/resourcepacks/AbstractResourcePack.java b/src/main/java/cn/nukkit/resourcepacks/AbstractResourcePack.java deleted file mode 100644 index d8d3706a9..000000000 --- a/src/main/java/cn/nukkit/resourcepacks/AbstractResourcePack.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.resourcepacks; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -import java.util.UUID; - -public abstract class AbstractResourcePack implements ResourcePack { - - protected JsonObject manifest; - private UUID id = null; - - protected boolean verifyManifest() { - if (this.manifest.has("format_version") && this.manifest.has("header") && this.manifest.has("modules")) { - JsonObject header = this.manifest.getAsJsonObject("header"); - return header.has("description") && - header.has("name") && - header.has("uuid") && - header.has("version") && - header.getAsJsonArray("version").size() == 3; - } else { - return false; - } - } - - @Override - public String getPackName() { - return this.manifest.getAsJsonObject("header") - .get("name").getAsString(); - } - - @Override - public UUID getPackId() { - if (id == null) { - id = UUID.fromString(this.manifest.getAsJsonObject("header").get("uuid").getAsString()); - } - return id; - } - - @Override - public String getPackVersion() { - JsonArray version = this.manifest.getAsJsonObject("header") - .get("version").getAsJsonArray(); - - return String.join(".", version.get(0).getAsString(), - version.get(1).getAsString(), - version.get(2).getAsString()); - } -} diff --git a/src/main/java/cn/nukkit/resourcepacks/ChemistryResourcePack.java b/src/main/java/cn/nukkit/resourcepacks/ChemistryResourcePack.java deleted file mode 100644 index 923162f07..000000000 --- a/src/main/java/cn/nukkit/resourcepacks/ChemistryResourcePack.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.resourcepacks; - -import java.util.UUID; - -public class ChemistryResourcePack extends AbstractResourcePack { - - @Override - public int getPackSize() { - return 0; - } - - @Override - public byte[] getSha256() { - return new byte[0]; - } - - @Override - public byte[] getPackChunk(int off, int len) { - return new byte[0]; - } - - @Override - public String getPackName() { - return ""; - } - - @Override - public UUID getPackId() { - return UUID.fromString("0fba4063-dba1-4281-9b89-ff9390653530"); - } - - @Override - public String getPackVersion() { - return "1.0.0"; - } -} diff --git a/src/main/java/cn/nukkit/resourcepacks/ResourcePack.java b/src/main/java/cn/nukkit/resourcepacks/ResourcePack.java deleted file mode 100644 index d7c28d38b..000000000 --- a/src/main/java/cn/nukkit/resourcepacks/ResourcePack.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.resourcepacks; - -import java.util.UUID; - -public interface ResourcePack { - - String getPackName(); - - UUID getPackId(); - - String getPackVersion(); - - int getPackSize(); - - byte[] getSha256(); - - byte[] getPackChunk(int off, int len); -} diff --git a/src/main/java/cn/nukkit/resourcepacks/ResourcePackManager.java b/src/main/java/cn/nukkit/resourcepacks/ResourcePackManager.java deleted file mode 100644 index 0f9888b05..000000000 --- a/src/main/java/cn/nukkit/resourcepacks/ResourcePackManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.nukkit.resourcepacks; - -import cn.nukkit.Server; -import com.google.common.io.Files; - -import java.io.File; -import java.util.*; - -public class ResourcePackManager { - - private final Map resourcePacksById = new HashMap<>(); - private ResourcePack[] resourcePacks; - - public ResourcePackManager(File path) { - if (!path.exists()) { - path.mkdirs(); - } else if (!path.isDirectory()) { - throw new IllegalArgumentException(Server.getInstance().getLanguage() - .translateString("nukkit.resources.invalid-path", path.getName())); - } - - List loadedResourcePacks = new ArrayList<>(); - for (File pack : path.listFiles()) { - try { - ResourcePack resourcePack = null; - - if (!pack.isDirectory()) { - switch (Files.getFileExtension(pack.getName())) { - case "zip": - case "mcpack": - resourcePack = new ZippedResourcePack(pack); - break; - default: - Server.getInstance().getLogger().warning(Server.getInstance().getLanguage() - .translateString("nukkit.resources.unknown-format", pack.getName())); - break; - } - } - - if (resourcePack != null) { - loadedResourcePacks.add(resourcePack); - this.resourcePacksById.put(resourcePack.getPackId(), resourcePack); - } - } catch (IllegalArgumentException e) { - Server.getInstance().getLogger().warning(Server.getInstance().getLanguage() - .translateString("nukkit.resources.fail", pack.getName(), e.getMessage())); - } - } - - if (Server.getInstance().getPropertyBoolean("chemistry-resources-enabled")) { - ChemistryResourcePack crp = new ChemistryResourcePack(); - loadedResourcePacks.add(crp); - this.resourcePacksById.put(UUID.fromString("0fba4063-dba1-4281-9b89-ff9390653530"), crp); - } - - this.resourcePacks = loadedResourcePacks.toArray(new ResourcePack[0]); - Server.getInstance().getLogger().info(Server.getInstance().getLanguage() - .translateString("nukkit.resources.success", String.valueOf(this.resourcePacks.length))); - } - - public ResourcePack[] getResourceStack() { - return this.resourcePacks; - } - - public ResourcePack getPackById(UUID id) { - return this.resourcePacksById.get(id); - } -} diff --git a/src/main/java/cn/nukkit/resourcepacks/ZippedResourcePack.java b/src/main/java/cn/nukkit/resourcepacks/ZippedResourcePack.java deleted file mode 100644 index e29e15a9b..000000000 --- a/src/main/java/cn/nukkit/resourcepacks/ZippedResourcePack.java +++ /dev/null @@ -1,95 +0,0 @@ -package cn.nukkit.resourcepacks; - -import cn.nukkit.Server; -import com.google.gson.JsonParser; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.security.MessageDigest; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -public class ZippedResourcePack extends AbstractResourcePack { - - private File file; - private byte[] sha256; - - public ZippedResourcePack(File file) { - if (!file.exists()) { - throw new IllegalArgumentException(Server.getInstance().getLanguage() - .translateString("nukkit.resources.zip.not-found", file.getName())); - } - - this.file = file; - - try (ZipFile zip = new ZipFile(file)) { - ZipEntry entry = zip.getEntry("manifest.json"); - if (entry == null) { - entry = zip.stream() - .filter(e-> e.getName().toLowerCase().endsWith("manifest.json") && !e.isDirectory()) - .filter(e-> { - File fe = new File(e.getName()); - if (!fe.getName().equalsIgnoreCase("manifest.json")) { - return false; - } - return fe.getParent() == null || fe.getParentFile().getParent() == null; - }) - .findFirst() - .orElseThrow(()-> new IllegalArgumentException( - Server.getInstance().getLanguage().translateString("nukkit.resources.zip.no-manifest"))); - } - - this.manifest = new JsonParser() - .parse(new InputStreamReader(zip.getInputStream(entry), StandardCharsets.UTF_8)) - .getAsJsonObject(); - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - } - - if (!this.verifyManifest()) { - throw new IllegalArgumentException(Server.getInstance().getLanguage() - .translateString("nukkit.resources.zip.invalid-manifest")); - } - } - - @Override - public int getPackSize() { - return (int) this.file.length(); - } - - @Override - public byte[] getSha256() { - if (this.sha256 == null) { - try { - this.sha256 = MessageDigest.getInstance("SHA-256").digest(Files.readAllBytes(this.file.toPath())); - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - } - - return this.sha256; - } - - @Override - public byte[] getPackChunk(int off, int len) { - byte[] chunk; - if (this.getPackSize() - off > len) { - chunk = new byte[len]; - } else { - chunk = new byte[this.getPackSize() - off]; - } - - try (FileInputStream fis = new FileInputStream(this.file)) { - fis.skip(off); - fis.read(chunk); - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - - return chunk; - } -} diff --git a/src/main/java/cn/nukkit/scheduler/AsyncPool.java b/src/main/java/cn/nukkit/scheduler/AsyncPool.java deleted file mode 100644 index 607228b91..000000000 --- a/src/main/java/cn/nukkit/scheduler/AsyncPool.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.Server; - -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * @author Nukkit Project Team - */ -public class AsyncPool extends ThreadPoolExecutor { - - private final Server server; - - public AsyncPool(Server server, int size) { - super(size, Integer.MAX_VALUE, 60, TimeUnit.MILLISECONDS, new SynchronousQueue<>()); - this.setThreadFactory(runnable -> new Thread(runnable) {{ - setDaemon(true); - setName(String.format("Nukkit Asynchronous Task Handler #%s", getPoolSize())); - }}); - this.server = server; - } - - @Override - protected void afterExecute(Runnable runnable, Throwable throwable) { - if (throwable != null) { - server.getLogger().critical("Exception in asynchronous task", throwable); - } - } - - public Server getServer() { - return server; - } -} diff --git a/src/main/java/cn/nukkit/scheduler/AsyncTask.java b/src/main/java/cn/nukkit/scheduler/AsyncTask.java deleted file mode 100644 index a76ce5502..000000000 --- a/src/main/java/cn/nukkit/scheduler/AsyncTask.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.Server; -import cn.nukkit.utils.ThreadStore; -import co.aikar.timings.Timings; - -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; - -/** - * @author Nukkit Project Team - */ -public abstract class AsyncTask implements Runnable { - - public static final Queue FINISHED_LIST = new ConcurrentLinkedQueue<>(); - - private Object result; - private int taskId; - private boolean finished = false; - - public void run() { - this.result = null; - this.onRun(); - this.finished = true; - FINISHED_LIST.offer(this); - } - - public boolean isFinished() { - return this.finished; - } - - public Object getResult() { - return this.result; - } - - public boolean hasResult() { - return this.result != null; - } - - public void setResult(Object result) { - this.result = result; - } - - public void setTaskId(int taskId) { - this.taskId = taskId; - } - - public int getTaskId() { - return this.taskId; - } - - public Object getFromThreadStore(String identifier) { - return this.finished ? null : ThreadStore.store.get(identifier); - } - - public void saveToThreadStore(String identifier, Object value) { - if (!this.finished) { - if (value == null) { - ThreadStore.store.remove(identifier); - } else { - ThreadStore.store.put(identifier, value); - } - } - } - - public abstract void onRun(); - - public void onCompletion(Server server) { - - } - - public void cleanObject() { - this.result = null; - this.taskId = 0; - this.finished = false; - } - - public static void collectTask() { - if (Timings.schedulerAsyncTimer != null) Timings.schedulerAsyncTimer.startTiming(); - while (!FINISHED_LIST.isEmpty()) { - AsyncTask task = FINISHED_LIST.poll(); - try { - task.onCompletion(Server.getInstance()); - } catch (Exception e) { - Server.getInstance().getLogger().critical("Exception while async task " - + task.taskId - + " invoking onCompletion", e); - } - } - if (Timings.schedulerAsyncTimer != null) Timings.schedulerAsyncTimer.stopTiming(); - } -} diff --git a/src/main/java/cn/nukkit/scheduler/AsyncWorker.java b/src/main/java/cn/nukkit/scheduler/AsyncWorker.java deleted file mode 100644 index 338627342..000000000 --- a/src/main/java/cn/nukkit/scheduler/AsyncWorker.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.InterruptibleThread; - -import java.util.LinkedList; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class AsyncWorker extends Thread implements InterruptibleThread { - - private final LinkedList stack = new LinkedList<>(); - - public AsyncWorker() { - this.setName("Asynchronous Worker"); - } - - public void stack(AsyncTask task) { - synchronized (stack) { - stack.addFirst(task); - } - } - - public void unstack() { - synchronized (stack) { - stack.clear(); - } - } - - public void unstack(AsyncTask task) { - synchronized (stack) { - stack.remove(task); - } - } - - public void run() { - while (true) { - synchronized (stack) { - for (AsyncTask task : stack) { - if (!task.isFinished()) { - task.run(); - } - } - } - try { - sleep(5); - } catch (InterruptedException ignored) {} - } - } -} diff --git a/src/main/java/cn/nukkit/scheduler/BlockUpdateScheduler.java b/src/main/java/cn/nukkit/scheduler/BlockUpdateScheduler.java deleted file mode 100644 index 7441440e8..000000000 --- a/src/main/java/cn/nukkit/scheduler/BlockUpdateScheduler.java +++ /dev/null @@ -1,138 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.block.Block; -import cn.nukkit.level.Level; -import cn.nukkit.math.AxisAlignedBB; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.BlockUpdateEntry; -import com.google.common.collect.Maps; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -public class BlockUpdateScheduler { - - private final Level level; - private long lastTick; - private Map> queuedUpdates; - - private Set pendingUpdates; - - public BlockUpdateScheduler(Level level, long currentTick) { - queuedUpdates = Maps.newHashMap(); // Change to ConcurrentHashMap if this needs to be concurrent - lastTick = currentTick; - this.level = level; - } - - public synchronized void tick(long currentTick) { - // Should only perform once, unless ticks were skipped - if (currentTick - lastTick < Short.MAX_VALUE) {// Arbitrary - for (long tick = lastTick + 1; tick <= currentTick; tick++) { - perform(tick); - } - } else { - ArrayList times = new ArrayList<>(queuedUpdates.keySet()); - Collections.sort(times); - for (long tick : times) { - if (tick <= currentTick) { - perform(tick); - } else { - break; - } - } - } - lastTick = currentTick; - } - - private void perform(long tick) { - try { - lastTick = tick; - Set updates = pendingUpdates = queuedUpdates.remove(tick); - if (updates != null) { - for (BlockUpdateEntry entry : updates) { - if (level.isAreaLoaded(new AxisAlignedBB(entry.pos, entry.pos))) { - Block block = level.getBlock(entry.pos); - - if (Block.equals(block, entry.block, false)) { - block.onUpdate(Level.BLOCK_UPDATE_SCHEDULED); - } - } else { - level.scheduleUpdate(entry.block, entry.pos, 0); - } - } - } - } finally { - pendingUpdates = null; - } - } - - public Set getPendingBlockUpdates(AxisAlignedBB boundingBox) { - Set set = null; - - for (Map.Entry> tickEntries : this.queuedUpdates.entrySet()) { - LinkedHashSet tickSet = tickEntries.getValue(); - for (BlockUpdateEntry update : tickSet) { - Vector3 pos = update.pos; - - if (pos.getX() >= boundingBox.minX && pos.getX() < boundingBox.maxX && pos.getZ() >= boundingBox.minZ && pos.getZ() < boundingBox.maxZ) { - if (set == null) { - set = new LinkedHashSet<>(); - } - - set.add(update); - } - } - } - - return set; - } - - public boolean isBlockTickPending(Vector3 pos, Block block) { - Set tmpUpdates = pendingUpdates; - if (tmpUpdates == null || tmpUpdates.isEmpty()) return false; - return tmpUpdates.contains(new BlockUpdateEntry(pos, block)); - } - - private long getMinTime(BlockUpdateEntry entry) { - return Math.max(entry.delay, lastTick + 1); - } - - public void add(BlockUpdateEntry entry) { - long time = getMinTime(entry); - LinkedHashSet updateSet = queuedUpdates.get(time); - if (updateSet == null) { - LinkedHashSet tmp = queuedUpdates.putIfAbsent(time, updateSet = new LinkedHashSet<>()); - if (tmp != null) updateSet = tmp; - } - updateSet.add(entry); - } - - public boolean contains(BlockUpdateEntry entry) { - for (Map.Entry> tickUpdateSet : queuedUpdates.entrySet()) { - if (tickUpdateSet.getValue().contains(entry)) { - return true; - } - } - return false; - } - - public boolean remove(BlockUpdateEntry entry) { - for (Map.Entry> tickUpdateSet : queuedUpdates.entrySet()) { - if (tickUpdateSet.getValue().remove(entry)) { - return true; - } - } - return false; - } - - public boolean remove(Vector3 pos) { - for (Map.Entry> tickUpdateSet : queuedUpdates.entrySet()) { - if (tickUpdateSet.getValue().remove(pos)) { - return true; - } - } - return false; - } -} diff --git a/src/main/java/cn/nukkit/scheduler/FileWriteTask.java b/src/main/java/cn/nukkit/scheduler/FileWriteTask.java deleted file mode 100644 index 982c63883..000000000 --- a/src/main/java/cn/nukkit/scheduler/FileWriteTask.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.Server; -import cn.nukkit.utils.Utils; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; - -/** - * @author MagicDroidX - * Nukkit Project - */ -public class FileWriteTask extends AsyncTask { - - private final File file; - private final InputStream contents; - - public FileWriteTask(String path, String contents) { - this(new File(path), contents); - } - - public FileWriteTask(String path, byte[] contents) { - this(new File(path), contents); - } - - public FileWriteTask(String path, InputStream contents) { - this.file = new File(path); - this.contents = contents; - } - - public FileWriteTask(File file, String contents) { - this.file = file; - this.contents = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); - } - - public FileWriteTask(File file, byte[] contents) { - this.file = file; - this.contents = new ByteArrayInputStream(contents); - } - - public FileWriteTask(File file, InputStream contents) { - this.file = file; - this.contents = contents; - } - - @Override - public void onRun() { - try { - Utils.writeFile(file, contents); - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - } - } -} diff --git a/src/main/java/cn/nukkit/scheduler/NukkitRunnable.java b/src/main/java/cn/nukkit/scheduler/NukkitRunnable.java deleted file mode 100644 index 888f3d41f..000000000 --- a/src/main/java/cn/nukkit/scheduler/NukkitRunnable.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.Server; -import cn.nukkit.plugin.Plugin; - -/** - * This class is provided as an easy way to handle scheduling tasks. - */ -public abstract class NukkitRunnable implements Runnable { - - private TaskHandler taskHandler; - - /** - * Attempts to cancel this task. - * - * @throws IllegalStateException if task was not scheduled yet - */ - public synchronized void cancel() throws IllegalStateException { - taskHandler.cancel(); - } - - public synchronized Runnable runTask(Plugin plugin) throws IllegalArgumentException, IllegalStateException { - checkState(); - this.taskHandler = Server.getInstance().getScheduler().scheduleTask(plugin, this); - return taskHandler.getTask(); - } - - public synchronized Runnable runTaskAsynchronously(Plugin plugin) throws IllegalArgumentException, IllegalStateException { - checkState(); - this.taskHandler = Server.getInstance().getScheduler().scheduleTask(plugin, this, true); - return taskHandler.getTask(); - } - - public synchronized Runnable runTaskLater(Plugin plugin, int delay) throws IllegalArgumentException, IllegalStateException { - checkState(); - this.taskHandler = Server.getInstance().getScheduler().scheduleDelayedTask(plugin, this, delay); - return taskHandler.getTask(); - } - - public synchronized Runnable runTaskLaterAsynchronously(Plugin plugin, int delay) throws IllegalArgumentException, IllegalStateException { - checkState(); - this.taskHandler = Server.getInstance().getScheduler().scheduleDelayedTask(plugin, this, delay, true); - return taskHandler.getTask(); - } - - public synchronized Runnable runTaskTimer(Plugin plugin, int delay, int period) throws IllegalArgumentException, IllegalStateException { - checkState(); - this.taskHandler = Server.getInstance().getScheduler().scheduleDelayedRepeatingTask(plugin, this, delay, period); - return taskHandler.getTask(); - } - - public synchronized Runnable runTaskTimerAsynchronously(Plugin plugin, int delay, int period) throws IllegalArgumentException, IllegalStateException { - checkState(); - this.taskHandler = Server.getInstance().getScheduler().scheduleDelayedRepeatingTask(plugin, this, delay, period, true); - return taskHandler.getTask(); - } - - /** - * Gets the task id for this runnable. - * - * @return the task id that this runnable was scheduled as - * @throws IllegalStateException if task was not scheduled yet - */ - public synchronized int getTaskId() throws IllegalStateException { - if (taskHandler == null) { - throw new IllegalStateException("Not scheduled yet"); - } - return taskHandler.getTaskId(); - } - - private void checkState() { - if (taskHandler != null) { - throw new IllegalStateException("Already scheduled as " + taskHandler.getTaskId()); - } - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/scheduler/PluginTask.java b/src/main/java/cn/nukkit/scheduler/PluginTask.java deleted file mode 100644 index 9f522aeec..000000000 --- a/src/main/java/cn/nukkit/scheduler/PluginTask.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.nukkit.scheduler; - - -import cn.nukkit.plugin.Plugin; - -/** - * 插件创建的任务。
Task that created by a plugin. - * - * 对于插件作者,通过继承这个类创建的任务,可以在插件被禁用时不被执行。
- * For plugin developers: Tasks that extend this class, won't be executed when the plugin is disabled. - * - * 另外,继承这个类的任务可以通过{@link #getOwner()}来获得这个任务所属的插件。
- * Otherwise, tasks that extend this class can use {@link #getOwner()} to get its owner. - * - * 下面是一个插件创建任务的例子:
An example for plugin create a task: - *
- *     public class ExampleTask extends PluginTask<ExamplePlugin>{
- *         public ExampleTask(ExamplePlugin plugin) {
- *             super(plugin);
- *         }
- *
- *        {@code @Override}
- *         public void onRun(int currentTick) {
- *             getOwner().getLogger().info("Task is executed in tick "+currentTick);
- *         }
- *     }
- *     
- * - * 如果要让Nukkit能够延时或循环执行这个任务,请使用{@link ServerScheduler}。
- * If you want Nukkit to execute this task with delay or repeat, use {@link ServerScheduler}. - * - * @param 这个任务所属的插件。
The plugin that owns this task. - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public abstract class PluginTask extends Task { - - protected final T owner; - - /** - * 构造一个插件拥有的任务的方法。
Constructs a plugin-owned task. - * - * @param owner 这个任务的所有者插件。
The plugin object that owns this task. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public PluginTask(T owner) { - this.owner = owner; - } - - /** - * 返回这个任务的所有者插件。
- * Returns the owner of this task. - * - * @return 这个任务的所有者插件。
The plugin that owns this task. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public final T getOwner() { - return this.owner; - } -} diff --git a/src/main/java/cn/nukkit/scheduler/ServerScheduler.java b/src/main/java/cn/nukkit/scheduler/ServerScheduler.java deleted file mode 100644 index f8d7b7a11..000000000 --- a/src/main/java/cn/nukkit/scheduler/ServerScheduler.java +++ /dev/null @@ -1,272 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.Server; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.utils.PluginException; - -import java.util.Map; -import java.util.Optional; -import java.util.PriorityQueue; -import java.util.Queue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @author Nukkit Project Team - */ -public class ServerScheduler { - - public static int WORKERS = 4; - - private final AsyncPool asyncPool; - - private final Queue pending; - private final Queue queue; - private final Map taskMap; - private final AtomicInteger currentTaskId; - - private volatile int currentTick; - - public ServerScheduler() { - this.pending = new ConcurrentLinkedQueue<>(); - this.currentTaskId = new AtomicInteger(); - this.queue = new PriorityQueue<>(11, (left, right) -> { - int i = left.getNextRunTick() - right.getNextRunTick(); - if (i == 0) { - return left.getTaskId() - right.getTaskId(); - } - return i; - }); - this.taskMap = new ConcurrentHashMap<>(); - this.asyncPool = new AsyncPool(Server.getInstance(), WORKERS); - } - - public TaskHandler scheduleTask(Task task) { - return addTask(task, 0, 0, false); - } - - public TaskHandler scheduleTask(Runnable task) { - return addTask(null, task, 0, 0, false); - } - - public TaskHandler scheduleTask(Plugin plugin, Runnable task) { - return addTask(plugin, task, 0, 0, false); - } - - public TaskHandler scheduleTask(Runnable task, boolean asynchronous) { - return addTask(null, task, 0, 0, asynchronous); - } - - public TaskHandler scheduleTask(Plugin plugin, Runnable task, boolean asynchronous) { - return addTask(plugin, task, 0, 0, asynchronous); - } - - public TaskHandler scheduleAsyncTask(AsyncTask task) { - return addTask(null, task, 0, 0, true); - } - - public TaskHandler scheduleAsyncTask(Plugin plugin, AsyncTask task) { - return addTask(plugin, task, 0, 0, true); - } - - public void scheduleAsyncTaskToWorker(AsyncTask task, int worker) { - scheduleAsyncTask(task); - } - - public int getAsyncTaskPoolSize() { - return asyncPool.getCorePoolSize(); - } - - public TaskHandler scheduleDelayedTask(Task task, int delay) { - return this.addTask(task, delay, 0, false); - } - - public TaskHandler scheduleDelayedTask(Task task, int delay, boolean asynchronous) { - return this.addTask(task, delay, 0, asynchronous); - } - - public TaskHandler scheduleDelayedTask(Runnable task, int delay) { - return addTask(null, task, delay, 0, false); - } - - public TaskHandler scheduleDelayedTask(Plugin plugin, Runnable task, int delay) { - return addTask(plugin, task, delay, 0, false); - } - - public TaskHandler scheduleDelayedTask(Runnable task, int delay, boolean asynchronous) { - return addTask(null, task, delay, 0, asynchronous); - } - - public TaskHandler scheduleDelayedTask(Plugin plugin, Runnable task, int delay, boolean asynchronous) { - return addTask(plugin, task, delay, 0, asynchronous); - } - - public TaskHandler scheduleRepeatingTask(Runnable task, int period) { - return addTask(null, task, 0, period, false); - } - - public TaskHandler scheduleRepeatingTask(Plugin plugin, Runnable task, int period) { - return addTask(plugin, task, 0, period, false); - } - - public TaskHandler scheduleRepeatingTask(Runnable task, int period, boolean asynchronous) { - return addTask(null, task, 0, period, asynchronous); - } - - public TaskHandler scheduleRepeatingTask(Plugin plugin, Runnable task, int period, boolean asynchronous) { - return addTask(plugin, task, 0, period, asynchronous); - } - - public TaskHandler scheduleRepeatingTask(Task task, int period) { - return addTask(task, 0, period, false); - } - - public TaskHandler scheduleRepeatingTask(Task task, int period, boolean asynchronous) { - return addTask(task, 0, period, asynchronous); - } - - public TaskHandler scheduleDelayedRepeatingTask(Task task, int delay, int period) { - return addTask(task, delay, period, false); - } - - public TaskHandler scheduleDelayedRepeatingTask(Task task, int delay, int period, boolean asynchronous) { - return addTask(task, delay, period, asynchronous); - } - - public TaskHandler scheduleDelayedRepeatingTask(Runnable task, int delay, int period) { - return addTask(null, task, delay, period, false); - } - - public TaskHandler scheduleDelayedRepeatingTask(Plugin plugin, Runnable task, int delay, int period) { - return addTask(plugin, task, delay, period, false); - } - - public TaskHandler scheduleDelayedRepeatingTask(Runnable task, int delay, int period, boolean asynchronous) { - return addTask(null, task, delay, period, asynchronous); - } - - public TaskHandler scheduleDelayedRepeatingTask(Plugin plugin, Runnable task, int delay, int period, boolean asynchronous) { - return addTask(plugin, task, delay, period, asynchronous); - } - - public void cancelTask(int taskId) { - if (taskMap.containsKey(taskId)) { - try { - taskMap.remove(taskId).cancel(); - } catch (RuntimeException ex) { - Server.getInstance().getLogger().critical("Exception while invoking onCancel", ex); - } - } - } - - public void cancelTask(Plugin plugin) { - if (plugin == null) { - throw new NullPointerException("Plugin cannot be null!"); - } - for (Map.Entry entry : taskMap.entrySet()) { - TaskHandler taskHandler = entry.getValue(); - if (taskHandler.getPlugin() == null || plugin.equals(taskHandler.getPlugin())) { - try { - taskHandler.cancel(); // It will remove from task map automatic in next main heartbeat - } catch (RuntimeException ex) { - Server.getInstance().getLogger().critical("Exception while invoking onCancel", ex); - } - } - } - } - - public void cancelAllTasks() { - for (Map.Entry entry : this.taskMap.entrySet()) { - try { - entry.getValue().cancel(); - } catch (RuntimeException ex) { - Server.getInstance().getLogger().critical("Exception while invoking onCancel", ex); - } - } - this.taskMap.clear(); - this.queue.clear(); - this.currentTaskId.set(0); - } - - public boolean isQueued(int taskId) { - return this.taskMap.containsKey(taskId); - } - - private TaskHandler addTask(Task task, int delay, int period, boolean asynchronous) { - return addTask(task instanceof PluginTask ? ((PluginTask) task).getOwner() : null, task, delay, period, asynchronous); - } - - private TaskHandler addTask(Plugin plugin, Runnable task, int delay, int period, boolean asynchronous) { - if (plugin != null && plugin.isDisabled()) { - throw new PluginException("Plugin '" + plugin.getName() + "' attempted to register a task while disabled."); - } - if (delay < 0 || period < 0) { - throw new PluginException("Attempted to register a task with negative delay or period."); - } - - TaskHandler taskHandler = new TaskHandler(plugin, task, nextTaskId(), asynchronous); - taskHandler.setDelay(delay); - taskHandler.setPeriod(period); - taskHandler.setNextRunTick(taskHandler.isDelayed() ? currentTick + taskHandler.getDelay() : currentTick); - - if (task instanceof Task) { - ((Task) task).setHandler(taskHandler); - } - - pending.offer(taskHandler); - taskMap.put(taskHandler.getTaskId(), taskHandler); - - return taskHandler; - } - - public void mainThreadHeartbeat(int currentTick) { - this.currentTick = currentTick; - // Accepts pending - while (!pending.isEmpty()) { - queue.offer(pending.poll()); - } - // Main heart beat - while (isReady(currentTick)) { - TaskHandler taskHandler = queue.poll(); - if (taskHandler.isCancelled()) { - taskMap.remove(taskHandler.getTaskId()); - continue; - } else if (taskHandler.isAsynchronous()) { - asyncPool.execute(taskHandler.getTask()); - } else { - if (taskHandler.timing != null) taskHandler.timing.startTiming(); - try { - taskHandler.run(currentTick); - } catch (Throwable e) { - Server.getInstance().getLogger().critical("Could not execute taskHandler " + taskHandler.getTaskId() + ": " + e.getMessage()); - Server.getInstance().getLogger().logException(e instanceof Exception ? e : new RuntimeException(e)); - } - if (taskHandler.timing != null) taskHandler.timing.stopTiming(); - } - if (taskHandler.isRepeating()) { - taskHandler.setNextRunTick(currentTick + taskHandler.getPeriod()); - pending.offer(taskHandler); - } else { - try { - Optional.ofNullable(taskMap.remove(taskHandler.getTaskId())).ifPresent(TaskHandler::cancel); - } catch (RuntimeException ex) { - Server.getInstance().getLogger().critical("Exception while invoking onCancel", ex); - } - } - } - AsyncTask.collectTask(); - } - - public int getQueueSize() { - return queue.size() + pending.size(); - } - - private boolean isReady(int currentTick) { - return this.queue.peek() != null && this.queue.peek().getNextRunTick() <= currentTick; - } - - private int nextTaskId() { - return currentTaskId.incrementAndGet(); - } -} diff --git a/src/main/java/cn/nukkit/scheduler/Task.java b/src/main/java/cn/nukkit/scheduler/Task.java deleted file mode 100644 index c74a817a4..000000000 --- a/src/main/java/cn/nukkit/scheduler/Task.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.Server; - -/** - * 表达一个任务的类。
A class that describes a task. - * - * 一个任务可以被Nukkit服务器立即,延时,循环或延时循环执行。参见:{@link ServerScheduler}
- * A task can be executed by Nukkit server with a/an express, delay, repeat or delay&repeat. - * See:{@link ServerScheduler} - * - * 对于插件开发者,为确保自己任务能够在安全的情况下执行(比如:在插件被禁用时不执行), - * 建议让任务继承{@link PluginTask}类而不是这个类。
- * For plugin developers: To make sure your task will only be executed in the case of safety - * (such as: prevent this task from running if its owner plugin is disabled), - * it's suggested to use {@link PluginTask} instead of extend this class. - * - * @author MagicDroidX(code) @ Nukkit Project - * @author 粉鞋大妈(javadoc) @ Nukkit Project - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ -public abstract class Task implements Runnable { - - private TaskHandler taskHandler = null; - - public final TaskHandler getHandler() { - return this.taskHandler; - } - - public final int getTaskId() { - return this.taskHandler != null ? this.taskHandler.getTaskId() : -1; - } - - public final void setHandler(TaskHandler taskHandler) { - if (this.taskHandler == null || taskHandler == null) { - this.taskHandler = taskHandler; - } - } - - /** - * 这个任务被执行时,会调用的过程。
- * What will be called when the task is executed. - * - * @param currentTick 服务器从开始运行到现在所经过的tick数,20ticks = 1秒,1tick = 0.05秒。
- * The elapsed tick count from the server is started. 20ticks = 1second, 1tick = 0.05second. - * @since Nukkit 1.0 | Nukkit API 1.0.0 - */ - public abstract void onRun(int currentTick); - - @Override - public final void run() { - this.onRun(taskHandler.getLastRunTick()); - } - - public void onCancel() { - - } - - public void cancel() { - try { - this.taskHandler.cancel(); - } catch (RuntimeException ex) { - Server.getInstance().getLogger().critical("Exception while invoking onCancel", ex); - } - } -} diff --git a/src/main/java/cn/nukkit/scheduler/TaskHandler.java b/src/main/java/cn/nukkit/scheduler/TaskHandler.java deleted file mode 100644 index d359ac64f..000000000 --- a/src/main/java/cn/nukkit/scheduler/TaskHandler.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.nukkit.scheduler; - -import cn.nukkit.Server; -import cn.nukkit.plugin.Plugin; -import co.aikar.timings.Timing; -import co.aikar.timings.Timings; - -/** - * @author MagicDroidX - */ -public class TaskHandler { - - private final int taskId; - private final boolean asynchronous; - - private final Plugin plugin; - private final Runnable task; - - private int delay; - private int period; - - private int lastRunTick; - private int nextRunTick; - - private boolean cancelled; - - public final Timing timing; - - public TaskHandler(Plugin plugin, Runnable task, int taskId, boolean asynchronous) { - this.asynchronous = asynchronous; - this.plugin = plugin; - this.task = task; - this.taskId = taskId; - this.timing = Timings.getTaskTiming(this, period); - } - - public boolean isCancelled() { - return this.cancelled; - } - - public int getNextRunTick() { - return this.nextRunTick; - } - - public void setNextRunTick(int nextRunTick) { - this.nextRunTick = nextRunTick; - } - - public int getTaskId() { - return this.taskId; - } - - public Runnable getTask() { - return this.task; - } - - public int getDelay() { - return this.delay; - } - - public boolean isDelayed() { - return this.delay > 0; - } - - public boolean isRepeating() { - return this.period > 0; - } - - public int getPeriod() { - return this.period; - } - - public Plugin getPlugin() { - return plugin; - } - - public int getLastRunTick() { - return lastRunTick; - } - - public void setLastRunTick(int lastRunTick) { - this.lastRunTick = lastRunTick; - } - - public void cancel() { - if (!this.cancelled && this.task instanceof Task) { - ((Task) this.task).onCancel(); - } - this.cancelled = true; - } - - public void remove() { - this.cancelled = true; - } - - public void run(int currentTick) { - try { - setLastRunTick(currentTick); - task.run(); - } catch (RuntimeException ex) { - Server.getInstance().getLogger().critical("Exception while invoking run", ex); - } - } - - public boolean isAsynchronous() { - return asynchronous; - } - - public void setDelay(int delay) { - this.delay = delay; - } - - public void setPeriod(int period) { - this.period = period; - } -} diff --git a/src/main/java/cn/nukkit/utils/AbstractEntitySpawner.java b/src/main/java/cn/nukkit/utils/AbstractEntitySpawner.java deleted file mode 100644 index 043d9df4f..000000000 --- a/src/main/java/cn/nukkit/utils/AbstractEntitySpawner.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.mob.EntityPhantom; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; - -/** - * Base class of the default mob spawners - */ -public abstract class AbstractEntitySpawner implements EntitySpawner { - - protected SpawnerTask spawnTask; - - public AbstractEntitySpawner(SpawnerTask spawnTask) { - this.spawnTask = spawnTask; - } - - @Override - public void spawn() { - for (Player player : Server.getInstance().getOnlinePlayers().values()) { - if (isSpawningAllowed(player)) { - spawnTo(player); - } - } - } - - /** - * Attempt to spawn a mob to a player - * - * @param player player - */ - private void spawnTo(Player player) { - Level level = player.getLevel(); - - if (SpawnerTask.entitySpawnAllowed(level, getEntityNetworkId(), player)) { - Position pos = player.getPosition(); - - if (getEntityNetworkId() == EntityPhantom.NETWORK_ID) { - if (!level.isInSpawnRadius(pos)) { // Do not spawn mobs in the world spawn area - pos.x = pos.x + Utils.rand(-2, 2); - pos.y = pos.y + Utils.rand(20, 34); - pos.z = pos.z + Utils.rand(-2, 2); - spawn(player, pos, level); - } - } else if (pos != null) { - pos.x += SpawnerTask.getRandomSafeXZCoord(Utils.rand(48, 52), Utils.rand(24, 28), Utils.rand(4, 8)); - pos.z += SpawnerTask.getRandomSafeXZCoord(Utils.rand(48, 52), Utils.rand(24, 28), Utils.rand(4, 8)); - - if (!level.isChunkLoaded((int) pos.x >> 4, (int) pos.z >> 4) || !level.isChunkGenerated((int) pos.x >> 4, (int) pos.z >> 4)) { - return; - } - - pos.y = SpawnerTask.getSafeYCoord(level, pos); - - if (!level.isInSpawnRadius(pos)) { // Do not spawn mobs in the world spawn area - try { - spawn(player, pos, level); - } catch (Exception ignored) {} - } - } - } - } - - /** - * Checkif mob spawning is allowed in the world the player is in - * - * @param player player - * @return mob spawning allowed - */ - private boolean isSpawningAllowed(Player player) { - if (!player.getLevel().isMobSpawningAllowed() || Utils.rand(1, 4) == 1) { - return false; - } - if (Server.getInstance().getDifficulty() == 0) { - return !Utils.monstersList.contains(getEntityNetworkId()); - } - return true; - } -} diff --git a/src/main/java/cn/nukkit/utils/BannerPattern.java b/src/main/java/cn/nukkit/utils/BannerPattern.java deleted file mode 100644 index 3d8dd2f0c..000000000 --- a/src/main/java/cn/nukkit/utils/BannerPattern.java +++ /dev/null @@ -1,114 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.nbt.tag.CompoundTag; - -import java.util.HashMap; -import java.util.Map; - -/** - * Banner pattern - */ -public class BannerPattern { - - private final Type type; - private final DyeColor color; - - public BannerPattern(Type type, DyeColor color) { - this.type = type; - this.color = color; - } - - /** - * Get banner pattern color - * - * @return color as DyeColor - */ - public DyeColor getColor() { - return this.color; - } - - /** - * Get banner pattern type - * - * @return type as BannerPattern.Type - */ - public Type getType() { - return this.type; - } - - /** - * Read banner pattern from CompoundTag - * - * @param compoundTag CompoundTag in - * @return BannerPattern out - */ - public static BannerPattern fromCompoundTag(CompoundTag compoundTag) { - return new BannerPattern(Type.getByName(compoundTag.contains("Pattern") ? compoundTag.getString("Pattern") : ""), compoundTag.contains("Color") ? DyeColor.getByDyeData(compoundTag.getInt("Color")) : DyeColor.BLACK); - } - - /** - * Banner pattern type enum - */ - public enum Type { - PATTERN_BOTTOM_STRIPE("bs"), - PATTERN_TOP_STRIPE("ts"), - PATTERN_LEFT_STRIPE("ls"), - PATTERN_RIGHT_STRIPE("rs"), - PATTERN_CENTER_STRIPE("cs"), - PATTERN_MIDDLE_STRIPE("ms"), - PATTERN_DOWN_RIGHT_STRIPE("drs"), - PATTERN_DOWN_LEFT_STRIPE("dls"), - PATTERN_SMALL_STRIPES("ss"), - PATTERN_DIAGONAL_CROSS("cr"), - PATTERN_SQUARE_CROSS("sc"), - PATTERN_LEFT_OF_DIAGONAL("ld"), - PATTERN_RIGHT_OF_UPSIDE_DOWN_DIAGONAL("rud"), - PATTERN_LEFT_OF_UPSIDE_DOWN_DIAGONAL("lud"), - PATTERN_RIGHT_OF_DIAGONAL("rd"), - PATTERN_VERTICAL_HALF_LEFT("vh"), - PATTERN_VERTICAL_HALF_RIGHT("vhr"), - PATTERN_HORIZONTAL_HALF_TOP("hh"), - PATTERN_HORIZONTAL_HALF_BOTTOM("hhb"), - PATTERN_BOTTOM_LEFT_CORNER("bl"), - PATTERN_BOTTOM_RIGHT_CORNER("br"), - PATTERN_TOP_LEFT_CORNER("tl"), - PATTERN_TOP_RIGHT_CORNER("tr"), - PATTERN_BOTTOM_TRIANGLE("bt"), - PATTERN_TOP_TRIANGLE("tt"), - PATTERN_BOTTOM_TRIANGLE_SAWTOOTH("bts"), - PATTERN_TOP_TRIANGLE_SAWTOOTH("tts"), - PATTERN_MIDDLE_CIRCLE("mc"), - PATTERN_MIDDLE_RHOMBUS("mr"), - PATTERN_BORDER("bo"), - PATTERN_CURLY_BORDER("cbo"), - PATTERN_BRICK("bri"), - PATTERN_GRADIENT("gra"), - PATTERN_GRADIENT_UPSIDE_DOWN("gru"), - PATTERN_CREEPER("cre"), - PATTERN_SKULL("sku"), - PATTERN_FLOWER("flo"), - PATTERN_MOJANG("moj"); - - private final static Map BY_NAME = new HashMap<>(); - - private final String name; - - Type(String name) { - this.name = name; - } - - public String getName() { - return this.name; - } - - static { - for (Type type : values()) { - BY_NAME.put(type.getName(), type); - } - } - - public static Type getByName(String name) { - return BY_NAME.get(name); - } - } -} diff --git a/src/main/java/cn/nukkit/utils/Binary.java b/src/main/java/cn/nukkit/utils/Binary.java deleted file mode 100644 index 720323d00..000000000 --- a/src/main/java/cn/nukkit/utils/Binary.java +++ /dev/null @@ -1,559 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Server; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.data.*; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.ProtocolInfo; -import it.unimi.dsi.fastutil.io.FastByteArrayInputStream; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Map; -import java.util.UUID; - -/** - * Binary - * - * @author MagicDroidX - * Nukkit Project - */ -public class Binary { - - public static int signByte(int value) { - return value << 56 >> 56; - } - - public static int unsignByte(int value) { - return value & 0xff; - } - - public static int signShort(int value) { - return value << 48 >> 48; - } - - public int unsignShort(int value) { - return value & 0xffff; - } - - public static int signInt(int value) { - return value << 32 >> 32; - } - - public static int unsignInt(int value) { - return value; - } - - //Triad: {0x00,0x00,0x01}<=>1 - public static int readTriad(byte[] bytes) { - return readInt(new byte[]{ - (byte) 0x00, - bytes[0], - bytes[1], - bytes[2] - }); - } - - public static byte[] writeTriad(int value) { - return new byte[]{ - (byte) ((value >>> 16) & 0xFF), - (byte) ((value >>> 8) & 0xFF), - (byte) (value & 0xFF) - }; - } - - //LTriad: {0x01,0x00,0x00}<=>1 - public static int readLTriad(byte[] bytes) { - return readLInt(new byte[]{ - bytes[0], - bytes[1], - bytes[2], - (byte) 0x00 - }); - } - - public static byte[] writeLTriad(int value) { - return new byte[]{ - (byte) (value & 0xFF), - (byte) ((value >>> 8) & 0xFF), - (byte) ((value >>> 16) & 0xFF) - }; - } - - public static UUID readUUID(byte[] bytes) { - return new UUID(readLLong(bytes), readLLong(new byte[]{ - bytes[8], - bytes[9], - bytes[10], - bytes[11], - bytes[12], - bytes[13], - bytes[14], - bytes[15] - })); - } - - public static byte[] writeUUID(UUID uuid) { - return appendBytes(writeLLong(uuid.getMostSignificantBits()), writeLLong(uuid.getLeastSignificantBits())); - } - - public static byte[] writeMetadata(EntityMetadata metadata) { - Server.mvw("Binary#writeMetadata(EntityMetadata)"); - return writeMetadata(ProtocolInfo.CURRENT_PROTOCOL, metadata); - } - - public static byte[] writeMetadata(int protocol, EntityMetadata metadata) { - BinaryStream stream = new BinaryStream(); - Map map = metadata.getMap(); - stream.putUnsignedVarInt(map.size()); - for (Map.Entry entry : map.entrySet()) { - EntityData d = entry.getValue(); - int id = entry.getKey(); - int type = d.getType(); - boolean forceEmptyData = false; - - // HACK: Multiversion entity data - if (protocol < ProtocolInfo.v1_16_210) { - if (id == 60) { // Remove DATA_RIDER_ROTATION_OFFSET - id = Entity.DATA_STRENGTH; - type = Entity.DATA_TYPE_INT; - forceEmptyData = true; - } - - if (id >= 60) id = id - 1; // 1.16.210 --> 1.16.0 - if (id == 121) id = 119; // DATA_BUOYANCY_DATA - - if (protocol == ProtocolInfo.v1_11_0) { - if (id >= 40) id = id + 1; - } else if (protocol <= ProtocolInfo.v1_2_10) { - if (id >= 29) id = id + 1; - if (id > 76) { // Remove DATA_MAX_STRENGTH and up - id = Entity.DATA_STRENGTH; - type = Entity.DATA_TYPE_INT; - forceEmptyData = true; - } - } - } - - stream.putUnsignedVarInt(id); - stream.putUnsignedVarInt(type); - - switch (d.getType()) { - case Entity.DATA_TYPE_BYTE: - stream.putByte(((ByteEntityData) d).getData().byteValue()); - break; - case Entity.DATA_TYPE_SHORT: - stream.putLShort(((ShortEntityData) d).getData()); - break; - case Entity.DATA_TYPE_INT: - if (forceEmptyData) { - stream.putVarInt(0); - } else { - stream.putVarInt(((IntEntityData) d).getData()); - } - break; - case Entity.DATA_TYPE_FLOAT: - stream.putLFloat(((FloatEntityData) d).getData()); - break; - case Entity.DATA_TYPE_STRING: - String s = ((StringEntityData) d).getData(); - stream.putUnsignedVarInt(s.getBytes(StandardCharsets.UTF_8).length); - stream.put(s.getBytes(StandardCharsets.UTF_8)); - break; - case Entity.DATA_TYPE_NBT: - NBTEntityData slot = (NBTEntityData) d; - if (protocol < ProtocolInfo.v1_12_0) { - stream.putSlot(protocol, slot.item); - } else { - try { - stream.put(NBTIO.write(slot.getData(), ByteOrder.LITTLE_ENDIAN, true)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - break; - case Entity.DATA_TYPE_POS: - IntPositionEntityData pos = (IntPositionEntityData) d; - stream.putVarInt(pos.x); - stream.putVarInt(pos.y); - stream.putVarInt(pos.z); - break; - case Entity.DATA_TYPE_LONG: - stream.putVarLong(((LongEntityData) d).getData()); - break; - case Entity.DATA_TYPE_VECTOR3F: - Vector3fEntityData v3data = (Vector3fEntityData) d; - stream.putLFloat(v3data.x); - stream.putLFloat(v3data.y); - stream.putLFloat(v3data.z); - break; - } - } - return stream.getBuffer(); - } - - public static EntityMetadata readMetadata(byte[] payload) { - BinaryStream stream = new BinaryStream(); - stream.setBuffer(payload); - long count = stream.getUnsignedVarInt(); - EntityMetadata m = new EntityMetadata(); - for (int i = 0; i < count; i++) { - int key = (int) stream.getUnsignedVarInt(); - int type = (int) stream.getUnsignedVarInt(); - EntityData value = null; - switch (type) { - case Entity.DATA_TYPE_BYTE: - value = new ByteEntityData(key, stream.getByte()); - break; - case Entity.DATA_TYPE_SHORT: - value = new ShortEntityData(key, stream.getLShort()); - break; - case Entity.DATA_TYPE_INT: - value = new IntEntityData(key, stream.getVarInt()); - break; - case Entity.DATA_TYPE_FLOAT: - value = new FloatEntityData(key, stream.getLFloat()); - break; - case Entity.DATA_TYPE_STRING: - value = new StringEntityData(key, stream.getString()); - break; - case Entity.DATA_TYPE_NBT: - try { - int offset = stream.getOffset(); - FastByteArrayInputStream fbais = new FastByteArrayInputStream(stream.get()); - try { - CompoundTag tag = NBTIO.read(fbais, ByteOrder.LITTLE_ENDIAN, true); - value = new NBTEntityData(key, tag); - } catch (IOException e) { - throw new RuntimeException(e); - } - stream.setOffset(offset + (int) fbais.position()); - } catch (Exception ignored) {} - break; - case Entity.DATA_TYPE_POS: - BlockVector3 v3 = stream.getSignedBlockPosition(); - value = new IntPositionEntityData(key, v3.x, v3.y, v3.z); - break; - case Entity.DATA_TYPE_LONG: - value = new LongEntityData(key, stream.getVarLong()); - break; - case Entity.DATA_TYPE_VECTOR3F: - value = new Vector3fEntityData(key, stream.getVector3f()); - break; - } - if (value != null) m.put(value); - } - return m; - } - - public static boolean readBool(byte b) { - return b == 0; - } - - public static byte writeBool(boolean b) { - return (byte) (b ? 0x01 : 0x00); - } - - public static int readSignedByte(byte b) { - return b & 0xFF; - } - - public static byte writeByte(byte b) { - return b; - } - - public static int readShort(byte[] bytes) { - return ((bytes[0] & 0xFF) << 8) + (bytes[1] & 0xFF); - } - - public static short readSignedShort(byte[] bytes) { - return (short) readShort(bytes); - } - - public static byte[] writeShort(int s) { - return new byte[]{ - (byte) ((s >>> 8) & 0xFF), - (byte) (s & 0xFF) - }; - } - - public static int readLShort(byte[] bytes) { - return ((bytes[1] & 0xFF) << 8) + (bytes[0] & 0xFF); - } - - public static short readSignedLShort(byte[] bytes) { - return (short) readLShort(bytes); - } - - public static byte[] writeLShort(int s) { - s &= 0xffff; - return new byte[]{ - (byte) (s & 0xFF), - (byte) ((s >>> 8) & 0xFF) - }; - } - - public static int readInt(byte[] bytes) { - return ((bytes[0] & 0xff) << 24) + - ((bytes[1] & 0xff) << 16) + - ((bytes[2] & 0xff) << 8) + - (bytes[3] & 0xff); - } - - public static byte[] writeInt(int i) { - return new byte[]{ - (byte) ((i >>> 24) & 0xFF), - (byte) ((i >>> 16) & 0xFF), - (byte) ((i >>> 8) & 0xFF), - (byte) (i & 0xFF) - }; - } - - public static int readLInt(byte[] bytes) { - return ((bytes[3] & 0xff) << 24) + - ((bytes[2] & 0xff) << 16) + - ((bytes[1] & 0xff) << 8) + - (bytes[0] & 0xff); - } - - public static byte[] writeLInt(int i) { - return new byte[]{ - (byte) (i & 0xFF), - (byte) ((i >>> 8) & 0xFF), - (byte) ((i >>> 16) & 0xFF), - (byte) ((i >>> 24) & 0xFF) - }; - } - - public static float readFloat(byte[] bytes) { - return readFloat(bytes, -1); - } - - public static float readFloat(byte[] bytes, int accuracy) { - float val = Float.intBitsToFloat(readInt(bytes)); - if (accuracy > -1) { - return (float) NukkitMath.round(val, accuracy); - } else { - return val; - } - } - - public static byte[] writeFloat(float f) { - return writeInt(Float.floatToIntBits(f)); - } - - public static float readLFloat(byte[] bytes) { - return readLFloat(bytes, -1); - } - - public static float readLFloat(byte[] bytes, int accuracy) { - float val = Float.intBitsToFloat(readLInt(bytes)); - if (accuracy > -1) { - return (float) NukkitMath.round(val, accuracy); - } else { - return val; - } - } - - public static byte[] writeLFloat(float f) { - return writeLInt(Float.floatToIntBits(f)); - } - - public static double readDouble(byte[] bytes) { - return Double.longBitsToDouble(readLong(bytes)); - } - - public static byte[] writeDouble(double d) { - return writeLong(Double.doubleToLongBits(d)); - } - - public static double readLDouble(byte[] bytes) { - return Double.longBitsToDouble(readLLong(bytes)); - } - - public static byte[] writeLDouble(double d) { - return writeLLong(Double.doubleToLongBits(d)); - } - - public static long readLong(byte[] bytes) { - return (((long) bytes[0] << 56) + - ((long) (bytes[1] & 0xFF) << 48) + - ((long) (bytes[2] & 0xFF) << 40) + - ((long) (bytes[3] & 0xFF) << 32) + - ((long) (bytes[4] & 0xFF) << 24) + - ((bytes[5] & 0xFF) << 16) + - ((bytes[6] & 0xFF) << 8) + - ((bytes[7] & 0xFF))); - } - - public static byte[] writeLong(long l) { - return new byte[]{ - (byte) (l >>> 56), - (byte) (l >>> 48), - (byte) (l >>> 40), - (byte) (l >>> 32), - (byte) (l >>> 24), - (byte) (l >>> 16), - (byte) (l >>> 8), - (byte) (l) - }; - } - - public static long readLLong(byte[] bytes) { - return (((long) bytes[7] << 56) + - ((long) (bytes[6] & 0xFF) << 48) + - ((long) (bytes[5] & 0xFF) << 40) + - ((long) (bytes[4] & 0xFF) << 32) + - ((long) (bytes[3] & 0xFF) << 24) + - ((bytes[2] & 0xFF) << 16) + - ((bytes[1] & 0xFF) << 8) + - ((bytes[0] & 0xFF))); - } - - public static byte[] writeLLong(long l) { - return new byte[]{ - (byte) (l), - (byte) (l >>> 8), - (byte) (l >>> 16), - (byte) (l >>> 24), - (byte) (l >>> 32), - (byte) (l >>> 40), - (byte) (l >>> 48), - (byte) (l >>> 56), - }; - } - - public static byte[] writeVarInt(int v) { - BinaryStream stream = new BinaryStream(); - stream.putVarInt(v); - return stream.getBuffer(); - } - - public static byte[] writeUnsignedVarInt(long v) { - BinaryStream stream = new BinaryStream(); - stream.putUnsignedVarInt(v); - return stream.getBuffer(); - } - - public static byte[] reserveBytes(byte[] bytes) { - byte[] newBytes = new byte[bytes.length]; - for (int i = 0; i < bytes.length; i++) { - newBytes[bytes.length - 1 - i] = bytes[i]; - } - return newBytes; - } - - public static String bytesToHexString(byte[] src) { - return bytesToHexString(src, false); - } - - public static String bytesToHexString(byte[] src, boolean blank) { - StringBuilder stringBuilder = new StringBuilder(); - if (src == null || src.length <= 0) { - return null; - } - - for (byte b : src) { - if (!(stringBuilder.length() == 0) && blank) { - stringBuilder.append(' '); - } - int v = b & 0xFF; - String hv = Integer.toHexString(v); - if (hv.length() < 2) { - stringBuilder.append(0); - } - stringBuilder.append(hv); - } - return stringBuilder.toString().toUpperCase(); - } - - public static byte[] hexStringToBytes(String hexString) { - if (hexString == null || hexString.isEmpty()) { - return null; - } - String str = "0123456789ABCDEF"; - hexString = hexString.toUpperCase().replace(" ", ""); - int length = hexString.length() >> 1; - char[] hexChars = hexString.toCharArray(); - byte[] d = new byte[length]; - for (int i = 0; i < length; i++) { - int pos = i << 1; - d[i] = (byte) (((byte) str.indexOf(hexChars[pos]) << 4) | ((byte) str.indexOf(hexChars[pos + 1]))); - } - return d; - } - - public static byte[] subBytes(byte[] bytes, int start, int length) { - int len = Math.min(bytes.length, start + length); - return Arrays.copyOfRange(bytes, start, len); - } - - public static byte[] subBytes(byte[] bytes, int start) { - return subBytes(bytes, start, bytes.length - start); - } - - public static byte[][] splitBytes(byte[] bytes, int chunkSize) { - byte[][] splits = new byte[(bytes.length + chunkSize - 1) / chunkSize][chunkSize]; - int chunks = 0; - - for (int i = 0; i < bytes.length; i += chunkSize) { - if ((bytes.length - i) > chunkSize) { - splits[chunks] = Arrays.copyOfRange(bytes, i, i + chunkSize); - } else { - splits[chunks] = Arrays.copyOfRange(bytes, i, bytes.length); - } - chunks++; - } - - return splits; - } - - public static byte[] appendBytes(byte[][] bytes) { - int length = 0; - for (byte[] b : bytes) { - length += b.length; - } - byte[] appendedBytes = new byte[length]; - int index = 0; - for (byte[] b : bytes) { - System.arraycopy(b, 0, appendedBytes, index, b.length); - index += b.length; - } - return appendedBytes; - } - - public static byte[] appendBytes(byte byte1, byte[]... bytes2) { - int length = 1; - for (byte[] bytes : bytes2) { - length += bytes.length; - } - ByteBuffer buffer = ByteBuffer.allocate(length); - buffer.put(byte1); - for (byte[] bytes : bytes2) { - buffer.put(bytes); - } - return buffer.array(); - } - - public static byte[] appendBytes(byte[] bytes1, byte[]... bytes2) { - int length = bytes1.length; - for (byte[] bytes : bytes2) { - length += bytes.length; - } - byte[] appendedBytes = new byte[length]; - System.arraycopy(bytes1, 0, appendedBytes, 0, bytes1.length); - int index = bytes1.length; - - for (byte[] b : bytes2) { - System.arraycopy(b, 0, appendedBytes, index, b.length); - index += b.length; - } - return appendedBytes; - } -} diff --git a/src/main/java/cn/nukkit/utils/BinaryStream.java b/src/main/java/cn/nukkit/utils/BinaryStream.java deleted file mode 100644 index e92c2a33b..000000000 --- a/src/main/java/cn/nukkit/utils/BinaryStream.java +++ /dev/null @@ -1,1255 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.entity.Attribute; -import cn.nukkit.entity.data.Skin; -import cn.nukkit.item.*; -import cn.nukkit.item.RuntimeItemMapping.LegacyEntry; -import cn.nukkit.item.RuntimeItemMapping.RuntimeEntry; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.GameRules; -import cn.nukkit.level.GlobalBlockPalette; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.BlockVector3; -import cn.nukkit.math.Vector3f; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.nbt.tag.ListTag; -import cn.nukkit.nbt.tag.StringTag; -import cn.nukkit.network.LittleEndianByteBufInputStream; -import cn.nukkit.network.LittleEndianByteBufOutputStream; -import cn.nukkit.network.protocol.ProtocolInfo; -import cn.nukkit.network.protocol.types.EntityLink; -import io.netty.buffer.AbstractByteBufAllocator; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import it.unimi.dsi.fastutil.io.FastByteArrayInputStream; - -import java.io.IOException; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.*; - -/** - * BinaryStream - * - * @author MagicDroidX - * Nukkit Project - */ -public class BinaryStream { - - public int offset; - private byte[] buffer; - private int count; - - private static final int MAX_ARRAY_SIZE = 2147483639; - - public BinaryStream() { - this.buffer = new byte[32]; - this.offset = 0; - this.count = 0; - } - - public BinaryStream(byte[] buffer) { - this(buffer, 0); - } - - public BinaryStream(byte[] buffer, int offset) { - this.buffer = buffer; - this.offset = offset; - this.count = buffer.length; - } - - public BinaryStream reset() { - this.offset = 0; - this.count = 0; - return this; - } - - public void setBuffer(byte[] buffer) { - this.buffer = buffer; - this.count = buffer == null ? -1 : buffer.length; - } - - public void setBuffer(byte[] buffer, int offset) { - this.setBuffer(buffer); - this.setOffset(offset); - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - - public byte[] getBuffer() { - return Arrays.copyOf(buffer, count); - } - - public int getCount() { - return count; - } - - public byte[] get() { - return this.get(this.count - this.offset); - } - - public byte[] get(int len) { - if (len < 0) { - this.offset = this.count - 1; - return new byte[0]; - } - len = Math.min(len, this.count - this.offset); - this.offset += len; - return Arrays.copyOfRange(this.buffer, this.offset - len, this.offset); - } - - public void put(byte[] bytes) { - if (bytes == null) { - return; - } - - this.ensureCapacity(this.count + bytes.length); - - System.arraycopy(bytes, 0, this.buffer, this.count, bytes.length); - this.count += bytes.length; - } - - public long getLong() { - return Binary.readLong(this.get(8)); - } - - public void putLong(long l) { - this.put(Binary.writeLong(l)); - } - - public int getInt() { - return Binary.readInt(this.get(4)); - } - - public void putInt(int i) { - this.put(Binary.writeInt(i)); - } - - public long getLLong() { - return Binary.readLLong(this.get(8)); - } - - public void putLLong(long l) { - this.put(Binary.writeLLong(l)); - } - - public int getLInt() { - return Binary.readLInt(this.get(4)); - } - - public void putLInt(int i) { - this.put(Binary.writeLInt(i)); - } - - public int getShort() { - return Binary.readShort(this.get(2)); - } - - public void putShort(int s) { - this.put(Binary.writeShort(s)); - } - - public int getLShort() { - return Binary.readLShort(this.get(2)); - } - - public void putLShort(int s) { - this.put(Binary.writeLShort(s)); - } - - public float getFloat() { - return getFloat(-1); - } - - public float getFloat(int accuracy) { - return Binary.readFloat(this.get(4), accuracy); - } - - public void putFloat(float v) { - this.put(Binary.writeFloat(v)); - } - - public float getLFloat() { - return getLFloat(-1); - } - - public float getLFloat(int accuracy) { - return Binary.readLFloat(this.get(4), accuracy); - } - - public void putLFloat(float v) { - this.put(Binary.writeLFloat(v)); - } - - public int getTriad() { - return Binary.readTriad(this.get(3)); - } - - public void putTriad(int triad) { - this.put(Binary.writeTriad(triad)); - } - - public int getLTriad() { - return Binary.readLTriad(this.get(3)); - } - - public void putLTriad(int triad) { - this.put(Binary.writeLTriad(triad)); - } - - public boolean getBoolean() { - return this.getByte() == 0x01; - } - - public void putBoolean(boolean bool) { - this.putByte((byte) (bool ? 1 : 0)); - } - - public int getByte() { - return this.buffer[this.offset++] & 0xff; - } - - public void putByte(byte b) { - this.put(new byte[]{b}); - } - - /** - * Reads a list of Attributes from the stream. - * - * @return Attribute[] - */ - public Attribute[] getAttributeList() throws Exception { - List list = new ArrayList<>(); - long count = this.getUnsignedVarInt(); - - for (int i = 0; i < count; ++i) { - String name = this.getString(); - Attribute attr = Attribute.getAttributeByName(name); - if (attr != null) { - attr.setMinValue(this.getLFloat()); - attr.setValue(this.getLFloat()); - attr.setMaxValue(this.getLFloat()); - list.add(attr); - } else { - throw new Exception("Unknown attribute type \"" + name + '"'); - } - } - - return list.toArray(new Attribute[0]); - } - - /** - * Writes a list of Attributes to the packet buffer using the standard format. - */ - public void putAttributeList(Attribute[] attributes) { - this.putUnsignedVarInt(attributes.length); - for (Attribute attribute : attributes) { - this.putString(attribute.getName()); - this.putLFloat(attribute.getMinValue()); - this.putLFloat(attribute.getValue()); - this.putLFloat(attribute.getMaxValue()); - } - } - - public void putUUID(UUID uuid) { - this.put(Binary.writeUUID(uuid)); - } - - public UUID getUUID() { - return Binary.readUUID(this.get(16)); - } - - public void putSkin(Skin skin) { - Server.mvw("BinaryStream#putSkin(Skin)"); - this.putSkin(ProtocolInfo.CURRENT_PROTOCOL, skin); - } - - private static byte[] steveSkinDecoded; - - public void putSkin(int protocol, Skin skin) { - this.putString(skin.getSkinId()); - - if (protocol < ProtocolInfo.v1_13_0) { - if (skin.isPersona()) { // Hack: Replace persona skins with steve skins for < 1.13 players to avoid invisible skins - this.putByteArray(steveSkinDecoded != null ? steveSkinDecoded : (steveSkinDecoded = Base64.getDecoder().decode(Skin.STEVE_SKIN))); - if (protocol >= ProtocolInfo.v1_2_13) { - this.putByteArray(skin.getCapeData().data); - } - this.putString("geometry.humanoid.custom"); - this.putString(Skin.STEVE_GEOMETRY); - } else { - this.putByteArray(skin.getSkinData().data); - if (protocol >= ProtocolInfo.v1_2_13) { - this.putByteArray(skin.getCapeData().data); - } - this.putString(skin.isLegacySlim ? "geometry.humanoid.customSlim" : "geometry.humanoid.custom"); - this.putString(skin.getGeometryData()); - } - } else { - if (protocol >= ProtocolInfo.v1_16_210) { - this.putString(skin.getPlayFabId()); - } - this.putString(skin.getSkinResourcePatch()); - this.putImage(skin.getSkinData()); - - List animations = skin.getAnimations(); - this.putLInt(animations.size()); - for (SkinAnimation animation : animations) { - this.putImage(animation.image); - this.putLInt(animation.type); - this.putLFloat(animation.frames); - if (protocol >= ProtocolInfo.v1_16_100) { - this.putLInt(animation.expression); - } - } - - this.putImage(skin.getCapeData()); - this.putString(skin.getGeometryData()); - if (protocol >= ProtocolInfo.v1_17_30) { - this.putString(skin.getGeometryDataEngineVersion()); - } - this.putString(skin.getAnimationData()); - if (protocol < ProtocolInfo.v1_17_30) { - this.putBoolean(skin.isPremium()); - this.putBoolean(skin.isPersona()); - this.putBoolean(skin.isCapeOnClassic()); - } - this.putString(skin.getCapeId()); - this.putString(skin.getFullSkinId()); - if (protocol >= ProtocolInfo.v1_14_60) { - this.putString(skin.getArmSize()); - this.putString(skin.getSkinColor()); - - List pieces = skin.getPersonaPieces(); - this.putLInt(pieces.size()); - for (PersonaPiece piece : pieces) { - this.putString(piece.id); - this.putString(piece.type); - this.putString(piece.packId); - this.putBoolean(piece.isDefault); - this.putString(piece.productId); - } - - List tints = skin.getTintColors(); - this.putLInt(tints.size()); - for (PersonaPieceTint tint : tints) { - this.putString(tint.pieceType); - List colors = tint.colors; - this.putLInt(colors.size()); - for (String color : colors) { - this.putString(color); - } - } - - if (protocol >= ProtocolInfo.v1_17_30) { - this.putBoolean(skin.isPremium()); - this.putBoolean(skin.isPersona()); - this.putBoolean(skin.isCapeOnClassic()); - this.putBoolean(skin.isPrimaryUser()); - } - } - } - } - - public void putImage(SerializedImage image) { - this.putLInt(image.width); - this.putLInt(image.height); - this.putByteArray(image.data); - } - - public SerializedImage getImage() { - int width = this.getLInt(); - int height = this.getLInt(); - byte[] data = this.getByteArray(); - return new SerializedImage(width, height, data); - } - - public Skin getSkin() { - Server.mvw("BinaryStream#getSkin()"); - return getSkin(ProtocolInfo.CURRENT_PROTOCOL); - } - - public Skin getSkin(int protocol) { // Can be used only with protocol >= 388 - Skin skin = new Skin(); - skin.setSkinId(this.getString()); - if (protocol >= ProtocolInfo.v1_16_210) { - skin.setPlayFabId(this.getString()); - } - skin.setSkinResourcePatch(this.getString()); - skin.setSkinData(this.getImage()); - - int animationCount = this.getLInt(); - for (int i = 0; i < Math.min(animationCount, 1024); i++) { - SerializedImage image = this.getImage(); - int type = this.getLInt(); - float frames = this.getLFloat(); - int expression = protocol >= ProtocolInfo.v1_16_100 ? this.getLInt() : 0; - skin.getAnimations().add(new SkinAnimation(image, type, frames, expression)); - } - - skin.setCapeData(this.getImage()); - skin.setGeometryData(this.getString()); - if (protocol >= ProtocolInfo.v1_17_30) { - skin.setGeometryDataEngineVersion(this.getString()); - } - skin.setAnimationData(this.getString()); - if (protocol < ProtocolInfo.v1_17_30) { - skin.setPremium(this.getBoolean()); - skin.setPersona(this.getBoolean()); - skin.setCapeOnClassic(this.getBoolean()); - } - skin.setCapeId(this.getString()); - this.getString(); // TODO: Full skin id - if (protocol >= ProtocolInfo.v1_14_60) { - skin.setArmSize(this.getString()); - skin.setSkinColor(this.getString()); - - int piecesLength = this.getLInt(); - for (int i = 0; i < Math.min(piecesLength, 1024); i++) { - String pieceId = this.getString(); - String pieceType = this.getString(); - String packId = this.getString(); - boolean isDefault = this.getBoolean(); - String productId = this.getString(); - skin.getPersonaPieces().add(new PersonaPiece(pieceId, pieceType, packId, isDefault, productId)); - } - - int tintsLength = this.getLInt(); - for (int i = 0; i < Math.min(tintsLength, 1024); i++) { - String pieceType = this.getString(); - List colors = new ArrayList<>(); - int colorsLength = this.getLInt(); - for (int i2 = 0; i2 < Math.min(colorsLength, 1024); i2++) { - colors.add(this.getString()); - } - skin.getTintColors().add(new PersonaPieceTint(pieceType, colors)); - } - - if (protocol >= ProtocolInfo.v1_17_30) { - skin.setPremium(this.getBoolean()); - skin.setPersona(this.getBoolean()); - skin.setCapeOnClassic(this.getBoolean()); - skin.setPrimaryUser(this.getBoolean()); - } - } - return skin; - } - - private static final String NukkitPetteriM1EditionTag = "NukkitPetteriM1Edition"; - - public Item getSlot() { - Server.mvw("BinaryStream#getSlot()"); - return this.getSlot(ProtocolInfo.CURRENT_PROTOCOL); - } - - public Item getSlot(int protocolId) { - if (protocolId >= ProtocolInfo.v1_16_220) { - return this.getSlotNew(protocolId); - } - - int runtimeId = this.getVarInt(); - if (runtimeId == 0) { - return Item.get(0, 0, 0); - } - - int auxValue = this.getVarInt(); - int damage = auxValue >> 8; - if (damage == Short.MAX_VALUE) { - damage = -1; - } - - int id; - if (protocolId < ProtocolInfo.v1_16_100) { - id = runtimeId; - } else { - RuntimeItemMapping mapping = RuntimeItems.getMapping(protocolId); - LegacyEntry legacyEntry = mapping.fromRuntime(runtimeId); - id = legacyEntry.getLegacyId(); - if (legacyEntry.isHasDamage()) { - damage = legacyEntry.getDamage(); - } - } - - int cnt = auxValue & 0xff; - - int nbtLen = this.getLShort(); - byte[] nbt = new byte[0]; - if (nbtLen < Short.MAX_VALUE) { - nbt = this.get(nbtLen); - } else if (nbtLen == 65535) { - int nbtTagCount = (int) getUnsignedVarInt(); - int offset = this.offset; - FastByteArrayInputStream stream = new FastByteArrayInputStream(get()); - for (int i = 0; i < nbtTagCount; i++) { - try { - // TODO: 05/02/2019 This hack is necessary because we keep the raw NBT tag. Try to remove it. - CompoundTag tag = NBTIO.read(stream, ByteOrder.LITTLE_ENDIAN, true); - // Hack for tool damage - if (tag.contains("Damage")) { - damage = tag.getInt("Damage"); - tag.remove("Damage"); - } - if (tag.contains("__DamageConflict__")) { - tag.put("Damage", tag.removeAndGet("__DamageConflict__")); - } - if (tag.getAllTags().size() > 0) { - nbt = NBTIO.write(tag, ByteOrder.LITTLE_ENDIAN, false); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - setOffset(offset + (int) stream.position()); - } - - String[] canPlaceOn = new String[this.getVarInt()]; - for (int i = 0; i < canPlaceOn.length; ++i) { - canPlaceOn[i] = this.getString(); - } - - String[] canDestroy = new String[this.getVarInt()]; - for (int i = 0; i < canDestroy.length; ++i) { - canDestroy[i] = this.getString(); - } - - try { - if (protocolId < ProtocolInfo.v1_16_0 && nbt.length > 0) { - CompoundTag tag = Item.parseCompoundTag(nbt.clone()); - if (tag.contains(NukkitPetteriM1EditionTag)) { - int originalID = tag.getCompound(NukkitPetteriM1EditionTag).getInt("OriginalID"); - if ((id == Item.INFO_UPDATE && originalID >= Item.SUSPICIOUS_STEW) || - (id == Item.DIAMOND_SWORD && originalID == Item.NETHERITE_SWORD) || - (id == Item.DIAMOND_SHOVEL && originalID == Item.NETHERITE_SHOVEL) || - (id == Item.DIAMOND_PICKAXE && originalID == Item.NETHERITE_PICKAXE) || - (id == Item.DIAMOND_AXE && originalID == Item.NETHERITE_AXE) || - (id == Item.DIAMOND_HOE && originalID == Item.NETHERITE_HOE) || - (id == Item.DIAMOND_HELMET && originalID == Item.NETHERITE_HELMET) || - (id == Item.DIAMOND_CHESTPLATE && originalID == Item.NETHERITE_CHESTPLATE) || - (id == Item.DIAMOND_LEGGINGS && originalID == Item.NETHERITE_LEGGINGS) || - (id == Item.DIAMOND_BOOTS && originalID == Item.NETHERITE_BOOTS) || - (id == Item.CARROT_ON_A_STICK && originalID == Item.WARPED_FUNGUS_ON_A_STICK) || - (id == Item.RECORD_13 && originalID == Item.RECORD_PIGSTEP)) { - id = originalID; - } - - tag.remove(NukkitPetteriM1EditionTag); - if (tag.isEmpty()) { - nbt = new byte[0]; - } else { - nbt = NBTIO.write(tag, ByteOrder.LITTLE_ENDIAN); - } - } - } - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - - Item item = Item.get(id, damage, cnt, nbt); - - if (canDestroy.length > 0 || canPlaceOn.length > 0) { - CompoundTag namedTag = item.getNamedTag(); - if (namedTag == null) { - namedTag = new CompoundTag(); - } - - if (canDestroy.length > 0) { - ListTag listTag = new ListTag<>("CanDestroy"); - for (String blockName : canDestroy) { - listTag.add(new StringTag("", blockName)); - } - namedTag.put("CanDestroy", listTag); - } - - if (canPlaceOn.length > 0) { - ListTag listTag = new ListTag<>("CanPlaceOn"); - for (String blockName : canPlaceOn) { - listTag.add(new StringTag("", blockName)); - } - namedTag.put("CanPlaceOn", listTag); - } - - item.setNamedTag(namedTag); - } - - if (item.getId() == ItemID.SHIELD && protocolId >= ProtocolInfo.v1_11_0) { - this.getVarLong(); - } - - return item; - } - - private Item getSlotNew(int protocolId) { - int runtimeId = this.getVarInt(); - if (runtimeId == 0) { - return Item.get(0, 0, 0); - } - - int count = this.getLShort(); - int damage = (int) this.getUnsignedVarInt(); - - RuntimeItemMapping mapping = RuntimeItems.getMapping(protocolId); - LegacyEntry legacyEntry = mapping.fromRuntime(runtimeId); - - int id = legacyEntry.getLegacyId(); - if (legacyEntry.isHasDamage()) { - damage = legacyEntry.getDamage(); - } - - - if (this.getBoolean()) { // hasNetId - this.getVarInt(); // netId - } - - this.getVarInt(); // blockRuntimeId - - byte[] bytes = this.getByteArray(); - ByteBuf buf = AbstractByteBufAllocator.DEFAULT.ioBuffer(bytes.length); - buf.writeBytes(bytes); - - byte[] nbt = new byte[0]; - String[] canPlace; - String[] canBreak; - - try (LittleEndianByteBufInputStream stream = new LittleEndianByteBufInputStream(buf)) { - int nbtSize = stream.readShort(); - - CompoundTag compoundTag = null; - if (nbtSize > 0) { - compoundTag = NBTIO.read(stream, ByteOrder.LITTLE_ENDIAN); - } else if (nbtSize == -1) { - int tagCount = stream.readUnsignedByte(); - if (tagCount != 1) throw new IllegalArgumentException("Expected 1 tag but got " + tagCount); - compoundTag = NBTIO.read(stream, ByteOrder.LITTLE_ENDIAN); - } - - if (compoundTag != null && compoundTag.getAllTags().size() > 0) { - if (compoundTag.contains("Damage")) { - damage = compoundTag.getInt("Damage"); - compoundTag.remove("Damage"); - } - if (compoundTag.contains("__DamageConflict__")) { - compoundTag.put("Damage", compoundTag.removeAndGet("__DamageConflict__")); - } - if (!compoundTag.isEmpty()) { - nbt = NBTIO.write(compoundTag, ByteOrder.LITTLE_ENDIAN); - } - } - - canPlace = new String[stream.readInt()]; - for (int i = 0; i < canPlace.length; i++) { - canPlace[i] = stream.readUTF(); - } - - canBreak = new String[stream.readInt()]; - for (int i = 0; i < canBreak.length; i++) { - canBreak[i] = stream.readUTF(); - } - - if (id == ItemID.SHIELD) { - stream.readLong(); - } - } catch (IOException e) { - throw new IllegalStateException("Unable to read item user data", e); - } finally { - buf.release(); - } - - Item item = Item.get(id, damage, count, nbt); - - if (canBreak.length > 0 || canPlace.length > 0) { - CompoundTag namedTag = item.getNamedTag(); - if (namedTag == null) { - namedTag = new CompoundTag(); - } - - if (canBreak.length > 0) { - ListTag listTag = new ListTag<>("CanDestroy"); - for (String blockName : canBreak) { - listTag.add(new StringTag("", blockName)); - } - namedTag.put("CanDestroy", listTag); - } - - if (canPlace.length > 0) { - ListTag listTag = new ListTag<>("CanPlaceOn"); - for (String blockName : canPlace) { - listTag.add(new StringTag("", blockName)); - } - namedTag.put("CanPlaceOn", listTag); - } - - item.setNamedTag(namedTag); - } - - return item; - } - - public void putSlot(Item item) { - Server.mvw("BinaryStream#putSlot(Item)"); - this.putSlot(ProtocolInfo.CURRENT_PROTOCOL, item); - } - - public void putSlot(int protocolId, Item item) { - this.putSlot(protocolId, item, false); - } - - public void putSlot(int protocolId, Item item, boolean crafting) { - if (protocolId >= ProtocolInfo.v1_16_220) { - this.putSlotNew(protocolId, item, crafting); - return; - } - - if (item == null || item.getId() == 0) { - this.putVarInt(0); - return; - } - - int runtimeId = item.getId(); - - // Multiversion: Replace unsupported items - boolean saveOriginalID = false; - if (!crafting) { - if (runtimeId == Item.SPYGLASS) { // Protocol always < v1_16_220 - saveOriginalID = true; - runtimeId = Item.INFO_UPDATE; - } else if (protocolId < ProtocolInfo.v1_16_0) { - if (runtimeId >= Item.LODESTONECOMPASS) { - saveOriginalID = true; - switch (runtimeId) { - case Item.NETHERITE_SWORD: - runtimeId = Item.DIAMOND_SWORD; - break; - case Item.NETHERITE_SHOVEL: - runtimeId = Item.DIAMOND_SHOVEL; - break; - case Item.NETHERITE_PICKAXE: - runtimeId = Item.DIAMOND_PICKAXE; - break; - case Item.NETHERITE_AXE: - runtimeId = Item.DIAMOND_AXE; - break; - case Item.NETHERITE_HOE: - runtimeId = Item.DIAMOND_HOE; - break; - case Item.NETHERITE_HELMET: - runtimeId = Item.DIAMOND_HELMET; - break; - case Item.NETHERITE_CHESTPLATE: - runtimeId = Item.DIAMOND_CHESTPLATE; - break; - case Item.NETHERITE_LEGGINGS: - runtimeId = Item.DIAMOND_LEGGINGS; - break; - case Item.NETHERITE_BOOTS: - runtimeId = Item.DIAMOND_BOOTS; - break; - default: - runtimeId = Item.INFO_UPDATE; - break; - } - } else { - if (protocolId < ProtocolInfo.v1_14_0) { - if (runtimeId == Item.HONEYCOMB || runtimeId == Item.HONEY_BOTTLE) { - saveOriginalID = true; - runtimeId = Item.INFO_UPDATE; - } else if (protocolId < ProtocolInfo.v1_13_0) { - if (runtimeId == Item.SUSPICIOUS_STEW) { - saveOriginalID = true; - runtimeId = Item.INFO_UPDATE; - } - } - } - } - } - } - - int damage = item.hasMeta() ? item.getDamage() : -1; - if (protocolId >= ProtocolInfo.v1_16_100) { - RuntimeItemMapping mapping = RuntimeItems.getMapping(protocolId); - RuntimeEntry runtimeEntry; - if (runtimeId == Item.INFO_UPDATE) { // Fix unknown item mapping errors with 1.16.100+ item replacements - runtimeEntry = mapping.toRuntime(Item.INFO_UPDATE, item.getDamage()); - } else { - runtimeEntry = mapping.toRuntime(item.getId(), item.getDamage()); - } - runtimeId = runtimeEntry.getRuntimeId(); - damage = runtimeEntry.isHasDamage() ? 0 : item.getDamage(); - } - - this.putVarInt(runtimeId); - - int auxValue; - boolean isDurable = item instanceof ItemDurable; - - if (protocolId >= ProtocolInfo.v1_12_0) { - auxValue = item.getCount(); - if (!isDurable) { - int meta; - if (protocolId < ProtocolInfo.v1_16_100) { - meta = item.hasMeta() ? item.getDamage() : -1; - } else { - meta = damage; - } - auxValue |= ((meta & 0x7fff) << 8); - } - } else { - auxValue = (((item.hasMeta() ? item.getDamage() : -1) & 0x7fff) << 8) | item.getCount(); - } - - this.putVarInt(auxValue); - - // Hack: fix recipe list not displaying some items - if (crafting) { - this.putLShort(0); - this.putVarInt(0); - this.putVarInt(0); - if (item.getId() == ItemID.SHIELD && protocolId >= ProtocolInfo.v1_11_0) { - this.putVarLong(0); - } - return; - } - - if (item.hasCompoundTag() || - (isDurable && protocolId >= ProtocolInfo.v1_12_0) || - saveOriginalID) { - if (protocolId < ProtocolInfo.v1_12_0) { - if (saveOriginalID) { - try { - CompoundTag tag = item.hasCompoundTag() ? item.getNamedTag() : new CompoundTag(); - tag.putCompound(NukkitPetteriM1EditionTag, new CompoundTag().putInt("OriginalID", item.getId())); - byte[] nbt = NBTIO.write(tag, ByteOrder.LITTLE_ENDIAN); - this.putLShort(nbt.length); - this.put(nbt); - } catch (Exception e) { - throw new RuntimeException(e); - } - } else { - byte[] nbt = item.getCompoundTag(); - this.putLShort(nbt.length); - this.put(nbt); - } - } else { - try { - // Hack for tool damage - byte[] nbt = item.getCompoundTag(); - CompoundTag tag; - if (nbt == null || nbt.length == 0) { - tag = new CompoundTag(); - } else { - tag = NBTIO.read(nbt, ByteOrder.LITTLE_ENDIAN, false); - } - if (tag.contains("Damage")) { - tag.put("__DamageConflict__", tag.removeAndGet("Damage")); - } - if (isDurable) { - tag.putInt("Damage", item.getDamage()); - } - - if (saveOriginalID) { - tag.putCompound(NukkitPetteriM1EditionTag, - new CompoundTag().putInt("OriginalID", item.getId())); - } - - this.putLShort(0xffff); - this.putByte((byte) 1); - this.put(NBTIO.write(tag, ByteOrder.LITTLE_ENDIAN, true)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } else { - this.putLShort(0); - } - List canPlaceOn = extractStringList(item, "CanPlaceOn"); - List canDestroy = extractStringList(item, "CanDestroy"); - this.putVarInt(canPlaceOn.size()); - for (String block : canPlaceOn) { - this.putString(block); - } - this.putVarInt(canDestroy.size()); - for (String block : canDestroy) { - this.putString(block); - } - - if (item.getId() == ItemID.SHIELD && protocolId >= ProtocolInfo.v1_11_0) { - this.putVarLong(0); //"blocking tick" (ffs mojang) - } - } - - private void putSlotNew(int protocolId, Item item, boolean instanceItem) { - if (item == null || item.getId() == 0) { - this.putByte((byte) 0); - return; - } - - RuntimeItemMapping mapping = RuntimeItems.getMapping(protocolId); - RuntimeEntry runtimeEntry = mapping.toRuntime(item.getId(), item.getDamage()); - int runtimeId = runtimeEntry.getRuntimeId(); - int damage = runtimeEntry.isHasDamage() ? 0 : item.getDamage(); - - this.putVarInt(runtimeId); - this.putLShort(item.getCount()); - - this.putUnsignedVarInt(damage); - - if (!instanceItem) { - this.putBoolean(true); - this.putVarInt(0); //TODO - } - - Block block = item.getBlockUnsafe(); - int blockRuntimeId = block == null ? 0 : GlobalBlockPalette.getOrCreateRuntimeId(protocolId, block.getId(), block.getDamage()); - this.putVarInt(blockRuntimeId); - - ByteBuf userDataBuf = ByteBufAllocator.DEFAULT.ioBuffer(); - try (LittleEndianByteBufOutputStream stream = new LittleEndianByteBufOutputStream(userDataBuf)) { - if (item.getDamage() != 0) { - byte[] nbt = item.getCompoundTag(); - CompoundTag tag; - if (nbt == null || nbt.length == 0) { - tag = new CompoundTag(); - } else { - tag = NBTIO.read(nbt, ByteOrder.LITTLE_ENDIAN); - } - if (tag.contains("Damage")) { - tag.put("__DamageConflict__", tag.removeAndGet("Damage")); - } - tag.putInt("Damage", item.getDamage()); - stream.writeShort(-1); - stream.writeByte(1); // Hardcoded in current version - stream.write(NBTIO.write(tag, ByteOrder.LITTLE_ENDIAN)); - } else if (item.hasCompoundTag()) { - stream.writeShort(-1); - stream.writeByte(1); // Hardcoded in current version - stream.write(item.getCompoundTag()); - } else { - userDataBuf.writeShortLE(0); - } - - List canPlaceOn = extractStringList(item, "CanPlaceOn"); - stream.writeInt(canPlaceOn.size()); - for (String string : canPlaceOn) { - stream.writeUTF(string); - } - - List canDestroy = extractStringList(item, "CanDestroy"); - stream.writeInt(canDestroy.size()); - for (String string : canDestroy) { - stream.writeUTF(string); - } - - if (item.getId() == ItemID.SHIELD) { - stream.writeLong(0); - } - - byte[] bytes = new byte[userDataBuf.readableBytes()]; - userDataBuf.readBytes(bytes); - putByteArray(bytes); - } catch (IOException e) { - throw new IllegalStateException("Unable to write item user data", e); - } finally { - userDataBuf.release(); - } - } - - public Item getRecipeIngredient(int protocolId) { - int runtimeId = this.getVarInt(); - if (runtimeId == 0) { - return Item.get(0, 0, 0); - } - - int damage = this.getVarInt(); - if (damage == 0x7fff) { - damage = -1; - } - - int id; - if (protocolId < ProtocolInfo.v1_16_100) { - id = runtimeId; - } else { - RuntimeItemMapping mapping = RuntimeItems.getMapping(protocolId); - LegacyEntry legacyEntry = mapping.fromRuntime(runtimeId); - id = legacyEntry.getLegacyId(); - if (legacyEntry.isHasDamage()) { - damage = legacyEntry.getDamage(); - } - } - - int count = this.getVarInt(); - return Item.get(id, damage, count); - } - - public void putRecipeIngredient(int protocolId, Item item) { - if (item == null || item.getId() == 0) { - this.putVarInt(0); - return; - } - - int runtimeId = item.getId(); - int damage = item.hasMeta() ? item.getDamage() : 0x7fff; - - if (protocolId >= ProtocolInfo.v1_16_100) { - RuntimeItemMapping mapping = RuntimeItems.getMapping(protocolId); - if (!item.hasMeta()) { - RuntimeEntry runtimeEntry = mapping.toRuntime(item.getId(), 0); - runtimeId = runtimeEntry.getRuntimeId(); - damage = 0x7fff; - } else { - RuntimeEntry runtimeEntry = mapping.toRuntime(item.getId(), item.getDamage()); - runtimeId = runtimeEntry.getRuntimeId(); - damage = runtimeEntry.isHasDamage() ? 0 : item.getDamage(); - } - } - - this.putVarInt(runtimeId); - this.putVarInt(damage); - this.putVarInt(item.getCount()); - } - - private static List extractStringList(Item item, String tagName) { - CompoundTag namedTag = item.getNamedTag(); - if (namedTag == null) { - return Collections.emptyList(); - } - - ListTag listTag = namedTag.getList(tagName, StringTag.class); - if (listTag == null) { - return Collections.emptyList(); - } - - int size = listTag.size(); - List values = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - StringTag stringTag = listTag.get(i); - if (stringTag != null) { - values.add(stringTag.data); - } - } - - return values; - } - - public byte[] getByteArray() { - return this.get((int) this.getUnsignedVarInt()); - } - - public void putByteArray(byte[] b) { - this.putUnsignedVarInt(b.length); - this.put(b); - } - - public String getString() { - return new String(this.getByteArray(), StandardCharsets.UTF_8); - } - - public void putString(String string) { - byte[] b = string.getBytes(StandardCharsets.UTF_8); - this.putByteArray(b); - } - - public long getUnsignedVarInt() { - return VarInt.readUnsignedVarInt(this); - } - - public void putUnsignedVarInt(long v) { - VarInt.writeUnsignedVarInt(this, v); - } - - public int getVarInt() { - return VarInt.readVarInt(this); - } - - public void putVarInt(int v) { - VarInt.writeVarInt(this, v); - } - - public long getVarLong() { - return VarInt.readVarLong(this); - } - - public void putVarLong(long v) { - VarInt.writeVarLong(this, v); - } - - public long getUnsignedVarLong() { - return VarInt.readUnsignedVarLong(this); - } - - public void putUnsignedVarLong(long v) { - VarInt.writeUnsignedVarLong(this, v); - } - - public BlockVector3 getBlockVector3() { - return new BlockVector3(this.getVarInt(), (int) this.getUnsignedVarInt(), this.getVarInt()); - } - - public BlockVector3 getSignedBlockPosition() { - return new BlockVector3(getVarInt(), getVarInt(), getVarInt()); - } - - public void putSignedBlockPosition(BlockVector3 v) { - putVarInt(v.x); - putVarInt(v.y); - putVarInt(v.z); - } - - public void putBlockVector3(BlockVector3 v) { - this.putBlockVector3(v.x, v.y, v.z); - } - - public void putBlockVector3(int x, int y, int z) { - this.putVarInt(x); - this.putUnsignedVarInt(y); - this.putVarInt(z); - } - - public Vector3f getVector3f() { - return new Vector3f(this.getLFloat(4), this.getLFloat(4), this.getLFloat(4)); - } - - public void putVector3f(Vector3f v) { - this.putVector3f(v.x, v.y, v.z); - } - - public void putVector3f(float x, float y, float z) { - this.putLFloat(x); - this.putLFloat(y); - this.putLFloat(z); - } - - public void putGameRules(GameRules gameRules) { - Server.mvw("BinaryStream#putGameRules(GameRules)"); - this.putGameRules(ProtocolInfo.CURRENT_PROTOCOL, gameRules); - } - - public void putGameRules(int protocol, GameRules gameRules) { - Map allGameRules = gameRules.getGameRules(); - Map rulesToSend = new HashMap<>(); - allGameRules.forEach((gameRule, value) -> { - if (protocol > value.getMinProtocol()) { - rulesToSend.put(gameRule, value); - } - }); - this.putUnsignedVarInt(rulesToSend.size()); - rulesToSend.forEach((gameRule, value) -> { - putString(gameRule.getName().toLowerCase()); - value.write(protocol, this); - }); - } - - public void putGameRulesMap(int protocol, Map allGameRules) { - Map rulesToSend = new HashMap<>(); - allGameRules.forEach((gameRule, value) -> { - if (protocol > value.getMinProtocol()) { - rulesToSend.put(gameRule, value); - } - }); - this.putUnsignedVarInt(rulesToSend.size()); - rulesToSend.forEach((gameRule, value) -> { - putString(gameRule.getName().toLowerCase()); - value.write(protocol, this); - }); - } - - /** - * Reads and returns an EntityUniqueID - * - * @return int - */ - public long getEntityUniqueId() { - return this.getVarLong(); - } - - /** - * Writes an EntityUniqueID - */ - public void putEntityUniqueId(long eid) { - this.putVarLong(eid); - } - - /** - * Reads and returns an EntityRuntimeID - */ - public long getEntityRuntimeId() { - return this.getUnsignedVarLong(); - } - - /** - * Writes an EntityUniqueID - */ - public void putEntityRuntimeId(long eid) { - this.putUnsignedVarLong(eid); - } - - public BlockFace getBlockFace() { - return BlockFace.fromIndex(this.getVarInt()); - } - - public void putBlockFace(BlockFace face) { - this.putVarInt(face.getIndex()); - } - - public void putEntityLink(int protocol, EntityLink link) { - putEntityUniqueId(link.fromEntityUniquieId); - putEntityUniqueId(link.toEntityUniquieId); - putByte(link.type); - putBoolean(link.immediate); - if (protocol >= 407) { - putBoolean(link.riderInitiated); - } - } - - public EntityLink getEntityLink() { - return new EntityLink( - getEntityUniqueId(), - getEntityUniqueId(), - (byte) getByte(), - getBoolean(), - getBoolean() //1.16+ - ); - } - - public boolean feof() { - return this.offset < 0 || this.offset >= this.buffer.length; - } - - private void ensureCapacity(int minCapacity) { - // overflow-conscious code - if (minCapacity - buffer.length > 0) { - grow(minCapacity); - } - } - - private void grow(int minCapacity) { - // overflow-conscious code - int oldCapacity = buffer.length; - int newCapacity = oldCapacity << 1; - - if (newCapacity - minCapacity < 0) { - newCapacity = minCapacity; - } - - if (newCapacity - MAX_ARRAY_SIZE > 0) { - newCapacity = hugeCapacity(minCapacity); - } - this.buffer = Arrays.copyOf(buffer, newCapacity); - } - - private static int hugeCapacity(int minCapacity) { - if (minCapacity < 0) { // overflow - throw new OutOfMemoryError(); - } - return (minCapacity > MAX_ARRAY_SIZE) ? - Integer.MAX_VALUE : - MAX_ARRAY_SIZE; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/utils/BlockColor.java b/src/main/java/cn/nukkit/utils/BlockColor.java deleted file mode 100644 index b4de1ce35..000000000 --- a/src/main/java/cn/nukkit/utils/BlockColor.java +++ /dev/null @@ -1,149 +0,0 @@ -package cn.nukkit.utils; - -/** - * Block color - * - * Created by Snake1999 on 2016/1/10. - * Package cn.nukkit.utils in project Nukkit - */ -public class BlockColor { - - public static final BlockColor TRANSPARENT_BLOCK_COLOR = new BlockColor(0x00, 0x00, 0x00, 0x00); - public static final BlockColor VOID_BLOCK_COLOR = new BlockColor(0x00, 0x00, 0x00, 0x00); - - public static final BlockColor AIR_BLOCK_COLOR = new BlockColor(0x00, 0x00, 0x00); - public static final BlockColor GRASS_BLOCK_COLOR = new BlockColor(0x7f, 0xb2, 0x38); - public static final BlockColor SAND_BLOCK_COLOR = new BlockColor(0xf1, 0xe9, 0xa3); - public static final BlockColor CLOTH_BLOCK_COLOR = new BlockColor(0xa7, 0xa7, 0xa7); - public static final BlockColor TNT_BLOCK_COLOR = new BlockColor(0xff, 0x00, 0x00); - public static final BlockColor ICE_BLOCK_COLOR = new BlockColor(0xa0, 0xa0, 0xff); - public static final BlockColor IRON_BLOCK_COLOR = new BlockColor(0xa7, 0xa7, 0xa7); - public static final BlockColor FOLIAGE_BLOCK_COLOR = new BlockColor(0x00, 0x7c, 0x00); - public static final BlockColor SNOW_BLOCK_COLOR = new BlockColor(0xff, 0xff, 0xff); - public static final BlockColor CLAY_BLOCK_COLOR = new BlockColor(0xa4, 0xa8, 0xb8); - public static final BlockColor DIRT_BLOCK_COLOR = new BlockColor(0xb7, 0x6a, 0x2f); - public static final BlockColor STONE_BLOCK_COLOR = new BlockColor(0x70, 0x70, 0x70); - public static final BlockColor WATER_BLOCK_COLOR = new BlockColor(0x40, 0x40, 0xff); - public static final BlockColor LAVA_BLOCK_COLOR = TNT_BLOCK_COLOR; - public static final BlockColor WOOD_BLOCK_COLOR = new BlockColor(0x68, 0x53, 0x32); - public static final BlockColor QUARTZ_BLOCK_COLOR = new BlockColor(0xff, 0xfc, 0xf5); - public static final BlockColor ADOBE_BLOCK_COLOR = new BlockColor(0xd8, 0x7f, 0x33); - - public static final BlockColor WHITE_BLOCK_COLOR = SNOW_BLOCK_COLOR; - public static final BlockColor ORANGE_BLOCK_COLOR = ADOBE_BLOCK_COLOR; - public static final BlockColor MAGENTA_BLOCK_COLOR = new BlockColor(0xb2, 0x4c, 0xd8); - public static final BlockColor LIGHT_BLUE_BLOCK_COLOR = new BlockColor(0x66, 0x99, 0xd8); - public static final BlockColor YELLOW_BLOCK_COLOR = new BlockColor(0xe5, 0xe5, 0x33); - public static final BlockColor LIME_BLOCK_COLOR = new BlockColor(0x7f, 0xcc, 0x19); - public static final BlockColor PINK_BLOCK_COLOR = new BlockColor(0xf2, 0x7f, 0xa5); - public static final BlockColor GRAY_BLOCK_COLOR = new BlockColor(0x4c, 0x4c, 0x4c); - public static final BlockColor LIGHT_GRAY_BLOCK_COLOR = new BlockColor(0x99, 0x99, 0x99); - public static final BlockColor CYAN_BLOCK_COLOR = new BlockColor(0x4c, 0x7f, 0x99); - public static final BlockColor PURPLE_BLOCK_COLOR = new BlockColor(0x7f, 0x3f, 0xb2); - public static final BlockColor BLUE_BLOCK_COLOR = new BlockColor(0x33, 0x4c, 0xb2); - public static final BlockColor BROWN_BLOCK_COLOR = new BlockColor(0x66, 0x4c, 0x33); - public static final BlockColor GREEN_BLOCK_COLOR = new BlockColor(0x66, 0x7f, 0x33); - public static final BlockColor RED_BLOCK_COLOR = new BlockColor(0x99, 0x33, 0x33); - public static final BlockColor BLACK_BLOCK_COLOR = new BlockColor(0x19, 0x19, 0x19); - - public static final BlockColor GOLD_BLOCK_COLOR = new BlockColor(0xfa, 0xee, 0x4d); - public static final BlockColor DIAMOND_BLOCK_COLOR = new BlockColor(0x5c, 0xdb, 0xd5); - public static final BlockColor LAPIS_BLOCK_COLOR = new BlockColor(0x4a, 0x80, 0xff); - public static final BlockColor EMERALD_BLOCK_COLOR = new BlockColor(0x00, 0xd9, 0x3a); - public static final BlockColor OBSIDIAN_BLOCK_COLOR = new BlockColor(0x15, 0x14, 0x1f); - public static final BlockColor SPRUCE_BLOCK_COLOR = new BlockColor(0x81, 0x56, 0x31); - public static final BlockColor NETHERRACK_BLOCK_COLOR = new BlockColor(0x70, 0x02, 0x00); - public static final BlockColor REDSTONE_BLOCK_COLOR = TNT_BLOCK_COLOR; - - public static final BlockColor WHITE_TERRACOTA_BLOCK_COLOR = new BlockColor(0xd1, 0xb1, 0xa1); - public static final BlockColor ORANGE_TERRACOTA_BLOCK_COLOR = new BlockColor(0x9f, 0x52, 0x24); - public static final BlockColor MAGENTA_TERRACOTA_BLOCK_COLOR = new BlockColor(0x95, 0x57, 0x6c); - public static final BlockColor LIGHT_BLUE_TERRACOTA_BLOCK_COLOR = new BlockColor(0x70, 0x6c, 0x8a); - public static final BlockColor YELLOW_TERRACOTA_BLOCK_COLOR = new BlockColor(0xba, 0x85, 0x24); - public static final BlockColor LIME_TERRACOTA_BLOCK_COLOR = new BlockColor(0x67, 0x75, 0x35); - public static final BlockColor PINK_TERRACOTA_BLOCK_COLOR = new BlockColor(0xa0, 0x4d, 0x4e); - public static final BlockColor GRAY_TERRACOTA_BLOCK_COLOR = new BlockColor(0x39, 0x29, 0x23); - public static final BlockColor LIGHT_GRAY_TERRACOTA_BLOCK_COLOR = new BlockColor(0x87, 0x6b, 0x62); - public static final BlockColor CYAN_TERRACOTA_BLOCK_COLOR = new BlockColor(0x57, 0x5c, 0x5c); - public static final BlockColor PURPLE_TERRACOTA_BLOCK_COLOR = new BlockColor(0x7a, 0x49, 0x58); - public static final BlockColor BLUE_TERRACOTA_BLOCK_COLOR = new BlockColor(0x4c, 0x3e, 0x5c); - public static final BlockColor BROWN_TERRACOTA_BLOCK_COLOR = new BlockColor(0x4c, 0x32, 0x23); - public static final BlockColor GREEN_TERRACOTA_BLOCK_COLOR = new BlockColor(0x4c, 0x52, 0x2a); - public static final BlockColor RED_TERRACOTA_BLOCK_COLOR = new BlockColor(0x8e, 0x3c, 0x2e); - public static final BlockColor BLACK_TERRACOTA_BLOCK_COLOR = new BlockColor(0x25, 0x16, 0x10); - - private final int red; - private final int green; - private final int blue; - private final int alpha; - - public BlockColor(int red, int green, int blue, int alpha) { - this.red = red; - this.green = green; - this.blue = blue; - this.alpha = alpha; - } - - public BlockColor(int red, int green, int blue) { - this(red, green, blue, 0xff); - } - - public BlockColor(int rgb) { - this.red = (rgb >> 16) & 0xff; - this.green = (rgb >> 8) & 0xff; - this.blue = rgb & 0xff; - this.alpha = 0xff; - } - - public BlockColor(String colorStr) { - this.red = Integer.valueOf(colorStr.substring(1, 3), 16); - this.green = Integer.valueOf(colorStr.substring(3, 5), 16); - this.blue = Integer.valueOf(colorStr.substring(5, 7), 16); - this.alpha = 0xff; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof BlockColor)) { - return false; - } - BlockColor other = (BlockColor) obj; - return this.red == other.red && this.green == other.green && - this.blue == other.blue && this.alpha == other.alpha; - } - - @Override - public String toString() { - return "BlockColor[r=" + this.red + ",g=" + this.green + ",b=" + this.blue + ",a=" + this.alpha + ']'; - } - - public int getRed() { - return this.red; - } - - public int getGreen() { - return this.green; - } - - public int getBlue() { - return this.blue; - } - - public int getAlpha() { - return this.alpha; - } - - public int getRGB() { - return (this.red << 16 | this.green << 8 | this.blue) & 0xffffff; - } - - /** - * Get BlockColor by dye item meta value - * - * @param dyeColorMeta dye item meta value - * @return BlockColor - */ - public static BlockColor getDyeColor(int dyeColorMeta) { - return DyeColor.getByDyeData(dyeColorMeta).getColor(); - } -} diff --git a/src/main/java/cn/nukkit/utils/BlockIterator.java b/src/main/java/cn/nukkit/utils/BlockIterator.java deleted file mode 100644 index ba4873358..000000000 --- a/src/main/java/cn/nukkit/utils/BlockIterator.java +++ /dev/null @@ -1,274 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.block.Block; -import cn.nukkit.level.Level; -import cn.nukkit.math.BlockFace; -import cn.nukkit.math.Vector3; - -import java.util.Iterator; - -/** - * Block iterator - * - * @author MagicDroidX - * Nukkit Project - */ -public class BlockIterator implements Iterator { - - private final int maxDistance; - - private static final int gridSize = 16777216; - - private boolean end = false; - - private final Block[] blockQueue; - private int currentBlock; - - private Block currentBlockObject = null; - private int currentDistance; - private int maxDistanceInt; - - private int secondError; - private int thirdError; - - private final int secondStep; - private final int thirdStep; - - private BlockFace mainFace; - private BlockFace secondFace; - private BlockFace thirdFace; - - public BlockIterator(Level level, Vector3 start, Vector3 direction) { - this(level, start, direction, 0); - } - - public BlockIterator(Level level, Vector3 start, Vector3 direction, double yOffset) { - this(level, start, direction, yOffset, 0); - } - - public BlockIterator(Level level, Vector3 start, Vector3 direction, double yOffset, int maxDistance) { - this.maxDistance = maxDistance; - this.blockQueue = new Block[3]; - - Vector3 startClone = new Vector3(start.x, start.y, start.z); - startClone.y += yOffset; - - this.currentDistance = 0; - - double mainDirection = 0; - double secondDirection = 0; - double thirdDirection = 0; - - double mainPosition = 0; - double secondPosition = 0; - double thirdPosition = 0; - - Vector3 pos = new Vector3(startClone.x, startClone.y, startClone.z); - Block startBlock = level.getBlock(new Vector3(Math.floor(pos.x), Math.floor(pos.y), Math.floor(pos.z))); - - if (this.getXLength(direction) > mainDirection) { - this.mainFace = this.getXFace(direction); - mainDirection = this.getXLength(direction); - mainPosition = this.getXPosition(direction, startClone, startBlock); - - this.secondFace = this.getYFace(direction); - secondDirection = this.getYLength(direction); - secondPosition = this.getYPosition(direction, startClone, startBlock); - - this.thirdFace = this.getZFace(direction); - thirdDirection = this.getZLength(direction); - thirdPosition = this.getZPosition(direction, startClone, startBlock); - } - if (this.getYLength(direction) > mainDirection) { - this.mainFace = this.getYFace(direction); - mainDirection = this.getYLength(direction); - mainPosition = this.getYPosition(direction, startClone, startBlock); - - this.secondFace = this.getZFace(direction); - secondDirection = this.getZLength(direction); - secondPosition = this.getZPosition(direction, startClone, startBlock); - - this.thirdFace = this.getXFace(direction); - thirdDirection = this.getXLength(direction); - thirdPosition = this.getXPosition(direction, startClone, startBlock); - } - if (this.getZLength(direction) > mainDirection) { - this.mainFace = this.getZFace(direction); - mainDirection = this.getZLength(direction); - mainPosition = this.getZPosition(direction, startClone, startBlock); - - this.secondFace = this.getXFace(direction); - secondDirection = this.getXLength(direction); - secondPosition = this.getXPosition(direction, startClone, startBlock); - - this.thirdFace = this.getYFace(direction); - thirdDirection = this.getYLength(direction); - thirdPosition = this.getYPosition(direction, startClone, startBlock); - } - - double d = mainPosition / mainDirection; - double secondd = secondPosition - secondDirection * d; - double thirdd = thirdPosition - thirdDirection * d; - - this.secondError = (int) Math.floor(secondd * gridSize); - this.secondStep = (int) Math.round(secondDirection / mainDirection * gridSize); - this.thirdError = (int) Math.floor(thirdd * gridSize); - this.thirdStep = (int) Math.round(thirdDirection / mainDirection * gridSize); - - if (this.secondError + this.secondStep <= 0) { - this.secondError = -this.secondStep + 1; - } - - if (this.thirdError + this.thirdStep <= 0) { - this.thirdError = -this.thirdStep + 1; - } - - Block lastBlock = startBlock.getSide(this.mainFace.getOpposite()); - - if (this.secondError < 0) { - this.secondError += gridSize; - lastBlock = lastBlock.getSide(this.secondFace.getOpposite()); - } - - if (this.thirdError < 0) { - this.thirdError += gridSize; - lastBlock = lastBlock.getSide(this.thirdFace.getOpposite()); - } - - this.secondError -= gridSize; - this.thirdError -= gridSize; - - this.blockQueue[0] = lastBlock; - - this.currentBlock = -1; - - this.scan(); - - boolean startBlockFound = false; - - for (int cnt = this.currentBlock; cnt >= 0; --cnt) { - if (this.blockEquals(this.blockQueue[cnt], startBlock)) { - this.currentBlock = cnt; - startBlockFound = true; - break; - } - } - - if (!startBlockFound) { - throw new IllegalStateException("Start block missed in BlockIterator"); - } - - this.maxDistanceInt = (int) Math.round(maxDistance / (Math.sqrt(mainDirection * mainDirection + secondDirection * secondDirection + thirdDirection * thirdDirection) / mainDirection)); - } - - private boolean blockEquals(Block a, Block b) { - return a.x == b.x && a.y == b.y && a.z == b.z; - } - - private BlockFace getXFace(Vector3 direction) { - return ((direction.x) > 0) ? BlockFace.EAST : BlockFace.WEST; - } - - private BlockFace getYFace(Vector3 direction) { - return ((direction.y) > 0) ? BlockFace.UP : BlockFace.DOWN; - } - - private BlockFace getZFace(Vector3 direction) { - return ((direction.z) > 0) ? BlockFace.SOUTH : BlockFace.NORTH; - } - - private double getXLength(Vector3 direction) { - return Math.abs(direction.x); - } - - private double getYLength(Vector3 direction) { - return Math.abs(direction.y); - } - - private double getZLength(Vector3 direction) { - return Math.abs(direction.z); - } - - private double getPosition(double direction, double position, double blockPosition) { - return direction > 0 ? (position - blockPosition) : (blockPosition + 1 - position); - } - - private double getXPosition(Vector3 direction, Vector3 position, Block block) { - return this.getPosition(direction.x, position.x, block.x); - } - - private double getYPosition(Vector3 direction, Vector3 position, Block block) { - return this.getPosition(direction.y, position.y, block.y); - } - - private double getZPosition(Vector3 direction, Vector3 position, Block block) { - return this.getPosition(direction.z, position.z, block.z); - } - - @Override - public Block next() { - this.scan(); - - if (this.currentBlock <= -1) { - throw new IndexOutOfBoundsException(); - } else { - this.currentBlockObject = this.blockQueue[this.currentBlock--]; - } - return this.currentBlockObject; - } - - @Override - public boolean hasNext() { - this.scan(); - return this.currentBlock != -1; - } - - private void scan() { - if (this.currentBlock >= 0) { - return; - } - - if (this.maxDistance != 0 && this.currentDistance > this.maxDistanceInt) { - this.end = true; - return; - } - - if (this.end) { - return; - } - - ++this.currentDistance; - - this.secondError += this.secondStep; - this.thirdError += this.thirdStep; - - if (this.secondError > 0 && this.thirdError > 0) { - this.blockQueue[2] = this.blockQueue[0].getSide(this.mainFace); - - if ((this.secondStep * this.thirdError) < (this.thirdStep * this.secondError)) { - this.blockQueue[1] = this.blockQueue[2].getSide(this.secondFace); - this.blockQueue[0] = this.blockQueue[1].getSide(this.thirdFace); - } else { - this.blockQueue[1] = this.blockQueue[2].getSide(this.thirdFace); - this.blockQueue[0] = this.blockQueue[1].getSide(this.secondFace); - } - - this.thirdError -= gridSize; - this.secondError -= gridSize; - this.currentBlock = 2; - } else if (this.secondError > 0) { - this.blockQueue[1] = this.blockQueue[0].getSide(this.mainFace); - this.blockQueue[0] = this.blockQueue[1].getSide(this.secondFace); - this.secondError -= gridSize; - this.currentBlock = 1; - } else if (this.thirdError > 0) { - this.blockQueue[1] = this.blockQueue[0].getSide(this.mainFace); - this.blockQueue[0] = this.blockQueue[1].getSide(this.thirdFace); - this.thirdError -= gridSize; - this.currentBlock = 1; - } else { - this.blockQueue[0] = this.blockQueue[0].getSide(this.mainFace); - this.currentBlock = 0; - } - } -} diff --git a/src/main/java/cn/nukkit/utils/BlockUpdateEntry.java b/src/main/java/cn/nukkit/utils/BlockUpdateEntry.java deleted file mode 100644 index 3dd32cd58..000000000 --- a/src/main/java/cn/nukkit/utils/BlockUpdateEntry.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.block.Block; -import cn.nukkit.math.Vector3; - -/** - * Entry of a block update - * - * @author MagicDroidX - * Nukkit Project - */ -public class BlockUpdateEntry implements Comparable { - - private static long entryID = 0; - - public int priority; - public long delay; - - public final Vector3 pos; - public final Block block; - - public final long id; - - public BlockUpdateEntry(Vector3 pos, Block block) { - this.pos = pos; - this.block = block; - this.id = entryID++; - } - - public BlockUpdateEntry(Vector3 pos, Block block, long delay, int priority) { - this.id = entryID++; - this.pos = pos; - this.priority = priority; - this.delay = delay; - this.block = block; - } - - @Override - public int compareTo(BlockUpdateEntry entry) { - return this.delay < entry.delay ? -1 : (this.delay > entry.delay ? 1 : (this.priority != entry.priority ? this.priority - entry.priority : Long.compare(this.id, entry.id))); - } - - @Override - public boolean equals(Object object) { - if (!(object instanceof BlockUpdateEntry)) { - if (object instanceof Vector3) { - return pos.equals(object); - } - return false; - } else { - BlockUpdateEntry entry = (BlockUpdateEntry) object; - return this.pos.equals(entry.pos) && Block.equals(this.block, entry.block, false); - } - } - - @Override - public int hashCode() { - return this.pos.hashCode(); - } -} diff --git a/src/main/java/cn/nukkit/utils/ChunkException.java b/src/main/java/cn/nukkit/utils/ChunkException.java deleted file mode 100644 index fad2b68ae..000000000 --- a/src/main/java/cn/nukkit/utils/ChunkException.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.utils; - -/** - * ChunkException - * - * @author MagicDroidX - * Nukkit Project - */ -public class ChunkException extends RuntimeException { - - public ChunkException(String message) { - super(message); - } - - public ChunkException(String message, Throwable cause) { - super(message, cause); - } - - public ChunkException(Throwable cause) { - super(cause); - } -} diff --git a/src/main/java/cn/nukkit/utils/ClientChainData.java b/src/main/java/cn/nukkit/utils/ClientChainData.java deleted file mode 100644 index 113f8497f..000000000 --- a/src/main/java/cn/nukkit/utils/ClientChainData.java +++ /dev/null @@ -1,311 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Server; -import cn.nukkit.network.protocol.LoginPacket; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; -import com.nimbusds.jose.JWSObject; -import com.nimbusds.jose.crypto.ECDSAVerifier; - -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PublicKey; -import java.security.interfaces.ECPublicKey; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; -import java.util.*; - -/** - * ClientChainData is a container of chain data sent from clients. - * - * Device information such as client UUID, xuid and serverAddress, can be - * read from instances of this object. - * - * To get chain data, you can use player.getLoginChainData() or read(loginPacket) - * - * =============== - * @author boybook - * Nukkit Project - * =============== - */ -public final class ClientChainData implements LoginChainData { - - private static final String MOJANG_PUBLIC_KEY_BASE64 = "MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8ELkixyLcwlZryUQcu1TvPOmI2B7vX83ndnWRUaXm74wFfa5f/lwQNTfrLVHa2PmenpGI6JhIMUJaWZrjmMj90NoKNFSNBuKdm8rYiXsfaz3K36x/1U26HpG0ZxK/V1V"; - private static final PublicKey MOJANG_PUBLIC_KEY; - - private static final Gson GSON = new Gson(); - - static { - try { - MOJANG_PUBLIC_KEY = generateKey(MOJANG_PUBLIC_KEY_BASE64); - } catch (InvalidKeySpecException | NoSuchAlgorithmException e) { - throw new AssertionError(e); - } - } - - public static ClientChainData of(byte[] buffer) { - return new ClientChainData(buffer); - } - - public static ClientChainData read(LoginPacket pk) { - return of(pk.getBuffer()); - } - - @Override - public String getUsername() { - return username; - } - - @Override - public UUID getClientUUID() { - return clientUUID; - } - - @Override - public String getIdentityPublicKey() { - return identityPublicKey; - } - - @Override - public long getClientId() { - return clientId; - } - - @Override - public String getServerAddress() { - return serverAddress; - } - - @Override - public String getDeviceModel() { - return deviceModel; - } - - @Override - public int getDeviceOS() { - return deviceOS; - } - - @Override - public String getDeviceId() { - return deviceId; - } - - @Override - public String getGameVersion() { - return gameVersion; - } - - @Override - public int getGuiScale() { - return guiScale; - } - - @Override - public String getLanguageCode() { - return languageCode; - } - - @Override - public String getXUID() { - return xuid; - } - - private boolean xboxAuthed; - - @Override - public int getCurrentInputMode() { - return currentInputMode; - } - - @Override - public int getDefaultInputMode() { - return defaultInputMode; - } - - @Override - public String getCapeData() { - return capeData; - } - - public final static int UI_PROFILE_CLASSIC = 0; - public final static int UI_PROFILE_POCKET = 1; - - @Override - public int getUIProfile() { - return UIProfile; - } - - @Override - public JsonObject getRawData() { - return rawData; - } - - /////////////////////////////////////////////////////////////////////////// - // Override - /////////////////////////////////////////////////////////////////////////// - - @Override - public boolean equals(Object obj) { - return obj instanceof ClientChainData && Objects.equals(bs, ((ClientChainData) obj).bs); - } - - @Override - public int hashCode() { - return bs.hashCode(); - } - - /////////////////////////////////////////////////////////////////////////// - // Internal - /////////////////////////////////////////////////////////////////////////// - - private String username; - private UUID clientUUID; - private String xuid; - - private static ECPublicKey generateKey(String base64) throws NoSuchAlgorithmException, InvalidKeySpecException { - return (ECPublicKey) KeyFactory.getInstance("EC").generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(base64))); - } - - private String identityPublicKey; - - private long clientId; - private String serverAddress; - private String deviceModel; - private int deviceOS; - private String deviceId; - private String gameVersion; - private int guiScale; - private String languageCode; - private int currentInputMode; - private int defaultInputMode; - - private int UIProfile; - - private String capeData; - - private JsonObject rawData; - - private final BinaryStream bs = new BinaryStream(); - - private ClientChainData(byte[] buffer) { - bs.setBuffer(buffer, 0); - decodeChainData(); - decodeSkinData(); - } - - @Override - public boolean isXboxAuthed() { - return xboxAuthed; - } - - private void decodeSkinData() { - int size = bs.getLInt(); - if (size > 3000000) { - throw new IllegalArgumentException("The skin data is too big: " + size); - } - JsonObject skinToken = decodeToken(new String(bs.get(size))); - if (skinToken == null) return; - if (skinToken.has("ClientRandomId")) this.clientId = skinToken.get("ClientRandomId").getAsLong(); - if (skinToken.has("ServerAddress")) this.serverAddress = skinToken.get("ServerAddress").getAsString(); - if (skinToken.has("DeviceModel")) this.deviceModel = skinToken.get("DeviceModel").getAsString(); - if (skinToken.has("DeviceOS")) this.deviceOS = skinToken.get("DeviceOS").getAsInt(); - if (skinToken.has("DeviceId")) this.deviceId = skinToken.get("DeviceId").getAsString(); - if (skinToken.has("GameVersion")) this.gameVersion = skinToken.get("GameVersion").getAsString(); - if (skinToken.has("GuiScale")) this.guiScale = skinToken.get("GuiScale").getAsInt(); - if (skinToken.has("LanguageCode")) this.languageCode = skinToken.get("LanguageCode").getAsString(); - if (skinToken.has("CurrentInputMode")) this.currentInputMode = skinToken.get("CurrentInputMode").getAsInt(); - if (skinToken.has("DefaultInputMode")) this.defaultInputMode = skinToken.get("DefaultInputMode").getAsInt(); - if (skinToken.has("UIProfile")) this.UIProfile = skinToken.get("UIProfile").getAsInt(); - if (skinToken.has("CapeData")) this.capeData = skinToken.get("CapeData").getAsString(); - if (!Server.getInstance().suomiCraftPEMode()) this.rawData = skinToken; - } - - private static JsonObject decodeToken(String token) { - String[] base = token.split("\\."); - if (base.length < 2) return null; - return GSON.fromJson(new String(Base64.getDecoder().decode(base[1]), StandardCharsets.UTF_8), JsonObject.class); - } - - private void decodeChainData() { - int size = bs.getLInt(); - if (size > 3000000) { - throw new IllegalArgumentException("The chain data is too big: " + size); - } - Map> map = GSON.fromJson(new String(bs.get(size), StandardCharsets.UTF_8), new MapTypeToken().getType()); - if (map.isEmpty() || !map.containsKey("chain") || map.get("chain").isEmpty()) return; - List chains = map.get("chain"); - - // Validate keys - try { - xboxAuthed = verifyChain(chains); - } catch (Exception e) { - xboxAuthed = false; - } - - for (String c : chains) { - JsonObject chainMap = decodeToken(c); - if (chainMap == null) continue; - if (chainMap.has("extraData")) { - JsonObject extra = chainMap.get("extraData").getAsJsonObject(); - if (extra.has("displayName")) this.username = extra.get("displayName").getAsString(); - if (extra.has("identity")) this.clientUUID = UUID.fromString(extra.get("identity").getAsString()); - if (extra.has("XUID")) this.xuid = extra.get("XUID").getAsString(); - } - if (chainMap.has("identityPublicKey")) { - this.identityPublicKey = chainMap.get("identityPublicKey").getAsString(); - } - } - - if (!xboxAuthed) { - xuid = null; - } - } - - private static boolean verifyChain(List chains) throws Exception { - ECPublicKey lastKey = null; - boolean mojangKeyVerified = false; - Iterator iterator = chains.iterator(); - while (iterator.hasNext()) { - JWSObject jws = JWSObject.parse(iterator.next()); - - URI x5u = jws.getHeader().getX509CertURL(); - if (x5u == null) { - return false; - } - - ECPublicKey expectedKey = generateKey(x5u.toString()); - // First key is self-signed - if (lastKey == null) { - lastKey = expectedKey; - } else if (!lastKey.equals(expectedKey)) { - return false; - } - - if (!jws.verify(new ECDSAVerifier(lastKey))) { - return false; - } - - if (mojangKeyVerified) { - return !iterator.hasNext(); - } - - if (lastKey.equals(MOJANG_PUBLIC_KEY)) { - mojangKeyVerified = true; - } - - Object base64key = jws.getPayload().toJSONObject().get("identityPublicKey"); - if (!(base64key instanceof String)) { - throw new RuntimeException("No key found"); - } - lastKey = generateKey((String) base64key); - } - return mojangKeyVerified; - } - - private static class MapTypeToken extends TypeToken>> { - } -} diff --git a/src/main/java/cn/nukkit/utils/Config.java b/src/main/java/cn/nukkit/utils/Config.java deleted file mode 100644 index c2d67e122..000000000 --- a/src/main/java/cn/nukkit/utils/Config.java +++ /dev/null @@ -1,645 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Server; -import cn.nukkit.scheduler.FileWriteTask; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.regex.Pattern; - -/** - * Config - * - * @author MagicDroidX - * Nukkit - */ -public class Config { - - public static final int DETECT = -1; //Detect by file extension - public static final int PROPERTIES = 0; // .properties - public static final int CNF = Config.PROPERTIES; // .cnf - public static final int JSON = 1; // .js, .json - public static final int YAML = 2; // .yml, .yaml - public static final int EXPORT = 3; // .export, .xport - public static final int SERIALIZED = 4; // .sl - public static final int ENUM = 5; // .txt, .list, .enum - public static final int ENUMERATION = Config.ENUM; - - private ConfigSection config = new ConfigSection(); - private File file; - private boolean correct = false; - private int type = Config.DETECT; - - /** - * List of supported config file formats - */ - public static final Map format = new TreeMap<>(); - - static { - format.put("properties", Config.PROPERTIES); - format.put("con", Config.PROPERTIES); - format.put("conf", Config.PROPERTIES); - format.put("config", Config.PROPERTIES); - format.put("js", Config.JSON); - format.put("json", Config.JSON); - format.put("yml", Config.YAML); - format.put("yaml", Config.YAML); - format.put("sl", Config.SERIALIZED); - format.put("serialize", Config.SERIALIZED); - format.put("txt", Config.ENUM); - format.put("list", Config.ENUM); - format.put("enum", Config.ENUM); - } - - /** - * Constructor for Config instance with undefined file object - * - * @param type - Config type - */ - public Config(int type) { - this.type = type; - this.correct = true; - this.config = new ConfigSection(); - } - - /** - * Constructor for Config (YAML) instance with undefined file object - */ - public Config() { - this(Config.YAML); - } - - public Config(String file) { - this(file, Config.DETECT); - } - - public Config(File file) { - this(file.toString(), Config.DETECT); - } - - public Config(String file, int type) { - this(file, type, new ConfigSection()); - } - - public Config(File file, int type) { - this(file.toString(), type, new ConfigSection()); - } - - public Config(String file, int type, LinkedHashMap defaultMap) { - this.load(file, type, new ConfigSection(defaultMap)); - } - - public Config(String file, int type, ConfigSection defaultMap) { - this.load(file, type, defaultMap); - } - - public Config(File file, int type, ConfigSection defaultMap) { - this.load(file.toString(), type, defaultMap); - } - - public Config(File file, int type, LinkedHashMap defaultMap) { - this(file.toString(), type, new ConfigSection(defaultMap)); - } - - /** - * Reload config from disk - */ - public void reload() { - this.config.clear(); - this.correct = false; - if (this.file == null) throw new IllegalStateException("Failed to reload Config. File object is undefined."); - this.load(this.file.toString(), this.type); - } - - /** - * Try to load a config file and automatically detect its type - * - * @param file file path - * @return loaded - */ - public boolean load(String file) { - return this.load(file, Config.DETECT); - } - - /** - * Try to load a config file with a given type - * - * @param file file path - * @param type file type - * @return loaded - */ - public boolean load(String file, int type) { - return this.load(file, type, new ConfigSection()); - } - - /** - * Try to load a config file with a given type and default content - * - * @param file file path - * @param type file type - * @param defaultMap default content - * @return loaded - */ - public boolean load(String file, int type, ConfigSection defaultMap) { - this.correct = true; - this.type = type; - this.file = new File(file); - if (!this.file.exists()) { - try { - this.file.getParentFile().mkdirs(); - this.file.createNewFile(); - } catch (IOException e) { - MainLogger.getLogger().error("Could not create Config " + this.file.toString(), e); - } - this.config = defaultMap; - this.save(); - } else { - if (this.type == Config.DETECT) { - String extension = ""; - if (this.file.getName().lastIndexOf('.') != -1 && this.file.getName().lastIndexOf('.') != 0) { - extension = this.file.getName().substring(this.file.getName().lastIndexOf('.') + 1); - } - if (format.containsKey(extension)) { - this.type = format.get(extension); - } else { - this.correct = false; - } - } - if (this.correct) { - String content = ""; - try { - content = Utils.readFile(this.file); - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - } - this.parseContent(content); - if (!this.correct) return false; - if (this.setDefault(defaultMap) > 0) { - this.save(); - } - } else { - return false; - } - } - return true; - } - - /** - * Load Config from InputStream - * - * @param inputStream InputStream - * @return loaded - */ - public boolean load(InputStream inputStream) { - if (inputStream == null) return false; - if (this.correct) { - String content; - try { - content = Utils.readFile(inputStream); - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - return false; - } - this.parseContent(content); - } - return correct; - } - - /** - * Load and return a Config from InputStream - * - * @param inputStream InputStream - * @return Config - */ - public Config loadFromStream(InputStream inputStream) { - if (inputStream == null) return null; - if (this.correct) { - String content; - try { - content = Utils.readFile(inputStream); - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - return null; - } - this.parseContent(content); - } - return this; - } - - /** - * Check if the config is valid - * - * @return valid - */ - public boolean check() { - return this.correct; - } - - /** - * Check if the config is valid - * - * @return valid - */ - public boolean isCorrect() { - return this.correct; - } - - /** - * Save configuration into provided file. Internal file object will be set to new file. - * - * @param file file - * @param async async - * @return save success - */ - public boolean save(File file, boolean async) { - this.file = file; - return save(async); - } - - /** - * Save configuration into provided file. Internal file object will be set to new file. - * - * @param file file - * @return save success - */ - public boolean save(File file) { - this.file = file; - return save(); - } - - /** - * Save the config to disk - * - * @return saved - */ - public boolean save() { - return this.save(false); - } - - /** - * Save the config to disk - * - * @param async async - * @return saved - */ - public boolean save(Boolean async) { // Note: do not change to 'boolean' or plugins will break - if (this.file == null) throw new IllegalStateException("Failed to save Config. File object is undefined."); - if (this.correct) { - StringBuilder content = new StringBuilder(); - switch (this.type) { - case Config.PROPERTIES: - content = new StringBuilder(this.writeProperties()); - break; - case Config.JSON: - content = new StringBuilder(new GsonBuilder().setPrettyPrinting().create().toJson(this.config)); - break; - case Config.YAML: - DumperOptions dumperOptions = new DumperOptions(); - dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - Yaml yaml = new Yaml(dumperOptions); - content = new StringBuilder(yaml.dump(this.config)); - break; - case Config.ENUM: - for (Object o : this.config.entrySet()) { - Map.Entry entry = (Map.Entry) o; - content.append(entry.getKey()).append("\r\n"); - } - break; - } - if (async) { - Server.getInstance().getScheduler().scheduleAsyncTask(new FileWriteTask(this.file, content.toString())); - } else { - try { - Utils.writeFile(this.file, content.toString()); - } catch (IOException e) { - Server.getInstance().getLogger().logException(e); - } - } - return true; - } else { - return false; - } - } - - /** - * Set a value in the config - * - * @param key key - * @param value value - */ - public void set(final String key, Object value) { - this.config.set(key, value); - } - - /** - * Get a value in the config - * - * @param key key - * @return value - */ - public Object get(String key) { - return this.get(key, null); - } - - public T get(String key, T defaultValue) { - return this.correct ? this.config.get(key, defaultValue) : defaultValue; - } - - public ConfigSection getSection(String key) { - return this.correct ? this.config.getSection(key) : new ConfigSection(); - } - - public boolean isSection(String key) { - return config.isSection(key); - } - - public ConfigSection getSections(String key) { - return this.correct ? this.config.getSections(key) : new ConfigSection(); - } - - public ConfigSection getSections() { - return this.correct ? this.config.getSections() : new ConfigSection(); - } - - public int getInt(String key) { - return this.getInt(key, 0); - } - - public int getInt(String key, int defaultValue) { - return this.correct ? this.config.getInt(key, defaultValue) : defaultValue; - } - - public boolean isInt(String key) { - return config.isInt(key); - } - - public long getLong(String key) { - return this.getLong(key, 0); - } - - public long getLong(String key, long defaultValue) { - return this.correct ? this.config.getLong(key, defaultValue) : defaultValue; - } - - public boolean isLong(String key) { - return config.isLong(key); - } - - public double getDouble(String key) { - return this.getDouble(key, 0); - } - - public double getDouble(String key, double defaultValue) { - return this.correct ? this.config.getDouble(key, defaultValue) : defaultValue; - } - - public boolean isDouble(String key) { - return config.isDouble(key); - } - - public String getString(String key) { - return this.getString(key, ""); - } - - public String getString(String key, String defaultValue) { - return this.correct ? this.config.getString(key, defaultValue) : defaultValue; - } - - public boolean isString(String key) { - return config.isString(key); - } - - public boolean getBoolean(String key) { - return this.getBoolean(key, false); - } - - public boolean getBoolean(String key, boolean defaultValue) { - return this.correct ? this.config.getBoolean(key, defaultValue) : defaultValue; - } - - public boolean isBoolean(String key) { - return config.isBoolean(key); - } - - public List getList(String key) { - return this.getList(key, null); - } - - public List getList(String key, List defaultList) { - return this.correct ? this.config.getList(key, defaultList) : defaultList; - } - - public boolean isList(String key) { - return config.isList(key); - } - - public List getStringList(String key) { - return config.getStringList(key); - } - - public List getIntegerList(String key) { - return config.getIntegerList(key); - } - - public List getBooleanList(String key) { - return config.getBooleanList(key); - } - - public List getDoubleList(String key) { - return config.getDoubleList(key); - } - - public List getFloatList(String key) { - return config.getFloatList(key); - } - - public List getLongList(String key) { - return config.getLongList(key); - } - - public List getByteList(String key) { - return config.getByteList(key); - } - - public List getCharacterList(String key) { - return config.getCharacterList(key); - } - - public List getShortList(String key) { - return config.getShortList(key); - } - - public List getMapList(String key) { - return config.getMapList(key); - } - - public void setAll(LinkedHashMap map) { - this.config = new ConfigSection(map); - } - - public void setAll(ConfigSection section) { - this.config = section; - } - - public boolean exists(String key) { - return config.exists(key); - } - - public boolean exists(String key, boolean ignoreCase) { - return config.exists(key, ignoreCase); - } - - public void remove(String key) { - config.remove(key); - } - - public Map getAll() { - return this.config.getAllMap(); - } - - /** - * Get root (main) config section of the Config - * - * @return root config section of the Config - */ - public ConfigSection getRootSection() { - return config; - } - - public int setDefault(LinkedHashMap map) { - return setDefault(new ConfigSection(map)); - } - - public int setDefault(ConfigSection map) { - int size = this.config.size(); - this.config = this.fillDefaults(map, this.config); - return this.config.size() - size; - } - - - private ConfigSection fillDefaults(ConfigSection defaultMap, ConfigSection data) { - for (String key : defaultMap.keySet()) { - if (!data.containsKey(key)) { - data.put(key, defaultMap.get(key)); - } - } - return data; - } - - private void parseList(String content) { - content = content.replace("\r\n", "\n"); - for (String v : content.split("\n")) { - if (v.trim().isEmpty()) { - continue; - } - config.put(v, true); - } - } - - private String writeProperties() { - StringBuilder content = new StringBuilder("#Properties Config File\r\n"); - for (Object o : this.config.entrySet()) { - Map.Entry entry = (Map.Entry) o; - Object v = entry.getValue(); - Object k = entry.getKey(); - if (v instanceof Boolean) { - v = (Boolean) v ? "on" : "off"; - } - content.append(k).append('=').append(v).append("\r\n"); - } - return content.toString(); - } - - private void parseProperties(String content) { - for (final String line : content.split("\n")) { - if (Pattern.compile("[a-zA-Z0-9\\-_.]*+=+[^\\r\\n]*").matcher(line).matches()) { - final int splitIndex = line.indexOf('='); - if (splitIndex == -1) { - continue; - } - final String key = line.substring(0, splitIndex); - final String value = line.substring(splitIndex + 1); - if (this.config.containsKey(key)) { - MainLogger.getLogger().debug("[Config] Repeated property " + key + " in file " + this.file.toString()); - } - switch (value.toLowerCase()) { - case "on": - case "true": - case "yes": - this.config.put(key, true); - break; - case "off": - case "false": - case "no": - this.config.put(key, false); - break; - default: - this.config.put(key, value); - break; - } - } - } - } - - public Object getNested(String key) { - return get(key); - } - - public T getNested(String key, T defaultValue) { - return get(key, defaultValue); - } - - @SuppressWarnings("unchecked") - public T getNestedAs(String key, Class type) { - return (T) get(key); - } - - public void removeNested(String key) { - remove(key); - } - - @SuppressWarnings("unchecked") - private void parseContent(String content) { - switch (this.type) { - case Config.PROPERTIES: - this.parseProperties(content); - break; - case Config.JSON: - GsonBuilder builder = new GsonBuilder(); - Gson gson = builder.create(); - this.config = new ConfigSection(gson.fromJson(content, new LinkedHashMapTypeToken().getType())); - break; - case Config.YAML: - DumperOptions dumperOptions = new DumperOptions(); - dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - Yaml yaml = new Yaml(dumperOptions); - this.config = new ConfigSection(yaml.loadAs(content, LinkedHashMap.class)); - break; - case Config.ENUM: - this.parseList(content); - break; - default: - this.correct = false; - } - } - - public Set getKeys() { - if (this.correct) return config.getKeys(); - return new HashSet<>(); - } - - public Set getKeys(boolean child) { - if (this.correct) return config.getKeys(child); - return new HashSet<>(); - } - - private static class LinkedHashMapTypeToken extends TypeToken> { - } -} diff --git a/src/main/java/cn/nukkit/utils/ConfigSection.java b/src/main/java/cn/nukkit/utils/ConfigSection.java deleted file mode 100644 index 1c162824d..000000000 --- a/src/main/java/cn/nukkit/utils/ConfigSection.java +++ /dev/null @@ -1,733 +0,0 @@ -package cn.nukkit.utils; - -import java.util.*; - -/** - * Config section - * - * Created by fromgate on 26.04.2016. - */ -@SuppressWarnings("serial") -public class ConfigSection extends LinkedHashMap { - - /** - * Empty ConfigSection constructor - */ - public ConfigSection() { - super(); - } - - /** - * Constructor of ConfigSection that contains initial key/value data - * - * @param key key - * @param value value - */ - public ConfigSection(String key, Object value) { - this(); - this.set(key, value); - } - - /** - * Constructor of ConfigSection, based on values stored in map. - * - * @param map map - */ - @SuppressWarnings("unchecked") - public ConfigSection(LinkedHashMap map) { - this(); - if (map == null || map.isEmpty()) return; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() instanceof LinkedHashMap) { - super.put(entry.getKey(), new ConfigSection((LinkedHashMap) entry.getValue())); - } else if (entry.getValue() instanceof List) { - super.put(entry.getKey(), parseList((List) entry.getValue())); - } else { - super.put(entry.getKey(), entry.getValue()); - } - } - } - - @SuppressWarnings("unchecked") - private List parseList(List list) { - List newList = new ArrayList<>(); - - for (Object o : list) { - if (o instanceof LinkedHashMap) { - newList.add(new ConfigSection((LinkedHashMap) o)); - } else { - newList.add(o); - } - } - - return newList; - } - - /** - * Get root section as LinkedHashMap - * - * @return root section as LinkedHashMap - */ - public Map getAllMap() { - return new LinkedHashMap<>(this); - } - - - /** - * Get new instance of config section - * - * @return new instance of config section - */ - public ConfigSection getAll() { - return new ConfigSection(this); - } - - /** - * Get object by key. If section does not contain value, return null - */ - public Object get(String key) { - return this.get(key, null); - } - - /** - * Get object by key. If section does not contain value, return default value - * - * @param key key - * @param defaultValue default value - * @return object by key or default value - */ - @SuppressWarnings("unchecked") - public T get(String key, T defaultValue) { - if (key == null || key.isEmpty()) return defaultValue; - if (super.containsKey(key)) return (T) super.get(key); - String[] keys = key.split("\\.", 2); - if (!super.containsKey(keys[0])) return defaultValue; - Object value = super.get(keys[0]); - if (value instanceof ConfigSection) { - ConfigSection section = (ConfigSection) value; - return section.get(keys[1], defaultValue); - } - return defaultValue; - } - - /** - * Store value into config section - * - * @param key key - * @param value value - */ - public void set(String key, Object value) { - String[] subKeys = key.split("\\.", 2); - if (subKeys.length > 1) { - ConfigSection childSection = new ConfigSection(); - if (this.containsKey(subKeys[0]) && super.get(subKeys[0]) instanceof ConfigSection) - childSection = (ConfigSection) super.get(subKeys[0]); - childSection.set(subKeys[1], value); - super.put(subKeys[0], childSection); - } else super.put(subKeys[0], value); - } - - /** - * Check type of section element defined by key. Return true if this element is ConfigSection - * - * @param key key - * @return true if this element is ConfigSection - */ - public boolean isSection(String key) { - return this.get(key) instanceof ConfigSection; - } - - /** - * Get config section element defined by key - * - * @param key key - * @return config section element defined by key - */ - public ConfigSection getSection(String key) { - return this.get(key, new ConfigSection()); - } - - //@formatter:off - - /** - * Get all ConfigSections in root path. - * Example config: - * a1: - * b1: - * c1: - * c2: - * a2: - * b2: - * c3: - * c4: - * a3: true - * a4: "hello" - * a5: 100 - *

- * getSections() will return new ConfigSection, that contains sections a1 and a2 only. - * - * @return all ConfigSections in root path - */ - //@formatter:on - public ConfigSection getSections() { - return getSections(null); - } - - /** - * Get sections (and only sections) from provided path - * - * @param key - config section path, if null or empty root path will used. - * @return sections - */ - public ConfigSection getSections(String key) { - ConfigSection sections = new ConfigSection(); - ConfigSection parent = key == null || key.isEmpty() ? this.getAll() : getSection(key); - if (parent == null) return sections; - parent.forEach((key1, value) -> { - if (value instanceof ConfigSection) - sections.put(key1, value); - }); - return sections; - } - - /** - * Get int value of config section element - * - * @param key - key (inside) current section (default value equals to 0) - * @return int value of config section element - */ - public int getInt(String key) { - return this.getInt(key, 0); - } - - /** - * Get int value of config section element - * - * @param key - key (inside) current section - * @param defaultValue - default value that will returned if section element is not exists - * @return int value of config section element - */ - public int getInt(String key, int defaultValue) { - return this.get(key, ((Number) defaultValue)).intValue(); - } - - /** - * Check type of section element defined by key. Return true if this element is Integer - * - * @param key key - * @return true if this element is Integer - */ - public boolean isInt(String key) { - return get(key) instanceof Integer; - } - - /** - * Get long value of config section element - * - * @param key - key (inside) current section - * @return long value of config section element - */ - public long getLong(String key) { - return this.getLong(key, 0); - } - - /** - * Get long value of config section element - * - * @param key - key (inside) current section - * @param defaultValue - default value that will returned if section element is not exists - * @return long value of config section element - */ - public long getLong(String key, long defaultValue) { - return this.get(key, ((Number) defaultValue)).longValue(); - } - - /** - * Check type of section element defined by key. Return true if this element is Long - * - * @param key key - * @return true if this element is Long - */ - public boolean isLong(String key) { - return get(key) instanceof Long; - } - - /** - * Get double value of config section element - * - * @param key - key (inside) current section - * @return double value of config section element - */ - public double getDouble(String key) { - return this.getDouble(key, 0); - } - - /** - * Get double value of config section element - * - * @param key - key (inside) current section - * @param defaultValue - default value that will returned if section element is not exists - * @return double value of config section element - */ - public double getDouble(String key, double defaultValue) { - return this.get(key, ((Number) defaultValue)).doubleValue(); - } - - /** - * Check type of section element defined by key. Return true if this element is Double - * - * @param key key - * @return true if this element is Double - */ - public boolean isDouble(String key) { - return get(key) instanceof Double; - } - - /** - * Get String value of config section element - * - * @param key - key (inside) current section - * @return String value of config section element - */ - public String getString(String key) { - return this.getString(key, ""); - } - - /** - * Get String value of config section element - * - * @param key - key (inside) current section - * @param defaultValue - default value that will returned if section element is not exists - * @return String value of config section element - */ - public String getString(String key, String defaultValue) { - return String.valueOf(this.get(key, defaultValue)); - } - - /** - * Check type of section element defined by key. Return true if this element is String - * - * @param key key - * @return true if this element is String - */ - public boolean isString(String key) { - return get(key) instanceof String; - } - - /** - * Get boolean value of config section element - * - * @param key - key (inside) current section - * @return boolean value of config section element - */ - public boolean getBoolean(String key) { - return this.getBoolean(key, false); - } - - /** - * Get boolean value of config section element - * - * @param key - key (inside) current section - * @param defaultValue - default value that will returned if section element is not exists - * @return boolean value of config section element - */ - public boolean getBoolean(String key, boolean defaultValue) { - return this.get(key, defaultValue); - } - - /** - * Check type of section element defined by key. Return true if this element is Integer - * - * @param key key - * @return true if this element is Integer - */ - public boolean isBoolean(String key) { - return get(key) instanceof Boolean; - } - - /** - * Get List value of config section element - * - * @param key - key (inside) current section - * @return List value of config section element - */ - public List getList(String key) { - return this.getList(key, null); - } - - /** - * Get List value of config section element - * - * @param key - key (inside) current section - * @param defaultList - default value that will returned if section element is not exists - * @return List value of config section element - */ - public List getList(String key, List defaultList) { - return this.get(key, defaultList); - } - - /** - * Check type of section element defined by key. Return true if this element is List - * - * @param key key - * @return true if this element is List - */ - public boolean isList(String key) { - return get(key) instanceof List; - } - - /** - * Get String List value of config section element - * - * @param key - key (inside) current section - * @return String List value of config section element - */ - public List getStringList(String key) { - List value = this.getList(key); - if (value == null) { - return new ArrayList<>(0); - } - List result = new ArrayList<>(); - for (Object o : value) { - if (o instanceof String || o instanceof Number || o instanceof Boolean || o instanceof Character) { - result.add(String.valueOf(o)); - } - } - return result; - } - - /** - * Get Integer List value of config section element - * - * @param key - key (inside) current section - * @return Integer List value of config section element - */ - public List getIntegerList(String key) { - List list = getList(key); - if (list == null) { - return new ArrayList<>(0); - } - List result = new ArrayList<>(); - - for (Object object : list) { - if (object instanceof Integer) { - result.add((Integer) object); - } else if (object instanceof String) { - try { - result.add(Integer.valueOf((String) object)); - } catch (Exception ignored) { - } - } else if (object instanceof Character) { - result.add((int) (Character) object); - } else if (object instanceof Number) { - result.add(((Number) object).intValue()); - } - } - return result; - } - - /** - * Get Boolean List value of config section element - * - * @param key - key (inside) current section - * @return Boolean List value of config section element - */ - public List getBooleanList(String key) { - List list = getList(key); - if (list == null) { - return new ArrayList<>(0); - } - List result = new ArrayList<>(); - for (Object object : list) { - if (object instanceof Boolean) { - result.add((Boolean) object); - } else if (object instanceof String) { - if (Boolean.TRUE.toString().equals(object)) { - result.add(true); - } else if (Boolean.FALSE.toString().equals(object)) { - result.add(false); - } - } - } - return result; - } - - /** - * Get Double List value of config section element - * - * @param key - key (inside) current section - * @return Double List value of config section element - */ - public List getDoubleList(String key) { - List list = getList(key); - if (list == null) { - return new ArrayList<>(0); - } - List result = new ArrayList<>(); - for (Object object : list) { - if (object instanceof Double) { - result.add((Double) object); - } else if (object instanceof String) { - try { - result.add(Double.valueOf((String) object)); - } catch (Exception ignored) { - } - } else if (object instanceof Character) { - result.add((double) (Character) object); - } else if (object instanceof Number) { - result.add(((Number) object).doubleValue()); - } - } - return result; - } - - /** - * Get Float List value of config section element - * - * @param key - key (inside) current section - * @return Float List value of config section element - */ - public List getFloatList(String key) { - List list = getList(key); - if (list == null) { - return new ArrayList<>(0); - } - List result = new ArrayList<>(); - for (Object object : list) { - if (object instanceof Float) { - result.add((Float) object); - } else if (object instanceof String) { - try { - result.add(Float.valueOf((String) object)); - } catch (Exception ignored) { - } - } else if (object instanceof Character) { - result.add((float) (Character) object); - } else if (object instanceof Number) { - result.add(((Number) object).floatValue()); - } - } - return result; - } - - /** - * Get Long List value of config section element - * - * @param key - key (inside) current section - * @return Long List value of config section element - */ - public List getLongList(String key) { - List list = getList(key); - if (list == null) { - return new ArrayList<>(0); - } - List result = new ArrayList<>(); - for (Object object : list) { - if (object instanceof Long) { - result.add((Long) object); - } else if (object instanceof String) { - try { - result.add(Long.valueOf((String) object)); - } catch (Exception ignored) { - } - } else if (object instanceof Character) { - result.add((long) (Character) object); - } else if (object instanceof Number) { - result.add(((Number) object).longValue()); - } - } - return result; - } - - /** - * Get Byte List value of config section element - * - * @param key - key (inside) current section - * @return Byte List value of config section element - */ - public List getByteList(String key) { - List list = getList(key); - - if (list == null) { - return new ArrayList<>(0); - } - - List result = new ArrayList<>(); - - for (Object object : list) { - if (object instanceof Byte) { - result.add((Byte) object); - } else if (object instanceof String) { - try { - result.add(Byte.valueOf((String) object)); - } catch (Exception ignored) { - } - } else if (object instanceof Character) { - result.add((byte) ((Character) object).charValue()); - } else if (object instanceof Number) { - result.add(((Number) object).byteValue()); - } - } - - return result; - } - - /** - * Get Character List value of config section element - * - * @param key - key (inside) current section - * @return Character List value of config section element - */ - public List getCharacterList(String key) { - List list = getList(key); - - if (list == null) { - return new ArrayList<>(0); - } - - List result = new ArrayList<>(); - - for (Object object : list) { - if (object instanceof Character) { - result.add((Character) object); - } else if (object instanceof String) { - String str = (String) object; - - if (str.length() == 1) { - result.add(str.charAt(0)); - } - } else if (object instanceof Number) { - result.add((char) ((Number) object).intValue()); - } - } - - return result; - } - - /** - * Get Short List value of config section element - * - * @param key - key (inside) current section - * @return Short List value of config section element - */ - public List getShortList(String key) { - List list = getList(key); - - if (list == null) { - return new ArrayList<>(0); - } - - List result = new ArrayList<>(); - - for (Object object : list) { - if (object instanceof Short) { - result.add((Short) object); - } else if (object instanceof String) { - try { - result.add(Short.valueOf((String) object)); - } catch (Exception ignored) { - } - } else if (object instanceof Character) { - result.add((short) ((Character) object).charValue()); - } else if (object instanceof Number) { - result.add(((Number) object).shortValue()); - } - } - - return result; - } - - /** - * Get Map List value of config section element - * - * @param key - key (inside) current section - * @return Map List value of config section element - */ - @SuppressWarnings("unchecked") - public List getMapList(String key) { - List list = getList(key); - List result = new ArrayList<>(); - - if (list == null) { - return result; - } - - for (Object object : list) { - if (object instanceof Map) { - result.add((Map) object); - } - } - - return result; - } - - /** - * Check existence of config section element - * - * @param key key - * @param ignoreCase ignore case - * @return existence of config section element - */ - public boolean exists(String key, boolean ignoreCase) { - if (ignoreCase) key = key.toLowerCase(); - for (String existKey : this.getKeys(true)) { - if (ignoreCase) existKey = existKey.toLowerCase(); - if (existKey.equals(key)) return true; - } - return false; - } - - /** - * Check existence of config section element - * - * @param key key - * @return existence of config section element - */ - public boolean exists(String key) { - return exists(key, false); - } - - /** - * Remove config section element - * - * @param key key - */ - public void remove(String key) { - if (key == null || key.isEmpty()) return; - if (super.containsKey(key)) super.remove(key); - else if (this.containsKey(".")) { - String[] keys = key.split("\\.", 2); - if (super.get(keys[0]) instanceof ConfigSection) { - ConfigSection section = (ConfigSection) super.get(keys[0]); - section.remove(keys[1]); - } - } - } - - /** - * Get all keys - * - * @param child - true = include child keys - * @return all keys - */ - public Set getKeys(boolean child) { - Set keys = new LinkedHashSet<>(); - this.forEach((key, value) -> { - keys.add(key); - if (value instanceof ConfigSection) { - if (child) - ((ConfigSection) value).getKeys(true).forEach(childKey -> keys.add(key + '.' + childKey)); - } - }); - return keys; - } - - /** - * Get all keys - * - * @return all keys - */ - public Set getKeys() { - return this.getKeys(true); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/utils/DefaultPlayerDataSerializer.java b/src/main/java/cn/nukkit/utils/DefaultPlayerDataSerializer.java deleted file mode 100644 index 569fba37e..000000000 --- a/src/main/java/cn/nukkit/utils/DefaultPlayerDataSerializer.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Server; -import com.google.common.base.Preconditions; -import lombok.RequiredArgsConstructor; - -import java.io.*; -import java.util.Optional; -import java.util.UUID; - -/** - * Default player data serializer that saves the player data as .dat files into the 'players' folder. - */ -@RequiredArgsConstructor -public class DefaultPlayerDataSerializer implements PlayerDataSerializer { - - private String dataPath; - - public DefaultPlayerDataSerializer(Server server) { - this(server.getDataPath()); - } - - public DefaultPlayerDataSerializer(String dataPath) { - this.dataPath = dataPath; - } - - @Override - public Optional read(String name, UUID uuid) throws IOException { - File file = new File(dataPath + "players/" + name + ".dat"); - if (!file.exists()) { - return Optional.empty(); - } - return Optional.of(new FileInputStream(file)); - - } - - @Override - public OutputStream write(String name, UUID uuid) throws IOException { - Preconditions.checkNotNull(name, "name"); - File file = new File(dataPath + "players/" + name + ".dat"); - return new FileOutputStream(file); - } -} diff --git a/src/main/java/cn/nukkit/utils/DummyBossBar.java b/src/main/java/cn/nukkit/utils/DummyBossBar.java deleted file mode 100644 index 3405ed9ba..000000000 --- a/src/main/java/cn/nukkit/utils/DummyBossBar.java +++ /dev/null @@ -1,289 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.entity.Attribute; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.data.EntityMetadata; -import cn.nukkit.entity.mob.EntityCreeper; -import cn.nukkit.network.protocol.*; - -/** - * DummyBossBar - * =============== - * @author boybook - * Nukkit Project - * =============== - */ -public class DummyBossBar { - - private final Player player; - private final long bossBarId; - - private String text; - private float length; - private BlockColor color; - - private DummyBossBar(Builder builder) { - this.player = builder.player; - this.bossBarId = builder.bossBarId; - this.text = builder.text; - this.length = builder.length; - this.color = builder.color; - } - - /** - * Boss bar builder - */ - public static class Builder { - private final Player player; - private final long bossBarId; - - private String text = ""; - private float length = 100; - private BlockColor color = null; - - public Builder(Player player) { - this.player = player; - if (Server.getInstance().suomiCraftPEMode()) { - this.bossBarId = 1095216660480L; // This is hack to get one thing work - } else { - this.bossBarId = 1095216660480L + Utils.random.nextLong(0, 0x7fffffffL); - } - } - - public Builder text(String text) { - this.text = text; - return this; - } - - public Builder length(float length) { - if (length >= 0 && length <= 100) this.length = length; - return this; - } - - public Builder color(BlockColor color) { - this.color = color; - return this; - } - - public Builder color(int red, int green, int blue) { - return color(new BlockColor(red, green, blue)); - } - - public DummyBossBar build() { - return new DummyBossBar(this); - } - } - - /** - * Get boss bar owner - * - * @return player - */ - public Player getPlayer() { - return player; - } - - /** - * Get boss bar id - * - * @return boss bar id - */ - public long getBossBarId() { - return bossBarId; - } - - /** - * Get boss bar text - * - * @return current text - */ - public String getText() { - return text; - } - - /** - * Set the boss bar text and send it to player if changed - * - * @param text new text - */ - public void setText(String text) { - if (!this.text.equals(text)) { - this.text = text; - this.updateBossEntityNameTag(); - this.sendSetBossBarTitle(); - } - } - - /** - * Get boss bar length - * - * @return length - */ - public float getLength() { - return length; - } - - /** - * Set boss bar length - * - * @param length new length - */ - public void setLength(float length) { - if (this.length != length) { - this.length = length; - this.sendAttributes(); - this.sendSetBossBarLength(); - } - } - - /** - * Color is not working in the current version. We are keep waiting for client support. - * @param color the boss bar color - */ - public void setColor(BlockColor color) { - if (this.color == null || !this.color.equals(color)) { - this.color = color; - this.sendSetBossBarTexture(); - } - } - - public void setColor(int red, int green, int blue) { - this.setColor(new BlockColor(red, green, blue)); - } - - public int getMixedColor() { - return this.color.getRGB(); // (this.color.getRed() << 16 | this.color.getGreen() << 8 | this.color.getBlue()) & 0xffffff; - } - - public BlockColor getColor() { - return this.color; - } - - private void createBossEntity() { - AddEntityPacket pkAdd = new AddEntityPacket(); - pkAdd.type = EntityCreeper.NETWORK_ID; - pkAdd.entityUniqueId = bossBarId; - pkAdd.entityRuntimeId = bossBarId; - pkAdd.x = (float) player.x; - pkAdd.y = (float) -10; // Below the bedrock - pkAdd.z = (float) player.z; - pkAdd.speedX = 0; - pkAdd.speedY = 0; - pkAdd.speedZ = 0; - pkAdd.metadata = new EntityMetadata() - // Default Metadata tags - .putLong(Entity.DATA_FLAGS, 0) - .putShort(Entity.DATA_AIR, 400) - .putShort(Entity.DATA_MAX_AIR, 400) - .putLong(Entity.DATA_LEAD_HOLDER_EID, -1) - .putString(Entity.DATA_NAMETAG, text) // Set the entity name - .putFloat(Entity.DATA_SCALE, 0); // And make it invisible - player.dataPacket(pkAdd); - } - - private void sendAttributes() { - UpdateAttributesPacket pkAttributes = new UpdateAttributesPacket(); - pkAttributes.entityId = bossBarId; - Attribute attr = Attribute.getAttribute(Attribute.MAX_HEALTH); - attr.setMaxValue(100); // Max value - We need to change the max value first, or else the "setValue" will return a IllegalArgumentException - attr.setValue(length); // Entity health - pkAttributes.entries = new Attribute[]{attr}; - player.dataPacket(pkAttributes); - } - - private void sendShowBossBar() { - BossEventPacket pkBoss = new BossEventPacket(); - pkBoss.bossEid = bossBarId; - pkBoss.type = BossEventPacket.TYPE_SHOW; - pkBoss.title = text; - pkBoss.healthPercent = player.protocol >= 361 ? this.length / 100 : this.length; - player.dataPacket(pkBoss); - } - - private void sendHideBossBar() { - BossEventPacket pkBoss = new BossEventPacket(); - pkBoss.bossEid = bossBarId; - pkBoss.type = BossEventPacket.TYPE_HIDE; - player.dataPacket(pkBoss); - } - - private void sendSetBossBarTexture() { - BossEventPacket pk = new BossEventPacket(); - pk.bossEid = this.bossBarId; - pk.type = BossEventPacket.TYPE_TEXTURE; - pk.color = this.getMixedColor(); - player.dataPacket(pk); - } - - private void sendSetBossBarTitle() { - BossEventPacket pkBoss = new BossEventPacket(); - pkBoss.bossEid = bossBarId; - pkBoss.type = BossEventPacket.TYPE_TITLE; - pkBoss.title = text; - pkBoss.healthPercent = player.protocol >= 361 ? this.length / 100 : this.length; - player.dataPacket(pkBoss); - } - - private void sendSetBossBarLength() { - if (player.protocol >= 361) { // Again, what the hell is this and where is the documentation? - BossEventPacket pkBoss = new BossEventPacket(); - pkBoss.bossEid = bossBarId; - pkBoss.type = BossEventPacket.TYPE_HEALTH_PERCENT; - pkBoss.healthPercent = this.length / 100; - player.dataPacket(pkBoss); - } - } - - /** - * Don't let the entity go too far from the player, or the BossBar will disappear. - * Update boss entity's position when teleport and each 5s. - */ - public void updateBossEntityPosition() { - MoveEntityAbsolutePacket pk = new MoveEntityAbsolutePacket(); - pk.eid = this.bossBarId; - pk.x = this.player.x; - pk.y = -10; - pk.z = this.player.z; - pk.headYaw = 0; - pk.yaw = 0; - pk.pitch = 0; - player.dataPacket(pk); - } - - private void updateBossEntityNameTag() { - SetEntityDataPacket pk = new SetEntityDataPacket(); - pk.eid = this.bossBarId; - pk.metadata = new EntityMetadata().putString(Entity.DATA_NAMETAG, this.text); - player.dataPacket(pk); - } - - private void removeBossEntity() { - RemoveEntityPacket pkRemove = new RemoveEntityPacket(); - pkRemove.eid = bossBarId; - player.dataPacket(pkRemove); - } - - public void create() { - createBossEntity(); - sendAttributes(); - sendShowBossBar(); - sendSetBossBarLength(); - if (color != null) this.sendSetBossBarTexture(); - } - - /** - * Once the player has teleported, resend Show BossBar - */ - public void reshow() { - updateBossEntityPosition(); - sendShowBossBar(); - sendSetBossBarLength(); - } - - public void destroy() { - sendHideBossBar(); - removeBossEntity(); - } -} diff --git a/src/main/java/cn/nukkit/utils/DyeColor.java b/src/main/java/cn/nukkit/utils/DyeColor.java deleted file mode 100644 index 404fc4174..000000000 --- a/src/main/java/cn/nukkit/utils/DyeColor.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.nukkit.utils; - -/** - * Dye color enum - */ -public enum DyeColor { - - BLACK(0, 15, "Black", "Ink Sack", BlockColor.BLACK_BLOCK_COLOR), - RED(1, 14, "Red", "Rose Red", BlockColor.RED_BLOCK_COLOR), - GREEN(2, 13, "Green", "Cactus Green", BlockColor.GREEN_BLOCK_COLOR), - BROWN(3, 12, "Brown", "Cocoa Beans", BlockColor.BROWN_BLOCK_COLOR), - BLUE(4, 11, "Blue", "Lapis Lazuli", BlockColor.BLUE_BLOCK_COLOR), - PURPLE(5, 10, "Purple", BlockColor.PURPLE_BLOCK_COLOR), - CYAN(6, 9, "Cyan", BlockColor.CYAN_BLOCK_COLOR), - LIGHT_GRAY(7, 8, "Light Gray", BlockColor.LIGHT_GRAY_BLOCK_COLOR), - GRAY(8, 7, "Gray", BlockColor.GRAY_BLOCK_COLOR), - PINK(9, 6, "Pink", BlockColor.PINK_BLOCK_COLOR), - LIME(10, 5, "Lime", BlockColor.LIME_BLOCK_COLOR), - YELLOW(11, 4, "Yellow", "Dandelion Yellow", BlockColor.YELLOW_BLOCK_COLOR), - LIGHT_BLUE(12, 3, "Light Blue", BlockColor.LIGHT_BLUE_BLOCK_COLOR), - MAGENTA(13, 2, "Magenta", BlockColor.MAGENTA_BLOCK_COLOR), - ORANGE(14, 1, "Orange", BlockColor.ORANGE_BLOCK_COLOR), - WHITE(15, 0, "White", "Bone Meal", BlockColor.WHITE_BLOCK_COLOR); - - private final int dyeColorMeta; - private final int woolColorMeta; - private final String colorName; - private final String dyeName; - private final BlockColor blockColor; - - private final static DyeColor[] BY_WOOL_DATA; - private final static DyeColor[] BY_DYE_DATA; - - DyeColor(int dyeColorMeta, int woolColorMeta, String colorName, BlockColor blockColor) { - this(dyeColorMeta, woolColorMeta, colorName, colorName + " Dye", blockColor); - } - - DyeColor(int dyeColorMeta, int woolColorMeta, String colorName, String dyeName, BlockColor blockColor) { - this.dyeColorMeta = dyeColorMeta; - this.woolColorMeta = woolColorMeta; - this.colorName = colorName; - this.blockColor = blockColor; - this.dyeName = dyeName; - } - - /** - * Get as BlockColor - * - * @return BlockColor of the DyeColor - */ - public BlockColor getColor() { - return this.blockColor; - } - - /** - * Get as dye item meta value - * - * @return dye item meta value of the DyeColor - */ - public int getDyeData() { - return this.dyeColorMeta; - } - - /** - * Get as wool block meta value - * - * @return wool block meta value of the DyeColor - */ - public int getWoolData() { - return this.woolColorMeta; - } - - /** - * Get color name - * - * @return color name - */ - public String getName() { - return this.colorName; - } - - /** - * Get dye name - * - * @return dye name - */ - public String getDyeName() { - return this.dyeName; - } - - static { - BY_DYE_DATA = values(); - BY_WOOL_DATA = values(); - - for (DyeColor color : values()) { - BY_WOOL_DATA[color.woolColorMeta & 0x0f] = color; - BY_DYE_DATA[color.dyeColorMeta & 0x0f] = color; - } - } - - /** - * Get DyeColor by dye item meta value - * - * @param dyeColorMeta dye item meta value - * @return DyeColor - */ - public static DyeColor getByDyeData(int dyeColorMeta) { - return BY_DYE_DATA[dyeColorMeta & 0x0f]; - } - - /** - * Get DyeColor by wool block meta value - * - * @param woolColorMeta wool block meta value - * @return DyeColor - */ - public static DyeColor getByWoolData(int woolColorMeta) { - return BY_WOOL_DATA[woolColorMeta & 0x0f]; - } -} diff --git a/src/main/java/cn/nukkit/utils/EntitySpawner.java b/src/main/java/cn/nukkit/utils/EntitySpawner.java deleted file mode 100644 index ced88487e..000000000 --- a/src/main/java/cn/nukkit/utils/EntitySpawner.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Player; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; - -/** - * Interface of a mob spawner - */ -public interface EntitySpawner { - - /** - * Find safe coordinates and attempt to spawn a mob - */ - void spawn(); - - /** - * Run the spawner - * - * @param player player - * @param pos safe position - * @param level world - */ - void spawn(Player player, Position pos, Level level); - - /** - * Get entity network id of this mob spawner - * - * @return entity network id - */ - int getEntityNetworkId(); -} diff --git a/src/main/java/cn/nukkit/utils/EventException.java b/src/main/java/cn/nukkit/utils/EventException.java deleted file mode 100644 index ca0b487b0..000000000 --- a/src/main/java/cn/nukkit/utils/EventException.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.nukkit.utils; - -/** - * EventException - * - * @author MagicDroidX - * Nukkit Project - */ -public class EventException extends RuntimeException { - - private final Throwable cause; - - /** - * Constructs a new EventException based on the given Exception - * - * @param throwable Exception that triggered this Exception - */ - public EventException(Throwable throwable) { - cause = throwable; - } - - /** - * Constructs a new EventException - */ - public EventException() { - cause = null; - } - - /** - * Constructs a new EventException with the given message - * - * @param cause The exception that caused this - * @param message The message - */ - public EventException(Throwable cause, String message) { - super(message); - this.cause = cause; - } - - /** - * Constructs a new EventException with the given message - * - * @param message The message - */ - public EventException(String message) { - super(message); - cause = null; - } - - /** - * If applicable, returns the Exception that triggered this Exception - * - * @return Inner exception, or null if one does not exist - */ - @Override - public Throwable getCause() { - return cause; - } -} diff --git a/src/main/java/cn/nukkit/utils/Faceable.java b/src/main/java/cn/nukkit/utils/Faceable.java deleted file mode 100644 index 53ea2dc72..000000000 --- a/src/main/java/cn/nukkit/utils/Faceable.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.math.BlockFace; - -/** - * Interface of a faceable Block - */ -public interface Faceable { - - /** - * Get BlockFace of the direction the block is facing - * - * @return BlockFace of the direction the block is facing - */ - BlockFace getBlockFace(); -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/utils/Hash.java b/src/main/java/cn/nukkit/utils/Hash.java deleted file mode 100644 index 35ba62c01..000000000 --- a/src/main/java/cn/nukkit/utils/Hash.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.utils; - -/** - * Hash utils - */ -public class Hash { - - public static long hashBlock(int x, int y, int z) { - return y + (((long) x & 0x3FFFFFF) << 8) + (((long) z & 0x3FFFFFF) << 34); - } - - public static final int hashBlockX(long triple) { - return (int) ((((triple >> 8) & 0x3FFFFFF) << 38) >> 38); - } - - public static final int hashBlockY(long triple) { - return (int) (triple & 0xFF); - } - - public static final int hashBlockZ(long triple) { - return (int) ((((triple >> 34) & 0x3FFFFFF) << 38) >> 38); - } -} diff --git a/src/main/java/cn/nukkit/utils/HastebinUtility.java b/src/main/java/cn/nukkit/utils/HastebinUtility.java deleted file mode 100644 index 7ff83a310..000000000 --- a/src/main/java/cn/nukkit/utils/HastebinUtility.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.nukkit.utils; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * An utility that is used to send debugpaste reports to hastebin.com - */ -public class HastebinUtility { - - public static final String BIN_URL = "https://www.toptal.com/developers/hastebin/documents", USER_AGENT = "Mozilla/5.0"; - public static final Pattern PATTERN = Pattern.compile("\\{\"key\":\"([\\S\\s]*)\"}"); - - /** - * Upload text to hastebin.com - * - * @param string text - * @return hastebin.com link of the uploaded content - * @throws IOException error - */ - public static String upload(final String string) throws IOException { - final URL url = new URL(BIN_URL); - final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - - connection.setRequestMethod("POST"); - connection.setRequestProperty("User-Agent", USER_AGENT); - connection.setDoOutput(true); - - try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { - outputStream.write(string.getBytes()); - outputStream.flush(); - } - - StringBuilder response; - try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { - response = new StringBuilder(); - - String inputLine; - while ((inputLine = in.readLine()) != null) { - response.append(inputLine); - } - } - - Matcher matcher = PATTERN.matcher(response.toString()); - if (matcher.matches()) { - return "https://www.toptal.com/developers/hastebin/" + matcher.group(1); - } else { - throw new RuntimeException("Couldn't read response!"); - } - } - - /** - * Upload a File to hastebin.com - * - * @param file file - * @return hastebin.com link of the uploaded content - * @throws IOException error - */ - public static String upload(final File file) throws IOException { - final StringBuilder content = new StringBuilder(); - List lines = new ArrayList<>(); - try (BufferedReader reader = new BufferedReader(new FileReader(file))) { - String line; - while ((line = reader.readLine()) != null) { - if (!line.contains("rcon.password=")) { - lines.add(line); - } - } - } - for (int i = Math.max(0, lines.size() - 1000); i < lines.size(); i++) { - content.append(lines.get(i)).append('\n'); - } - return upload(content.toString()); - } -} diff --git a/src/main/java/cn/nukkit/utils/IterableThreadLocal.java b/src/main/java/cn/nukkit/utils/IterableThreadLocal.java deleted file mode 100644 index 4c074d7f0..000000000 --- a/src/main/java/cn/nukkit/utils/IterableThreadLocal.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Server; - -import java.lang.ref.Reference; -import java.lang.reflect.Array; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.concurrent.ConcurrentLinkedDeque; - -public abstract class IterableThreadLocal extends ThreadLocal implements Iterable { - - private final ConcurrentLinkedDeque allValues = new ConcurrentLinkedDeque<>(); - - @Override - protected final T initialValue() { - T value = init(); - if (value != null) { - allValues.add(value); - } - return value; - } - - @Override - public final Iterator iterator() { - return getAll().iterator(); - } - - public T init() { - return null; - } - - public void clean() { - IterableThreadLocal.clean(this); - } - - public static void clean(ThreadLocal instance) { - try { - ThreadGroup rootGroup = Thread.currentThread( ).getThreadGroup( ); - ThreadGroup parentGroup; - while ( ( parentGroup = rootGroup.getParent() ) != null ) { - rootGroup = parentGroup; - } - Thread[] threads = new Thread[ rootGroup.activeCount() ]; - if (threads.length != 0) { - while (rootGroup.enumerate(threads, true) == threads.length) { - threads = new Thread[(threads.length << 1)]; - } - } - Field tl = Thread.class.getDeclaredField("threadLocals"); - tl.setAccessible(true); - Method methodRemove = null; - for (Thread thread : threads) { - if (thread != null) { - Object tlm = tl.get(thread); - if (tlm != null) { - if (methodRemove == null) { - methodRemove = tlm.getClass().getDeclaredMethod("remove", ThreadLocal.class); - methodRemove.setAccessible(true); - } - try { - methodRemove.invoke(tlm, instance); - } catch (Throwable ignore) {} - } - } - } - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - } - } - - public static void cleanAll() { - try { - // Get a reference to the thread locals table of the current thread - Thread thread = Thread.currentThread(); - Field threadLocalsField = Thread.class.getDeclaredField("threadLocals"); - threadLocalsField.setAccessible(true); - Object threadLocalTable = threadLocalsField.get(thread); - - // Get a reference to the array holding the thread local variables inside the - // ThreadLocalMap of the current thread - Class threadLocalMapClass = Class.forName("java.lang.ThreadLocal$ThreadLocalMap"); - Field tableField = threadLocalMapClass.getDeclaredField("table"); - tableField.setAccessible(true); - Object table = tableField.get(threadLocalTable); - - // The key to the ThreadLocalMap is a WeakReference object. The referent field of this object - // is a reference to the actual ThreadLocal variable - Field referentField = Reference.class.getDeclaredField("referent"); - referentField.setAccessible(true); - - for (int i = 0; i < Array.getLength(table); i++) { - // Each entry in the table array of ThreadLocalMap is an Entry object - // representing the thread local reference and its value - Object entry = Array.get(table, i); - if (entry != null) { - // Get a reference to the thread local object and remove it from the table - ThreadLocal threadLocal = (ThreadLocal)referentField.get(entry); - clean(threadLocal); - } - } - } catch (Exception e) { - // We will tolerate an exception here and just log it - throw new IllegalStateException(e); - } - } - - public final Collection getAll() { - return Collections.unmodifiableCollection(allValues); - } - - @Override - protected void finalize() throws Throwable { - clean(this); - super.finalize(); - } -} diff --git a/src/main/java/cn/nukkit/utils/JsonUtil.java b/src/main/java/cn/nukkit/utils/JsonUtil.java deleted file mode 100644 index c9a5c35da..000000000 --- a/src/main/java/cn/nukkit/utils/JsonUtil.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.nukkit.utils; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -import java.util.*; -import java.util.function.Function; - -/** - * Various methods for more compact JSON object constructing - * - * @author Tee7even - */ -@SuppressWarnings("unchecked") -public class JsonUtil { - - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - - public static JsonArray toArray(Object... objects) { - List array = new ArrayList(); - Collections.addAll(array, objects); - return GSON.toJsonTree(array).getAsJsonArray(); - } - - public static JsonObject toObject(Object object) { - return GSON.toJsonTree(object).getAsJsonObject(); - } - - public static JsonObject mapToObject(Iterable collection, Function mapper) { - Map object = new LinkedHashMap(); - for (E e : collection) { - JSONPair pair = mapper.apply(e); - if (pair != null) { - object.put(pair.key, pair.value); - } - } - return GSON.toJsonTree(object).getAsJsonObject(); - } - - public static JsonArray mapToArray(E[] elements, Function mapper) { - ArrayList array = new ArrayList(); - Collections.addAll(array, elements); - return mapToArray(array, mapper); - } - - public static JsonArray mapToArray(Iterable collection, Function mapper) { - List array = new ArrayList(); - for (E e : collection) { - Object obj = mapper.apply(e); - if (obj != null) { - array.add(obj); - } - } - return GSON.toJsonTree(array).getAsJsonArray(); - } - - /** - * JSON Pair - */ - public static class JSONPair { - public final String key; - public final Object value; - - public JSONPair(String key, Object value) { - this.key = key; - this.value = value; - } - - public JSONPair(int key, Object value) { - this.key = String.valueOf(key); - this.value = value; - } - } -} diff --git a/src/main/java/cn/nukkit/utils/LevelException.java b/src/main/java/cn/nukkit/utils/LevelException.java deleted file mode 100644 index 44f9a5c95..000000000 --- a/src/main/java/cn/nukkit/utils/LevelException.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.nukkit.utils; - -/** - * LevelException - * - * @author MagicDroidX - * Nukkit Project - */ -public class LevelException extends ServerException { - - public LevelException(String message) { - super(message); - } -} diff --git a/src/main/java/cn/nukkit/utils/LevelTimings.java b/src/main/java/cn/nukkit/utils/LevelTimings.java deleted file mode 100644 index 9239b23c4..000000000 --- a/src/main/java/cn/nukkit/utils/LevelTimings.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.level.Level; -import co.aikar.timings.Timing; -import co.aikar.timings.TimingsManager; - -/** - * Level timings - * - * @author Pub4Game - * @author Tee7even - */ -public class LevelTimings { - - public final Timing doChunkUnload; - public final Timing doTickPending; - public final Timing doChunkGC; - public final Timing doTick; - - public final Timing tickChunks; - public final Timing entityTick; - public final Timing blockEntityTick; - - public final Timing syncChunkSendTimer; - public final Timing syncChunkSendPrepareTimer; - public final Timing syncChunkLoadTimer; - public final Timing syncChunkLoadDataTimer; - public final Timing syncChunkLoadEntitiesTimer; - public final Timing syncChunkLoadBlockEntitiesTimer; - - public LevelTimings(Level level) { - String name = level.getFolderName() + " - "; - - this.doChunkUnload = TimingsManager.getTiming(name + "doChunkUnload"); - this.doTickPending = TimingsManager.getTiming(name + "doTickPending"); - this.doChunkGC = TimingsManager.getTiming(name + "doChunkGC"); - this.doTick = TimingsManager.getTiming(name + "doTick"); - - this.tickChunks = TimingsManager.getTiming(name + "tickChunks"); - this.entityTick = TimingsManager.getTiming(name + "entityTick"); - this.blockEntityTick = TimingsManager.getTiming(name + "blockEntityTick"); - - this.syncChunkSendTimer = TimingsManager.getTiming(name + "syncChunkSend"); - this.syncChunkSendPrepareTimer = TimingsManager.getTiming(name + "syncChunkSendPrepare"); - this.syncChunkLoadTimer = TimingsManager.getTiming(name + "syncChunkLoad"); - this.syncChunkLoadDataTimer = TimingsManager.getTiming(name + "syncChunkLoad - Data"); - this.syncChunkLoadEntitiesTimer = TimingsManager.getTiming(name + "syncChunkLoad - Entities"); - this.syncChunkLoadBlockEntitiesTimer = TimingsManager.getTiming(name + "syncChunkLoad - BlockEntities"); - } -} diff --git a/src/main/java/cn/nukkit/utils/LogLevel.java b/src/main/java/cn/nukkit/utils/LogLevel.java deleted file mode 100644 index 0d4ee1939..000000000 --- a/src/main/java/cn/nukkit/utils/LogLevel.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.nukkit.utils; - -import org.apache.logging.log4j.util.TriConsumer; - -import java.util.function.BiConsumer; - -/** - * Log level enum - * - * @author MagicDroidX - * Nukkit Project - */ -public enum LogLevel implements Comparable { - - NONE((logger, message) -> {}, (mainLogger, s, throwable) -> {}), - EMERGENCY(MainLogger::emergency, MainLogger::emergency), - ALERT(MainLogger::alert, MainLogger::alert), - CRITICAL(MainLogger::critical, MainLogger::critical), - ERROR(MainLogger::error, MainLogger::error), - WARNING(MainLogger::warning, MainLogger::warning), - NOTICE(MainLogger::notice, MainLogger::notice), - INFO(MainLogger::info, MainLogger::info), - DEBUG(MainLogger::debug, MainLogger::debug); - - /** - * Default logging level: INFO - */ - public static final LogLevel DEFAULT_LEVEL = INFO; - - private final BiConsumer logTo; - private final TriConsumer logThrowableTo; - - LogLevel(BiConsumer logTo, TriConsumer logThrowableTo) { - this.logTo = logTo; - this.logThrowableTo = logThrowableTo; - } - - public void log(MainLogger logger, String message) { - logTo.accept(logger, message); - } - - public void log(MainLogger logger, String message, Throwable throwable) { - logThrowableTo.accept(logger, message, throwable); - } - - /** - * Get log level - * - * @return log level - */ - public int getLevel() { - return ordinal(); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/utils/Logger.java b/src/main/java/cn/nukkit/utils/Logger.java deleted file mode 100644 index 0db36e86b..000000000 --- a/src/main/java/cn/nukkit/utils/Logger.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.utils; - -/** - * Logger - * - * @author MagicDroidX - * Nukkit Project - */ -public interface Logger { - - void emergency(String message); - - void alert(String message); - - void critical(String message); - - void error(String message); - - void warning(String message); - - void notice(String message); - - void info(String message); - - void debug(String message); - - void log(LogLevel level, String message); - - void emergency(String message, Throwable t); - - void alert(String message, Throwable t); - - void critical(String message, Throwable t); - - void error(String message, Throwable t); - - void warning(String message, Throwable t); - - void notice(String message, Throwable t); - - void info(String message, Throwable t); - - void debug(String message, Throwable t); - - void log(LogLevel level, String message, Throwable t); -} diff --git a/src/main/java/cn/nukkit/utils/LoginChainData.java b/src/main/java/cn/nukkit/utils/LoginChainData.java deleted file mode 100644 index 1ac987d24..000000000 --- a/src/main/java/cn/nukkit/utils/LoginChainData.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.nukkit.utils; - -import com.google.gson.JsonObject; - -import java.util.UUID; - -/** - * Login chain data - * - * @author CreeperFace - */ -public interface LoginChainData { - - String getUsername(); - - UUID getClientUUID(); - - String getIdentityPublicKey(); - - long getClientId(); - - String getServerAddress(); - - String getDeviceModel(); - - int getDeviceOS(); - - String getDeviceId(); - - String getGameVersion(); - - int getGuiScale(); - - String getLanguageCode(); - - String getXUID(); - - boolean isXboxAuthed(); - - int getCurrentInputMode(); - - int getDefaultInputMode(); - - String getCapeData(); - - int getUIProfile(); - - JsonObject getRawData(); -} diff --git a/src/main/java/cn/nukkit/utils/MainLogger.java b/src/main/java/cn/nukkit/utils/MainLogger.java deleted file mode 100644 index 234404782..000000000 --- a/src/main/java/cn/nukkit/utils/MainLogger.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.nukkit.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.log4j.Log4j2; - -/** - * Main logger - * - * @author MagicDroidX - * Nukkit - */ -@Log4j2 -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class MainLogger extends Thread implements Logger { - - private static final MainLogger logger = new MainLogger(); - - public static MainLogger getLogger() { - return logger; - } - - @Override - public void emergency(String message) { - log.fatal(message); - } - - @Override - public void alert(String message) { - log.warn(message); - } - - @Override - public void critical(String message) { - log.fatal(message); - } - - @Override - public void error(String message) { - log.error(message); - } - - @Override - public void warning(String message) { - log.warn(message); - } - - @Override - public void notice(String message) { - log.warn(message); - } - - @Override - public void info(String message) { - log.info(message); - } - - @Override - public void debug(String message) { - log.debug(message); - } - - public void logException(Throwable t) { - log.throwing(t); - } - - @Override - public void log(LogLevel level, String message) { - level.log(this, message); - } - - @Override - public void emergency(String message, Throwable t) { - log.fatal(message, t); - } - - @Override - public void alert(String message, Throwable t) { - log.warn(message, t); - } - - @Override - public void critical(String message, Throwable t) { - log.fatal(message, t); - } - - @Override - public void error(String message, Throwable t) { - log.error(message, t); - } - - @Override - public void warning(String message, Throwable t) { - log.warn(message, t); - } - - @Override - public void notice(String message, Throwable t) { - log.warn(message, t); - } - - @Override - public void info(String message, Throwable t) { - log.info(message, t); - } - - @Override - public void debug(String message, Throwable t) { - log.debug(message, t); - } - - @Override - public void log(LogLevel level, String message, Throwable t) { - level.log(this, message, t); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/utils/MinecartType.java b/src/main/java/cn/nukkit/utils/MinecartType.java deleted file mode 100644 index 3b8b118c4..000000000 --- a/src/main/java/cn/nukkit/utils/MinecartType.java +++ /dev/null @@ -1,100 +0,0 @@ -package cn.nukkit.utils; - -import java.util.HashMap; -import java.util.Map; - -/** - * Helper class of Minecart variants - * - * By Adam Matthew - * Creation time: 2017/7/17 19:55. - */ -public enum MinecartType { - /** - * Represents an empty vehicle. - */ - MINECART_EMPTY(0, false, "Minecart"), - /** - * Represents a chest holder. - */ - MINECART_CHEST(1, true, "Minecart with Chest"), - /** - * Represents a furnace minecart. - */ - MINECART_FURNACE(2, true, "Minecart with Furnace"), - /** - * Represents a TNT minecart. - */ - MINECART_TNT(3, true, "Minecart with TNT"), - /** - * Represents a mob spawner minecart. - */ - MINECART_MOB_SPAWNER(4, true, "Minecart with Mob Spawner"), - /** - * Represents a hopper minecart. - */ - MINECART_HOPPER(5, true, "Minecart with Hopper"), - /** - * Represents a command block minecart. - */ - MINECART_COMMAND_BLOCK(6, true, "Minecart with Command Block"), - /** - * Represents an unknown minecart. - */ - MINECART_UNKNOWN(-1, false, "Unknown Minecart"); - - private final int type; - private final boolean hasBlockInside; - private final String realName; - private static final Map TYPES = new HashMap<>(); - - static { - for (MinecartType var3 : values()) { - TYPES.put(var3.type, var3); - } - } - - MinecartType(int number, boolean hasBlockInside, String name) { - type = number; - this.hasBlockInside = hasBlockInside; - realName = name; - } - - /** - * Get the variants of the current minecart - * - * @return Integer - */ - public int getId() { - return type; - } - - /** - * Get the name of the minecart variants - * - * @return String - */ - public String getName() { - return realName; - } - - /** - * Gets if the minecart contains block - * - * @return Boolean - */ - public boolean hasBlockInside() { - return hasBlockInside; - } - - /** - * Returns of an instance of Minecart-variants - * - * @param types The number of minecart - * @return Integer - */ - public static MinecartType valueOf(int types) { - MinecartType what = TYPES.get(types); - return what == null ? MINECART_UNKNOWN : what; - } -} diff --git a/src/main/java/cn/nukkit/utils/PersonaPiece.java b/src/main/java/cn/nukkit/utils/PersonaPiece.java deleted file mode 100644 index 6edaed094..000000000 --- a/src/main/java/cn/nukkit/utils/PersonaPiece.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.nukkit.utils; - -import lombok.ToString; - -/** - * Persona skin piece - */ -@ToString -public class PersonaPiece { - - public final String id; - public final String type; - public final String packId; - public final boolean isDefault; - public final String productId; - - public PersonaPiece(String id, String type, String packId, boolean isDefault, String productId) { - this.id = id; - this.type = type; - this.packId = packId; - this.isDefault = isDefault; - this.productId = productId; - } -} diff --git a/src/main/java/cn/nukkit/utils/PersonaPieceTint.java b/src/main/java/cn/nukkit/utils/PersonaPieceTint.java deleted file mode 100644 index fb6cfedc9..000000000 --- a/src/main/java/cn/nukkit/utils/PersonaPieceTint.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.nukkit.utils; - -import com.google.common.collect.ImmutableList; -import lombok.ToString; - -import java.util.List; - -/** - * Persona skin piece tint - */ -@ToString -public class PersonaPieceTint { - - public final String pieceType; - public final ImmutableList colors; - - public PersonaPieceTint(String pieceType, List colors) { - this.pieceType = pieceType; - this.colors = ImmutableList.copyOf(colors); - } -} diff --git a/src/main/java/cn/nukkit/utils/PlayerDataSerializer.java b/src/main/java/cn/nukkit/utils/PlayerDataSerializer.java deleted file mode 100644 index bd9388e52..000000000 --- a/src/main/java/cn/nukkit/utils/PlayerDataSerializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.utils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Optional; -import java.util.UUID; - -/** - * A serializer that handles the player data saving. - * - * Use setPlayerDataSerializer() in Server to register it. - */ -public interface PlayerDataSerializer { - - /** - * Reads player data from {@link InputStream} if the file exists otherwise it will create the default data. - * - * @param name name of player or {@link UUID} as {@link String} - * @param uuid uuid of player. Could be null if name is used. - * @return {@link InputStream} if the player data exists - */ - Optional read(String name, UUID uuid) throws IOException; - - /** - * Writes player data to given {@link OutputStream}. - * - * @param name name of player or {@link UUID} as {@link String} - * @param uuid uuid of player. Could be null if name is used. - * @return stream to write player data - */ - OutputStream write(String name, UUID uuid) throws IOException; -} diff --git a/src/main/java/cn/nukkit/utils/PluginException.java b/src/main/java/cn/nukkit/utils/PluginException.java deleted file mode 100644 index c9d19c71d..000000000 --- a/src/main/java/cn/nukkit/utils/PluginException.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.utils; - -/** - * PluginException - * - * @author MagicDroidX - * Nukkit Project - */ -public class PluginException extends ServerException { - - public PluginException(String message) { - super(message); - } - - public PluginException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/cn/nukkit/utils/Rail.java b/src/main/java/cn/nukkit/utils/Rail.java deleted file mode 100644 index d0ba86200..000000000 --- a/src/main/java/cn/nukkit/utils/Rail.java +++ /dev/null @@ -1,177 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.block.Block; -import cn.nukkit.math.BlockFace; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Stream; - -import static cn.nukkit.math.BlockFace.*; -import static cn.nukkit.utils.Rail.Orientation.State.*; - -/** - * INTERNAL helper class of railway - * - * By lmlstarqaq http://snake1999.com/ - * Creation time: 2017/7/1 17:42. - */ -public final class Rail { - - /** - * Check if the block is a rail block - * - * @param block block - * @return is rail block - */ - public static boolean isRailBlock(Block block) { - Objects.requireNonNull(block, "Rail block predicate can not accept null block"); - return isRailBlock(block.getId()); - } - - /** - * Rail orientation enum - */ - public enum Orientation { - STRAIGHT_NORTH_SOUTH(0, STRAIGHT, NORTH, SOUTH, null), - STRAIGHT_EAST_WEST(1, STRAIGHT, EAST, WEST, null), - ASCENDING_EAST(2, ASCENDING, EAST, WEST, EAST), - ASCENDING_WEST(3, ASCENDING, EAST, WEST, WEST), - ASCENDING_NORTH(4, ASCENDING, NORTH, SOUTH, NORTH), - ASCENDING_SOUTH(5, ASCENDING, NORTH, SOUTH, SOUTH), - CURVED_SOUTH_EAST(6, CURVED, SOUTH, EAST, null), - CURVED_SOUTH_WEST(7, CURVED, SOUTH, WEST, null), - CURVED_NORTH_WEST(8, CURVED, NORTH, WEST, null), - CURVED_NORTH_EAST(9, CURVED, NORTH, EAST, null); - - private static final Orientation[] META_LOOKUP = new Orientation[values().length]; - private final int meta; - private final State state; - private final List connectingDirections; - private final BlockFace ascendingDirection; - - Orientation(int meta, State state, BlockFace from, BlockFace to, BlockFace ascendingDirection) { - this.meta = meta; - this.state = state; - this.connectingDirections = Arrays.asList(from, to); - this.ascendingDirection = ascendingDirection; - } - - public static Orientation byMetadata(int meta) { - if (meta < 0 || meta >= META_LOOKUP.length) { - meta = 0; - } - - return META_LOOKUP[meta]; - } - - public static Orientation straight(BlockFace face) { - switch (face) { - case NORTH: - case SOUTH: - return STRAIGHT_NORTH_SOUTH; - case EAST: - case WEST: - return STRAIGHT_EAST_WEST; - } - return STRAIGHT_NORTH_SOUTH; - } - - public static Orientation ascending(BlockFace face) { - switch (face) { - case NORTH: - return ASCENDING_NORTH; - case SOUTH: - return ASCENDING_SOUTH; - case EAST: - return ASCENDING_EAST; - case WEST: - return ASCENDING_WEST; - } - return ASCENDING_EAST; - } - - public static Orientation curved(BlockFace f1, BlockFace f2) { - for (Orientation o : new Orientation[]{CURVED_SOUTH_EAST, CURVED_SOUTH_WEST, CURVED_NORTH_WEST, CURVED_NORTH_EAST}) { - if (o.connectingDirections.contains(f1) && o.connectingDirections.contains(f2)) { - return o; - } - } - return CURVED_SOUTH_EAST; - } - - public static Orientation straightOrCurved(BlockFace f1, BlockFace f2) { - for (Orientation o : new Orientation[]{STRAIGHT_NORTH_SOUTH, STRAIGHT_EAST_WEST, CURVED_SOUTH_EAST, CURVED_SOUTH_WEST, CURVED_NORTH_WEST, CURVED_NORTH_EAST}) { - if (o.connectingDirections.contains(f1) && o.connectingDirections.contains(f2)) { - return o; - } - } - return STRAIGHT_NORTH_SOUTH; - } - - public int metadata() { - return meta; - } - - public boolean hasConnectingDirections(BlockFace... faces) { - return Stream.of(faces).allMatch(connectingDirections::contains); - } - - public List connectingDirections() { - return connectingDirections; - } - - public Optional ascendingDirection() { - return Optional.ofNullable(ascendingDirection); - } - - /** - * Rail orientation state enum - */ - public enum State { - STRAIGHT, ASCENDING, CURVED - } - - public boolean isStraight() { - return state == STRAIGHT; - } - - public boolean isAscending() { - return state == ASCENDING; - } - - public boolean isCurved() { - return state == CURVED; - } - - static { - for (Orientation o : values()) { - META_LOOKUP[o.meta] = o; - } - } - } - - /** - * Check if the block is a rail block - * - * @param blockId block id - * @return is rail block - */ - public static boolean isRailBlock(int blockId) { - switch (blockId) { - case Block.RAIL: - case Block.POWERED_RAIL: - case Block.ACTIVATOR_RAIL: - case Block.DETECTOR_RAIL: - return true; - default: - return false; - } - } - - private Rail() { - //no instance - } -} diff --git a/src/main/java/cn/nukkit/utils/SerializedImage.java b/src/main/java/cn/nukkit/utils/SerializedImage.java deleted file mode 100644 index 3da3740fe..000000000 --- a/src/main/java/cn/nukkit/utils/SerializedImage.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.nukkit.utils; - -import lombok.ToString; - -import java.util.Objects; - -import static cn.nukkit.entity.data.Skin.*; - -/** - * Serialized image - */ -@ToString(exclude = {"data"}) -public class SerializedImage { - - /** - * Empty SerializedImage - */ - public static final SerializedImage EMPTY = new SerializedImage(0, 0, new byte[0]); - - public final int width; - public final int height; - public final byte[] data; - - public SerializedImage(int width, int height, byte[] data) { - this.width = width; - this.height = height; - this.data = data; - } - - /** - * Get SerializedImage from legacy skin data - * - * @param skinData legacy skin data bytes - * @return SerializedImage - */ - public static SerializedImage fromLegacy(byte[] skinData) { - Objects.requireNonNull(skinData, "skinData"); - switch (skinData.length) { - case SINGLE_SKIN_SIZE: - return new SerializedImage(64, 32, skinData); - case DOUBLE_SKIN_SIZE: - return new SerializedImage(64, 64, skinData); - case SKIN_128_64_SIZE: - return new SerializedImage(128, 64, skinData); - case SKIN_128_128_SIZE: - return new SerializedImage(128, 128, skinData); - } - throw new IllegalArgumentException("Unknown legacy skin size"); - } -} diff --git a/src/main/java/cn/nukkit/utils/ServerException.java b/src/main/java/cn/nukkit/utils/ServerException.java deleted file mode 100644 index 365011fc9..000000000 --- a/src/main/java/cn/nukkit/utils/ServerException.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.nukkit.utils; - -/** - * ServerException - * - * @author MagicDroidX - * Nukkit Project - */ -public class ServerException extends RuntimeException { - - public ServerException(String message) { - super(message); - } - - public ServerException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/cn/nukkit/utils/ServerKiller.java b/src/main/java/cn/nukkit/utils/ServerKiller.java deleted file mode 100644 index db3fca065..000000000 --- a/src/main/java/cn/nukkit/utils/ServerKiller.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.nukkit.utils; - -import java.util.concurrent.TimeUnit; - -/** - * A task that kills the server process after given time. - * - * @author MagicDroidX - * Nukkit Project - */ -public class ServerKiller extends Thread { - - public final long sleepTime; - - public ServerKiller(long time) { - this(time, TimeUnit.SECONDS); - } - - public ServerKiller(long time, TimeUnit unit) { - this.sleepTime = unit.toMillis(time); - this.setName("ServerKiller"); - } - - @Override - public void run() { - try { - sleep(sleepTime); - } catch (InterruptedException ignored) {} - System.exit(1); - } -} diff --git a/src/main/java/cn/nukkit/utils/SimpleConfig.java b/src/main/java/cn/nukkit/utils/SimpleConfig.java deleted file mode 100644 index ec0940634..000000000 --- a/src/main/java/cn/nukkit/utils/SimpleConfig.java +++ /dev/null @@ -1,156 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Server; -import cn.nukkit.plugin.Plugin; - -import java.io.File; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.List; - -/** - * Simple config for Nukkit - * - * Added 11/02/2016 by fromgate - */ -public abstract class SimpleConfig { - - private final File configFile; - - public SimpleConfig(Plugin plugin) { - this(plugin, "config.yml"); - } - - public SimpleConfig(Plugin plugin, String fileName) { - this(new File(plugin.getDataFolder() + File.separator + fileName)); - } - - public SimpleConfig(File file) { - this.configFile = file; - configFile.getParentFile().mkdirs(); - } - - /** - * Save the config to disk - * - * @return saved - */ - public boolean save() { - return save(false); - } - - /** - * Save the config to disk - * - * @param async async - * @return saved - */ - public boolean save(boolean async) { - if (configFile.exists()) try { - configFile.createNewFile(); - } catch (Exception e) { - return false; - } - Config cfg = new Config(configFile, Config.YAML); - for (Field field : this.getClass().getDeclaredFields()) { - if (skipSave(field)) continue; - String path = getPath(field); - try { - if (path != null) cfg.set(path, field.get(this)); - } catch (Exception e) { - return false; - } - } - cfg.save(async); - return true; - } - - /** - * Load - * - * @return loaded - */ - public boolean load() { - if (!this.configFile.exists()) return false; - Config cfg = new Config(configFile, Config.YAML); - for (Field field : this.getClass().getDeclaredFields()) { - if (field.getName().equals("configFile")) continue; - if (skipSave(field)) continue; - String path = getPath(field); - if (path == null) continue; - if (path.isEmpty()) continue; - field.setAccessible(true); - try { - if (field.getType() == int.class || field.getType() == Integer.class) - field.set(this, cfg.getInt(path, field.getInt(this))); - else if (field.getType() == boolean.class || field.getType() == Boolean.class) - field.set(this, cfg.getBoolean(path, field.getBoolean(this))); - else if (field.getType() == long.class || field.getType() == Long.class) - field.set(this, cfg.getLong(path, field.getLong(this))); - else if (field.getType() == double.class || field.getType() == Double.class) - field.set(this, cfg.getDouble(path, field.getDouble(this))); - else if (field.getType() == String.class) - field.set(this, cfg.getString(path, (String) field.get(this))); - else if (field.getType() == ConfigSection.class) - field.set(this, cfg.getSection(path)); - else if (field.getType() == List.class) { - Type genericFieldType = field.getGenericType(); - if (genericFieldType instanceof ParameterizedType) { - ParameterizedType aType = (ParameterizedType) genericFieldType; - Class fieldArgClass = (Class) aType.getActualTypeArguments()[0]; - if (fieldArgClass == Integer.class) field.set(this, cfg.getIntegerList(path)); - else if (fieldArgClass == Boolean.class) field.set(this, cfg.getBooleanList(path)); - else if (fieldArgClass == Double.class) field.set(this, cfg.getDoubleList(path)); - else if (fieldArgClass == Character.class) field.set(this, cfg.getCharacterList(path)); - else if (fieldArgClass == Byte.class) field.set(this, cfg.getByteList(path)); - else if (fieldArgClass == Float.class) field.set(this, cfg.getFloatList(path)); - else if (fieldArgClass == Short.class) field.set(this, cfg.getFloatList(path)); - else if (fieldArgClass == String.class) field.set(this, cfg.getStringList(path)); - } else field.set(this, cfg.getList(path)); // Hell knows what's kind of List was found :) - } else - throw new IllegalStateException("SimpleConfig did not supports class: " + field.getType().getName() + " for config field " + configFile.getName()); - } catch (Exception e) { - Server.getInstance().getLogger().logException(e); - return false; - } - } - return true; - } - - private static String getPath(Field field) { - String path = null; - if (field.isAnnotationPresent(Path.class)) { - Path pathDefine = field.getAnnotation(Path.class); - path = pathDefine.value(); - } - if (path == null || path.isEmpty()) path = field.getName().replaceAll("_", "."); - if (Modifier.isFinal(field.getModifiers())) return null; - if (Modifier.isPrivate(field.getModifiers())) field.setAccessible(true); - return path; - } - - private static boolean skipSave(Field field) { - if (!field.isAnnotationPresent(Skip.class)) return false; - return field.getAnnotation(Skip.class).skipSave(); - } - - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - public @interface Path { - String value() default ""; - } - - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - public @interface Skip { - boolean skipSave() default true; - - boolean skipLoad() default true; - } -} diff --git a/src/main/java/cn/nukkit/utils/SkinAnimation.java b/src/main/java/cn/nukkit/utils/SkinAnimation.java deleted file mode 100644 index 10bcf2ba1..000000000 --- a/src/main/java/cn/nukkit/utils/SkinAnimation.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.nukkit.utils; - -import lombok.ToString; - -/** - * Skin animation - */ -@ToString -public class SkinAnimation { - - public final SerializedImage image; - public final int type; - public final float frames; - public final int expression; - - public SkinAnimation(SerializedImage image, int type, float frames, int expression) { - this.image = image; - this.type = type; - this.frames = frames; - this.expression = expression; - } -} diff --git a/src/main/java/cn/nukkit/utils/SpawnerTask.java b/src/main/java/cn/nukkit/utils/SpawnerTask.java deleted file mode 100644 index bb2228ce2..000000000 --- a/src/main/java/cn/nukkit/utils/SpawnerTask.java +++ /dev/null @@ -1,373 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.entity.mob.*; -import cn.nukkit.entity.passive.EntityCod; -import cn.nukkit.entity.passive.EntitySalmon; -import cn.nukkit.event.entity.CreatureSpawnEvent; -import cn.nukkit.level.GameRule; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.level.format.generic.BaseFullChunk; -import cn.nukkit.math.Vector3; -import cn.nukkit.utils.spawners.*; - -import java.util.HashMap; -import java.util.Map; - -/** - * Handles the automatic spawning of mobs. - */ -public class SpawnerTask implements Runnable { - - private final Map, EntitySpawner> animalSpawners = new HashMap<>(); - private final Map, EntitySpawner> mobSpawners = new HashMap<>(); - - /** - * Split monster and animal spawning to different ticks to avoid lag spikes - * Animals and monsters are spawned every other time the spawer task runs - */ - private boolean mobsNext; - - public SpawnerTask() { - this.registerAnimalSpawner(ChickenSpawner.class); - this.registerAnimalSpawner(CowSpawner.class); - this.registerAnimalSpawner(DolphinSpawner.class); - this.registerAnimalSpawner(DonkeySpawner.class); - this.registerAnimalSpawner(HorseSpawner.class); - this.registerAnimalSpawner(MooshroomSpawner.class); - this.registerAnimalSpawner(OcelotSpawner.class); - this.registerAnimalSpawner(ParrotSpawner.class); - this.registerAnimalSpawner(PigSpawner.class); - this.registerAnimalSpawner(PolarBearSpawner.class); - this.registerAnimalSpawner(PufferfishSpawner.class); - this.registerAnimalSpawner(RabbitSpawner.class); - this.registerAnimalSpawner(SalmonSpawner.class); - this.registerAnimalSpawner(SheepSpawner.class); - this.registerAnimalSpawner(SquidSpawner.class); - this.registerAnimalSpawner(TropicalFishSpawner.class); - this.registerAnimalSpawner(TurtleSpawner.class); - this.registerAnimalSpawner(WolfSpawner.class); - this.registerAnimalSpawner(PandaSpawner.class); - this.registerAnimalSpawner(FoxSpawner.class); - - this.registerMobSpawner(BlazeSpawner.class); - this.registerMobSpawner(CreeperSpawner.class); - this.registerMobSpawner(EndermanSpawner.class); - this.registerMobSpawner(GhastSpawner.class); - this.registerMobSpawner(HuskSpawner.class); - this.registerMobSpawner(MagmaCubeSpawner.class); - this.registerMobSpawner(SkeletonSpawner.class); - this.registerMobSpawner(SlimeSpawner.class); - this.registerMobSpawner(SpiderSpawner.class); - this.registerMobSpawner(StraySpawner.class); - this.registerMobSpawner(ZombieSpawner.class); - this.registerMobSpawner(ZombiePigmanSpawner.class); - this.registerMobSpawner(WitchSpawner.class); - this.registerMobSpawner(WitherSkeletonSpawner.class); - this.registerMobSpawner(DrownedSpawner.class); - this.registerMobSpawner(PhantomSpawner.class); - this.registerMobSpawner(PiglinSpawner.class); - this.registerMobSpawner(HoglinSpawner.class); - } - - /** - * Register animal spawner - * - * @param clazz spawner class - * @return whether the spawner was registered successfully (no errors and not already registered) - */ - public boolean registerAnimalSpawner(Class clazz) { - if (this.animalSpawners.containsKey(clazz)) { - return false; - } - - try { - EntitySpawner spawner = (EntitySpawner) clazz.getConstructor(SpawnerTask.class).newInstance(this); - this.animalSpawners.put(clazz, spawner); - } catch (Exception e) { - return false; - } - return true; - } - - /** - * Get EntitySpawner for class - * - * @param clazz spawner class - * @return EntitySpawner - */ - public EntitySpawner getAnimalSpawner(Class clazz) { - return this.animalSpawners.get(clazz); - } - - /** - * Unregister animal spawner - * - * @param clazz spawner class - * @return succeed - */ - public boolean unregisterAnimalSpawner(Class clazz) { - return this.animalSpawners.remove(clazz) != null; - } - - /** - * Register monster spawner - * - * @param clazz spawner class - * @return whether the spawner was registered successfully (no errors and not already registered) - */ - public boolean registerMobSpawner(Class clazz) { - if (this.mobSpawners.containsKey(clazz)) { - return false; - } - - try { - EntitySpawner spawner = (EntitySpawner) clazz.getConstructor(SpawnerTask.class).newInstance(this); - this.mobSpawners.put(clazz, spawner); - } catch (Exception e) { - return false; - } - return true; - } - - /** - * Get EntitySpawner for class - * - * @param clazz spawner class - * @return EntitySpawner - */ - public EntitySpawner getMobSpawner(Class clazz) { - return this.mobSpawners.get(clazz); - } - - /** - * Unregister monster spawner - * - * @param clazz spawner class - * @return succeed - */ - public boolean unregisterMobSpawner(Class clazz) { - return this.mobSpawners.remove(clazz) != null; - } - - @Override - public void run() { - if (Server.getInstance().getOnlinePlayersCount() != 0) { - if (mobsNext) { - mobsNext = false; - if (Server.getInstance().spawnMonsters) { - for (EntitySpawner spawner : mobSpawners.values()) { - spawner.spawn(); - } - } - } else { - mobsNext = true; - if (Server.getInstance().spawnAnimals) { - for (EntitySpawner spawner : animalSpawners.values()) { - spawner.spawn(); - } - } - } - } - } - - /** - * Check if mob spawning is allowed - * - * @param level world - * @param networkId mob network id - * @param player player - * @return whether mob spawning is possible near the player - */ - static boolean entitySpawnAllowed(Level level, int networkId, Player player) { - if (networkId == EntityPhantom.NETWORK_ID && (player.getTimeSinceRest() < 72000 || player.isSleeping() || player.isSpectator() || !level.getGameRules().getBoolean(GameRule.DO_INSOMNIA))) { - return false; - } - int max = getMaxSpawns(networkId, level.getDimension() == Level.DIMENSION_NETHER, level.getDimension() == Level.DIMENSION_THE_END); - if (max == 0) return false; - int count = 0; - for (Entity entity : level.entities.values()) { - if (entity.isAlive() && entity.getNetworkId() == networkId && new Vector3(player.x, entity.y, player.z).distanceSquared(entity) < 10000) { // 100 blocks - count++; - if (count > max) { - return false; - } - } - } - return count < max; - } - - /** - * Attempt to spawn a mob - * - * @param type mob id - * @param pos position - * @return spawned entity or null - */ - public BaseEntity createEntity(Object type, Position pos) { - BaseEntity entity = (BaseEntity) Entity.createEntity((String) type, pos); - if (entity != null) { - if (!entity.isInsideOfSolid() && !tooNearOfPlayer(pos)) { - CreatureSpawnEvent ev = new CreatureSpawnEvent(entity.getNetworkId(), pos, entity.namedTag, CreatureSpawnEvent.SpawnReason.NATURAL); - Server.getInstance().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - entity.spawnToAll(); - } else { - entity.close(); - entity = null; - } - } else { - entity.close(); - entity = null; - } - } - return entity; - } - - /** - * Check if mob spawn position is too close to player - * - * @param pos position - * @return whether the position is too close to player - */ - private static boolean tooNearOfPlayer(Position pos) { - for (Player p : pos.getLevel().getPlayers().values()) { - if (p.distanceSquared(pos) < 196) { // 14 blocks - return true; - } - } - return false; - } - - /** - * Get safe x / z coordinate for mob spawning - * - * @param degree - * @param safeDegree - * @param correctionDegree - * @return safe spawn x / z coordinate - */ - static int getRandomSafeXZCoord(int degree, int safeDegree, int correctionDegree) { - int addX = Utils.rand((degree >> 1) * -1, degree >> 1); - if (addX >= 0) { - if (degree < safeDegree) { - addX = safeDegree; - addX += Utils.rand((correctionDegree >> 1) * -1, correctionDegree >> 1); - } - } else { - if (degree > safeDegree) { - addX = -safeDegree; - addX += Utils.rand((correctionDegree >> 1) * -1, correctionDegree >> 1); - } - } - return addX; - } - - /** - * Get safe y coordinate for mob spawning - * - * @param level world - * @param pos initial position - * @return safe spawn y coordinate - */ - static int getSafeYCoord(Level level, Position pos) { - int x = (int) pos.x; - int y = (int) pos.y; - int z = (int) pos.z; - - BaseFullChunk chunk = level.getChunk(x >> 4, z >> 4, true); - if (level.getBlockIdAt(chunk, x, y, z) == Block.AIR) { - while (true) { - y--; - if (y > 255) { - y = 256; - break; - } - if (y < 1) { - y = 0; - break; - } - if (level.getBlockIdAt(chunk, x, y, z) != Block.AIR) { - int checkNeedDegree = 3; - int checkY = y; - while (true) { - checkY++; - checkNeedDegree--; - if (checkY > 255 || checkY < 1 || level.getBlockIdAt(chunk, x, checkY, z) != Block.AIR) { - break; - } - if (checkNeedDegree <= 0) { - return y; - } - } - } - } - } else { - while (true) { - y++; - if (y > 255) { - y = 256; - break; - } - if (y < 1) { - y = 0; - break; - } - if (level.getBlockIdAt(chunk, x, y, z) != Block.AIR) { - int checkNeedDegree = 3; - int checkY = y; - while (true) { - checkY--; - checkNeedDegree--; - if (checkY > 255 || checkY < 1 || level.getBlockIdAt(chunk, x, checkY, z) != Block.AIR) { - break; - } - if (checkNeedDegree <= 0) { - return y; - } - } - } - } - } - return y; - } - - /** - * Get maximum amount of mobs in distance - * - * @param id mob network id - * @param nether is nether world - * @param end is end world - * @return maximum amount of mobs - */ - private static int getMaxSpawns(int id, boolean nether, boolean end) { - switch (id) { - case EntityZombiePigman.NETWORK_ID: - case EntityPiglin.NETWORK_ID: - case EntityHoglin.NETWORK_ID: - return nether ? 4 : 0; - case EntityGhast.NETWORK_ID: - case EntityBlaze.NETWORK_ID: - case EntityWitherSkeleton.NETWORK_ID: - case EntityMagmaCube.NETWORK_ID: - return nether ? 2 : 0; - case EntityEnderman.NETWORK_ID: - return end ? 10 : 2; - case EntityCod.NETWORK_ID: - case EntitySalmon.NETWORK_ID: - return end || nether ? 0 : 4; - case EntityWitch.NETWORK_ID: - return end || nether ? 0 : 1; - case EntityPhantom.NETWORK_ID: - int difficulty = Server.getInstance().getDifficulty(); - return end || nether ? 0 : difficulty == 1 ? 2 : difficulty == 2 ? 3 : 4; - default: - return end || nether ? 0 : 2; - } - } -} diff --git a/src/main/java/cn/nukkit/utils/TerracottaColor.java b/src/main/java/cn/nukkit/utils/TerracottaColor.java deleted file mode 100644 index 257ffe971..000000000 --- a/src/main/java/cn/nukkit/utils/TerracottaColor.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.nukkit.utils; - -/** - * Terracotta color enum - */ -public enum TerracottaColor { - - BLACK(0, 15, "Black", "Ink Sack", BlockColor.BLACK_TERRACOTA_BLOCK_COLOR), - RED(1, 14, "Red", "Rose Red", BlockColor.RED_TERRACOTA_BLOCK_COLOR), - GREEN(2, 13, "Green", "Cactus Green", BlockColor.GREEN_TERRACOTA_BLOCK_COLOR), - BROWN(3, 12, "Brown", "Cocoa Beans", BlockColor.BROWN_TERRACOTA_BLOCK_COLOR), - BLUE(4, 11, "Blue", "Lapis Lazuli", BlockColor.BLUE_TERRACOTA_BLOCK_COLOR), - PURPLE(5, 10, "Purple", BlockColor.PURPLE_TERRACOTA_BLOCK_COLOR), - CYAN(6, 9, "Cyan", BlockColor.CYAN_TERRACOTA_BLOCK_COLOR), - LIGHT_GRAY(7, 8, "Light Gray", BlockColor.LIGHT_GRAY_TERRACOTA_BLOCK_COLOR), - GRAY(8, 7, "Gray", BlockColor.GRAY_TERRACOTA_BLOCK_COLOR), - PINK(9, 6, "Pink", BlockColor.PINK_TERRACOTA_BLOCK_COLOR), - LIME(10, 5, "Lime", BlockColor.LIME_TERRACOTA_BLOCK_COLOR), - YELLOW(11, 4, "Yellow", "Dandelion Yellow", BlockColor.YELLOW_TERRACOTA_BLOCK_COLOR), - LIGHT_BLUE(12, 3, "Light Blue", BlockColor.LIGHT_BLUE_TERRACOTA_BLOCK_COLOR), - MAGENTA(13, 2, "Magenta", BlockColor.MAGENTA_TERRACOTA_BLOCK_COLOR), - ORANGE(14, 1, "Orange", BlockColor.ORANGE_TERRACOTA_BLOCK_COLOR), - WHITE(15, 0, "White", "Bone Meal", BlockColor.WHITE_TERRACOTA_BLOCK_COLOR); - - - private int dyeColorMeta; - private int terracottaColorMeta; - private String colorName; - private String dyeName; - private BlockColor blockColor; - - - private final static TerracottaColor[] BY_TERRACOTA_DATA; - private final static TerracottaColor[] BY_DYE_DATA; - - TerracottaColor(int dyeColorMeta, int terracottaColorMeta, String colorName, BlockColor blockColor) { - this(dyeColorMeta, terracottaColorMeta, colorName, colorName + " Dye", blockColor); - } - - TerracottaColor(int dyeColorMeta, int terracottaColorMeta, String colorName, String dyeName, BlockColor blockColor) { - this.dyeColorMeta = dyeColorMeta; - this.terracottaColorMeta = terracottaColorMeta; - this.colorName = colorName; - this.blockColor = blockColor; - this.dyeName = dyeName; - } - - /** - * Get as BlockColor - * - * @return BlockColor of the TerracottaColor - */ - public BlockColor getColor() { - return this.blockColor; - } - - /** - * Get as dye item meta value - * - * @return dye item meta value of the TerracottaColor - */ - public int getDyeData() { - return this.dyeColorMeta; - } - - /** - * Get as terracotta block meta value - * - * @return terracotta block meta value of the TerracottaColor - */ - public int getTerracottaData() { - return this.terracottaColorMeta; - } - - /** - * Get color name - * - * @return color name - */ - public String getName() { - return this.colorName; - } - - /** - * Get dye name - * - * @return dye name - */ - public String getDyeName() { - return this.dyeName; - } - - static { - BY_DYE_DATA = values(); - BY_TERRACOTA_DATA = values(); - - for (TerracottaColor color : values()) { - BY_TERRACOTA_DATA[color.terracottaColorMeta & 0x0f] = color; - BY_DYE_DATA[color.dyeColorMeta & 0x0f] = color; - } - } - - /** - * Get TerracottaColor by dye item meta value - * @param dyeColorMeta dye item meta value - * @return TerracottaColor - */ - public static TerracottaColor getByDyeData(int dyeColorMeta) { - return BY_DYE_DATA[dyeColorMeta & 0x0f]; - } - - /** - * Get TerracottaColor by terracotta block meta value - * @param terracottaColorMeta terracotta block meta value - * @return TerracottaColor - */ - public static TerracottaColor getByTerracottaData(int terracottaColorMeta) { - return BY_TERRACOTA_DATA[terracottaColorMeta & 0x0f]; - } -} diff --git a/src/main/java/cn/nukkit/utils/TextFormat.java b/src/main/java/cn/nukkit/utils/TextFormat.java deleted file mode 100644 index aa971f5e0..000000000 --- a/src/main/java/cn/nukkit/utils/TextFormat.java +++ /dev/null @@ -1,286 +0,0 @@ -package cn.nukkit.utils; - -import com.google.common.collect.Maps; - -import java.util.HashMap; -import java.util.Map; -import java.util.regex.Pattern; - -/** - * All supported formatting values for chat and console. - */ -public enum TextFormat { - /** - * Represents black. - */ - BLACK('0', 0x00), - /** - * Represents dark blue. - */ - DARK_BLUE('1', 0x1), - /** - * Represents dark green. - */ - DARK_GREEN('2', 0x2), - /** - * Represents dark blue (aqua). - */ - DARK_AQUA('3', 0x3), - /** - * Represents dark red. - */ - DARK_RED('4', 0x4), - /** - * Represents dark purple. - */ - DARK_PURPLE('5', 0x5), - /** - * Represents gold. - */ - GOLD('6', 0x6), - /** - * Represents gray. - */ - GRAY('7', 0x7), - /** - * Represents dark gray. - */ - DARK_GRAY('8', 0x8), - /** - * Represents blue. - */ - BLUE('9', 0x9), - /** - * Represents green. - */ - GREEN('a', 0xA), - /** - * Represents aqua. - */ - AQUA('b', 0xB), - /** - * Represents red. - */ - RED('c', 0xC), - /** - * Represents light purple. - */ - LIGHT_PURPLE('d', 0xD), - /** - * Represents yellow. - */ - YELLOW('e', 0xE), - /** - * Represents white. - */ - WHITE('f', 0xF), - /** - * Represents minecoins gold. - */ - MINECOIN_GOLD('g', 0x16), - /** - * Makes the text obfuscated. - */ - OBFUSCATED('k', 0x10, true), - /** - * Makes the text bold. - */ - BOLD('l', 0x11, true), - /** - * Makes a line appear through the text. - */ - STRIKETHROUGH('m', 0x12, true), - /** - * Makes the text appear underlined. - */ - UNDERLINE('n', 0x13, true), - /** - * Makes the text italic. - */ - ITALIC('o', 0x14, true), - /** - * Resets all previous chat colors or formats. - */ - RESET('r', 0x15); - - /** - * The special character which prefixes all format codes. Use this if - * you need to dynamically convert format codes from your custom format. - */ - public static final char ESCAPE = '\u00A7'; - - private static final Pattern CLEAN_PATTERN = Pattern.compile("(?i)" + ESCAPE + "[0-9A-GK-OR]"); - private final static Map BY_ID = Maps.newTreeMap(); - private final static Map BY_CHAR = new HashMap<>(); - - static { - for (TextFormat color : values()) { - BY_ID.put(color.intCode, color); - BY_CHAR.put(color.code, color); - } - } - - private final int intCode; - private final char code; - private final boolean isFormat; - private final String toString; - - TextFormat(char code, int intCode) { - this(code, intCode, false); - } - - TextFormat(char code, int intCode, boolean isFormat) { - this.code = code; - this.intCode = intCode; - this.isFormat = isFormat; - this.toString = new String(new char[]{ESCAPE, code}); - } - - /** - * Gets the TextFormat represented by the specified format code. - * - * @param code Code to check - * @return Associative with the given code, - * or null if it doesn't exist - */ - public static TextFormat getByChar(char code) { - return BY_CHAR.get(code); - } - - /** - * Gets the TextFormat represented by the specified format code. - * - * @param code Code to check - * @return Associative with the given code, - * or null if it doesn't exist - */ - public static TextFormat getByChar(String code) { - if (code == null || code.length() <= 1) { - return null; - } - - return BY_CHAR.get(code.charAt(0)); - } - - /** - * Cleans the given message of all format codes. - * - * @param input String to clean. - * @return A copy of the input string, without any formatting. - */ - public static String clean(final String input) { - return clean(input, false); - } - - /** - * Cleans the given message of all format codes. - * - * @param input String to clean. - * @param recursive Do recursively. - * @return A copy of the input string, without any formatting. - */ - public static String clean(final String input, final boolean recursive) { - if (input == null) { - return null; - } - - String result = CLEAN_PATTERN.matcher(input).replaceAll(""); - - if (recursive && CLEAN_PATTERN.matcher(result).find()) { - return clean(result, true); - } - return result; - } - - /** - * Translates a string using an alternate format code character into a - * string that uses the internal TextFormat.ESCAPE format code - * character. The alternate format code character will only be replaced if - * it is immediately followed by 0-9, A-G, a-g, K-O, k-o, R or r. - * - * @param altFormatChar The alternate format code character to replace. Ex: &amp; - * @param textToTranslate Text containing the alternate format code character. - * @return Text containing the TextFormat.ESCAPE format code character. - */ - public static String colorize(char altFormatChar, String textToTranslate) { - char[] b = textToTranslate.toCharArray(); - for (int i = 0; i < b.length - 1; i++) { - int x = i + 1; - if (b[i] == altFormatChar && "0123456789AaBbCcDdEeFfGgKkLlMmNnOoRr".indexOf(b[x]) > -1) { - b[i] = TextFormat.ESCAPE; - b[x] = Character.toLowerCase(b[x]); - } - } - return new String(b); - } - - /** - * Translates a string, using an ampersand (&) as an alternate format code - * character, into a string that uses the internal TextFormat.ESCAPE format - * code character. The alternate format code character will only be replaced if - * it is immediately followed by 0-9, A-G, a-g, K-O, k-o, R or r. - * - * @param textToTranslate Text containing the alternate format code character. - * @return Text containing the TextFormat.ESCAPE format code character. - */ - public static String colorize(String textToTranslate) { - return colorize('&', textToTranslate); - } - - /** - * Gets the chat color used at the end of the given input string. - * - * @param input Input string to retrieve the colors from. - * @return Any remaining chat color to pass onto the next line. - */ - public static String getLastColors(String input) { - StringBuilder result = new StringBuilder(); - int length = input.length(); - - // Search backwards from the end as it is faster - for (int index = length - 1; index > -1; index--) { - if (input.charAt(index) == ESCAPE && index < length - 1) { - TextFormat color = getByChar(input.charAt(index + 1)); - - if (color != null) { - result.insert(0, color.toString()); - - // Once we find a color or reset we can stop searching - if (color.isColor() || color.equals(RESET)) { - break; - } - } - } - } - - return result.toString(); - } - - /** - * Gets the char value associated with this color - * - * @return A char value of this color code - */ - public char getChar() { - return code; - } - - @Override - public String toString() { - return toString; - } - - /** - * Checks if this code is a format code as opposed to a color code. - */ - public boolean isFormat() { - return isFormat; - } - - /** - * Checks if this code is a color code as opposed to a format code. - */ - public boolean isColor() { - return !isFormat && this != RESET; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/utils/ThreadCache.java b/src/main/java/cn/nukkit/utils/ThreadCache.java deleted file mode 100644 index 0a54cb2a4..000000000 --- a/src/main/java/cn/nukkit/utils/ThreadCache.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.nbt.stream.FastByteArrayOutputStream; - -/** - * Thread cache - */ -public class ThreadCache { - - public static void clean() { - idArray.clean(); - dataArray.clean(); - byteCache6144.clean(); - boolCache4096.clean(); - charCache4096.clean(); - charCache4096v2.clean(); - fbaos.clean(); - binaryStream.clean(); - intCache256.clean(); - byteCache256.clean(); - } - - public static final IterableThreadLocal idArray = new IterableThreadLocal() { - @Override - public byte[][] init() { - return new byte[16][]; - } - }; - - public static final IterableThreadLocal dataArray = new IterableThreadLocal() { - @Override - public byte[][] init() { - return new byte[16][]; - } - }; - - public static final IterableThreadLocal byteCache6144 = new IterableThreadLocal() { - @Override - public byte[] init() { - return new byte[6144]; - } - }; - - public static final IterableThreadLocal byteCache256 = new IterableThreadLocal() { - @Override - public byte[] init() { - return new byte[256]; - } - }; - - public static final IterableThreadLocal boolCache4096 = new IterableThreadLocal() { - @Override - public boolean[] init() { - return new boolean[4096]; - } - }; - - public static final IterableThreadLocal charCache4096v2 = new IterableThreadLocal() { - @Override - public char[] init() { - return new char[4096]; - } - }; - - public static final IterableThreadLocal charCache4096 = new IterableThreadLocal() { - @Override - public char[] init() { - return new char[4096]; - } - }; - - public static final IterableThreadLocal intCache256 = new IterableThreadLocal() { - @Override - public int[] init() { - return new int[256]; - } - }; - - public static final IterableThreadLocal fbaos = new IterableThreadLocal() { - @Override - public FastByteArrayOutputStream init() { - return new FastByteArrayOutputStream(1024); - } - }; - - public static final IterableThreadLocal binaryStream = new IterableThreadLocal() { - @Override - public BinaryStream init() { - return new BinaryStream(); - } - }; -} diff --git a/src/main/java/cn/nukkit/utils/ThreadStore.java b/src/main/java/cn/nukkit/utils/ThreadStore.java deleted file mode 100644 index 41285f61f..000000000 --- a/src/main/java/cn/nukkit/utils/ThreadStore.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.nukkit.utils; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Thread store - * - * @author MagicDroidX - * Nukkit Project - */ -public class ThreadStore { - - public static final Map store = new ConcurrentHashMap<>(); -} diff --git a/src/main/java/cn/nukkit/utils/Utils.java b/src/main/java/cn/nukkit/utils/Utils.java deleted file mode 100644 index dd284e818..000000000 --- a/src/main/java/cn/nukkit/utils/Utils.java +++ /dev/null @@ -1,456 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Player; -import cn.nukkit.entity.mob.*; -import cn.nukkit.math.NukkitRandom; -import cn.nukkit.network.protocol.ProtocolInfo; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; - -import java.io.*; -import java.lang.management.ManagementFactory; -import java.lang.management.ThreadInfo; -import java.nio.channels.FileChannel; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Map; -import java.util.SplittableRandom; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -/** - * This class contains miscellaneous stuff used in other parts of the program. - * - * @author MagicDroidX - * Nukkit Project - */ -public class Utils { - - /** - * A SplittableRandom you can use without having to create a new object every time. - */ - public static final SplittableRandom random = new SplittableRandom(); - /** - * A NukkitRandom you can use without having to create a new object every time. - */ - public static final NukkitRandom nukkitRandom = new NukkitRandom(); - /** - * An empty damage array used when mobs have no attack damage. - */ - public static final int[] emptyDamageArray = new int[] { 0, 0, 0, 0 }; - /** - * List of network ids of monsters. Currently used for example to check which entities will make players unable to sleep when nearby the bed. - */ - public static final IntSet monstersList = new IntOpenHashSet(Arrays.asList(EntityBlaze.NETWORK_ID, EntityCaveSpider.NETWORK_ID, EntityCreeper.NETWORK_ID, EntityDrowned.NETWORK_ID, EntityElderGuardian.NETWORK_ID, EntityEnderman.NETWORK_ID, EntityEndermite.NETWORK_ID, EntityEvoker.NETWORK_ID, EntityGhast.NETWORK_ID, EntityGuardian.NETWORK_ID, EntityHoglin.NETWORK_ID, EntityHusk.NETWORK_ID, EntityPiglinBrute.NETWORK_ID, EntityPillager.NETWORK_ID, EntityRavager.NETWORK_ID, EntityShulker.NETWORK_ID, EntitySilverfish.NETWORK_ID, EntitySkeleton.NETWORK_ID, EntitySlime.NETWORK_ID, EntitySpider.NETWORK_ID, EntityStray.NETWORK_ID, EntityVex.NETWORK_ID, EntityVindicator.NETWORK_ID, EntityWitch.NETWORK_ID, EntityWither.NETWORK_ID, EntityWitherSkeleton.NETWORK_ID, EntityZoglin.NETWORK_ID, EntityZombie.NETWORK_ID, EntityZombiePigman.NETWORK_ID, EntityZombieVillager.NETWORK_ID, EntityZombieVillagerV2.NETWORK_ID)); - /** - * List of biomes where water can freeze - */ - public static final IntSet freezingBiomes = new IntOpenHashSet(Arrays.asList(10, 11, 12, 26, 30, 31, 140, 158)); - - public static void writeFile(String fileName, String content) throws IOException { - writeFile(fileName, new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))); - } - - public static void writeFile(String fileName, InputStream content) throws IOException { - writeFile(new File(fileName), content); - } - - public static void writeFile(File file, String content) throws IOException { - writeFile(file, new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))); - } - - public static void writeFile(File file, InputStream content) throws IOException { - if (content == null) { - throw new IllegalArgumentException("content must not be null"); - } - if (!file.exists()) { - file.createNewFile(); - } - try (FileOutputStream stream = new FileOutputStream(file)) { - byte[] buffer = new byte[1024]; - int length; - while ((length = content.read(buffer)) != -1) { - stream.write(buffer, 0, length); - } - } - content.close(); - } - - public static String readFile(File file) throws IOException { - if (!file.exists() || file.isDirectory()) { - throw new FileNotFoundException(); - } - return readFile(new FileInputStream(file)); - } - - public static String readFile(String filename) throws IOException { - File file = new File(filename); - if (!file.exists() || file.isDirectory()) { - throw new FileNotFoundException(); - } - return readFile(new FileInputStream(file)); - } - - public static String readFile(InputStream inputStream) throws IOException { - return readFile(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); - } - - private static String readFile(Reader reader) throws IOException { - try (BufferedReader br = new BufferedReader(reader)) { - String temp; - StringBuilder stringBuilder = new StringBuilder(); - temp = br.readLine(); - while (temp != null) { - if (stringBuilder.length() != 0) { - stringBuilder.append('\n'); - } - stringBuilder.append(temp); - temp = br.readLine(); - } - return stringBuilder.toString(); - } - } - - public static void copyFile(File from, File to) throws IOException { - if (!from.exists()) { - throw new FileNotFoundException(); - } - if (from.isDirectory() || to.isDirectory()) { - throw new FileNotFoundException(); - } - FileInputStream fi = null; - FileChannel in = null; - FileOutputStream fo = null; - FileChannel out = null; - try { - if (!to.exists()) { - to.createNewFile(); - } - fi = new FileInputStream(from); - in = fi.getChannel(); - fo = new FileOutputStream(to); - out = fo.getChannel(); - in.transferTo(0, in.size(), out); - } finally { - if (fi != null) fi.close(); - if (in != null) in.close(); - if (fo != null) fo.close(); - if (out != null) out.close(); - } - } - - public static String getAllThreadDumps() { - ThreadInfo[] threads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true); - StringBuilder builder = new StringBuilder(); - for (ThreadInfo info : threads) { - builder.append('\n').append(info); - } - return builder.toString(); - } - - - public static String getExceptionMessage(Throwable e) { - StringWriter stringWriter = new StringWriter(); - try (PrintWriter printWriter = new PrintWriter(stringWriter)) { - e.printStackTrace(printWriter); - printWriter.flush(); - } - return stringWriter.toString(); - } - - public static UUID dataToUUID(String... params) { - StringBuilder builder = new StringBuilder(); - for (String param : params) { - builder.append(param); - } - return UUID.nameUUIDFromBytes(builder.toString().getBytes(StandardCharsets.UTF_8)); - } - - public static UUID dataToUUID(byte[]... params) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - for (byte[] param : params) { - try { - stream.write(param); - } catch (IOException e) { - break; - } - } - return UUID.nameUUIDFromBytes(stream.toByteArray()); - } - - public static String rtrim(String s, char character) { - int i = s.length() - 1; - while (i >= 0 && (s.charAt(i)) == character) { - i--; - } - return s.substring(0, i + 1); - } - - public static boolean isByteArrayEmpty(final byte[] array) { - for (byte b : array) { - if (b != 0) { - return false; - } - } - return true; - } - - public static long toRGB(byte r, byte g, byte b, byte a) { - long result = (int) r & 0xff; - result |= ((int) g & 0xff) << 8; - result |= ((int) b & 0xff) << 16; - result |= ((int) a & 0xff) << 24; - return result & 0xFFFFFFFFL; - } - - public static long toABGR(int argb) { - long result = argb & 0xFF00FF00L; - result |= (argb << 16) & 0x00FF0000L; // B to R - result |= (argb >>> 16) & 0xFFL; // R to B - return result & 0xFFFFFFFFL; - } - - public static Object[][] splitArray(Object[] arrayToSplit, int chunkSize) { - if (chunkSize <= 0) { - return null; - } - - int rest = arrayToSplit.length % chunkSize; - int chunks = arrayToSplit.length / chunkSize + (rest > 0 ? 1 : 0); - - Object[][] arrays = new Object[chunks][]; - for (int i = 0; i < (rest > 0 ? chunks - 1 : chunks); i++) { - arrays[i] = Arrays.copyOfRange(arrayToSplit, i * chunkSize, i * chunkSize + chunkSize); - } - if (rest > 0) { - arrays[chunks - 1] = Arrays.copyOfRange(arrayToSplit, (chunks - 1) * chunkSize, (chunks - 1) * chunkSize + rest); - } - return arrays; - } - - public static void reverseArray(T[] data) { - reverseArray(data, false); - } - - public static T[] reverseArray(T[] array, boolean copy) { - T[] data = array; - - if (copy) { - data = Arrays.copyOf(array, array.length); - } - - for (int left = 0, right = data.length - 1; left < right; left++, right--) { - T temp = data[left]; - data[left] = data[right]; - data[right] = temp; - } - - return data; - } - - public static T[][] clone2dArray(T[][] array) { - T[][] newArray = Arrays.copyOf(array, array.length); - - for (int i = 0; i < array.length; i++) { - newArray[i] = Arrays.copyOf(array[i], array[i].length); - } - - return newArray; - } - - public static Map getOrCreate(Map> map, T key) { - Map existing = map.get(key); - if (existing == null) { - ConcurrentHashMap toPut = new ConcurrentHashMap<>(); - existing = map.putIfAbsent(key, toPut); - if (existing == null) { - existing = toPut; - } - } - return existing; - } - - public static U getOrCreate(Map map, Class clazz, T key) { - U existing = map.get(key); - if (existing != null) { - return existing; - } - try { - U toPut = clazz.newInstance(); - existing = map.putIfAbsent(key, toPut); - if (existing == null) { - return toPut; - } - return existing; - } catch (InstantiationException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - public static int toInt(Object number) { - if (number instanceof Integer) { - return (Integer) number; - } - - return (int) Math.round((double) number); - } - - public static byte[] parseHexBinary(String s) { - final int len = s.length(); - - if (len % 2 != 0) - throw new IllegalArgumentException("hexBinary needs to be even-length: " + s); - - byte[] out = new byte[(len >> 1)]; - - for (int i = 0; i < len; i += 2) { - int h = hexToBin(s.charAt(i)); - int l = hexToBin(s.charAt(i + 1)); - if (h == -1 || l == -1) - throw new IllegalArgumentException("contains illegal character for hexBinary: " + s); - - out[(i >> 1)] = (byte)((h << 4) + l); - } - - return out; - } - - private static int hexToBin( char ch ) { - if ('0' <= ch && ch <= '9') return ch - '0'; - if ('A' <= ch && ch <= 'F') return ch - 'A' + 10; - if ('a' <= ch && ch <= 'f') return ch - 'a' + 10; - return -1; - } - - /** - * Get a random int - * - * @param min minimum value - * @param max maximum value - * @return random int between min and max - */ - public static int rand(int min, int max) { - if (min == max) { - return max; - } - return random.nextInt(max + 1 - min) + min; - } - - /** - * Get a random double - * - * @param min minimum value - * @param max maximum value - * @return random double between min and max - */ - public static double rand(double min, double max) { - if (min == max) { - return max; - } - return min + random.nextDouble() * (max-min); - } - - /** - * Get a random boolean - * - * @return random boolean - */ - public static boolean rand() { - return random.nextBoolean(); - } - - /** - * Get game version string by protocol version. - * For internal usage! - * Starting from 388 / 1.13.0 - * - * @param protocol protocol version - * @return game version string - */ - public static String getVersionByProtocol(int protocol) { - switch (protocol) { - case ProtocolInfo.v1_13_0: - return "1.13.0"; - case ProtocolInfo.v1_14_0: - return "1.14.0"; - case ProtocolInfo.v1_14_60: - return "1.14.60"; - case ProtocolInfo.v1_16_0: - return "1.16.0"; - case ProtocolInfo.v1_16_20: - return "1.16.20"; - case ProtocolInfo.v1_16_100_0: - case ProtocolInfo.v1_16_100_51: - case ProtocolInfo.v1_16_100_52: - case ProtocolInfo.v1_16_100: - return "1.16.100"; - case ProtocolInfo.v1_16_200_51: - case ProtocolInfo.v1_16_200: - return "1.16.200"; - case ProtocolInfo.v1_16_210_50: - case ProtocolInfo.v1_16_210_53: - case ProtocolInfo.v1_16_210: - return "1.16.210"; - case ProtocolInfo.v1_16_220: - return "1.16.220"; - case ProtocolInfo.v1_16_230_50: - case ProtocolInfo.v1_16_230: - case ProtocolInfo.v1_16_230_54: - return "1.16.230"; - case ProtocolInfo.v1_17_0: - return "1.17.0"; - case ProtocolInfo.v1_17_10: - return "1.17.10"; - case ProtocolInfo.v1_17_20_20: - return "1.17.20"; - case ProtocolInfo.v1_17_30: - return "1.17.30"; - case ProtocolInfo.v1_17_40: - return "1.17.40"; - default: - throw new IllegalStateException("Invalid protocol: " + protocol); - } - } - - /** - * Get player's operating system/device name from login chain data. - * NOTICE: It's possible to spoof this. - * - * @param player player - * @return operating system/device name - */ - public static String getOS(Player player) { - switch(player.getLoginChainData().getDeviceOS()) { - case 1: - return "Android"; - case 2: - return "iOS"; - case 3: - return "macOS"; - case 4: - return "Fire"; - case 5: - return "Gear VR"; - case 6: - return "HoloLens"; - case 7: - return "Windows 10"; - case 8: - return "Windows"; - case 9: - return "Dedicated"; - case 10: - return "tvOS"; - case 11: - return "PlayStation"; - case 12: - return "Switch"; - case 13: - return "Xbox"; - case 14: - return "Windows Phone"; - default: - return "Unknown"; - } - } -} diff --git a/src/main/java/cn/nukkit/utils/VarInt.java b/src/main/java/cn/nukkit/utils/VarInt.java deleted file mode 100644 index a79183837..000000000 --- a/src/main/java/cn/nukkit/utils/VarInt.java +++ /dev/null @@ -1,233 +0,0 @@ -package cn.nukkit.utils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * Tool class for VarInt or VarLong operations. - * - * Some code from http://wiki.vg/Protocol. - * - * @author MagicDroidX - * @author lmlstarqaq - */ -public final class VarInt { - - private VarInt() { - //no instance - } - - /** - * @param v Signed int - * @return Unsigned encoded int - */ - public static long encodeZigZag32(int v) { - // Note: the right-shift must be arithmetic - return ((v << 1) ^ (v >> 31)) & 0xFFFFFFFFL; - } - - /** - * @param v Unsigned encoded int - * @return Signed decoded int - */ - public static int decodeZigZag32(long v) { - return (int) (v >> 1) ^ -(int) (v & 1); - } - - /** - * @param v Signed long - * @return Unsigned encoded long - */ - public static long encodeZigZag64(long v) { - return (v << 1) ^ (v >> 63); - } - - /** - * @param v Signed encoded long - * @return Unsigned decoded long - */ - public static long decodeZigZag64(long v) { - return (v >>> 1) ^ -(v & 1); - } - - private static long read(BinaryStream stream, int maxSize) { - long value = 0; - int size = 0; - int b; - while (((b = stream.getByte()) & 0x80) == 0x80) { - value |= (long) (b & 0x7F) << (size++ * 7); - if (size >= maxSize) { - throw new IllegalArgumentException("VarLong too big"); - } - } - - return value | ((long) (b & 0x7F) << (size * 7)); - } - - private static long read(InputStream stream, int maxSize) throws IOException { - long value = 0; - int size = 0; - int b; - while (((b = stream.read()) & 0x80) == 0x80) { - value |= (long) (b & 0x7F) << (size++ * 7); - if (size >= maxSize) { - throw new IllegalArgumentException("VarLong too big"); - } - } - - return value | ((long) (b & 0x7F) << (size * 7)); - } - - /** - * @param stream BinaryStream - * @return Signed int - */ - public static int readVarInt(BinaryStream stream) { - return decodeZigZag32(readUnsignedVarInt(stream)); - } - - /** - * @param stream InputStream - * @return Signed int - */ - public static int readVarInt(InputStream stream) throws IOException { - return decodeZigZag32(readUnsignedVarInt(stream)); - } - - /** - * @param stream BinaryStream - * @return Unsigned int - */ - public static long readUnsignedVarInt(BinaryStream stream) { - return read(stream, 5); - } - - /** - * @param stream InputStream - * @return Unsigned int - */ - public static long readUnsignedVarInt(InputStream stream) throws IOException { - return read(stream, 5); - } - - /** - * @param stream BinaryStream - * @return Signed long - */ - public static long readVarLong(BinaryStream stream) { - return decodeZigZag64(readUnsignedVarLong(stream)); - } - - /** - * @param stream InputStream - * @return Signed long - */ - public static long readVarLong(InputStream stream) throws IOException { - return decodeZigZag64(readUnsignedVarLong(stream)); - } - - /** - * @param stream BinaryStream - * @return Unsigned long - */ - public static long readUnsignedVarLong(BinaryStream stream) { - return read(stream, 10); - } - - /** - * @param stream InputStream - * @return Unsigned long - */ - public static long readUnsignedVarLong(InputStream stream) throws IOException { - return read(stream, 10); - } - - private static void write(BinaryStream stream, long value) { - do { - byte temp = (byte) (value & 0b01111111); - // Note: >>> means that the sign bit is shifted with the rest of the number rather than being left alone - value >>>= 7; - if (value != 0) { - temp |= 0b10000000; - } - stream.putByte(temp); - } while (value != 0); - } - - private static void write(OutputStream stream, long value) throws IOException { - do { - byte temp = (byte) (value & 0b01111111); - // Note: >>> means that the sign bit is shifted with the rest of the number rather than being left alone - value >>>= 7; - if (value != 0) { - temp |= 0b10000000; - } - stream.write(temp); - } while (value != 0); - } - - /** - * @param stream BinaryStream - * @param value Signed int - */ - public static void writeVarInt(BinaryStream stream, int value) { - writeUnsignedVarInt(stream, encodeZigZag32(value)); - } - - /** - * @param stream OutputStream - * @param value Signed int - */ - public static void writeVarInt(OutputStream stream, int value) throws IOException { - writeUnsignedVarInt(stream, encodeZigZag32(value)); - } - - /** - * @param stream BinaryStream - * @param value Unsigned int - */ - public static void writeUnsignedVarInt(BinaryStream stream, long value) { - write(stream, value); - } - - /** - * @param stream OutputStream - * @param value Unsigned int - */ - public static void writeUnsignedVarInt(OutputStream stream, long value) throws IOException { - write(stream, value); - } - - /** - * @param stream BinaryStream - * @param value Signed long - */ - public static void writeVarLong(BinaryStream stream, long value) { - writeUnsignedVarLong(stream, encodeZigZag64(value)); - } - - /** - * @param stream OutputStream - * @param value Signed long - */ - public static void writeVarLong(OutputStream stream, long value) throws IOException { - writeUnsignedVarLong(stream, encodeZigZag64(value)); - } - - /** - * @param stream BinaryStream - * @param value Unsigned long - */ - public static void writeUnsignedVarLong(BinaryStream stream, long value) { - write(stream, value); - } - - /** - * @param stream OutputStream - * @param value Unsigned long - */ - public static void writeUnsignedVarLong(OutputStream stream, long value) throws IOException { - write(stream, value); - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/utils/Watchdog.java b/src/main/java/cn/nukkit/utils/Watchdog.java deleted file mode 100644 index 66c68c5d4..000000000 --- a/src/main/java/cn/nukkit/utils/Watchdog.java +++ /dev/null @@ -1,121 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.Server; -import cn.nukkit.utils.bugreport.BugReportGenerator; - -import java.lang.management.ManagementFactory; -import java.lang.management.MonitorInfo; -import java.lang.management.ThreadInfo; - -/** - * Watchdog monitors the server's main thread and kills the server if it gets frozen. - */ -public class Watchdog extends Thread { - - private final Server server; - private final long time; - private boolean responding = true; - /** - * Watchdog running - */ - public volatile boolean running; - - public Watchdog(Server server, long time) { - this.server = server; - this.time = time; - this.running = true; - this.setName("Watchdog"); - this.setDaemon(true); - } - - /** - * Shotdown Watchdog - */ - public void kill() { - running = false; - interrupt(); - } - - @Override - public void run() { - while (this.running) { - long current = server.getNextTick(); - if (current != 0) { - long diff = System.currentTimeMillis() - current; - if (!responding && diff > time << 1) { - System.exit(1); // Kill the server if it gets stuck on shutdown - } - - if (diff <= time) { - responding = true; - } else if (responding) { - MainLogger logger = this.server.getLogger(); - StringBuilder log = new StringBuilder(); - - print("--------- Server stopped responding ---------", logger, log); - print("Last response " + Math.round(diff / 1000d) + " seconds ago", logger, log); - print("---------------- Main thread ----------------", logger, log); - - dumpThread(ManagementFactory.getThreadMXBean().getThreadInfo(this.server.getPrimaryThread().getId(), Integer.MAX_VALUE), logger, log); - - print("---------------- All threads ----------------", logger, log); - ThreadInfo[] threads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true); - for (int i = 0; i < threads.length; i++) { - if (i != 0) print("------------------------------", logger, log); - dumpThread(threads[i], logger, log); - } - print("---------------------------------------------", logger, log); - try { - new BugReportGenerator(log.toString()).start(); - Thread.sleep(1000); // Wait for the report to be sent - } catch (Exception ignored) {} - responding = false; - this.server.forceShutdown("\u00A7cServer stopped responding"); - } - } - try { - sleep(Math.max(time >> 2, 1000)); - } catch (InterruptedException ignore) { - server.getLogger().emergency("The Watchdog thread has been interrupted and is no longer monitoring the server state"); - running = false; - return; - } - } - server.getLogger().warning("Watchdog has been stopped"); - } - - /** - * Dump thread stack trace - * - * @param thread thread to dump - * @param logger logger - * @param log bug report generator input - */ - private static void dumpThread(ThreadInfo thread, Logger logger, StringBuilder log) { - print("Current Thread: " + thread.getThreadName(), logger, log); - print("\tPID: " + thread.getThreadId() + " | Suspended: " + thread.isSuspended() + " | Native: " + thread.isInNative() + " | State: " + thread.getThreadState(), logger, log); - - if (thread.getLockedMonitors().length != 0) { - print("\tThread is waiting on monitor(s):", logger, log); - for (MonitorInfo monitor : thread.getLockedMonitors()) { - print("\t\tLocked on:" + monitor.getLockedStackFrame(), logger, log); - } - } - - print("\tStack:", logger, log); - for (StackTraceElement stack : thread.getStackTrace()) { - print("\t\t" + stack, logger, log); - } - } - - /** - * Print a line to log - * - * @param logger logger - * @param log bug report generator input - */ - private static void print(String text, Logger logger, StringBuilder log) { - logger.emergency(text); - log.append(text).append('\n'); - } -} diff --git a/src/main/java/cn/nukkit/utils/Zlib.java b/src/main/java/cn/nukkit/utils/Zlib.java deleted file mode 100644 index 718d4db02..000000000 --- a/src/main/java/cn/nukkit/utils/Zlib.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.nukkit.utils; - -import java.io.IOException; -import java.util.zip.Deflater; - -public abstract class Zlib { - - private static ZlibProvider[] providers; - private static ZlibProvider provider; - - static { - providers = new ZlibProvider[3]; - providers[2] = new ZlibThreadLocal(); - provider = providers[2]; - } - - /** - * Set Zlib provider that is used to compress data - * - * 0 = ZlibOriginal - * 1 = ZlibSingleThreadLowMem - * 2 = ZlibThreadLocal (default) - */ - public static void setProvider(int providerIndex) { - switch (providerIndex) { - case 0: - if (providers[providerIndex] == null) - providers[providerIndex] = new ZlibOriginal(); - break; - case 1: - if (providers[providerIndex] == null) - providers[providerIndex] = new ZlibSingleThreadLowMem(); - break; - case 2: - if (providers[providerIndex] == null) - providers[providerIndex] = new ZlibThreadLocal(); - break; - default: - throw new UnsupportedOperationException("Invalid provider: " + providerIndex); - } - provider = providers[providerIndex]; - } - - public static byte[] deflate(byte[] data) throws Exception { - return deflate(data, Deflater.DEFAULT_COMPRESSION); - } - - public static byte[] deflate(byte[] data, int level) throws Exception { - return provider.deflate(data, level); - } - - public static byte[] deflate(byte[][] data, int level) throws Exception { - return provider.deflate(data, level); - } - - public static byte[] deflateRaw(byte[] data, int level) throws Exception { - return provider.deflateRaw(data, level); - } - - public static byte[] deflateRaw(byte[][] data, int level) throws Exception { - return provider.deflateRaw(data, level); - } - - public static byte[] inflate(byte[] data) throws IOException { - return inflate(data, -1); - } - - public static byte[] inflate(byte[] data, int maxSize) throws IOException { - return provider.inflate(data, maxSize); - } - - public static byte[] inflateRaw(byte[] data, int maxSize) throws IOException { - return provider.inflateRaw(data, maxSize); - } -} diff --git a/src/main/java/cn/nukkit/utils/ZlibOriginal.java b/src/main/java/cn/nukkit/utils/ZlibOriginal.java deleted file mode 100644 index 73b785520..000000000 --- a/src/main/java/cn/nukkit/utils/ZlibOriginal.java +++ /dev/null @@ -1,152 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.nbt.stream.FastByteArrayOutputStream; - -import java.io.IOException; -import java.util.zip.DataFormatException; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - -public class ZlibOriginal implements ZlibProvider { - - @Override - public byte[] deflate(byte[][] datas, int level) throws IOException { - Deflater deflater = new Deflater(level); - byte[] buffer = new byte[1024]; - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - try { - for (byte[] data : datas) { - deflater.setInput(data); - while (!deflater.needsInput()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - } - deflater.finish(); - while (!deflater.finished()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - } finally { - deflater.end(); - } - return bos.toByteArray(); - } - - @Override - public byte[] deflate(byte[] data, int level) throws IOException { - Deflater deflater = new Deflater(level); - deflater.setInput(data); - deflater.finish(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - byte[] buf = new byte[1024]; - try { - while (!deflater.finished()) { - int i = deflater.deflate(buf); - bos.write(buf, 0, i); - } - } finally { - deflater.end(); - } - return bos.toByteArray(); - } - - @Override - public byte[] deflateRaw(byte[][] datas, int level) throws IOException { - Deflater deflater = new Deflater(level, true); - byte[] buffer = new byte[1024]; - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - try { - for (byte[] data : datas) { - deflater.setInput(data); - while (!deflater.needsInput()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - } - deflater.finish(); - while (!deflater.finished()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - } finally { - deflater.end(); - } - return bos.toByteArray(); - } - - @Override - public byte[] deflateRaw(byte[] data, int level) throws IOException { - Deflater deflater = new Deflater(level, true); - deflater.setInput(data); - deflater.finish(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - byte[] buf = new byte[1024]; - try { - while (!deflater.finished()) { - int i = deflater.deflate(buf); - bos.write(buf, 0, i); - } - } finally { - deflater.end(); - } - return bos.toByteArray(); - } - - @Override - public byte[] inflate(byte[] data, int maxSize) throws IOException { - Inflater inflater = new Inflater(); - inflater.setInput(data); - inflater.finished(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - - byte[] buffer = new byte[1024]; - try { - int length = 0; - while (!inflater.finished()) { - int i = inflater.inflate(buffer); - length += i; - if (maxSize > 0 && length >= maxSize) { - throw new IOException("Inflated data exceeds maximum size"); - } - bos.write(buffer, 0, i); - } - return bos.toByteArray(); - } catch (DataFormatException e) { - throw new IOException("Unable to inflate Zlib stream", e); - } - } - - @Override - public byte[] inflateRaw(byte[] data, int maxSize) throws IOException { - Inflater inflater = new Inflater(true); - inflater.setInput(data); - inflater.finished(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - - byte[] buffer = new byte[1024]; - try { - int length = 0; - while (!inflater.finished()) { - int i = inflater.inflate(buffer); - if (i == 0) { - throw new IOException("Could not decompress data"); - } - length += i; - if (maxSize > 0 && length >= maxSize) { - throw new IOException("Inflated data exceeds maximum size"); - } - bos.write(buffer, 0, i); - } - return bos.toByteArray(); - } catch (DataFormatException e) { - throw new IOException("Unable to inflate Zlib stream", e); - } - } -} diff --git a/src/main/java/cn/nukkit/utils/ZlibProvider.java b/src/main/java/cn/nukkit/utils/ZlibProvider.java deleted file mode 100644 index 1c4dad790..000000000 --- a/src/main/java/cn/nukkit/utils/ZlibProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.nukkit.utils; - -import java.io.IOException; - -/** - * ZlibProvider - * - * @author ScraMTeam - */ -interface ZlibProvider { - - byte[] deflate(byte[][] data, int level) throws IOException; - - byte[] deflate(byte[] data, int level) throws IOException; - - byte[] deflateRaw(byte[][] data, int level) throws IOException; - - byte[] deflateRaw(byte[] data, int level) throws IOException; - - byte[] inflate(byte[] data, int maxSize) throws IOException; - - byte[] inflateRaw(byte[] data, int maxSize) throws IOException; -} diff --git a/src/main/java/cn/nukkit/utils/ZlibSingleThreadLowMem.java b/src/main/java/cn/nukkit/utils/ZlibSingleThreadLowMem.java deleted file mode 100644 index 7f0fc1ee8..000000000 --- a/src/main/java/cn/nukkit/utils/ZlibSingleThreadLowMem.java +++ /dev/null @@ -1,144 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.nbt.stream.FastByteArrayOutputStream; - -import java.io.IOException; -import java.util.zip.DataFormatException; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - -public class ZlibSingleThreadLowMem implements ZlibProvider { - - private static final Deflater DEFLATER = new Deflater(7); - private static final Inflater INFLATER = new Inflater(); - private static final Deflater DEFLATER_RAW = new Deflater(7, true); - private static final Inflater INFLATER_RAW = new Inflater(true); - private static final byte[] BUFFER = new byte[8192]; - - @Override - public synchronized byte[] deflate(byte[][] datas, int level) throws IOException { - DEFLATER.reset(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - for (byte[] data : datas) { - DEFLATER.setInput(data); - while (!DEFLATER.needsInput()) { - int i = DEFLATER.deflate(BUFFER); - bos.write(BUFFER, 0, i); - } - } - DEFLATER.finish(); - while (!DEFLATER.finished()) { - int i = DEFLATER.deflate(BUFFER); - bos.write(BUFFER, 0, i); - } - //Deflater::end is called the time when the process exits. - return bos.toByteArray(); - } - - @Override - public synchronized byte[] deflate(byte[] data, int level) throws IOException { - DEFLATER.reset(); - DEFLATER.setInput(data); - DEFLATER.finish(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - //try { - while (!DEFLATER.finished()) { - int i = DEFLATER.deflate(BUFFER); - bos.write(BUFFER, 0, i); - } - /*} finally { - deflater.end(); - }*/ - return bos.toByteArray(); - } - - @Override - public byte[] deflateRaw(byte[][] datas, int level) throws IOException { - DEFLATER_RAW.reset(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - for (byte[] data : datas) { - DEFLATER_RAW.setInput(data); - while (!DEFLATER_RAW.needsInput()) { - int i = DEFLATER_RAW.deflate(BUFFER); - bos.write(BUFFER, 0, i); - } - } - DEFLATER_RAW.finish(); - while (!DEFLATER_RAW.finished()) { - int i = DEFLATER_RAW.deflate(BUFFER); - bos.write(BUFFER, 0, i); - } - //Deflater::end is called the time when the process exits. - return bos.toByteArray(); - } - - @Override - public byte[] deflateRaw(byte[] data, int level) throws IOException { - DEFLATER_RAW.reset(); - DEFLATER_RAW.setInput(data); - DEFLATER_RAW.finish(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - //try { - while (!DEFLATER_RAW.finished()) { - int i = DEFLATER_RAW.deflate(BUFFER); - bos.write(BUFFER, 0, i); - } - /*} finally { - deflater.end(); - }*/ - return bos.toByteArray(); - } - - @Override - public synchronized byte[] inflate(byte[] data, int maxSize) throws IOException { - INFLATER.reset(); - INFLATER.setInput(data); - INFLATER.finished(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - try { - int length = 0; - while (!INFLATER.finished()) { - int i = INFLATER.inflate(BUFFER); - length += i; - if (maxSize > 0 && length >= maxSize) { - throw new IOException("Inflated data exceeds maximum size"); - } - bos.write(BUFFER, 0, i); - } - return bos.toByteArray(); - } catch (DataFormatException e) { - throw new IOException("Unable to inflate Zlib stream", e); - } - } - - @Override - public byte[] inflateRaw(byte[] data, int maxSize) throws IOException { - INFLATER_RAW.reset(); - INFLATER_RAW.setInput(data); - INFLATER_RAW.finished(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - try { - int length = 0; - while (!INFLATER_RAW.finished()) { - int i = INFLATER_RAW.inflate(BUFFER); - if (i == 0) { - throw new IOException("Could not decompress data"); - } - length += i; - if (maxSize > 0 && length >= maxSize) { - throw new IOException("Inflated data exceeds maximum size"); - } - bos.write(BUFFER, 0, i); - } - return bos.toByteArray(); - } catch (DataFormatException e) { - throw new IOException("Unable to inflate Zlib stream", e); - } - } -} diff --git a/src/main/java/cn/nukkit/utils/ZlibThreadLocal.java b/src/main/java/cn/nukkit/utils/ZlibThreadLocal.java deleted file mode 100644 index abae2ef3b..000000000 --- a/src/main/java/cn/nukkit/utils/ZlibThreadLocal.java +++ /dev/null @@ -1,158 +0,0 @@ -package cn.nukkit.utils; - -import cn.nukkit.nbt.stream.FastByteArrayOutputStream; - -import java.io.IOException; -import java.util.zip.DataFormatException; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - -public final class ZlibThreadLocal implements ZlibProvider { - - private static final ThreadLocal INFLATER = ThreadLocal.withInitial(Inflater::new); - private static final ThreadLocal DEFLATER = ThreadLocal.withInitial(Deflater::new); - private static final ThreadLocal INFLATER_RAW = ThreadLocal.withInitial(() -> new Inflater(true)); - private static final ThreadLocal DEFLATER_RAW = ThreadLocal.withInitial(() -> new Deflater(7, true)); - private static final ThreadLocal BUFFER = ThreadLocal.withInitial(() -> new byte[8192]); - - @Override - public byte[] deflate(byte[][] datas, int level) throws IOException { - Deflater deflater = DEFLATER.get(); - deflater.reset(); - deflater.setLevel(level); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - byte[] buffer = BUFFER.get(); - - for (byte[] data : datas) { - deflater.setInput(data); - while (!deflater.needsInput()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - } - deflater.finish(); - while (!deflater.finished()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - //Deflater::end is called the time when the process exits. - return bos.toByteArray(); - } - - @Override - public byte[] deflate(byte[] data, int level) throws IOException { - Deflater deflater = DEFLATER.get(); - deflater.reset(); - deflater.setLevel(level); - deflater.setInput(data); - deflater.finish(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - byte[] buffer = BUFFER.get(); - while (!deflater.finished()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - //Deflater::end is called the time when the process exits. - return bos.toByteArray(); - } - - @Override - public byte[] deflateRaw(byte[][] datas, int level) throws IOException { - Deflater deflater = DEFLATER_RAW.get(); - deflater.reset(); - deflater.setLevel(level); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - byte[] buffer = BUFFER.get(); - - for (byte[] data : datas) { - deflater.setInput(data); - while (!deflater.needsInput()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - } - deflater.finish(); - while (!deflater.finished()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - //Deflater::end is called the time when the process exits. - return bos.toByteArray(); - } - - @Override - public byte[] deflateRaw(byte[] data, int level) throws IOException { - Deflater deflater = DEFLATER_RAW.get(); - deflater.reset(); - deflater.setLevel(level); - deflater.setInput(data); - deflater.finish(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - byte[] buffer = BUFFER.get(); - while (!deflater.finished()) { - int i = deflater.deflate(buffer); - bos.write(buffer, 0, i); - } - //Deflater::end is called the time when the process exits. - return bos.toByteArray(); - } - - @Override - public byte[] inflate(byte[] data, int maxSize) throws IOException { - Inflater inflater = INFLATER.get(); - inflater.reset(); - inflater.setInput(data); - inflater.finished(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - - byte[] buffer = BUFFER.get(); - try { - int length = 0; - while (!inflater.finished()) { - int i = inflater.inflate(buffer); - length += i; - if (maxSize > 0 && length >= maxSize) { - throw new IOException("Inflated data exceeds maximum size"); - } - bos.write(buffer, 0, i); - } - return bos.toByteArray(); - } catch (DataFormatException e) { - throw new IOException("Unable to inflate Zlib stream", e); - } - } - - @Override - public byte[] inflateRaw(byte[] data, int maxSize) throws IOException { - Inflater inflater = INFLATER_RAW.get(); - inflater.reset(); - inflater.setInput(data); - inflater.finished(); - FastByteArrayOutputStream bos = ThreadCache.fbaos.get(); - bos.reset(); - - byte[] buffer = BUFFER.get(); - try { - int length = 0; - while (!inflater.finished()) { - int i = inflater.inflate(buffer); - if (i == 0) { - throw new IOException("Could not decompress data"); - } - length += i; - if (maxSize > 0 && length >= maxSize) { - throw new IOException("Inflated data exceeds maximum size"); - } - bos.write(buffer, 0, i); - } - return bos.toByteArray(); - } catch (DataFormatException e) { - throw new IOException("Unable to inflate Zlib stream", e); - } - } -} diff --git a/src/main/java/cn/nukkit/utils/bugreport/BugReportGenerator.java b/src/main/java/cn/nukkit/utils/bugreport/BugReportGenerator.java deleted file mode 100644 index baf227eb0..000000000 --- a/src/main/java/cn/nukkit/utils/bugreport/BugReportGenerator.java +++ /dev/null @@ -1,129 +0,0 @@ -package cn.nukkit.utils.bugreport; - -import cn.nukkit.Nukkit; -import cn.nukkit.Server; -import cn.nukkit.command.defaults.StatusCommand; -import cn.nukkit.math.NukkitMath; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.utils.TextFormat; -import com.sun.management.OperatingSystemMXBean; - -import java.lang.management.ManagementFactory; - -public class BugReportGenerator extends Thread { - - private final Throwable throwable; - private final String message; - - /** - * Allow bug reports to be handled by a plugin - */ - public static BugReportPlugin plugin; - - BugReportGenerator(Throwable throwable) { - setName("BugReportGenerator"); - this.throwable = throwable; - this.message = null; - } - - public BugReportGenerator(String message) { - setName("BugReportGenerator"); - this.throwable = null; - this.message = message; - } - - @Override - public void run() { - if (plugin != null) { - try { - plugin.bugReport(throwable, message); - } catch (Exception ex) { - Server.getInstance().getLogger().error("[BugReport] External bug report failed", ex); - } - } - try { - if (Server.getInstance().sentry != null) { - sentry(); - } - } catch (Exception ex) { - Server.getInstance().getLogger().error("[BugReport] Sending a bug report failed", ex); - } - } - - /** - * Send a bug report to Sentry - */ - private void sentry() { - Server.getInstance().getLogger().info("[BugReport] Sending a bug report ..."); - - Server.getInstance().sentry.getContext().clear(); - - if (throwable != null) { - boolean pluginError = false; - StackTraceElement[] stackTrace = throwable.getStackTrace(); - if (stackTrace.length > 0) { - String className = throwable.getStackTrace()[0].getClassName(); - if (!className.startsWith("cn.nukkit")) { - pluginError = true; - if (className.startsWith("org.hibernate")) { - return; - } - } - } else { - return; // Don't send empty stack traces - } - Server.getInstance().sentry.getContext().addTag("plugin_error", String.valueOf(pluginError)); - } - - StringBuilder plugins = new StringBuilder(); - try { - for (Plugin plugin : Server.getInstance().getPluginManager().getPlugins().values()) { - if (plugins.length() > 0) { - plugins.append(", "); - } - if (!plugin.isEnabled()) { - plugins.append('*'); - } - plugins.append(plugin.getDescription().getFullName()); - } - } catch (Exception ex) { - Server.getInstance().getLogger().logException(ex); - } - - String cpuType = System.getenv("PROCESSOR_IDENTIFIER"); - OperatingSystemMXBean osMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); - Server.getInstance().sentry.getContext().addExtra("Nukkit Version", Nukkit.getBranch() + '/' + Nukkit.VERSION.substring(4)); - Server.getInstance().sentry.getContext().addExtra("Java Version", System.getProperty("java.vm.name") + " (" + System.getProperty("java.runtime.version") + ')'); - Server.getInstance().sentry.getContext().addExtra("Host OS", osMXBean.getName() + '-' + osMXBean.getArch() + " [" + osMXBean.getVersion() + ']'); - Runtime runtime = Runtime.getRuntime(); - double usedMB = NukkitMath.round((double) (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024, 2); - double maxMB = NukkitMath.round(((double) runtime.maxMemory()) / 1024 / 1024, 2); - double usage = usedMB / maxMB * 100; - Server.getInstance().sentry.getContext().addExtra("Memory", usedMB + " MB (" + NukkitMath.round(usage, 2) + "%) of " + maxMB + " MB"); - Server.getInstance().sentry.getContext().addExtra("CPU Type", cpuType == null ? "UNKNOWN" : cpuType); - Server.getInstance().sentry.getContext().addExtra("Available Cores", String.valueOf(osMXBean.getAvailableProcessors())); - Server.getInstance().sentry.getContext().addExtra("Uptime", TextFormat.clean(StatusCommand.formatUptime(System.currentTimeMillis() - Nukkit.START_TIME))); - Server.getInstance().sentry.getContext().addExtra("Players", Server.getInstance().getOnlinePlayersCount() + "/" + Server.getInstance().getMaxPlayers()); - Server.getInstance().sentry.getContext().addExtra("Plugins", plugins.toString()); - Server.getInstance().sentry.getContext().addTag("nukkit_version", Nukkit.VERSION); - Server.getInstance().sentry.getContext().addTag("branch", Nukkit.getBranch()); - - if (throwable != null) { - Server.getInstance().sentry.getContext().addTag("watchdog", String.valueOf(false)); - Server.getInstance().sentry.sendException(throwable); - } else if (message != null) { - Server.getInstance().sentry.getContext().addTag("watchdog", String.valueOf(true)); - Server.getInstance().sentry.sendMessage(message); - } else { - Server.getInstance().getLogger().error("[BugReport] Failed to send a bug report: content cannot be null"); - } - } - - public static String getCount(long bytes, boolean si) { - int unit = si ? 1000 : 1024; - if (bytes < unit) return bytes + " B"; - int exp = (int) (Math.log(bytes) / Math.log(unit)); - String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i"); - return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); - } -} diff --git a/src/main/java/cn/nukkit/utils/bugreport/BugReportPlugin.java b/src/main/java/cn/nukkit/utils/bugreport/BugReportPlugin.java deleted file mode 100644 index b0e824c1f..000000000 --- a/src/main/java/cn/nukkit/utils/bugreport/BugReportPlugin.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.nukkit.utils.bugreport; - -public interface BugReportPlugin { - - /** - * Handle a bug report - * - * @param throwable exception or null - * @param message watchdog log or null - */ - void bugReport(Throwable throwable, String message); -} diff --git a/src/main/java/cn/nukkit/utils/bugreport/ExceptionHandler.java b/src/main/java/cn/nukkit/utils/bugreport/ExceptionHandler.java deleted file mode 100644 index 512443da0..000000000 --- a/src/main/java/cn/nukkit/utils/bugreport/ExceptionHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.utils.bugreport; - -import cn.nukkit.Nukkit; -import cn.nukkit.Server; - -public class ExceptionHandler implements Thread.UncaughtExceptionHandler { - - /** - * Register exception handler - */ - public static void registerExceptionHandler() { - Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler()); - } - - @Override - public void uncaughtException(Thread thread, Throwable throwable) { - handle(throwable); - } - - /** - * Handle exception, run BugReportGenerator - */ - public void handle(Throwable throwable) { - throwable.printStackTrace(); - - try { - new BugReportGenerator(throwable).start(); - } catch (Exception ex) { - if (Nukkit.DEBUG > 1) { - Server.getInstance().getLogger().logException(ex); - } - } - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/BlazeSpawner.java b/src/main/java/cn/nukkit/utils/spawners/BlazeSpawner.java deleted file mode 100644 index 90bf20e56..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/BlazeSpawner.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.entity.mob.EntityBlaze; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class BlazeSpawner extends AbstractEntitySpawner { - - public BlazeSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(1, 3) == 1) { - return; - } - - if (!(pos.y > 127) && !(pos.y < 1)) { - this.spawnTask.createEntity("Blaze", pos); - } - } - - @Override - public int getEntityNetworkId() { - return EntityBlaze.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/ChickenSpawner.java b/src/main/java/cn/nukkit/utils/spawners/ChickenSpawner.java deleted file mode 100644 index 360ba676c..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/ChickenSpawner.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityChicken; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class ChickenSpawner extends AbstractEntitySpawner { - - public ChickenSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Chicken", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityChicken.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/CodSpawner.java b/src/main/java/cn/nukkit/utils/spawners/CodSpawner.java deleted file mode 100644 index 9dce95c0a..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/CodSpawner.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.passive.EntityCod; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class CodSpawner extends AbstractEntitySpawner { - - public CodSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (blockId != Block.WATER && blockId != Block.STILL_WATER) { - } else if (biomeId != 0 && biomeId != 7) { - } else if (pos.y > 255 || pos.y < 1) { - } else { - int b = level.getBlockIdAt((int) pos.x, (int) (pos.y -1), (int) pos.z); - if (b == Block.WATER || b == Block.STILL_WATER) { - this.spawnTask.createEntity("Cod", pos.add(0, -1, 0)); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityCod.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/CowSpawner.java b/src/main/java/cn/nukkit/utils/spawners/CowSpawner.java deleted file mode 100644 index 518751a7a..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/CowSpawner.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityCow; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class CowSpawner extends AbstractEntitySpawner { - - public CowSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Cow", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityCow.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/CreeperSpawner.java b/src/main/java/cn/nukkit/utils/spawners/CreeperSpawner.java deleted file mode 100644 index c1f6f5c71..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/CreeperSpawner.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityCreeper; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class CreeperSpawner extends AbstractEntitySpawner { - - public CreeperSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (pos.y > 255 || pos.y < 1 || biomeId == 14 || biomeId == 15) { - } else if (Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (level.isMobSpawningAllowedByTime()) { - this.spawnTask.createEntity("Creeper", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityCreeper.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/DolphinSpawner.java b/src/main/java/cn/nukkit/utils/spawners/DolphinSpawner.java deleted file mode 100644 index 17276d156..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/DolphinSpawner.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockWater; -import cn.nukkit.entity.passive.EntityDolphin; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class DolphinSpawner extends AbstractEntitySpawner { - - public DolphinSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (blockId != Block.WATER && blockId != Block.STILL_WATER) { - } else if (biomeId != 0) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - if (level.getBlock(pos.add(0, -1, 0)) instanceof BlockWater) { - this.spawnTask.createEntity("Dolphin", pos.add(0, -1, 0)); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityDolphin.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/DonkeySpawner.java b/src/main/java/cn/nukkit/utils/spawners/DonkeySpawner.java deleted file mode 100644 index 4b9a6a935..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/DonkeySpawner.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityDonkey; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class DonkeySpawner extends AbstractEntitySpawner { - - public DonkeySpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - } else if (biomeId != 1 && biomeId != 35 && biomeId != 128 && biomeId != 129) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Donkey", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityDonkey.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/DrownedSpawner.java b/src/main/java/cn/nukkit/utils/spawners/DrownedSpawner.java deleted file mode 100644 index e14aadd31..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/DrownedSpawner.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityDrowned; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class DrownedSpawner extends AbstractEntitySpawner { - - public DrownedSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (blockId != Block.WATER && blockId != Block.STILL_WATER) { - } else if (biomeId != 0 && biomeId != 7) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (level.isMobSpawningAllowedByTime()) { - int b = level.getBlockIdAt((int) pos.x, (int) (pos.y -1), (int) pos.z); - if (b == Block.WATER || b == Block.STILL_WATER) { - this.spawnTask.createEntity("Drowned", pos.add(0, -1, 0)); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityDrowned.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/EndermanSpawner.java b/src/main/java/cn/nukkit/utils/spawners/EndermanSpawner.java deleted file mode 100644 index 63ac5d262..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/EndermanSpawner.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityEnderman; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class EndermanSpawner extends AbstractEntitySpawner { - - public EndermanSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - boolean nether = level.getDimension() == Level.DIMENSION_NETHER; - - if (Utils.rand(1, nether ? 10 : 7) != 1 && !level.isEnd) { - return; - } - - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if ((pos.y > 255 || (nether && pos.y > 127)) || pos.y < 1 || biomeId == 14 || biomeId == 15) { - } else if (Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7 && !nether && !level.isEnd) { - } else if (level.isMobSpawningAllowedByTime() || nether || level.isEnd) { - this.spawnTask.createEntity("Enderman", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityEnderman.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/FoxSpawner.java b/src/main/java/cn/nukkit/utils/spawners/FoxSpawner.java deleted file mode 100644 index 49d47cb96..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/FoxSpawner.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityFox; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class FoxSpawner extends AbstractEntitySpawner { - - public FoxSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(1, 3) == 1) { - return; - } - - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (biomeId != 5 && biomeId != 160 && biomeId != 31 && biomeId != 19 && biomeId != 30 && biomeId != 133 && biomeId != 158 && biomeId != 32 && biomeId != 33) { - } else if (blockId != Block.GRASS) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - int count = Utils.rand(2, 4); // They spawn in groups of 2-4 - for (int i = 0; i < count; i++) { - BaseEntity entity = this.spawnTask.createEntity("Fox", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityFox.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/GhastSpawner.java b/src/main/java/cn/nukkit/utils/spawners/GhastSpawner.java deleted file mode 100644 index 27ae03880..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/GhastSpawner.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.entity.mob.EntityGhast; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class GhastSpawner extends AbstractEntitySpawner { - - public GhastSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (!(pos.y > 127) && !(pos.y < 1)) { - this.spawnTask.createEntity("Ghast", pos); - } - } - - @Override - public int getEntityNetworkId() { - return EntityGhast.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/HoglinSpawner.java b/src/main/java/cn/nukkit/utils/spawners/HoglinSpawner.java deleted file mode 100644 index 8df14b45b..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/HoglinSpawner.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.mob.EntityHoglin; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class HoglinSpawner extends AbstractEntitySpawner { - - public HoglinSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (pos.y < 128 && pos.y > 0 && level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) == Block.NETHERRACK) { - for (int i = 0; i < 4; i++) { - BaseEntity entity = this.spawnTask.createEntity("Hoglin", pos.add(0, 1, 0)); - if (entity != null && Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityHoglin.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/HorseSpawner.java b/src/main/java/cn/nukkit/utils/spawners/HorseSpawner.java deleted file mode 100644 index a85591b5f..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/HorseSpawner.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityHorse; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class HorseSpawner extends AbstractEntitySpawner { - - public HorseSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - } else if (biomeId != 1 && biomeId != 35 && biomeId != 128 && biomeId != 129) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Horse", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityHorse.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/HuskSpawner.java b/src/main/java/cn/nukkit/utils/spawners/HuskSpawner.java deleted file mode 100644 index bc9754277..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/HuskSpawner.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.mob.EntityHusk; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class HuskSpawner extends AbstractEntitySpawner { - - public HuskSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (biomeId != 2 && biomeId != 130) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.SAND) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (level.isMobSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Husk", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityHusk.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/MagmaCubeSpawner.java b/src/main/java/cn/nukkit/utils/spawners/MagmaCubeSpawner.java deleted file mode 100644 index ebcc2ece8..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/MagmaCubeSpawner.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityMagmaCube; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class MagmaCubeSpawner extends AbstractEntitySpawner { - - public MagmaCubeSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.NETHERRACK) { - } else if (pos.y > 127 || pos.y < 1) { - } else { - this.spawnTask.createEntity("MagmaCube", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityMagmaCube.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/MooshroomSpawner.java b/src/main/java/cn/nukkit/utils/spawners/MooshroomSpawner.java deleted file mode 100644 index 2aa1b6c70..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/MooshroomSpawner.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityMooshroom; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class MooshroomSpawner extends AbstractEntitySpawner { - - public MooshroomSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(0, 3) == 1) { - return; - } - - int bid = level.getBiomeId((int) pos.x, (int) pos.z); - if (bid != 14 && bid != 15) { - } else if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.MYCELIUM) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Mooshroom", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityMooshroom.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/OcelotSpawner.java b/src/main/java/cn/nukkit/utils/spawners/OcelotSpawner.java deleted file mode 100644 index 2146a5d4e..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/OcelotSpawner.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityOcelot; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class OcelotSpawner extends AbstractEntitySpawner { - - public OcelotSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(1, 3) == 1) { - return; - } - - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (biomeId != 21 && biomeId != 149 && biomeId != 23 && biomeId != 151) { - } else if (blockId != Block.GRASS && blockId != Block.LEAVES) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Ocelot", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityOcelot.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/PandaSpawner.java b/src/main/java/cn/nukkit/utils/spawners/PandaSpawner.java deleted file mode 100644 index dc5a685cd..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/PandaSpawner.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityPanda; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class PandaSpawner extends AbstractEntitySpawner { - - public PandaSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - if ((biomeId == 21 && Utils.rand(1, 10) != 1) || biomeId != 168 && biomeId != 169 && biomeId != 21) { - return; - } - - if (pos.y > 255 || pos.y < 1 || !level.isAnimalSpawningAllowedByTime() || - level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - return; - } - - BaseEntity entity = this.spawnTask.createEntity("Panda", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityPanda.NETWORK_ID; - } -} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/utils/spawners/ParrotSpawner.java b/src/main/java/cn/nukkit/utils/spawners/ParrotSpawner.java deleted file mode 100644 index 3842ea9ff..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/ParrotSpawner.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.passive.EntityParrot; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class ParrotSpawner extends AbstractEntitySpawner { - - public ParrotSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(1, 3) == 1) { - return; - } - - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (biomeId != 21 && biomeId != 149 && biomeId != 23 && biomeId != 151) { - } else if (blockId != Block.GRASS && blockId != Block.LEAVES) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - this.spawnTask.createEntity("Parrot", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityParrot.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/PhantomSpawner.java b/src/main/java/cn/nukkit/utils/spawners/PhantomSpawner.java deleted file mode 100644 index 6a336dec8..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/PhantomSpawner.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.entity.mob.EntityPhantom; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class PhantomSpawner extends AbstractEntitySpawner { - - public PhantomSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (level.isMobSpawningAllowedByTime()) { - if (pos.y < 130 && pos.y > 0 && biomeId != 14 && biomeId != 15 && level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) == 0 && level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) < 8) { // "Phantoms spawn if the player's Y-coordinate is between 1 and 129" - Minecraft Wiki - EntityPhantom phantom = (EntityPhantom) this.spawnTask.createEntity("Phantom", pos); - if (phantom != null) { - phantom.setTarget(player); - } - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityPhantom.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/PigSpawner.java b/src/main/java/cn/nukkit/utils/spawners/PigSpawner.java deleted file mode 100644 index 63414f4c9..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/PigSpawner.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityPig; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class PigSpawner extends AbstractEntitySpawner { - - public PigSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Pig", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityPig.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/PiglinSpawner.java b/src/main/java/cn/nukkit/utils/spawners/PiglinSpawner.java deleted file mode 100644 index 8e82c56ba..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/PiglinSpawner.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.mob.EntityPiglin; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class PiglinSpawner extends AbstractEntitySpawner { - - public PiglinSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (pos.y < 128 && pos.y > 0 && level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) == Block.NETHERRACK && level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) < 8) { - for (int i = 0; i < 4; i++) { - BaseEntity entity = this.spawnTask.createEntity("Piglin", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityPiglin.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/PolarBearSpawner.java b/src/main/java/cn/nukkit/utils/spawners/PolarBearSpawner.java deleted file mode 100644 index 8a868a80c..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/PolarBearSpawner.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntityPolarBear; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class PolarBearSpawner extends AbstractEntitySpawner { - - public PolarBearSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (level.getBiomeId((int) pos.x, (int) pos.z) != 12) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("PolarBear", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityPolarBear.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/PufferfishSpawner.java b/src/main/java/cn/nukkit/utils/spawners/PufferfishSpawner.java deleted file mode 100644 index 7f1ea9f40..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/PufferfishSpawner.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.passive.EntityPufferfish; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class PufferfishSpawner extends AbstractEntitySpawner { - - public PufferfishSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(1, 3) == 1) { - return; - } - - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (blockId != Block.WATER && blockId != Block.STILL_WATER) { - } else if (biomeId != 0 && biomeId != 7) { - } else if (pos.y > 255 || pos.y < 1) { - } else { - int b = level.getBlockIdAt((int) pos.x, (int) (pos.y -1), (int) pos.z); - if (b == Block.WATER || b == Block.STILL_WATER) { - this.spawnTask.createEntity("Pufferfish", pos.add(0, -1, 0)); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityPufferfish.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/RabbitSpawner.java b/src/main/java/cn/nukkit/utils/spawners/RabbitSpawner.java deleted file mode 100644 index 68de94dca..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/RabbitSpawner.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.passive.EntityRabbit; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class RabbitSpawner extends AbstractEntitySpawner { - - public RabbitSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(1, 3) == 1) { - return; - } - - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (biomeId != 2 && biomeId != 130 && biomeId != 30 && biomeId != 5 && biomeId != 12) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - } else if (level.isAnimalSpawningAllowedByTime()) { - this.spawnTask.createEntity("Rabbit", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityRabbit.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/SalmonSpawner.java b/src/main/java/cn/nukkit/utils/spawners/SalmonSpawner.java deleted file mode 100644 index cbe92a529..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/SalmonSpawner.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.passive.EntitySalmon; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class SalmonSpawner extends AbstractEntitySpawner { - - public SalmonSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (blockId != Block.WATER && blockId != Block.STILL_WATER) { - } else if (biomeId != 0 && biomeId != 7) { - } else if (pos.y > 255 || pos.y < 1) { - } else { - int b = level.getBlockIdAt((int) pos.x, (int) (pos.y -1), (int) pos.z); - if (b == Block.WATER || b == Block.STILL_WATER) { - this.spawnTask.createEntity("Salmon", pos.add(0, -1, 0)); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntitySalmon.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/SheepSpawner.java b/src/main/java/cn/nukkit/utils/spawners/SheepSpawner.java deleted file mode 100644 index b60f6abb1..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/SheepSpawner.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.passive.EntitySheep; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class SheepSpawner extends AbstractEntitySpawner { - - public SheepSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - BaseEntity entity = this.spawnTask.createEntity("Sheep", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntitySheep.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/SkeletonSpawner.java b/src/main/java/cn/nukkit/utils/spawners/SkeletonSpawner.java deleted file mode 100644 index 6d4d21e7d..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/SkeletonSpawner.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntitySkeleton; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class SkeletonSpawner extends AbstractEntitySpawner { - - public SkeletonSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (pos.y > 255 || pos.y < 1 || biomeId == 14 || biomeId == 15) { - } else if (Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (level.isMobSpawningAllowedByTime()) { - this.spawnTask.createEntity("Skeleton", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntitySkeleton.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/SlimeSpawner.java b/src/main/java/cn/nukkit/utils/spawners/SlimeSpawner.java deleted file mode 100644 index b442a877c..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/SlimeSpawner.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntitySlime; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class SlimeSpawner extends AbstractEntitySpawner { - - public SlimeSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - } else if (biomeId != 6 && biomeId != 134) { - } else if (pos.y > 70 || pos.y < 1) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (level.isMobSpawningAllowedByTime()) { - this.spawnTask.createEntity("Slime", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntitySlime.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/SpiderSpawner.java b/src/main/java/cn/nukkit/utils/spawners/SpiderSpawner.java deleted file mode 100644 index 3505833d2..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/SpiderSpawner.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntitySpider; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class SpiderSpawner extends AbstractEntitySpawner { - - public SpiderSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (pos.y > 255 || pos.y < 1 || biomeId == 14 || biomeId == 15) { - } else if (Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (level.isMobSpawningAllowedByTime()) { - this.spawnTask.createEntity("Spider", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntitySpider.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/SquidSpawner.java b/src/main/java/cn/nukkit/utils/spawners/SquidSpawner.java deleted file mode 100644 index 6fe20ba0e..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/SquidSpawner.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.passive.EntitySquid; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class SquidSpawner extends AbstractEntitySpawner { - - public SquidSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (blockId != Block.WATER && blockId != Block.STILL_WATER) { - } else if (level.getBiomeId((int) pos.x, (int) pos.z) != 0) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - int b = level.getBlockIdAt((int) pos.x, (int) (pos.y -1), (int) pos.z); - if (b == Block.WATER || b == Block.STILL_WATER) { - this.spawnTask.createEntity("Squid", pos.add(0, -1, 0)); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntitySquid.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/StraySpawner.java b/src/main/java/cn/nukkit/utils/spawners/StraySpawner.java deleted file mode 100644 index e56086d11..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/StraySpawner.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityStray; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class StraySpawner extends AbstractEntitySpawner { - - public StraySpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (biomeId != 12 && biomeId != 30) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (level.isMobSpawningAllowedByTime()) { - this.spawnTask.createEntity("Stray", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityStray.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/TropicalFishSpawner.java b/src/main/java/cn/nukkit/utils/spawners/TropicalFishSpawner.java deleted file mode 100644 index 538c346ce..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/TropicalFishSpawner.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.passive.EntityTropicalFish; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class TropicalFishSpawner extends AbstractEntitySpawner { - - public TropicalFishSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (blockId != Block.WATER && blockId != Block.STILL_WATER) { - } else if (biomeId != 0 && biomeId != 7) { - } else if (pos.y > 255 || pos.y < 1) { - } else { - int b = level.getBlockIdAt((int) pos.x, (int) (pos.y -1), (int) pos.z); - if (b == Block.WATER || b == Block.STILL_WATER) { - this.spawnTask.createEntity("TropicalFish", pos.add(0, -1, 0)); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityTropicalFish.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/TurtleSpawner.java b/src/main/java/cn/nukkit/utils/spawners/TurtleSpawner.java deleted file mode 100644 index 94996732b..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/TurtleSpawner.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.passive.EntityTurtle; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class TurtleSpawner extends AbstractEntitySpawner { - - public TurtleSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(1, 3) == 1) { - return; - } - - final int blockId = level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z); - - if (blockId != Block.WATER && blockId != Block.STILL_WATER) { - } else if (level.getBiomeId((int) pos.x, (int) pos.z) != 0) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.isAnimalSpawningAllowedByTime()) { - int b = level.getBlockIdAt((int) pos.x, (int) (pos.y -1), (int) pos.z); - if (b == Block.WATER || b == Block.STILL_WATER) { - this.spawnTask.createEntity("Turtle", pos.add(0, -1, 0)); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityTurtle.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/WitchSpawner.java b/src/main/java/cn/nukkit/utils/spawners/WitchSpawner.java deleted file mode 100644 index 20df2d9d4..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/WitchSpawner.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityWitch; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class WitchSpawner extends AbstractEntitySpawner { - - public WitchSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (Utils.rand(1, 5) != 1 && biomeId != 6 && biomeId != 134) { - return; - } - - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.GRASS) { - } else if (pos.y > 255 || pos.y < 1) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (level.isMobSpawningAllowedByTime()) { - this.spawnTask.createEntity("Witch", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityWitch.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/WitherSkeletonSpawner.java b/src/main/java/cn/nukkit/utils/spawners/WitherSkeletonSpawner.java deleted file mode 100644 index 294ea5ac2..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/WitherSkeletonSpawner.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityWitherSkeleton; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; -import cn.nukkit.utils.Utils; - -public class WitherSkeletonSpawner extends AbstractEntitySpawner { - - public WitherSkeletonSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (Utils.rand(1, 3) == 1) { - return; - } - - if (pos.y > 127 || pos.y < 1) { - } else if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.NETHERRACK) { - } else { - this.spawnTask.createEntity("WitherSkeleton", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityWitherSkeleton.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/WolfSpawner.java b/src/main/java/cn/nukkit/utils/spawners/WolfSpawner.java deleted file mode 100644 index 362da391f..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/WolfSpawner.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.mob.EntityWolf; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.SpawnerTask; - -public class WolfSpawner extends AbstractEntitySpawner { - - public WolfSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (level.isAnimalSpawningAllowedByTime() && ((biomeId == 4 || biomeId == 5 || biomeId == 20 || biomeId == 27 || biomeId == 30 || biomeId == 32 || biomeId == 133 || biomeId == 158) && (!(pos.y > 255) && !(pos.y < 1))) && !Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - this.spawnTask.createEntity("Wolf", pos.add(0, 1, 0)); - } - } - - @Override - public final int getEntityNetworkId() { - return EntityWolf.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/ZombiePigmanSpawner.java b/src/main/java/cn/nukkit/utils/spawners/ZombiePigmanSpawner.java deleted file mode 100644 index 9f9ea3be5..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/ZombiePigmanSpawner.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.mob.EntityZombiePigman; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class ZombiePigmanSpawner extends AbstractEntitySpawner { - - public ZombiePigmanSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - if (level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z) != Block.NETHERRACK) { - } else if (pos.y > 127 || pos.y < 1) { - } else { - BaseEntity entity = this.spawnTask.createEntity("ZombiePigman", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityZombiePigman.NETWORK_ID; - } -} diff --git a/src/main/java/cn/nukkit/utils/spawners/ZombieSpawner.java b/src/main/java/cn/nukkit/utils/spawners/ZombieSpawner.java deleted file mode 100644 index 1c3989907..000000000 --- a/src/main/java/cn/nukkit/utils/spawners/ZombieSpawner.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.nukkit.utils.spawners; - -import cn.nukkit.Player; -import cn.nukkit.block.Block; -import cn.nukkit.entity.BaseEntity; -import cn.nukkit.entity.mob.EntityZombie; -import cn.nukkit.level.Level; -import cn.nukkit.level.Position; -import cn.nukkit.utils.AbstractEntitySpawner; -import cn.nukkit.utils.Utils; -import cn.nukkit.utils.SpawnerTask; - -public class ZombieSpawner extends AbstractEntitySpawner { - - public ZombieSpawner(SpawnerTask spawnTask) { - super(spawnTask); - } - - @Override - public void spawn(Player player, Position pos, Level level) { - final int biomeId = level.getBiomeId((int) pos.x, (int) pos.z); - - if (pos.y > 255 || pos.y < 1 || biomeId == 14 || biomeId == 15) { - } else if (level.getBlockLightAt((int) pos.x, (int) pos.y, (int) pos.z) > 7) { - } else if (Block.transparent[level.getBlockIdAt((int) pos.x, (int) pos.y, (int) pos.z)]) { - } else if (level.isMobSpawningAllowedByTime()) { - if (Utils.rand(1, 40) == 30) { - BaseEntity entity = this.spawnTask.createEntity("ZombieVillager", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } else { - BaseEntity entity = this.spawnTask.createEntity("Zombie", pos.add(0, 1, 0)); - if (entity == null) return; - if (Utils.rand(1, 20) == 1) { - entity.setBaby(true); - } - } - } - } - - @Override - public final int getEntityNetworkId() { - return EntityZombie.NETWORK_ID; - } -} diff --git a/src/main/java/co/aikar/timings/FullServerTickTiming.java b/src/main/java/co/aikar/timings/FullServerTickTiming.java deleted file mode 100644 index eecb7b31d..000000000 --- a/src/main/java/co/aikar/timings/FullServerTickTiming.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import static co.aikar.timings.TimingIdentifier.DEFAULT_GROUP; -import static co.aikar.timings.TimingsManager.*; - -public class FullServerTickTiming extends Timing { - - private static final TimingIdentifier IDENTIFIER = new TimingIdentifier(DEFAULT_GROUP.name, "Full Server Tick", null); - final TimingData minuteData; - double avgFreeMemory = -1.0; - double avgUsedMemory = -1.0; - - FullServerTickTiming() { - super(IDENTIFIER); - this.minuteData = new TimingData(this.id); - TIMING_MAP.put(IDENTIFIER, this); - } - - @Override - public Timing startTiming() { - if (TimingsManager.needsFullReset) { - TimingsManager.resetTimings(); - } else if (TimingsManager.needsRecheckEnabled) { - TimingsManager.recheckEnabled(); - } - super.startTiming(); - return this; - } - - @Override - public void stopTiming() { - super.stopTiming(); - - if (!this.enabled) { - return; - } - - if (TimingsHistory.timedTicks % 20 == 0) { - final Runtime runtime = Runtime.getRuntime(); - double usedMemory = runtime.totalMemory() - runtime.freeMemory(); - double freeMemory = runtime.maxMemory() - usedMemory; - - if (this.avgFreeMemory == -1) { - this.avgFreeMemory = freeMemory; - } else { - this.avgFreeMemory = (this.avgFreeMemory * (0.9833333333333333)) + (freeMemory * (0.016666666666666666)); - } - - if (this.avgUsedMemory == -1) { - this.avgUsedMemory = usedMemory; - } else { - this.avgUsedMemory = (this.avgUsedMemory * (0.9833333333333333)) + (usedMemory * (0.016666666666666666)); - } - } - - long start = System.nanoTime(); - TimingsManager.tick(); - long diff = System.nanoTime() - start; - - CURRENT = Timings.timingsTickTimer; - Timings.timingsTickTimer.addDiff(diff); - this.record.curTickCount--; - this.minuteData.curTickTotal = this.record.curTickTotal; - this.minuteData.curTickCount = 1; - boolean violated = isViolated(); - this.minuteData.tick(violated); - Timings.timingsTickTimer.tick(violated); - tick(violated); - - if (TimingsHistory.timedTicks % 1200 == 0) { - MINUTE_REPORTS.add(new TimingsHistory.MinuteReport()); - TimingsHistory.resetTicks(false); - this.minuteData.reset(); - } - - if (TimingsHistory.timedTicks % Timings.getHistoryInterval() == 0) { - TimingsManager.HISTORY.add(new TimingsHistory()); - TimingsManager.resetTimings(); - } - } - - boolean isViolated() { - return this.record.curTickTotal > 50000000; - } -} diff --git a/src/main/java/co/aikar/timings/Timing.java b/src/main/java/co/aikar/timings/Timing.java deleted file mode 100644 index cce4db1a4..000000000 --- a/src/main/java/co/aikar/timings/Timing.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import java.util.HashMap; -import java.util.Map; - -public class Timing implements AutoCloseable { - - private static int idPool = 1; - final int id = idPool++; - - final String name; - private final boolean verbose; - - final Map children = new HashMap<>(); - private Timing parent; - - private final Timing groupTiming; - final TimingData record; - - private long start = 0; - private int timingDepth = 0; - private boolean added; - boolean timed; - boolean enabled; - - Timing(TimingIdentifier id) { - if (id.name.startsWith("##")) { - this.verbose = true; - this.name = id.name.substring(3); - } else { - this.name = id.name; - this.verbose = false; - } - - this.record = new TimingData(this.id); - this.groupTiming = id.groupTiming; - - TimingIdentifier.getGroup(id.group).timings.add(this); - this.checkEnabled(); - } - - final void checkEnabled() { - this.enabled = Timings.isTimingsEnabled() && (!this.verbose || Timings.isVerboseEnabled()); - } - - void tick(boolean violated) { - if (this.timingDepth != 0 || this.record.curTickCount == 0) { - this.timingDepth = 0; - this.start = 0; - return; - } - - this.record.tick(violated); - for (TimingData data : this.children.values()) { - data.tick(violated); - } - } - - public Timing startTiming() { - if (!this.enabled) { - return this; - } - - if (++this.timingDepth == 1) { - this.start = System.nanoTime(); - this.parent = TimingsManager.CURRENT; - TimingsManager.CURRENT = this; - } - - return this; - } - - public void stopTiming() { - if (!this.enabled) { - return; - } - - if (--this.timingDepth == 0 && this.start != 0) { - this.addDiff(System.nanoTime() - this.start); - this.start = 0; - } - } - - public void abort() { - if (this.enabled && this.timingDepth > 0) { - this.start = 0; - } - } - - void addDiff(long diff) { - if (TimingsManager.CURRENT == this) { - TimingsManager.CURRENT = this.parent; - if (this.parent != null) { - if (!this.parent.children.containsKey(this.id)) - this.parent.children.put(this.id, new TimingData(this.id)); - this.parent.children.get(this.id).add(diff); - } - } - - this.record.add(diff); - if (!this.added) { - this.added = true; - this.timed = true; - TimingsManager.TIMINGS.add(this); - } - - if (this.groupTiming != null) { - this.groupTiming.addDiff(diff); - - if (!this.groupTiming.children.containsKey(this.id)) - this.groupTiming.children.put(this.id, new TimingData(this.id)); - this.groupTiming.children.get(this.id).add(diff); - } - } - - void reset(boolean full) { - this.record.reset(); - if (full) { - this.timed = false; - } - this.start = 0; - this.timingDepth = 0; - this.added = false; - this.children.clear(); - this.checkEnabled(); - } - - @Override - public boolean equals(Object o) { - return (o instanceof Timing && this == o); - } - - @Override - public int hashCode() { - return this.id; - } - - @Override - public void close() { - this.stopTiming(); - } - - boolean isSpecial() { - return this == Timings.fullServerTickTimer || this == Timings.timingsTickTimer; - } -} diff --git a/src/main/java/co/aikar/timings/TimingData.java b/src/main/java/co/aikar/timings/TimingData.java deleted file mode 100644 index 821bf0d8e..000000000 --- a/src/main/java/co/aikar/timings/TimingData.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import com.google.gson.JsonArray; - -import cn.nukkit.utils.JsonUtil; - -class TimingData { - - private int id; - int count = 0; - private int lagCount = 0; - long totalTime = 0; - private long lagTotalTime = 0; - - int curTickCount = 0; - int curTickTotal = 0; - - TimingData(int id) { - this.id = id; - } - - TimingData(TimingData data) { - this.id = data.id; - this.count = data.count; - this.lagCount = data.lagCount; - this.totalTime = data.totalTime; - this.lagTotalTime = data.lagTotalTime; - } - - void add(long diff) { - ++this.curTickCount; - this.curTickTotal += diff; - } - - void tick(boolean violated) { - this.count += this.curTickCount; - this.totalTime += this.curTickTotal; - - if (violated) { - this.lagCount += this.curTickCount; - this.lagTotalTime += this.curTickTotal; - } - - this.curTickCount = 0; - this.curTickTotal = 0; - } - - void reset() { - this.count = 0; - this.lagCount = 0; - this.totalTime = 0; - this.lagTotalTime = 0; - this.curTickCount = 0; - this.curTickTotal = 0; - } - - protected TimingData clone() { - return new TimingData(this); - } - - JsonArray export() { - JsonArray json = JsonUtil.toArray(this.id, this.count, this.totalTime); - if (this.lagCount > 0) { - json.add(this.lagCount); - json.add(this.lagTotalTime); - } - return json; - } -} diff --git a/src/main/java/co/aikar/timings/TimingIdentifier.java b/src/main/java/co/aikar/timings/TimingIdentifier.java deleted file mode 100644 index f345ca519..000000000 --- a/src/main/java/co/aikar/timings/TimingIdentifier.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import java.util.ArrayDeque; -import java.util.IdentityHashMap; -import java.util.Map; - -class TimingIdentifier { - - static final Map GROUP_MAP = new IdentityHashMap<>(64); - static final TimingGroup DEFAULT_GROUP = getGroup("Nukkit"); - - final String group; - final String name; - final Timing groupTiming; - private final int hashCode; - - TimingIdentifier(String group, String name, Timing groupTiming) { - this.group = group != null ? group.intern() : DEFAULT_GROUP.name; - this.name = name.intern(); - this.groupTiming = groupTiming; - this.hashCode = (31 * this.group.hashCode()) + this.name.hashCode(); - } - - static TimingGroup getGroup(String name) { - if (name == null) { - return DEFAULT_GROUP; - } - - return GROUP_MAP.computeIfAbsent(name, k -> new TimingGroup(name)); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof TimingIdentifier)) { - return false; - } - - TimingIdentifier that = (TimingIdentifier) o; - return this.group == that.group && this.name == that.name; - } - - @Override - public int hashCode() { - return this.hashCode; - } - - static class TimingGroup { - private static int idPool = 1; - final int id = idPool++; - - final String name; - ArrayDeque timings = new ArrayDeque<>(64); - - TimingGroup(String name) { - this.name = name.intern(); - } - } -} diff --git a/src/main/java/co/aikar/timings/Timings.java b/src/main/java/co/aikar/timings/Timings.java deleted file mode 100644 index ce9259ff1..000000000 --- a/src/main/java/co/aikar/timings/Timings.java +++ /dev/null @@ -1,258 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import cn.nukkit.Server; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.command.Command; -import cn.nukkit.entity.Entity; -import cn.nukkit.event.Event; -import cn.nukkit.event.Listener; -import cn.nukkit.network.protocol.DataPacket; -import cn.nukkit.plugin.EventExecutor; -import cn.nukkit.plugin.MethodEventExecutor; -import cn.nukkit.plugin.Plugin; -import cn.nukkit.scheduler.PluginTask; -import cn.nukkit.scheduler.TaskHandler; - -import java.util.HashSet; -import java.util.Queue; -import java.util.Set; - -import static co.aikar.timings.TimingIdentifier.DEFAULT_GROUP; - -public final class Timings { - - private static boolean timingsEnabled = false; - private static boolean verboseEnabled = false; - private static boolean privacy; - private static Set ignoredConfigSections = new HashSet<>(); - - private static final int MAX_HISTORY_FRAMES = 12; - private static int historyInterval = -1; - private static int historyLength = -1; - - public static final FullServerTickTiming fullServerTickTimer; - public static Timing timingsTickTimer; - public static Timing pluginEventTimer; - - public static Timing connectionTimer; - public static Timing schedulerTimer; - public static Timing schedulerAsyncTimer; - public static Timing schedulerSyncTimer; - public static Timing commandTimer; - public static Timing serverCommandTimer; - public static Timing levelSaveTimer; - - public static Timing playerNetworkSendTimer; - public static Timing playerNetworkReceiveTimer; - public static Timing playerChunkOrderTimer; - public static Timing playerChunkSendTimer; - public static Timing playerCommandTimer; - - public static Timing tickEntityTimer; - public static Timing tickBlockEntityTimer; - public static Timing entityMoveTimer; - public static Timing entityBaseTickTimer; - public static Timing livingEntityBaseTickTimer; - - public static Timing generationTimer; - public static Timing populationTimer; - public static Timing generationCallbackTimer; - - public static Timing permissibleCalculationTimer; - public static Timing permissionDefaultTimer; - - private static final String empty = "?"; - - static { - setTimingsEnabled(Server.getInstance().getPropertyBoolean("enable-timings", false)); - setVerboseEnabled(Server.getInstance().getPropertyBoolean("timings-verbose", false)); - setHistoryInterval(Server.getInstance().getPropertyInt("timings-history-interval", 6000)); - setHistoryLength(Server.getInstance().getPropertyInt("timings-history-length", 72000)); - privacy = Server.getInstance().getPropertyBoolean("timings-privacy", false); - - Server.getInstance().getLogger().debug("Timings: \n" + - "Enabled - " + timingsEnabled + '\n' + - "Verbose - " + verboseEnabled + '\n' + - "History Interval - " + historyInterval + '\n' + - "History Length - " + historyLength); - - fullServerTickTimer = new FullServerTickTiming(); - init(); - } - - public static void init() { - timingsTickTimer = TimingsManager.getTiming(DEFAULT_GROUP.name, "Timings Tick", fullServerTickTimer); - pluginEventTimer = TimingsManager.getTiming("Plugin Events"); - - connectionTimer = TimingsManager.getTiming("Connection Handler"); - schedulerTimer = TimingsManager.getTiming("Scheduler"); - schedulerAsyncTimer = TimingsManager.getTiming("## Scheduler - Async Tasks"); - schedulerSyncTimer = TimingsManager.getTiming("## Scheduler - Sync Tasks"); - commandTimer = TimingsManager.getTiming("Commands"); - serverCommandTimer = TimingsManager.getTiming("Server Command"); - levelSaveTimer = TimingsManager.getTiming("Level Save"); - - playerNetworkSendTimer = TimingsManager.getTiming("Player Network Send"); - playerNetworkReceiveTimer = TimingsManager.getTiming("Player Network Receive"); - playerChunkOrderTimer = TimingsManager.getTiming("Player Order Chunks"); - playerChunkSendTimer = TimingsManager.getTiming("Player Send Chunks"); - playerCommandTimer = TimingsManager.getTiming("Player Command"); - - tickEntityTimer = TimingsManager.getTiming("## Entity Tick"); - tickBlockEntityTimer = TimingsManager.getTiming("## BlockEntity Tick"); - entityMoveTimer = TimingsManager.getTiming("## Entity Move"); - entityBaseTickTimer = TimingsManager.getTiming("## Entity Base Tick"); - livingEntityBaseTickTimer = TimingsManager.getTiming("## LivingEntity Base Tick"); - - generationTimer = TimingsManager.getTiming("Level Generation"); - populationTimer = TimingsManager.getTiming("Level Population"); - generationCallbackTimer = TimingsManager.getTiming("Level Generation Callback"); - - permissibleCalculationTimer = TimingsManager.getTiming("Permissible Calculation"); - permissionDefaultTimer = TimingsManager.getTiming("Default Permission Calculation"); - } - - public static boolean isTimingsEnabled() { - return timingsEnabled; - } - - public static void setTimingsEnabled(boolean enabled) { - timingsEnabled = enabled; - if (enabled) { - init(); - } - TimingsManager.reset(); - } - - public static boolean isVerboseEnabled() { - return verboseEnabled; - } - - public static void setVerboseEnabled(boolean enabled) { - verboseEnabled = enabled; - TimingsManager.needsRecheckEnabled = true; - } - - public static boolean isPrivacy() { - return privacy; - } - - public static Set getIgnoredConfigSections() { - return ignoredConfigSections; - } - - public static int getHistoryInterval() { - return historyInterval; - } - - public static void setHistoryInterval(int interval) { - historyInterval = Math.max(1200, interval); - if (historyLength != -1) { - setHistoryLength(historyLength); - } - } - - public static int getHistoryLength() { - return historyLength; - } - - public static void setHistoryLength(int length) { - int maxLength = historyInterval * MAX_HISTORY_FRAMES; - if (Server.getInstance().getPropertyBoolean("timings-bypass-max", false)) { - maxLength = Integer.MAX_VALUE; - } - - historyLength = Math.max(Math.min(maxLength, length), historyInterval); - - Queue oldQueue = TimingsManager.HISTORY; - int frames = (historyLength / historyInterval); - if (length > maxLength) { - Server.getInstance().getLogger().warning( - "Timings Length too high. Requested " + length + ", max is " + maxLength - + ". To get longer history, you must increase your interval. Set Interval to " - + Math.ceil((float) length / MAX_HISTORY_FRAMES) - + " to achieve this length."); - } - - TimingsManager.HISTORY = new TimingsManager.BoundedQueue<>(frames); - TimingsManager.HISTORY.addAll(oldQueue); - } - - public static void reset() { - TimingsManager.reset(); - } - - public static Timing getCommandTiming(Command command) { - return TimingsManager.getTiming(DEFAULT_GROUP.name, "Command: " + command.getLabel(), commandTimer); - } - - public static Timing getTaskTiming(TaskHandler handler, long period) { - String repeating; - if (period > 0) { - repeating = " (interval:" + period + ')'; - } else { - repeating = " (Single)"; - } - - if (handler.getTask() instanceof PluginTask) { - String owner = ((PluginTask) handler.getTask()).getOwner().getName(); - return TimingsManager.getTiming(owner, "PluginTask: " + handler.getTaskId() + repeating, schedulerSyncTimer); - } else if (!handler.isAsynchronous()) { - return TimingsManager.getTiming(DEFAULT_GROUP.name, "Task: " + handler.getTaskId() + repeating, schedulerSyncTimer); - } else { - return null; - } - } - - public static Timing getPluginEventTiming(Class event, Listener listener, EventExecutor executor, Plugin plugin) { - Timing group = TimingsManager.getTiming(plugin.getName(), "Combined Total", pluginEventTimer); - - return TimingsManager.getTiming(plugin.getName(), "Event: " + listener.getClass().getName() + '.' - + (executor instanceof MethodEventExecutor ? ((MethodEventExecutor) executor).getMethod().getName() : "???") - + " (" + (timingsEnabled ? event.getSimpleName() : empty) + ')', group); - } - - public static Timing getEntityTiming(Entity entity) { - return TimingsManager.getTiming(DEFAULT_GROUP.name, "## Entity Tick: " + (timingsEnabled ? entity.getClass().getSimpleName() : empty), tickEntityTimer); - } - - public static Timing getBlockEntityTiming(BlockEntity blockEntity) { - return TimingsManager.getTiming(DEFAULT_GROUP.name, "## BlockEntity Tick: " + (timingsEnabled ? blockEntity.getClass().getSimpleName() : empty), tickBlockEntityTimer); - } - - public static Timing getReceiveDataPacketTiming(DataPacket pk) { - return TimingsManager.getTiming(DEFAULT_GROUP.name, "## Receive Packet: " + (timingsEnabled ? pk.getClass().getSimpleName() : empty), playerNetworkReceiveTimer); - } - - public static Timing getSendDataPacketTiming(DataPacket pk) { - return TimingsManager.getTiming(DEFAULT_GROUP.name, "## Send Packet: " + (timingsEnabled ? pk.getClass().getSimpleName() : empty), playerNetworkSendTimer); - } - - public static void stopServer() { - setTimingsEnabled(false); - TimingsManager.recheckEnabled(); - } -} diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java deleted file mode 100644 index b01fe391a..000000000 --- a/src/main/java/co/aikar/timings/TimingsExport.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import cn.nukkit.Server; -import cn.nukkit.command.CommandSender; -import cn.nukkit.command.ConsoleCommandSender; -import cn.nukkit.command.RemoteConsoleCommandSender; -import cn.nukkit.lang.TranslationContainer; -import cn.nukkit.nbt.stream.PGZIPOutputStream; -import cn.nukkit.utils.JsonUtil; -import cn.nukkit.utils.TextFormat; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; - -import java.io.*; -import java.lang.management.ManagementFactory; -import java.lang.management.RuntimeMXBean; -import java.net.HttpURLConnection; -import java.net.InetAddress; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.zip.Deflater; - -import static co.aikar.timings.TimingsManager.HISTORY; - -public class TimingsExport extends Thread { - - private final CommandSender sender; - private final JsonObject out; - private final TimingsHistory[] history; - - private TimingsExport(CommandSender sender, JsonObject out, TimingsHistory[] history) { - super("Timings paste thread"); - this.sender = sender; - this.out = out; - this.history = history; - } - - /** - * Builds a JSON timings report and sends it to Aikar's viewer - * - * @param sender Sender that issued the command - */ - public static void reportTimings(CommandSender sender) { - JsonObject out = new JsonObject(); - out.addProperty("version", Server.getInstance().getVersion()); - out.addProperty("maxplayers", Server.getInstance().getMaxPlayers()); - out.addProperty("start", TimingsManager.timingStart / 1000); - out.addProperty("end", System.currentTimeMillis() / 1000); - out.addProperty("sampletime", (System.currentTimeMillis() - TimingsManager.timingStart) / 1000); - - if (!Timings.isPrivacy()) { - out.addProperty("server", Server.getInstance().getName()); - out.addProperty("motd", Server.getInstance().getMotd()); - out.addProperty("online-mode", Server.getInstance().xboxAuth); - out.addProperty("icon", ""); - } - - final Runtime runtime = Runtime.getRuntime(); - RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean(); - - JsonObject system = new JsonObject(); - system.addProperty("timingcost", getCost()); - system.addProperty("name", System.getProperty("os.name")); - system.addProperty("version", System.getProperty("os.version")); - system.addProperty("jvmversion", System.getProperty("java.version")); - system.addProperty("arch", System.getProperty("os.arch")); - system.addProperty("maxmem", runtime.maxMemory()); - system.addProperty("cpu", runtime.availableProcessors()); - system.addProperty("runtime", ManagementFactory.getRuntimeMXBean().getUptime()); - system.addProperty("flags", String.join(" ", runtimeBean.getInputArguments())); - system.add("gc", JsonUtil.mapToObject(ManagementFactory.getGarbageCollectorMXBeans(), (input) -> - new JsonUtil.JSONPair(input.getName(), JsonUtil.toArray(input.getCollectionCount(), input.getCollectionTime())))); - out.add("system", system); - - TimingsHistory[] history = HISTORY.toArray(new TimingsHistory[HISTORY.size() + 1]); - history[HISTORY.size()] = new TimingsHistory(); - - JsonObject timings = new JsonObject(); - for (TimingIdentifier.TimingGroup group : TimingIdentifier.GROUP_MAP.values()) { - for (Timing id : group.timings) { - if (!id.timed && !id.isSpecial()) { - continue; - } - - timings.add(String.valueOf(id.id), JsonUtil.toArray(group.id, id.name)); - } - } - - JsonObject idmap = new JsonObject(); - idmap.add("groups", JsonUtil.mapToObject(TimingIdentifier.GROUP_MAP.values(), (group) -> - new JsonUtil.JSONPair(group.id, group.name))); - idmap.add("handlers", timings); - idmap.add("worlds", JsonUtil.mapToObject(TimingsHistory.levelMap.entrySet(), (entry) -> - new JsonUtil.JSONPair(entry.getValue(), entry.getKey()))); - idmap.add("tileentity", JsonUtil.mapToObject(TimingsHistory.blockEntityMap.entrySet(), (entry) -> - new JsonUtil.JSONPair(entry.getKey(), entry.getValue()))); - idmap.add("entity", JsonUtil.mapToObject(TimingsHistory.entityMap.entrySet(), (entry) -> - new JsonUtil.JSONPair(entry.getKey(), entry.getValue()))); - out.add("idmap", idmap); - - out.add("plugins", JsonUtil.mapToObject(Server.getInstance().getPluginManager().getPlugins().values(), (plugin) -> { - JsonObject jsonPlugin = new JsonObject(); - jsonPlugin.addProperty("version", plugin.getDescription().getVersion()); - jsonPlugin.addProperty("description", plugin.getDescription().getDescription()); - jsonPlugin.addProperty("website", plugin.getDescription().getWebsite()); - jsonPlugin.addProperty("authors", String.join(", ", plugin.getDescription().getAuthors())); - return new JsonUtil.JSONPair(plugin.getName(), jsonPlugin); - })); - - new TimingsExport(sender, out, history).start(); - } - - private static long getCost() { - int passes = 200; - Timing SAMPLER1 = TimingsManager.getTiming(null, "Timings sampler 1", null); - Timing SAMPLER2 = TimingsManager.getTiming(null, "Timings sampler 2", null); - Timing SAMPLER3 = TimingsManager.getTiming(null, "Timings sampler 3", null); - Timing SAMPLER4 = TimingsManager.getTiming(null, "Timings sampler 4", null); - Timing SAMPLER5 = TimingsManager.getTiming(null, "Timings sampler 5", null); - Timing SAMPLER6 = TimingsManager.getTiming(null, "Timings sampler 6", null); - - long start = System.nanoTime(); - for (int i = 0; i < passes; i++) { - SAMPLER1.startTiming(); - SAMPLER2.startTiming(); - SAMPLER3.startTiming(); - SAMPLER4.startTiming(); - SAMPLER5.startTiming(); - SAMPLER6.startTiming(); - SAMPLER6.stopTiming(); - SAMPLER5.stopTiming(); - SAMPLER4.stopTiming(); - SAMPLER3.stopTiming(); - SAMPLER2.stopTiming(); - SAMPLER1.stopTiming(); - } - - long timingsCost = (System.nanoTime() - start) / passes / 6; - - SAMPLER1.reset(true); - SAMPLER2.reset(true); - SAMPLER3.reset(true); - SAMPLER4.reset(true); - SAMPLER5.reset(true); - SAMPLER6.reset(true); - - return timingsCost; - } - - @Override - public synchronized void start() { - if (this.sender instanceof RemoteConsoleCommandSender) { - this.sender.sendMessage(new TranslationContainer("nukkit.command.timings.rcon")); - run(); - } else { - super.start(); - } - } - - @Override - public void run() { - this.sender.sendMessage(new TranslationContainer("nukkit.command.timings.uploadStart")); - this.out.add("data", JsonUtil.mapToArray(this.history, TimingsHistory::export)); - - String response = null; - try { - HttpURLConnection con = (HttpURLConnection) new URL("http://timings.aikar.co/post").openConnection(); - con.setDoOutput(true); - con.setRequestProperty("User-Agent", "Nukkit/" + Server.getInstance().getName() + '/' + InetAddress.getLocalHost().getHostName()); - con.setRequestMethod("POST"); - con.setInstanceFollowRedirects(false); - - PGZIPOutputStream request = new PGZIPOutputStream(con.getOutputStream()); - request.setLevel(Deflater.BEST_COMPRESSION); - - request.write(new Gson().toJson(this.out).getBytes(StandardCharsets.UTF_8)); - request.close(); - - response = getResponse(con); - - if (con.getResponseCode() != 302) { - this.sender.sendMessage(new TranslationContainer("nukkit.command.timings.uploadError", String.valueOf(con.getResponseCode()), con.getResponseMessage())); - if (response != null) { - Server.getInstance().getLogger().alert(response); - } - return; - } - - String location = con.getHeaderField("Location"); - this.sender.sendMessage(new TranslationContainer("nukkit.command.timings.timingsLocation", location)); - if (!(this.sender instanceof ConsoleCommandSender)) { - Server.getInstance().getLogger().info(Server.getInstance().getLanguage().translateString("nukkit.command.timings.timingsLocation", location)); - } - - if (response != null && !response.isEmpty()) { - Server.getInstance().getLogger().info(Server.getInstance().getLanguage().translateString("nukkit.command.timings.timingsResponse", response)); - } - - File timingFolder = new File(Server.getInstance().getDataPath() + File.separator + "timings"); - timingFolder.mkdirs(); - String fileName = timingFolder + File.separator + new SimpleDateFormat("'timings-'yyyy-MM-dd-hh-mm'.txt'").format(new Date()); - - FileWriter writer = new FileWriter(fileName); - writer.write(Server.getInstance().getLanguage().translateString("nukkit.command.timings.timingsLocation", location) + "\n\n"); - writer.write(new GsonBuilder().setPrettyPrinting().create().toJson(this.out)); - writer.close(); - - Server.getInstance().getLogger().info(Server.getInstance().getLanguage().translateString("nukkit.command.timings.timingsWrite", fileName)); - } catch (IOException exception) { - this.sender.sendMessage(TextFormat.RED + "" + new TranslationContainer("nukkit.command.timings.reportError")); - if (response != null) { - Server.getInstance().getLogger().alert(response); - } - Server.getInstance().getLogger().logException(exception); - } - } - - private String getResponse(HttpURLConnection con) throws IOException { - try (InputStream is = con.getInputStream()) { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - byte[] b = new byte[1024]; - int bytesRead; - while ((bytesRead = is.read(b)) != -1) { - bos.write(b, 0, bytesRead); - } - return bos.toString(); - - } catch (IOException exception) { - this.sender.sendMessage(TextFormat.RED + "" + new TranslationContainer("nukkit.command.timings.reportError")); - Server.getInstance().getLogger().warning(con.getResponseMessage(), exception); - return null; - } - } -} diff --git a/src/main/java/co/aikar/timings/TimingsHistory.java b/src/main/java/co/aikar/timings/TimingsHistory.java deleted file mode 100644 index ea219b77f..000000000 --- a/src/main/java/co/aikar/timings/TimingsHistory.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import cn.nukkit.Player; -import cn.nukkit.Server; -import cn.nukkit.blockentity.BlockEntity; -import cn.nukkit.entity.Entity; -import cn.nukkit.level.Level; -import cn.nukkit.level.format.FullChunk; -import cn.nukkit.utils.JsonUtil; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import java.lang.management.ManagementFactory; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -import static co.aikar.timings.Timings.fullServerTickTimer; -import static co.aikar.timings.TimingsManager.MINUTE_REPORTS; - -public class TimingsHistory { - - public static long lastMinuteTime; - public static long timedTicks; - public static long playerTicks; - public static long entityTicks; - public static long tileEntityTicks; - public static long activatedEntityTicks; - - private static int levelIdPool = 1; - static Map levelMap = new HashMap<>(); - static Map entityMap = new HashMap<>(); - static Map blockEntityMap = new HashMap<>(); - - private final long endTime; - private final long startTime; - private final long totalTicks; - private final long totalTime; - private final MinuteReport[] minuteReports; - - private final TimingsHistoryEntry[] entries; - private final JsonObject levels = new JsonObject(); - - TimingsHistory() { - this.endTime = System.currentTimeMillis() / 1000; - this.startTime = TimingsManager.historyStart / 1000; - - if (timedTicks % 1200 != 0 || MINUTE_REPORTS.isEmpty()) { - this.minuteReports = MINUTE_REPORTS.toArray(new MinuteReport[MINUTE_REPORTS.size() + 1]); - this.minuteReports[this.minuteReports.length - 1] = new MinuteReport(); - } else { - this.minuteReports = MINUTE_REPORTS.toArray(new MinuteReport[0]); - } - - long ticks = 0; - for (MinuteReport mr : this.minuteReports) { - ticks += mr.ticksRecord.timed; - } - - this.totalTicks = ticks; - this.totalTime = fullServerTickTimer.record.totalTime; - this.entries = new TimingsHistoryEntry[TimingsManager.TIMINGS.size()]; - - int i = 0; - for (Timing timing : TimingsManager.TIMINGS) { - this.entries[i++] = new TimingsHistoryEntry(timing); - } - - final Map entityCounts = new HashMap<>(); - final Map blockEntityCounts = new HashMap<>(); - final Gson GSON = new Gson(); - for (Level level : Server.getInstance().getLevels().values()) { - JsonArray jsonLevel = new JsonArray(); - for (FullChunk chunk : level.getChunks().values()) { - entityCounts.clear(); - blockEntityCounts.clear(); - - for (Entity entity : chunk.getEntities().values()) { - if (!entityCounts.containsKey(entity.getNetworkId())) - entityCounts.put(entity.getNetworkId(), new AtomicInteger(0)); - entityCounts.get(entity.getNetworkId()).incrementAndGet(); - entityMap.put(entity.getNetworkId(), entity.getClass().getSimpleName()); - } - - for (BlockEntity blockEntity : chunk.getBlockEntities().values()) { - if (!blockEntityCounts.containsKey(blockEntity.getBlock().getId())) - blockEntityCounts.put(blockEntity.getBlock().getId(), new AtomicInteger(0)); - blockEntityCounts.get(blockEntity.getBlock().getId()).incrementAndGet(); - blockEntityMap.put(blockEntity.getBlock().getId(), blockEntity.getClass().getSimpleName()); - } - - if (blockEntityCounts.isEmpty() && entityCounts.isEmpty()) { - continue; - } - - JsonArray jsonChunk = new JsonArray(); - jsonChunk.add(chunk.getX()); - jsonChunk.add(chunk.getZ()); - jsonChunk.add(GSON.toJsonTree(JsonUtil.mapToObject(entityCounts.entrySet(), (entry) -> new JsonUtil.JSONPair(entry.getKey(), entry.getValue().get()))).getAsJsonObject()); - jsonChunk.add(GSON.toJsonTree(JsonUtil.mapToObject(blockEntityCounts.entrySet(), (entry) -> new JsonUtil.JSONPair(entry.getKey(), entry.getValue().get()))).getAsJsonObject()); - jsonLevel.add(jsonChunk); - } - - if (!levelMap.containsKey(level.getName())) levelMap.put(level.getName(), levelIdPool++); - levels.add(String.valueOf(levelMap.get(level.getName())), jsonLevel); - } - } - - static void resetTicks(boolean fullReset) { - if (fullReset) { - timedTicks = 0; - } - lastMinuteTime = System.nanoTime(); - playerTicks = 0; - tileEntityTicks = 0; - entityTicks = 0; - activatedEntityTicks = 0; - } - - JsonObject export() { - JsonObject json = new JsonObject(); - json.addProperty("s", this.startTime); - json.addProperty("e", this.endTime); - json.addProperty("tk", this.totalTicks); - json.addProperty("tm", this.totalTime); - json.add("w", this.levels); - json.add("h", JsonUtil.mapToArray(this.entries, (entry) -> { - if (entry.data.count == 0) { - return null; - } - return entry.export(); - })); - json.add("mp", JsonUtil.mapToArray(this.minuteReports, MinuteReport::export)); - return json; - } - - static class MinuteReport { - final long time = System.currentTimeMillis() / 1000; - - final TicksRecord ticksRecord = new TicksRecord(); - final PingRecord pingRecord = new PingRecord(); - final TimingData fst = Timings.fullServerTickTimer.minuteData.clone(); - final double tps = 1E9 / (System.nanoTime() - lastMinuteTime) * this.ticksRecord.timed; - final double usedMemory = Timings.fullServerTickTimer.avgUsedMemory; - final double freeMemory = Timings.fullServerTickTimer.avgFreeMemory; - final double loadAvg = ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage(); - - JsonArray export() { - return JsonUtil.toArray(this.time, - Math.round(this.tps * 100D) / 100D, - Math.round(this.pingRecord.avg * 100D) / 100D, - this.fst.export(), - JsonUtil.toArray(this.ticksRecord.timed, - this.ticksRecord.player, - this.ticksRecord.entity, - this.ticksRecord.activatedEntity, - this.ticksRecord.tileEntity), - this.usedMemory, - this.freeMemory, - this.loadAvg); - } - } - - private static class TicksRecord { - final long timed; - final long player; - final long entity; - final long activatedEntity; - final long tileEntity; - - TicksRecord() { - this.timed = timedTicks - (TimingsManager.MINUTE_REPORTS.size() * 1200); - this.player = playerTicks; - this.entity = entityTicks; - this.activatedEntity = activatedEntityTicks; - this.tileEntity = tileEntityTicks; - } - } - - private static class PingRecord { - final double avg; - - PingRecord() { - final Collection onlinePlayers = Server.getInstance().getOnlinePlayers().values(); - int totalPing = 0; - for (Player player : onlinePlayers) { - totalPing += player.getPing(); - } - - this.avg = onlinePlayers.isEmpty() ? 0 : (float) totalPing / onlinePlayers.size(); - } - } -} diff --git a/src/main/java/co/aikar/timings/TimingsHistoryEntry.java b/src/main/java/co/aikar/timings/TimingsHistoryEntry.java deleted file mode 100644 index fabc2c113..000000000 --- a/src/main/java/co/aikar/timings/TimingsHistoryEntry.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import com.google.gson.JsonArray; - -import cn.nukkit.utils.JsonUtil; - -class TimingsHistoryEntry { - - final TimingData data; - final TimingData[] children; - - TimingsHistoryEntry(Timing timing) { - this.data = timing.record.clone(); - this.children = new TimingData[timing.children.size()]; - - int i = 0; - for (TimingData child : timing.children.values()) { - this.children[i++] = child.clone(); - } - } - - JsonArray export() { - JsonArray json = this.data.export(); - if (this.children.length > 0) json.add(JsonUtil.mapToArray(this.children, TimingData::export)); - return json; - } -} diff --git a/src/main/java/co/aikar/timings/TimingsManager.java b/src/main/java/co/aikar/timings/TimingsManager.java deleted file mode 100644 index 7f3db7559..000000000 --- a/src/main/java/co/aikar/timings/TimingsManager.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * This file is licensed under the MIT License (MIT). - * - * Copyright (c) 2014 Daniel Ennis - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package co.aikar.timings; - -import cn.nukkit.Server; - -import java.util.*; - -public class TimingsManager { - - static final Map TIMING_MAP = Collections.synchronizedMap(new HashMap<>(256, 0.5f)); - - static final Queue TIMINGS = new ArrayDeque<>(); - static final ArrayDeque MINUTE_REPORTS = new ArrayDeque<>(); - - static Queue HISTORY = new BoundedQueue<>(12); - - static Timing CURRENT; - - static long timingStart = 0; - static long historyStart = 0; - static boolean needsFullReset = false; - static boolean needsRecheckEnabled = false; - - static void reset() { - needsFullReset = true; - } - - /** - * Called every tick to count the number of times a timer caused TPS loss. - */ - static void tick() { - if (Timings.isTimingsEnabled()) { - boolean violated = Timings.fullServerTickTimer.isViolated(); - - synchronized (TIMINGS) { - for (Timing timing : TIMINGS) { - if (timing.isSpecial()) { - continue; - } - - timing.tick(violated); - } - } - - TimingsHistory.playerTicks += Server.getInstance().getOnlinePlayersCount(); - TimingsHistory.timedTicks++; - } - } - - static void recheckEnabled() { - synchronized (TIMING_MAP) { - TIMING_MAP.values().forEach(Timing::checkEnabled); - } - - needsRecheckEnabled = false; - } - - static void resetTimings() { - if (needsFullReset) { - synchronized (TIMING_MAP) { - for (Timing timing : TIMING_MAP.values()) { - timing.reset(true); - } - } - - HISTORY.clear(); - needsFullReset = false; - needsRecheckEnabled = false; - timingStart = System.currentTimeMillis(); - } else { - for (Timing timing : TIMINGS) { - timing.reset(false); - } - } - - TIMINGS.clear(); - MINUTE_REPORTS.clear(); - - TimingsHistory.resetTicks(true); - historyStart = System.currentTimeMillis(); - } - - public static Timing getTiming(String name) { - return getTiming(null, name, null); - } - - static Timing getTiming(String group, String name, Timing groupTiming) { - if (!Timings.isTimingsEnabled()) return null; - TimingIdentifier id = new TimingIdentifier(group, name, groupTiming); - return TIMING_MAP.computeIfAbsent(id, k -> new Timing(id)); - } - - static final class BoundedQueue extends LinkedList { - final int maxSize; - - BoundedQueue(int maxSize) { - if (maxSize <= 0) { - throw new IllegalArgumentException("maxSize must be greater than zero"); - } - - this.maxSize = maxSize; - } - - @Override - public boolean add(E e) { - if (this.size() == maxSize) { - this.remove(); - } - - return super.add(e); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/nukkitx/network/NetworkUtils.java b/src/main/java/com/nukkitx/network/NetworkUtils.java deleted file mode 100644 index 3f2c27818..000000000 --- a/src/main/java/com/nukkitx/network/NetworkUtils.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.nukkitx.network; - -import io.netty.buffer.ByteBuf; -import lombok.experimental.UtilityClass; - -import java.net.*; - -@UtilityClass -public class NetworkUtils { - - public static InetSocketAddress readAddress(ByteBuf buffer) { - short type = buffer.readByte(); - InetAddress address; - int port; - try { - if (type == 4) { - byte[] addressBytes = new byte[4]; - buffer.readBytes(addressBytes); - flip(addressBytes); - address = Inet4Address.getByAddress(addressBytes); - port = buffer.readUnsignedShort(); - } else if (type == 6) { - buffer.readShortLE(); // Family, AF_INET6 - port = buffer.readUnsignedShort(); - buffer.readInt(); // Flow information - byte[] addressBytes = new byte[16]; - buffer.readBytes(addressBytes); - int scopeId = buffer.readInt(); - address = Inet6Address.getByAddress(null, addressBytes, scopeId); - } else { - throw new UnsupportedOperationException("Unknown Internet Protocol version."); - } - } catch (UnknownHostException e) { - throw new IllegalArgumentException(e); - } - return new InetSocketAddress(address, port); - } - - public static void writeAddress(ByteBuf buffer, InetSocketAddress address) { - byte[] addressBytes = address.getAddress().getAddress(); - if (address.getAddress() instanceof Inet4Address) { - buffer.writeByte(4); - flip(addressBytes); - buffer.writeBytes(addressBytes); - buffer.writeShort(address.getPort()); - } else if (address.getAddress() instanceof Inet6Address) { - buffer.writeByte(6); - buffer.writeShortLE(23); // AF_INET6 - buffer.writeShort(address.getPort()); - buffer.writeInt(0); - buffer.writeBytes(addressBytes); - buffer.writeInt(((Inet6Address) address.getAddress()).getScopeId()); - } else { - throw new UnsupportedOperationException("Unknown InetAddress instance"); - } - } - - private static void flip(byte[] bytes) { - for (int i = 0; i < bytes.length; i++) { - bytes[i] = (byte) (~bytes[i] & 0xFF); - } - } -} diff --git a/src/main/java/com/nukkitx/network/SessionConnection.java b/src/main/java/com/nukkitx/network/SessionConnection.java deleted file mode 100644 index f26592d05..000000000 --- a/src/main/java/com/nukkitx/network/SessionConnection.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.nukkitx.network; - -import com.nukkitx.network.util.DisconnectReason; - -import java.net.InetSocketAddress; - -public interface SessionConnection { - - InetSocketAddress getAddress(); - - void close(); - - void close(DisconnectReason reason); - - void disconnect(); - - void disconnect(DisconnectReason reason); - - void send(T packet); - - void sendImmediate(T packet); - - boolean isClosed(); - - long getPing(); -} diff --git a/src/main/java/com/nukkitx/network/raknet/EncapsulatedPacket.java b/src/main/java/com/nukkitx/network/raknet/EncapsulatedPacket.java deleted file mode 100644 index a1d7f788b..000000000 --- a/src/main/java/com/nukkitx/network/raknet/EncapsulatedPacket.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.nukkitx.network.raknet; - -import io.netty.buffer.ByteBuf; -import io.netty.util.ReferenceCounted; -import lombok.AccessLevel; -import lombok.Data; -import lombok.Setter; - -@Data -@Setter(AccessLevel.NONE) -public class EncapsulatedPacket implements ReferenceCounted { - - RakNetReliability reliability; - int reliabilityIndex; - int sequenceIndex; - int orderingIndex; - short orderingChannel; - boolean split; - int partCount; - int partId; - int partIndex; - ByteBuf buffer; - - public void encode(ByteBuf buf) { - int flags = reliability.ordinal() << 5; - if (split) { - flags |= 0b00010000; - } - buf.writeByte(flags); // flags - buf.writeShort(buffer.readableBytes() << 3); // size - - if (reliability.isReliable()) { - buf.writeMediumLE(reliabilityIndex); - } - - if (reliability.isSequenced()) { - buf.writeMediumLE(sequenceIndex); - } - - if (reliability.isOrdered() || reliability.isSequenced()) { - buf.writeMediumLE(orderingIndex); - buf.writeByte(orderingChannel); - } - - if (split) { - buf.writeInt(partCount); - buf.writeShort(partId); - buf.writeInt(partIndex); - } - - buf.writeBytes(this.buffer, this.buffer.readerIndex(), this.buffer.readableBytes()); - // If we need to resend, we don't want the buffer's reader index changing. - } - - public void decode(ByteBuf buf) { - byte flags = buf.readByte(); - reliability = RakNetReliability.fromId((flags & 0b11100000) >> 5); - split = (flags & 0b00010000) != 0; - int size = (buf.readUnsignedShort() + 7) >> 3; - - if (reliability.isReliable()) { - reliabilityIndex = buf.readUnsignedMediumLE(); - } - - if (reliability.isSequenced()) { - sequenceIndex = buf.readUnsignedMediumLE(); - } - - if (reliability.isOrdered() || reliability.isSequenced()) { - orderingIndex = buf.readUnsignedMediumLE(); - orderingChannel = buf.readUnsignedByte(); - } - - if (split) { - partCount = buf.readInt(); - partId = buf.readUnsignedShort(); - partIndex = buf.readInt(); - } - - // Slice the buffer to use less memory - buffer = buf.readSlice(size); - } - - public int getSize() { - // Include back of the envelope calculation - return 3 + this.reliability.getSize() + (this.split ? 10 : 0) + this.buffer.readableBytes(); - } - - public EncapsulatedPacket fromSplit(ByteBuf reassembled) { - EncapsulatedPacket packet = new EncapsulatedPacket(); - packet.reliability = this.reliability; - packet.reliabilityIndex = this.reliabilityIndex; - packet.sequenceIndex = this.sequenceIndex; - packet.orderingIndex = this.orderingIndex; - packet.orderingChannel = this.orderingChannel; - packet.buffer = reassembled; - return packet; - } - - @Override - public int refCnt() { - return buffer.refCnt(); - } - - @Override - public EncapsulatedPacket retain() { - this.buffer.retain(); - return this; - } - - @Override - public EncapsulatedPacket retain(int i) { - this.buffer.retain(i); - return this; - } - - @Override - public EncapsulatedPacket touch() { - this.buffer.touch(); - return this; - } - - @Override - public EncapsulatedPacket touch(Object o) { - this.buffer.touch(o); - return this; - } - - @Override - public boolean release() { - return buffer.release(); - } - - @Override - public boolean release(int i) { - return buffer.release(i); - } -} - diff --git a/src/main/java/com/nukkitx/network/raknet/RakNet.java b/src/main/java/com/nukkitx/network/raknet/RakNet.java deleted file mode 100644 index 5e9288e28..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNet.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.nukkitx.network.raknet; - -import com.nukkitx.network.util.Bootstraps; -import com.nukkitx.network.util.Preconditions; -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBufAllocator; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoop; -import io.netty.channel.EventLoopGroup; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.net.InetSocketAddress; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * This RakNet implementation is based on CloudburstMC/Network version develop/dbcb2ed (1.6.28-SNAPSHOT) - */ -@ParametersAreNonnullByDefault -public abstract class RakNet implements AutoCloseable { - - protected final long guid = ThreadLocalRandom.current().nextLong(); - private final AtomicBoolean running = new AtomicBoolean(false); - protected final AtomicBoolean closed = new AtomicBoolean(false); - protected final Bootstrap bootstrap; - private ScheduledFuture tickFuture; - - RakNet(EventLoopGroup eventLoopGroup) { - this.bootstrap = new Bootstrap().option(ChannelOption.ALLOCATOR, ByteBufAllocator.DEFAULT); - this.bootstrap.group(eventLoopGroup); - Bootstraps.setupBootstrap(this.bootstrap, true); - } - - public CompletableFuture bind() { - Preconditions.checkState(this.running.compareAndSet(false, true), "RakNet has already been started"); - CompletableFuture future = this.bindInternal(); - - future.whenComplete((aVoid, throwable) -> { - if (throwable != null) { - // Failed to start, set running to false - this.running.compareAndSet(true, false); - return; - } - - this.closed.set(false); - this.tickFuture = this.nextEventLoop().scheduleAtFixedRate(this::onTick, 0, 10, TimeUnit.MILLISECONDS); - }); - return future; - } - - public void close() { - this.close(false); - } - - public void close(boolean force) { - this.closed.set(true); - if (this.tickFuture != null) { - this.tickFuture.cancel(false); - } - } - - protected abstract CompletableFuture bindInternal(); - - protected abstract void onTick(); - - public boolean isRunning() { - return this.running.get(); - } - - public boolean isClosed() { - return this.closed.get(); - } - - public abstract InetSocketAddress getBindAddress(); - - public long getGuid() { - return this.guid; - } - - protected EventLoopGroup getEventLoopGroup() { - return this.bootstrap.config().group(); - } - - protected EventLoop nextEventLoop() { - return this.getEventLoopGroup().next(); - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetConstants.java b/src/main/java/com/nukkitx/network/raknet/RakNetConstants.java deleted file mode 100644 index 566db85af..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetConstants.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.nukkitx.network.raknet; - -import cn.nukkit.Server; -import lombok.experimental.UtilityClass; - -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetSocketAddress; - -@UtilityClass -public class RakNetConstants { - - public static final byte RAKNET_PROTOCOL_VERSION = 10; // Mojang's version. - public static final short MINIMUM_MTU_SIZE = (short) Server.getInstance().getPropertyInt("min-mtu", 576); - public static final short MAXIMUM_MTU_SIZE = (short) Server.getInstance().getPropertyInt("max-mtu", 1492); - - /** - * Maximum amount of ordering channels as defined in vanilla RakNet. - */ - public static final int MAXIMUM_ORDERING_CHANNELS = 16; - - /** - * Maximum size of an {@link EncapsulatedPacket} header. - */ - public static final int MAXIMUM_ENCAPSULATED_HEADER_SIZE = 28; - - public static final int UDP_HEADER_SIZE = 8; - - public static final int RAKNET_DATAGRAM_HEADER_SIZE = 4; - - /** - * Time after {@link RakNetSession} is closed due to no activity. - */ - public static final int SESSION_TIMEOUT_MS = Server.getInstance().getPropertyInt("timeout-milliseconds", 25000); - - /** - * How many stale datagrams a {@link RakNetSession} can hold before being forcefully closed. - */ - public static final int MAXIMUM_STALE_DATAGRAMS = 2000; - - /* - Flags - */ - public static final byte FLAG_VALID = (byte) 0b10000000; - public static final byte FLAG_ACK = (byte) 0b01000000; - public static final byte FLAG_HAS_B_AND_AS = (byte) 0b00100000; - public static final byte FLAG_NACK = (byte) 0b00100000; - public static final byte FLAG_PACKET_PAIR = (byte) 0b00010000; - public static final byte FLAG_CONTINUOUS_SEND = (byte) 0b00001000; - public static final byte FLAG_NEEDS_B_AND_AS = (byte) 0b00000100; - - /* - Packet IDs - */ - public static final short ID_CONNECTED_PING = 0x00; - public static final short ID_UNCONNECTED_PING = 0x01; - public static final short ID_UNCONNECTED_PING_OPEN_CONNECTIONS = 0x02; - public static final short ID_CONNECTED_PONG = 0x03; - public static final short ID_DETECT_LOST_CONNECTION = 0x04; - public static final short ID_OPEN_CONNECTION_REQUEST_1 = 0x05; - public static final short ID_OPEN_CONNECTION_REPLY_1 = 0x06; - public static final short ID_OPEN_CONNECTION_REQUEST_2 = 0x07; - public static final short ID_OPEN_CONNECTION_REPLY_2 = 0x08; - public static final short ID_CONNECTION_REQUEST = 0x09; - public static final short ID_CONNECTION_REQUEST_ACCEPTED = 0x10; - public static final short ID_CONNECTION_REQUEST_FAILED = 0x11; - public static final short ID_ALREADY_CONNECTED = 0x12; - public static final short ID_NEW_INCOMING_CONNECTION = 0x13; - public static final short ID_NO_FREE_INCOMING_CONNECTIONS = 0x14; - public static final short ID_DISCONNECTION_NOTIFICATION = 0x15; - public static final short ID_CONNECTION_LOST = 0x16; - public static final short ID_CONNECTION_BANNED = 0x17; - public static final short ID_INCOMPATIBLE_PROTOCOL_VERSION = 0x19; - public static final short ID_IP_RECENTLY_CONNECTED = 0x1a; - public static final short ID_TIMESTAMP = 0x1b; - public static final short ID_UNCONNECTED_PONG = 0x1c; - public static final short ID_ADVERTISE_SYSTEM = 0x1d; - public static final short ID_USER_PACKET_ENUM = 0x80; - - /** - * Magic used to identify RakNet packets - */ - static final byte[] RAKNET_UNCONNECTED_MAGIC = new byte[]{ - 0, -1, -1, 0, -2, -2, -2, -2, -3, -3, -3, -3, 18, 52, 86, 120 - }; - - /* - Congestion Control related constants - */ - public static final long CC_MAXIMUM_THRESHOLD = 2000; - public static final long CC_ADDITIONAL_VARIANCE = 30; - public static final long CC_SYN = 10; - - public static final InetSocketAddress LOOPBACK_V4 = new InetSocketAddress(Inet4Address.getLoopbackAddress(), 19132); - public static final InetSocketAddress LOOPBACK_V6 = new InetSocketAddress(Inet6Address.getLoopbackAddress(), 19132); - public static final InetSocketAddress[] LOCAL_IP_ADDRESSES_V4 = new InetSocketAddress[20]; - public static final InetSocketAddress[] LOCAL_IP_ADDRESSES_V6 = new InetSocketAddress[20]; - - static { - LOCAL_IP_ADDRESSES_V4[0] = LOOPBACK_V4; - LOCAL_IP_ADDRESSES_V6[0] = LOOPBACK_V6; - - for (int i = 1; i < 20; i++) { - LOCAL_IP_ADDRESSES_V4[i] = new InetSocketAddress("0.0.0.0", 19132); - LOCAL_IP_ADDRESSES_V6[i] = new InetSocketAddress("::0", 19132); - } - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetDatagram.java b/src/main/java/com/nukkitx/network/raknet/RakNetDatagram.java deleted file mode 100644 index 2b2266e4b..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetDatagram.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.nukkitx.network.raknet; - -import io.netty.buffer.ByteBuf; -import io.netty.util.AbstractReferenceCounted; -import io.netty.util.internal.logging.InternalLogger; -import io.netty.util.internal.logging.InternalLoggerFactory; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -import java.util.ArrayList; -import java.util.List; - -import static com.nukkitx.network.raknet.RakNetConstants.*; - -@Data -@EqualsAndHashCode(callSuper = false) -@ToString() -public class RakNetDatagram extends AbstractReferenceCounted { - - private static final InternalLogger log = InternalLoggerFactory.getInstance(RakNetDatagram.class); - - final List packets = new ArrayList<>(); - byte flags = FLAG_VALID; - final long sendTime; - long nextSend; - int sequenceIndex = -1; - - @Override - public RakNetDatagram retain() { - super.retain(); - return this; - } - - @Override - public RakNetDatagram retain(int increment) { - super.retain(increment); - return this; - } - - @Override - public RakNetDatagram touch(Object hint) { - for (EncapsulatedPacket packet : packets) { - packet.touch(hint); - } - return this; - } - - void decode(ByteBuf buf) { - flags = buf.readByte(); - sequenceIndex = buf.readUnsignedMediumLE(); - while (buf.isReadable()) { - EncapsulatedPacket packet = new EncapsulatedPacket(); - packet.decode(buf); - packets.add(packet); - } - } - - public void encode(ByteBuf buf) { - buf.writeByte(flags); - buf.writeMediumLE(sequenceIndex); - for (EncapsulatedPacket packet : packets) { - packet.encode(buf); - } - } - - boolean tryAddPacket(EncapsulatedPacket packet, int mtu) { - if (this.getSize() + packet.getSize() > mtu - RAKNET_DATAGRAM_HEADER_SIZE) { - return false; - } - - packets.add(packet); - if (packet.split) { - flags |= FLAG_CONTINUOUS_SEND; - } - return true; - } - - @Override - public boolean release() { - return super.release(); - } - - @Override - protected void deallocate() { - for (EncapsulatedPacket packet : packets) { - packet.release(); - } - } - - public int getSize() { - int size = RAKNET_DATAGRAM_HEADER_SIZE; - for (EncapsulatedPacket packet : packets) { - size += packet.getSize(); - } - return size; - } -} \ No newline at end of file diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetPriority.java b/src/main/java/com/nukkitx/network/raknet/RakNetPriority.java deleted file mode 100644 index c38827395..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetPriority.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.nukkitx.network.raknet; - -public enum RakNetPriority { - - IMMEDIATE, - HIGH, - MEDIUM, - LOW -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetReliability.java b/src/main/java/com/nukkitx/network/raknet/RakNetReliability.java deleted file mode 100644 index 9a15d50b3..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetReliability.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.nukkitx.network.raknet; - -import lombok.Getter; - -@Getter -public enum RakNetReliability { - - UNRELIABLE(false, false, false, false), - UNRELIABLE_SEQUENCED(false, false, true, false), - RELIABLE(true, false, false, false), - RELIABLE_ORDERED(true, true, false, false), - RELIABLE_SEQUENCED(true, false, true, false), - UNRELIABLE_WITH_ACK_RECEIPT(false, false, false, true), - RELIABLE_WITH_ACK_RECEIPT(true, false, false, true), - RELIABLE_ORDERED_WITH_ACK_RECEIPT(true, true, false, true); - - private static final RakNetReliability[] VALUES = values(); - - final boolean reliable; - final boolean ordered; - final boolean sequenced; - final boolean withAckReceipt; - final int size; - - RakNetReliability(boolean reliable, boolean ordered, boolean sequenced, boolean withAckReceipt) { - this.reliable = reliable; - this.ordered = ordered; - this.sequenced = sequenced; - this.withAckReceipt = withAckReceipt; - - int size = 0; - if (this.reliable) { - size += 3; - } - - if (this.sequenced) { - size += 3; - } - - if (this.ordered) { - size += 4; - } - this.size = size; - } - - public static RakNetReliability fromId(int id) { - if (id < 0 || id > 7) { - return null; - } - return VALUES[id]; - } -} \ No newline at end of file diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetServer.java b/src/main/java/com/nukkitx/network/raknet/RakNetServer.java deleted file mode 100644 index ee5d6d170..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetServer.java +++ /dev/null @@ -1,228 +0,0 @@ -package com.nukkitx.network.raknet; - -import cn.nukkit.Server; -import com.nukkitx.network.raknet.pipeline.*; -import com.nukkitx.network.raknet.util.RoundRobinIterator; -import com.nukkitx.network.util.Bootstraps; -import com.nukkitx.network.util.DisconnectReason; -import com.nukkitx.network.util.EventLoops; -import io.netty.buffer.ByteBuf; -import io.netty.channel.*; -import io.netty.channel.socket.DatagramPacket; -import io.netty.util.internal.logging.InternalLogger; -import io.netty.util.internal.logging.InternalLoggerFactory; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.TimeUnit; - -import static com.nukkitx.network.raknet.RakNetConstants.*; - -@ParametersAreNonnullByDefault -public class RakNetServer extends RakNet { - - private static final InternalLogger log = InternalLoggerFactory.getInstance(RakNetServer.class); - - private final ConcurrentMap blockAddresses = new ConcurrentHashMap<>(); - final ConcurrentMap sessionsByAddress = new ConcurrentHashMap<>(); - - private final InetSocketAddress bindAddress; - private final int bindThreads; - - private final Set channels = new HashSet<>(); - private final Iterator channelIterator = new RoundRobinIterator<>(channels); - - private final ServerChannelInitializer initializer = new ServerChannelInitializer(); - private final ServerMessageHandler messageHandler = new ServerMessageHandler(this); - private final ServerDatagramHandler serverDatagramHandler = new ServerDatagramHandler(this); - private final RakExceptionHandler exceptionHandler = new RakExceptionHandler(); - - private volatile RakNetServerListener listener = null; - - public RakNetServer(InetSocketAddress bindAddress) { - this(bindAddress, 1); - } - - public RakNetServer(InetSocketAddress bindAddress, int bindThreads) { - this(bindAddress, bindThreads, EventLoops.commonGroup()); - } - - public RakNetServer(InetSocketAddress bindAddress, int bindThreads, EventLoopGroup eventLoopGroup) { - super(eventLoopGroup); - this.bindThreads = bindThreads; - this.bindAddress = bindAddress; - } - - @Override - protected CompletableFuture bindInternal() { - int bindThreads = Bootstraps.isReusePortAvailable() ? this.bindThreads : 1; - ChannelFuture[] channelFutures = new ChannelFuture[bindThreads]; - - for (int i = 0; i < bindThreads; i++) { - channelFutures[i] = this.bootstrap.handler(this.initializer).bind(this.bindAddress); - } - return Bootstraps.allOf(channelFutures); - } - - public void send(InetSocketAddress address, ByteBuf buffer) { - this.channelIterator.next().writeAndFlush(new DatagramPacket(buffer, address)); - } - - @Override - public void close(boolean force) { - super.close(force); - for (RakNetServerSession session : this.sessionsByAddress.values()) { - session.disconnect(DisconnectReason.SHUTTING_DOWN); - } - for (Channel channel : this.channels) { - channel.close().syncUninterruptibly(); - } - } - - @Override - protected void onTick() { - final long curTime = System.currentTimeMillis(); - for (RakNetServerSession session : this.sessionsByAddress.values()) { - session.eventLoop.execute(() -> session.onTick(curTime)); - } - Iterator blockedAddresses = this.blockAddresses.values().iterator(); - long timeout; - while (blockedAddresses.hasNext()) { - timeout = blockedAddresses.next(); - if (timeout > 0 && timeout < curTime) { - blockedAddresses.remove(); - } - } - } - - public void onOpenConnectionRequest1(ChannelHandlerContext ctx, DatagramPacket packet) { - if (!packet.content().isReadable(16)) { - return; - } - // We want to do as many checks as possible before creating a session so memory is not wasted. - ByteBuf buffer = packet.content(); - if (!RakNetUtils.verifyUnconnectedMagic(buffer)) { - return; - } - int protocolVersion = buffer.readUnsignedByte(); - int mtu = buffer.readableBytes() + 18 + (packet.sender().getAddress() instanceof Inet6Address ? 40 : 20) + UDP_HEADER_SIZE; // 1 (Packet ID), 16 (Magic), 1 (Protocol Version), 20/40 (IP Header) - - RakNetServerSession session = this.sessionsByAddress.get(packet.sender()); - - if (session != null && session.getState() == RakNetState.CONNECTED) { - this.sendAlreadyConnected(ctx, packet.sender()); - } else if (this.listener != null && !this.listener.onConnectionRequest(packet.sender(), packet.sender())) { - this.sendConnectionBanned(ctx, packet.sender()); - } else if (Server.getInstance().strongIPBans && Server.getInstance().getIPBans().isBanned(packet.sender().getHostName())) { - this.sendConnectionBanned(ctx, packet.sender()); - Server.getInstance().getLogger().info("\u00A7c" + packet.sender().getHostName() + " disconnected due to IP banned"); - } else if (session == null) { - // Passed all checks. Now create the session and send the first reply. - session = new RakNetServerSession(this, packet.sender(), ctx.channel(), - ctx.channel().eventLoop().next(), mtu, protocolVersion); - if (this.sessionsByAddress.putIfAbsent(packet.sender(), session) == null) { - session.setState(RakNetState.INITIALIZING); - session.sendOpenConnectionReply1(); - if (listener != null) { - listener.onSessionCreation(session); - } else { - Server.getInstance().getLogger().warning("Unable to create session for " + packet.sender().getHostName() + ": listener is null"); - } - } - } else { - /*if (session.getState() != RakNetState.INITIALIZING) { - Server.getInstance().getLogger().warning("New connection attempt in state " + session.getState().toString()); - }*/ - session.setMtu(mtu); - session.sendOpenConnectionReply1(); // Probably a packet loss occurred, send the reply again - } - } - - public void block(InetAddress address) { - Objects.requireNonNull(address, "address"); - this.blockAddresses.put(address, -1L); - } - - public void block(InetAddress address, long timeout, TimeUnit timeUnit) { - Objects.requireNonNull(address, "address"); - Objects.requireNonNull(address, "timeUnit"); - this.blockAddresses.put(address, System.currentTimeMillis() + timeUnit.toMillis(timeout)); - } - - public boolean unblock(InetAddress address) { - Objects.requireNonNull(address, "address"); - return this.blockAddresses.remove(address) != null; - } - - public boolean isBlocked(InetAddress address) { - return this.blockAddresses.containsKey(address); - } - - public int getSessionCount() { - return this.sessionsByAddress.size(); - } - - @Nullable - public RakNetServerSession getSession(InetSocketAddress address) { - return this.sessionsByAddress.get(address); - } - - @Override - public InetSocketAddress getBindAddress() { - return this.bindAddress; - } - - public RakNetServerListener getListener() { - return listener; - } - - public void setListener(RakNetServerListener listener) { - this.listener = listener; - } - - /* - * Packet Dispatchers - */ - - private void sendAlreadyConnected(ChannelHandlerContext ctx, InetSocketAddress recipient) { - ByteBuf buffer = ctx.alloc().ioBuffer(25, 25); - buffer.writeByte(ID_ALREADY_CONNECTED); - RakNetUtils.writeUnconnectedMagic(buffer); - buffer.writeLong(this.guid); - ctx.writeAndFlush(new DatagramPacket(buffer, recipient)); - Server.getInstance().getLogger().debug("Already connected"); - } - - private void sendConnectionBanned(ChannelHandlerContext ctx, InetSocketAddress recipient) { - ByteBuf buffer = ctx.alloc().ioBuffer(25, 25); - buffer.writeByte(ID_CONNECTION_BANNED); - RakNetUtils.writeUnconnectedMagic(buffer); - buffer.writeLong(this.guid); - ctx.writeAndFlush(new DatagramPacket(buffer, recipient)); - Server.getInstance().getLogger().debug("Connection banned"); - } - - @ChannelHandler.Sharable - private class ServerChannelInitializer extends ChannelInitializer { - - @Override - protected void initChannel(Channel channel) throws Exception { - ChannelPipeline pipeline = channel.pipeline(); - pipeline.addLast(RakOutboundHandler.NAME, new RakOutboundHandler()); - pipeline.addLast(ServerMessageHandler.NAME, RakNetServer.this.messageHandler); - pipeline.addLast(ServerDatagramHandler.NAME, RakNetServer.this.serverDatagramHandler); - pipeline.addLast(RakExceptionHandler.NAME, RakNetServer.this.exceptionHandler); - RakNetServer.this.channels.add(channel); - } - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetServerListener.java b/src/main/java/com/nukkitx/network/raknet/RakNetServerListener.java deleted file mode 100644 index 47d1da8c1..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetServerListener.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.nukkitx.network.raknet; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.socket.DatagramPacket; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.net.InetSocketAddress; - -@ParametersAreNonnullByDefault -public interface RakNetServerListener { - - /** - * Called when a new connection is attempted - * - * @param address address of the connection - * @param realAddress address of the real connection - different generally only when server has PROXY protocol enabled - * @return whether the user should be accepted or not - */ - default boolean onConnectionRequest(InetSocketAddress address, InetSocketAddress realAddress) { - return onConnectionRequest(address); - } - - /** - * @param address address of user requesting connection - * @return whether the user should be accepted or not - */ - default boolean onConnectionRequest(InetSocketAddress address) { - throw new UnsupportedOperationException("RakNetServerListener#onConnectionRequest is not implemented"); - } - - /** - * Called when an unconnected client pings the server to retrieve it's status and MOTD. - * - * @param address address of client pinging the server - * @return custom user data sent back to the client - */ - @Nullable - byte[] onQuery(InetSocketAddress address); - - /** - * Called when a session is established. This does not mean the session has fully connected but has started the - * RakNet connection sequence. To find out when the session has finished connecting, use - * {@link RakNetSessionListener} - * - * @param session session created - */ - void onSessionCreation(RakNetServerSession session); - - /** - * Called when an unknown session-less datagram is received which is not related to RakNet - * - * @param ctx channel context of datagram - * @param packet unhandled datagram - */ - void onUnhandledDatagram(ChannelHandlerContext ctx, DatagramPacket packet); -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetServerSession.java b/src/main/java/com/nukkitx/network/raknet/RakNetServerSession.java deleted file mode 100644 index f3d76ae12..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetServerSession.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.nukkitx.network.raknet; - -import cn.nukkit.Server; -import com.nukkitx.network.NetworkUtils; -import com.nukkitx.network.util.DisconnectReason; -import io.netty.buffer.ByteBuf; -import io.netty.channel.Channel; -import io.netty.channel.EventLoop; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.net.InetSocketAddress; - -import static com.nukkitx.network.raknet.RakNetConstants.*; - -@ParametersAreNonnullByDefault -public class RakNetServerSession extends RakNetSession { - - private final RakNetServer rakNet; - - RakNetServerSession(RakNetServer rakNet, InetSocketAddress remoteAddress, Channel channel, EventLoop eventLoop, int mtu, - int protocolVersion) { - super(remoteAddress, channel, eventLoop, mtu, protocolVersion); - this.rakNet = rakNet; - } - - @Override - protected void onPacket(ByteBuf buffer) { - short packetId = buffer.readUnsignedByte(); - - switch (packetId) { - case ID_OPEN_CONNECTION_REQUEST_2: - this.onOpenConnectionRequest2(buffer); - break; - case ID_CONNECTION_REQUEST: - this.onConnectionRequest(buffer); - break; - case ID_NEW_INCOMING_CONNECTION: - this.onNewIncomingConnection(); - break; - } - } - - @Override - protected void onClose() { - if (!this.rakNet.sessionsByAddress.remove(this.address, this)) { - throw new IllegalStateException("Session was not found in session map"); - } - } - - @Override - public RakNet getRakNet() { - return this.rakNet; - } - - private void onOpenConnectionRequest2(ByteBuf buffer) { - if (this.getState() != RakNetState.INITIALIZING) { - return; - } - - if (!RakNetUtils.verifyUnconnectedMagic(buffer)) { - return; - } - - NetworkUtils.readAddress(buffer); - - int mtu = buffer.readUnsignedShort(); - this.setMtu(mtu); - this.guid = buffer.readLong(); - - // We can now accept RakNet datagrams. - this.initialize(); - - sendOpenConnectionReply2(); - this.setState(RakNetState.INITIALIZED); - } - - private void onConnectionRequest(ByteBuf buffer) { - long guid = buffer.readLong(); - long time = buffer.readLong(); - boolean security = buffer.readBoolean(); - - if (this.guid != guid || security) { - this.sendConnectionFailure(ID_CONNECTION_REQUEST_FAILED); - this.close(DisconnectReason.CONNECTION_REQUEST_FAILED); - return; - } - - this.setState(RakNetState.CONNECTING); - - this.sendConnectionRequestAccepted(time); - } - - private void onNewIncomingConnection() { - if (this.getState() != RakNetState.CONNECTING) { - return; - } - - this.setState(RakNetState.CONNECTED); - } - - void sendOpenConnectionReply1() { - ByteBuf buffer = this.allocateBuffer(28); - - buffer.writeByte(ID_OPEN_CONNECTION_REPLY_1); - RakNetUtils.writeUnconnectedMagic(buffer); - buffer.writeLong(this.rakNet.guid); - buffer.writeBoolean(false); // Security - buffer.writeShort(this.getMtu()); - - this.sendDirect(buffer); - } - - private void sendOpenConnectionReply2() { - ByteBuf buffer = this.allocateBuffer(31); - - buffer.writeByte(ID_OPEN_CONNECTION_REPLY_2); - RakNetUtils.writeUnconnectedMagic(buffer); - buffer.writeLong(this.rakNet.guid); - NetworkUtils.writeAddress(buffer, this.address); - buffer.writeShort(this.getMtu()); - buffer.writeBoolean(false); // Security - - this.sendDirect(buffer); - } - - private void sendConnectionFailure(short id) { - ByteBuf buffer = this.allocateBuffer(21); - buffer.writeByte(id); - RakNetUtils.writeUnconnectedMagic(buffer); - buffer.writeLong(this.rakNet.guid); - - this.sendDirect(buffer); - Server.getInstance().getLogger().debug("Connection failure"); - } - - private void sendConnectionRequestAccepted(long time) { - boolean ipv6 = this.isIpv6Session(); - ByteBuf buffer = this.allocateBuffer(ipv6 ? 628 : 166); - - buffer.writeByte(ID_CONNECTION_REQUEST_ACCEPTED); - NetworkUtils.writeAddress(buffer, this.address); - buffer.writeShort(0); // System index - - for (InetSocketAddress socketAddress : ipv6 ? LOCAL_IP_ADDRESSES_V6 : LOCAL_IP_ADDRESSES_V4) { - NetworkUtils.writeAddress(buffer, socketAddress); - } - - buffer.writeLong(time); - buffer.writeLong(System.currentTimeMillis()); - - this.send(buffer, RakNetPriority.IMMEDIATE, RakNetReliability.RELIABLE); - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetSession.java b/src/main/java/com/nukkitx/network/raknet/RakNetSession.java deleted file mode 100644 index 2149aaafd..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetSession.java +++ /dev/null @@ -1,909 +0,0 @@ -package com.nukkitx.network.raknet; - -import cn.nukkit.Nukkit; -import cn.nukkit.Server; -import com.nukkitx.network.SessionConnection; -import com.nukkitx.network.raknet.util.*; -import com.nukkitx.network.util.DisconnectReason; -import com.nukkitx.network.util.Preconditions; -import io.netty.buffer.ByteBuf; -import io.netty.channel.Channel; -import io.netty.channel.EventLoop; -import io.netty.channel.socket.DatagramPacket; -import io.netty.util.ReferenceCountUtil; -import io.netty.util.internal.PlatformDependent; -import io.netty.util.internal.logging.InternalLogger; -import io.netty.util.internal.logging.InternalLoggerFactory; -import lombok.Getter; -import lombok.Setter; - -import javax.annotation.Nonnegative; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.net.Inet6Address; -import java.net.InetSocketAddress; -import java.util.Queue; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ConcurrentSkipListMap; - -import static com.nukkitx.network.raknet.RakNetConstants.*; - -@ParametersAreNonnullByDefault -public abstract class RakNetSession implements SessionConnection { - - private static final InternalLogger log = InternalLoggerFactory.getInstance(RakNetSession.class); - - final InetSocketAddress address; - final Channel channel; - final EventLoop eventLoop; - final int protocolVersion; - private int mtu; - private int adjustedMtu; // Used in datagram calculations - long guid; - private volatile RakNetState state = RakNetState.UNCONNECTED; - private volatile long lastTouched = System.currentTimeMillis(); - private volatile boolean closed = false; - - // Reliability, Ordering, Sequencing and datagram indexes - private RakNetSlidingWindow slidingWindow; - private int splitIndex; - private int datagramReadIndex; - private int datagramWriteIndex; - private int reliabilityReadIndex; - private int reliabilityWriteIndex; - private int[] orderReadIndex; - private int[] orderWriteIndex; - - private RoundRobinArray splitPackets; - private BitQueue reliableDatagramQueue; - - private FastBinaryMinHeap outgoingPackets; - private long[] outgoingPacketNextWeights; - private FastBinaryMinHeap[] orderingHeaps; - @Getter - @Setter - private volatile RakNetSessionListener listener = null; - private volatile long currentPingTime = -1; - private volatile long lastPingTime = -1; - private volatile long lastPongTime = -1; - private ConcurrentMap sentDatagrams; - private Queue incomingAcks; - private Queue incomingNaks; - private Queue outgoingAcks; - private Queue outgoingNaks; - private int unackedBytes; - private long lastMinWeight; - - RakNetSession(InetSocketAddress address, Channel channel, EventLoop eventLoop, int mtu, int protocolVersion) { - this.address = address; - this.channel = channel; - this.eventLoop = eventLoop; - this.setMtu(mtu); - this.protocolVersion = protocolVersion; - } - - final void initialize() { - Preconditions.checkState(this.state == RakNetState.INITIALIZING); - - this.slidingWindow = new RakNetSlidingWindow(this.mtu); - - this.reliableDatagramQueue = new BitQueue(512); - this.orderReadIndex = new int[MAXIMUM_ORDERING_CHANNELS]; - this.orderWriteIndex = new int[MAXIMUM_ORDERING_CHANNELS]; - - //noinspection unchecked - this.orderingHeaps = new FastBinaryMinHeap[MAXIMUM_ORDERING_CHANNELS]; - this.splitPackets = new RoundRobinArray<>(256); - this.sentDatagrams = new ConcurrentSkipListMap<>(); - for (int i = 0; i < MAXIMUM_ORDERING_CHANNELS; i++) { - orderingHeaps[i] = new FastBinaryMinHeap<>(64); - } - - this.outgoingPackets = new FastBinaryMinHeap<>(8); - - this.incomingAcks = PlatformDependent.newMpscQueue(); - this.incomingNaks = PlatformDependent.newMpscQueue(); - this.outgoingAcks = PlatformDependent.newMpscQueue(); - this.outgoingNaks = PlatformDependent.newMpscQueue(); - - this.outgoingPacketNextWeights = new long[4]; - this.initHeapWeights(); - } - - private void deinitialize() { - // Perform resource clean up. - if (this.splitPackets != null) { - this.splitPackets.forEach(ReferenceCountUtil::release); - } - if (this.sentDatagrams != null) { - this.sentDatagrams.values().forEach(ReferenceCountUtil::release); - } - - FastBinaryMinHeap[] orderingHeaps = this.orderingHeaps; - this.orderingHeaps = null; - if (orderingHeaps != null) { - for (FastBinaryMinHeap orderingHeap : orderingHeaps) { - EncapsulatedPacket packet; - while ((packet = orderingHeap.poll()) != null) { - packet.release(); - } - } - } - - FastBinaryMinHeap outgoingPackets = this.outgoingPackets; - this.outgoingPackets = null; - if (outgoingPackets != null) { - EncapsulatedPacket packet; - while ((packet = outgoingPackets.poll()) != null) { - packet.release(); - } - } - } - - public InetSocketAddress getAddress() { - return this.address; - } - - public int getMtu() { - return this.mtu; - } - - void setMtu(int mtu) { - this.mtu = RakNetUtils.clamp(mtu, MINIMUM_MTU_SIZE, MAXIMUM_MTU_SIZE); - this.adjustedMtu = (this.mtu - UDP_HEADER_SIZE) - (this.address.getAddress() instanceof Inet6Address ? 40 : 20); - } - - public int getProtocolVersion() { - return this.protocolVersion; - } - - public long getPing() { - return this.lastPongTime - this.lastPingTime; - } - - public ByteBuf allocateBuffer(int capacity) { - return this.channel.alloc().ioBuffer(capacity); - } - - private void initHeapWeights() { - for (int priorityLevel = 0; priorityLevel < 4; priorityLevel++) { - this.outgoingPacketNextWeights[priorityLevel] = (1 << priorityLevel) * priorityLevel + priorityLevel; - } - } - - private long getNextWeight(RakNetPriority priority) { - int priorityLevel = priority.ordinal(); - long next = this.outgoingPacketNextWeights[priorityLevel]; - - if (!this.outgoingPackets.isEmpty()) { - if (next >= this.lastMinWeight) { - next = this.lastMinWeight + (1 << priorityLevel) * priorityLevel + priorityLevel; - this.outgoingPacketNextWeights[priorityLevel] = next + (1 << priorityLevel) * (priorityLevel + 1) + priorityLevel; - } - } else { - this.initHeapWeights(); - } - this.lastMinWeight = next - (1 << priorityLevel) * priorityLevel + priorityLevel; - return next; - } - - private EncapsulatedPacket getReassembledPacket(EncapsulatedPacket splitPacket) { - this.checkForClosed(); - - SplitPacketHelper helper = this.splitPackets.get(splitPacket.getPartId()); - if (helper == null) { - this.splitPackets.set(splitPacket.getPartId(), helper = new SplitPacketHelper(splitPacket.getPartCount())); - } - - // Try reassembling the packet. - EncapsulatedPacket result = helper.add(splitPacket, this); - if (result != null) { - // Packet reassembled. Remove the helper - if (this.splitPackets.remove(splitPacket.getPartId(), helper)) { - helper.release(); - } - } - - return result; - } - - public void onDatagram(ByteBuf buffer) { - try { - if (this.isClosed()) { - return; - } - this.touch(); - - byte potentialFlags = buffer.readByte(); - boolean rakNetDatagram = (potentialFlags & FLAG_VALID) != 0; - if (!rakNetDatagram) { - // Received non-datagram packet - buffer.readerIndex(0); - this.onPacketInternal(buffer); - return; - } - - if (this.state == null || this.state.ordinal() < RakNetState.INITIALIZED.ordinal()) { - // Block RakNet datagrams if we haven't initialized the session yet. - return; - } - - // Check if we have received acknowledge datagram - if ((potentialFlags & FLAG_ACK) != 0) { - this.onAcknowledge(buffer, this.incomingAcks, false); - } else if ((potentialFlags & FLAG_NACK) != 0) { - this.onAcknowledge(buffer, this.incomingNaks, true); - } else { - buffer.readerIndex(0); - this.onRakNetDatagram(buffer); - } - } catch (Exception ex) { - Server.getInstance().getLogger().error("Received bad datagram from " + this.address, ex); - this.disconnect(DisconnectReason.BAD_PACKET); - } finally { - buffer.release(); - } - } - - private void onEncapsulatedInternal(EncapsulatedPacket packet) { - ByteBuf buffer = packet.buffer; - short packetId = buffer.readUnsignedByte(); - switch (packetId) { - case ID_CONNECTED_PING: - this.onConnectedPing(buffer); - break; - case ID_CONNECTED_PONG: - this.onConnectedPong(buffer); - break; - case ID_DISCONNECTION_NOTIFICATION: - this.onDisconnectionNotification(); - break; - default: - buffer.readerIndex(0); - if (packetId >= ID_USER_PACKET_ENUM) { - // Forward to user - if (this.listener != null) { - this.listener.onEncapsulated(packet); - } - } else { - this.onPacket(buffer); - } - break; - } - } - - private void onPacketInternal(ByteBuf buffer) { - short packetId = buffer.getUnsignedByte(buffer.readerIndex()); - buffer.readerIndex(0); - if (packetId >= ID_USER_PACKET_ENUM) { - // Forward to user - if (this.listener != null) { - this.listener.onDirect(buffer); - } - } else { - this.onPacket(buffer); - } - } - - protected abstract void onPacket(ByteBuf buffer); - - private void onRakNetDatagram(ByteBuf buffer) { - if (this.state == null || RakNetState.INITIALIZED.compareTo(this.state) > 0) { - return; - } - RakNetDatagram datagram = new RakNetDatagram(System.currentTimeMillis()); - datagram.decode(buffer); - - this.slidingWindow.onPacketReceived(datagram.sendTime); - - int prevSequenceIndex = this.datagramReadIndex; - if (prevSequenceIndex < datagram.sequenceIndex) { - this.datagramReadIndex = datagram.sequenceIndex + 1; - } - - int missedDatagrams = datagram.sequenceIndex - prevSequenceIndex; - - if (missedDatagrams > 0) { - this.outgoingNaks.offer(new IntRange(datagram.sequenceIndex - missedDatagrams, datagram.sequenceIndex)); - } - - this.outgoingAcks.offer(new IntRange(datagram.sequenceIndex, datagram.sequenceIndex)); - - for (final EncapsulatedPacket encapsulated : datagram.packets) { - if (encapsulated.reliability.isReliable()) { - int missed = encapsulated.reliabilityIndex - this.reliabilityReadIndex; - - if (missed > 0) { - if (missed < this.reliableDatagramQueue.size()) { - if (this.reliableDatagramQueue.get(missed)) { - this.reliableDatagramQueue.set(missed, false); - } else { - // Duplicate packet - continue; - } - } else { - int count = (missed - this.reliableDatagramQueue.size()); - for (int i = 0; i < count; i++) { - this.reliableDatagramQueue.add(true); - } - - this.reliableDatagramQueue.add(false); - } - } else if (missed == 0) { - this.reliabilityReadIndex++; - if (!this.reliableDatagramQueue.isEmpty()) { - this.reliableDatagramQueue.poll(); - } - } else { - // Duplicate packet - continue; - } - - while (!this.reliableDatagramQueue.isEmpty() && !this.reliableDatagramQueue.peek()) { - this.reliableDatagramQueue.poll(); - ++this.reliabilityReadIndex; - } - } - - - if (encapsulated.split) { - final EncapsulatedPacket reassembled = this.getReassembledPacket(encapsulated); - if (reassembled == null) { - // Not reassembled - continue; - } - try { - this.checkForOrdered(reassembled); - } finally { - reassembled.release(); - } - } else { - this.checkForOrdered(encapsulated); - } - } - } - - private void checkForOrdered(EncapsulatedPacket packet) { - if (packet.getReliability().isOrdered()) { - this.onOrderedReceived(packet); - } else { - this.onEncapsulatedInternal(packet); - } - } - - private void onOrderedReceived(EncapsulatedPacket packet) { - FastBinaryMinHeap binaryHeap = this.orderingHeaps[packet.orderingChannel]; - - if (this.orderReadIndex[packet.orderingChannel] < packet.orderingIndex) { - // Not next in line so add to queue. - binaryHeap.insert(packet.orderingIndex, packet.retain()); - return; - } else if (this.orderReadIndex[packet.orderingChannel] > packet.orderingIndex) { - // We already have this - return; - } - this.orderReadIndex[packet.orderingChannel]++; - - // Can be handled - this.onEncapsulatedInternal(packet); - - EncapsulatedPacket queuedPacket; - while ((queuedPacket = binaryHeap.peek()) != null) { - if (queuedPacket.orderingIndex == this.orderReadIndex[packet.orderingChannel]) { - try { - // We got the expected packet - binaryHeap.remove(); - this.orderReadIndex[packet.orderingChannel]++; - - this.onEncapsulatedInternal(queuedPacket); - } finally { - queuedPacket.release(); - } - } else { - // Found a gap. Wait till we start receive another ordered packet. - break; - } - } - } - - final void onTick(long curTime) { - if (this.isClosed()) { - return; - } - this.tick(curTime); - } - - protected void tick(long curTime) { - if (this.isTimedOut(curTime)) { - this.close(DisconnectReason.TIMED_OUT); - return; - } - - if (this.state == null || this.state.ordinal() < RakNetState.INITIALIZED.ordinal()) { - return; - } - - if (this.currentPingTime + 2000L < curTime) { - this.sendConnectedPing(curTime); - } - - this.handleIncomingAcknowledge(curTime, this.incomingAcks, false); - this.handleIncomingAcknowledge(curTime, this.incomingNaks, true); - - // Send known outgoing acknowledge packets - final int mtu = this.adjustedMtu - RAKNET_DATAGRAM_HEADER_SIZE; - while (!this.outgoingNaks.isEmpty()) { - ByteBuf buffer = this.allocateBuffer(mtu); - buffer.writeByte(FLAG_VALID | FLAG_NACK); - RakNetUtils.writeIntRanges(buffer, this.outgoingNaks, mtu - 1); - this.sendDirect(buffer); - } - - if (this.slidingWindow.shouldSendAcks(curTime)) { - while (!this.outgoingAcks.isEmpty()) { - ByteBuf buffer = this.allocateBuffer(mtu); - buffer.writeByte(FLAG_VALID | FLAG_ACK); - RakNetUtils.writeIntRanges(buffer, this.outgoingAcks, mtu - 1); - this.sendDirect(buffer); - this.slidingWindow.onSendAck(); - } - } - - // Send packets that are stale first. This function returns whether to continue - // to send rest of the datagrams, as it might close the session due to too many stale datagrams - if (this.sendStaleDatagrams(curTime)) { - // Now send usual packets - this.sendDatagrams(curTime); - // Finally, flush channel - this.channel.flush(); - } - } - - private void handleIncomingAcknowledge(long curTime, Queue queue, boolean nack) { - if (queue.isEmpty()) { - return; - } - - if (nack) { - this.slidingWindow.onNak(); - } - - IntRange range; - while ((range = queue.poll()) != null) { - for (int i = range.start; i <= range.end; i++) { - RakNetDatagram datagram = this.sentDatagrams.remove(i); - if (datagram != null) { - if (nack) { - this.onIncomingNack(datagram, curTime); - } else { - this.onIncomingAck(datagram, curTime); - } - } - } - } - } - - private void onIncomingAck(RakNetDatagram datagram, long curTime) { - try { - this.unackedBytes -= datagram.getSize(); - this.slidingWindow.onAck(curTime - datagram.sendTime, datagram.sequenceIndex, this.datagramReadIndex); - } finally { - datagram.release(); - } - } - - private void onIncomingNack(RakNetDatagram datagram, long curTime) { - if (Nukkit.DEBUG > 2) { - log.trace("NAK'ed datagram {} from {}", datagram.sequenceIndex, this.address); - } - this.sendDatagram(datagram, curTime); - } - - private boolean sendStaleDatagrams(long curTime) { - if (this.sentDatagrams.isEmpty()) { - return true; - } - - int resendCount = 0; - int transmissionBandwidth = this.slidingWindow.getRetransmissionBandwidth(this.unackedBytes); - - for (RakNetDatagram datagram : this.sentDatagrams.values()) { - if (datagram.getNextSend() <= curTime) { - int size = datagram.getSize(); - if (transmissionBandwidth < size) { - break; - } - transmissionBandwidth -= size; - resendCount++; - this.sendDatagram(datagram, curTime); - } - } - - if (resendCount > MAXIMUM_STALE_DATAGRAMS) { - if (Nukkit.DEBUG > 1) { - log.debug("Too many stale datagrams from " + this.address); - } - this.close(DisconnectReason.TIMED_OUT); - return false; - } - - if (resendCount > 0) { - this.slidingWindow.onResend(curTime); - } - - return true; - } - - private void sendDatagrams(long curTime) { - if (this.outgoingPackets.isEmpty()) { - return; - } - - int transmissionBandwidth = this.slidingWindow.getTransmissionBandwidth(this.unackedBytes); - RakNetDatagram datagram = new RakNetDatagram(curTime); - EncapsulatedPacket packet; - - while ((packet = this.outgoingPackets.peek()) != null) { - int size = packet.getSize(); - if (transmissionBandwidth < size) { - break; - } - - transmissionBandwidth -= size; - this.outgoingPackets.remove(); - - // Send full datagram - if (!datagram.tryAddPacket(packet, this.adjustedMtu)) { - this.sendDatagram(datagram, curTime); - - datagram = new RakNetDatagram(curTime); - if (!datagram.tryAddPacket(packet, this.adjustedMtu)) { - throw new IllegalArgumentException("Packet too large to fit in MTU (size: " + packet.getSize() + ", MTU: " + this.adjustedMtu + ')'); - } - } - } - - if (!datagram.getPackets().isEmpty()) { - this.sendDatagram(datagram, curTime); - } - } - - @Override - public void disconnect() { - this.disconnect(DisconnectReason.DISCONNECTED); - } - - @Override - public void disconnect(DisconnectReason reason) { - if (!this.isClosed()) { - this.eventLoop.execute(() -> this.disconnect0(reason)); - } - } - - private void disconnect0(DisconnectReason reason) { - if (!this.isClosed()) { - this.sendDisconnectionNotification(); - this.close0(reason); - } - } - - @Override - public void close() { - this.close(DisconnectReason.DISCONNECTED); - } - - @Override - public void close(DisconnectReason reason) { - if (!this.isClosed()) { - this.eventLoop.execute(() -> this.close0(reason)); - } - } - - private void close0(DisconnectReason reason) { - if (this.isClosed()) { - return; - } - - this.closed = true; - this.state = RakNetState.UNCONNECTED; - this.onClose(); - if (Nukkit.DEBUG > 2) { - log.trace("RakNet Session ({} => {}) closed: {}", this.getRakNet().getBindAddress(), this.address, reason); - } - - this.deinitialize(); - if (this.listener != null) { - this.listener.onDisconnect(reason); - } - } - - protected void onClose() { - } - - @Override - public void sendImmediate(ByteBuf buf) { - this.send(buf, RakNetPriority.IMMEDIATE); - } - - @Override - public void send(ByteBuf buf) { - this.send(buf, RakNetPriority.MEDIUM); - } - - public void send(ByteBuf buf, RakNetPriority priority) { - this.send(buf, priority, RakNetReliability.RELIABLE_ORDERED); - } - - public void send(ByteBuf buf, RakNetReliability reliability) { - this.send(buf, RakNetPriority.MEDIUM, reliability); - } - - public void send(ByteBuf buf, RakNetPriority priority, RakNetReliability reliability) { - this.send(buf, priority, reliability, 0); - } - - public void send(ByteBuf buf, RakNetPriority priority, RakNetReliability reliability, @Nonnegative int orderingChannel) { - if (this.eventLoop.inEventLoop()) { - this.send0(buf, priority, reliability, orderingChannel); - } else { - this.eventLoop.execute(() -> this.send0(buf, priority, reliability, orderingChannel)); - } - } - - private void send0(ByteBuf buf, RakNetPriority priority, RakNetReliability reliability, @Nonnegative int orderingChannel) { - try { - if (this.isClosed() || state == null || state.ordinal() < RakNetState.INITIALIZED.ordinal()) { - // Session is not ready for RakNet datagrams. - return; - } - EncapsulatedPacket[] packets = this.createEncapsulated(buf, priority, reliability, orderingChannel); - - if (priority == RakNetPriority.IMMEDIATE) { - this.sendImmediate(packets); - return; - } - - long weight = this.getNextWeight(priority); - if (packets.length == 1) { - this.outgoingPackets.insert(weight, packets[0]); - } else { - this.outgoingPackets.insertSeries(weight, packets); - } - } finally { - buf.release(); - } - } - - private void sendImmediate(EncapsulatedPacket[] packets) { - long curTime = System.currentTimeMillis(); - - for (EncapsulatedPacket packet : packets) { - RakNetDatagram datagram = new RakNetDatagram(curTime); - - if (!datagram.tryAddPacket(packet, this.adjustedMtu)) { - throw new IllegalArgumentException("Packet too large to fit in MTU (size: " + packet.getSize() + - ", MTU: " + this.adjustedMtu + ')'); - } - this.sendDatagram(datagram, curTime); - } - this.channel.flush(); - } - - private EncapsulatedPacket[] createEncapsulated(ByteBuf buffer, RakNetPriority priority, RakNetReliability reliability, - int orderingChannel) { - int maxLength = this.adjustedMtu - MAXIMUM_ENCAPSULATED_HEADER_SIZE - RAKNET_DATAGRAM_HEADER_SIZE; - - ByteBuf[] buffers; - int splitId = 0; - - if (buffer.readableBytes() > maxLength) { - // Packet requires splitting - // Adjust reliability - switch (reliability) { - case UNRELIABLE: - reliability = RakNetReliability.RELIABLE; - break; - case UNRELIABLE_SEQUENCED: - reliability = RakNetReliability.RELIABLE_SEQUENCED; - break; - case UNRELIABLE_WITH_ACK_RECEIPT: - reliability = RakNetReliability.RELIABLE_WITH_ACK_RECEIPT; - break; - } - - int split = ((buffer.readableBytes() - 1) / maxLength) + 1; - buffer.retain(split); - - buffers = new ByteBuf[split]; - for (int i = 0; i < split; i++) { - buffers[i] = buffer.readSlice(Math.min(maxLength, buffer.readableBytes())); - } - if (buffer.isReadable()) { - throw new IllegalStateException("Buffer still has bytes to read!"); - } - - // Allocate split ID - splitId = this.splitIndex++; - } else { - buffers = new ByteBuf[]{buffer.readRetainedSlice(buffer.readableBytes())}; - } - - // Set meta - int orderingIndex = 0; - /*int sequencingIndex = 0; - if (reliability.isSequenced()) { - sequencingIndex = this.sequenceWriteIndex.getAndIncrement(orderingChannel); - } todo: sequencing */ - if (reliability.isOrdered()) { - orderingIndex = this.orderWriteIndex[orderingChannel]++; - } - - // Now create the packets. - EncapsulatedPacket[] packets = new EncapsulatedPacket[buffers.length]; - for (int i = 0, parts = buffers.length; i < parts; i++) { - EncapsulatedPacket packet = new EncapsulatedPacket(); - packet.buffer = buffers[i]; - packet.orderingChannel = (short) orderingChannel; - packet.orderingIndex = orderingIndex; - //packet.setSequenceIndex(sequencingIndex); - packet.reliability = reliability; - if (reliability.isReliable()) { - packet.reliabilityIndex = this.reliabilityWriteIndex++; - } - - if (parts > 1) { - packet.split = true; - packet.partIndex = i; - packet.partCount = parts; - packet.partId = splitId; - } - - packets[i] = packet; - } - return packets; - } - - private void sendDatagram(RakNetDatagram datagram, long time) { - Preconditions.checkArgument(!datagram.packets.isEmpty(), "RakNetDatagram with no packets"); - try { - int oldIndex = datagram.sequenceIndex; - datagram.sequenceIndex = this.datagramWriteIndex++; - - for (EncapsulatedPacket packet : datagram.packets) { - // check if packet is reliable so it can be resent later if a NAK is received. - if (packet.reliability != RakNetReliability.UNRELIABLE && - packet.reliability != RakNetReliability.UNRELIABLE_SEQUENCED) { - datagram.nextSend = time + this.slidingWindow.getRtoForRetransmission(); - if (oldIndex == -1) { - this.unackedBytes += datagram.getSize(); - } else { - this.sentDatagrams.remove(oldIndex, datagram); - } - this.sentDatagrams.put(datagram.sequenceIndex, datagram.retain()); // Keep for resending - break; - } - } - ByteBuf buf = this.allocateBuffer(datagram.getSize()); - Preconditions.checkArgument(buf.writerIndex() < this.adjustedMtu, "Packet length was %s but expected %s", buf.writerIndex(), this.adjustedMtu); - datagram.encode(buf); - this.channel.write(new DatagramPacket(buf, this.address)); - } finally { - datagram.release(); - } - } - - void sendDirect(ByteBuf buffer) { - this.channel.writeAndFlush(new DatagramPacket(buffer, this.address)); - } - - /* - * Packet Handlers - */ - - private void onAcknowledge(ByteBuf buffer, Queue queue, boolean nack) { - this.checkForClosed(); - int size = buffer.readUnsignedShort(); - for (int i = 0; i < size; i++) { - boolean singleton = buffer.readBoolean(); - int start = buffer.readUnsignedMediumLE(); - // We don't need the upper limit if it's a singleton - int end = singleton ? start : buffer.readMediumLE(); - if (start > end) { - if (Nukkit.DEBUG > 2) { - log.trace("{} sent an IntRange with a start value {} greater than an end value of {}", this.address, - start, end); - } - this.disconnect(DisconnectReason.BAD_PACKET); - return; - } - queue.offer(new IntRange(start, end)); - } - } - - private void onConnectedPing(ByteBuf buffer) { - long pingTime = buffer.readLong(); - this.sendConnectedPong(pingTime); - } - - private void onConnectedPong(ByteBuf buffer) { - long pingTime = buffer.readLong(); - if (this.currentPingTime == pingTime) { - this.lastPingTime = this.currentPingTime; - this.lastPongTime = System.currentTimeMillis(); - } - } - - private void onDisconnectionNotification() { - this.close(DisconnectReason.CLOSED_BY_REMOTE_PEER); - } - - /* - * Packet Dispatchers - */ - - private void sendConnectedPing(long pingTime) { - ByteBuf buffer = this.allocateBuffer(9); - buffer.writeByte(ID_CONNECTED_PING); - buffer.writeLong(pingTime); - this.send(buffer, RakNetPriority.IMMEDIATE, RakNetReliability.RELIABLE); - this.currentPingTime = pingTime; - } - - private void sendConnectedPong(long pingTime) { - ByteBuf buffer = this.allocateBuffer(17); - buffer.writeByte(ID_CONNECTED_PONG); - buffer.writeLong(pingTime); - buffer.writeLong(System.currentTimeMillis()); - this.send(buffer, RakNetPriority.IMMEDIATE, RakNetReliability.RELIABLE); - } - - private void sendDisconnectionNotification() { - ByteBuf buffer = this.allocateBuffer(1); - buffer.writeByte(ID_DISCONNECTION_NOTIFICATION); - this.send(buffer, RakNetPriority.IMMEDIATE, RakNetReliability.RELIABLE_ORDERED); - } - - private void touch() { - this.checkForClosed(); - this.lastTouched = System.currentTimeMillis(); - } - - public boolean isTimedOut(long curTime) { - return curTime - this.lastTouched >= SESSION_TIMEOUT_MS; - } - - private void checkForClosed() { - Preconditions.checkState(!this.isClosed(), "Session already closed"); - } - - public boolean isClosed() { - return this.closed; - } - - public abstract RakNet getRakNet(); - - boolean isIpv6Session() { - return this.address.getAddress() instanceof Inet6Address; - } - - public RakNetState getState() { - return state; - } - - void setState(@Nullable RakNetState state) { - if (this.state != state) { - this.state = state; - if (this.listener != null) { - this.listener.onSessionChangeState(this.state); - } - } - } - - public Channel getChannel() { - return channel; - } - - public EventLoop getEventLoop() { - return eventLoop; - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetSessionListener.java b/src/main/java/com/nukkitx/network/raknet/RakNetSessionListener.java deleted file mode 100644 index 152f0604c..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetSessionListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.nukkitx.network.raknet; - -import com.nukkitx.network.util.DisconnectReason; -import io.netty.buffer.ByteBuf; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -public interface RakNetSessionListener { - - void onSessionChangeState(RakNetState state); - - void onDisconnect(DisconnectReason reason); - - void onEncapsulated(EncapsulatedPacket packet); - - void onDirect(ByteBuf buf); -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetSlidingWindow.java b/src/main/java/com/nukkitx/network/raknet/RakNetSlidingWindow.java deleted file mode 100644 index 998a90aaf..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetSlidingWindow.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.nukkitx.network.raknet; - -import static com.nukkitx.network.raknet.RakNetConstants.*; - -public class RakNetSlidingWindow { - - private final int mtu; - private double cwnd; - private double ssThresh; - private double estimatedRTT = -1; - private double lastRTT = -1; - private double deviationRTT = -1; - private long oldestUnsentAck; - private long nextCongestionControlBlock; - private boolean backoffThisBlock; - - public RakNetSlidingWindow(int mtu) { - this.mtu = mtu; - this.cwnd = mtu; - } - - public int getRetransmissionBandwidth(int unAckedBytes) { - return unAckedBytes; - } - - public int getTransmissionBandwidth(int unAckedBytes) { - if (unAckedBytes <= this.cwnd) { - return (int) (this.cwnd - unAckedBytes); - } else { - return 0; - } - } - - public void onPacketReceived(long curTime) { - if (this.oldestUnsentAck == 0) { - this.oldestUnsentAck = curTime; - } - } - - public void onResend(long curSequenceIndex) { - if (!this.backoffThisBlock && this.cwnd > this.mtu << 1) { - this.ssThresh = this.cwnd / 2; - - if (this.ssThresh < this.mtu) { - this.ssThresh = this.mtu; - } - this.cwnd = this.mtu; - - this.nextCongestionControlBlock = curSequenceIndex; - this.backoffThisBlock = true; - } - } - - public void onNak() { - if (!this.backoffThisBlock) { - this.ssThresh = this.cwnd / 2D; - } - } - - public void onAck(long rtt, long sequenceIndex, long curSequenceIndex) { - this.lastRTT = rtt; - - if (this.estimatedRTT == -1) { - this.estimatedRTT = rtt; - this.deviationRTT = rtt; - } else { - double difference = rtt - this.estimatedRTT; - this.estimatedRTT += 0.5D * difference; - this.deviationRTT += 0.5 * (Math.abs(difference) - this.deviationRTT); - } - - boolean isNewCongestionControlPeriod = sequenceIndex > this.nextCongestionControlBlock; - - if (isNewCongestionControlPeriod) { - this.backoffThisBlock = false; - this.nextCongestionControlBlock = curSequenceIndex; - } - - if (this.isInSlowStart()) { - this.cwnd += this.mtu; - - if (this.cwnd > this.ssThresh && this.ssThresh != 0) { - this.cwnd = this.ssThresh + this.mtu * this.mtu / this.cwnd; - } - } else if (isNewCongestionControlPeriod) { - this.cwnd += this.mtu * this.mtu / this.cwnd; - } - } - - public boolean isInSlowStart() { - return this.cwnd <= this.ssThresh || this.ssThresh == 0; - } - - public void onSendAck() { - this.oldestUnsentAck = 0; - } - - public long getRtoForRetransmission() { - if (this.estimatedRTT == -1) { - return CC_MAXIMUM_THRESHOLD; - } - - long threshold = (long) ((2.0D * this.estimatedRTT + 4.0D * this.deviationRTT) + CC_ADDITIONAL_VARIANCE); - - return Math.min(threshold, CC_MAXIMUM_THRESHOLD); - } - - public double getRTT() { - return this.estimatedRTT; - } - - public boolean shouldSendAcks(long curTime) { - long rto = this.getSenderRtoForAck(); - - return rto == -1 || curTime >= this.oldestUnsentAck + CC_SYN; - } - - public long getSenderRtoForAck() { - if (this.lastRTT == -1) { - return -1; - } else { - return (long) (this.lastRTT + CC_SYN); - } - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetState.java b/src/main/java/com/nukkitx/network/raknet/RakNetState.java deleted file mode 100644 index e2d50698b..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetState.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.nukkitx.network.raknet; - -public enum RakNetState { - - UNCONNECTED, - INITIALIZING, - INITIALIZED, - CONNECTING, - CONNECTED -} diff --git a/src/main/java/com/nukkitx/network/raknet/RakNetUtils.java b/src/main/java/com/nukkitx/network/raknet/RakNetUtils.java deleted file mode 100644 index c8d073d2c..000000000 --- a/src/main/java/com/nukkitx/network/raknet/RakNetUtils.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.nukkitx.network.raknet; - -import com.nukkitx.network.raknet.util.IntRange; -import io.netty.buffer.ByteBuf; -import lombok.experimental.UtilityClass; - -import java.util.Arrays; -import java.util.Queue; - -@UtilityClass -public class RakNetUtils { - - public static int writeIntRanges(ByteBuf buffer, Queue ackQueue, int mtu) { - int lengthIndex = buffer.writerIndex(); - buffer.writeZero(2); - mtu -= 2; - - int count = 0; - IntRange ackRange; - while ((ackRange = ackQueue.poll()) != null) { - - IntRange nextRange; - while ((nextRange = ackQueue.peek()) != null && (ackRange.end + 1) == nextRange.start) { - ackQueue.remove(); - ackRange.end = nextRange.end; - } - - if (ackRange.start == ackRange.end) { - if (mtu < 4) { - break; - } - mtu -= 4; - - buffer.writeBoolean(true); - buffer.writeMediumLE(ackRange.start); - } else { - if (mtu < 7) { - break; - } - mtu -= 7; - - buffer.writeBoolean(false); - buffer.writeMediumLE(ackRange.start); - buffer.writeMediumLE(ackRange.end); - } - count++; - } - - int finalIndex = buffer.writerIndex(); - buffer.writerIndex(lengthIndex); - buffer.writeShort(count); - buffer.writerIndex(finalIndex); - return count; - } - - public static boolean verifyUnconnectedMagic(ByteBuf buffer) { - byte[] readMagic = new byte[RakNetConstants.RAKNET_UNCONNECTED_MAGIC.length]; - buffer.readBytes(readMagic); - - return Arrays.equals(readMagic, RakNetConstants.RAKNET_UNCONNECTED_MAGIC); - } - - public static void writeUnconnectedMagic(ByteBuf buffer) { - buffer.writeBytes(RakNetConstants.RAKNET_UNCONNECTED_MAGIC); - } - - public static int clamp(int value, int low, int high) { - return value < low ? low : Math.min(value, high); - } - - public static int powerOfTwoCeiling(int value) { - value--; - value |= value >> 1; - value |= value >> 2; - value |= value >> 4; - value |= value >> 8; - value |= value >> 16; - value++; - return value; - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/pipeline/RakExceptionHandler.java b/src/main/java/com/nukkitx/network/raknet/pipeline/RakExceptionHandler.java deleted file mode 100644 index 2d0478fb1..000000000 --- a/src/main/java/com/nukkitx/network/raknet/pipeline/RakExceptionHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.nukkitx.network.raknet.pipeline; - -import cn.nukkit.Server; -import io.netty.channel.ChannelDuplexHandler; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; - -@ChannelHandler.Sharable -public class RakExceptionHandler extends ChannelDuplexHandler { - - public static final String NAME = "rak-exception-handler"; - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - Server.getInstance().getLogger().error("An exception occurred in RakNet", cause); - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/pipeline/RakOutboundHandler.java b/src/main/java/com/nukkitx/network/raknet/pipeline/RakOutboundHandler.java deleted file mode 100644 index 665420297..000000000 --- a/src/main/java/com/nukkitx/network/raknet/pipeline/RakOutboundHandler.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.nukkitx.network.raknet.pipeline; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelOutboundHandlerAdapter; -import io.netty.channel.ChannelPromise; - -public class RakOutboundHandler extends ChannelOutboundHandlerAdapter { - - public static final String NAME = "rak-outbound-handler"; - - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - super.write(ctx, msg, promise); - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/pipeline/ServerDatagramHandler.java b/src/main/java/com/nukkitx/network/raknet/pipeline/ServerDatagramHandler.java deleted file mode 100644 index 26b26bf31..000000000 --- a/src/main/java/com/nukkitx/network/raknet/pipeline/ServerDatagramHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.nukkitx.network.raknet.pipeline; - -import com.nukkitx.network.raknet.RakNetServer; -import com.nukkitx.network.raknet.RakNetServerSession; -import com.nukkitx.network.raknet.RakNetUtils; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.socket.DatagramPacket; - -import static com.nukkitx.network.raknet.RakNetConstants.*; - -@ChannelHandler.Sharable -public class ServerDatagramHandler extends SimpleChannelInboundHandler { - - public static final String NAME = "rak-server-datagram-handler"; - private final RakNetServer server; - - public ServerDatagramHandler(RakNetServer server) { - this.server = server; - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception { - ByteBuf buffer = packet.content(); - short packetId = buffer.readByte(); - - // These packets don't require a session - switch (packetId) { - case ID_UNCONNECTED_PING: - this.onUnconnectedPing(ctx, packet); - return; - case ID_OPEN_CONNECTION_REQUEST_1: - this.server.onOpenConnectionRequest1(ctx, packet); - return; - } - - buffer.readerIndex(0); - - RakNetServerSession session = this.server.getSession(packet.sender()); - if (session != null) { - if (session.getEventLoop().inEventLoop()) { - session.onDatagram(buffer.retain()); - } else { - ByteBuf buf = buffer.retain(); - session.getEventLoop().execute(() -> session.onDatagram(buf)); - } - } - - if (this.server.getListener() != null) { - this.server.getListener().onUnhandledDatagram(ctx, packet); - } - } - - private void onUnconnectedPing(ChannelHandlerContext ctx, DatagramPacket packet) { - if (!packet.content().isReadable(24)) { - return; - } - - long pingTime = packet.content().readLong(); - if (!RakNetUtils.verifyUnconnectedMagic(packet.content())) { - return; - } - - byte[] userData = null; - if (this.server.getListener() != null) { - userData = this.server.getListener().onQuery(packet.sender()); - } - - if (userData == null) { - userData = new byte[0]; - } - - int packetLength = 35 + userData.length; - - ByteBuf buffer = ctx.alloc().ioBuffer(packetLength, packetLength); - buffer.writeByte(ID_UNCONNECTED_PONG); - buffer.writeLong(pingTime); - buffer.writeLong(this.server.getGuid()); - RakNetUtils.writeUnconnectedMagic(buffer); - buffer.writeShort(userData.length); - buffer.writeBytes(userData); - ctx.writeAndFlush(new DatagramPacket(buffer, packet.sender())); - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/pipeline/ServerMessageHandler.java b/src/main/java/com/nukkitx/network/raknet/pipeline/ServerMessageHandler.java deleted file mode 100644 index f3ed50269..000000000 --- a/src/main/java/com/nukkitx/network/raknet/pipeline/ServerMessageHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.nukkitx.network.raknet.pipeline; - -import com.nukkitx.network.raknet.RakNetServer; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.socket.DatagramPacket; - -@ChannelHandler.Sharable -public class ServerMessageHandler extends SimpleChannelInboundHandler { - - public static final String NAME = "rak-server-message-handler"; - private final RakNetServer server; - - public ServerMessageHandler(RakNetServer server) { - this.server = server; - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception { - if (this.server.isBlocked(packet.sender().getAddress())) { - // Drop incoming traffic from blocked address - return; - } - - ByteBuf buffer = packet.content(); - if (!buffer.isReadable()) { - return; - } - - ctx.fireChannelRead(packet.retain()); - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/util/BitQueue.java b/src/main/java/com/nukkitx/network/raknet/util/BitQueue.java deleted file mode 100644 index d813dc9c9..000000000 --- a/src/main/java/com/nukkitx/network/raknet/util/BitQueue.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.nukkitx.network.raknet.util; - -import com.nukkitx.network.raknet.RakNetUtils; - -public class BitQueue { - - private byte[] queue; - private int head; - private int tail; - - public BitQueue(int capacity) { - capacity = RakNetUtils.powerOfTwoCeiling(capacity); - if (capacity <= 0) { - capacity = 8; - } - - this.queue = new byte[((capacity + 7) >> 3)]; - this.head = 0; - this.tail = 0; - } - - public void add(boolean bit) { - if (((this.head + 1) & ((this.queue.length << 3) - 1)) == this.tail) { - this.resize(this.queue.length << 4); - } - - int by = this.head >> 3; - byte bi = (byte) (1 << (this.head & 7)); - this.queue[by] ^= (byte) (((bit ? 0xFF : 0x00) ^ this.queue[by]) & bi); - this.head = (this.head + 1) & ((this.queue.length << 3) - 1); - } - - private void resize(int capacity) { - byte[] newQueue = new byte[(capacity + 7) >> 3]; - int size = this.size(); - - if ((this.tail & 7) == 0) { - if (this.head > this.tail) { - int srcPos = this.tail >> 3; - int length = (this.head - this.tail + 7) >> 3; - System.arraycopy(this.queue, srcPos, newQueue, 0, length); - } else if (this.head < this.tail) { - int length = this.tail >> 3; - int adjustedPos = ((this.queue.length << 3) - this.tail + 7) >> 3; - System.arraycopy(this.queue, length, newQueue, 0, adjustedPos); - length = (this.head + 7) >> 3; - System.arraycopy(this.queue, 0, newQueue, adjustedPos, length); - } - - this.tail = 0; - this.head = size; - } else { - int tailBits = (this.tail & 7); - int tailIdx = this.tail >> 3; - int by2 = (tailIdx + 1) & (this.queue.length - 1); - int mask; - int bit1; - int bit2; - - int cursor = 0; - while (cursor < size) { - mask = ((1 << tailBits) - 1) & 0xFF; - bit1 = ((this.queue[tailIdx] & (~mask & 0xFF)) >>> tailBits); - bit2 = (this.queue[by2] << (8 - tailBits)); - newQueue[cursor >> 3] = (byte) (bit1 | bit2); - - cursor += 8; - tailIdx = (tailIdx + 1) & (this.queue.length - 1); - by2 = (by2 + 1) & (this.queue.length - 1); - } - - this.tail = 0; - this.head = size; - } - - this.queue = newQueue; - } - - public int size() { - if (this.head > this.tail) { - return (this.head - this.tail); - } else if (this.head < this.tail) { - return ((this.queue.length << 3) - (this.tail - this.head)); - } else { - return 0; - } - } - - public void set(int n, boolean bit) { - if (n >= this.size() || n < 0) { - return; - } - - int idx = (this.tail + n) & ((this.queue.length << 3) - 1); - int arrIdx = idx >> 3; - byte mask = (byte) (1 << (idx & 7)); - this.queue[arrIdx] ^= (byte) (((bit ? 0xFF : 0x00) ^ this.queue[arrIdx]) & mask); - } - - public boolean get(int n) { - if (n >= this.size() || n < 0) { - return false; - } - - int idx = (this.tail + n) & ((this.queue.length << 3) - 1); - int arrIdx = idx >> 3; - byte mask = (byte) (1 << (idx & 7)); - return (this.queue[arrIdx] & mask) != 0; - } - - public boolean isEmpty() { - return (this.head == this.tail); - } - - public boolean peek() { - if (this.head == this.tail) { - return false; - } - - int arrIdx = this.tail >> 3; - byte mask = (byte) (1 << ((this.tail) & 7)); - return (this.queue[arrIdx] & mask) != 0; - } - - public boolean poll() { - if (this.head == this.tail) { - return false; - } - - int arrIdx = this.tail >> 3; - byte mask = (byte) (1 << ((this.tail) & 7)); - this.tail = (this.tail + 1) & ((this.queue.length << 3) - 1); - return (this.queue[arrIdx] & mask) != 0; - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/util/FastBinaryMinHeap.java b/src/main/java/com/nukkitx/network/raknet/util/FastBinaryMinHeap.java deleted file mode 100644 index 423005cfa..000000000 --- a/src/main/java/com/nukkitx/network/raknet/util/FastBinaryMinHeap.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.nukkitx.network.raknet.util; - -import com.nukkitx.network.raknet.RakNetUtils; - -import java.util.Arrays; -import java.util.NoSuchElementException; -import java.util.Objects; - -public class FastBinaryMinHeap { - - private Object[] heap; - public long[] weights; - private int size; - - public FastBinaryMinHeap() { - this(8); - } - - public FastBinaryMinHeap(int initialCapacity) { - this.heap = new Object[++initialCapacity]; - this.weights = new long[initialCapacity]; - Arrays.fill(this.weights, Long.MAX_VALUE); // infimum - this.weights[0] = Long.MIN_VALUE; // supremum - } - - private void resize(int capacity) { - int adjustedSize = this.size + 1; - int copyLength = Math.min(this.heap.length, adjustedSize); - Object[] newHeap = new Object[capacity]; - long[] newWeights = new long[capacity]; - System.arraycopy(this.heap, 0, newHeap, 0, copyLength); - System.arraycopy(this.weights, 0, newWeights, 0, copyLength); - if (capacity > adjustedSize) { - Arrays.fill(newWeights, adjustedSize, capacity, Long.MAX_VALUE); - } - this.heap = newHeap; - this.weights = newWeights; - } - - public void insert(long weight, E element) { - Objects.requireNonNull(element, "element"); - this.ensureCapacity(this.size + 1); - this.insert0(weight, element); - } - - private void insert0(long weight, E element) { - int hole = ++this.size; - int pred = hole >> 1; - long predWeight = this.weights[pred]; - - while (predWeight > weight) { - this.weights[hole] = predWeight; - this.heap[hole] = this.heap[pred]; - hole = pred; - pred >>= 1; - predWeight = this.weights[pred]; - } - - this.weights[hole] = weight; - this.heap[hole] = element; - } - - public void insertSeries(long weight, E[] elements) { - Objects.requireNonNull(elements, "elements"); - if (elements.length == 0) return; - - this.ensureCapacity(this.size + elements.length); - - // Try and optimize insertion. - boolean optimized = this.size == 0; - if (!optimized) { - optimized = true; - for (int parentIdx = 0, currentIdx = this.size; parentIdx < currentIdx; parentIdx++) { - if (weight < this.weights[parentIdx]) { - optimized = false; - break; - } - } - } - - if (optimized) { - // Parents are all less than series weight so we can directly insert. - for (E element : elements) { - Objects.requireNonNull(element, "element"); - this.heap[++this.size] = element; - this.weights[this.size] = weight; - } - } else { - for (E element : elements) { - Objects.requireNonNull(element, "element"); - this.insert0(weight, element); - } - } - } - - private void ensureCapacity(int size) { - // +1 for infimum - if (size + 1 >= this.heap.length) { - this.resize(RakNetUtils.powerOfTwoCeiling(size + 1)); - } - } - - @SuppressWarnings("unchecked") - public E peek() { - return (E) this.heap[1]; - } - - @SuppressWarnings("unchecked") - public E poll() { - if (this.size > 0) { - E e = (E) this.heap[1]; - this.remove(); - return e; - } - return null; - } - - public void remove() { - if (this.size == 0) { - throw new NoSuchElementException("Heap is empty"); - } - int hole = 1; - int succ = 2; - int sz = this.size; - - while (succ < sz) { - long weight1 = this.weights[succ]; - long weight2 = this.weights[succ + 1]; - - if (weight1 > weight2) { - this.weights[hole] = weight2; - this.heap[hole] = this.heap[++succ]; - } else { - this.weights[hole] = weight1; - this.heap[hole] = this.heap[succ]; - } - hole = succ; - succ <<= 1; - } - - // bubble up rightmost element - long bubble = this.weights[sz]; - int pred = hole >> 1; - while (this.weights[pred] > bubble) { // must terminate since min at root - this.weights[hole] = this.weights[pred]; - this.heap[hole] = this.heap[pred]; - hole = pred; - pred >>= 1; - } - - // finally move data to hole - this.weights[hole] = bubble; - this.heap[hole] = this.heap[sz]; - - this.heap[sz] = null; // mark as deleted - this.weights[sz] = Long.MAX_VALUE; - - this.size--; - - if ((this.size << 2) < this.heap.length && this.size > 4) { - this.resize(this.size << 1); - } - } - - public boolean isEmpty() { - return this.size == 0; - } - - public int size() { - return this.size; - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/util/IntRange.java b/src/main/java/com/nukkitx/network/raknet/util/IntRange.java deleted file mode 100644 index 7e3e8b37f..000000000 --- a/src/main/java/com/nukkitx/network/raknet/util/IntRange.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.nukkitx.network.raknet.util; - -import com.nukkitx.network.util.Preconditions; - -public class IntRange { - - public int start; - public int end; - - public IntRange(int num) { - this(num, num); - } - - public IntRange(int start, int end) { - Preconditions.checkArgument(start <= end, "start is greater than end"); - this.start = start; - this.end = end; - } -} \ No newline at end of file diff --git a/src/main/java/com/nukkitx/network/raknet/util/RoundRobinArray.java b/src/main/java/com/nukkitx/network/raknet/util/RoundRobinArray.java deleted file mode 100644 index 7c1b7268f..000000000 --- a/src/main/java/com/nukkitx/network/raknet/util/RoundRobinArray.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.nukkitx.network.raknet.util; - -import com.nukkitx.network.raknet.RakNetUtils; -import io.netty.util.ReferenceCountUtil; - -import java.util.concurrent.atomic.AtomicReferenceArray; -import java.util.function.Consumer; - -public class RoundRobinArray { - - private final AtomicReferenceArray elements; - private final int mask; - - public RoundRobinArray(int fixedCapacity) { - fixedCapacity = RakNetUtils.powerOfTwoCeiling(fixedCapacity); - - this.elements = new AtomicReferenceArray<>(fixedCapacity); - this.mask = fixedCapacity - 1; - } - - public E get(int index) { - return this.elements.get(index & this.mask); - } - - public void set(int index, E value) { - int idx = index & this.mask; - Object element = this.elements.getAndSet(idx, value); - // Make sure to release any reference counted objects that get overwritten. - ReferenceCountUtil.release(element); - } - - public boolean remove(int index, E expected) { - int idx = index & this.mask; - return this.elements.compareAndSet(idx, expected, null); - } - - public void forEach(Consumer consumer) { - for (int i = 0, len = mask + 1; i < len; i++) { - consumer.accept(this.elements.get(i)); - } - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/util/RoundRobinIterator.java b/src/main/java/com/nukkitx/network/raknet/util/RoundRobinIterator.java deleted file mode 100644 index 2aae29d93..000000000 --- a/src/main/java/com/nukkitx/network/raknet/util/RoundRobinIterator.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.nukkitx.network.raknet.util; - -import java.util.Collection; -import java.util.Iterator; - -public class RoundRobinIterator implements Iterator { - - private final Collection collection; - private Iterator iterator; - - public RoundRobinIterator(Collection collection) { - this.collection = collection; - this.iterator = this.collection.iterator(); - } - - - @Override - public synchronized boolean hasNext() { - return !collection.isEmpty(); - } - - @Override - public synchronized E next() { - if (!this.iterator.hasNext()) { - this.iterator = this.collection.iterator(); - } - return this.iterator.next(); - } -} diff --git a/src/main/java/com/nukkitx/network/raknet/util/SplitPacketHelper.java b/src/main/java/com/nukkitx/network/raknet/util/SplitPacketHelper.java deleted file mode 100644 index daeb60db1..000000000 --- a/src/main/java/com/nukkitx/network/raknet/util/SplitPacketHelper.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.nukkitx.network.raknet.util; - -import com.nukkitx.network.raknet.EncapsulatedPacket; -import com.nukkitx.network.raknet.RakNetSession; -import com.nukkitx.network.util.Preconditions; -import io.netty.buffer.ByteBuf; -import io.netty.util.AbstractReferenceCounted; -import io.netty.util.ReferenceCountUtil; -import io.netty.util.ReferenceCounted; - -import javax.annotation.Nullable; - -public class SplitPacketHelper extends AbstractReferenceCounted { - - private final EncapsulatedPacket[] packets; - - public SplitPacketHelper(long expectedLength) { - Preconditions.checkArgument(expectedLength >= 1 && expectedLength <= 2048, - "expectedLength is less than 1 or greater than 2048 (%s)", expectedLength); - this.packets = new EncapsulatedPacket[(int) expectedLength]; - } - - @Nullable - public EncapsulatedPacket add(EncapsulatedPacket packet, RakNetSession session) { - Preconditions.checkNotNull(packet, "packet"); - Preconditions.checkArgument(packet.isSplit(), "packet is not split"); - Preconditions.checkState(this.refCnt() > 0, "packet has been released"); - Preconditions.checkElementIndex(packet.getPartIndex(), this.packets.length); - - int partIndex = packet.getPartIndex(); - if (this.packets[partIndex] != null) { - // Duplicate - return null; - } - this.packets[partIndex] = packet; - // Retain the packet so it can be reassembled later. - packet.retain(); - - int sz = 0; - for (EncapsulatedPacket netPacket : this.packets) { - if (netPacket == null) { - return null; - } - sz += netPacket.getBuffer().readableBytes(); - } - - // We can't use a composite buffer as the native code will choke on it - ByteBuf reassembled = session.allocateBuffer(sz); - for (EncapsulatedPacket netPacket : this.packets) { - ByteBuf buf = netPacket.getBuffer(); - reassembled.writeBytes(buf, buf.readerIndex(), buf.readableBytes()); - } - - return packet.fromSplit(reassembled); - } - - @Override - protected void deallocate() { - for (EncapsulatedPacket packet : this.packets) { - ReferenceCountUtil.release(packet); - } - } - - @Override - public ReferenceCounted touch(Object hint) { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/com/nukkitx/network/util/Bootstraps.java b/src/main/java/com/nukkitx/network/util/Bootstraps.java deleted file mode 100644 index 869304258..000000000 --- a/src/main/java/com/nukkitx/network/util/Bootstraps.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.nukkitx.network.util; - -import io.netty.bootstrap.AbstractBootstrap; -import io.netty.bootstrap.Bootstrap; -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.epoll.Native; -import io.netty.channel.socket.ServerSocketChannel; -import io.netty.channel.unix.UnixChannelOption; -import lombok.experimental.UtilityClass; - -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -import static com.nukkitx.network.util.EventLoops.CHANNEL_TYPE; - -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") -@UtilityClass -public final class Bootstraps { - - private static final Optional KERNEL_VERSION; - private static final int[] REUSEPORT_VERSION = new int[]{3, 9, 0}; - private static final boolean REUSEPORT_AVAILABLE; - - static { - String kernelVersion; - try { - kernelVersion = Native.KERNEL_VERSION; - } catch (Throwable e) { - kernelVersion = null; - } - if (kernelVersion != null && kernelVersion.contains("-")) { - int index = kernelVersion.indexOf('-'); - if (index > -1) { - kernelVersion = kernelVersion.substring(0, index); - } - int[] kernelVer = fromString(kernelVersion); - KERNEL_VERSION = Optional.of(kernelVer); - REUSEPORT_AVAILABLE = checkVersion(kernelVer, 0); - } else { - KERNEL_VERSION = Optional.empty(); - REUSEPORT_AVAILABLE = false; - } - } - - public static Optional getKernelVersion() { - return KERNEL_VERSION; - } - - public static boolean isReusePortAvailable() { - return REUSEPORT_AVAILABLE; - } - - public static void setupBootstrap(Bootstrap bootstrap, boolean datagram) { - Class channel = datagram ? CHANNEL_TYPE.datagramChannel : CHANNEL_TYPE.socketChannel; - bootstrap.channel(channel); - - setupAbstractBootstrap(bootstrap); - } - - public static void setupServerBootstrap(ServerBootstrap bootstrap) { - Class channel = CHANNEL_TYPE.serverSocketChannel; - bootstrap.channel(channel); - - setupAbstractBootstrap(bootstrap); - } - - private static void setupAbstractBootstrap(AbstractBootstrap bootstrap) { - if (REUSEPORT_AVAILABLE) { - bootstrap.option(UnixChannelOption.SO_REUSEPORT, true); - } - } - - private static int[] fromString(String ver) { - String[] parts = ver.split("\\."); - if (parts.length < 2) { - throw new IllegalArgumentException("At least 2 version numbers required"); - } - - return new int[]{ - Integer.parseInt(parts[0]), - Integer.parseInt(parts[1]), - parts.length == 2 ? 0 : Integer.parseInt(parts[2]) - }; - } - - private static boolean checkVersion(int[] ver, int i) { - if (ver[i] > REUSEPORT_VERSION[i]) { - return true; - } else if (ver[i] == REUSEPORT_VERSION[i]) { - if (ver.length == (i + 1)) { - return true; - } else { - return checkVersion(ver, i + 1); - } - } - return false; - } - - public static CompletableFuture allOf(ChannelFuture... futures) { - if (futures == null || futures.length == 0) { - return CompletableFuture.completedFuture(null); - } - @SuppressWarnings("unchecked") - CompletableFuture[] completableFutures = new CompletableFuture[futures.length]; - for (int i = 0; i < futures.length; i++) { - ChannelFuture channelFuture = futures[i]; - CompletableFuture completableFuture = new CompletableFuture<>(); - channelFuture.addListener(future -> { - if (future.cause() != null) { - completableFuture.completeExceptionally(future.cause()); - } - completableFuture.complete(channelFuture.channel()); - }); - completableFutures[i] = completableFuture; - } - - return CompletableFuture.allOf(completableFutures); - } -} diff --git a/src/main/java/com/nukkitx/network/util/DisconnectReason.java b/src/main/java/com/nukkitx/network/util/DisconnectReason.java deleted file mode 100644 index 5b9ea6c3b..000000000 --- a/src/main/java/com/nukkitx/network/util/DisconnectReason.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.nukkitx.network.util; - -public enum DisconnectReason { - - CLOSED_BY_REMOTE_PEER, - SHUTTING_DOWN, - DISCONNECTED, - TIMED_OUT, - CONNECTION_REQUEST_FAILED, - ALREADY_CONNECTED, - NO_FREE_INCOMING_CONNECTIONS, - INCOMPATIBLE_PROTOCOL_VERSION, - IP_RECENTLY_CONNECTED, - BAD_PACKET -} diff --git a/src/main/java/com/nukkitx/network/util/EventLoops.java b/src/main/java/com/nukkitx/network/util/EventLoops.java deleted file mode 100644 index 478523c7b..000000000 --- a/src/main/java/com/nukkitx/network/util/EventLoops.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.nukkitx.network.util; - -import io.netty.channel.EventLoopGroup; -import io.netty.channel.epoll.*; -import io.netty.channel.kqueue.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.DatagramChannel; -import io.netty.channel.socket.ServerSocketChannel; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioDatagramChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import lombok.RequiredArgsConstructor; -import lombok.experimental.UtilityClass; - -import java.util.concurrent.ThreadFactory; -import java.util.function.Function; - -@UtilityClass -public final class EventLoops { - - static final ChannelType CHANNEL_TYPE; - static final EventLoopGroup EVENT_LOOP_GROUP; - private static final ThreadFactory EVENT_LOOP_FACTORY = NetworkThreadFactory.builder().format("Network Listener - #%d") - .daemon(true).build(); - - static { - boolean disableNative = System.getProperties().contains("disableNativeEventLoop"); - - if (!disableNative && Epoll.isAvailable()) { - CHANNEL_TYPE = ChannelType.EPOLL; - } else if (!disableNative && KQueue.isAvailable()) { - CHANNEL_TYPE = ChannelType.KQUEUE; - } else { - CHANNEL_TYPE = ChannelType.NIO; - } - EVENT_LOOP_GROUP = CHANNEL_TYPE.eventLoopGroupFactory.apply(0); - } - - public static EventLoopGroup commonGroup() { - return EVENT_LOOP_GROUP; - } - - public static EventLoopGroup newEventLoopGroup(int threads) { - return CHANNEL_TYPE.eventLoopGroupFactory.apply(threads); - } - - public static ChannelType getChannelType() { - return CHANNEL_TYPE; - } - - @RequiredArgsConstructor - public enum ChannelType { - EPOLL(EpollDatagramChannel.class, EpollSocketChannel.class, EpollServerSocketChannel.class, - threads -> new EpollEventLoopGroup(threads, EVENT_LOOP_FACTORY)), - KQUEUE(KQueueDatagramChannel.class, KQueueSocketChannel.class, KQueueServerSocketChannel.class, - threads -> new KQueueEventLoopGroup(threads, EVENT_LOOP_FACTORY)), - NIO(NioDatagramChannel.class, NioSocketChannel.class, NioServerSocketChannel.class, - threads -> new NioEventLoopGroup(threads, EVENT_LOOP_FACTORY)); - - final Class datagramChannel; - final Class socketChannel; - final Class serverSocketChannel; - private final Function eventLoopGroupFactory; - - public Class getDatagramChannel() { - return datagramChannel; - } - - public Class getServerSocketChannel() { - return serverSocketChannel; - } - - public Class getSocketChannel() { - return socketChannel; - } - } -} diff --git a/src/main/java/com/nukkitx/network/util/NetworkThreadFactory.java b/src/main/java/com/nukkitx/network/util/NetworkThreadFactory.java deleted file mode 100644 index 2e8274186..000000000 --- a/src/main/java/com/nukkitx/network/util/NetworkThreadFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.nukkitx.network.util; - -import lombok.Builder; - -import javax.annotation.Nonnull; -import java.util.Locale; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicInteger; - -@Builder -public class NetworkThreadFactory implements ThreadFactory { - - private static final ThreadFactory backingFactory = Executors.defaultThreadFactory(); - - private final AtomicInteger count = new AtomicInteger(0); - private final boolean daemon; - private final String format; - @Builder.Default - private final int priority = Thread.currentThread().getPriority(); - private final Thread.UncaughtExceptionHandler exceptionHandler; - - private static String format(String format, int count) { - return String.format(Locale.ROOT, format, count); - } - - @Override - public Thread newThread(@Nonnull Runnable runnable) { - Thread thread = backingFactory.newThread(runnable); - - if (format != null) { - thread.setName(format(format, count.getAndIncrement())); - } - - thread.setDaemon(daemon); - thread.setPriority(priority); - - if (exceptionHandler != null) { - thread.setUncaughtExceptionHandler(exceptionHandler); - } - return thread; - } -} diff --git a/src/main/java/com/nukkitx/network/util/Preconditions.java b/src/main/java/com/nukkitx/network/util/Preconditions.java deleted file mode 100644 index b633b43ac..000000000 --- a/src/main/java/com/nukkitx/network/util/Preconditions.java +++ /dev/null @@ -1,1422 +0,0 @@ - -/* - * Copyright (C) 2007 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ - -package com.nukkitx.network.util; - -import javax.annotation.Nullable; - -/** - * Static convenience methods that help a method or constructor check whether it was invoked - * correctly (that is, whether its preconditions were met). - * - *

If the precondition is not met, the {@code Preconditions} method throws an unchecked exception - * of a specified type, which helps the method in which the exception was thrown communicate that - * its caller has made a mistake. This allows constructs such as - * - *

{@code
- * public static double sqrt(double value) {
- *   if (value < 0) {
- *     throw new IllegalArgumentException("input is negative: " + value);
- *   }
- *   // calculate square root
- * }
- * }
- * - *

to be replaced with the more compact - * - *

{@code
- * public static double sqrt(double value) {
- *   checkArgument(value >= 0, "input is negative: %s", value);
- *   // calculate square root
- * }
- * }
- * - *

so that a hypothetical bad caller of this method, such as: - * - *

{@code
- *   void exampleBadCaller() {
- *     double d = sqrt(-1.0);
- * }
- * }
- * - *

would be flagged as having called {@code sqrt()} with an illegal argument. - * - *

Performance

- * - *

Avoid passing message arguments that are expensive to compute; your code will always compute - * them, even though they usually won't be needed. If you have such arguments, use the conventional - * if/throw idiom instead. - * - *

Depending on your message arguments, memory may be allocated for boxing and varargs array - * creation. However, the methods of this class have a large number of overloads that prevent such - * allocations in many common cases. - * - *

The message string is not formatted unless the exception will be thrown, so the cost of the - * string formatting itself should not be a concern. - * - *

As with any performance concerns, you should consider profiling your code (in a production - * environment if possible) before spending a lot of effort on tweaking a particular element. - * - *

Other types of preconditions

- * - *

Not every type of precondition failure is supported by these methods. Continue to throw - * standard JDK exceptions such as {@link java.util.NoSuchElementException} or {@link - * UnsupportedOperationException} in the situations they are intended for. - * - *

Non-preconditions

- * - *

It is of course possible to use the methods of this class to check for invalid conditions - * which are not the caller's fault. Doing so is not recommended because it is - * misleading to future readers of the code and of stack traces. See Conditional failures - * explained in the Guava User Guide for more advice. - * - *

{@code java.util.Objects.requireNonNull()}

- * - *

Projects which use {@code com.google.common} should generally avoid the use of {@link - * java.util.Objects#requireNonNull(Object)}. Instead, use whichever of {@link - * #checkNotNull(Object)} is appropriate to the situation. - * (The same goes for the message-accepting overloads.) - * - *

Only {@code %s} is supported

- * - *

In {@code Preconditions} error message template strings, only the {@code "%s"} specifier is - * supported, not the full range of {@link java.util.Formatter} specifiers. - * - *

More information

- * - *

See the Guava User Guide on using {@code - * Preconditions}. - * - * @author Kevin Bourrillion - * @since 2.0 - */ -public final class Preconditions { - - private Preconditions() { - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - * @param expression a boolean expression - * @throws IllegalArgumentException if {@code expression} is false - */ - public static void checkArgument(boolean expression) { - if (!expression) { - throw new IllegalArgumentException(); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - * @param expression a boolean expression - * @param errorMessage the exception message to use if the check fails; will be converted to a - * string using {@link String#valueOf(Object)} - * @throws IllegalArgumentException if {@code expression} is false - */ - public static void checkArgument(boolean expression, @Nullable Object errorMessage) { - if (!expression) { - throw new IllegalArgumentException(String.valueOf(errorMessage)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - * @param expression a boolean expression - * @param errorMessageTemplate a template for the exception message should the check fail. The - * message is formed by replacing each {@code %s} placeholder in the template with an - * argument. These are matched by position - the first {@code %s} gets {@code - * errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in - * square braces. Unmatched placeholders will be left as-is. - * @param errorMessageArgs the arguments to be substituted into the message template. Arguments - * are converted to strings using {@link String#valueOf(Object)}. - * @throws IllegalArgumentException if {@code expression} is false - */ - public static void checkArgument( - boolean expression, - @Nullable String errorMessageTemplate, - @Nullable Object... errorMessageArgs) { - if (!expression) { - throw new IllegalArgumentException(format(errorMessageTemplate, errorMessageArgs)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument(boolean b, @Nullable String errorMessageTemplate, char p1) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument(boolean b, @Nullable String errorMessageTemplate, int p1) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument(boolean b, @Nullable String errorMessageTemplate, long p1) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, char p1, char p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, char p1, int p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, char p1, long p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, char p1, @Nullable Object p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, int p1, char p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, int p1, int p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, int p1, long p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, int p1, @Nullable Object p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, long p1, char p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, long p1, int p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, long p1, long p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, long p1, @Nullable Object p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, char p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, int p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, long p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, @Nullable Object p2) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, - @Nullable String errorMessageTemplate, - @Nullable Object p1, - @Nullable Object p2, - @Nullable Object p3) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2, p3)); - } - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - *

See {@link #checkArgument(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkArgument( - boolean b, - @Nullable String errorMessageTemplate, - @Nullable Object p1, - @Nullable Object p2, - @Nullable Object p3, - @Nullable Object p4) { - if (!b) { - throw new IllegalArgumentException(format(errorMessageTemplate, p1, p2, p3, p4)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - * @param expression a boolean expression - * @throws IllegalStateException if {@code expression} is false - */ - public static void checkState(boolean expression) { - if (!expression) { - throw new IllegalStateException(); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - * @param expression a boolean expression - * @param errorMessage the exception message to use if the check fails; will be converted to a - * string using {@link String#valueOf(Object)} - * @throws IllegalStateException if {@code expression} is false - */ - public static void checkState(boolean expression, @Nullable Object errorMessage) { - if (!expression) { - throw new IllegalStateException(String.valueOf(errorMessage)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - * @param expression a boolean expression - * @param errorMessageTemplate a template for the exception message should the check fail. The - * message is formed by replacing each {@code %s} placeholder in the template with an - * argument. These are matched by position - the first {@code %s} gets {@code - * errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in - * square braces. Unmatched placeholders will be left as-is. - * @param errorMessageArgs the arguments to be substituted into the message template. Arguments - * are converted to strings using {@link String#valueOf(Object)}. - * @throws IllegalStateException if {@code expression} is false - */ - public static void checkState( - boolean expression, - @Nullable String errorMessageTemplate, - @Nullable Object... errorMessageArgs) { - if (!expression) { - throw new IllegalStateException(format(errorMessageTemplate, errorMessageArgs)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState(boolean b, @Nullable String errorMessageTemplate, char p1) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState(boolean b, @Nullable String errorMessageTemplate, int p1) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState(boolean b, @Nullable String errorMessageTemplate, long p1) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, char p1, char p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState(boolean b, @Nullable String errorMessageTemplate, char p1, int p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, char p1, long p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, char p1, @Nullable Object p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState(boolean b, @Nullable String errorMessageTemplate, int p1, char p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState(boolean b, @Nullable String errorMessageTemplate, int p1, int p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState(boolean b, @Nullable String errorMessageTemplate, int p1, long p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, int p1, @Nullable Object p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, long p1, char p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState(boolean b, @Nullable String errorMessageTemplate, long p1, int p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, long p1, long p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, long p1, @Nullable Object p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, char p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, int p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, long p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, @Nullable Object p2) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, - @Nullable String errorMessageTemplate, - @Nullable Object p1, - @Nullable Object p2, - @Nullable Object p3) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2, p3)); - } - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - *

See {@link #checkState(boolean, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static void checkState( - boolean b, - @Nullable String errorMessageTemplate, - @Nullable Object p1, - @Nullable Object p2, - @Nullable Object p3, - @Nullable Object p4) { - if (!b) { - throw new IllegalStateException(format(errorMessageTemplate, p1, p2, p3, p4)); - } - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - * @param reference an object reference - * @return the non-null reference that was validated - * @throws NullPointerException if {@code reference} is null - */ - public static T checkNotNull(T reference) { - if (reference == null) { - throw new NullPointerException(); - } - return reference; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - * @param reference an object reference - * @param errorMessage the exception message to use if the check fails; will be converted to a - * string using {@link String#valueOf(Object)} - * @return the non-null reference that was validated - * @throws NullPointerException if {@code reference} is null - */ - public static T checkNotNull(T reference, @Nullable Object errorMessage) { - if (reference == null) { - throw new NullPointerException(String.valueOf(errorMessage)); - } - return reference; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - * @param reference an object reference - * @param errorMessageTemplate a template for the exception message should the check fail. The - * message is formed by replacing each {@code %s} placeholder in the template with an - * argument. These are matched by position - the first {@code %s} gets {@code - * errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in - * square braces. Unmatched placeholders will be left as-is. - * @param errorMessageArgs the arguments to be substituted into the message template. Arguments - * are converted to strings using {@link String#valueOf(Object)}. - * @return the non-null reference that was validated - * @throws NullPointerException if {@code reference} is null - */ - public static T checkNotNull( - T reference, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs) { - if (reference == null) { - throw new NullPointerException(format(errorMessageTemplate, errorMessageArgs)); - } - return reference; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, char p1) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, int p1) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, long p1) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, @Nullable String errorMessageTemplate, @Nullable Object p1) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, char p1, char p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, char p1, int p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, char p1, long p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, @Nullable String errorMessageTemplate, char p1, @Nullable Object p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, int p1, char p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, int p1, int p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, int p1, long p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, @Nullable String errorMessageTemplate, int p1, @Nullable Object p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, long p1, char p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, long p1, int p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull(T obj, @Nullable String errorMessageTemplate, long p1, long p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, @Nullable String errorMessageTemplate, long p1, @Nullable Object p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, @Nullable String errorMessageTemplate, @Nullable Object p1, char p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, @Nullable String errorMessageTemplate, @Nullable Object p1, int p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, @Nullable String errorMessageTemplate, @Nullable Object p1, long p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, @Nullable String errorMessageTemplate, @Nullable Object p1, @Nullable Object p2) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, - @Nullable String errorMessageTemplate, - @Nullable Object p1, - @Nullable Object p2, - @Nullable Object p3) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2, p3)); - } - return obj; - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - *

See {@link #checkNotNull(Object, String, Object...)} for details. - * - * @since 20.0 (varargs overload since 2.0) - */ - public static T checkNotNull( - T obj, - @Nullable String errorMessageTemplate, - @Nullable Object p1, - @Nullable Object p2, - @Nullable Object p3, - @Nullable Object p4) { - if (obj == null) { - throw new NullPointerException(format(errorMessageTemplate, p1, p2, p3, p4)); - } - return obj; - } - - /* - * All recent hotspots (as of 2009) *really* like to have the natural code - * - * if (guardExpression) { - * throw new BadException(messageExpression); - * } - * - * refactored so that messageExpression is moved to a separate String-returning method. - * - * if (guardExpression) { - * throw new BadException(badMsg(...)); - * } - * - * The alternative natural refactorings into void or Exception-returning methods are much slower. - * This is a big deal - we're talking factors of 2-8 in microbenchmarks, not just 10-20%. (This is - * a hotspot optimizer bug, which should be fixed, but that's a separate, big project). - * - * The coding pattern above is heavily used in java.util, e.g. in ArrayList. There is a - * RangeCheckMicroBenchmark in the JDK that was used to test this. - * - * But the methods in this class want to throw different exceptions, depending on the args, so it - * appears that this pattern is not directly applicable. But we can use the ridiculous, devious - * trick of throwing an exception in the middle of the construction of another exception. Hotspot - * is fine with that. - */ - - /** - * Ensures that {@code index} specifies a valid element in an array, list or string of size - * {@code size}. An element index may range from zero, inclusive, to {@code size}, exclusive. - * - * @param index a user-supplied index identifying an element of an array, list or string - * @param size the size of that array, list or string - * @return the value of {@code index} - * @throws IndexOutOfBoundsException if {@code index} is negative or is not less than {@code size} - * @throws IllegalArgumentException if {@code size} is negative - */ - public static int checkElementIndex(int index, int size) { - return checkElementIndex(index, size, "index"); - } - - /** - * Ensures that {@code index} specifies a valid element in an array, list or string of size - * {@code size}. An element index may range from zero, inclusive, to {@code size}, exclusive. - * - * @param index a user-supplied index identifying an element of an array, list or string - * @param size the size of that array, list or string - * @param desc the text to use to describe this index in an error message - * @return the value of {@code index} - * @throws IndexOutOfBoundsException if {@code index} is negative or is not less than {@code size} - * @throws IllegalArgumentException if {@code size} is negative - */ - public static int checkElementIndex(int index, int size, @Nullable String desc) { - // Carefully optimized for execution by hotspot (explanatory comment above) - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(badElementIndex(index, size, desc)); - } - return index; - } - - private static String badElementIndex(int index, int size, @Nullable String desc) { - if (index < 0) { - return format("%s (%s) must not be negative", desc, index); - } else if (size < 0) { - throw new IllegalArgumentException("negative size: " + size); - } else { // index >= size - return format("%s (%s) must be less than size (%s)", desc, index, size); - } - } - - /** - * Ensures that {@code index} specifies a valid position in an array, list or string of - * size {@code size}. A position index may range from zero to {@code size}, inclusive. - * - * @param index a user-supplied index identifying a position in an array, list or string - * @param size the size of that array, list or string - * @return the value of {@code index} - * @throws IndexOutOfBoundsException if {@code index} is negative or is greater than {@code size} - * @throws IllegalArgumentException if {@code size} is negative - */ - public static int checkPositionIndex(int index, int size) { - return checkPositionIndex(index, size, "index"); - } - - /** - * Ensures that {@code index} specifies a valid position in an array, list or string of - * size {@code size}. A position index may range from zero to {@code size}, inclusive. - * - * @param index a user-supplied index identifying a position in an array, list or string - * @param size the size of that array, list or string - * @param desc the text to use to describe this index in an error message - * @return the value of {@code index} - * @throws IndexOutOfBoundsException if {@code index} is negative or is greater than {@code size} - * @throws IllegalArgumentException if {@code size} is negative - */ - public static int checkPositionIndex(int index, int size, @Nullable String desc) { - // Carefully optimized for execution by hotspot (explanatory comment above) - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(badPositionIndex(index, size, desc)); - } - return index; - } - - private static String badPositionIndex(int index, int size, @Nullable String desc) { - if (index < 0) { - return format("%s (%s) must not be negative", desc, index); - } else if (size < 0) { - throw new IllegalArgumentException("negative size: " + size); - } else { // index > size - return format("%s (%s) must not be greater than size (%s)", desc, index, size); - } - } - - /** - * Ensures that {@code start} and {@code end} specify a valid positions in an array, list - * or string of size {@code size}, and are in order. A position index may range from zero to - * {@code size}, inclusive. - * - * @param start a user-supplied index identifying a starting position in an array, list or string - * @param end a user-supplied index identifying a ending position in an array, list or string - * @param size the size of that array, list or string - * @throws IndexOutOfBoundsException if either index is negative or is greater than {@code size}, - * or if {@code end} is less than {@code start} - * @throws IllegalArgumentException if {@code size} is negative - */ - public static void checkPositionIndexes(int start, int end, int size) { - // Carefully optimized for execution by hotspot (explanatory comment above) - if (start < 0 || end < start || end > size) { - throw new IndexOutOfBoundsException(badPositionIndexes(start, end, size)); - } - } - - private static String badPositionIndexes(int start, int end, int size) { - if (start < 0 || start > size) { - return badPositionIndex(start, size, "start index"); - } - if (end < 0 || end > size) { - return badPositionIndex(end, size, "end index"); - } - // end < start - return format("end index (%s) must not be less than start index (%s)", end, start); - } - - /** - * Substitutes each {@code %s} in {@code template} with an argument. These are matched by - * position: the first {@code %s} gets {@code args[0]}, etc. If there are more arguments than - * placeholders, the unmatched arguments will be appended to the end of the formatted message in - * square braces. - * - * @param template a string containing 0 or more {@code %s} placeholders. null is treated as - * "null". - * @param args the arguments to be substituted into the message template. Arguments are converted - * to strings using {@link String#valueOf(Object)}. Arguments can be null. - */ - // Note that this is somewhat-improperly used from Verify.java as well. - static String format(@Nullable String template, @Nullable Object... args) { - template = String.valueOf(template); // null -> "null" - - args = args == null ? new Object[]{"(Object[])null"} : args; - - // start substituting the arguments into the '%s' placeholders - StringBuilder builder = new StringBuilder(template.length() + 16 * args.length); - int templateStart = 0; - int i = 0; - while (i < args.length) { - int placeholderStart = template.indexOf("%s", templateStart); - if (placeholderStart == -1) { - break; - } - builder.append(template, templateStart, placeholderStart); - builder.append(args[i++]); - templateStart = placeholderStart + 2; - } - builder.append(template, templateStart, template.length()); - - // if we run out of placeholders, append the extra args in square braces - if (i < args.length) { - builder.append(" ["); - builder.append(args[i++]); - while (i < args.length) { - builder.append(", "); - builder.append(args[i++]); - } - builder.append(']'); - } - - return builder.toString(); - } -} diff --git a/src/main/resources/biome_definitions_361.dat b/src/main/resources/biome_definitions_361.dat deleted file mode 100644 index f45b76b3eb201a293a66c02a791bce1b28b4cb33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3413 zcmb7HU2>Z+5Y|KNwAjv%olM*GrFZailOCXV(8#a^8i70##7&=afLr# zpLZ+>c0y-dg&=Yi%NXm#x-S-7m@<#0+JWXmONNPO3I!^5_8rOK|jXFmFJ$ovx zHX_?7#T&o-S=MXc?XzQ$Y@>OQK4S}QWofweRIePAk%E>!5|$$VsYm=s{dxj8#Ug+$ zA7R(Yu(9^-7;O?6MSoh?1W~7|v1)4Pnv=X7A954b+O{#GP9H&|6xOz$5vK#^+I*Ah zFlk;3bnENOmyY+`7YkOE^dqOmN3#=|ZMWV)bgbHDuoUe5L3RJIa$Q!jqq=h?ZFh!G zeAJ=E|E7!IJPXvGNKstX`Wd?E>fg-lp>OsTIy>~#S@WDw@zel3apMy4prU3SOQT>+ zy0P-8*)<)yWN3(XN=421rTO^e3UAQ}+7pN{6}vzMMB!B7CL0i8(huv*(?hlDEYQyY z3a2);8ZdeF_jXj*)_LDsD8Uc=za1==ubu5*aeG!0k{w4a3ls9y^Kwk<*@lQx#h=wp KNHXm=33~$oSb2y5 diff --git a/src/main/resources/creativeitems137.json b/src/main/resources/creativeitems137.json deleted file mode 100644 index af1ee716f..000000000 --- a/src/main/resources/creativeitems137.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":108},{"id":109},{"id":114},{"id":128},{"id":180},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":4},{"id":44,"damage":5},{"id":44,"damage":7},{"id":44,"damage":1},{"id":182},{"id":44,"damage":6},{"id":182,"damage":1},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":112},{"id":215},{"id":4},{"id":48},{"id":406},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":173},{"id":152},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":214},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":86},{"id":91},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":4},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351,"damage":15},{"id":351,"damage":3},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":15},{"id":383,"damage":44},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1},{"id":367},{"id":352},{"id":30},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":444},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":261},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":346},{"id":398},{"id":332},{"id":359},{"id":259},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":76},{"id":123},{"id":169},{"id":89},{"id":348},{"id":323},{"id":321},{"id":389},{"id":390},{"id":281},{"id":425},{"id":58},{"id":61},{"id":379},{"id":380},{"id":145},{"id":145,"damage":1},{"id":145,"damage":2},{"id":245},{"id":54},{"id":146},{"id":130},{"id":205,"damage":16},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":47},{"id":116},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":151},{"id":120},{"id":287},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":452},{"id":371},{"id":385},{"id":377},{"id":369},{"id":378},{"id":375},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":395},{"id":395,"damage":2},{"id":386},{"id":340},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":251},{"id":356},{"id":404},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":331},{"id":263},{"id":263,"damage":1},{"id":264},{"id":265},{"id":266},{"id":388},{"id":336},{"id":405},{"id":337},{"id":409},{"id":422},{"id":46},{"id":420},{"id":421},{"id":347},{"id":345},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"},{"id":402,"c":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems274.json b/src/main/resources/creativeitems274.json deleted file mode 100644 index a79c63a2a..000000000 --- a/src/main/resources/creativeitems274.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":108},{"id":109},{"id":114},{"id":128},{"id":180},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":4},{"id":44,"damage":5},{"id":44,"damage":7},{"id":44,"damage":1},{"id":182},{"id":44,"damage":6},{"id":182,"damage":1},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":112},{"id":215},{"id":4},{"id":48},{"id":406},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":173},{"id":152},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":214},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":86},{"id":91},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":4},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351,"damage":15},{"id":351,"damage":3},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":464},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":15},{"id":383,"damage":44},{"id":383,"damage":108},{"id":383,"damage":109},{"id":383,"damage":110},{"id":383,"damage":111},{"id":383,"damage":112},{"id":383,"damage":31},{"id":383,"damage":74},{"id":383,"damage":58},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1},{"id":367},{"id":352},{"id":30},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":444},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":261},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":346},{"id":398},{"id":332},{"id":359},{"id":259},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":76},{"id":123},{"id":169},{"id":89},{"id":348},{"id":323},{"id":321},{"id":389},{"id":390},{"id":281},{"id":425},{"id":58},{"id":61},{"id":379},{"id":380},{"id":145},{"id":145,"damage":1},{"id":145,"damage":2},{"id":245},{"id":54},{"id":146},{"id":130},{"id":205,"damage":16},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":47},{"id":116},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":151},{"id":120},{"id":287},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":452},{"id":371},{"id":385},{"id":377},{"id":369},{"id":378},{"id":375},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":395},{"id":395,"damage":2},{"id":386},{"id":340},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":251},{"id":356},{"id":404},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":331},{"id":263},{"id":263,"damage":1},{"id":264},{"id":265},{"id":266},{"id":388},{"id":336},{"id":405},{"id":337},{"id":409},{"id":422},{"id":46},{"id":420},{"id":421},{"id":347},{"id":345},{"id":455},{"id":469},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems291.json b/src/main/resources/creativeitems291.json deleted file mode 100644 index ebf7354a5..000000000 --- a/src/main/resources/creativeitems291.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":108},{"id":109},{"id":114},{"id":128},{"id":180},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":4},{"id":44,"damage":5},{"id":44,"damage":7},{"id":44,"damage":1},{"id":182},{"id":44,"damage":6},{"id":182,"damage":1},{"id":182,"damage":2},{"id":182,"damage":3},{"id":182,"damage":4},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":4},{"id":48},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":173},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":214},{"id":112},{"id":215},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":86},{"id":91},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":335},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":4},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351,"damage":15},{"id":351,"damage":3},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":367},{"id":352},{"id":30},{"id":375},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":111},{"id":383,"damage":112},{"id":383,"damage":108},{"id":383,"damage":109},{"id":383,"damage":31},{"id":383,"damage":74},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":110},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":15},{"id":383,"damage":44},{"id":383,"damage":58},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":261},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":262,"damage":38},{"id":262,"damage":39},{"id":262,"damage":40},{"id":262,"damage":41},{"id":262,"damage":42},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":464},{"id":346},{"id":398},{"id":332},{"id":359},{"id":259},{"id":420},{"id":347},{"id":345},{"id":395},{"id":395,"damage":2},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":455},{"id":469},{"id":444},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":373,"damage":37},{"id":373,"damage":38},{"id":373,"damage":39},{"id":373,"damage":40},{"id":373,"damage":41},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":438,"damage":37},{"id":438,"damage":38},{"id":438,"damage":39},{"id":438,"damage":40},{"id":438,"damage":41},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":441,"damage":37},{"id":441,"damage":38},{"id":441,"damage":39},{"id":441,"damage":40},{"id":441,"damage":41},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":58},{"id":61},{"id":379},{"id":145},{"id":145,"damage":4},{"id":145,"damage":8},{"id":116},{"id":47},{"id":380},{"id":54},{"id":146},{"id":130},{"id":205,"damage":16},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":425},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":348},{"id":89},{"id":123},{"id":169},{"id":323},{"id":321},{"id":389},{"id":390},{"id":281},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":325,"damage":2},{"id":325,"damage":3},{"id":325,"damage":4},{"id":325,"damage":5},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":245},{"id":120},{"id":263},{"id":263,"damage":1},{"id":264},{"id":452},{"id":265},{"id":371},{"id":266},{"id":388},{"id":406},{"id":337},{"id":336},{"id":405},{"id":409},{"id":422},{"id":465},{"id":467},{"id":468},{"id":470},{"id":287},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":385},{"id":369},{"id":377},{"id":378},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":340},{"id":386},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696420000203006c766c01000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":331},{"id":152},{"id":76},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":251},{"id":151},{"id":356},{"id":404},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":46},{"id":421},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems313.json b/src/main/resources/creativeitems313.json deleted file mode 100644 index e2767098e..000000000 --- a/src/main/resources/creativeitems313.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":108},{"id":109},{"id":114},{"id":128},{"id":180},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":4},{"id":44,"damage":5},{"id":44,"damage":7},{"id":44,"damage":1},{"id":182},{"id":44,"damage":6},{"id":182,"damage":1},{"id":182,"damage":2},{"id":182,"damage":3},{"id":182,"damage":4},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":4},{"id":48},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":173},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":214},{"id":112},{"id":215},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":86},{"id":91},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":335},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":19},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351,"damage":16},{"id":351,"damage":17},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":18},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351},{"id":351,"damage":3},{"id":351,"damage":4},{"id":351,"damage":15},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":367},{"id":352},{"id":30},{"id":375},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":75},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":111},{"id":383,"damage":112},{"id":383,"damage":108},{"id":383,"damage":109},{"id":383,"damage":31},{"id":383,"damage":74},{"id":383,"damage":113},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":110},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":15},{"id":383,"damage":44},{"id":383,"damage":58},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":261},{"id":471},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":262,"damage":38},{"id":262,"damage":39},{"id":262,"damage":40},{"id":262,"damage":41},{"id":262,"damage":42},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":464},{"id":346},{"id":398},{"id":332},{"id":359},{"id":259},{"id":420},{"id":347},{"id":345},{"id":395},{"id":395,"damage":2},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":455},{"id":469},{"id":444},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":373,"damage":37},{"id":373,"damage":38},{"id":373,"damage":39},{"id":373,"damage":40},{"id":373,"damage":41},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":438,"damage":37},{"id":438,"damage":38},{"id":438,"damage":39},{"id":438,"damage":40},{"id":438,"damage":41},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":441,"damage":37},{"id":441,"damage":38},{"id":441,"damage":39},{"id":441,"damage":40},{"id":441,"damage":41},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":58},{"id":61},{"id":379},{"id":145},{"id":145,"damage":4},{"id":145,"damage":8},{"id":116},{"id":47},{"id":380},{"id":54},{"id":146},{"id":130},{"id":205},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":425},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":348},{"id":89},{"id":123},{"id":169},{"id":323},{"id":321},{"id":389},{"id":390},{"id":281},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":325,"damage":2},{"id":325,"damage":3},{"id":325,"damage":4},{"id":325,"damage":5},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":245},{"id":120},{"id":263},{"id":263,"damage":1},{"id":264},{"id":452},{"id":265},{"id":371},{"id":266},{"id":388},{"id":406},{"id":337},{"id":336},{"id":405},{"id":409},{"id":422},{"id":465},{"id":467},{"id":468},{"id":470},{"id":287},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":385},{"id":369},{"id":377},{"id":378},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":340},{"id":386},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696420000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696421000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c03000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":331},{"id":152},{"id":76},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":251},{"id":151},{"id":356},{"id":404},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":46},{"id":421},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"},{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"},{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"},{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"},{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"},{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"},{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"},{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"},{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"},{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"},{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"},{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"},{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"},{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"},{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"},{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems332.json b/src/main/resources/creativeitems332.json deleted file mode 100644 index 794cb1f6a..000000000 --- a/src/main/resources/creativeitems332.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":139,"damage":2},{"id":139,"damage":3},{"id":139,"damage":4},{"id":139,"damage":5},{"id":139,"damage":12},{"id":139,"damage":7},{"id":139,"damage":8},{"id":139,"damage":6},{"id":139,"damage":9},{"id":139,"damage":13},{"id":139,"damage":10},{"id":139,"damage":11},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":109},{"id":128},{"id":180},{"id":108},{"id":114},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":182,"damage":5},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":5},{"id":44,"damage":1},{"id":182,"damage":6},{"id":182},{"id":44,"damage":4},{"id":44,"damage":7},{"id":182,"damage":7},{"id":44,"damage":6},{"id":182,"damage":1},{"id":182,"damage":2},{"id":182,"damage":3},{"id":182,"damage":4},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":4},{"id":48},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":24,"damage":3},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":179,"damage":3},{"id":173},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":155,"damage":3},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":214},{"id":112},{"id":215},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":86},{"id":91},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":335},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":38,"damage":9},{"id":38,"damage":10},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":19},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351,"damage":16},{"id":351,"damage":17},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":18},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351},{"id":351,"damage":3},{"id":351,"damage":4},{"id":351,"damage":15},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":367},{"id":352},{"id":30},{"id":375},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":75},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":111},{"id":383,"damage":112},{"id":383,"damage":108},{"id":383,"damage":109},{"id":383,"damage":31},{"id":383,"damage":74},{"id":383,"damage":113},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":110},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":15},{"id":383,"damage":44},{"id":383,"damage":58},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":261},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":262,"damage":38},{"id":262,"damage":39},{"id":262,"damage":40},{"id":262,"damage":41},{"id":262,"damage":42},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":464},{"id":346},{"id":398},{"id":332},{"id":359},{"id":259},{"id":420},{"id":347},{"id":345},{"id":395},{"id":395,"damage":2},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":455},{"id":469},{"id":444},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":373,"damage":37},{"id":373,"damage":38},{"id":373,"damage":39},{"id":373,"damage":40},{"id":373,"damage":41},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":438,"damage":37},{"id":438,"damage":38},{"id":438,"damage":39},{"id":438,"damage":40},{"id":438,"damage":41},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":441,"damage":37},{"id":441,"damage":38},{"id":441,"damage":39},{"id":441,"damage":40},{"id":441,"damage":41},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":58},{"id":61},{"id":379},{"id":145},{"id":145,"damage":4},{"id":145,"damage":8},{"id":116},{"id":47},{"id":380},{"id":54},{"id":146},{"id":130},{"id":205},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":425},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":348},{"id":89},{"id":123},{"id":169},{"id":323},{"id":321},{"id":389},{"id":390},{"id":281},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":325,"damage":2},{"id":325,"damage":3},{"id":325,"damage":4},{"id":325,"damage":5},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":245},{"id":120},{"id":263},{"id":263,"damage":1},{"id":264},{"id":452},{"id":265},{"id":371},{"id":266},{"id":388},{"id":406},{"id":337},{"id":336},{"id":405},{"id":409},{"id":422},{"id":465},{"id":467},{"id":468},{"id":470},{"id":287},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":385},{"id":369},{"id":377},{"id":378},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":340},{"id":386},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696420000203006c766c01000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":331},{"id":152},{"id":76},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":251},{"id":151},{"id":356},{"id":404},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":46},{"id":421},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"},{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"},{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"},{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"},{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"},{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"},{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"},{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"},{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"},{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"},{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"},{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"},{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"},{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"},{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"},{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems340.json b/src/main/resources/creativeitems340.json deleted file mode 100644 index 2fde737a8..000000000 --- a/src/main/resources/creativeitems340.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":139,"damage":2},{"id":139,"damage":3},{"id":139,"damage":4},{"id":139,"damage":5},{"id":139,"damage":12},{"id":139,"damage":7},{"id":139,"damage":8},{"id":139,"damage":6},{"id":139,"damage":9},{"id":139,"damage":13},{"id":139,"damage":10},{"id":139,"damage":11},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":109},{"id":128},{"id":180},{"id":108},{"id":114},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":182,"damage":5},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":5},{"id":44,"damage":1},{"id":182,"damage":6},{"id":182},{"id":44,"damage":4},{"id":44,"damage":7},{"id":182,"damage":7},{"id":44,"damage":6},{"id":182,"damage":1},{"id":182,"damage":2},{"id":182,"damage":3},{"id":182,"damage":4},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":4},{"id":48},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":24,"damage":3},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":179,"damage":3},{"id":173},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":155,"damage":3},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":214},{"id":112},{"id":215},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":86},{"id":91},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":335},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":38,"damage":9},{"id":38,"damage":10},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":19},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351,"damage":16},{"id":351,"damage":17},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":18},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351},{"id":351,"damage":3},{"id":351,"damage":4},{"id":351,"damage":15},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":367},{"id":352},{"id":30},{"id":375},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":75},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":111},{"id":383,"damage":112},{"id":383,"damage":108},{"id":383,"damage":109},{"id":383,"damage":31},{"id":383,"damage":74},{"id":383,"damage":113},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":110},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":15},{"id":383,"damage":44},{"id":383,"damage":58},{"id":383,"damage":114},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":261},{"id":471},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":262,"damage":38},{"id":262,"damage":39},{"id":262,"damage":40},{"id":262,"damage":41},{"id":262,"damage":42},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":464},{"id":346},{"id":398},{"id":332},{"id":359},{"id":259},{"id":420},{"id":347},{"id":345},{"id":395},{"id":395,"damage":2},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":455},{"id":469},{"id":444},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":373,"damage":37},{"id":373,"damage":38},{"id":373,"damage":39},{"id":373,"damage":40},{"id":373,"damage":41},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":438,"damage":37},{"id":438,"damage":38},{"id":438,"damage":39},{"id":438,"damage":40},{"id":438,"damage":41},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":441,"damage":37},{"id":441,"damage":38},{"id":441,"damage":39},{"id":441,"damage":40},{"id":441,"damage":41},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":58},{"id":61},{"id":379},{"id":145},{"id":145,"damage":4},{"id":145,"damage":8},{"id":116},{"id":47},{"id":380},{"id":54},{"id":146},{"id":130},{"id":205},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":425},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":348},{"id":89},{"id":123},{"id":169},{"id":323},{"id":321},{"id":389},{"id":390},{"id":281},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":325,"damage":2},{"id":325,"damage":3},{"id":325,"damage":4},{"id":325,"damage":5},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":245},{"id":120},{"id":263},{"id":263,"damage":1},{"id":264},{"id":452},{"id":265},{"id":371},{"id":266},{"id":388},{"id":406},{"id":337},{"id":336},{"id":405},{"id":409},{"id":422},{"id":465},{"id":467},{"id":468},{"id":470},{"id":287},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":385},{"id":369},{"id":377},{"id":378},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":340},{"id":386},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696420000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696421000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c03000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":331},{"id":152},{"id":76},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":251},{"id":151},{"id":356},{"id":404},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":46},{"id":421},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":434},{"id":434,"damage":1},{"id":434,"damage":2},{"id":434,"damage":3},{"id":434,"damage":4},{"id":434,"damage":5},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"},{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"},{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"},{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"},{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"},{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"},{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"},{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"},{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"},{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"},{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"},{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"},{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"},{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"},{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"},{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems354.json b/src/main/resources/creativeitems354.json deleted file mode 100644 index 3127d49d5..000000000 --- a/src/main/resources/creativeitems354.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":139,"damage":2},{"id":139,"damage":3},{"id":139,"damage":4},{"id":139,"damage":5},{"id":139,"damage":12},{"id":139,"damage":7},{"id":139,"damage":8},{"id":139,"damage":6},{"id":139,"damage":9},{"id":139,"damage":13},{"id":139,"damage":10},{"id":139,"damage":11},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":109},{"id":128},{"id":180},{"id":108},{"id":114},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":182,"damage":5},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":5},{"id":44,"damage":1},{"id":182,"damage":6},{"id":182},{"id":44,"damage":4},{"id":44,"damage":7},{"id":182,"damage":7},{"id":44,"damage":6},{"id":182,"damage":1},{"id":182,"damage":2},{"id":182,"damage":3},{"id":182,"damage":4},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":4},{"id":48},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":24,"damage":3},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":179,"damage":3},{"id":173},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":155,"damage":3},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":214},{"id":112},{"id":215},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":477},{"id":86},{"id":91},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":335},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":38,"damage":9},{"id":38,"damage":10},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":19},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351,"damage":16},{"id":351,"damage":17},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":18},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351},{"id":351,"damage":3},{"id":351,"damage":4},{"id":351,"damage":15},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":367},{"id":352},{"id":30},{"id":375},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":75},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":111},{"id":383,"damage":112},{"id":383,"damage":108},{"id":383,"damage":109},{"id":383,"damage":31},{"id":383,"damage":74},{"id":383,"damage":113},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":110},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":115},{"id":383,"damage":118},{"id":383,"damage":116},{"id":383,"damage":58},{"id":383,"damage":114},{"id":383,"damage":59},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":261},{"id":471},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":262,"damage":38},{"id":262,"damage":39},{"id":262,"damage":40},{"id":262,"damage":41},{"id":262,"damage":42},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":464},{"id":346},{"id":398},{"id":332},{"id":359},{"id":259},{"id":420},{"id":347},{"id":345},{"id":395},{"id":395,"damage":2},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":455},{"id":469},{"id":444},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":373,"damage":37},{"id":373,"damage":38},{"id":373,"damage":39},{"id":373,"damage":40},{"id":373,"damage":41},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":438,"damage":37},{"id":438,"damage":38},{"id":438,"damage":39},{"id":438,"damage":40},{"id":438,"damage":41},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":441,"damage":37},{"id":441,"damage":38},{"id":441,"damage":39},{"id":441,"damage":40},{"id":441,"damage":41},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":58},{"id":61},{"id":379},{"id":145},{"id":145,"damage":4},{"id":145,"damage":8},{"id":116},{"id":47},{"id":380},{"id":54},{"id":146},{"id":130},{"id":205},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":425},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":348},{"id":89},{"id":123},{"id":169},{"id":323},{"id":321},{"id":389},{"id":390},{"id":281},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":325,"damage":2},{"id":325,"damage":3},{"id":325,"damage":4},{"id":325,"damage":5},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":245},{"id":120},{"id":263},{"id":263,"damage":1},{"id":264},{"id":452},{"id":265},{"id":371},{"id":266},{"id":388},{"id":406},{"id":337},{"id":336},{"id":405},{"id":409},{"id":422},{"id":465},{"id":467},{"id":468},{"id":470},{"id":287},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":385},{"id":369},{"id":377},{"id":378},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":340},{"id":386},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696420000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696421000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c03000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":331},{"id":152},{"id":76},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":251},{"id":151},{"id":356},{"id":404},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":46},{"id":421},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":446,"damage":15,"nbt_hex":"0a0000030400547970650100000000"},{"id":434},{"id":434,"damage":1},{"id":434,"damage":2},{"id":434,"damage":3},{"id":434,"damage":4},{"id":434,"damage":5},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"},{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"},{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"},{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"},{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"},{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"},{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"},{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"},{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"},{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"},{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"},{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"},{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"},{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"},{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"},{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems389.json b/src/main/resources/creativeitems389.json deleted file mode 100644 index 9b69b465e..000000000 --- a/src/main/resources/creativeitems389.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":139,"damage":2},{"id":139,"damage":3},{"id":139,"damage":4},{"id":139,"damage":5},{"id":139,"damage":12},{"id":139,"damage":7},{"id":139,"damage":8},{"id":139,"damage":6},{"id":139,"damage":9},{"id":139,"damage":13},{"id":139,"damage":10},{"id":139,"damage":11},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":109},{"id":128},{"id":180},{"id":108},{"id":114},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":182,"damage":5},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":5},{"id":44,"damage":1},{"id":182,"damage":6},{"id":182},{"id":44,"damage":4},{"id":44,"damage":7},{"id":182,"damage":7},{"id":44,"damage":6},{"id":182,"damage":1},{"id":182,"damage":2},{"id":182,"damage":3},{"id":182,"damage":4},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":4},{"id":48},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":24,"damage":3},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":179,"damage":3},{"id":173},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":155,"damage":3},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":214},{"id":112},{"id":215},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":477},{"id":86},{"id":91},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":335},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":38,"damage":9},{"id":38,"damage":10},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":19},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351,"damage":16},{"id":351,"damage":17},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":18},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351},{"id":351,"damage":3},{"id":351,"damage":4},{"id":351,"damage":15},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":367},{"id":352},{"id":30},{"id":375},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":75},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":111},{"id":383,"damage":112},{"id":383,"damage":108},{"id":383,"damage":109},{"id":383,"damage":31},{"id":383,"damage":74},{"id":383,"damage":113},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":110},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":115},{"id":383,"damage":118},{"id":383,"damage":116},{"id":383,"damage":58},{"id":383,"damage":114},{"id":383,"damage":59},{"id":383,"damage":121},{"id":383,"damage":122},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":261},{"id":471},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":262,"damage":38},{"id":262,"damage":39},{"id":262,"damage":40},{"id":262,"damage":41},{"id":262,"damage":42},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":464},{"id":346},{"id":398},{"id":332},{"id":359},{"id":259},{"id":420},{"id":347},{"id":345},{"id":395},{"id":395,"damage":2},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":455},{"id":469},{"id":444},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":373,"damage":37},{"id":373,"damage":38},{"id":373,"damage":39},{"id":373,"damage":40},{"id":373,"damage":41},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":438,"damage":37},{"id":438,"damage":38},{"id":438,"damage":39},{"id":438,"damage":40},{"id":438,"damage":41},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":441,"damage":37},{"id":441,"damage":38},{"id":441,"damage":39},{"id":441,"damage":40},{"id":441,"damage":41},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":58},{"id":61},{"id":379},{"id":145},{"id":145,"damage":4},{"id":145,"damage":8},{"id":116},{"id":47},{"id":380},{"id":54},{"id":146},{"id":130},{"id":205},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":425},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":348},{"id":89},{"id":123},{"id":169},{"id":323},{"id":321},{"id":389},{"id":390},{"id":281},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":325,"damage":2},{"id":325,"damage":3},{"id":325,"damage":4},{"id":325,"damage":5},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":245},{"id":120},{"id":263},{"id":263,"damage":1},{"id":264},{"id":452},{"id":265},{"id":371},{"id":266},{"id":388},{"id":406},{"id":337},{"id":336},{"id":405},{"id":409},{"id":422},{"id":465},{"id":467},{"id":468},{"id":470},{"id":287},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":385},{"id":369},{"id":377},{"id":378},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":340},{"id":386},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696420000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696421000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c03000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":331},{"id":152},{"id":76},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":251},{"id":151},{"id":356},{"id":404},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":46},{"id":421},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":446,"damage":15,"nbt_hex":"0a0000030400547970650100000000"},{"id":434},{"id":434,"damage":1},{"id":434,"damage":2},{"id":434,"damage":3},{"id":434,"damage":4},{"id":434,"damage":5},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":401,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"},{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"},{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"},{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"},{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"},{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"},{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"},{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"},{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"},{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"},{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"},{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"},{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"},{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"},{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"},{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"},{"id":736},{"id":737}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems407.json b/src/main/resources/creativeitems407.json deleted file mode 100644 index 276589c17..000000000 --- a/src/main/resources/creativeitems407.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":5},{"id":5,"damage":1},{"id":5,"damage":2},{"id":5,"damage":3},{"id":5,"damage":4},{"id":5,"damage":5},{"id":139},{"id":139,"damage":1},{"id":139,"damage":2},{"id":139,"damage":3},{"id":139,"damage":4},{"id":139,"damage":5},{"id":139,"damage":12},{"id":139,"damage":7},{"id":139,"damage":8},{"id":139,"damage":6},{"id":139,"damage":9},{"id":139,"damage":13},{"id":139,"damage":10},{"id":139,"damage":11},{"id":85},{"id":85,"damage":1},{"id":85,"damage":2},{"id":85,"damage":3},{"id":85,"damage":4},{"id":85,"damage":5},{"id":113},{"id":107},{"id":183},{"id":184},{"id":185},{"id":187},{"id":186},{"id":67},{"id":53},{"id":134},{"id":135},{"id":136},{"id":163},{"id":164},{"id":109},{"id":128},{"id":180},{"id":108},{"id":114},{"id":156},{"id":203},{"id":324},{"id":427},{"id":428},{"id":429},{"id":430},{"id":431},{"id":330},{"id":96},{"id":167},{"id":101},{"id":20},{"id":241},{"id":241,"damage":8},{"id":241,"damage":7},{"id":241,"damage":15},{"id":241,"damage":12},{"id":241,"damage":14},{"id":241,"damage":1},{"id":241,"damage":4},{"id":241,"damage":5},{"id":241,"damage":13},{"id":241,"damage":9},{"id":241,"damage":3},{"id":241,"damage":11},{"id":241,"damage":10},{"id":241,"damage":2},{"id":241,"damage":6},{"id":102},{"id":160},{"id":160,"damage":8},{"id":160,"damage":7},{"id":160,"damage":15},{"id":160,"damage":12},{"id":160,"damage":14},{"id":160,"damage":1},{"id":160,"damage":4},{"id":160,"damage":5},{"id":160,"damage":13},{"id":160,"damage":9},{"id":160,"damage":3},{"id":160,"damage":11},{"id":160,"damage":10},{"id":160,"damage":2},{"id":160,"damage":6},{"id":65},{"id":44},{"id":44,"damage":3},{"id":182,"damage":5},{"id":158},{"id":158,"damage":1},{"id":158,"damage":2},{"id":158,"damage":3},{"id":158,"damage":4},{"id":158,"damage":5},{"id":44,"damage":5},{"id":44,"damage":1},{"id":182,"damage":6},{"id":182},{"id":44,"damage":4},{"id":44,"damage":7},{"id":182,"damage":7},{"id":44,"damage":6},{"id":182,"damage":1},{"id":182,"damage":2},{"id":182,"damage":3},{"id":182,"damage":4},{"id":45},{"id":98},{"id":98,"damage":1},{"id":98,"damage":2},{"id":98,"damage":3},{"id":206},{"id":168,"damage":2},{"id":4},{"id":48},{"id":24},{"id":24,"damage":1},{"id":24,"damage":2},{"id":24,"damage":3},{"id":179},{"id":179,"damage":1},{"id":179,"damage":2},{"id":179,"damage":3},{"id":173},{"id":41},{"id":42},{"id":133},{"id":57},{"id":22},{"id":155},{"id":155,"damage":2},{"id":155,"damage":1},{"id":155,"damage":3},{"id":168},{"id":168,"damage":1},{"id":165},{"id":170},{"id":216},{"id":112},{"id":215},{"id":35},{"id":35,"damage":8},{"id":35,"damage":7},{"id":35,"damage":15},{"id":35,"damage":12},{"id":35,"damage":14},{"id":35,"damage":1},{"id":35,"damage":4},{"id":35,"damage":5},{"id":35,"damage":13},{"id":35,"damage":9},{"id":35,"damage":3},{"id":35,"damage":11},{"id":35,"damage":10},{"id":35,"damage":2},{"id":35,"damage":6},{"id":171},{"id":171,"damage":8},{"id":171,"damage":7},{"id":171,"damage":15},{"id":171,"damage":12},{"id":171,"damage":14},{"id":171,"damage":1},{"id":171,"damage":4},{"id":171,"damage":5},{"id":171,"damage":13},{"id":171,"damage":9},{"id":171,"damage":3},{"id":171,"damage":11},{"id":171,"damage":10},{"id":171,"damage":2},{"id":171,"damage":6},{"id":237},{"id":237,"damage":8},{"id":237,"damage":7},{"id":237,"damage":15},{"id":237,"damage":12},{"id":237,"damage":14},{"id":237,"damage":1},{"id":237,"damage":4},{"id":237,"damage":5},{"id":237,"damage":13},{"id":237,"damage":9},{"id":237,"damage":3},{"id":237,"damage":11},{"id":237,"damage":10},{"id":237,"damage":2},{"id":237,"damage":6},{"id":236},{"id":236,"damage":8},{"id":236,"damage":7},{"id":236,"damage":15},{"id":236,"damage":12},{"id":236,"damage":14},{"id":236,"damage":1},{"id":236,"damage":4},{"id":236,"damage":5},{"id":236,"damage":13},{"id":236,"damage":9},{"id":236,"damage":3},{"id":236,"damage":11},{"id":236,"damage":10},{"id":236,"damage":2},{"id":236,"damage":6},{"id":82},{"id":172},{"id":159},{"id":159,"damage":8},{"id":159,"damage":7},{"id":159,"damage":15},{"id":159,"damage":12},{"id":159,"damage":14},{"id":159,"damage":1},{"id":159,"damage":4},{"id":159,"damage":5},{"id":159,"damage":13},{"id":159,"damage":9},{"id":159,"damage":3},{"id":159,"damage":11},{"id":159,"damage":10},{"id":159,"damage":2},{"id":159,"damage":6},{"id":220},{"id":228},{"id":227},{"id":235},{"id":232},{"id":234},{"id":221},{"id":224},{"id":225},{"id":233},{"id":229},{"id":223},{"id":231},{"id":219},{"id":222},{"id":226},{"id":201},{"id":201,"damage":2},{"id":298},{"id":302},{"id":306},{"id":314},{"id":310},{"id":748},{"id":299},{"id":303},{"id":307},{"id":315},{"id":311},{"id":749},{"id":300},{"id":304},{"id":308},{"id":316},{"id":312},{"id":750},{"id":301},{"id":305},{"id":309},{"id":317},{"id":313},{"id":751},{"id":268},{"id":272},{"id":267},{"id":283},{"id":276},{"id":743},{"id":271},{"id":275},{"id":258},{"id":286},{"id":279},{"id":746},{"id":270},{"id":274},{"id":257},{"id":285},{"id":278},{"id":745},{"id":269},{"id":273},{"id":256},{"id":284},{"id":277},{"id":744},{"id":290},{"id":291},{"id":292},{"id":294},{"id":293},{"id":747},{"id":261},{"id":471},{"id":262},{"id":262,"damage":6},{"id":262,"damage":7},{"id":262,"damage":8},{"id":262,"damage":9},{"id":262,"damage":10},{"id":262,"damage":11},{"id":262,"damage":12},{"id":262,"damage":13},{"id":262,"damage":14},{"id":262,"damage":15},{"id":262,"damage":16},{"id":262,"damage":17},{"id":262,"damage":18},{"id":262,"damage":19},{"id":262,"damage":20},{"id":262,"damage":21},{"id":262,"damage":22},{"id":262,"damage":23},{"id":262,"damage":24},{"id":262,"damage":25},{"id":262,"damage":26},{"id":262,"damage":27},{"id":262,"damage":28},{"id":262,"damage":29},{"id":262,"damage":30},{"id":262,"damage":31},{"id":262,"damage":32},{"id":262,"damage":33},{"id":262,"damage":34},{"id":262,"damage":35},{"id":262,"damage":36},{"id":262,"damage":37},{"id":262,"damage":38},{"id":262,"damage":39},{"id":262,"damage":40},{"id":262,"damage":41},{"id":262,"damage":42},{"id":262,"damage":43},{"id":513},{"id":366},{"id":320},{"id":364},{"id":424},{"id":412},{"id":350},{"id":463},{"id":297},{"id":282},{"id":459},{"id":413},{"id":393},{"id":357},{"id":400},{"id":354},{"id":464},{"id":346},{"id":398},{"id":757},{"id":332},{"id":359},{"id":259},{"id":420},{"id":347},{"id":345},{"id":395},{"id":395,"damage":2},{"id":329},{"id":416},{"id":417},{"id":418},{"id":419},{"id":455},{"id":469},{"id":444},{"id":450},{"id":374},{"id":384},{"id":373},{"id":373,"damage":1},{"id":373,"damage":2},{"id":373,"damage":3},{"id":373,"damage":4},{"id":373,"damage":5},{"id":373,"damage":6},{"id":373,"damage":7},{"id":373,"damage":8},{"id":373,"damage":9},{"id":373,"damage":10},{"id":373,"damage":11},{"id":373,"damage":12},{"id":373,"damage":13},{"id":373,"damage":14},{"id":373,"damage":15},{"id":373,"damage":16},{"id":373,"damage":17},{"id":373,"damage":18},{"id":373,"damage":19},{"id":373,"damage":20},{"id":373,"damage":21},{"id":373,"damage":22},{"id":373,"damage":23},{"id":373,"damage":24},{"id":373,"damage":25},{"id":373,"damage":26},{"id":373,"damage":27},{"id":373,"damage":28},{"id":373,"damage":29},{"id":373,"damage":30},{"id":373,"damage":31},{"id":373,"damage":32},{"id":373,"damage":33},{"id":373,"damage":34},{"id":373,"damage":35},{"id":373,"damage":36},{"id":373,"damage":37},{"id":373,"damage":38},{"id":373,"damage":39},{"id":373,"damage":40},{"id":373,"damage":41},{"id":438},{"id":438,"damage":1},{"id":438,"damage":2},{"id":438,"damage":3},{"id":438,"damage":4},{"id":438,"damage":5},{"id":438,"damage":6},{"id":438,"damage":7},{"id":438,"damage":8},{"id":438,"damage":9},{"id":438,"damage":10},{"id":438,"damage":11},{"id":438,"damage":12},{"id":438,"damage":13},{"id":438,"damage":14},{"id":438,"damage":15},{"id":438,"damage":16},{"id":438,"damage":17},{"id":438,"damage":18},{"id":438,"damage":19},{"id":438,"damage":20},{"id":438,"damage":21},{"id":438,"damage":22},{"id":438,"damage":23},{"id":438,"damage":24},{"id":438,"damage":25},{"id":438,"damage":26},{"id":438,"damage":27},{"id":438,"damage":28},{"id":438,"damage":29},{"id":438,"damage":30},{"id":438,"damage":31},{"id":438,"damage":32},{"id":438,"damage":33},{"id":438,"damage":34},{"id":438,"damage":35},{"id":438,"damage":36},{"id":438,"damage":37},{"id":438,"damage":38},{"id":438,"damage":39},{"id":438,"damage":40},{"id":438,"damage":41},{"id":441},{"id":441,"damage":1},{"id":441,"damage":2},{"id":441,"damage":3},{"id":441,"damage":4},{"id":441,"damage":5},{"id":441,"damage":6},{"id":441,"damage":7},{"id":441,"damage":8},{"id":441,"damage":9},{"id":441,"damage":10},{"id":441,"damage":11},{"id":441,"damage":12},{"id":441,"damage":13},{"id":441,"damage":14},{"id":441,"damage":15},{"id":441,"damage":16},{"id":441,"damage":17},{"id":441,"damage":18},{"id":441,"damage":19},{"id":441,"damage":20},{"id":441,"damage":21},{"id":441,"damage":22},{"id":441,"damage":23},{"id":441,"damage":24},{"id":441,"damage":25},{"id":441,"damage":26},{"id":441,"damage":27},{"id":441,"damage":28},{"id":441,"damage":29},{"id":441,"damage":30},{"id":441,"damage":31},{"id":441,"damage":32},{"id":441,"damage":33},{"id":441,"damage":34},{"id":441,"damage":35},{"id":441,"damage":36},{"id":441,"damage":37},{"id":441,"damage":38},{"id":441,"damage":39},{"id":441,"damage":40},{"id":441,"damage":41},{"id":280},{"id":355},{"id":355,"damage":8},{"id":355,"damage":7},{"id":355,"damage":15},{"id":355,"damage":12},{"id":355,"damage":14},{"id":355,"damage":1},{"id":355,"damage":4},{"id":355,"damage":5},{"id":355,"damage":13},{"id":355,"damage":9},{"id":355,"damage":3},{"id":355,"damage":11},{"id":355,"damage":10},{"id":355,"damage":2},{"id":355,"damage":6},{"id":50},{"id":58},{"id":61},{"id":379},{"id":145},{"id":145,"damage":4},{"id":145,"damage":8},{"id":116},{"id":47},{"id":380},{"id":54},{"id":146},{"id":130},{"id":205},{"id":218},{"id":218,"damage":8},{"id":218,"damage":7},{"id":218,"damage":15},{"id":218,"damage":12},{"id":218,"damage":14},{"id":218,"damage":1},{"id":218,"damage":4},{"id":218,"damage":5},{"id":218,"damage":13},{"id":218,"damage":9},{"id":218,"damage":3},{"id":218,"damage":11},{"id":218,"damage":10},{"id":218,"damage":2},{"id":218,"damage":6},{"id":425},{"id":25},{"id":84},{"id":500},{"id":501},{"id":502},{"id":503},{"id":504},{"id":505},{"id":506},{"id":507},{"id":508},{"id":509},{"id":510},{"id":511},{"id":759},{"id":348},{"id":89},{"id":123},{"id":169},{"id":323},{"id":321},{"id":389},{"id":737},{"id":390},{"id":281},{"id":325},{"id":325,"damage":1},{"id":325,"damage":8},{"id":325,"damage":10},{"id":325,"damage":2},{"id":325,"damage":3},{"id":325,"damage":4},{"id":325,"damage":5},{"id":397,"damage":3},{"id":397,"damage":2},{"id":397,"damage":4},{"id":397,"damage":5},{"id":397},{"id":397,"damage":1},{"id":138},{"id":120},{"id":263},{"id":263,"damage":1},{"id":264},{"id":452},{"id":265},{"id":752},{"id":742},{"id":371},{"id":266},{"id":388},{"id":406},{"id":337},{"id":336},{"id":405},{"id":409},{"id":422},{"id":465},{"id":467},{"id":468},{"id":470},{"id":287},{"id":288},{"id":318},{"id":289},{"id":334},{"id":415},{"id":414},{"id":385},{"id":369},{"id":377},{"id":378},{"id":376},{"id":437},{"id":445},{"id":370},{"id":341},{"id":368},{"id":381},{"id":399},{"id":208},{"id":426},{"id":339},{"id":340},{"id":386},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696400000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696401000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696402000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696403000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696404000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696405000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696406000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696407000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696408000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696409000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640a000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640b000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640c000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069640f000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696410000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696411000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696412000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696413000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696414000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696415000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696416000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696417000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696418000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696419000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641a000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641d000203006c766c05000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641f000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a0100000002020069641e000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696420000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696421000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c03000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696422000203006c766c04000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c01000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c02000000"},{"id":403,"nbt_hex":"0a0000090400656e63680a01000000020200696423000203006c766c03000000"},{"id":333},{"id":333,"damage":1},{"id":333,"damage":2},{"id":333,"damage":3},{"id":333,"damage":4},{"id":333,"damage":5},{"id":66},{"id":27},{"id":28},{"id":126},{"id":328},{"id":342},{"id":408},{"id":407},{"id":331},{"id":152},{"id":76},{"id":69},{"id":143,"damage":5},{"id":77,"damage":5},{"id":131},{"id":72},{"id":70},{"id":147},{"id":148},{"id":251},{"id":151},{"id":356},{"id":404},{"id":410},{"id":125,"damage":3},{"id":23,"damage":3},{"id":33,"damage":1},{"id":29,"damage":1},{"id":46},{"id":421},{"id":446},{"id":446,"damage":8},{"id":446,"damage":7},{"id":446,"damage":15},{"id":446,"damage":12},{"id":446,"damage":14},{"id":446,"damage":1},{"id":446,"damage":4},{"id":446,"damage":5},{"id":446,"damage":13},{"id":446,"damage":9},{"id":446,"damage":3},{"id":446,"damage":11},{"id":446,"damage":10},{"id":446,"damage":2},{"id":446,"damage":6},{"id":446,"damage":15,"nbt_hex":"0a0000030400547970650100000000"},{"id":434},{"id":434,"damage":1},{"id":434,"damage":2},{"id":434,"damage":3},{"id":434,"damage":4},{"id":434,"damage":5},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMAAAAAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAACAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAACQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAACwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAACgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":401,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"},{"id":402,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IhHR3/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":8,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3JST0f/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":7,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3KXnZ3/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":15,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Lw8PD/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":12,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Laszr/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":14,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IdgPn/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":1,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3ImLrD/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":4,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3KqRDz/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":5,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3K4Mon/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":13,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3K9Tsf/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":9,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Kqi/P/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":3,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IyVIP/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":11,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3I92P7/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":10,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Ifx4D/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":2,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IWfF7/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":402,"damage":6,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3KcnBb/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="},{"id":214},{"id":3},{"id":3,"damage":1},{"id":2},{"id":243},{"id":110},{"id":1},{"id":15},{"id":14},{"id":56},{"id":21},{"id":73},{"id":16},{"id":129},{"id":153},{"id":13},{"id":1,"damage":1},{"id":1,"damage":3},{"id":1,"damage":5},{"id":1,"damage":2},{"id":1,"damage":4},{"id":1,"damage":6},{"id":12},{"id":12,"damage":1},{"id":81},{"id":17},{"id":17,"damage":1},{"id":17,"damage":2},{"id":17,"damage":3},{"id":162},{"id":162,"damage":1},{"id":18},{"id":18,"damage":1},{"id":18,"damage":2},{"id":18,"damage":3},{"id":161},{"id":161,"damage":1},{"id":6},{"id":6,"damage":1},{"id":6,"damage":2},{"id":6,"damage":3},{"id":6,"damage":4},{"id":6,"damage":5},{"id":295},{"id":361},{"id":362},{"id":458},{"id":296},{"id":457},{"id":392},{"id":394},{"id":391},{"id":396},{"id":260},{"id":322},{"id":466},{"id":103},{"id":360},{"id":382},{"id":477},{"id":86},{"id":91},{"id":736},{"id":31,"damage":2},{"id":175,"damage":3},{"id":31,"damage":1},{"id":175,"damage":2},{"id":335},{"id":37},{"id":38},{"id":38,"damage":1},{"id":38,"damage":2},{"id":38,"damage":3},{"id":38,"damage":4},{"id":38,"damage":5},{"id":38,"damage":6},{"id":38,"damage":7},{"id":38,"damage":8},{"id":38,"damage":9},{"id":38,"damage":10},{"id":175},{"id":175,"damage":1},{"id":175,"damage":4},{"id":175,"damage":5},{"id":351,"damage":19},{"id":351,"damage":7},{"id":351,"damage":8},{"id":351,"damage":16},{"id":351,"damage":17},{"id":351,"damage":1},{"id":351,"damage":14},{"id":351,"damage":11},{"id":351,"damage":10},{"id":351,"damage":2},{"id":351,"damage":6},{"id":351,"damage":12},{"id":351,"damage":18},{"id":351,"damage":5},{"id":351,"damage":13},{"id":351,"damage":9},{"id":351},{"id":351,"damage":3},{"id":351,"damage":4},{"id":351,"damage":15},{"id":106},{"id":111},{"id":32},{"id":80},{"id":79},{"id":174},{"id":78},{"id":365},{"id":319},{"id":363},{"id":423},{"id":411},{"id":349},{"id":460},{"id":461},{"id":462},{"id":39},{"id":40},{"id":99,"damage":14},{"id":100,"damage":14},{"id":99,"damage":15},{"id":99},{"id":344},{"id":338},{"id":353},{"id":367},{"id":352},{"id":30},{"id":375},{"id":52},{"id":97},{"id":97,"damage":1},{"id":97,"damage":2},{"id":97,"damage":3},{"id":97,"damage":4},{"id":97,"damage":5},{"id":122},{"id":383,"damage":10},{"id":383,"damage":122},{"id":383,"damage":11},{"id":383,"damage":12},{"id":383,"damage":13},{"id":383,"damage":14},{"id":383,"damage":28},{"id":383,"damage":22},{"id":383,"damage":75},{"id":383,"damage":16},{"id":383,"damage":19},{"id":383,"damage":30},{"id":383,"damage":18},{"id":383,"damage":29},{"id":383,"damage":23},{"id":383,"damage":24},{"id":383,"damage":25},{"id":383,"damage":26},{"id":383,"damage":27},{"id":383,"damage":111},{"id":383,"damage":112},{"id":383,"damage":108},{"id":383,"damage":109},{"id":383,"damage":31},{"id":383,"damage":74},{"id":383,"damage":113},{"id":383,"damage":121},{"id":383,"damage":33},{"id":383,"damage":38},{"id":383,"damage":39},{"id":383,"damage":34},{"id":383,"damage":48},{"id":383,"damage":46},{"id":383,"damage":37},{"id":383,"damage":35},{"id":383,"damage":32},{"id":383,"damage":36},{"id":383,"damage":47},{"id":383,"damage":110},{"id":383,"damage":17},{"id":383,"damage":40},{"id":383,"damage":45},{"id":383,"damage":49},{"id":383,"damage":50},{"id":383,"damage":55},{"id":383,"damage":42},{"id":383,"damage":125},{"id":383,"damage":124},{"id":383,"damage":123},{"id":383,"damage":126},{"id":383,"damage":41},{"id":383,"damage":43},{"id":383,"damage":54},{"id":383,"damage":57},{"id":383,"damage":104},{"id":383,"damage":105},{"id":383,"damage":115},{"id":383,"damage":118},{"id":383,"damage":116},{"id":383,"damage":58},{"id":383,"damage":114},{"id":383,"damage":59},{"id":49},{"id":7},{"id":88},{"id":87},{"id":213},{"id":372},{"id":121},{"id":200},{"id":240},{"id":432},{"id":433},{"id":19},{"id":19,"damage":1}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems440.json b/src/main/resources/creativeitems440.json deleted file mode 100644 index fa8e2eb0b..000000000 --- a/src/main/resources/creativeitems440.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":"minecraft:planks","blockRuntimeId":5640},{"id":"minecraft:planks","blockRuntimeId":5641},{"id":"minecraft:planks","blockRuntimeId":5642},{"id":"minecraft:planks","blockRuntimeId":5643},{"id":"minecraft:planks","blockRuntimeId":5644},{"id":"minecraft:planks","blockRuntimeId":5645},{"id":"minecraft:crimson_planks","blockRuntimeId":3799},{"id":"minecraft:warped_planks","blockRuntimeId":7352},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1278},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1279},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1280},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1281},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1282},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1283},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1290},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1285},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1286},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1284},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1287},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1291},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1288},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1289},{"id":"minecraft:blackstone_wall","blockRuntimeId":497},{"id":"minecraft:polished_blackstone_wall","blockRuntimeId":5884},{"id":"minecraft:polished_blackstone_brick_wall","blockRuntimeId":5681},{"id":"minecraft:cobbled_deepslate_wall","blockRuntimeId":1115},{"id":"minecraft:deepslate_tile_wall","blockRuntimeId":4247},{"id":"minecraft:polished_deepslate_wall","blockRuntimeId":6059},{"id":"minecraft:deepslate_brick_wall","blockRuntimeId":4064},{"id":"minecraft:fence","blockRuntimeId":4723},{"id":"minecraft:fence","blockRuntimeId":4724},{"id":"minecraft:fence","blockRuntimeId":4725},{"id":"minecraft:fence","blockRuntimeId":4726},{"id":"minecraft:fence","blockRuntimeId":4727},{"id":"minecraft:fence","blockRuntimeId":4728},{"id":"minecraft:nether_brick_fence","blockRuntimeId":5552},{"id":"minecraft:crimson_fence","blockRuntimeId":3777},{"id":"minecraft:warped_fence","blockRuntimeId":7330},{"id":"minecraft:fence_gate","blockRuntimeId":4729},{"id":"minecraft:spruce_fence_gate","blockRuntimeId":6764},{"id":"minecraft:birch_fence_gate","blockRuntimeId":400},{"id":"minecraft:jungle_fence_gate","blockRuntimeId":5158},{"id":"minecraft:acacia_fence_gate","blockRuntimeId":44},{"id":"minecraft:dark_oak_fence_gate","blockRuntimeId":3930},{"id":"minecraft:crimson_fence_gate","blockRuntimeId":3778},{"id":"minecraft:warped_fence_gate","blockRuntimeId":7331},{"id":"minecraft:normal_stone_stairs","blockRuntimeId":5571},{"id":"minecraft:stone_stairs","blockRuntimeId":7035},{"id":"minecraft:mossy_cobblestone_stairs","blockRuntimeId":5533},{"id":"minecraft:oak_stairs","blockRuntimeId":5580},{"id":"minecraft:spruce_stairs","blockRuntimeId":6796},{"id":"minecraft:birch_stairs","blockRuntimeId":432},{"id":"minecraft:jungle_stairs","blockRuntimeId":5190},{"id":"minecraft:acacia_stairs","blockRuntimeId":76},{"id":"minecraft:dark_oak_stairs","blockRuntimeId":3962},{"id":"minecraft:stone_brick_stairs","blockRuntimeId":6941},{"id":"minecraft:mossy_stone_brick_stairs","blockRuntimeId":5541},{"id":"minecraft:sandstone_stairs","blockRuntimeId":6533},{"id":"minecraft:smooth_sandstone_stairs","blockRuntimeId":6657},{"id":"minecraft:red_sandstone_stairs","blockRuntimeId":6460},{"id":"minecraft:smooth_red_sandstone_stairs","blockRuntimeId":6649},{"id":"minecraft:granite_stairs","blockRuntimeId":4914},{"id":"minecraft:polished_granite_stairs","blockRuntimeId":6229},{"id":"minecraft:diorite_stairs","blockRuntimeId":4425},{"id":"minecraft:polished_diorite_stairs","blockRuntimeId":6221},{"id":"minecraft:andesite_stairs","blockRuntimeId":144},{"id":"minecraft:polished_andesite_stairs","blockRuntimeId":5657},{"id":"minecraft:brick_stairs","blockRuntimeId":856},{"id":"minecraft:nether_brick_stairs","blockRuntimeId":5553},{"id":"minecraft:red_nether_brick_stairs","blockRuntimeId":6448},{"id":"minecraft:end_brick_stairs","blockRuntimeId":4669},{"id":"minecraft:quartz_stairs","blockRuntimeId":6392},{"id":"minecraft:smooth_quartz_stairs","blockRuntimeId":6641},{"id":"minecraft:purpur_stairs","blockRuntimeId":6370},{"id":"minecraft:prismarine_stairs","blockRuntimeId":6292},{"id":"minecraft:dark_prismarine_stairs","blockRuntimeId":3986},{"id":"minecraft:prismarine_bricks_stairs","blockRuntimeId":6284},{"id":"minecraft:crimson_stairs","blockRuntimeId":3819},{"id":"minecraft:warped_stairs","blockRuntimeId":7372},{"id":"minecraft:blackstone_stairs","blockRuntimeId":489},{"id":"minecraft:polished_blackstone_stairs","blockRuntimeId":5876},{"id":"minecraft:polished_blackstone_brick_stairs","blockRuntimeId":5673},{"id":"minecraft:cut_copper_stairs","blockRuntimeId":3872},{"id":"minecraft:exposed_cut_copper_stairs","blockRuntimeId":4705},{"id":"minecraft:weathered_cut_copper_stairs","blockRuntimeId":7499},{"id":"minecraft:oxidized_cut_copper_stairs","blockRuntimeId":5611},{"id":"minecraft:waxed_cut_copper_stairs","blockRuntimeId":7443},{"id":"minecraft:waxed_exposed_cut_copper_stairs","blockRuntimeId":7457},{"id":"minecraft:waxed_weathered_cut_copper_stairs","blockRuntimeId":7485},{"id":"minecraft:waxed_oxidized_cut_copper_stairs","blockRuntimeId":7471},{"id":"minecraft:cobbled_deepslate_stairs","blockRuntimeId":1107},{"id":"minecraft:deepslate_tile_stairs","blockRuntimeId":4239},{"id":"minecraft:polished_deepslate_stairs","blockRuntimeId":6051},{"id":"minecraft:deepslate_brick_stairs","blockRuntimeId":4056},{"id":"minecraft:wooden_door"},{"id":"minecraft:spruce_door"},{"id":"minecraft:birch_door"},{"id":"minecraft:jungle_door"},{"id":"minecraft:acacia_door"},{"id":"minecraft:dark_oak_door"},{"id":"minecraft:iron_door"},{"id":"minecraft:crimson_door"},{"id":"minecraft:warped_door"},{"id":"minecraft:trapdoor","blockRuntimeId":7117},{"id":"minecraft:spruce_trapdoor","blockRuntimeId":6820},{"id":"minecraft:birch_trapdoor","blockRuntimeId":456},{"id":"minecraft:jungle_trapdoor","blockRuntimeId":5214},{"id":"minecraft:acacia_trapdoor","blockRuntimeId":100},{"id":"minecraft:dark_oak_trapdoor","blockRuntimeId":3970},{"id":"minecraft:iron_trapdoor","blockRuntimeId":5073},{"id":"minecraft:crimson_trapdoor","blockRuntimeId":3846},{"id":"minecraft:warped_trapdoor","blockRuntimeId":7399},{"id":"minecraft:iron_bars","blockRuntimeId":5038},{"id":"minecraft:glass","blockRuntimeId":4820},{"id":"minecraft:stained_glass","blockRuntimeId":6842},{"id":"minecraft:stained_glass","blockRuntimeId":6850},{"id":"minecraft:stained_glass","blockRuntimeId":6849},{"id":"minecraft:stained_glass","blockRuntimeId":6857},{"id":"minecraft:stained_glass","blockRuntimeId":6854},{"id":"minecraft:stained_glass","blockRuntimeId":6856},{"id":"minecraft:stained_glass","blockRuntimeId":6843},{"id":"minecraft:stained_glass","blockRuntimeId":6846},{"id":"minecraft:stained_glass","blockRuntimeId":6847},{"id":"minecraft:stained_glass","blockRuntimeId":6855},{"id":"minecraft:stained_glass","blockRuntimeId":6851},{"id":"minecraft:stained_glass","blockRuntimeId":6845},{"id":"minecraft:stained_glass","blockRuntimeId":6853},{"id":"minecraft:stained_glass","blockRuntimeId":6852},{"id":"minecraft:stained_glass","blockRuntimeId":6844},{"id":"minecraft:stained_glass","blockRuntimeId":6848},{"id":"minecraft:tinted_glass","blockRuntimeId":7106},{"id":"minecraft:glass_pane","blockRuntimeId":4821},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6858},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6866},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6865},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6873},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6870},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6872},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6859},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6862},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6863},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6871},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6867},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6861},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6869},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6868},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6860},{"id":"minecraft:stained_glass_pane","blockRuntimeId":6864},{"id":"minecraft:ladder","blockRuntimeId":5262},{"id":"minecraft:scaffolding","blockRuntimeId":6553},{"id":"minecraft:double_stone_slab","blockRuntimeId":6977},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7027},{"id":"minecraft:double_stone_slab","blockRuntimeId":6980},{"id":"minecraft:double_stone_slab2","blockRuntimeId":6998},{"id":"minecraft:wooden_slab","blockRuntimeId":7647},{"id":"minecraft:wooden_slab","blockRuntimeId":7648},{"id":"minecraft:wooden_slab","blockRuntimeId":7649},{"id":"minecraft:wooden_slab","blockRuntimeId":7650},{"id":"minecraft:wooden_slab","blockRuntimeId":7651},{"id":"minecraft:wooden_slab","blockRuntimeId":7652},{"id":"minecraft:double_stone_slab","blockRuntimeId":6982},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7025},{"id":"minecraft:double_stone_slab","blockRuntimeId":6978},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7028},{"id":"minecraft:double_stone_slab2","blockRuntimeId":6999},{"id":"minecraft:double_stone_slab2","blockRuntimeId":6993},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7029},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7010},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7015},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7016},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7013},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7014},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7012},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7011},{"id":"minecraft:double_stone_slab","blockRuntimeId":6981},{"id":"minecraft:double_stone_slab","blockRuntimeId":6984},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7000},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7009},{"id":"minecraft:double_stone_slab","blockRuntimeId":6983},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7026},{"id":"minecraft:double_stone_slab2","blockRuntimeId":6994},{"id":"minecraft:double_stone_slab2","blockRuntimeId":6995},{"id":"minecraft:double_stone_slab2","blockRuntimeId":6996},{"id":"minecraft:double_stone_slab2","blockRuntimeId":6997},{"id":"minecraft:crimson_slab","blockRuntimeId":3817},{"id":"minecraft:warped_slab","blockRuntimeId":7370},{"id":"minecraft:blackstone_slab","blockRuntimeId":487},{"id":"minecraft:polished_blackstone_slab","blockRuntimeId":5874},{"id":"minecraft:polished_blackstone_brick_slab","blockRuntimeId":5671},{"id":"minecraft:cut_copper_slab","blockRuntimeId":3870},{"id":"minecraft:exposed_cut_copper_slab","blockRuntimeId":4703},{"id":"minecraft:weathered_cut_copper_slab","blockRuntimeId":7497},{"id":"minecraft:oxidized_cut_copper_slab","blockRuntimeId":5609},{"id":"minecraft:waxed_cut_copper_slab","blockRuntimeId":7441},{"id":"minecraft:waxed_exposed_cut_copper_slab","blockRuntimeId":7455},{"id":"minecraft:waxed_weathered_cut_copper_slab","blockRuntimeId":7483},{"id":"minecraft:waxed_oxidized_cut_copper_slab","blockRuntimeId":7469},{"id":"minecraft:cobbled_deepslate_slab","blockRuntimeId":1105},{"id":"minecraft:polished_deepslate_slab","blockRuntimeId":6049},{"id":"minecraft:deepslate_tile_slab","blockRuntimeId":4237},{"id":"minecraft:deepslate_brick_slab","blockRuntimeId":4054},{"id":"minecraft:brick_block","blockRuntimeId":855},{"id":"minecraft:chiseled_nether_bricks","blockRuntimeId":1090},{"id":"minecraft:cracked_nether_bricks","blockRuntimeId":3728},{"id":"minecraft:quartz_bricks","blockRuntimeId":6390},{"id":"minecraft:stonebrick","blockRuntimeId":7043},{"id":"minecraft:stonebrick","blockRuntimeId":7044},{"id":"minecraft:stonebrick","blockRuntimeId":7045},{"id":"minecraft:stonebrick","blockRuntimeId":7046},{"id":"minecraft:end_bricks","blockRuntimeId":4677},{"id":"minecraft:prismarine","blockRuntimeId":6283},{"id":"minecraft:polished_blackstone_bricks","blockRuntimeId":5843},{"id":"minecraft:cracked_polished_blackstone_bricks","blockRuntimeId":3729},{"id":"minecraft:gilded_blackstone","blockRuntimeId":4819},{"id":"minecraft:chiseled_polished_blackstone","blockRuntimeId":1091},{"id":"minecraft:deepslate_tiles","blockRuntimeId":4409},{"id":"minecraft:cracked_deepslate_tiles","blockRuntimeId":3727},{"id":"minecraft:deepslate_bricks","blockRuntimeId":4226},{"id":"minecraft:cracked_deepslate_bricks","blockRuntimeId":3726},{"id":"minecraft:chiseled_deepslate","blockRuntimeId":1089},{"id":"minecraft:cobblestone","blockRuntimeId":1277},{"id":"minecraft:mossy_cobblestone","blockRuntimeId":5532},{"id":"minecraft:cobbled_deepslate","blockRuntimeId":1102},{"id":"minecraft:smooth_stone","blockRuntimeId":6665},{"id":"minecraft:sandstone","blockRuntimeId":6529},{"id":"minecraft:sandstone","blockRuntimeId":6530},{"id":"minecraft:sandstone","blockRuntimeId":6531},{"id":"minecraft:sandstone","blockRuntimeId":6532},{"id":"minecraft:red_sandstone","blockRuntimeId":6456},{"id":"minecraft:red_sandstone","blockRuntimeId":6457},{"id":"minecraft:red_sandstone","blockRuntimeId":6458},{"id":"minecraft:red_sandstone","blockRuntimeId":6459},{"id":"minecraft:coal_block","blockRuntimeId":1100},{"id":"minecraft:dried_kelp_block","blockRuntimeId":4533},{"id":"minecraft:gold_block","blockRuntimeId":4900},{"id":"minecraft:iron_block","blockRuntimeId":5039},{"id":"minecraft:copper_block","blockRuntimeId":3636},{"id":"minecraft:exposed_copper","blockRuntimeId":4701},{"id":"minecraft:weathered_copper","blockRuntimeId":7495},{"id":"minecraft:oxidized_copper","blockRuntimeId":5607},{"id":"minecraft:waxed_copper","blockRuntimeId":7439},{"id":"minecraft:waxed_exposed_copper","blockRuntimeId":7453},{"id":"minecraft:waxed_weathered_copper","blockRuntimeId":7481},{"id":"minecraft:waxed_oxidized_copper","blockRuntimeId":7467},{"id":"minecraft:cut_copper","blockRuntimeId":3869},{"id":"minecraft:exposed_cut_copper","blockRuntimeId":4702},{"id":"minecraft:weathered_cut_copper","blockRuntimeId":7496},{"id":"minecraft:oxidized_cut_copper","blockRuntimeId":5608},{"id":"minecraft:waxed_cut_copper","blockRuntimeId":7440},{"id":"minecraft:waxed_exposed_cut_copper","blockRuntimeId":7454},{"id":"minecraft:waxed_weathered_cut_copper","blockRuntimeId":7482},{"id":"minecraft:waxed_oxidized_cut_copper","blockRuntimeId":7468},{"id":"minecraft:emerald_block","blockRuntimeId":4666},{"id":"minecraft:diamond_block","blockRuntimeId":4423},{"id":"minecraft:lapis_block","blockRuntimeId":5270},{"id":"minecraft:raw_iron_block","blockRuntimeId":6412},{"id":"minecraft:raw_copper_block","blockRuntimeId":6410},{"id":"minecraft:raw_gold_block","blockRuntimeId":6411},{"id":"minecraft:quartz_block","blockRuntimeId":6378},{"id":"minecraft:quartz_block","blockRuntimeId":6380},{"id":"minecraft:quartz_block","blockRuntimeId":6379},{"id":"minecraft:quartz_block","blockRuntimeId":6381},{"id":"minecraft:prismarine","blockRuntimeId":6281},{"id":"minecraft:prismarine","blockRuntimeId":6282},{"id":"minecraft:slime","blockRuntimeId":6618},{"id":"minecraft:honey_block","blockRuntimeId":5017},{"id":"minecraft:honeycomb_block","blockRuntimeId":5018},{"id":"minecraft:hay_block","blockRuntimeId":4989},{"id":"minecraft:bone_block","blockRuntimeId":672},{"id":"minecraft:nether_brick","blockRuntimeId":5551},{"id":"minecraft:red_nether_brick","blockRuntimeId":6447},{"id":"minecraft:netherite_block","blockRuntimeId":5568},{"id":"minecraft:lodestone","blockRuntimeId":5438},{"id":"minecraft:wool","blockRuntimeId":7659},{"id":"minecraft:wool","blockRuntimeId":7667},{"id":"minecraft:wool","blockRuntimeId":7666},{"id":"minecraft:wool","blockRuntimeId":7674},{"id":"minecraft:wool","blockRuntimeId":7671},{"id":"minecraft:wool","blockRuntimeId":7673},{"id":"minecraft:wool","blockRuntimeId":7660},{"id":"minecraft:wool","blockRuntimeId":7663},{"id":"minecraft:wool","blockRuntimeId":7664},{"id":"minecraft:wool","blockRuntimeId":7672},{"id":"minecraft:wool","blockRuntimeId":7668},{"id":"minecraft:wool","blockRuntimeId":7662},{"id":"minecraft:wool","blockRuntimeId":7670},{"id":"minecraft:wool","blockRuntimeId":7669},{"id":"minecraft:wool","blockRuntimeId":7661},{"id":"minecraft:wool","blockRuntimeId":7665},{"id":"minecraft:carpet","blockRuntimeId":923},{"id":"minecraft:carpet","blockRuntimeId":931},{"id":"minecraft:carpet","blockRuntimeId":930},{"id":"minecraft:carpet","blockRuntimeId":938},{"id":"minecraft:carpet","blockRuntimeId":935},{"id":"minecraft:carpet","blockRuntimeId":937},{"id":"minecraft:carpet","blockRuntimeId":924},{"id":"minecraft:carpet","blockRuntimeId":927},{"id":"minecraft:carpet","blockRuntimeId":928},{"id":"minecraft:carpet","blockRuntimeId":936},{"id":"minecraft:carpet","blockRuntimeId":932},{"id":"minecraft:carpet","blockRuntimeId":926},{"id":"minecraft:carpet","blockRuntimeId":934},{"id":"minecraft:carpet","blockRuntimeId":933},{"id":"minecraft:carpet","blockRuntimeId":925},{"id":"minecraft:carpet","blockRuntimeId":929},{"id":"minecraft:concrete_powder","blockRuntimeId":3619},{"id":"minecraft:concrete_powder","blockRuntimeId":3627},{"id":"minecraft:concrete_powder","blockRuntimeId":3626},{"id":"minecraft:concrete_powder","blockRuntimeId":3634},{"id":"minecraft:concrete_powder","blockRuntimeId":3631},{"id":"minecraft:concrete_powder","blockRuntimeId":3633},{"id":"minecraft:concrete_powder","blockRuntimeId":3620},{"id":"minecraft:concrete_powder","blockRuntimeId":3623},{"id":"minecraft:concrete_powder","blockRuntimeId":3624},{"id":"minecraft:concrete_powder","blockRuntimeId":3632},{"id":"minecraft:concrete_powder","blockRuntimeId":3628},{"id":"minecraft:concrete_powder","blockRuntimeId":3622},{"id":"minecraft:concrete_powder","blockRuntimeId":3630},{"id":"minecraft:concrete_powder","blockRuntimeId":3629},{"id":"minecraft:concrete_powder","blockRuntimeId":3621},{"id":"minecraft:concrete_powder","blockRuntimeId":3625},{"id":"minecraft:concrete","blockRuntimeId":3603},{"id":"minecraft:concrete","blockRuntimeId":3611},{"id":"minecraft:concrete","blockRuntimeId":3610},{"id":"minecraft:concrete","blockRuntimeId":3618},{"id":"minecraft:concrete","blockRuntimeId":3615},{"id":"minecraft:concrete","blockRuntimeId":3617},{"id":"minecraft:concrete","blockRuntimeId":3604},{"id":"minecraft:concrete","blockRuntimeId":3607},{"id":"minecraft:concrete","blockRuntimeId":3608},{"id":"minecraft:concrete","blockRuntimeId":3616},{"id":"minecraft:concrete","blockRuntimeId":3612},{"id":"minecraft:concrete","blockRuntimeId":3606},{"id":"minecraft:concrete","blockRuntimeId":3614},{"id":"minecraft:concrete","blockRuntimeId":3613},{"id":"minecraft:concrete","blockRuntimeId":3605},{"id":"minecraft:concrete","blockRuntimeId":3609},{"id":"minecraft:clay","blockRuntimeId":1099},{"id":"minecraft:hardened_clay","blockRuntimeId":4988},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6874},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6882},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6881},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6889},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6886},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6888},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6875},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6878},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6879},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6887},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6883},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6877},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6885},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6884},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6876},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":6880},{"id":"minecraft:white_glazed_terracotta","blockRuntimeId":7544},{"id":"minecraft:silver_glazed_terracotta","blockRuntimeId":6600},{"id":"minecraft:gray_glazed_terracotta","blockRuntimeId":4925},{"id":"minecraft:black_glazed_terracotta","blockRuntimeId":478},{"id":"minecraft:brown_glazed_terracotta","blockRuntimeId":864},{"id":"minecraft:red_glazed_terracotta","blockRuntimeId":6424},{"id":"minecraft:orange_glazed_terracotta","blockRuntimeId":5601},{"id":"minecraft:yellow_glazed_terracotta","blockRuntimeId":7676},{"id":"minecraft:lime_glazed_terracotta","blockRuntimeId":5407},{"id":"minecraft:green_glazed_terracotta","blockRuntimeId":4931},{"id":"minecraft:cyan_glazed_terracotta","blockRuntimeId":3880},{"id":"minecraft:light_blue_glazed_terracotta","blockRuntimeId":5379},{"id":"minecraft:blue_glazed_terracotta","blockRuntimeId":665},{"id":"minecraft:purple_glazed_terracotta","blockRuntimeId":6352},{"id":"minecraft:magenta_glazed_terracotta","blockRuntimeId":5461},{"id":"minecraft:pink_glazed_terracotta","blockRuntimeId":5622},{"id":"minecraft:purpur_block","blockRuntimeId":6358},{"id":"minecraft:purpur_block","blockRuntimeId":6360},{"id":"minecraft:nether_wart_block","blockRuntimeId":5567},{"id":"minecraft:warped_wart_block","blockRuntimeId":7421},{"id":"minecraft:shroomlight","blockRuntimeId":6583},{"id":"minecraft:crimson_nylium","blockRuntimeId":3798},{"id":"minecraft:warped_nylium","blockRuntimeId":7351},{"id":"minecraft:basalt","blockRuntimeId":214},{"id":"minecraft:polished_basalt","blockRuntimeId":5665},{"id":"minecraft:smooth_basalt","blockRuntimeId":6640},{"id":"minecraft:soul_soil","blockRuntimeId":6710},{"id":"minecraft:dirt","blockRuntimeId":4433},{"id":"minecraft:dirt","blockRuntimeId":4434},{"id":"minecraft:farmland","blockRuntimeId":4715},{"id":"minecraft:grass","blockRuntimeId":4922},{"id":"minecraft:grass_path","blockRuntimeId":4923},{"id":"minecraft:podzol","blockRuntimeId":5646},{"id":"minecraft:mycelium","blockRuntimeId":5550},{"id":"minecraft:stone","blockRuntimeId":6934},{"id":"minecraft:iron_ore","blockRuntimeId":5072},{"id":"minecraft:gold_ore","blockRuntimeId":4901},{"id":"minecraft:diamond_ore","blockRuntimeId":4424},{"id":"minecraft:lapis_ore","blockRuntimeId":5271},{"id":"minecraft:redstone_ore","blockRuntimeId":6470},{"id":"minecraft:coal_ore","blockRuntimeId":1101},{"id":"minecraft:emerald_ore","blockRuntimeId":4667},{"id":"minecraft:quartz_ore","blockRuntimeId":6391},{"id":"minecraft:nether_gold_ore","blockRuntimeId":5561},{"id":"minecraft:ancient_debris","blockRuntimeId":143},{"id":"minecraft:copper_ore","blockRuntimeId":3637},{"id":"minecraft:deepslate_iron_ore","blockRuntimeId":4232},{"id":"minecraft:deepslate_gold_ore","blockRuntimeId":4231},{"id":"minecraft:deepslate_diamond_ore","blockRuntimeId":4229},{"id":"minecraft:deepslate_lapis_ore","blockRuntimeId":4233},{"id":"minecraft:deepslate_redstone_ore","blockRuntimeId":4234},{"id":"minecraft:deepslate_emerald_ore","blockRuntimeId":4230},{"id":"minecraft:deepslate_coal_ore","blockRuntimeId":4227},{"id":"minecraft:deepslate_copper_ore","blockRuntimeId":4228},{"id":"minecraft:gravel","blockRuntimeId":4924},{"id":"minecraft:stone","blockRuntimeId":6935},{"id":"minecraft:stone","blockRuntimeId":6937},{"id":"minecraft:stone","blockRuntimeId":6939},{"id":"minecraft:blackstone","blockRuntimeId":484},{"id":"minecraft:stone","blockRuntimeId":6936},{"id":"minecraft:stone","blockRuntimeId":6938},{"id":"minecraft:stone","blockRuntimeId":6940},{"id":"minecraft:polished_blackstone","blockRuntimeId":5668},{"id":"minecraft:deepslate","blockRuntimeId":4049},{"id":"minecraft:polished_deepslate","blockRuntimeId":6046},{"id":"minecraft:sand","blockRuntimeId":6527},{"id":"minecraft:sand","blockRuntimeId":6528},{"id":"minecraft:cactus","blockRuntimeId":890},{"id":"minecraft:log","blockRuntimeId":5439},{"id":"minecraft:stripped_oak_log","blockRuntimeId":7073},{"id":"minecraft:log","blockRuntimeId":5440},{"id":"minecraft:stripped_spruce_log","blockRuntimeId":7076},{"id":"minecraft:log","blockRuntimeId":5441},{"id":"minecraft:stripped_birch_log","blockRuntimeId":7058},{"id":"minecraft:log","blockRuntimeId":5442},{"id":"minecraft:stripped_jungle_log","blockRuntimeId":7070},{"id":"minecraft:log2","blockRuntimeId":5451},{"id":"minecraft:stripped_acacia_log","blockRuntimeId":7055},{"id":"minecraft:log2","blockRuntimeId":5452},{"id":"minecraft:stripped_dark_oak_log","blockRuntimeId":7067},{"id":"minecraft:crimson_stem","blockRuntimeId":3843},{"id":"minecraft:stripped_crimson_stem","blockRuntimeId":7064},{"id":"minecraft:warped_stem","blockRuntimeId":7396},{"id":"minecraft:stripped_warped_stem","blockRuntimeId":7082},{"id":"minecraft:wood","blockRuntimeId":7551},{"id":"minecraft:wood","blockRuntimeId":7557},{"id":"minecraft:wood","blockRuntimeId":7552},{"id":"minecraft:wood","blockRuntimeId":7558},{"id":"minecraft:wood","blockRuntimeId":7553},{"id":"minecraft:wood","blockRuntimeId":7559},{"id":"minecraft:wood","blockRuntimeId":7554},{"id":"minecraft:wood","blockRuntimeId":7560},{"id":"minecraft:wood","blockRuntimeId":7555},{"id":"minecraft:wood","blockRuntimeId":7561},{"id":"minecraft:wood","blockRuntimeId":7556},{"id":"minecraft:wood","blockRuntimeId":7562},{"id":"minecraft:crimson_hyphae","blockRuntimeId":3795},{"id":"minecraft:stripped_crimson_hyphae","blockRuntimeId":7061},{"id":"minecraft:warped_hyphae","blockRuntimeId":7348},{"id":"minecraft:stripped_warped_hyphae","blockRuntimeId":7079},{"id":"minecraft:leaves","blockRuntimeId":5315},{"id":"minecraft:leaves","blockRuntimeId":5316},{"id":"minecraft:leaves","blockRuntimeId":5317},{"id":"minecraft:leaves","blockRuntimeId":5318},{"id":"minecraft:leaves2","blockRuntimeId":5331},{"id":"minecraft:leaves2","blockRuntimeId":5332},{"id":"minecraft:azalea_leaves","blockRuntimeId":169},{"id":"minecraft:azalea_leaves_flowered","blockRuntimeId":173},{"id":"minecraft:sapling","blockRuntimeId":6541},{"id":"minecraft:sapling","blockRuntimeId":6542},{"id":"minecraft:sapling","blockRuntimeId":6543},{"id":"minecraft:sapling","blockRuntimeId":6544},{"id":"minecraft:sapling","blockRuntimeId":6545},{"id":"minecraft:sapling","blockRuntimeId":6546},{"id":"minecraft:bee_nest","blockRuntimeId":236},{"id":"minecraft:wheat_seeds"},{"id":"minecraft:pumpkin_seeds"},{"id":"minecraft:melon_seeds"},{"id":"minecraft:beetroot_seeds"},{"id":"minecraft:wheat"},{"id":"minecraft:beetroot"},{"id":"minecraft:potato"},{"id":"minecraft:poisonous_potato"},{"id":"minecraft:carrot"},{"id":"minecraft:golden_carrot"},{"id":"minecraft:apple"},{"id":"minecraft:golden_apple"},{"id":"minecraft:enchanted_golden_apple"},{"id":"minecraft:melon_block","blockRuntimeId":5474},{"id":"minecraft:melon_slice"},{"id":"minecraft:glistering_melon_slice"},{"id":"minecraft:sweet_berries"},{"id":"minecraft:glow_berries"},{"id":"minecraft:pumpkin","blockRuntimeId":6300},{"id":"minecraft:carved_pumpkin","blockRuntimeId":948},{"id":"minecraft:lit_pumpkin","blockRuntimeId":5426},{"id":"minecraft:honeycomb"},{"id":"minecraft:tallgrass","blockRuntimeId":7103},{"id":"minecraft:double_plant","blockRuntimeId":4453},{"id":"minecraft:tallgrass","blockRuntimeId":7102},{"id":"minecraft:double_plant","blockRuntimeId":4452},{"id":"minecraft:nether_sprouts"},{"id":"minecraft:coral","blockRuntimeId":3641},{"id":"minecraft:coral","blockRuntimeId":3639},{"id":"minecraft:coral","blockRuntimeId":3640},{"id":"minecraft:coral","blockRuntimeId":3638},{"id":"minecraft:coral","blockRuntimeId":3642},{"id":"minecraft:coral","blockRuntimeId":3646},{"id":"minecraft:coral","blockRuntimeId":3644},{"id":"minecraft:coral","blockRuntimeId":3645},{"id":"minecraft:coral","blockRuntimeId":3643},{"id":"minecraft:coral","blockRuntimeId":3647},{"id":"minecraft:coral_fan","blockRuntimeId":3661},{"id":"minecraft:coral_fan","blockRuntimeId":3659},{"id":"minecraft:coral_fan","blockRuntimeId":3660},{"id":"minecraft:coral_fan","blockRuntimeId":3658},{"id":"minecraft:coral_fan","blockRuntimeId":3662},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3671},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3669},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3670},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3668},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3672},{"id":"minecraft:kelp"},{"id":"minecraft:seagrass","blockRuntimeId":6579},{"id":"minecraft:crimson_roots","blockRuntimeId":3816},{"id":"minecraft:warped_roots","blockRuntimeId":7369},{"id":"minecraft:yellow_flower","blockRuntimeId":7675},{"id":"minecraft:red_flower","blockRuntimeId":6413},{"id":"minecraft:red_flower","blockRuntimeId":6414},{"id":"minecraft:red_flower","blockRuntimeId":6415},{"id":"minecraft:red_flower","blockRuntimeId":6416},{"id":"minecraft:red_flower","blockRuntimeId":6417},{"id":"minecraft:red_flower","blockRuntimeId":6418},{"id":"minecraft:red_flower","blockRuntimeId":6419},{"id":"minecraft:red_flower","blockRuntimeId":6420},{"id":"minecraft:red_flower","blockRuntimeId":6421},{"id":"minecraft:red_flower","blockRuntimeId":6422},{"id":"minecraft:red_flower","blockRuntimeId":6423},{"id":"minecraft:double_plant","blockRuntimeId":4450},{"id":"minecraft:double_plant","blockRuntimeId":4451},{"id":"minecraft:double_plant","blockRuntimeId":4454},{"id":"minecraft:double_plant","blockRuntimeId":4455},{"id":"minecraft:wither_rose","blockRuntimeId":7550},{"id":"minecraft:white_dye"},{"id":"minecraft:light_gray_dye"},{"id":"minecraft:gray_dye"},{"id":"minecraft:black_dye"},{"id":"minecraft:brown_dye"},{"id":"minecraft:red_dye"},{"id":"minecraft:orange_dye"},{"id":"minecraft:yellow_dye"},{"id":"minecraft:lime_dye"},{"id":"minecraft:green_dye"},{"id":"minecraft:cyan_dye"},{"id":"minecraft:light_blue_dye"},{"id":"minecraft:blue_dye"},{"id":"minecraft:purple_dye"},{"id":"minecraft:magenta_dye"},{"id":"minecraft:pink_dye"},{"id":"minecraft:ink_sac"},{"id":"minecraft:glow_ink_sac"},{"id":"minecraft:cocoa_beans"},{"id":"minecraft:lapis_lazuli"},{"id":"minecraft:bone_meal"},{"id":"minecraft:vine","blockRuntimeId":7256},{"id":"minecraft:weeping_vines","blockRuntimeId":7510},{"id":"minecraft:twisting_vines","blockRuntimeId":7184},{"id":"minecraft:waterlily","blockRuntimeId":7438},{"id":"minecraft:deadbush","blockRuntimeId":4048},{"id":"minecraft:bamboo","blockRuntimeId":177},{"id":"minecraft:snow","blockRuntimeId":6666},{"id":"minecraft:ice","blockRuntimeId":5031},{"id":"minecraft:packed_ice","blockRuntimeId":5621},{"id":"minecraft:blue_ice","blockRuntimeId":671},{"id":"minecraft:snow_layer","blockRuntimeId":6667},{"id":"minecraft:pointed_dripstone","blockRuntimeId":5652},{"id":"minecraft:dripstone_block","blockRuntimeId":4534},{"id":"minecraft:moss_carpet","blockRuntimeId":5531},{"id":"minecraft:moss_block","blockRuntimeId":5530},{"id":"minecraft:dirt_with_roots","blockRuntimeId":4435},{"id":"minecraft:hanging_roots","blockRuntimeId":4953},{"id":"minecraft:big_dripleaf","blockRuntimeId":328},{"id":"minecraft:small_dripleaf_block","blockRuntimeId":6632},{"id":"minecraft:spore_blossom","blockRuntimeId":6719},{"id":"minecraft:azalea","blockRuntimeId":168},{"id":"minecraft:flowering_azalea","blockRuntimeId":4764},{"id":"minecraft:glow_lichen","blockRuntimeId":4897},{"id":"minecraft:amethyst_block","blockRuntimeId":136},{"id":"minecraft:budding_amethyst","blockRuntimeId":889},{"id":"minecraft:amethyst_cluster","blockRuntimeId":137},{"id":"minecraft:large_amethyst_bud","blockRuntimeId":5272},{"id":"minecraft:medium_amethyst_bud","blockRuntimeId":5468},{"id":"minecraft:small_amethyst_bud","blockRuntimeId":6619},{"id":"minecraft:tuff","blockRuntimeId":7171},{"id":"minecraft:calcite","blockRuntimeId":913},{"id":"minecraft:chicken"},{"id":"minecraft:porkchop"},{"id":"minecraft:beef"},{"id":"minecraft:mutton"},{"id":"minecraft:rabbit"},{"id":"minecraft:cod"},{"id":"minecraft:salmon"},{"id":"minecraft:tropical_fish"},{"id":"minecraft:pufferfish"},{"id":"minecraft:brown_mushroom","blockRuntimeId":870},{"id":"minecraft:red_mushroom","blockRuntimeId":6430},{"id":"minecraft:crimson_fungus","blockRuntimeId":3794},{"id":"minecraft:warped_fungus","blockRuntimeId":7347},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":885},{"id":"minecraft:red_mushroom_block","blockRuntimeId":6445},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":886},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":871},{"id":"minecraft:egg"},{"id":"minecraft:sugar_cane"},{"id":"minecraft:sugar"},{"id":"minecraft:rotten_flesh"},{"id":"minecraft:bone"},{"id":"minecraft:web","blockRuntimeId":7509},{"id":"minecraft:spider_eye"},{"id":"minecraft:mob_spawner","blockRuntimeId":5523},{"id":"minecraft:monster_egg","blockRuntimeId":5524},{"id":"minecraft:monster_egg","blockRuntimeId":5525},{"id":"minecraft:monster_egg","blockRuntimeId":5526},{"id":"minecraft:monster_egg","blockRuntimeId":5527},{"id":"minecraft:monster_egg","blockRuntimeId":5528},{"id":"minecraft:monster_egg","blockRuntimeId":5529},{"id":"minecraft:infested_deepslate","blockRuntimeId":5032},{"id":"minecraft:dragon_egg","blockRuntimeId":4532},{"id":"minecraft:turtle_egg","blockRuntimeId":7172},{"id":"minecraft:chicken_spawn_egg"},{"id":"minecraft:bee_spawn_egg"},{"id":"minecraft:cow_spawn_egg"},{"id":"minecraft:pig_spawn_egg"},{"id":"minecraft:sheep_spawn_egg"},{"id":"minecraft:wolf_spawn_egg"},{"id":"minecraft:polar_bear_spawn_egg"},{"id":"minecraft:ocelot_spawn_egg"},{"id":"minecraft:cat_spawn_egg"},{"id":"minecraft:mooshroom_spawn_egg"},{"id":"minecraft:bat_spawn_egg"},{"id":"minecraft:parrot_spawn_egg"},{"id":"minecraft:rabbit_spawn_egg"},{"id":"minecraft:llama_spawn_egg"},{"id":"minecraft:horse_spawn_egg"},{"id":"minecraft:donkey_spawn_egg"},{"id":"minecraft:mule_spawn_egg"},{"id":"minecraft:skeleton_horse_spawn_egg"},{"id":"minecraft:zombie_horse_spawn_egg"},{"id":"minecraft:tropical_fish_spawn_egg"},{"id":"minecraft:cod_spawn_egg"},{"id":"minecraft:pufferfish_spawn_egg"},{"id":"minecraft:salmon_spawn_egg"},{"id":"minecraft:dolphin_spawn_egg"},{"id":"minecraft:turtle_spawn_egg"},{"id":"minecraft:panda_spawn_egg"},{"id":"minecraft:fox_spawn_egg"},{"id":"minecraft:creeper_spawn_egg"},{"id":"minecraft:enderman_spawn_egg"},{"id":"minecraft:silverfish_spawn_egg"},{"id":"minecraft:skeleton_spawn_egg"},{"id":"minecraft:wither_skeleton_spawn_egg"},{"id":"minecraft:stray_spawn_egg"},{"id":"minecraft:slime_spawn_egg"},{"id":"minecraft:spider_spawn_egg"},{"id":"minecraft:zombie_spawn_egg"},{"id":"minecraft:zombie_pigman_spawn_egg"},{"id":"minecraft:husk_spawn_egg"},{"id":"minecraft:drowned_spawn_egg"},{"id":"minecraft:squid_spawn_egg"},{"id":"minecraft:glow_squid_spawn_egg"},{"id":"minecraft:cave_spider_spawn_egg"},{"id":"minecraft:witch_spawn_egg"},{"id":"minecraft:guardian_spawn_egg"},{"id":"minecraft:elder_guardian_spawn_egg"},{"id":"minecraft:endermite_spawn_egg"},{"id":"minecraft:magma_cube_spawn_egg"},{"id":"minecraft:strider_spawn_egg"},{"id":"minecraft:hoglin_spawn_egg"},{"id":"minecraft:piglin_spawn_egg"},{"id":"minecraft:zoglin_spawn_egg"},{"id":"minecraft:piglin_brute_spawn_egg"},{"id":"minecraft:goat_spawn_egg"},{"id":"minecraft:axolotl_spawn_egg"},{"id":"minecraft:ghast_spawn_egg"},{"id":"minecraft:blaze_spawn_egg"},{"id":"minecraft:shulker_spawn_egg"},{"id":"minecraft:vindicator_spawn_egg"},{"id":"minecraft:evoker_spawn_egg"},{"id":"minecraft:vex_spawn_egg"},{"id":"minecraft:villager_spawn_egg"},{"id":"minecraft:wandering_trader_spawn_egg"},{"id":"minecraft:zombie_villager_spawn_egg"},{"id":"minecraft:phantom_spawn_egg"},{"id":"minecraft:pillager_spawn_egg"},{"id":"minecraft:ravager_spawn_egg"},{"id":"minecraft:obsidian","blockRuntimeId":5600},{"id":"minecraft:crying_obsidian","blockRuntimeId":3868},{"id":"minecraft:bedrock","blockRuntimeId":234},{"id":"minecraft:soul_sand","blockRuntimeId":6709},{"id":"minecraft:netherrack","blockRuntimeId":5569},{"id":"minecraft:magma","blockRuntimeId":5467},{"id":"minecraft:nether_wart"},{"id":"minecraft:end_stone","blockRuntimeId":4694},{"id":"minecraft:chorus_flower","blockRuntimeId":1092},{"id":"minecraft:chorus_plant","blockRuntimeId":1098},{"id":"minecraft:chorus_fruit"},{"id":"minecraft:popped_chorus_fruit"},{"id":"minecraft:sponge","blockRuntimeId":6717},{"id":"minecraft:sponge","blockRuntimeId":6718},{"id":"minecraft:coral_block","blockRuntimeId":3648},{"id":"minecraft:coral_block","blockRuntimeId":3649},{"id":"minecraft:coral_block","blockRuntimeId":3650},{"id":"minecraft:coral_block","blockRuntimeId":3651},{"id":"minecraft:coral_block","blockRuntimeId":3652},{"id":"minecraft:coral_block","blockRuntimeId":3653},{"id":"minecraft:coral_block","blockRuntimeId":3654},{"id":"minecraft:coral_block","blockRuntimeId":3655},{"id":"minecraft:coral_block","blockRuntimeId":3656},{"id":"minecraft:coral_block","blockRuntimeId":3657},{"id":"minecraft:leather_helmet"},{"id":"minecraft:chainmail_helmet"},{"id":"minecraft:iron_helmet"},{"id":"minecraft:golden_helmet"},{"id":"minecraft:diamond_helmet"},{"id":"minecraft:netherite_helmet"},{"id":"minecraft:leather_chestplate"},{"id":"minecraft:chainmail_chestplate"},{"id":"minecraft:iron_chestplate"},{"id":"minecraft:golden_chestplate"},{"id":"minecraft:diamond_chestplate"},{"id":"minecraft:netherite_chestplate"},{"id":"minecraft:leather_leggings"},{"id":"minecraft:chainmail_leggings"},{"id":"minecraft:iron_leggings"},{"id":"minecraft:golden_leggings"},{"id":"minecraft:diamond_leggings"},{"id":"minecraft:netherite_leggings"},{"id":"minecraft:leather_boots"},{"id":"minecraft:chainmail_boots"},{"id":"minecraft:iron_boots"},{"id":"minecraft:golden_boots"},{"id":"minecraft:diamond_boots"},{"id":"minecraft:netherite_boots"},{"id":"minecraft:wooden_sword"},{"id":"minecraft:stone_sword"},{"id":"minecraft:iron_sword"},{"id":"minecraft:golden_sword"},{"id":"minecraft:diamond_sword"},{"id":"minecraft:netherite_sword"},{"id":"minecraft:wooden_axe"},{"id":"minecraft:stone_axe"},{"id":"minecraft:iron_axe"},{"id":"minecraft:golden_axe"},{"id":"minecraft:diamond_axe"},{"id":"minecraft:netherite_axe"},{"id":"minecraft:wooden_pickaxe"},{"id":"minecraft:stone_pickaxe"},{"id":"minecraft:iron_pickaxe"},{"id":"minecraft:golden_pickaxe"},{"id":"minecraft:diamond_pickaxe"},{"id":"minecraft:netherite_pickaxe"},{"id":"minecraft:wooden_shovel"},{"id":"minecraft:stone_shovel"},{"id":"minecraft:iron_shovel"},{"id":"minecraft:golden_shovel"},{"id":"minecraft:diamond_shovel"},{"id":"minecraft:netherite_shovel"},{"id":"minecraft:wooden_hoe"},{"id":"minecraft:stone_hoe"},{"id":"minecraft:iron_hoe"},{"id":"minecraft:golden_hoe"},{"id":"minecraft:diamond_hoe"},{"id":"minecraft:netherite_hoe"},{"id":"minecraft:bow"},{"id":"minecraft:crossbow"},{"id":"minecraft:arrow"},{"id":"minecraft:arrow","damage":6},{"id":"minecraft:arrow","damage":7},{"id":"minecraft:arrow","damage":8},{"id":"minecraft:arrow","damage":9},{"id":"minecraft:arrow","damage":10},{"id":"minecraft:arrow","damage":11},{"id":"minecraft:arrow","damage":12},{"id":"minecraft:arrow","damage":13},{"id":"minecraft:arrow","damage":14},{"id":"minecraft:arrow","damage":15},{"id":"minecraft:arrow","damage":16},{"id":"minecraft:arrow","damage":17},{"id":"minecraft:arrow","damage":18},{"id":"minecraft:arrow","damage":19},{"id":"minecraft:arrow","damage":20},{"id":"minecraft:arrow","damage":21},{"id":"minecraft:arrow","damage":22},{"id":"minecraft:arrow","damage":23},{"id":"minecraft:arrow","damage":24},{"id":"minecraft:arrow","damage":25},{"id":"minecraft:arrow","damage":26},{"id":"minecraft:arrow","damage":27},{"id":"minecraft:arrow","damage":28},{"id":"minecraft:arrow","damage":29},{"id":"minecraft:arrow","damage":30},{"id":"minecraft:arrow","damage":31},{"id":"minecraft:arrow","damage":32},{"id":"minecraft:arrow","damage":33},{"id":"minecraft:arrow","damage":34},{"id":"minecraft:arrow","damage":35},{"id":"minecraft:arrow","damage":36},{"id":"minecraft:arrow","damage":37},{"id":"minecraft:arrow","damage":38},{"id":"minecraft:arrow","damage":39},{"id":"minecraft:arrow","damage":40},{"id":"minecraft:arrow","damage":41},{"id":"minecraft:arrow","damage":42},{"id":"minecraft:arrow","damage":43},{"id":"minecraft:shield"},{"id":"minecraft:cooked_chicken"},{"id":"minecraft:cooked_porkchop"},{"id":"minecraft:cooked_beef"},{"id":"minecraft:cooked_mutton"},{"id":"minecraft:cooked_rabbit"},{"id":"minecraft:cooked_cod"},{"id":"minecraft:cooked_salmon"},{"id":"minecraft:bread"},{"id":"minecraft:mushroom_stew"},{"id":"minecraft:beetroot_soup"},{"id":"minecraft:rabbit_stew"},{"id":"minecraft:baked_potato"},{"id":"minecraft:cookie"},{"id":"minecraft:pumpkin_pie"},{"id":"minecraft:cake"},{"id":"minecraft:dried_kelp"},{"id":"minecraft:fishing_rod"},{"id":"minecraft:carrot_on_a_stick"},{"id":"minecraft:warped_fungus_on_a_stick"},{"id":"minecraft:snowball"},{"id":"minecraft:shears"},{"id":"minecraft:flint_and_steel"},{"id":"minecraft:lead"},{"id":"minecraft:clock"},{"id":"minecraft:compass"},{"id":"minecraft:empty_map"},{"id":"minecraft:empty_map","damage":2},{"id":"minecraft:saddle"},{"id":"minecraft:leather_horse_armor"},{"id":"minecraft:iron_horse_armor"},{"id":"minecraft:golden_horse_armor"},{"id":"minecraft:diamond_horse_armor"},{"id":"minecraft:trident"},{"id":"minecraft:turtle_helmet"},{"id":"minecraft:elytra"},{"id":"minecraft:totem_of_undying"},{"id":"minecraft:glass_bottle"},{"id":"minecraft:experience_bottle"},{"id":"minecraft:potion"},{"id":"minecraft:potion","damage":1},{"id":"minecraft:potion","damage":2},{"id":"minecraft:potion","damage":3},{"id":"minecraft:potion","damage":4},{"id":"minecraft:potion","damage":5},{"id":"minecraft:potion","damage":6},{"id":"minecraft:potion","damage":7},{"id":"minecraft:potion","damage":8},{"id":"minecraft:potion","damage":9},{"id":"minecraft:potion","damage":10},{"id":"minecraft:potion","damage":11},{"id":"minecraft:potion","damage":12},{"id":"minecraft:potion","damage":13},{"id":"minecraft:potion","damage":14},{"id":"minecraft:potion","damage":15},{"id":"minecraft:potion","damage":16},{"id":"minecraft:potion","damage":17},{"id":"minecraft:potion","damage":18},{"id":"minecraft:potion","damage":19},{"id":"minecraft:potion","damage":20},{"id":"minecraft:potion","damage":21},{"id":"minecraft:potion","damage":22},{"id":"minecraft:potion","damage":23},{"id":"minecraft:potion","damage":24},{"id":"minecraft:potion","damage":25},{"id":"minecraft:potion","damage":26},{"id":"minecraft:potion","damage":27},{"id":"minecraft:potion","damage":28},{"id":"minecraft:potion","damage":29},{"id":"minecraft:potion","damage":30},{"id":"minecraft:potion","damage":31},{"id":"minecraft:potion","damage":32},{"id":"minecraft:potion","damage":33},{"id":"minecraft:potion","damage":34},{"id":"minecraft:potion","damage":35},{"id":"minecraft:potion","damage":36},{"id":"minecraft:potion","damage":37},{"id":"minecraft:potion","damage":38},{"id":"minecraft:potion","damage":39},{"id":"minecraft:potion","damage":40},{"id":"minecraft:potion","damage":41},{"id":"minecraft:potion","damage":42},{"id":"minecraft:splash_potion"},{"id":"minecraft:splash_potion","damage":1},{"id":"minecraft:splash_potion","damage":2},{"id":"minecraft:splash_potion","damage":3},{"id":"minecraft:splash_potion","damage":4},{"id":"minecraft:splash_potion","damage":5},{"id":"minecraft:splash_potion","damage":6},{"id":"minecraft:splash_potion","damage":7},{"id":"minecraft:splash_potion","damage":8},{"id":"minecraft:splash_potion","damage":9},{"id":"minecraft:splash_potion","damage":10},{"id":"minecraft:splash_potion","damage":11},{"id":"minecraft:splash_potion","damage":12},{"id":"minecraft:splash_potion","damage":13},{"id":"minecraft:splash_potion","damage":14},{"id":"minecraft:splash_potion","damage":15},{"id":"minecraft:splash_potion","damage":16},{"id":"minecraft:splash_potion","damage":17},{"id":"minecraft:splash_potion","damage":18},{"id":"minecraft:splash_potion","damage":19},{"id":"minecraft:splash_potion","damage":20},{"id":"minecraft:splash_potion","damage":21},{"id":"minecraft:splash_potion","damage":22},{"id":"minecraft:splash_potion","damage":23},{"id":"minecraft:splash_potion","damage":24},{"id":"minecraft:splash_potion","damage":25},{"id":"minecraft:splash_potion","damage":26},{"id":"minecraft:splash_potion","damage":27},{"id":"minecraft:splash_potion","damage":28},{"id":"minecraft:splash_potion","damage":29},{"id":"minecraft:splash_potion","damage":30},{"id":"minecraft:splash_potion","damage":31},{"id":"minecraft:splash_potion","damage":32},{"id":"minecraft:splash_potion","damage":33},{"id":"minecraft:splash_potion","damage":34},{"id":"minecraft:splash_potion","damage":35},{"id":"minecraft:splash_potion","damage":36},{"id":"minecraft:splash_potion","damage":37},{"id":"minecraft:splash_potion","damage":38},{"id":"minecraft:splash_potion","damage":39},{"id":"minecraft:splash_potion","damage":40},{"id":"minecraft:splash_potion","damage":41},{"id":"minecraft:splash_potion","damage":42},{"id":"minecraft:lingering_potion"},{"id":"minecraft:lingering_potion","damage":1},{"id":"minecraft:lingering_potion","damage":2},{"id":"minecraft:lingering_potion","damage":3},{"id":"minecraft:lingering_potion","damage":4},{"id":"minecraft:lingering_potion","damage":5},{"id":"minecraft:lingering_potion","damage":6},{"id":"minecraft:lingering_potion","damage":7},{"id":"minecraft:lingering_potion","damage":8},{"id":"minecraft:lingering_potion","damage":9},{"id":"minecraft:lingering_potion","damage":10},{"id":"minecraft:lingering_potion","damage":11},{"id":"minecraft:lingering_potion","damage":12},{"id":"minecraft:lingering_potion","damage":13},{"id":"minecraft:lingering_potion","damage":14},{"id":"minecraft:lingering_potion","damage":15},{"id":"minecraft:lingering_potion","damage":16},{"id":"minecraft:lingering_potion","damage":17},{"id":"minecraft:lingering_potion","damage":18},{"id":"minecraft:lingering_potion","damage":19},{"id":"minecraft:lingering_potion","damage":20},{"id":"minecraft:lingering_potion","damage":21},{"id":"minecraft:lingering_potion","damage":22},{"id":"minecraft:lingering_potion","damage":23},{"id":"minecraft:lingering_potion","damage":24},{"id":"minecraft:lingering_potion","damage":25},{"id":"minecraft:lingering_potion","damage":26},{"id":"minecraft:lingering_potion","damage":27},{"id":"minecraft:lingering_potion","damage":28},{"id":"minecraft:lingering_potion","damage":29},{"id":"minecraft:lingering_potion","damage":30},{"id":"minecraft:lingering_potion","damage":31},{"id":"minecraft:lingering_potion","damage":32},{"id":"minecraft:lingering_potion","damage":33},{"id":"minecraft:lingering_potion","damage":34},{"id":"minecraft:lingering_potion","damage":35},{"id":"minecraft:lingering_potion","damage":36},{"id":"minecraft:lingering_potion","damage":37},{"id":"minecraft:lingering_potion","damage":38},{"id":"minecraft:lingering_potion","damage":39},{"id":"minecraft:lingering_potion","damage":40},{"id":"minecraft:lingering_potion","damage":41},{"id":"minecraft:lingering_potion","damage":42},{"id":"minecraft:spyglass"},{"id":"minecraft:stick"},{"id":"minecraft:bed"},{"id":"minecraft:bed","damage":8},{"id":"minecraft:bed","damage":7},{"id":"minecraft:bed","damage":15},{"id":"minecraft:bed","damage":12},{"id":"minecraft:bed","damage":14},{"id":"minecraft:bed","damage":1},{"id":"minecraft:bed","damage":4},{"id":"minecraft:bed","damage":5},{"id":"minecraft:bed","damage":13},{"id":"minecraft:bed","damage":9},{"id":"minecraft:bed","damage":3},{"id":"minecraft:bed","damage":11},{"id":"minecraft:bed","damage":10},{"id":"minecraft:bed","damage":2},{"id":"minecraft:bed","damage":6},{"id":"minecraft:torch","blockRuntimeId":7111},{"id":"minecraft:soul_torch","blockRuntimeId":6711},{"id":"minecraft:sea_pickle","blockRuntimeId":6571},{"id":"minecraft:lantern","blockRuntimeId":5268},{"id":"minecraft:soul_lantern","blockRuntimeId":6707},{"id":"minecraft:crafting_table","blockRuntimeId":3730},{"id":"minecraft:cartography_table","blockRuntimeId":947},{"id":"minecraft:fletching_table","blockRuntimeId":4761},{"id":"minecraft:smithing_table","blockRuntimeId":6633},{"id":"minecraft:beehive","blockRuntimeId":260},{"id":"minecraft:campfire"},{"id":"minecraft:soul_campfire"},{"id":"minecraft:furnace","blockRuntimeId":4813},{"id":"minecraft:blast_furnace","blockRuntimeId":659},{"id":"minecraft:smoker","blockRuntimeId":6634},{"id":"minecraft:respawn_anchor","blockRuntimeId":6522},{"id":"minecraft:brewing_stand"},{"id":"minecraft:anvil","blockRuntimeId":152},{"id":"minecraft:anvil","blockRuntimeId":156},{"id":"minecraft:anvil","blockRuntimeId":160},{"id":"minecraft:grindstone","blockRuntimeId":4937},{"id":"minecraft:enchanting_table","blockRuntimeId":4668},{"id":"minecraft:bookshelf","blockRuntimeId":684},{"id":"minecraft:lectern","blockRuntimeId":5339},{"id":"minecraft:cauldron"},{"id":"minecraft:composter","blockRuntimeId":3594},{"id":"minecraft:chest","blockRuntimeId":1083},{"id":"minecraft:trapped_chest","blockRuntimeId":7133},{"id":"minecraft:ender_chest","blockRuntimeId":4695},{"id":"minecraft:barrel","blockRuntimeId":201},{"id":"minecraft:undyed_shulker_box","blockRuntimeId":7216},{"id":"minecraft:shulker_box","blockRuntimeId":6584},{"id":"minecraft:shulker_box","blockRuntimeId":6592},{"id":"minecraft:shulker_box","blockRuntimeId":6591},{"id":"minecraft:shulker_box","blockRuntimeId":6599},{"id":"minecraft:shulker_box","blockRuntimeId":6596},{"id":"minecraft:shulker_box","blockRuntimeId":6598},{"id":"minecraft:shulker_box","blockRuntimeId":6585},{"id":"minecraft:shulker_box","blockRuntimeId":6588},{"id":"minecraft:shulker_box","blockRuntimeId":6589},{"id":"minecraft:shulker_box","blockRuntimeId":6597},{"id":"minecraft:shulker_box","blockRuntimeId":6593},{"id":"minecraft:shulker_box","blockRuntimeId":6587},{"id":"minecraft:shulker_box","blockRuntimeId":6595},{"id":"minecraft:shulker_box","blockRuntimeId":6594},{"id":"minecraft:shulker_box","blockRuntimeId":6586},{"id":"minecraft:shulker_box","blockRuntimeId":6590},{"id":"minecraft:armor_stand"},{"id":"minecraft:noteblock","blockRuntimeId":5579},{"id":"minecraft:jukebox","blockRuntimeId":5113},{"id":"minecraft:music_disc_13"},{"id":"minecraft:music_disc_cat"},{"id":"minecraft:music_disc_blocks"},{"id":"minecraft:music_disc_chirp"},{"id":"minecraft:music_disc_far"},{"id":"minecraft:music_disc_mall"},{"id":"minecraft:music_disc_mellohi"},{"id":"minecraft:music_disc_stal"},{"id":"minecraft:music_disc_strad"},{"id":"minecraft:music_disc_ward"},{"id":"minecraft:music_disc_11"},{"id":"minecraft:music_disc_wait"},{"id":"minecraft:music_disc_pigstep"},{"id":"minecraft:glowstone_dust"},{"id":"minecraft:glowstone","blockRuntimeId":4899},{"id":"minecraft:redstone_lamp","blockRuntimeId":6469},{"id":"minecraft:sealantern","blockRuntimeId":6582},{"id":"minecraft:oak_sign"},{"id":"minecraft:spruce_sign"},{"id":"minecraft:birch_sign"},{"id":"minecraft:jungle_sign"},{"id":"minecraft:acacia_sign"},{"id":"minecraft:dark_oak_sign"},{"id":"minecraft:crimson_sign"},{"id":"minecraft:warped_sign"},{"id":"minecraft:painting"},{"id":"minecraft:frame"},{"id":"minecraft:honey_bottle"},{"id":"minecraft:flower_pot"},{"id":"minecraft:bowl"},{"id":"minecraft:bucket"},{"id":"minecraft:milk_bucket"},{"id":"minecraft:water_bucket"},{"id":"minecraft:lava_bucket"},{"id":"minecraft:cod_bucket"},{"id":"minecraft:salmon_bucket"},{"id":"minecraft:tropical_fish_bucket"},{"id":"minecraft:pufferfish_bucket"},{"id":"minecraft:powder_snow_bucket"},{"id":"minecraft:axolotl_bucket"},{"id":"minecraft:glow_frame"},{"id":"minecraft:skull","damage":3},{"id":"minecraft:skull","damage":2},{"id":"minecraft:skull","damage":4},{"id":"minecraft:skull","damage":5},{"id":"minecraft:skull"},{"id":"minecraft:skull","damage":1},{"id":"minecraft:beacon","blockRuntimeId":217},{"id":"minecraft:bell","blockRuntimeId":292},{"id":"minecraft:conduit","blockRuntimeId":3635},{"id":"minecraft:stonecutter_block","blockRuntimeId":7049},{"id":"minecraft:end_portal_frame","blockRuntimeId":4680},{"id":"minecraft:coal"},{"id":"minecraft:charcoal"},{"id":"minecraft:diamond"},{"id":"minecraft:iron_nugget"},{"id":"minecraft:raw_iron"},{"id":"minecraft:raw_gold"},{"id":"minecraft:raw_copper"},{"id":"minecraft:copper_ingot"},{"id":"minecraft:iron_ingot"},{"id":"minecraft:netherite_scrap"},{"id":"minecraft:netherite_ingot"},{"id":"minecraft:gold_nugget"},{"id":"minecraft:gold_ingot"},{"id":"minecraft:emerald"},{"id":"minecraft:quartz"},{"id":"minecraft:clay_ball"},{"id":"minecraft:brick"},{"id":"minecraft:netherbrick"},{"id":"minecraft:prismarine_shard"},{"id":"minecraft:amethyst_shard"},{"id":"minecraft:prismarine_crystals"},{"id":"minecraft:nautilus_shell"},{"id":"minecraft:heart_of_the_sea"},{"id":"minecraft:scute"},{"id":"minecraft:phantom_membrane"},{"id":"minecraft:string"},{"id":"minecraft:feather"},{"id":"minecraft:flint"},{"id":"minecraft:gunpowder"},{"id":"minecraft:leather"},{"id":"minecraft:rabbit_hide"},{"id":"minecraft:rabbit_foot"},{"id":"minecraft:fire_charge"},{"id":"minecraft:blaze_rod"},{"id":"minecraft:blaze_powder"},{"id":"minecraft:magma_cream"},{"id":"minecraft:fermented_spider_eye"},{"id":"minecraft:dragon_breath"},{"id":"minecraft:shulker_shell"},{"id":"minecraft:ghast_tear"},{"id":"minecraft:slime_ball"},{"id":"minecraft:ender_pearl"},{"id":"minecraft:ender_eye"},{"id":"minecraft:nether_star"},{"id":"minecraft:end_rod","blockRuntimeId":4688},{"id":"minecraft:lightning_rod","blockRuntimeId":5401},{"id":"minecraft:end_crystal"},{"id":"minecraft:paper"},{"id":"minecraft:book"},{"id":"minecraft:writable_book"},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA="},{"id":"minecraft:oak_boat"},{"id":"minecraft:spruce_boat"},{"id":"minecraft:birch_boat"},{"id":"minecraft:jungle_boat"},{"id":"minecraft:acacia_boat"},{"id":"minecraft:dark_oak_boat"},{"id":"minecraft:rail","blockRuntimeId":6400},{"id":"minecraft:golden_rail","blockRuntimeId":4902},{"id":"minecraft:detector_rail","blockRuntimeId":4411},{"id":"minecraft:activator_rail","blockRuntimeId":122},{"id":"minecraft:minecart"},{"id":"minecraft:chest_minecart"},{"id":"minecraft:hopper_minecart"},{"id":"minecraft:tnt_minecart"},{"id":"minecraft:redstone"},{"id":"minecraft:redstone_block","blockRuntimeId":6468},{"id":"minecraft:redstone_torch","blockRuntimeId":6471},{"id":"minecraft:lever","blockRuntimeId":5347},{"id":"minecraft:wooden_button","blockRuntimeId":7587},{"id":"minecraft:spruce_button","blockRuntimeId":6720},{"id":"minecraft:birch_button","blockRuntimeId":356},{"id":"minecraft:jungle_button","blockRuntimeId":5114},{"id":"minecraft:acacia_button"},{"id":"minecraft:dark_oak_button","blockRuntimeId":3886},{"id":"minecraft:stone_button","blockRuntimeId":6949},{"id":"minecraft:crimson_button","blockRuntimeId":3731},{"id":"minecraft:warped_button","blockRuntimeId":7284},{"id":"minecraft:polished_blackstone_button","blockRuntimeId":5844},{"id":"minecraft:tripwire_hook","blockRuntimeId":7155},{"id":"minecraft:wooden_pressure_plate","blockRuntimeId":7631},{"id":"minecraft:spruce_pressure_plate","blockRuntimeId":6780},{"id":"minecraft:birch_pressure_plate","blockRuntimeId":416},{"id":"minecraft:jungle_pressure_plate","blockRuntimeId":5174},{"id":"minecraft:acacia_pressure_plate","blockRuntimeId":60},{"id":"minecraft:dark_oak_pressure_plate","blockRuntimeId":3946},{"id":"minecraft:crimson_pressure_plate","blockRuntimeId":3800},{"id":"minecraft:warped_pressure_plate","blockRuntimeId":7353},{"id":"minecraft:stone_pressure_plate","blockRuntimeId":6961},{"id":"minecraft:light_weighted_pressure_plate","blockRuntimeId":5385},{"id":"minecraft:heavy_weighted_pressure_plate","blockRuntimeId":5001},{"id":"minecraft:polished_blackstone_pressure_plate","blockRuntimeId":5858},{"id":"minecraft:observer","blockRuntimeId":5588},{"id":"minecraft:daylight_detector","blockRuntimeId":4016},{"id":"minecraft:repeater"},{"id":"minecraft:comparator"},{"id":"minecraft:hopper"},{"id":"minecraft:dropper","blockRuntimeId":4538},{"id":"minecraft:dispenser","blockRuntimeId":4439},{"id":"minecraft:piston","blockRuntimeId":5629},{"id":"minecraft:sticky_piston","blockRuntimeId":6923},{"id":"minecraft:tnt","blockRuntimeId":7107},{"id":"minecraft:name_tag"},{"id":"minecraft:loom","blockRuntimeId":5457},{"id":"minecraft:banner"},{"id":"minecraft:banner","damage":8},{"id":"minecraft:banner","damage":7},{"id":"minecraft:banner","damage":15},{"id":"minecraft:banner","damage":12},{"id":"minecraft:banner","damage":14},{"id":"minecraft:banner","damage":1},{"id":"minecraft:banner","damage":4},{"id":"minecraft:banner","damage":5},{"id":"minecraft:banner","damage":13},{"id":"minecraft:banner","damage":9},{"id":"minecraft:banner","damage":3},{"id":"minecraft:banner","damage":11},{"id":"minecraft:banner","damage":10},{"id":"minecraft:banner","damage":2},{"id":"minecraft:banner","damage":6},{"id":"minecraft:banner","damage":15,"nbt_b64":"CgAAAwQAVHlwZQEAAAAA"},{"id":"minecraft:creeper_banner_pattern"},{"id":"minecraft:skull_banner_pattern"},{"id":"minecraft:flower_banner_pattern"},{"id":"minecraft:mojang_banner_pattern"},{"id":"minecraft:field_masoned_banner_pattern"},{"id":"minecraft:bordure_indented_banner_pattern"},{"id":"minecraft:piglin_banner_pattern"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_star","nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA="},{"id":"minecraft:firework_star","damage":8,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA="},{"id":"minecraft:firework_star","damage":7,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA="},{"id":"minecraft:firework_star","damage":15,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA="},{"id":"minecraft:firework_star","damage":12,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA="},{"id":"minecraft:firework_star","damage":14,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA="},{"id":"minecraft:firework_star","damage":1,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA="},{"id":"minecraft:firework_star","damage":4,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA="},{"id":"minecraft:firework_star","damage":5,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA="},{"id":"minecraft:firework_star","damage":13,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA="},{"id":"minecraft:firework_star","damage":9,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA="},{"id":"minecraft:firework_star","damage":3,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA="},{"id":"minecraft:firework_star","damage":11,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA="},{"id":"minecraft:firework_star","damage":10,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA="},{"id":"minecraft:firework_star","damage":2,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA="},{"id":"minecraft:firework_star","damage":6,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA="},{"id":"minecraft:chain"},{"id":"minecraft:target","blockRuntimeId":7105},{"id":"minecraft:lodestone_compass"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems448.json b/src/main/resources/creativeitems448.json deleted file mode 100644 index 130f86d06..000000000 --- a/src/main/resources/creativeitems448.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":"minecraft:planks","blockRuntimeId":5770},{"id":"minecraft:planks","blockRuntimeId":5771},{"id":"minecraft:planks","blockRuntimeId":5772},{"id":"minecraft:planks","blockRuntimeId":5773},{"id":"minecraft:planks","blockRuntimeId":5774},{"id":"minecraft:planks","blockRuntimeId":5775},{"id":"minecraft:crimson_planks","blockRuntimeId":3839},{"id":"minecraft:warped_planks","blockRuntimeId":7502},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1318},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1319},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1320},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1321},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1322},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1323},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1330},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1325},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1326},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1324},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1327},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1331},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1328},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1329},{"id":"minecraft:blackstone_wall","blockRuntimeId":507},{"id":"minecraft:polished_blackstone_wall","blockRuntimeId":6014},{"id":"minecraft:polished_blackstone_brick_wall","blockRuntimeId":5811},{"id":"minecraft:cobbled_deepslate_wall","blockRuntimeId":1155},{"id":"minecraft:deepslate_tile_wall","blockRuntimeId":4297},{"id":"minecraft:polished_deepslate_wall","blockRuntimeId":6189},{"id":"minecraft:deepslate_brick_wall","blockRuntimeId":4114},{"id":"minecraft:fence","blockRuntimeId":4773},{"id":"minecraft:fence","blockRuntimeId":4774},{"id":"minecraft:fence","blockRuntimeId":4775},{"id":"minecraft:fence","blockRuntimeId":4776},{"id":"minecraft:fence","blockRuntimeId":4777},{"id":"minecraft:fence","blockRuntimeId":4778},{"id":"minecraft:nether_brick_fence","blockRuntimeId":5662},{"id":"minecraft:crimson_fence","blockRuntimeId":3817},{"id":"minecraft:warped_fence","blockRuntimeId":7480},{"id":"minecraft:fence_gate","blockRuntimeId":4779},{"id":"minecraft:spruce_fence_gate","blockRuntimeId":6914},{"id":"minecraft:birch_fence_gate","blockRuntimeId":400},{"id":"minecraft:jungle_fence_gate","blockRuntimeId":5228},{"id":"minecraft:acacia_fence_gate","blockRuntimeId":44},{"id":"minecraft:dark_oak_fence_gate","blockRuntimeId":3980},{"id":"minecraft:crimson_fence_gate","blockRuntimeId":3818},{"id":"minecraft:warped_fence_gate","blockRuntimeId":7481},{"id":"minecraft:normal_stone_stairs","blockRuntimeId":5681},{"id":"minecraft:stone_stairs","blockRuntimeId":7185},{"id":"minecraft:mossy_cobblestone_stairs","blockRuntimeId":5643},{"id":"minecraft:oak_stairs","blockRuntimeId":5690},{"id":"minecraft:spruce_stairs","blockRuntimeId":6946},{"id":"minecraft:birch_stairs","blockRuntimeId":432},{"id":"minecraft:jungle_stairs","blockRuntimeId":5260},{"id":"minecraft:acacia_stairs","blockRuntimeId":76},{"id":"minecraft:dark_oak_stairs","blockRuntimeId":4012},{"id":"minecraft:stone_brick_stairs","blockRuntimeId":7091},{"id":"minecraft:mossy_stone_brick_stairs","blockRuntimeId":5651},{"id":"minecraft:sandstone_stairs","blockRuntimeId":6683},{"id":"minecraft:smooth_sandstone_stairs","blockRuntimeId":6807},{"id":"minecraft:red_sandstone_stairs","blockRuntimeId":6610},{"id":"minecraft:smooth_red_sandstone_stairs","blockRuntimeId":6799},{"id":"minecraft:granite_stairs","blockRuntimeId":4964},{"id":"minecraft:polished_granite_stairs","blockRuntimeId":6359},{"id":"minecraft:diorite_stairs","blockRuntimeId":4475},{"id":"minecraft:polished_diorite_stairs","blockRuntimeId":6351},{"id":"minecraft:andesite_stairs","blockRuntimeId":144},{"id":"minecraft:polished_andesite_stairs","blockRuntimeId":5787},{"id":"minecraft:brick_stairs","blockRuntimeId":876},{"id":"minecraft:nether_brick_stairs","blockRuntimeId":5663},{"id":"minecraft:red_nether_brick_stairs","blockRuntimeId":6598},{"id":"minecraft:end_brick_stairs","blockRuntimeId":4719},{"id":"minecraft:quartz_stairs","blockRuntimeId":6532},{"id":"minecraft:smooth_quartz_stairs","blockRuntimeId":6791},{"id":"minecraft:purpur_stairs","blockRuntimeId":6510},{"id":"minecraft:prismarine_stairs","blockRuntimeId":6422},{"id":"minecraft:dark_prismarine_stairs","blockRuntimeId":4036},{"id":"minecraft:prismarine_bricks_stairs","blockRuntimeId":6414},{"id":"minecraft:crimson_stairs","blockRuntimeId":3859},{"id":"minecraft:warped_stairs","blockRuntimeId":7522},{"id":"minecraft:blackstone_stairs","blockRuntimeId":499},{"id":"minecraft:polished_blackstone_stairs","blockRuntimeId":6006},{"id":"minecraft:polished_blackstone_brick_stairs","blockRuntimeId":5803},{"id":"minecraft:cut_copper_stairs","blockRuntimeId":3912},{"id":"minecraft:exposed_cut_copper_stairs","blockRuntimeId":4755},{"id":"minecraft:weathered_cut_copper_stairs","blockRuntimeId":7649},{"id":"minecraft:oxidized_cut_copper_stairs","blockRuntimeId":5731},{"id":"minecraft:waxed_cut_copper_stairs","blockRuntimeId":7593},{"id":"minecraft:waxed_exposed_cut_copper_stairs","blockRuntimeId":7607},{"id":"minecraft:waxed_weathered_cut_copper_stairs","blockRuntimeId":7635},{"id":"minecraft:waxed_oxidized_cut_copper_stairs","blockRuntimeId":7621},{"id":"minecraft:cobbled_deepslate_stairs","blockRuntimeId":1147},{"id":"minecraft:deepslate_tile_stairs","blockRuntimeId":4289},{"id":"minecraft:polished_deepslate_stairs","blockRuntimeId":6181},{"id":"minecraft:deepslate_brick_stairs","blockRuntimeId":4106},{"id":"minecraft:wooden_door"},{"id":"minecraft:spruce_door"},{"id":"minecraft:birch_door"},{"id":"minecraft:jungle_door"},{"id":"minecraft:acacia_door"},{"id":"minecraft:dark_oak_door"},{"id":"minecraft:iron_door"},{"id":"minecraft:crimson_door"},{"id":"minecraft:warped_door"},{"id":"minecraft:trapdoor","blockRuntimeId":7267},{"id":"minecraft:spruce_trapdoor","blockRuntimeId":6970},{"id":"minecraft:birch_trapdoor","blockRuntimeId":456},{"id":"minecraft:jungle_trapdoor","blockRuntimeId":5284},{"id":"minecraft:acacia_trapdoor","blockRuntimeId":100},{"id":"minecraft:dark_oak_trapdoor","blockRuntimeId":4020},{"id":"minecraft:iron_trapdoor","blockRuntimeId":5143},{"id":"minecraft:crimson_trapdoor","blockRuntimeId":3886},{"id":"minecraft:warped_trapdoor","blockRuntimeId":7549},{"id":"minecraft:iron_bars","blockRuntimeId":5108},{"id":"minecraft:glass","blockRuntimeId":4870},{"id":"minecraft:stained_glass","blockRuntimeId":6992},{"id":"minecraft:stained_glass","blockRuntimeId":7000},{"id":"minecraft:stained_glass","blockRuntimeId":6999},{"id":"minecraft:stained_glass","blockRuntimeId":7007},{"id":"minecraft:stained_glass","blockRuntimeId":7004},{"id":"minecraft:stained_glass","blockRuntimeId":7006},{"id":"minecraft:stained_glass","blockRuntimeId":6993},{"id":"minecraft:stained_glass","blockRuntimeId":6996},{"id":"minecraft:stained_glass","blockRuntimeId":6997},{"id":"minecraft:stained_glass","blockRuntimeId":7005},{"id":"minecraft:stained_glass","blockRuntimeId":7001},{"id":"minecraft:stained_glass","blockRuntimeId":6995},{"id":"minecraft:stained_glass","blockRuntimeId":7003},{"id":"minecraft:stained_glass","blockRuntimeId":7002},{"id":"minecraft:stained_glass","blockRuntimeId":6994},{"id":"minecraft:stained_glass","blockRuntimeId":6998},{"id":"minecraft:tinted_glass","blockRuntimeId":7256},{"id":"minecraft:glass_pane","blockRuntimeId":4871},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7008},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7016},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7015},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7023},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7020},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7022},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7009},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7012},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7013},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7021},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7017},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7011},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7019},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7018},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7010},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7014},{"id":"minecraft:ladder","blockRuntimeId":5332},{"id":"minecraft:scaffolding","blockRuntimeId":6703},{"id":"minecraft:double_stone_slab","blockRuntimeId":7127},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7177},{"id":"minecraft:double_stone_slab","blockRuntimeId":7130},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7148},{"id":"minecraft:wooden_slab","blockRuntimeId":7807},{"id":"minecraft:wooden_slab","blockRuntimeId":7808},{"id":"minecraft:wooden_slab","blockRuntimeId":7809},{"id":"minecraft:wooden_slab","blockRuntimeId":7810},{"id":"minecraft:wooden_slab","blockRuntimeId":7811},{"id":"minecraft:wooden_slab","blockRuntimeId":7812},{"id":"minecraft:double_stone_slab","blockRuntimeId":7132},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7175},{"id":"minecraft:double_stone_slab","blockRuntimeId":7128},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7178},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7149},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7143},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7179},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7160},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7165},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7166},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7163},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7164},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7162},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7161},{"id":"minecraft:double_stone_slab","blockRuntimeId":7131},{"id":"minecraft:double_stone_slab","blockRuntimeId":7134},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7150},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7159},{"id":"minecraft:double_stone_slab","blockRuntimeId":7133},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7176},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7144},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7145},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7146},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7147},{"id":"minecraft:crimson_slab","blockRuntimeId":3857},{"id":"minecraft:warped_slab","blockRuntimeId":7520},{"id":"minecraft:blackstone_slab","blockRuntimeId":497},{"id":"minecraft:polished_blackstone_slab","blockRuntimeId":6004},{"id":"minecraft:polished_blackstone_brick_slab","blockRuntimeId":5801},{"id":"minecraft:cut_copper_slab","blockRuntimeId":3910},{"id":"minecraft:exposed_cut_copper_slab","blockRuntimeId":4753},{"id":"minecraft:weathered_cut_copper_slab","blockRuntimeId":7647},{"id":"minecraft:oxidized_cut_copper_slab","blockRuntimeId":5729},{"id":"minecraft:waxed_cut_copper_slab","blockRuntimeId":7591},{"id":"minecraft:waxed_exposed_cut_copper_slab","blockRuntimeId":7605},{"id":"minecraft:waxed_weathered_cut_copper_slab","blockRuntimeId":7633},{"id":"minecraft:waxed_oxidized_cut_copper_slab","blockRuntimeId":7619},{"id":"minecraft:cobbled_deepslate_slab","blockRuntimeId":1145},{"id":"minecraft:polished_deepslate_slab","blockRuntimeId":6179},{"id":"minecraft:deepslate_tile_slab","blockRuntimeId":4287},{"id":"minecraft:deepslate_brick_slab","blockRuntimeId":4104},{"id":"minecraft:brick_block","blockRuntimeId":875},{"id":"minecraft:chiseled_nether_bricks","blockRuntimeId":1130},{"id":"minecraft:cracked_nether_bricks","blockRuntimeId":3768},{"id":"minecraft:quartz_bricks","blockRuntimeId":6530},{"id":"minecraft:stonebrick","blockRuntimeId":7193},{"id":"minecraft:stonebrick","blockRuntimeId":7194},{"id":"minecraft:stonebrick","blockRuntimeId":7195},{"id":"minecraft:stonebrick","blockRuntimeId":7196},{"id":"minecraft:end_bricks","blockRuntimeId":4727},{"id":"minecraft:prismarine","blockRuntimeId":6413},{"id":"minecraft:polished_blackstone_bricks","blockRuntimeId":5973},{"id":"minecraft:cracked_polished_blackstone_bricks","blockRuntimeId":3769},{"id":"minecraft:gilded_blackstone","blockRuntimeId":4869},{"id":"minecraft:chiseled_polished_blackstone","blockRuntimeId":1131},{"id":"minecraft:deepslate_tiles","blockRuntimeId":4459},{"id":"minecraft:cracked_deepslate_tiles","blockRuntimeId":3767},{"id":"minecraft:deepslate_bricks","blockRuntimeId":4276},{"id":"minecraft:cracked_deepslate_bricks","blockRuntimeId":3766},{"id":"minecraft:chiseled_deepslate","blockRuntimeId":1129},{"id":"minecraft:cobblestone","blockRuntimeId":1317},{"id":"minecraft:mossy_cobblestone","blockRuntimeId":5642},{"id":"minecraft:cobbled_deepslate","blockRuntimeId":1142},{"id":"minecraft:smooth_stone","blockRuntimeId":6815},{"id":"minecraft:sandstone","blockRuntimeId":6679},{"id":"minecraft:sandstone","blockRuntimeId":6680},{"id":"minecraft:sandstone","blockRuntimeId":6681},{"id":"minecraft:sandstone","blockRuntimeId":6682},{"id":"minecraft:red_sandstone","blockRuntimeId":6606},{"id":"minecraft:red_sandstone","blockRuntimeId":6607},{"id":"minecraft:red_sandstone","blockRuntimeId":6608},{"id":"minecraft:red_sandstone","blockRuntimeId":6609},{"id":"minecraft:coal_block","blockRuntimeId":1140},{"id":"minecraft:dried_kelp_block","blockRuntimeId":4583},{"id":"minecraft:gold_block","blockRuntimeId":4950},{"id":"minecraft:iron_block","blockRuntimeId":5109},{"id":"minecraft:copper_block","blockRuntimeId":3676},{"id":"minecraft:exposed_copper","blockRuntimeId":4751},{"id":"minecraft:weathered_copper","blockRuntimeId":7645},{"id":"minecraft:oxidized_copper","blockRuntimeId":5727},{"id":"minecraft:waxed_copper","blockRuntimeId":7589},{"id":"minecraft:waxed_exposed_copper","blockRuntimeId":7603},{"id":"minecraft:waxed_weathered_copper","blockRuntimeId":7631},{"id":"minecraft:waxed_oxidized_copper","blockRuntimeId":7617},{"id":"minecraft:cut_copper","blockRuntimeId":3909},{"id":"minecraft:exposed_cut_copper","blockRuntimeId":4752},{"id":"minecraft:weathered_cut_copper","blockRuntimeId":7646},{"id":"minecraft:oxidized_cut_copper","blockRuntimeId":5728},{"id":"minecraft:waxed_cut_copper","blockRuntimeId":7590},{"id":"minecraft:waxed_exposed_cut_copper","blockRuntimeId":7604},{"id":"minecraft:waxed_weathered_cut_copper","blockRuntimeId":7632},{"id":"minecraft:waxed_oxidized_cut_copper","blockRuntimeId":7618},{"id":"minecraft:emerald_block","blockRuntimeId":4716},{"id":"minecraft:diamond_block","blockRuntimeId":4473},{"id":"minecraft:lapis_block","blockRuntimeId":5340},{"id":"minecraft:raw_iron_block","blockRuntimeId":6552},{"id":"minecraft:raw_copper_block","blockRuntimeId":6550},{"id":"minecraft:raw_gold_block","blockRuntimeId":6551},{"id":"minecraft:quartz_block","blockRuntimeId":6518},{"id":"minecraft:quartz_block","blockRuntimeId":6520},{"id":"minecraft:quartz_block","blockRuntimeId":6519},{"id":"minecraft:quartz_block","blockRuntimeId":6521},{"id":"minecraft:prismarine","blockRuntimeId":6411},{"id":"minecraft:prismarine","blockRuntimeId":6412},{"id":"minecraft:slime","blockRuntimeId":6768},{"id":"minecraft:honey_block","blockRuntimeId":5087},{"id":"minecraft:honeycomb_block","blockRuntimeId":5088},{"id":"minecraft:hay_block","blockRuntimeId":5059},{"id":"minecraft:bone_block","blockRuntimeId":692},{"id":"minecraft:nether_brick","blockRuntimeId":5661},{"id":"minecraft:red_nether_brick","blockRuntimeId":6597},{"id":"minecraft:netherite_block","blockRuntimeId":5678},{"id":"minecraft:lodestone","blockRuntimeId":5538},{"id":"minecraft:wool","blockRuntimeId":7819},{"id":"minecraft:wool","blockRuntimeId":7827},{"id":"minecraft:wool","blockRuntimeId":7826},{"id":"minecraft:wool","blockRuntimeId":7834},{"id":"minecraft:wool","blockRuntimeId":7831},{"id":"minecraft:wool","blockRuntimeId":7833},{"id":"minecraft:wool","blockRuntimeId":7820},{"id":"minecraft:wool","blockRuntimeId":7823},{"id":"minecraft:wool","blockRuntimeId":7824},{"id":"minecraft:wool","blockRuntimeId":7832},{"id":"minecraft:wool","blockRuntimeId":7828},{"id":"minecraft:wool","blockRuntimeId":7822},{"id":"minecraft:wool","blockRuntimeId":7830},{"id":"minecraft:wool","blockRuntimeId":7829},{"id":"minecraft:wool","blockRuntimeId":7821},{"id":"minecraft:wool","blockRuntimeId":7825},{"id":"minecraft:carpet","blockRuntimeId":963},{"id":"minecraft:carpet","blockRuntimeId":971},{"id":"minecraft:carpet","blockRuntimeId":970},{"id":"minecraft:carpet","blockRuntimeId":978},{"id":"minecraft:carpet","blockRuntimeId":975},{"id":"minecraft:carpet","blockRuntimeId":977},{"id":"minecraft:carpet","blockRuntimeId":964},{"id":"minecraft:carpet","blockRuntimeId":967},{"id":"minecraft:carpet","blockRuntimeId":968},{"id":"minecraft:carpet","blockRuntimeId":976},{"id":"minecraft:carpet","blockRuntimeId":972},{"id":"minecraft:carpet","blockRuntimeId":966},{"id":"minecraft:carpet","blockRuntimeId":974},{"id":"minecraft:carpet","blockRuntimeId":973},{"id":"minecraft:carpet","blockRuntimeId":965},{"id":"minecraft:carpet","blockRuntimeId":969},{"id":"minecraft:concrete_powder","blockRuntimeId":3659},{"id":"minecraft:concrete_powder","blockRuntimeId":3667},{"id":"minecraft:concrete_powder","blockRuntimeId":3666},{"id":"minecraft:concrete_powder","blockRuntimeId":3674},{"id":"minecraft:concrete_powder","blockRuntimeId":3671},{"id":"minecraft:concrete_powder","blockRuntimeId":3673},{"id":"minecraft:concrete_powder","blockRuntimeId":3660},{"id":"minecraft:concrete_powder","blockRuntimeId":3663},{"id":"minecraft:concrete_powder","blockRuntimeId":3664},{"id":"minecraft:concrete_powder","blockRuntimeId":3672},{"id":"minecraft:concrete_powder","blockRuntimeId":3668},{"id":"minecraft:concrete_powder","blockRuntimeId":3662},{"id":"minecraft:concrete_powder","blockRuntimeId":3670},{"id":"minecraft:concrete_powder","blockRuntimeId":3669},{"id":"minecraft:concrete_powder","blockRuntimeId":3661},{"id":"minecraft:concrete_powder","blockRuntimeId":3665},{"id":"minecraft:concrete","blockRuntimeId":3643},{"id":"minecraft:concrete","blockRuntimeId":3651},{"id":"minecraft:concrete","blockRuntimeId":3650},{"id":"minecraft:concrete","blockRuntimeId":3658},{"id":"minecraft:concrete","blockRuntimeId":3655},{"id":"minecraft:concrete","blockRuntimeId":3657},{"id":"minecraft:concrete","blockRuntimeId":3644},{"id":"minecraft:concrete","blockRuntimeId":3647},{"id":"minecraft:concrete","blockRuntimeId":3648},{"id":"minecraft:concrete","blockRuntimeId":3656},{"id":"minecraft:concrete","blockRuntimeId":3652},{"id":"minecraft:concrete","blockRuntimeId":3646},{"id":"minecraft:concrete","blockRuntimeId":3654},{"id":"minecraft:concrete","blockRuntimeId":3653},{"id":"minecraft:concrete","blockRuntimeId":3645},{"id":"minecraft:concrete","blockRuntimeId":3649},{"id":"minecraft:clay","blockRuntimeId":1139},{"id":"minecraft:hardened_clay","blockRuntimeId":5058},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7024},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7032},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7031},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7039},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7036},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7038},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7025},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7028},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7029},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7037},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7033},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7027},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7035},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7034},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7026},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7030},{"id":"minecraft:white_glazed_terracotta","blockRuntimeId":7704},{"id":"minecraft:silver_glazed_terracotta","blockRuntimeId":6750},{"id":"minecraft:gray_glazed_terracotta","blockRuntimeId":4985},{"id":"minecraft:black_glazed_terracotta","blockRuntimeId":488},{"id":"minecraft:brown_glazed_terracotta","blockRuntimeId":894},{"id":"minecraft:red_glazed_terracotta","blockRuntimeId":6574},{"id":"minecraft:orange_glazed_terracotta","blockRuntimeId":5721},{"id":"minecraft:yellow_glazed_terracotta","blockRuntimeId":7846},{"id":"minecraft:lime_glazed_terracotta","blockRuntimeId":5507},{"id":"minecraft:green_glazed_terracotta","blockRuntimeId":5001},{"id":"minecraft:cyan_glazed_terracotta","blockRuntimeId":3930},{"id":"minecraft:light_blue_glazed_terracotta","blockRuntimeId":5459},{"id":"minecraft:blue_glazed_terracotta","blockRuntimeId":685},{"id":"minecraft:purple_glazed_terracotta","blockRuntimeId":6492},{"id":"minecraft:magenta_glazed_terracotta","blockRuntimeId":5571},{"id":"minecraft:pink_glazed_terracotta","blockRuntimeId":5752},{"id":"minecraft:purpur_block","blockRuntimeId":6498},{"id":"minecraft:purpur_block","blockRuntimeId":6500},{"id":"minecraft:nether_wart_block","blockRuntimeId":5677},{"id":"minecraft:warped_wart_block","blockRuntimeId":7571},{"id":"minecraft:shroomlight","blockRuntimeId":6733},{"id":"minecraft:crimson_nylium","blockRuntimeId":3838},{"id":"minecraft:warped_nylium","blockRuntimeId":7501},{"id":"minecraft:basalt","blockRuntimeId":214},{"id":"minecraft:polished_basalt","blockRuntimeId":5795},{"id":"minecraft:smooth_basalt","blockRuntimeId":6790},{"id":"minecraft:soul_soil","blockRuntimeId":6860},{"id":"minecraft:dirt","blockRuntimeId":4483},{"id":"minecraft:dirt","blockRuntimeId":4484},{"id":"minecraft:farmland","blockRuntimeId":4765},{"id":"minecraft:grass","blockRuntimeId":4972},{"id":"minecraft:grass_path","blockRuntimeId":4973},{"id":"minecraft:podzol","blockRuntimeId":5776},{"id":"minecraft:mycelium","blockRuntimeId":5660},{"id":"minecraft:stone","blockRuntimeId":7084},{"id":"minecraft:iron_ore","blockRuntimeId":5142},{"id":"minecraft:gold_ore","blockRuntimeId":4951},{"id":"minecraft:diamond_ore","blockRuntimeId":4474},{"id":"minecraft:lapis_ore","blockRuntimeId":5341},{"id":"minecraft:redstone_ore","blockRuntimeId":6620},{"id":"minecraft:coal_ore","blockRuntimeId":1141},{"id":"minecraft:copper_ore","blockRuntimeId":3677},{"id":"minecraft:emerald_ore","blockRuntimeId":4717},{"id":"minecraft:quartz_ore","blockRuntimeId":6531},{"id":"minecraft:nether_gold_ore","blockRuntimeId":5671},{"id":"minecraft:ancient_debris","blockRuntimeId":143},{"id":"minecraft:deepslate_iron_ore","blockRuntimeId":4282},{"id":"minecraft:deepslate_gold_ore","blockRuntimeId":4281},{"id":"minecraft:deepslate_diamond_ore","blockRuntimeId":4279},{"id":"minecraft:deepslate_lapis_ore","blockRuntimeId":4283},{"id":"minecraft:deepslate_redstone_ore","blockRuntimeId":4284},{"id":"minecraft:deepslate_emerald_ore","blockRuntimeId":4280},{"id":"minecraft:deepslate_coal_ore","blockRuntimeId":4277},{"id":"minecraft:deepslate_copper_ore","blockRuntimeId":4278},{"id":"minecraft:gravel","blockRuntimeId":4974},{"id":"minecraft:stone","blockRuntimeId":7085},{"id":"minecraft:stone","blockRuntimeId":7087},{"id":"minecraft:stone","blockRuntimeId":7089},{"id":"minecraft:blackstone","blockRuntimeId":494},{"id":"minecraft:deepslate","blockRuntimeId":4099},{"id":"minecraft:stone","blockRuntimeId":7086},{"id":"minecraft:stone","blockRuntimeId":7088},{"id":"minecraft:stone","blockRuntimeId":7090},{"id":"minecraft:polished_blackstone","blockRuntimeId":5798},{"id":"minecraft:polished_deepslate","blockRuntimeId":6176},{"id":"minecraft:sand","blockRuntimeId":6677},{"id":"minecraft:sand","blockRuntimeId":6678},{"id":"minecraft:cactus","blockRuntimeId":920},{"id":"minecraft:log","blockRuntimeId":5539},{"id":"minecraft:stripped_oak_log","blockRuntimeId":7223},{"id":"minecraft:log","blockRuntimeId":5540},{"id":"minecraft:stripped_spruce_log","blockRuntimeId":7226},{"id":"minecraft:log","blockRuntimeId":5541},{"id":"minecraft:stripped_birch_log","blockRuntimeId":7208},{"id":"minecraft:log","blockRuntimeId":5542},{"id":"minecraft:stripped_jungle_log","blockRuntimeId":7220},{"id":"minecraft:log2","blockRuntimeId":5551},{"id":"minecraft:stripped_acacia_log","blockRuntimeId":7205},{"id":"minecraft:log2","blockRuntimeId":5552},{"id":"minecraft:stripped_dark_oak_log","blockRuntimeId":7217},{"id":"minecraft:crimson_stem","blockRuntimeId":3883},{"id":"minecraft:stripped_crimson_stem","blockRuntimeId":7214},{"id":"minecraft:warped_stem","blockRuntimeId":7546},{"id":"minecraft:stripped_warped_stem","blockRuntimeId":7232},{"id":"minecraft:wood","blockRuntimeId":7711},{"id":"minecraft:wood","blockRuntimeId":7717},{"id":"minecraft:wood","blockRuntimeId":7712},{"id":"minecraft:wood","blockRuntimeId":7718},{"id":"minecraft:wood","blockRuntimeId":7713},{"id":"minecraft:wood","blockRuntimeId":7719},{"id":"minecraft:wood","blockRuntimeId":7714},{"id":"minecraft:wood","blockRuntimeId":7720},{"id":"minecraft:wood","blockRuntimeId":7715},{"id":"minecraft:wood","blockRuntimeId":7721},{"id":"minecraft:wood","blockRuntimeId":7716},{"id":"minecraft:wood","blockRuntimeId":7722},{"id":"minecraft:crimson_hyphae","blockRuntimeId":3835},{"id":"minecraft:stripped_crimson_hyphae","blockRuntimeId":7211},{"id":"minecraft:warped_hyphae","blockRuntimeId":7498},{"id":"minecraft:stripped_warped_hyphae","blockRuntimeId":7229},{"id":"minecraft:leaves","blockRuntimeId":5385},{"id":"minecraft:leaves","blockRuntimeId":5386},{"id":"minecraft:leaves","blockRuntimeId":5387},{"id":"minecraft:leaves","blockRuntimeId":5388},{"id":"minecraft:leaves2","blockRuntimeId":5401},{"id":"minecraft:leaves2","blockRuntimeId":5402},{"id":"minecraft:azalea_leaves","blockRuntimeId":169},{"id":"minecraft:azalea_leaves_flowered","blockRuntimeId":173},{"id":"minecraft:sapling","blockRuntimeId":6691},{"id":"minecraft:sapling","blockRuntimeId":6692},{"id":"minecraft:sapling","blockRuntimeId":6693},{"id":"minecraft:sapling","blockRuntimeId":6694},{"id":"minecraft:sapling","blockRuntimeId":6695},{"id":"minecraft:sapling","blockRuntimeId":6696},{"id":"minecraft:bee_nest","blockRuntimeId":236},{"id":"minecraft:wheat_seeds"},{"id":"minecraft:pumpkin_seeds"},{"id":"minecraft:melon_seeds"},{"id":"minecraft:beetroot_seeds"},{"id":"minecraft:wheat"},{"id":"minecraft:beetroot"},{"id":"minecraft:potato"},{"id":"minecraft:poisonous_potato"},{"id":"minecraft:carrot"},{"id":"minecraft:golden_carrot"},{"id":"minecraft:apple"},{"id":"minecraft:golden_apple"},{"id":"minecraft:enchanted_golden_apple"},{"id":"minecraft:melon_block","blockRuntimeId":5584},{"id":"minecraft:melon_slice"},{"id":"minecraft:glistering_melon_slice"},{"id":"minecraft:sweet_berries"},{"id":"minecraft:glow_berries"},{"id":"minecraft:pumpkin","blockRuntimeId":6430},{"id":"minecraft:carved_pumpkin","blockRuntimeId":988},{"id":"minecraft:lit_pumpkin","blockRuntimeId":5526},{"id":"minecraft:honeycomb"},{"id":"minecraft:tallgrass","blockRuntimeId":7253},{"id":"minecraft:double_plant","blockRuntimeId":4503},{"id":"minecraft:tallgrass","blockRuntimeId":7252},{"id":"minecraft:double_plant","blockRuntimeId":4502},{"id":"minecraft:nether_sprouts"},{"id":"minecraft:coral","blockRuntimeId":3681},{"id":"minecraft:coral","blockRuntimeId":3679},{"id":"minecraft:coral","blockRuntimeId":3680},{"id":"minecraft:coral","blockRuntimeId":3678},{"id":"minecraft:coral","blockRuntimeId":3682},{"id":"minecraft:coral","blockRuntimeId":3686},{"id":"minecraft:coral","blockRuntimeId":3684},{"id":"minecraft:coral","blockRuntimeId":3685},{"id":"minecraft:coral","blockRuntimeId":3683},{"id":"minecraft:coral","blockRuntimeId":3687},{"id":"minecraft:coral_fan","blockRuntimeId":3701},{"id":"minecraft:coral_fan","blockRuntimeId":3699},{"id":"minecraft:coral_fan","blockRuntimeId":3700},{"id":"minecraft:coral_fan","blockRuntimeId":3698},{"id":"minecraft:coral_fan","blockRuntimeId":3702},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3711},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3709},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3710},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3708},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3712},{"id":"minecraft:kelp"},{"id":"minecraft:seagrass","blockRuntimeId":6729},{"id":"minecraft:crimson_roots","blockRuntimeId":3856},{"id":"minecraft:warped_roots","blockRuntimeId":7519},{"id":"minecraft:yellow_flower","blockRuntimeId":7845},{"id":"minecraft:red_flower","blockRuntimeId":6563},{"id":"minecraft:red_flower","blockRuntimeId":6564},{"id":"minecraft:red_flower","blockRuntimeId":6565},{"id":"minecraft:red_flower","blockRuntimeId":6566},{"id":"minecraft:red_flower","blockRuntimeId":6567},{"id":"minecraft:red_flower","blockRuntimeId":6568},{"id":"minecraft:red_flower","blockRuntimeId":6569},{"id":"minecraft:red_flower","blockRuntimeId":6570},{"id":"minecraft:red_flower","blockRuntimeId":6571},{"id":"minecraft:red_flower","blockRuntimeId":6572},{"id":"minecraft:red_flower","blockRuntimeId":6573},{"id":"minecraft:double_plant","blockRuntimeId":4500},{"id":"minecraft:double_plant","blockRuntimeId":4501},{"id":"minecraft:double_plant","blockRuntimeId":4504},{"id":"minecraft:double_plant","blockRuntimeId":4505},{"id":"minecraft:wither_rose","blockRuntimeId":7710},{"id":"minecraft:white_dye"},{"id":"minecraft:light_gray_dye"},{"id":"minecraft:gray_dye"},{"id":"minecraft:black_dye"},{"id":"minecraft:brown_dye"},{"id":"minecraft:red_dye"},{"id":"minecraft:orange_dye"},{"id":"minecraft:yellow_dye"},{"id":"minecraft:lime_dye"},{"id":"minecraft:green_dye"},{"id":"minecraft:cyan_dye"},{"id":"minecraft:light_blue_dye"},{"id":"minecraft:blue_dye"},{"id":"minecraft:purple_dye"},{"id":"minecraft:magenta_dye"},{"id":"minecraft:pink_dye"},{"id":"minecraft:ink_sac"},{"id":"minecraft:glow_ink_sac"},{"id":"minecraft:cocoa_beans"},{"id":"minecraft:lapis_lazuli"},{"id":"minecraft:bone_meal"},{"id":"minecraft:vine","blockRuntimeId":7406},{"id":"minecraft:weeping_vines","blockRuntimeId":7660},{"id":"minecraft:twisting_vines","blockRuntimeId":7334},{"id":"minecraft:waterlily","blockRuntimeId":7588},{"id":"minecraft:deadbush","blockRuntimeId":4098},{"id":"minecraft:bamboo","blockRuntimeId":177},{"id":"minecraft:snow","blockRuntimeId":6816},{"id":"minecraft:ice","blockRuntimeId":5101},{"id":"minecraft:packed_ice","blockRuntimeId":5741},{"id":"minecraft:blue_ice","blockRuntimeId":691},{"id":"minecraft:snow_layer","blockRuntimeId":6817},{"id":"minecraft:pointed_dripstone","blockRuntimeId":5782},{"id":"minecraft:dripstone_block","blockRuntimeId":4584},{"id":"minecraft:moss_carpet","blockRuntimeId":5641},{"id":"minecraft:moss_block","blockRuntimeId":5640},{"id":"minecraft:dirt_with_roots","blockRuntimeId":4485},{"id":"minecraft:hanging_roots","blockRuntimeId":5023},{"id":"minecraft:big_dripleaf","blockRuntimeId":328},{"id":"minecraft:small_dripleaf_block","blockRuntimeId":6782},{"id":"minecraft:spore_blossom","blockRuntimeId":6869},{"id":"minecraft:azalea","blockRuntimeId":168},{"id":"minecraft:flowering_azalea","blockRuntimeId":4814},{"id":"minecraft:glow_lichen","blockRuntimeId":4947},{"id":"minecraft:amethyst_block","blockRuntimeId":136},{"id":"minecraft:budding_amethyst","blockRuntimeId":919},{"id":"minecraft:amethyst_cluster","blockRuntimeId":137},{"id":"minecraft:large_amethyst_bud","blockRuntimeId":5342},{"id":"minecraft:medium_amethyst_bud","blockRuntimeId":5578},{"id":"minecraft:small_amethyst_bud","blockRuntimeId":6769},{"id":"minecraft:tuff","blockRuntimeId":7321},{"id":"minecraft:calcite","blockRuntimeId":943},{"id":"minecraft:chicken"},{"id":"minecraft:porkchop"},{"id":"minecraft:beef"},{"id":"minecraft:mutton"},{"id":"minecraft:rabbit"},{"id":"minecraft:cod"},{"id":"minecraft:salmon"},{"id":"minecraft:tropical_fish"},{"id":"minecraft:pufferfish"},{"id":"minecraft:brown_mushroom","blockRuntimeId":900},{"id":"minecraft:red_mushroom","blockRuntimeId":6580},{"id":"minecraft:crimson_fungus","blockRuntimeId":3834},{"id":"minecraft:warped_fungus","blockRuntimeId":7497},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":915},{"id":"minecraft:red_mushroom_block","blockRuntimeId":6595},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":916},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":901},{"id":"minecraft:egg"},{"id":"minecraft:sugar_cane"},{"id":"minecraft:sugar"},{"id":"minecraft:rotten_flesh"},{"id":"minecraft:bone"},{"id":"minecraft:web","blockRuntimeId":7659},{"id":"minecraft:spider_eye"},{"id":"minecraft:mob_spawner","blockRuntimeId":5633},{"id":"minecraft:monster_egg","blockRuntimeId":5634},{"id":"minecraft:monster_egg","blockRuntimeId":5635},{"id":"minecraft:monster_egg","blockRuntimeId":5636},{"id":"minecraft:monster_egg","blockRuntimeId":5637},{"id":"minecraft:monster_egg","blockRuntimeId":5638},{"id":"minecraft:monster_egg","blockRuntimeId":5639},{"id":"minecraft:infested_deepslate","blockRuntimeId":5102},{"id":"minecraft:dragon_egg","blockRuntimeId":4582},{"id":"minecraft:turtle_egg","blockRuntimeId":7322},{"id":"minecraft:chicken_spawn_egg"},{"id":"minecraft:bee_spawn_egg"},{"id":"minecraft:cow_spawn_egg"},{"id":"minecraft:pig_spawn_egg"},{"id":"minecraft:sheep_spawn_egg"},{"id":"minecraft:wolf_spawn_egg"},{"id":"minecraft:polar_bear_spawn_egg"},{"id":"minecraft:ocelot_spawn_egg"},{"id":"minecraft:cat_spawn_egg"},{"id":"minecraft:mooshroom_spawn_egg"},{"id":"minecraft:bat_spawn_egg"},{"id":"minecraft:parrot_spawn_egg"},{"id":"minecraft:rabbit_spawn_egg"},{"id":"minecraft:llama_spawn_egg"},{"id":"minecraft:horse_spawn_egg"},{"id":"minecraft:donkey_spawn_egg"},{"id":"minecraft:mule_spawn_egg"},{"id":"minecraft:skeleton_horse_spawn_egg"},{"id":"minecraft:zombie_horse_spawn_egg"},{"id":"minecraft:tropical_fish_spawn_egg"},{"id":"minecraft:cod_spawn_egg"},{"id":"minecraft:pufferfish_spawn_egg"},{"id":"minecraft:salmon_spawn_egg"},{"id":"minecraft:dolphin_spawn_egg"},{"id":"minecraft:turtle_spawn_egg"},{"id":"minecraft:panda_spawn_egg"},{"id":"minecraft:fox_spawn_egg"},{"id":"minecraft:creeper_spawn_egg"},{"id":"minecraft:enderman_spawn_egg"},{"id":"minecraft:silverfish_spawn_egg"},{"id":"minecraft:skeleton_spawn_egg"},{"id":"minecraft:wither_skeleton_spawn_egg"},{"id":"minecraft:stray_spawn_egg"},{"id":"minecraft:slime_spawn_egg"},{"id":"minecraft:spider_spawn_egg"},{"id":"minecraft:zombie_spawn_egg"},{"id":"minecraft:zombie_pigman_spawn_egg"},{"id":"minecraft:husk_spawn_egg"},{"id":"minecraft:drowned_spawn_egg"},{"id":"minecraft:squid_spawn_egg"},{"id":"minecraft:glow_squid_spawn_egg"},{"id":"minecraft:cave_spider_spawn_egg"},{"id":"minecraft:witch_spawn_egg"},{"id":"minecraft:guardian_spawn_egg"},{"id":"minecraft:elder_guardian_spawn_egg"},{"id":"minecraft:endermite_spawn_egg"},{"id":"minecraft:magma_cube_spawn_egg"},{"id":"minecraft:strider_spawn_egg"},{"id":"minecraft:hoglin_spawn_egg"},{"id":"minecraft:piglin_spawn_egg"},{"id":"minecraft:zoglin_spawn_egg"},{"id":"minecraft:piglin_brute_spawn_egg"},{"id":"minecraft:goat_spawn_egg"},{"id":"minecraft:axolotl_spawn_egg"},{"id":"minecraft:ghast_spawn_egg"},{"id":"minecraft:blaze_spawn_egg"},{"id":"minecraft:shulker_spawn_egg"},{"id":"minecraft:vindicator_spawn_egg"},{"id":"minecraft:evoker_spawn_egg"},{"id":"minecraft:vex_spawn_egg"},{"id":"minecraft:villager_spawn_egg"},{"id":"minecraft:wandering_trader_spawn_egg"},{"id":"minecraft:zombie_villager_spawn_egg"},{"id":"minecraft:phantom_spawn_egg"},{"id":"minecraft:pillager_spawn_egg"},{"id":"minecraft:ravager_spawn_egg"},{"id":"minecraft:obsidian","blockRuntimeId":5710},{"id":"minecraft:crying_obsidian","blockRuntimeId":3908},{"id":"minecraft:bedrock","blockRuntimeId":234},{"id":"minecraft:soul_sand","blockRuntimeId":6859},{"id":"minecraft:netherrack","blockRuntimeId":5679},{"id":"minecraft:magma","blockRuntimeId":5577},{"id":"minecraft:nether_wart"},{"id":"minecraft:end_stone","blockRuntimeId":4744},{"id":"minecraft:chorus_flower","blockRuntimeId":1132},{"id":"minecraft:chorus_plant","blockRuntimeId":1138},{"id":"minecraft:chorus_fruit"},{"id":"minecraft:popped_chorus_fruit"},{"id":"minecraft:sponge","blockRuntimeId":6867},{"id":"minecraft:sponge","blockRuntimeId":6868},{"id":"minecraft:coral_block","blockRuntimeId":3688},{"id":"minecraft:coral_block","blockRuntimeId":3689},{"id":"minecraft:coral_block","blockRuntimeId":3690},{"id":"minecraft:coral_block","blockRuntimeId":3691},{"id":"minecraft:coral_block","blockRuntimeId":3692},{"id":"minecraft:coral_block","blockRuntimeId":3693},{"id":"minecraft:coral_block","blockRuntimeId":3694},{"id":"minecraft:coral_block","blockRuntimeId":3695},{"id":"minecraft:coral_block","blockRuntimeId":3696},{"id":"minecraft:coral_block","blockRuntimeId":3697},{"id":"minecraft:leather_helmet"},{"id":"minecraft:chainmail_helmet"},{"id":"minecraft:iron_helmet"},{"id":"minecraft:golden_helmet"},{"id":"minecraft:diamond_helmet"},{"id":"minecraft:netherite_helmet"},{"id":"minecraft:leather_chestplate"},{"id":"minecraft:chainmail_chestplate"},{"id":"minecraft:iron_chestplate"},{"id":"minecraft:golden_chestplate"},{"id":"minecraft:diamond_chestplate"},{"id":"minecraft:netherite_chestplate"},{"id":"minecraft:leather_leggings"},{"id":"minecraft:chainmail_leggings"},{"id":"minecraft:iron_leggings"},{"id":"minecraft:golden_leggings"},{"id":"minecraft:diamond_leggings"},{"id":"minecraft:netherite_leggings"},{"id":"minecraft:leather_boots"},{"id":"minecraft:chainmail_boots"},{"id":"minecraft:iron_boots"},{"id":"minecraft:golden_boots"},{"id":"minecraft:diamond_boots"},{"id":"minecraft:netherite_boots"},{"id":"minecraft:wooden_sword"},{"id":"minecraft:stone_sword"},{"id":"minecraft:iron_sword"},{"id":"minecraft:golden_sword"},{"id":"minecraft:diamond_sword"},{"id":"minecraft:netherite_sword"},{"id":"minecraft:wooden_axe"},{"id":"minecraft:stone_axe"},{"id":"minecraft:iron_axe"},{"id":"minecraft:golden_axe"},{"id":"minecraft:diamond_axe"},{"id":"minecraft:netherite_axe"},{"id":"minecraft:wooden_pickaxe"},{"id":"minecraft:stone_pickaxe"},{"id":"minecraft:iron_pickaxe"},{"id":"minecraft:golden_pickaxe"},{"id":"minecraft:diamond_pickaxe"},{"id":"minecraft:netherite_pickaxe"},{"id":"minecraft:wooden_shovel"},{"id":"minecraft:stone_shovel"},{"id":"minecraft:iron_shovel"},{"id":"minecraft:golden_shovel"},{"id":"minecraft:diamond_shovel"},{"id":"minecraft:netherite_shovel"},{"id":"minecraft:wooden_hoe"},{"id":"minecraft:stone_hoe"},{"id":"minecraft:iron_hoe"},{"id":"minecraft:golden_hoe"},{"id":"minecraft:diamond_hoe"},{"id":"minecraft:netherite_hoe"},{"id":"minecraft:bow"},{"id":"minecraft:crossbow"},{"id":"minecraft:arrow"},{"id":"minecraft:arrow","damage":6},{"id":"minecraft:arrow","damage":7},{"id":"minecraft:arrow","damage":8},{"id":"minecraft:arrow","damage":9},{"id":"minecraft:arrow","damage":10},{"id":"minecraft:arrow","damage":11},{"id":"minecraft:arrow","damage":12},{"id":"minecraft:arrow","damage":13},{"id":"minecraft:arrow","damage":14},{"id":"minecraft:arrow","damage":15},{"id":"minecraft:arrow","damage":16},{"id":"minecraft:arrow","damage":17},{"id":"minecraft:arrow","damage":18},{"id":"minecraft:arrow","damage":19},{"id":"minecraft:arrow","damage":20},{"id":"minecraft:arrow","damage":21},{"id":"minecraft:arrow","damage":22},{"id":"minecraft:arrow","damage":23},{"id":"minecraft:arrow","damage":24},{"id":"minecraft:arrow","damage":25},{"id":"minecraft:arrow","damage":26},{"id":"minecraft:arrow","damage":27},{"id":"minecraft:arrow","damage":28},{"id":"minecraft:arrow","damage":29},{"id":"minecraft:arrow","damage":30},{"id":"minecraft:arrow","damage":31},{"id":"minecraft:arrow","damage":32},{"id":"minecraft:arrow","damage":33},{"id":"minecraft:arrow","damage":34},{"id":"minecraft:arrow","damage":35},{"id":"minecraft:arrow","damage":36},{"id":"minecraft:arrow","damage":37},{"id":"minecraft:arrow","damage":38},{"id":"minecraft:arrow","damage":39},{"id":"minecraft:arrow","damage":40},{"id":"minecraft:arrow","damage":41},{"id":"minecraft:arrow","damage":42},{"id":"minecraft:arrow","damage":43},{"id":"minecraft:shield"},{"id":"minecraft:cooked_chicken"},{"id":"minecraft:cooked_porkchop"},{"id":"minecraft:cooked_beef"},{"id":"minecraft:cooked_mutton"},{"id":"minecraft:cooked_rabbit"},{"id":"minecraft:cooked_cod"},{"id":"minecraft:cooked_salmon"},{"id":"minecraft:bread"},{"id":"minecraft:mushroom_stew"},{"id":"minecraft:beetroot_soup"},{"id":"minecraft:rabbit_stew"},{"id":"minecraft:baked_potato"},{"id":"minecraft:cookie"},{"id":"minecraft:pumpkin_pie"},{"id":"minecraft:cake"},{"id":"minecraft:dried_kelp"},{"id":"minecraft:fishing_rod"},{"id":"minecraft:carrot_on_a_stick"},{"id":"minecraft:warped_fungus_on_a_stick"},{"id":"minecraft:snowball"},{"id":"minecraft:shears"},{"id":"minecraft:flint_and_steel"},{"id":"minecraft:lead"},{"id":"minecraft:clock"},{"id":"minecraft:compass"},{"id":"minecraft:empty_map"},{"id":"minecraft:empty_map","damage":2},{"id":"minecraft:saddle"},{"id":"minecraft:leather_horse_armor"},{"id":"minecraft:iron_horse_armor"},{"id":"minecraft:golden_horse_armor"},{"id":"minecraft:diamond_horse_armor"},{"id":"minecraft:trident"},{"id":"minecraft:turtle_helmet"},{"id":"minecraft:elytra"},{"id":"minecraft:totem_of_undying"},{"id":"minecraft:glass_bottle"},{"id":"minecraft:experience_bottle"},{"id":"minecraft:potion"},{"id":"minecraft:potion","damage":1},{"id":"minecraft:potion","damage":2},{"id":"minecraft:potion","damage":3},{"id":"minecraft:potion","damage":4},{"id":"minecraft:potion","damage":5},{"id":"minecraft:potion","damage":6},{"id":"minecraft:potion","damage":7},{"id":"minecraft:potion","damage":8},{"id":"minecraft:potion","damage":9},{"id":"minecraft:potion","damage":10},{"id":"minecraft:potion","damage":11},{"id":"minecraft:potion","damage":12},{"id":"minecraft:potion","damage":13},{"id":"minecraft:potion","damage":14},{"id":"minecraft:potion","damage":15},{"id":"minecraft:potion","damage":16},{"id":"minecraft:potion","damage":17},{"id":"minecraft:potion","damage":18},{"id":"minecraft:potion","damage":19},{"id":"minecraft:potion","damage":20},{"id":"minecraft:potion","damage":21},{"id":"minecraft:potion","damage":22},{"id":"minecraft:potion","damage":23},{"id":"minecraft:potion","damage":24},{"id":"minecraft:potion","damage":25},{"id":"minecraft:potion","damage":26},{"id":"minecraft:potion","damage":27},{"id":"minecraft:potion","damage":28},{"id":"minecraft:potion","damage":29},{"id":"minecraft:potion","damage":30},{"id":"minecraft:potion","damage":31},{"id":"minecraft:potion","damage":32},{"id":"minecraft:potion","damage":33},{"id":"minecraft:potion","damage":34},{"id":"minecraft:potion","damage":35},{"id":"minecraft:potion","damage":36},{"id":"minecraft:potion","damage":37},{"id":"minecraft:potion","damage":38},{"id":"minecraft:potion","damage":39},{"id":"minecraft:potion","damage":40},{"id":"minecraft:potion","damage":41},{"id":"minecraft:potion","damage":42},{"id":"minecraft:splash_potion"},{"id":"minecraft:splash_potion","damage":1},{"id":"minecraft:splash_potion","damage":2},{"id":"minecraft:splash_potion","damage":3},{"id":"minecraft:splash_potion","damage":4},{"id":"minecraft:splash_potion","damage":5},{"id":"minecraft:splash_potion","damage":6},{"id":"minecraft:splash_potion","damage":7},{"id":"minecraft:splash_potion","damage":8},{"id":"minecraft:splash_potion","damage":9},{"id":"minecraft:splash_potion","damage":10},{"id":"minecraft:splash_potion","damage":11},{"id":"minecraft:splash_potion","damage":12},{"id":"minecraft:splash_potion","damage":13},{"id":"minecraft:splash_potion","damage":14},{"id":"minecraft:splash_potion","damage":15},{"id":"minecraft:splash_potion","damage":16},{"id":"minecraft:splash_potion","damage":17},{"id":"minecraft:splash_potion","damage":18},{"id":"minecraft:splash_potion","damage":19},{"id":"minecraft:splash_potion","damage":20},{"id":"minecraft:splash_potion","damage":21},{"id":"minecraft:splash_potion","damage":22},{"id":"minecraft:splash_potion","damage":23},{"id":"minecraft:splash_potion","damage":24},{"id":"minecraft:splash_potion","damage":25},{"id":"minecraft:splash_potion","damage":26},{"id":"minecraft:splash_potion","damage":27},{"id":"minecraft:splash_potion","damage":28},{"id":"minecraft:splash_potion","damage":29},{"id":"minecraft:splash_potion","damage":30},{"id":"minecraft:splash_potion","damage":31},{"id":"minecraft:splash_potion","damage":32},{"id":"minecraft:splash_potion","damage":33},{"id":"minecraft:splash_potion","damage":34},{"id":"minecraft:splash_potion","damage":35},{"id":"minecraft:splash_potion","damage":36},{"id":"minecraft:splash_potion","damage":37},{"id":"minecraft:splash_potion","damage":38},{"id":"minecraft:splash_potion","damage":39},{"id":"minecraft:splash_potion","damage":40},{"id":"minecraft:splash_potion","damage":41},{"id":"minecraft:splash_potion","damage":42},{"id":"minecraft:lingering_potion"},{"id":"minecraft:lingering_potion","damage":1},{"id":"minecraft:lingering_potion","damage":2},{"id":"minecraft:lingering_potion","damage":3},{"id":"minecraft:lingering_potion","damage":4},{"id":"minecraft:lingering_potion","damage":5},{"id":"minecraft:lingering_potion","damage":6},{"id":"minecraft:lingering_potion","damage":7},{"id":"minecraft:lingering_potion","damage":8},{"id":"minecraft:lingering_potion","damage":9},{"id":"minecraft:lingering_potion","damage":10},{"id":"minecraft:lingering_potion","damage":11},{"id":"minecraft:lingering_potion","damage":12},{"id":"minecraft:lingering_potion","damage":13},{"id":"minecraft:lingering_potion","damage":14},{"id":"minecraft:lingering_potion","damage":15},{"id":"minecraft:lingering_potion","damage":16},{"id":"minecraft:lingering_potion","damage":17},{"id":"minecraft:lingering_potion","damage":18},{"id":"minecraft:lingering_potion","damage":19},{"id":"minecraft:lingering_potion","damage":20},{"id":"minecraft:lingering_potion","damage":21},{"id":"minecraft:lingering_potion","damage":22},{"id":"minecraft:lingering_potion","damage":23},{"id":"minecraft:lingering_potion","damage":24},{"id":"minecraft:lingering_potion","damage":25},{"id":"minecraft:lingering_potion","damage":26},{"id":"minecraft:lingering_potion","damage":27},{"id":"minecraft:lingering_potion","damage":28},{"id":"minecraft:lingering_potion","damage":29},{"id":"minecraft:lingering_potion","damage":30},{"id":"minecraft:lingering_potion","damage":31},{"id":"minecraft:lingering_potion","damage":32},{"id":"minecraft:lingering_potion","damage":33},{"id":"minecraft:lingering_potion","damage":34},{"id":"minecraft:lingering_potion","damage":35},{"id":"minecraft:lingering_potion","damage":36},{"id":"minecraft:lingering_potion","damage":37},{"id":"minecraft:lingering_potion","damage":38},{"id":"minecraft:lingering_potion","damage":39},{"id":"minecraft:lingering_potion","damage":40},{"id":"minecraft:lingering_potion","damage":41},{"id":"minecraft:lingering_potion","damage":42},{"id":"minecraft:spyglass"},{"id":"minecraft:stick"},{"id":"minecraft:bed"},{"id":"minecraft:bed","damage":8},{"id":"minecraft:bed","damage":7},{"id":"minecraft:bed","damage":15},{"id":"minecraft:bed","damage":12},{"id":"minecraft:bed","damage":14},{"id":"minecraft:bed","damage":1},{"id":"minecraft:bed","damage":4},{"id":"minecraft:bed","damage":5},{"id":"minecraft:bed","damage":13},{"id":"minecraft:bed","damage":9},{"id":"minecraft:bed","damage":3},{"id":"minecraft:bed","damage":11},{"id":"minecraft:bed","damage":10},{"id":"minecraft:bed","damage":2},{"id":"minecraft:bed","damage":6},{"id":"minecraft:torch","blockRuntimeId":7261},{"id":"minecraft:soul_torch","blockRuntimeId":6861},{"id":"minecraft:sea_pickle","blockRuntimeId":6721},{"id":"minecraft:lantern","blockRuntimeId":5338},{"id":"minecraft:soul_lantern","blockRuntimeId":6857},{"id":"minecraft:candle","blockRuntimeId":953},{"id":"minecraft:white_candle","blockRuntimeId":7694},{"id":"minecraft:orange_candle","blockRuntimeId":5711},{"id":"minecraft:magenta_candle","blockRuntimeId":5561},{"id":"minecraft:light_blue_candle","blockRuntimeId":5449},{"id":"minecraft:yellow_candle","blockRuntimeId":7835},{"id":"minecraft:lime_candle","blockRuntimeId":5497},{"id":"minecraft:pink_candle","blockRuntimeId":5742},{"id":"minecraft:gray_candle","blockRuntimeId":4975},{"id":"minecraft:light_gray_candle","blockRuntimeId":5465},{"id":"minecraft:cyan_candle","blockRuntimeId":3920},{"id":"minecraft:purple_candle","blockRuntimeId":6482},{"id":"minecraft:blue_candle","blockRuntimeId":675},{"id":"minecraft:brown_candle","blockRuntimeId":884},{"id":"minecraft:green_candle","blockRuntimeId":4991},{"id":"minecraft:red_candle","blockRuntimeId":6553},{"id":"minecraft:black_candle","blockRuntimeId":478},{"id":"minecraft:crafting_table","blockRuntimeId":3770},{"id":"minecraft:cartography_table","blockRuntimeId":987},{"id":"minecraft:fletching_table","blockRuntimeId":4811},{"id":"minecraft:smithing_table","blockRuntimeId":6783},{"id":"minecraft:beehive","blockRuntimeId":260},{"id":"minecraft:campfire"},{"id":"minecraft:soul_campfire"},{"id":"minecraft:furnace","blockRuntimeId":4863},{"id":"minecraft:blast_furnace","blockRuntimeId":669},{"id":"minecraft:smoker","blockRuntimeId":6784},{"id":"minecraft:respawn_anchor","blockRuntimeId":6672},{"id":"minecraft:brewing_stand"},{"id":"minecraft:anvil","blockRuntimeId":152},{"id":"minecraft:anvil","blockRuntimeId":156},{"id":"minecraft:anvil","blockRuntimeId":160},{"id":"minecraft:grindstone","blockRuntimeId":5007},{"id":"minecraft:enchanting_table","blockRuntimeId":4718},{"id":"minecraft:bookshelf","blockRuntimeId":704},{"id":"minecraft:lectern","blockRuntimeId":5409},{"id":"minecraft:cauldron"},{"id":"minecraft:composter","blockRuntimeId":3634},{"id":"minecraft:chest","blockRuntimeId":1123},{"id":"minecraft:trapped_chest","blockRuntimeId":7283},{"id":"minecraft:ender_chest","blockRuntimeId":4745},{"id":"minecraft:barrel","blockRuntimeId":201},{"id":"minecraft:undyed_shulker_box","blockRuntimeId":7366},{"id":"minecraft:shulker_box","blockRuntimeId":6734},{"id":"minecraft:shulker_box","blockRuntimeId":6742},{"id":"minecraft:shulker_box","blockRuntimeId":6741},{"id":"minecraft:shulker_box","blockRuntimeId":6749},{"id":"minecraft:shulker_box","blockRuntimeId":6746},{"id":"minecraft:shulker_box","blockRuntimeId":6748},{"id":"minecraft:shulker_box","blockRuntimeId":6735},{"id":"minecraft:shulker_box","blockRuntimeId":6738},{"id":"minecraft:shulker_box","blockRuntimeId":6739},{"id":"minecraft:shulker_box","blockRuntimeId":6747},{"id":"minecraft:shulker_box","blockRuntimeId":6743},{"id":"minecraft:shulker_box","blockRuntimeId":6737},{"id":"minecraft:shulker_box","blockRuntimeId":6745},{"id":"minecraft:shulker_box","blockRuntimeId":6744},{"id":"minecraft:shulker_box","blockRuntimeId":6736},{"id":"minecraft:shulker_box","blockRuntimeId":6740},{"id":"minecraft:armor_stand"},{"id":"minecraft:noteblock","blockRuntimeId":5689},{"id":"minecraft:jukebox","blockRuntimeId":5183},{"id":"minecraft:music_disc_13"},{"id":"minecraft:music_disc_cat"},{"id":"minecraft:music_disc_blocks"},{"id":"minecraft:music_disc_chirp"},{"id":"minecraft:music_disc_far"},{"id":"minecraft:music_disc_mall"},{"id":"minecraft:music_disc_mellohi"},{"id":"minecraft:music_disc_stal"},{"id":"minecraft:music_disc_strad"},{"id":"minecraft:music_disc_ward"},{"id":"minecraft:music_disc_11"},{"id":"minecraft:music_disc_wait"},{"id":"minecraft:music_disc_pigstep"},{"id":"minecraft:glowstone_dust"},{"id":"minecraft:glowstone","blockRuntimeId":4949},{"id":"minecraft:redstone_lamp","blockRuntimeId":6619},{"id":"minecraft:sealantern","blockRuntimeId":6732},{"id":"minecraft:oak_sign"},{"id":"minecraft:spruce_sign"},{"id":"minecraft:birch_sign"},{"id":"minecraft:jungle_sign"},{"id":"minecraft:acacia_sign"},{"id":"minecraft:dark_oak_sign"},{"id":"minecraft:crimson_sign"},{"id":"minecraft:warped_sign"},{"id":"minecraft:painting"},{"id":"minecraft:frame"},{"id":"minecraft:glow_frame"},{"id":"minecraft:honey_bottle"},{"id":"minecraft:flower_pot"},{"id":"minecraft:bowl"},{"id":"minecraft:bucket"},{"id":"minecraft:milk_bucket"},{"id":"minecraft:water_bucket"},{"id":"minecraft:lava_bucket"},{"id":"minecraft:cod_bucket"},{"id":"minecraft:salmon_bucket"},{"id":"minecraft:tropical_fish_bucket"},{"id":"minecraft:pufferfish_bucket"},{"id":"minecraft:powder_snow_bucket"},{"id":"minecraft:axolotl_bucket"},{"id":"minecraft:skull","damage":3},{"id":"minecraft:skull","damage":2},{"id":"minecraft:skull","damage":4},{"id":"minecraft:skull","damage":5},{"id":"minecraft:skull"},{"id":"minecraft:skull","damage":1},{"id":"minecraft:beacon","blockRuntimeId":217},{"id":"minecraft:bell","blockRuntimeId":292},{"id":"minecraft:conduit","blockRuntimeId":3675},{"id":"minecraft:stonecutter_block","blockRuntimeId":7199},{"id":"minecraft:end_portal_frame","blockRuntimeId":4730},{"id":"minecraft:coal"},{"id":"minecraft:charcoal"},{"id":"minecraft:diamond"},{"id":"minecraft:iron_nugget"},{"id":"minecraft:raw_iron"},{"id":"minecraft:raw_gold"},{"id":"minecraft:raw_copper"},{"id":"minecraft:copper_ingot"},{"id":"minecraft:iron_ingot"},{"id":"minecraft:netherite_scrap"},{"id":"minecraft:netherite_ingot"},{"id":"minecraft:gold_nugget"},{"id":"minecraft:gold_ingot"},{"id":"minecraft:emerald"},{"id":"minecraft:quartz"},{"id":"minecraft:clay_ball"},{"id":"minecraft:brick"},{"id":"minecraft:netherbrick"},{"id":"minecraft:prismarine_shard"},{"id":"minecraft:amethyst_shard"},{"id":"minecraft:prismarine_crystals"},{"id":"minecraft:nautilus_shell"},{"id":"minecraft:heart_of_the_sea"},{"id":"minecraft:scute"},{"id":"minecraft:phantom_membrane"},{"id":"minecraft:string"},{"id":"minecraft:feather"},{"id":"minecraft:flint"},{"id":"minecraft:gunpowder"},{"id":"minecraft:leather"},{"id":"minecraft:rabbit_hide"},{"id":"minecraft:rabbit_foot"},{"id":"minecraft:fire_charge"},{"id":"minecraft:blaze_rod"},{"id":"minecraft:blaze_powder"},{"id":"minecraft:magma_cream"},{"id":"minecraft:fermented_spider_eye"},{"id":"minecraft:dragon_breath"},{"id":"minecraft:shulker_shell"},{"id":"minecraft:ghast_tear"},{"id":"minecraft:slime_ball"},{"id":"minecraft:ender_pearl"},{"id":"minecraft:ender_eye"},{"id":"minecraft:nether_star"},{"id":"minecraft:end_rod","blockRuntimeId":4738},{"id":"minecraft:lightning_rod","blockRuntimeId":5491},{"id":"minecraft:end_crystal"},{"id":"minecraft:paper"},{"id":"minecraft:book"},{"id":"minecraft:writable_book"},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA="},{"id":"minecraft:oak_boat"},{"id":"minecraft:spruce_boat"},{"id":"minecraft:birch_boat"},{"id":"minecraft:jungle_boat"},{"id":"minecraft:acacia_boat"},{"id":"minecraft:dark_oak_boat"},{"id":"minecraft:rail","blockRuntimeId":6540},{"id":"minecraft:golden_rail","blockRuntimeId":4952},{"id":"minecraft:detector_rail","blockRuntimeId":4461},{"id":"minecraft:activator_rail","blockRuntimeId":122},{"id":"minecraft:minecart"},{"id":"minecraft:chest_minecart"},{"id":"minecraft:hopper_minecart"},{"id":"minecraft:tnt_minecart"},{"id":"minecraft:redstone"},{"id":"minecraft:redstone_block","blockRuntimeId":6618},{"id":"minecraft:redstone_torch","blockRuntimeId":6621},{"id":"minecraft:lever","blockRuntimeId":5417},{"id":"minecraft:wooden_button","blockRuntimeId":7747},{"id":"minecraft:spruce_button","blockRuntimeId":6870},{"id":"minecraft:birch_button","blockRuntimeId":356},{"id":"minecraft:jungle_button","blockRuntimeId":5184},{"id":"minecraft:acacia_button"},{"id":"minecraft:dark_oak_button","blockRuntimeId":3936},{"id":"minecraft:stone_button","blockRuntimeId":7099},{"id":"minecraft:crimson_button","blockRuntimeId":3771},{"id":"minecraft:warped_button","blockRuntimeId":7434},{"id":"minecraft:polished_blackstone_button","blockRuntimeId":5974},{"id":"minecraft:tripwire_hook","blockRuntimeId":7305},{"id":"minecraft:wooden_pressure_plate","blockRuntimeId":7791},{"id":"minecraft:spruce_pressure_plate","blockRuntimeId":6930},{"id":"minecraft:birch_pressure_plate","blockRuntimeId":416},{"id":"minecraft:jungle_pressure_plate","blockRuntimeId":5244},{"id":"minecraft:acacia_pressure_plate","blockRuntimeId":60},{"id":"minecraft:dark_oak_pressure_plate","blockRuntimeId":3996},{"id":"minecraft:crimson_pressure_plate","blockRuntimeId":3840},{"id":"minecraft:warped_pressure_plate","blockRuntimeId":7503},{"id":"minecraft:stone_pressure_plate","blockRuntimeId":7111},{"id":"minecraft:light_weighted_pressure_plate","blockRuntimeId":5475},{"id":"minecraft:heavy_weighted_pressure_plate","blockRuntimeId":5071},{"id":"minecraft:polished_blackstone_pressure_plate","blockRuntimeId":5988},{"id":"minecraft:observer","blockRuntimeId":5698},{"id":"minecraft:daylight_detector","blockRuntimeId":4066},{"id":"minecraft:repeater"},{"id":"minecraft:comparator"},{"id":"minecraft:hopper"},{"id":"minecraft:dropper","blockRuntimeId":4588},{"id":"minecraft:dispenser","blockRuntimeId":4489},{"id":"minecraft:piston","blockRuntimeId":5759},{"id":"minecraft:sticky_piston","blockRuntimeId":7073},{"id":"minecraft:tnt","blockRuntimeId":7257},{"id":"minecraft:name_tag"},{"id":"minecraft:loom","blockRuntimeId":5557},{"id":"minecraft:banner"},{"id":"minecraft:banner","damage":8},{"id":"minecraft:banner","damage":7},{"id":"minecraft:banner","damage":15},{"id":"minecraft:banner","damage":12},{"id":"minecraft:banner","damage":14},{"id":"minecraft:banner","damage":1},{"id":"minecraft:banner","damage":4},{"id":"minecraft:banner","damage":5},{"id":"minecraft:banner","damage":13},{"id":"minecraft:banner","damage":9},{"id":"minecraft:banner","damage":3},{"id":"minecraft:banner","damage":11},{"id":"minecraft:banner","damage":10},{"id":"minecraft:banner","damage":2},{"id":"minecraft:banner","damage":6},{"id":"minecraft:banner","damage":15,"nbt_b64":"CgAAAwQAVHlwZQEAAAAA"},{"id":"minecraft:creeper_banner_pattern"},{"id":"minecraft:skull_banner_pattern"},{"id":"minecraft:flower_banner_pattern"},{"id":"minecraft:mojang_banner_pattern"},{"id":"minecraft:field_masoned_banner_pattern"},{"id":"minecraft:bordure_indented_banner_pattern"},{"id":"minecraft:piglin_banner_pattern"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_star","nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA="},{"id":"minecraft:firework_star","damage":8,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA="},{"id":"minecraft:firework_star","damage":7,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA="},{"id":"minecraft:firework_star","damage":15,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA="},{"id":"minecraft:firework_star","damage":12,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA="},{"id":"minecraft:firework_star","damage":14,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA="},{"id":"minecraft:firework_star","damage":1,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA="},{"id":"minecraft:firework_star","damage":4,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA="},{"id":"minecraft:firework_star","damage":5,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA="},{"id":"minecraft:firework_star","damage":13,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA="},{"id":"minecraft:firework_star","damage":9,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA="},{"id":"minecraft:firework_star","damage":3,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA="},{"id":"minecraft:firework_star","damage":11,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA="},{"id":"minecraft:firework_star","damage":10,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA="},{"id":"minecraft:firework_star","damage":2,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA="},{"id":"minecraft:firework_star","damage":6,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA="},{"id":"minecraft:chain"},{"id":"minecraft:target","blockRuntimeId":7255},{"id":"minecraft:lodestone_compass"},{"id":"minecraft:debug_stick"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems465.json b/src/main/resources/creativeitems465.json deleted file mode 100644 index bffb81b77..000000000 --- a/src/main/resources/creativeitems465.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":"minecraft:planks","blockRuntimeId":5794},{"id":"minecraft:planks","blockRuntimeId":5795},{"id":"minecraft:planks","blockRuntimeId":5796},{"id":"minecraft:planks","blockRuntimeId":5797},{"id":"minecraft:planks","blockRuntimeId":5798},{"id":"minecraft:planks","blockRuntimeId":5799},{"id":"minecraft:crimson_planks","blockRuntimeId":3839},{"id":"minecraft:warped_planks","blockRuntimeId":7594},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1318},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1319},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1320},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1321},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1322},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1323},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1330},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1325},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1326},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1324},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1327},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1331},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1328},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1329},{"id":"minecraft:blackstone_wall","blockRuntimeId":507},{"id":"minecraft:polished_blackstone_wall","blockRuntimeId":6038},{"id":"minecraft:polished_blackstone_brick_wall","blockRuntimeId":5835},{"id":"minecraft:cobbled_deepslate_wall","blockRuntimeId":1155},{"id":"minecraft:deepslate_tile_wall","blockRuntimeId":4297},{"id":"minecraft:polished_deepslate_wall","blockRuntimeId":6213},{"id":"minecraft:deepslate_brick_wall","blockRuntimeId":4114},{"id":"minecraft:fence","blockRuntimeId":4773},{"id":"minecraft:fence","blockRuntimeId":4774},{"id":"minecraft:fence","blockRuntimeId":4775},{"id":"minecraft:fence","blockRuntimeId":4776},{"id":"minecraft:fence","blockRuntimeId":4777},{"id":"minecraft:fence","blockRuntimeId":4778},{"id":"minecraft:nether_brick_fence","blockRuntimeId":5686},{"id":"minecraft:crimson_fence","blockRuntimeId":3817},{"id":"minecraft:warped_fence","blockRuntimeId":7572},{"id":"minecraft:fence_gate","blockRuntimeId":4779},{"id":"minecraft:spruce_fence_gate","blockRuntimeId":7006},{"id":"minecraft:birch_fence_gate","blockRuntimeId":400},{"id":"minecraft:jungle_fence_gate","blockRuntimeId":5252},{"id":"minecraft:acacia_fence_gate","blockRuntimeId":44},{"id":"minecraft:dark_oak_fence_gate","blockRuntimeId":3980},{"id":"minecraft:crimson_fence_gate","blockRuntimeId":3818},{"id":"minecraft:warped_fence_gate","blockRuntimeId":7573},{"id":"minecraft:normal_stone_stairs","blockRuntimeId":5705},{"id":"minecraft:stone_stairs","blockRuntimeId":7277},{"id":"minecraft:mossy_cobblestone_stairs","blockRuntimeId":5667},{"id":"minecraft:oak_stairs","blockRuntimeId":5714},{"id":"minecraft:spruce_stairs","blockRuntimeId":7038},{"id":"minecraft:birch_stairs","blockRuntimeId":432},{"id":"minecraft:jungle_stairs","blockRuntimeId":5284},{"id":"minecraft:acacia_stairs","blockRuntimeId":76},{"id":"minecraft:dark_oak_stairs","blockRuntimeId":4012},{"id":"minecraft:stone_brick_stairs","blockRuntimeId":7183},{"id":"minecraft:mossy_stone_brick_stairs","blockRuntimeId":5675},{"id":"minecraft:sandstone_stairs","blockRuntimeId":6707},{"id":"minecraft:smooth_sandstone_stairs","blockRuntimeId":6899},{"id":"minecraft:red_sandstone_stairs","blockRuntimeId":6634},{"id":"minecraft:smooth_red_sandstone_stairs","blockRuntimeId":6891},{"id":"minecraft:granite_stairs","blockRuntimeId":4988},{"id":"minecraft:polished_granite_stairs","blockRuntimeId":6383},{"id":"minecraft:diorite_stairs","blockRuntimeId":4475},{"id":"minecraft:polished_diorite_stairs","blockRuntimeId":6375},{"id":"minecraft:andesite_stairs","blockRuntimeId":144},{"id":"minecraft:polished_andesite_stairs","blockRuntimeId":5811},{"id":"minecraft:brick_stairs","blockRuntimeId":876},{"id":"minecraft:nether_brick_stairs","blockRuntimeId":5687},{"id":"minecraft:red_nether_brick_stairs","blockRuntimeId":6622},{"id":"minecraft:end_brick_stairs","blockRuntimeId":4719},{"id":"minecraft:quartz_stairs","blockRuntimeId":6556},{"id":"minecraft:smooth_quartz_stairs","blockRuntimeId":6883},{"id":"minecraft:purpur_stairs","blockRuntimeId":6534},{"id":"minecraft:prismarine_stairs","blockRuntimeId":6446},{"id":"minecraft:dark_prismarine_stairs","blockRuntimeId":4036},{"id":"minecraft:prismarine_bricks_stairs","blockRuntimeId":6438},{"id":"minecraft:crimson_stairs","blockRuntimeId":3859},{"id":"minecraft:warped_stairs","blockRuntimeId":7614},{"id":"minecraft:blackstone_stairs","blockRuntimeId":499},{"id":"minecraft:polished_blackstone_stairs","blockRuntimeId":6030},{"id":"minecraft:polished_blackstone_brick_stairs","blockRuntimeId":5827},{"id":"minecraft:cut_copper_stairs","blockRuntimeId":3912},{"id":"minecraft:exposed_cut_copper_stairs","blockRuntimeId":4755},{"id":"minecraft:weathered_cut_copper_stairs","blockRuntimeId":7741},{"id":"minecraft:oxidized_cut_copper_stairs","blockRuntimeId":5755},{"id":"minecraft:waxed_cut_copper_stairs","blockRuntimeId":7685},{"id":"minecraft:waxed_exposed_cut_copper_stairs","blockRuntimeId":7699},{"id":"minecraft:waxed_weathered_cut_copper_stairs","blockRuntimeId":7727},{"id":"minecraft:waxed_oxidized_cut_copper_stairs","blockRuntimeId":7713},{"id":"minecraft:cobbled_deepslate_stairs","blockRuntimeId":1147},{"id":"minecraft:deepslate_tile_stairs","blockRuntimeId":4289},{"id":"minecraft:polished_deepslate_stairs","blockRuntimeId":6205},{"id":"minecraft:deepslate_brick_stairs","blockRuntimeId":4106},{"id":"minecraft:wooden_door"},{"id":"minecraft:spruce_door"},{"id":"minecraft:birch_door"},{"id":"minecraft:jungle_door"},{"id":"minecraft:acacia_door"},{"id":"minecraft:dark_oak_door"},{"id":"minecraft:iron_door"},{"id":"minecraft:crimson_door"},{"id":"minecraft:warped_door"},{"id":"minecraft:trapdoor","blockRuntimeId":7359},{"id":"minecraft:spruce_trapdoor","blockRuntimeId":7062},{"id":"minecraft:birch_trapdoor","blockRuntimeId":456},{"id":"minecraft:jungle_trapdoor","blockRuntimeId":5308},{"id":"minecraft:acacia_trapdoor","blockRuntimeId":100},{"id":"minecraft:dark_oak_trapdoor","blockRuntimeId":4020},{"id":"minecraft:iron_trapdoor","blockRuntimeId":5167},{"id":"minecraft:crimson_trapdoor","blockRuntimeId":3886},{"id":"minecraft:warped_trapdoor","blockRuntimeId":7641},{"id":"minecraft:iron_bars","blockRuntimeId":5132},{"id":"minecraft:glass","blockRuntimeId":4882},{"id":"minecraft:stained_glass","blockRuntimeId":7084},{"id":"minecraft:stained_glass","blockRuntimeId":7092},{"id":"minecraft:stained_glass","blockRuntimeId":7091},{"id":"minecraft:stained_glass","blockRuntimeId":7099},{"id":"minecraft:stained_glass","blockRuntimeId":7096},{"id":"minecraft:stained_glass","blockRuntimeId":7098},{"id":"minecraft:stained_glass","blockRuntimeId":7085},{"id":"minecraft:stained_glass","blockRuntimeId":7088},{"id":"minecraft:stained_glass","blockRuntimeId":7089},{"id":"minecraft:stained_glass","blockRuntimeId":7097},{"id":"minecraft:stained_glass","blockRuntimeId":7093},{"id":"minecraft:stained_glass","blockRuntimeId":7087},{"id":"minecraft:stained_glass","blockRuntimeId":7095},{"id":"minecraft:stained_glass","blockRuntimeId":7094},{"id":"minecraft:stained_glass","blockRuntimeId":7086},{"id":"minecraft:stained_glass","blockRuntimeId":7090},{"id":"minecraft:tinted_glass","blockRuntimeId":7348},{"id":"minecraft:glass_pane","blockRuntimeId":4883},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7100},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7108},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7107},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7115},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7112},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7114},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7101},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7104},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7105},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7113},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7109},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7103},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7111},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7110},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7102},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7106},{"id":"minecraft:ladder","blockRuntimeId":5356},{"id":"minecraft:scaffolding","blockRuntimeId":6727},{"id":"minecraft:double_stone_slab","blockRuntimeId":7219},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7269},{"id":"minecraft:double_stone_slab","blockRuntimeId":7222},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7240},{"id":"minecraft:wooden_slab","blockRuntimeId":7899},{"id":"minecraft:wooden_slab","blockRuntimeId":7900},{"id":"minecraft:wooden_slab","blockRuntimeId":7901},{"id":"minecraft:wooden_slab","blockRuntimeId":7902},{"id":"minecraft:wooden_slab","blockRuntimeId":7903},{"id":"minecraft:wooden_slab","blockRuntimeId":7904},{"id":"minecraft:double_stone_slab","blockRuntimeId":7224},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7267},{"id":"minecraft:double_stone_slab","blockRuntimeId":7220},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7270},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7241},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7235},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7271},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7252},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7257},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7258},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7255},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7256},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7254},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7253},{"id":"minecraft:double_stone_slab","blockRuntimeId":7223},{"id":"minecraft:double_stone_slab","blockRuntimeId":7226},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7242},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7251},{"id":"minecraft:double_stone_slab","blockRuntimeId":7225},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7268},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7236},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7237},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7238},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7239},{"id":"minecraft:crimson_slab","blockRuntimeId":3857},{"id":"minecraft:warped_slab","blockRuntimeId":7612},{"id":"minecraft:blackstone_slab","blockRuntimeId":497},{"id":"minecraft:polished_blackstone_slab","blockRuntimeId":6028},{"id":"minecraft:polished_blackstone_brick_slab","blockRuntimeId":5825},{"id":"minecraft:cut_copper_slab","blockRuntimeId":3910},{"id":"minecraft:exposed_cut_copper_slab","blockRuntimeId":4753},{"id":"minecraft:weathered_cut_copper_slab","blockRuntimeId":7739},{"id":"minecraft:oxidized_cut_copper_slab","blockRuntimeId":5753},{"id":"minecraft:waxed_cut_copper_slab","blockRuntimeId":7683},{"id":"minecraft:waxed_exposed_cut_copper_slab","blockRuntimeId":7697},{"id":"minecraft:waxed_weathered_cut_copper_slab","blockRuntimeId":7725},{"id":"minecraft:waxed_oxidized_cut_copper_slab","blockRuntimeId":7711},{"id":"minecraft:cobbled_deepslate_slab","blockRuntimeId":1145},{"id":"minecraft:polished_deepslate_slab","blockRuntimeId":6203},{"id":"minecraft:deepslate_tile_slab","blockRuntimeId":4287},{"id":"minecraft:deepslate_brick_slab","blockRuntimeId":4104},{"id":"minecraft:brick_block","blockRuntimeId":875},{"id":"minecraft:chiseled_nether_bricks","blockRuntimeId":1130},{"id":"minecraft:cracked_nether_bricks","blockRuntimeId":3768},{"id":"minecraft:quartz_bricks","blockRuntimeId":6554},{"id":"minecraft:stonebrick","blockRuntimeId":7285},{"id":"minecraft:stonebrick","blockRuntimeId":7286},{"id":"minecraft:stonebrick","blockRuntimeId":7287},{"id":"minecraft:stonebrick","blockRuntimeId":7288},{"id":"minecraft:end_bricks","blockRuntimeId":4727},{"id":"minecraft:prismarine","blockRuntimeId":6437},{"id":"minecraft:polished_blackstone_bricks","blockRuntimeId":5997},{"id":"minecraft:cracked_polished_blackstone_bricks","blockRuntimeId":3769},{"id":"minecraft:gilded_blackstone","blockRuntimeId":4881},{"id":"minecraft:chiseled_polished_blackstone","blockRuntimeId":1131},{"id":"minecraft:deepslate_tiles","blockRuntimeId":4459},{"id":"minecraft:cracked_deepslate_tiles","blockRuntimeId":3767},{"id":"minecraft:deepslate_bricks","blockRuntimeId":4276},{"id":"minecraft:cracked_deepslate_bricks","blockRuntimeId":3766},{"id":"minecraft:chiseled_deepslate","blockRuntimeId":1129},{"id":"minecraft:cobblestone","blockRuntimeId":1317},{"id":"minecraft:mossy_cobblestone","blockRuntimeId":5666},{"id":"minecraft:cobbled_deepslate","blockRuntimeId":1142},{"id":"minecraft:smooth_stone","blockRuntimeId":6907},{"id":"minecraft:sandstone","blockRuntimeId":6703},{"id":"minecraft:sandstone","blockRuntimeId":6704},{"id":"minecraft:sandstone","blockRuntimeId":6705},{"id":"minecraft:sandstone","blockRuntimeId":6706},{"id":"minecraft:red_sandstone","blockRuntimeId":6630},{"id":"minecraft:red_sandstone","blockRuntimeId":6631},{"id":"minecraft:red_sandstone","blockRuntimeId":6632},{"id":"minecraft:red_sandstone","blockRuntimeId":6633},{"id":"minecraft:coal_block","blockRuntimeId":1140},{"id":"minecraft:dried_kelp_block","blockRuntimeId":4583},{"id":"minecraft:gold_block","blockRuntimeId":4974},{"id":"minecraft:iron_block","blockRuntimeId":5133},{"id":"minecraft:copper_block","blockRuntimeId":3676},{"id":"minecraft:exposed_copper","blockRuntimeId":4751},{"id":"minecraft:weathered_copper","blockRuntimeId":7737},{"id":"minecraft:oxidized_copper","blockRuntimeId":5751},{"id":"minecraft:waxed_copper","blockRuntimeId":7681},{"id":"minecraft:waxed_exposed_copper","blockRuntimeId":7695},{"id":"minecraft:waxed_weathered_copper","blockRuntimeId":7723},{"id":"minecraft:waxed_oxidized_copper","blockRuntimeId":7709},{"id":"minecraft:cut_copper","blockRuntimeId":3909},{"id":"minecraft:exposed_cut_copper","blockRuntimeId":4752},{"id":"minecraft:weathered_cut_copper","blockRuntimeId":7738},{"id":"minecraft:oxidized_cut_copper","blockRuntimeId":5752},{"id":"minecraft:waxed_cut_copper","blockRuntimeId":7682},{"id":"minecraft:waxed_exposed_cut_copper","blockRuntimeId":7696},{"id":"minecraft:waxed_weathered_cut_copper","blockRuntimeId":7724},{"id":"minecraft:waxed_oxidized_cut_copper","blockRuntimeId":7710},{"id":"minecraft:emerald_block","blockRuntimeId":4716},{"id":"minecraft:diamond_block","blockRuntimeId":4473},{"id":"minecraft:lapis_block","blockRuntimeId":5364},{"id":"minecraft:raw_iron_block","blockRuntimeId":6576},{"id":"minecraft:raw_copper_block","blockRuntimeId":6574},{"id":"minecraft:raw_gold_block","blockRuntimeId":6575},{"id":"minecraft:quartz_block","blockRuntimeId":6542},{"id":"minecraft:quartz_block","blockRuntimeId":6544},{"id":"minecraft:quartz_block","blockRuntimeId":6543},{"id":"minecraft:quartz_block","blockRuntimeId":6545},{"id":"minecraft:prismarine","blockRuntimeId":6435},{"id":"minecraft:prismarine","blockRuntimeId":6436},{"id":"minecraft:slime","blockRuntimeId":6860},{"id":"minecraft:honey_block","blockRuntimeId":5111},{"id":"minecraft:honeycomb_block","blockRuntimeId":5112},{"id":"minecraft:hay_block","blockRuntimeId":5083},{"id":"minecraft:bone_block","blockRuntimeId":692},{"id":"minecraft:nether_brick","blockRuntimeId":5685},{"id":"minecraft:red_nether_brick","blockRuntimeId":6621},{"id":"minecraft:netherite_block","blockRuntimeId":5702},{"id":"minecraft:lodestone","blockRuntimeId":5562},{"id":"minecraft:wool","blockRuntimeId":7911},{"id":"minecraft:wool","blockRuntimeId":7919},{"id":"minecraft:wool","blockRuntimeId":7918},{"id":"minecraft:wool","blockRuntimeId":7926},{"id":"minecraft:wool","blockRuntimeId":7923},{"id":"minecraft:wool","blockRuntimeId":7925},{"id":"minecraft:wool","blockRuntimeId":7912},{"id":"minecraft:wool","blockRuntimeId":7915},{"id":"minecraft:wool","blockRuntimeId":7916},{"id":"minecraft:wool","blockRuntimeId":7924},{"id":"minecraft:wool","blockRuntimeId":7920},{"id":"minecraft:wool","blockRuntimeId":7914},{"id":"minecraft:wool","blockRuntimeId":7922},{"id":"minecraft:wool","blockRuntimeId":7921},{"id":"minecraft:wool","blockRuntimeId":7913},{"id":"minecraft:wool","blockRuntimeId":7917},{"id":"minecraft:carpet","blockRuntimeId":963},{"id":"minecraft:carpet","blockRuntimeId":971},{"id":"minecraft:carpet","blockRuntimeId":970},{"id":"minecraft:carpet","blockRuntimeId":978},{"id":"minecraft:carpet","blockRuntimeId":975},{"id":"minecraft:carpet","blockRuntimeId":977},{"id":"minecraft:carpet","blockRuntimeId":964},{"id":"minecraft:carpet","blockRuntimeId":967},{"id":"minecraft:carpet","blockRuntimeId":968},{"id":"minecraft:carpet","blockRuntimeId":976},{"id":"minecraft:carpet","blockRuntimeId":972},{"id":"minecraft:carpet","blockRuntimeId":966},{"id":"minecraft:carpet","blockRuntimeId":974},{"id":"minecraft:carpet","blockRuntimeId":973},{"id":"minecraft:carpet","blockRuntimeId":965},{"id":"minecraft:carpet","blockRuntimeId":969},{"id":"minecraft:concrete_powder","blockRuntimeId":3659},{"id":"minecraft:concrete_powder","blockRuntimeId":3667},{"id":"minecraft:concrete_powder","blockRuntimeId":3666},{"id":"minecraft:concrete_powder","blockRuntimeId":3674},{"id":"minecraft:concrete_powder","blockRuntimeId":3671},{"id":"minecraft:concrete_powder","blockRuntimeId":3673},{"id":"minecraft:concrete_powder","blockRuntimeId":3660},{"id":"minecraft:concrete_powder","blockRuntimeId":3663},{"id":"minecraft:concrete_powder","blockRuntimeId":3664},{"id":"minecraft:concrete_powder","blockRuntimeId":3672},{"id":"minecraft:concrete_powder","blockRuntimeId":3668},{"id":"minecraft:concrete_powder","blockRuntimeId":3662},{"id":"minecraft:concrete_powder","blockRuntimeId":3670},{"id":"minecraft:concrete_powder","blockRuntimeId":3669},{"id":"minecraft:concrete_powder","blockRuntimeId":3661},{"id":"minecraft:concrete_powder","blockRuntimeId":3665},{"id":"minecraft:concrete","blockRuntimeId":3643},{"id":"minecraft:concrete","blockRuntimeId":3651},{"id":"minecraft:concrete","blockRuntimeId":3650},{"id":"minecraft:concrete","blockRuntimeId":3658},{"id":"minecraft:concrete","blockRuntimeId":3655},{"id":"minecraft:concrete","blockRuntimeId":3657},{"id":"minecraft:concrete","blockRuntimeId":3644},{"id":"minecraft:concrete","blockRuntimeId":3647},{"id":"minecraft:concrete","blockRuntimeId":3648},{"id":"minecraft:concrete","blockRuntimeId":3656},{"id":"minecraft:concrete","blockRuntimeId":3652},{"id":"minecraft:concrete","blockRuntimeId":3646},{"id":"minecraft:concrete","blockRuntimeId":3654},{"id":"minecraft:concrete","blockRuntimeId":3653},{"id":"minecraft:concrete","blockRuntimeId":3645},{"id":"minecraft:concrete","blockRuntimeId":3649},{"id":"minecraft:clay","blockRuntimeId":1139},{"id":"minecraft:hardened_clay","blockRuntimeId":5082},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7116},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7124},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7123},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7131},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7128},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7130},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7117},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7120},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7121},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7129},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7125},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7119},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7127},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7126},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7118},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7122},{"id":"minecraft:white_glazed_terracotta","blockRuntimeId":7796},{"id":"minecraft:silver_glazed_terracotta","blockRuntimeId":6842},{"id":"minecraft:gray_glazed_terracotta","blockRuntimeId":5009},{"id":"minecraft:black_glazed_terracotta","blockRuntimeId":488},{"id":"minecraft:brown_glazed_terracotta","blockRuntimeId":894},{"id":"minecraft:red_glazed_terracotta","blockRuntimeId":6598},{"id":"minecraft:orange_glazed_terracotta","blockRuntimeId":5745},{"id":"minecraft:yellow_glazed_terracotta","blockRuntimeId":7938},{"id":"minecraft:lime_glazed_terracotta","blockRuntimeId":5531},{"id":"minecraft:green_glazed_terracotta","blockRuntimeId":5025},{"id":"minecraft:cyan_glazed_terracotta","blockRuntimeId":3930},{"id":"minecraft:light_blue_glazed_terracotta","blockRuntimeId":5483},{"id":"minecraft:blue_glazed_terracotta","blockRuntimeId":685},{"id":"minecraft:purple_glazed_terracotta","blockRuntimeId":6516},{"id":"minecraft:magenta_glazed_terracotta","blockRuntimeId":5595},{"id":"minecraft:pink_glazed_terracotta","blockRuntimeId":5776},{"id":"minecraft:purpur_block","blockRuntimeId":6522},{"id":"minecraft:purpur_block","blockRuntimeId":6524},{"id":"minecraft:nether_wart_block","blockRuntimeId":5701},{"id":"minecraft:warped_wart_block","blockRuntimeId":7663},{"id":"minecraft:shroomlight","blockRuntimeId":6825},{"id":"minecraft:crimson_nylium","blockRuntimeId":3838},{"id":"minecraft:warped_nylium","blockRuntimeId":7593},{"id":"minecraft:basalt","blockRuntimeId":214},{"id":"minecraft:polished_basalt","blockRuntimeId":5819},{"id":"minecraft:smooth_basalt","blockRuntimeId":6882},{"id":"minecraft:soul_soil","blockRuntimeId":6952},{"id":"minecraft:dirt","blockRuntimeId":4483},{"id":"minecraft:dirt","blockRuntimeId":4484},{"id":"minecraft:farmland","blockRuntimeId":4765},{"id":"minecraft:grass","blockRuntimeId":4996},{"id":"minecraft:grass_path","blockRuntimeId":4997},{"id":"minecraft:podzol","blockRuntimeId":5800},{"id":"minecraft:mycelium","blockRuntimeId":5684},{"id":"minecraft:stone","blockRuntimeId":7176},{"id":"minecraft:iron_ore","blockRuntimeId":5166},{"id":"minecraft:gold_ore","blockRuntimeId":4975},{"id":"minecraft:diamond_ore","blockRuntimeId":4474},{"id":"minecraft:lapis_ore","blockRuntimeId":5365},{"id":"minecraft:redstone_ore","blockRuntimeId":6644},{"id":"minecraft:coal_ore","blockRuntimeId":1141},{"id":"minecraft:copper_ore","blockRuntimeId":3677},{"id":"minecraft:emerald_ore","blockRuntimeId":4717},{"id":"minecraft:quartz_ore","blockRuntimeId":6555},{"id":"minecraft:nether_gold_ore","blockRuntimeId":5695},{"id":"minecraft:ancient_debris","blockRuntimeId":143},{"id":"minecraft:deepslate_iron_ore","blockRuntimeId":4282},{"id":"minecraft:deepslate_gold_ore","blockRuntimeId":4281},{"id":"minecraft:deepslate_diamond_ore","blockRuntimeId":4279},{"id":"minecraft:deepslate_lapis_ore","blockRuntimeId":4283},{"id":"minecraft:deepslate_redstone_ore","blockRuntimeId":4284},{"id":"minecraft:deepslate_emerald_ore","blockRuntimeId":4280},{"id":"minecraft:deepslate_coal_ore","blockRuntimeId":4277},{"id":"minecraft:deepslate_copper_ore","blockRuntimeId":4278},{"id":"minecraft:gravel","blockRuntimeId":4998},{"id":"minecraft:stone","blockRuntimeId":7177},{"id":"minecraft:stone","blockRuntimeId":7179},{"id":"minecraft:stone","blockRuntimeId":7181},{"id":"minecraft:blackstone","blockRuntimeId":494},{"id":"minecraft:deepslate","blockRuntimeId":4099},{"id":"minecraft:stone","blockRuntimeId":7178},{"id":"minecraft:stone","blockRuntimeId":7180},{"id":"minecraft:stone","blockRuntimeId":7182},{"id":"minecraft:polished_blackstone","blockRuntimeId":5822},{"id":"minecraft:polished_deepslate","blockRuntimeId":6200},{"id":"minecraft:sand","blockRuntimeId":6701},{"id":"minecraft:sand","blockRuntimeId":6702},{"id":"minecraft:cactus","blockRuntimeId":920},{"id":"minecraft:log","blockRuntimeId":5563},{"id":"minecraft:stripped_oak_log","blockRuntimeId":7315},{"id":"minecraft:log","blockRuntimeId":5564},{"id":"minecraft:stripped_spruce_log","blockRuntimeId":7318},{"id":"minecraft:log","blockRuntimeId":5565},{"id":"minecraft:stripped_birch_log","blockRuntimeId":7300},{"id":"minecraft:log","blockRuntimeId":5566},{"id":"minecraft:stripped_jungle_log","blockRuntimeId":7312},{"id":"minecraft:log2","blockRuntimeId":5575},{"id":"minecraft:stripped_acacia_log","blockRuntimeId":7297},{"id":"minecraft:log2","blockRuntimeId":5576},{"id":"minecraft:stripped_dark_oak_log","blockRuntimeId":7309},{"id":"minecraft:crimson_stem","blockRuntimeId":3883},{"id":"minecraft:stripped_crimson_stem","blockRuntimeId":7306},{"id":"minecraft:warped_stem","blockRuntimeId":7638},{"id":"minecraft:stripped_warped_stem","blockRuntimeId":7324},{"id":"minecraft:wood","blockRuntimeId":7803},{"id":"minecraft:wood","blockRuntimeId":7809},{"id":"minecraft:wood","blockRuntimeId":7804},{"id":"minecraft:wood","blockRuntimeId":7810},{"id":"minecraft:wood","blockRuntimeId":7805},{"id":"minecraft:wood","blockRuntimeId":7811},{"id":"minecraft:wood","blockRuntimeId":7806},{"id":"minecraft:wood","blockRuntimeId":7812},{"id":"minecraft:wood","blockRuntimeId":7807},{"id":"minecraft:wood","blockRuntimeId":7813},{"id":"minecraft:wood","blockRuntimeId":7808},{"id":"minecraft:wood","blockRuntimeId":7814},{"id":"minecraft:crimson_hyphae","blockRuntimeId":3835},{"id":"minecraft:stripped_crimson_hyphae","blockRuntimeId":7303},{"id":"minecraft:warped_hyphae","blockRuntimeId":7590},{"id":"minecraft:stripped_warped_hyphae","blockRuntimeId":7321},{"id":"minecraft:leaves","blockRuntimeId":5409},{"id":"minecraft:leaves","blockRuntimeId":5410},{"id":"minecraft:leaves","blockRuntimeId":5411},{"id":"minecraft:leaves","blockRuntimeId":5412},{"id":"minecraft:leaves2","blockRuntimeId":5425},{"id":"minecraft:leaves2","blockRuntimeId":5426},{"id":"minecraft:azalea_leaves","blockRuntimeId":169},{"id":"minecraft:azalea_leaves_flowered","blockRuntimeId":173},{"id":"minecraft:sapling","blockRuntimeId":6715},{"id":"minecraft:sapling","blockRuntimeId":6716},{"id":"minecraft:sapling","blockRuntimeId":6717},{"id":"minecraft:sapling","blockRuntimeId":6718},{"id":"minecraft:sapling","blockRuntimeId":6719},{"id":"minecraft:sapling","blockRuntimeId":6720},{"id":"minecraft:bee_nest","blockRuntimeId":236},{"id":"minecraft:wheat_seeds"},{"id":"minecraft:pumpkin_seeds"},{"id":"minecraft:melon_seeds"},{"id":"minecraft:beetroot_seeds"},{"id":"minecraft:wheat"},{"id":"minecraft:beetroot"},{"id":"minecraft:potato"},{"id":"minecraft:poisonous_potato"},{"id":"minecraft:carrot"},{"id":"minecraft:golden_carrot"},{"id":"minecraft:apple"},{"id":"minecraft:golden_apple"},{"id":"minecraft:enchanted_golden_apple"},{"id":"minecraft:melon_block","blockRuntimeId":5608},{"id":"minecraft:melon_slice"},{"id":"minecraft:glistering_melon_slice"},{"id":"minecraft:sweet_berries"},{"id":"minecraft:glow_berries"},{"id":"minecraft:pumpkin","blockRuntimeId":6454},{"id":"minecraft:carved_pumpkin","blockRuntimeId":988},{"id":"minecraft:lit_pumpkin","blockRuntimeId":5550},{"id":"minecraft:honeycomb"},{"id":"minecraft:tallgrass","blockRuntimeId":7345},{"id":"minecraft:double_plant","blockRuntimeId":4503},{"id":"minecraft:tallgrass","blockRuntimeId":7344},{"id":"minecraft:double_plant","blockRuntimeId":4502},{"id":"minecraft:nether_sprouts"},{"id":"minecraft:coral","blockRuntimeId":3681},{"id":"minecraft:coral","blockRuntimeId":3679},{"id":"minecraft:coral","blockRuntimeId":3680},{"id":"minecraft:coral","blockRuntimeId":3678},{"id":"minecraft:coral","blockRuntimeId":3682},{"id":"minecraft:coral","blockRuntimeId":3686},{"id":"minecraft:coral","blockRuntimeId":3684},{"id":"minecraft:coral","blockRuntimeId":3685},{"id":"minecraft:coral","blockRuntimeId":3683},{"id":"minecraft:coral","blockRuntimeId":3687},{"id":"minecraft:coral_fan","blockRuntimeId":3701},{"id":"minecraft:coral_fan","blockRuntimeId":3699},{"id":"minecraft:coral_fan","blockRuntimeId":3700},{"id":"minecraft:coral_fan","blockRuntimeId":3698},{"id":"minecraft:coral_fan","blockRuntimeId":3702},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3711},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3709},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3710},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3708},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3712},{"id":"minecraft:kelp"},{"id":"minecraft:seagrass","blockRuntimeId":6821},{"id":"minecraft:crimson_roots","blockRuntimeId":3856},{"id":"minecraft:warped_roots","blockRuntimeId":7611},{"id":"minecraft:yellow_flower","blockRuntimeId":7937},{"id":"minecraft:red_flower","blockRuntimeId":6587},{"id":"minecraft:red_flower","blockRuntimeId":6588},{"id":"minecraft:red_flower","blockRuntimeId":6589},{"id":"minecraft:red_flower","blockRuntimeId":6590},{"id":"minecraft:red_flower","blockRuntimeId":6591},{"id":"minecraft:red_flower","blockRuntimeId":6592},{"id":"minecraft:red_flower","blockRuntimeId":6593},{"id":"minecraft:red_flower","blockRuntimeId":6594},{"id":"minecraft:red_flower","blockRuntimeId":6595},{"id":"minecraft:red_flower","blockRuntimeId":6596},{"id":"minecraft:red_flower","blockRuntimeId":6597},{"id":"minecraft:double_plant","blockRuntimeId":4500},{"id":"minecraft:double_plant","blockRuntimeId":4501},{"id":"minecraft:double_plant","blockRuntimeId":4504},{"id":"minecraft:double_plant","blockRuntimeId":4505},{"id":"minecraft:wither_rose","blockRuntimeId":7802},{"id":"minecraft:white_dye"},{"id":"minecraft:light_gray_dye"},{"id":"minecraft:gray_dye"},{"id":"minecraft:black_dye"},{"id":"minecraft:brown_dye"},{"id":"minecraft:red_dye"},{"id":"minecraft:orange_dye"},{"id":"minecraft:yellow_dye"},{"id":"minecraft:lime_dye"},{"id":"minecraft:green_dye"},{"id":"minecraft:cyan_dye"},{"id":"minecraft:light_blue_dye"},{"id":"minecraft:blue_dye"},{"id":"minecraft:purple_dye"},{"id":"minecraft:magenta_dye"},{"id":"minecraft:pink_dye"},{"id":"minecraft:ink_sac"},{"id":"minecraft:glow_ink_sac"},{"id":"minecraft:cocoa_beans"},{"id":"minecraft:lapis_lazuli"},{"id":"minecraft:bone_meal"},{"id":"minecraft:vine","blockRuntimeId":7498},{"id":"minecraft:weeping_vines","blockRuntimeId":7752},{"id":"minecraft:twisting_vines","blockRuntimeId":7426},{"id":"minecraft:waterlily","blockRuntimeId":7680},{"id":"minecraft:deadbush","blockRuntimeId":4098},{"id":"minecraft:bamboo","blockRuntimeId":177},{"id":"minecraft:snow","blockRuntimeId":6908},{"id":"minecraft:ice","blockRuntimeId":5125},{"id":"minecraft:packed_ice","blockRuntimeId":5765},{"id":"minecraft:blue_ice","blockRuntimeId":691},{"id":"minecraft:snow_layer","blockRuntimeId":6909},{"id":"minecraft:pointed_dripstone","blockRuntimeId":5806},{"id":"minecraft:sculk_sensor","blockRuntimeId":6745},{"id":"minecraft:dripstone_block","blockRuntimeId":4584},{"id":"minecraft:moss_carpet","blockRuntimeId":5665},{"id":"minecraft:moss_block","blockRuntimeId":5664},{"id":"minecraft:dirt_with_roots","blockRuntimeId":4485},{"id":"minecraft:hanging_roots","blockRuntimeId":5047},{"id":"minecraft:big_dripleaf","blockRuntimeId":328},{"id":"minecraft:small_dripleaf_block","blockRuntimeId":6874},{"id":"minecraft:spore_blossom","blockRuntimeId":6961},{"id":"minecraft:azalea","blockRuntimeId":168},{"id":"minecraft:flowering_azalea","blockRuntimeId":4814},{"id":"minecraft:glow_lichen","blockRuntimeId":4971},{"id":"minecraft:amethyst_block","blockRuntimeId":136},{"id":"minecraft:budding_amethyst","blockRuntimeId":919},{"id":"minecraft:amethyst_cluster","blockRuntimeId":137},{"id":"minecraft:large_amethyst_bud","blockRuntimeId":5366},{"id":"minecraft:medium_amethyst_bud","blockRuntimeId":5602},{"id":"minecraft:small_amethyst_bud","blockRuntimeId":6861},{"id":"minecraft:tuff","blockRuntimeId":7413},{"id":"minecraft:calcite","blockRuntimeId":943},{"id":"minecraft:chicken"},{"id":"minecraft:porkchop"},{"id":"minecraft:beef"},{"id":"minecraft:mutton"},{"id":"minecraft:rabbit"},{"id":"minecraft:cod"},{"id":"minecraft:salmon"},{"id":"minecraft:tropical_fish"},{"id":"minecraft:pufferfish"},{"id":"minecraft:brown_mushroom","blockRuntimeId":900},{"id":"minecraft:red_mushroom","blockRuntimeId":6604},{"id":"minecraft:crimson_fungus","blockRuntimeId":3834},{"id":"minecraft:warped_fungus","blockRuntimeId":7589},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":915},{"id":"minecraft:red_mushroom_block","blockRuntimeId":6619},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":916},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":901},{"id":"minecraft:egg"},{"id":"minecraft:sugar_cane"},{"id":"minecraft:sugar"},{"id":"minecraft:rotten_flesh"},{"id":"minecraft:bone"},{"id":"minecraft:web","blockRuntimeId":7751},{"id":"minecraft:spider_eye"},{"id":"minecraft:mob_spawner","blockRuntimeId":5657},{"id":"minecraft:monster_egg","blockRuntimeId":5658},{"id":"minecraft:monster_egg","blockRuntimeId":5659},{"id":"minecraft:monster_egg","blockRuntimeId":5660},{"id":"minecraft:monster_egg","blockRuntimeId":5661},{"id":"minecraft:monster_egg","blockRuntimeId":5662},{"id":"minecraft:monster_egg","blockRuntimeId":5663},{"id":"minecraft:infested_deepslate","blockRuntimeId":5126},{"id":"minecraft:dragon_egg","blockRuntimeId":4582},{"id":"minecraft:turtle_egg","blockRuntimeId":7414},{"id":"minecraft:chicken_spawn_egg"},{"id":"minecraft:bee_spawn_egg"},{"id":"minecraft:cow_spawn_egg"},{"id":"minecraft:pig_spawn_egg"},{"id":"minecraft:sheep_spawn_egg"},{"id":"minecraft:wolf_spawn_egg"},{"id":"minecraft:polar_bear_spawn_egg"},{"id":"minecraft:ocelot_spawn_egg"},{"id":"minecraft:cat_spawn_egg"},{"id":"minecraft:mooshroom_spawn_egg"},{"id":"minecraft:bat_spawn_egg"},{"id":"minecraft:parrot_spawn_egg"},{"id":"minecraft:rabbit_spawn_egg"},{"id":"minecraft:llama_spawn_egg"},{"id":"minecraft:horse_spawn_egg"},{"id":"minecraft:donkey_spawn_egg"},{"id":"minecraft:mule_spawn_egg"},{"id":"minecraft:skeleton_horse_spawn_egg"},{"id":"minecraft:zombie_horse_spawn_egg"},{"id":"minecraft:tropical_fish_spawn_egg"},{"id":"minecraft:cod_spawn_egg"},{"id":"minecraft:pufferfish_spawn_egg"},{"id":"minecraft:salmon_spawn_egg"},{"id":"minecraft:dolphin_spawn_egg"},{"id":"minecraft:turtle_spawn_egg"},{"id":"minecraft:panda_spawn_egg"},{"id":"minecraft:fox_spawn_egg"},{"id":"minecraft:creeper_spawn_egg"},{"id":"minecraft:enderman_spawn_egg"},{"id":"minecraft:silverfish_spawn_egg"},{"id":"minecraft:skeleton_spawn_egg"},{"id":"minecraft:wither_skeleton_spawn_egg"},{"id":"minecraft:stray_spawn_egg"},{"id":"minecraft:slime_spawn_egg"},{"id":"minecraft:spider_spawn_egg"},{"id":"minecraft:zombie_spawn_egg"},{"id":"minecraft:zombie_pigman_spawn_egg"},{"id":"minecraft:husk_spawn_egg"},{"id":"minecraft:drowned_spawn_egg"},{"id":"minecraft:squid_spawn_egg"},{"id":"minecraft:glow_squid_spawn_egg"},{"id":"minecraft:cave_spider_spawn_egg"},{"id":"minecraft:witch_spawn_egg"},{"id":"minecraft:guardian_spawn_egg"},{"id":"minecraft:elder_guardian_spawn_egg"},{"id":"minecraft:endermite_spawn_egg"},{"id":"minecraft:magma_cube_spawn_egg"},{"id":"minecraft:strider_spawn_egg"},{"id":"minecraft:hoglin_spawn_egg"},{"id":"minecraft:piglin_spawn_egg"},{"id":"minecraft:zoglin_spawn_egg"},{"id":"minecraft:piglin_brute_spawn_egg"},{"id":"minecraft:goat_spawn_egg"},{"id":"minecraft:axolotl_spawn_egg"},{"id":"minecraft:ghast_spawn_egg"},{"id":"minecraft:blaze_spawn_egg"},{"id":"minecraft:shulker_spawn_egg"},{"id":"minecraft:vindicator_spawn_egg"},{"id":"minecraft:evoker_spawn_egg"},{"id":"minecraft:vex_spawn_egg"},{"id":"minecraft:villager_spawn_egg"},{"id":"minecraft:wandering_trader_spawn_egg"},{"id":"minecraft:zombie_villager_spawn_egg"},{"id":"minecraft:phantom_spawn_egg"},{"id":"minecraft:pillager_spawn_egg"},{"id":"minecraft:ravager_spawn_egg"},{"id":"minecraft:obsidian","blockRuntimeId":5734},{"id":"minecraft:crying_obsidian","blockRuntimeId":3908},{"id":"minecraft:bedrock","blockRuntimeId":234},{"id":"minecraft:soul_sand","blockRuntimeId":6951},{"id":"minecraft:netherrack","blockRuntimeId":5703},{"id":"minecraft:magma","blockRuntimeId":5601},{"id":"minecraft:nether_wart"},{"id":"minecraft:end_stone","blockRuntimeId":4744},{"id":"minecraft:chorus_flower","blockRuntimeId":1132},{"id":"minecraft:chorus_plant","blockRuntimeId":1138},{"id":"minecraft:chorus_fruit"},{"id":"minecraft:popped_chorus_fruit"},{"id":"minecraft:sponge","blockRuntimeId":6959},{"id":"minecraft:sponge","blockRuntimeId":6960},{"id":"minecraft:coral_block","blockRuntimeId":3688},{"id":"minecraft:coral_block","blockRuntimeId":3689},{"id":"minecraft:coral_block","blockRuntimeId":3690},{"id":"minecraft:coral_block","blockRuntimeId":3691},{"id":"minecraft:coral_block","blockRuntimeId":3692},{"id":"minecraft:coral_block","blockRuntimeId":3693},{"id":"minecraft:coral_block","blockRuntimeId":3694},{"id":"minecraft:coral_block","blockRuntimeId":3695},{"id":"minecraft:coral_block","blockRuntimeId":3696},{"id":"minecraft:coral_block","blockRuntimeId":3697},{"id":"minecraft:leather_helmet"},{"id":"minecraft:chainmail_helmet"},{"id":"minecraft:iron_helmet"},{"id":"minecraft:golden_helmet"},{"id":"minecraft:diamond_helmet"},{"id":"minecraft:netherite_helmet"},{"id":"minecraft:leather_chestplate"},{"id":"minecraft:chainmail_chestplate"},{"id":"minecraft:iron_chestplate"},{"id":"minecraft:golden_chestplate"},{"id":"minecraft:diamond_chestplate"},{"id":"minecraft:netherite_chestplate"},{"id":"minecraft:leather_leggings"},{"id":"minecraft:chainmail_leggings"},{"id":"minecraft:iron_leggings"},{"id":"minecraft:golden_leggings"},{"id":"minecraft:diamond_leggings"},{"id":"minecraft:netherite_leggings"},{"id":"minecraft:leather_boots"},{"id":"minecraft:chainmail_boots"},{"id":"minecraft:iron_boots"},{"id":"minecraft:golden_boots"},{"id":"minecraft:diamond_boots"},{"id":"minecraft:netherite_boots"},{"id":"minecraft:wooden_sword"},{"id":"minecraft:stone_sword"},{"id":"minecraft:iron_sword"},{"id":"minecraft:golden_sword"},{"id":"minecraft:diamond_sword"},{"id":"minecraft:netherite_sword"},{"id":"minecraft:wooden_axe"},{"id":"minecraft:stone_axe"},{"id":"minecraft:iron_axe"},{"id":"minecraft:golden_axe"},{"id":"minecraft:diamond_axe"},{"id":"minecraft:netherite_axe"},{"id":"minecraft:wooden_pickaxe"},{"id":"minecraft:stone_pickaxe"},{"id":"minecraft:iron_pickaxe"},{"id":"minecraft:golden_pickaxe"},{"id":"minecraft:diamond_pickaxe"},{"id":"minecraft:netherite_pickaxe"},{"id":"minecraft:wooden_shovel"},{"id":"minecraft:stone_shovel"},{"id":"minecraft:iron_shovel"},{"id":"minecraft:golden_shovel"},{"id":"minecraft:diamond_shovel"},{"id":"minecraft:netherite_shovel"},{"id":"minecraft:wooden_hoe"},{"id":"minecraft:stone_hoe"},{"id":"minecraft:iron_hoe"},{"id":"minecraft:golden_hoe"},{"id":"minecraft:diamond_hoe"},{"id":"minecraft:netherite_hoe"},{"id":"minecraft:bow"},{"id":"minecraft:crossbow"},{"id":"minecraft:arrow"},{"id":"minecraft:arrow","damage":6},{"id":"minecraft:arrow","damage":7},{"id":"minecraft:arrow","damage":8},{"id":"minecraft:arrow","damage":9},{"id":"minecraft:arrow","damage":10},{"id":"minecraft:arrow","damage":11},{"id":"minecraft:arrow","damage":12},{"id":"minecraft:arrow","damage":13},{"id":"minecraft:arrow","damage":14},{"id":"minecraft:arrow","damage":15},{"id":"minecraft:arrow","damage":16},{"id":"minecraft:arrow","damage":17},{"id":"minecraft:arrow","damage":18},{"id":"minecraft:arrow","damage":19},{"id":"minecraft:arrow","damage":20},{"id":"minecraft:arrow","damage":21},{"id":"minecraft:arrow","damage":22},{"id":"minecraft:arrow","damage":23},{"id":"minecraft:arrow","damage":24},{"id":"minecraft:arrow","damage":25},{"id":"minecraft:arrow","damage":26},{"id":"minecraft:arrow","damage":27},{"id":"minecraft:arrow","damage":28},{"id":"minecraft:arrow","damage":29},{"id":"minecraft:arrow","damage":30},{"id":"minecraft:arrow","damage":31},{"id":"minecraft:arrow","damage":32},{"id":"minecraft:arrow","damage":33},{"id":"minecraft:arrow","damage":34},{"id":"minecraft:arrow","damage":35},{"id":"minecraft:arrow","damage":36},{"id":"minecraft:arrow","damage":37},{"id":"minecraft:arrow","damage":38},{"id":"minecraft:arrow","damage":39},{"id":"minecraft:arrow","damage":40},{"id":"minecraft:arrow","damage":41},{"id":"minecraft:arrow","damage":42},{"id":"minecraft:arrow","damage":43},{"id":"minecraft:shield"},{"id":"minecraft:cooked_chicken"},{"id":"minecraft:cooked_porkchop"},{"id":"minecraft:cooked_beef"},{"id":"minecraft:cooked_mutton"},{"id":"minecraft:cooked_rabbit"},{"id":"minecraft:cooked_cod"},{"id":"minecraft:cooked_salmon"},{"id":"minecraft:bread"},{"id":"minecraft:mushroom_stew"},{"id":"minecraft:beetroot_soup"},{"id":"minecraft:rabbit_stew"},{"id":"minecraft:baked_potato"},{"id":"minecraft:cookie"},{"id":"minecraft:pumpkin_pie"},{"id":"minecraft:cake"},{"id":"minecraft:dried_kelp"},{"id":"minecraft:fishing_rod"},{"id":"minecraft:carrot_on_a_stick"},{"id":"minecraft:warped_fungus_on_a_stick"},{"id":"minecraft:snowball"},{"id":"minecraft:shears"},{"id":"minecraft:flint_and_steel"},{"id":"minecraft:lead"},{"id":"minecraft:clock"},{"id":"minecraft:compass"},{"id":"minecraft:empty_map"},{"id":"minecraft:empty_map","damage":2},{"id":"minecraft:saddle"},{"id":"minecraft:leather_horse_armor"},{"id":"minecraft:iron_horse_armor"},{"id":"minecraft:golden_horse_armor"},{"id":"minecraft:diamond_horse_armor"},{"id":"minecraft:trident"},{"id":"minecraft:turtle_helmet"},{"id":"minecraft:elytra"},{"id":"minecraft:totem_of_undying"},{"id":"minecraft:glass_bottle"},{"id":"minecraft:experience_bottle"},{"id":"minecraft:potion"},{"id":"minecraft:potion","damage":1},{"id":"minecraft:potion","damage":2},{"id":"minecraft:potion","damage":3},{"id":"minecraft:potion","damage":4},{"id":"minecraft:potion","damage":5},{"id":"minecraft:potion","damage":6},{"id":"minecraft:potion","damage":7},{"id":"minecraft:potion","damage":8},{"id":"minecraft:potion","damage":9},{"id":"minecraft:potion","damage":10},{"id":"minecraft:potion","damage":11},{"id":"minecraft:potion","damage":12},{"id":"minecraft:potion","damage":13},{"id":"minecraft:potion","damage":14},{"id":"minecraft:potion","damage":15},{"id":"minecraft:potion","damage":16},{"id":"minecraft:potion","damage":17},{"id":"minecraft:potion","damage":18},{"id":"minecraft:potion","damage":19},{"id":"minecraft:potion","damage":20},{"id":"minecraft:potion","damage":21},{"id":"minecraft:potion","damage":22},{"id":"minecraft:potion","damage":23},{"id":"minecraft:potion","damage":24},{"id":"minecraft:potion","damage":25},{"id":"minecraft:potion","damage":26},{"id":"minecraft:potion","damage":27},{"id":"minecraft:potion","damage":28},{"id":"minecraft:potion","damage":29},{"id":"minecraft:potion","damage":30},{"id":"minecraft:potion","damage":31},{"id":"minecraft:potion","damage":32},{"id":"minecraft:potion","damage":33},{"id":"minecraft:potion","damage":34},{"id":"minecraft:potion","damage":35},{"id":"minecraft:potion","damage":36},{"id":"minecraft:potion","damage":37},{"id":"minecraft:potion","damage":38},{"id":"minecraft:potion","damage":39},{"id":"minecraft:potion","damage":40},{"id":"minecraft:potion","damage":41},{"id":"minecraft:potion","damage":42},{"id":"minecraft:splash_potion"},{"id":"minecraft:splash_potion","damage":1},{"id":"minecraft:splash_potion","damage":2},{"id":"minecraft:splash_potion","damage":3},{"id":"minecraft:splash_potion","damage":4},{"id":"minecraft:splash_potion","damage":5},{"id":"minecraft:splash_potion","damage":6},{"id":"minecraft:splash_potion","damage":7},{"id":"minecraft:splash_potion","damage":8},{"id":"minecraft:splash_potion","damage":9},{"id":"minecraft:splash_potion","damage":10},{"id":"minecraft:splash_potion","damage":11},{"id":"minecraft:splash_potion","damage":12},{"id":"minecraft:splash_potion","damage":13},{"id":"minecraft:splash_potion","damage":14},{"id":"minecraft:splash_potion","damage":15},{"id":"minecraft:splash_potion","damage":16},{"id":"minecraft:splash_potion","damage":17},{"id":"minecraft:splash_potion","damage":18},{"id":"minecraft:splash_potion","damage":19},{"id":"minecraft:splash_potion","damage":20},{"id":"minecraft:splash_potion","damage":21},{"id":"minecraft:splash_potion","damage":22},{"id":"minecraft:splash_potion","damage":23},{"id":"minecraft:splash_potion","damage":24},{"id":"minecraft:splash_potion","damage":25},{"id":"minecraft:splash_potion","damage":26},{"id":"minecraft:splash_potion","damage":27},{"id":"minecraft:splash_potion","damage":28},{"id":"minecraft:splash_potion","damage":29},{"id":"minecraft:splash_potion","damage":30},{"id":"minecraft:splash_potion","damage":31},{"id":"minecraft:splash_potion","damage":32},{"id":"minecraft:splash_potion","damage":33},{"id":"minecraft:splash_potion","damage":34},{"id":"minecraft:splash_potion","damage":35},{"id":"minecraft:splash_potion","damage":36},{"id":"minecraft:splash_potion","damage":37},{"id":"minecraft:splash_potion","damage":38},{"id":"minecraft:splash_potion","damage":39},{"id":"minecraft:splash_potion","damage":40},{"id":"minecraft:splash_potion","damage":41},{"id":"minecraft:splash_potion","damage":42},{"id":"minecraft:lingering_potion"},{"id":"minecraft:lingering_potion","damage":1},{"id":"minecraft:lingering_potion","damage":2},{"id":"minecraft:lingering_potion","damage":3},{"id":"minecraft:lingering_potion","damage":4},{"id":"minecraft:lingering_potion","damage":5},{"id":"minecraft:lingering_potion","damage":6},{"id":"minecraft:lingering_potion","damage":7},{"id":"minecraft:lingering_potion","damage":8},{"id":"minecraft:lingering_potion","damage":9},{"id":"minecraft:lingering_potion","damage":10},{"id":"minecraft:lingering_potion","damage":11},{"id":"minecraft:lingering_potion","damage":12},{"id":"minecraft:lingering_potion","damage":13},{"id":"minecraft:lingering_potion","damage":14},{"id":"minecraft:lingering_potion","damage":15},{"id":"minecraft:lingering_potion","damage":16},{"id":"minecraft:lingering_potion","damage":17},{"id":"minecraft:lingering_potion","damage":18},{"id":"minecraft:lingering_potion","damage":19},{"id":"minecraft:lingering_potion","damage":20},{"id":"minecraft:lingering_potion","damage":21},{"id":"minecraft:lingering_potion","damage":22},{"id":"minecraft:lingering_potion","damage":23},{"id":"minecraft:lingering_potion","damage":24},{"id":"minecraft:lingering_potion","damage":25},{"id":"minecraft:lingering_potion","damage":26},{"id":"minecraft:lingering_potion","damage":27},{"id":"minecraft:lingering_potion","damage":28},{"id":"minecraft:lingering_potion","damage":29},{"id":"minecraft:lingering_potion","damage":30},{"id":"minecraft:lingering_potion","damage":31},{"id":"minecraft:lingering_potion","damage":32},{"id":"minecraft:lingering_potion","damage":33},{"id":"minecraft:lingering_potion","damage":34},{"id":"minecraft:lingering_potion","damage":35},{"id":"minecraft:lingering_potion","damage":36},{"id":"minecraft:lingering_potion","damage":37},{"id":"minecraft:lingering_potion","damage":38},{"id":"minecraft:lingering_potion","damage":39},{"id":"minecraft:lingering_potion","damage":40},{"id":"minecraft:lingering_potion","damage":41},{"id":"minecraft:lingering_potion","damage":42},{"id":"minecraft:spyglass"},{"id":"minecraft:stick"},{"id":"minecraft:bed"},{"id":"minecraft:bed","damage":8},{"id":"minecraft:bed","damage":7},{"id":"minecraft:bed","damage":15},{"id":"minecraft:bed","damage":12},{"id":"minecraft:bed","damage":14},{"id":"minecraft:bed","damage":1},{"id":"minecraft:bed","damage":4},{"id":"minecraft:bed","damage":5},{"id":"minecraft:bed","damage":13},{"id":"minecraft:bed","damage":9},{"id":"minecraft:bed","damage":3},{"id":"minecraft:bed","damage":11},{"id":"minecraft:bed","damage":10},{"id":"minecraft:bed","damage":2},{"id":"minecraft:bed","damage":6},{"id":"minecraft:torch","blockRuntimeId":7353},{"id":"minecraft:soul_torch","blockRuntimeId":6953},{"id":"minecraft:sea_pickle","blockRuntimeId":6813},{"id":"minecraft:lantern","blockRuntimeId":5362},{"id":"minecraft:soul_lantern","blockRuntimeId":6949},{"id":"minecraft:candle","blockRuntimeId":953},{"id":"minecraft:white_candle","blockRuntimeId":7786},{"id":"minecraft:orange_candle","blockRuntimeId":5735},{"id":"minecraft:magenta_candle","blockRuntimeId":5585},{"id":"minecraft:light_blue_candle","blockRuntimeId":5473},{"id":"minecraft:yellow_candle","blockRuntimeId":7927},{"id":"minecraft:lime_candle","blockRuntimeId":5521},{"id":"minecraft:pink_candle","blockRuntimeId":5766},{"id":"minecraft:gray_candle","blockRuntimeId":4999},{"id":"minecraft:light_gray_candle","blockRuntimeId":5489},{"id":"minecraft:cyan_candle","blockRuntimeId":3920},{"id":"minecraft:purple_candle","blockRuntimeId":6506},{"id":"minecraft:blue_candle","blockRuntimeId":675},{"id":"minecraft:brown_candle","blockRuntimeId":884},{"id":"minecraft:green_candle","blockRuntimeId":5015},{"id":"minecraft:red_candle","blockRuntimeId":6577},{"id":"minecraft:black_candle","blockRuntimeId":478},{"id":"minecraft:crafting_table","blockRuntimeId":3770},{"id":"minecraft:cartography_table","blockRuntimeId":987},{"id":"minecraft:fletching_table","blockRuntimeId":4811},{"id":"minecraft:smithing_table","blockRuntimeId":6875},{"id":"minecraft:beehive","blockRuntimeId":260},{"id":"minecraft:campfire"},{"id":"minecraft:soul_campfire"},{"id":"minecraft:furnace","blockRuntimeId":4875},{"id":"minecraft:blast_furnace","blockRuntimeId":669},{"id":"minecraft:smoker","blockRuntimeId":6876},{"id":"minecraft:respawn_anchor","blockRuntimeId":6696},{"id":"minecraft:brewing_stand"},{"id":"minecraft:anvil","blockRuntimeId":152},{"id":"minecraft:anvil","blockRuntimeId":156},{"id":"minecraft:anvil","blockRuntimeId":160},{"id":"minecraft:grindstone","blockRuntimeId":5031},{"id":"minecraft:enchanting_table","blockRuntimeId":4718},{"id":"minecraft:bookshelf","blockRuntimeId":704},{"id":"minecraft:lectern","blockRuntimeId":5433},{"id":"minecraft:cauldron"},{"id":"minecraft:composter","blockRuntimeId":3634},{"id":"minecraft:chest","blockRuntimeId":1123},{"id":"minecraft:trapped_chest","blockRuntimeId":7375},{"id":"minecraft:ender_chest","blockRuntimeId":4745},{"id":"minecraft:barrel","blockRuntimeId":201},{"id":"minecraft:undyed_shulker_box","blockRuntimeId":7458},{"id":"minecraft:shulker_box","blockRuntimeId":6826},{"id":"minecraft:shulker_box","blockRuntimeId":6834},{"id":"minecraft:shulker_box","blockRuntimeId":6833},{"id":"minecraft:shulker_box","blockRuntimeId":6841},{"id":"minecraft:shulker_box","blockRuntimeId":6838},{"id":"minecraft:shulker_box","blockRuntimeId":6840},{"id":"minecraft:shulker_box","blockRuntimeId":6827},{"id":"minecraft:shulker_box","blockRuntimeId":6830},{"id":"minecraft:shulker_box","blockRuntimeId":6831},{"id":"minecraft:shulker_box","blockRuntimeId":6839},{"id":"minecraft:shulker_box","blockRuntimeId":6835},{"id":"minecraft:shulker_box","blockRuntimeId":6829},{"id":"minecraft:shulker_box","blockRuntimeId":6837},{"id":"minecraft:shulker_box","blockRuntimeId":6836},{"id":"minecraft:shulker_box","blockRuntimeId":6828},{"id":"minecraft:shulker_box","blockRuntimeId":6832},{"id":"minecraft:armor_stand"},{"id":"minecraft:noteblock","blockRuntimeId":5713},{"id":"minecraft:jukebox","blockRuntimeId":5207},{"id":"minecraft:music_disc_13"},{"id":"minecraft:music_disc_cat"},{"id":"minecraft:music_disc_blocks"},{"id":"minecraft:music_disc_chirp"},{"id":"minecraft:music_disc_far"},{"id":"minecraft:music_disc_mall"},{"id":"minecraft:music_disc_mellohi"},{"id":"minecraft:music_disc_stal"},{"id":"minecraft:music_disc_strad"},{"id":"minecraft:music_disc_ward"},{"id":"minecraft:music_disc_11"},{"id":"minecraft:music_disc_wait"},{"id":"minecraft:music_disc_pigstep"},{"id":"minecraft:glowstone_dust"},{"id":"minecraft:glowstone","blockRuntimeId":4973},{"id":"minecraft:redstone_lamp","blockRuntimeId":6643},{"id":"minecraft:sealantern","blockRuntimeId":6824},{"id":"minecraft:oak_sign"},{"id":"minecraft:spruce_sign"},{"id":"minecraft:birch_sign"},{"id":"minecraft:jungle_sign"},{"id":"minecraft:acacia_sign"},{"id":"minecraft:dark_oak_sign"},{"id":"minecraft:crimson_sign"},{"id":"minecraft:warped_sign"},{"id":"minecraft:painting"},{"id":"minecraft:frame"},{"id":"minecraft:glow_frame"},{"id":"minecraft:honey_bottle"},{"id":"minecraft:flower_pot"},{"id":"minecraft:bowl"},{"id":"minecraft:bucket"},{"id":"minecraft:milk_bucket"},{"id":"minecraft:water_bucket"},{"id":"minecraft:lava_bucket"},{"id":"minecraft:cod_bucket"},{"id":"minecraft:salmon_bucket"},{"id":"minecraft:tropical_fish_bucket"},{"id":"minecraft:pufferfish_bucket"},{"id":"minecraft:powder_snow_bucket"},{"id":"minecraft:axolotl_bucket"},{"id":"minecraft:skull","damage":3},{"id":"minecraft:skull","damage":2},{"id":"minecraft:skull","damage":4},{"id":"minecraft:skull","damage":5},{"id":"minecraft:skull"},{"id":"minecraft:skull","damage":1},{"id":"minecraft:beacon","blockRuntimeId":217},{"id":"minecraft:bell","blockRuntimeId":292},{"id":"minecraft:conduit","blockRuntimeId":3675},{"id":"minecraft:stonecutter_block","blockRuntimeId":7291},{"id":"minecraft:end_portal_frame","blockRuntimeId":4730},{"id":"minecraft:coal"},{"id":"minecraft:charcoal"},{"id":"minecraft:diamond"},{"id":"minecraft:iron_nugget"},{"id":"minecraft:raw_iron"},{"id":"minecraft:raw_gold"},{"id":"minecraft:raw_copper"},{"id":"minecraft:copper_ingot"},{"id":"minecraft:iron_ingot"},{"id":"minecraft:netherite_scrap"},{"id":"minecraft:netherite_ingot"},{"id":"minecraft:gold_nugget"},{"id":"minecraft:gold_ingot"},{"id":"minecraft:emerald"},{"id":"minecraft:quartz"},{"id":"minecraft:clay_ball"},{"id":"minecraft:brick"},{"id":"minecraft:netherbrick"},{"id":"minecraft:prismarine_shard"},{"id":"minecraft:amethyst_shard"},{"id":"minecraft:prismarine_crystals"},{"id":"minecraft:nautilus_shell"},{"id":"minecraft:heart_of_the_sea"},{"id":"minecraft:scute"},{"id":"minecraft:phantom_membrane"},{"id":"minecraft:string"},{"id":"minecraft:feather"},{"id":"minecraft:flint"},{"id":"minecraft:gunpowder"},{"id":"minecraft:leather"},{"id":"minecraft:rabbit_hide"},{"id":"minecraft:rabbit_foot"},{"id":"minecraft:fire_charge"},{"id":"minecraft:blaze_rod"},{"id":"minecraft:blaze_powder"},{"id":"minecraft:magma_cream"},{"id":"minecraft:fermented_spider_eye"},{"id":"minecraft:dragon_breath"},{"id":"minecraft:shulker_shell"},{"id":"minecraft:ghast_tear"},{"id":"minecraft:slime_ball"},{"id":"minecraft:ender_pearl"},{"id":"minecraft:ender_eye"},{"id":"minecraft:nether_star"},{"id":"minecraft:end_rod","blockRuntimeId":4738},{"id":"minecraft:lightning_rod","blockRuntimeId":5515},{"id":"minecraft:end_crystal"},{"id":"minecraft:paper"},{"id":"minecraft:book"},{"id":"minecraft:writable_book"},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA="},{"id":"minecraft:oak_boat"},{"id":"minecraft:spruce_boat"},{"id":"minecraft:birch_boat"},{"id":"minecraft:jungle_boat"},{"id":"minecraft:acacia_boat"},{"id":"minecraft:dark_oak_boat"},{"id":"minecraft:rail","blockRuntimeId":6564},{"id":"minecraft:golden_rail","blockRuntimeId":4976},{"id":"minecraft:detector_rail","blockRuntimeId":4461},{"id":"minecraft:activator_rail","blockRuntimeId":122},{"id":"minecraft:minecart"},{"id":"minecraft:chest_minecart"},{"id":"minecraft:hopper_minecart"},{"id":"minecraft:tnt_minecart"},{"id":"minecraft:redstone"},{"id":"minecraft:redstone_block","blockRuntimeId":6642},{"id":"minecraft:redstone_torch","blockRuntimeId":6645},{"id":"minecraft:lever","blockRuntimeId":5441},{"id":"minecraft:wooden_button","blockRuntimeId":7839},{"id":"minecraft:spruce_button","blockRuntimeId":6962},{"id":"minecraft:birch_button","blockRuntimeId":356},{"id":"minecraft:jungle_button","blockRuntimeId":5208},{"id":"minecraft:acacia_button"},{"id":"minecraft:dark_oak_button","blockRuntimeId":3936},{"id":"minecraft:stone_button","blockRuntimeId":7191},{"id":"minecraft:crimson_button","blockRuntimeId":3771},{"id":"minecraft:warped_button","blockRuntimeId":7526},{"id":"minecraft:polished_blackstone_button","blockRuntimeId":5998},{"id":"minecraft:tripwire_hook","blockRuntimeId":7397},{"id":"minecraft:wooden_pressure_plate","blockRuntimeId":7883},{"id":"minecraft:spruce_pressure_plate","blockRuntimeId":7022},{"id":"minecraft:birch_pressure_plate","blockRuntimeId":416},{"id":"minecraft:jungle_pressure_plate","blockRuntimeId":5268},{"id":"minecraft:acacia_pressure_plate","blockRuntimeId":60},{"id":"minecraft:dark_oak_pressure_plate","blockRuntimeId":3996},{"id":"minecraft:crimson_pressure_plate","blockRuntimeId":3840},{"id":"minecraft:warped_pressure_plate","blockRuntimeId":7595},{"id":"minecraft:stone_pressure_plate","blockRuntimeId":7203},{"id":"minecraft:light_weighted_pressure_plate","blockRuntimeId":5499},{"id":"minecraft:heavy_weighted_pressure_plate","blockRuntimeId":5095},{"id":"minecraft:polished_blackstone_pressure_plate","blockRuntimeId":6012},{"id":"minecraft:observer","blockRuntimeId":5722},{"id":"minecraft:daylight_detector","blockRuntimeId":4066},{"id":"minecraft:repeater"},{"id":"minecraft:comparator"},{"id":"minecraft:hopper"},{"id":"minecraft:dropper","blockRuntimeId":4588},{"id":"minecraft:dispenser","blockRuntimeId":4489},{"id":"minecraft:piston","blockRuntimeId":5783},{"id":"minecraft:sticky_piston","blockRuntimeId":7165},{"id":"minecraft:tnt","blockRuntimeId":7349},{"id":"minecraft:name_tag"},{"id":"minecraft:loom","blockRuntimeId":5581},{"id":"minecraft:banner"},{"id":"minecraft:banner","damage":8},{"id":"minecraft:banner","damage":7},{"id":"minecraft:banner","damage":15},{"id":"minecraft:banner","damage":12},{"id":"minecraft:banner","damage":14},{"id":"minecraft:banner","damage":1},{"id":"minecraft:banner","damage":4},{"id":"minecraft:banner","damage":5},{"id":"minecraft:banner","damage":13},{"id":"minecraft:banner","damage":9},{"id":"minecraft:banner","damage":3},{"id":"minecraft:banner","damage":11},{"id":"minecraft:banner","damage":10},{"id":"minecraft:banner","damage":2},{"id":"minecraft:banner","damage":6},{"id":"minecraft:banner","damage":15,"nbt_b64":"CgAAAwQAVHlwZQEAAAAA"},{"id":"minecraft:creeper_banner_pattern"},{"id":"minecraft:skull_banner_pattern"},{"id":"minecraft:flower_banner_pattern"},{"id":"minecraft:mojang_banner_pattern"},{"id":"minecraft:field_masoned_banner_pattern"},{"id":"minecraft:bordure_indented_banner_pattern"},{"id":"minecraft:piglin_banner_pattern"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_star","nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA="},{"id":"minecraft:firework_star","damage":8,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA="},{"id":"minecraft:firework_star","damage":7,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA="},{"id":"minecraft:firework_star","damage":15,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA="},{"id":"minecraft:firework_star","damage":12,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA="},{"id":"minecraft:firework_star","damage":14,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA="},{"id":"minecraft:firework_star","damage":1,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA="},{"id":"minecraft:firework_star","damage":4,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA="},{"id":"minecraft:firework_star","damage":5,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA="},{"id":"minecraft:firework_star","damage":13,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA="},{"id":"minecraft:firework_star","damage":9,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA="},{"id":"minecraft:firework_star","damage":3,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA="},{"id":"minecraft:firework_star","damage":11,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA="},{"id":"minecraft:firework_star","damage":10,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA="},{"id":"minecraft:firework_star","damage":2,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA="},{"id":"minecraft:firework_star","damage":6,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA="},{"id":"minecraft:chain"},{"id":"minecraft:target","blockRuntimeId":7347},{"id":"minecraft:lodestone_compass"}]} \ No newline at end of file diff --git a/src/main/resources/creativeitems471.json b/src/main/resources/creativeitems471.json deleted file mode 100644 index ced23352e..000000000 --- a/src/main/resources/creativeitems471.json +++ /dev/null @@ -1 +0,0 @@ -{"items":[{"id":"minecraft:planks","blockRuntimeId":5797},{"id":"minecraft:planks","blockRuntimeId":5798},{"id":"minecraft:planks","blockRuntimeId":5799},{"id":"minecraft:planks","blockRuntimeId":5800},{"id":"minecraft:planks","blockRuntimeId":5801},{"id":"minecraft:planks","blockRuntimeId":5802},{"id":"minecraft:crimson_planks","blockRuntimeId":3840},{"id":"minecraft:warped_planks","blockRuntimeId":7598},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1319},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1320},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1321},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1322},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1323},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1324},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1331},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1326},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1327},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1325},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1328},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1332},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1329},{"id":"minecraft:cobblestone_wall","blockRuntimeId":1330},{"id":"minecraft:blackstone_wall","blockRuntimeId":507},{"id":"minecraft:polished_blackstone_wall","blockRuntimeId":6041},{"id":"minecraft:polished_blackstone_brick_wall","blockRuntimeId":5838},{"id":"minecraft:cobbled_deepslate_wall","blockRuntimeId":1156},{"id":"minecraft:deepslate_tile_wall","blockRuntimeId":4298},{"id":"minecraft:polished_deepslate_wall","blockRuntimeId":6216},{"id":"minecraft:deepslate_brick_wall","blockRuntimeId":4115},{"id":"minecraft:fence","blockRuntimeId":4774},{"id":"minecraft:fence","blockRuntimeId":4775},{"id":"minecraft:fence","blockRuntimeId":4776},{"id":"minecraft:fence","blockRuntimeId":4777},{"id":"minecraft:fence","blockRuntimeId":4778},{"id":"minecraft:fence","blockRuntimeId":4779},{"id":"minecraft:nether_brick_fence","blockRuntimeId":5689},{"id":"minecraft:crimson_fence","blockRuntimeId":3818},{"id":"minecraft:warped_fence","blockRuntimeId":7576},{"id":"minecraft:fence_gate","blockRuntimeId":4780},{"id":"minecraft:spruce_fence_gate","blockRuntimeId":7010},{"id":"minecraft:birch_fence_gate","blockRuntimeId":400},{"id":"minecraft:jungle_fence_gate","blockRuntimeId":5253},{"id":"minecraft:acacia_fence_gate","blockRuntimeId":44},{"id":"minecraft:dark_oak_fence_gate","blockRuntimeId":3981},{"id":"minecraft:crimson_fence_gate","blockRuntimeId":3819},{"id":"minecraft:warped_fence_gate","blockRuntimeId":7577},{"id":"minecraft:normal_stone_stairs","blockRuntimeId":5708},{"id":"minecraft:stone_stairs","blockRuntimeId":7281},{"id":"minecraft:mossy_cobblestone_stairs","blockRuntimeId":5668},{"id":"minecraft:oak_stairs","blockRuntimeId":5717},{"id":"minecraft:spruce_stairs","blockRuntimeId":7042},{"id":"minecraft:birch_stairs","blockRuntimeId":432},{"id":"minecraft:jungle_stairs","blockRuntimeId":5285},{"id":"minecraft:acacia_stairs","blockRuntimeId":76},{"id":"minecraft:dark_oak_stairs","blockRuntimeId":4013},{"id":"minecraft:stone_brick_stairs","blockRuntimeId":7187},{"id":"minecraft:mossy_stone_brick_stairs","blockRuntimeId":5676},{"id":"minecraft:sandstone_stairs","blockRuntimeId":6710},{"id":"minecraft:smooth_sandstone_stairs","blockRuntimeId":6903},{"id":"minecraft:red_sandstone_stairs","blockRuntimeId":6637},{"id":"minecraft:smooth_red_sandstone_stairs","blockRuntimeId":6895},{"id":"minecraft:granite_stairs","blockRuntimeId":4989},{"id":"minecraft:polished_granite_stairs","blockRuntimeId":6386},{"id":"minecraft:diorite_stairs","blockRuntimeId":4476},{"id":"minecraft:polished_diorite_stairs","blockRuntimeId":6378},{"id":"minecraft:andesite_stairs","blockRuntimeId":144},{"id":"minecraft:polished_andesite_stairs","blockRuntimeId":5814},{"id":"minecraft:brick_stairs","blockRuntimeId":876},{"id":"minecraft:nether_brick_stairs","blockRuntimeId":5690},{"id":"minecraft:red_nether_brick_stairs","blockRuntimeId":6625},{"id":"minecraft:end_brick_stairs","blockRuntimeId":4720},{"id":"minecraft:quartz_stairs","blockRuntimeId":6559},{"id":"minecraft:smooth_quartz_stairs","blockRuntimeId":6887},{"id":"minecraft:purpur_stairs","blockRuntimeId":6537},{"id":"minecraft:prismarine_stairs","blockRuntimeId":6449},{"id":"minecraft:dark_prismarine_stairs","blockRuntimeId":4037},{"id":"minecraft:prismarine_bricks_stairs","blockRuntimeId":6441},{"id":"minecraft:crimson_stairs","blockRuntimeId":3860},{"id":"minecraft:warped_stairs","blockRuntimeId":7618},{"id":"minecraft:blackstone_stairs","blockRuntimeId":499},{"id":"minecraft:polished_blackstone_stairs","blockRuntimeId":6033},{"id":"minecraft:polished_blackstone_brick_stairs","blockRuntimeId":5830},{"id":"minecraft:cut_copper_stairs","blockRuntimeId":3913},{"id":"minecraft:exposed_cut_copper_stairs","blockRuntimeId":4756},{"id":"minecraft:weathered_cut_copper_stairs","blockRuntimeId":7745},{"id":"minecraft:oxidized_cut_copper_stairs","blockRuntimeId":5758},{"id":"minecraft:waxed_cut_copper_stairs","blockRuntimeId":7689},{"id":"minecraft:waxed_exposed_cut_copper_stairs","blockRuntimeId":7703},{"id":"minecraft:waxed_weathered_cut_copper_stairs","blockRuntimeId":7731},{"id":"minecraft:waxed_oxidized_cut_copper_stairs","blockRuntimeId":7717},{"id":"minecraft:cobbled_deepslate_stairs","blockRuntimeId":1148},{"id":"minecraft:deepslate_tile_stairs","blockRuntimeId":4290},{"id":"minecraft:polished_deepslate_stairs","blockRuntimeId":6208},{"id":"minecraft:deepslate_brick_stairs","blockRuntimeId":4107},{"id":"minecraft:wooden_door"},{"id":"minecraft:spruce_door"},{"id":"minecraft:birch_door"},{"id":"minecraft:jungle_door"},{"id":"minecraft:acacia_door"},{"id":"minecraft:dark_oak_door"},{"id":"minecraft:iron_door"},{"id":"minecraft:crimson_door"},{"id":"minecraft:warped_door"},{"id":"minecraft:trapdoor","blockRuntimeId":7363},{"id":"minecraft:spruce_trapdoor","blockRuntimeId":7066},{"id":"minecraft:birch_trapdoor","blockRuntimeId":456},{"id":"minecraft:jungle_trapdoor","blockRuntimeId":5309},{"id":"minecraft:acacia_trapdoor","blockRuntimeId":100},{"id":"minecraft:dark_oak_trapdoor","blockRuntimeId":4021},{"id":"minecraft:iron_trapdoor","blockRuntimeId":5168},{"id":"minecraft:crimson_trapdoor","blockRuntimeId":3887},{"id":"minecraft:warped_trapdoor","blockRuntimeId":7645},{"id":"minecraft:iron_bars","blockRuntimeId":5133},{"id":"minecraft:glass","blockRuntimeId":4883},{"id":"minecraft:stained_glass","blockRuntimeId":7088},{"id":"minecraft:stained_glass","blockRuntimeId":7096},{"id":"minecraft:stained_glass","blockRuntimeId":7095},{"id":"minecraft:stained_glass","blockRuntimeId":7103},{"id":"minecraft:stained_glass","blockRuntimeId":7100},{"id":"minecraft:stained_glass","blockRuntimeId":7102},{"id":"minecraft:stained_glass","blockRuntimeId":7089},{"id":"minecraft:stained_glass","blockRuntimeId":7092},{"id":"minecraft:stained_glass","blockRuntimeId":7093},{"id":"minecraft:stained_glass","blockRuntimeId":7101},{"id":"minecraft:stained_glass","blockRuntimeId":7097},{"id":"minecraft:stained_glass","blockRuntimeId":7091},{"id":"minecraft:stained_glass","blockRuntimeId":7099},{"id":"minecraft:stained_glass","blockRuntimeId":7098},{"id":"minecraft:stained_glass","blockRuntimeId":7090},{"id":"minecraft:stained_glass","blockRuntimeId":7094},{"id":"minecraft:tinted_glass","blockRuntimeId":7352},{"id":"minecraft:glass_pane","blockRuntimeId":4884},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7104},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7112},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7111},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7119},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7116},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7118},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7105},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7108},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7109},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7117},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7113},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7107},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7115},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7114},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7106},{"id":"minecraft:stained_glass_pane","blockRuntimeId":7110},{"id":"minecraft:ladder","blockRuntimeId":5357},{"id":"minecraft:scaffolding","blockRuntimeId":6730},{"id":"minecraft:double_stone_slab","blockRuntimeId":7223},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7273},{"id":"minecraft:double_stone_slab","blockRuntimeId":7226},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7244},{"id":"minecraft:wooden_slab","blockRuntimeId":7903},{"id":"minecraft:wooden_slab","blockRuntimeId":7904},{"id":"minecraft:wooden_slab","blockRuntimeId":7905},{"id":"minecraft:wooden_slab","blockRuntimeId":7906},{"id":"minecraft:wooden_slab","blockRuntimeId":7907},{"id":"minecraft:wooden_slab","blockRuntimeId":7908},{"id":"minecraft:double_stone_slab","blockRuntimeId":7228},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7271},{"id":"minecraft:double_stone_slab","blockRuntimeId":7224},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7274},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7245},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7239},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7275},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7256},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7261},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7262},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7259},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7260},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7258},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7257},{"id":"minecraft:double_stone_slab","blockRuntimeId":7227},{"id":"minecraft:double_stone_slab","blockRuntimeId":7230},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7246},{"id":"minecraft:double_stone_slab3","blockRuntimeId":7255},{"id":"minecraft:double_stone_slab","blockRuntimeId":7229},{"id":"minecraft:double_stone_slab4","blockRuntimeId":7272},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7240},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7241},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7242},{"id":"minecraft:double_stone_slab2","blockRuntimeId":7243},{"id":"minecraft:crimson_slab","blockRuntimeId":3858},{"id":"minecraft:warped_slab","blockRuntimeId":7616},{"id":"minecraft:blackstone_slab","blockRuntimeId":497},{"id":"minecraft:polished_blackstone_slab","blockRuntimeId":6031},{"id":"minecraft:polished_blackstone_brick_slab","blockRuntimeId":5828},{"id":"minecraft:cut_copper_slab","blockRuntimeId":3911},{"id":"minecraft:exposed_cut_copper_slab","blockRuntimeId":4754},{"id":"minecraft:weathered_cut_copper_slab","blockRuntimeId":7743},{"id":"minecraft:oxidized_cut_copper_slab","blockRuntimeId":5756},{"id":"minecraft:waxed_cut_copper_slab","blockRuntimeId":7687},{"id":"minecraft:waxed_exposed_cut_copper_slab","blockRuntimeId":7701},{"id":"minecraft:waxed_weathered_cut_copper_slab","blockRuntimeId":7729},{"id":"minecraft:waxed_oxidized_cut_copper_slab","blockRuntimeId":7715},{"id":"minecraft:cobbled_deepslate_slab","blockRuntimeId":1146},{"id":"minecraft:polished_deepslate_slab","blockRuntimeId":6206},{"id":"minecraft:deepslate_tile_slab","blockRuntimeId":4288},{"id":"minecraft:deepslate_brick_slab","blockRuntimeId":4105},{"id":"minecraft:brick_block","blockRuntimeId":875},{"id":"minecraft:chiseled_nether_bricks","blockRuntimeId":1130},{"id":"minecraft:cracked_nether_bricks","blockRuntimeId":3769},{"id":"minecraft:quartz_bricks","blockRuntimeId":6557},{"id":"minecraft:stonebrick","blockRuntimeId":7289},{"id":"minecraft:stonebrick","blockRuntimeId":7290},{"id":"minecraft:stonebrick","blockRuntimeId":7291},{"id":"minecraft:stonebrick","blockRuntimeId":7292},{"id":"minecraft:end_bricks","blockRuntimeId":4728},{"id":"minecraft:prismarine","blockRuntimeId":6440},{"id":"minecraft:polished_blackstone_bricks","blockRuntimeId":6000},{"id":"minecraft:cracked_polished_blackstone_bricks","blockRuntimeId":3770},{"id":"minecraft:gilded_blackstone","blockRuntimeId":4882},{"id":"minecraft:chiseled_polished_blackstone","blockRuntimeId":1131},{"id":"minecraft:deepslate_tiles","blockRuntimeId":4460},{"id":"minecraft:cracked_deepslate_tiles","blockRuntimeId":3768},{"id":"minecraft:deepslate_bricks","blockRuntimeId":4277},{"id":"minecraft:cracked_deepslate_bricks","blockRuntimeId":3767},{"id":"minecraft:chiseled_deepslate","blockRuntimeId":1129},{"id":"minecraft:cobblestone","blockRuntimeId":1318},{"id":"minecraft:mossy_cobblestone","blockRuntimeId":5667},{"id":"minecraft:cobbled_deepslate","blockRuntimeId":1143},{"id":"minecraft:smooth_stone","blockRuntimeId":6911},{"id":"minecraft:sandstone","blockRuntimeId":6706},{"id":"minecraft:sandstone","blockRuntimeId":6707},{"id":"minecraft:sandstone","blockRuntimeId":6708},{"id":"minecraft:sandstone","blockRuntimeId":6709},{"id":"minecraft:red_sandstone","blockRuntimeId":6633},{"id":"minecraft:red_sandstone","blockRuntimeId":6634},{"id":"minecraft:red_sandstone","blockRuntimeId":6635},{"id":"minecraft:red_sandstone","blockRuntimeId":6636},{"id":"minecraft:coal_block","blockRuntimeId":1141},{"id":"minecraft:dried_kelp_block","blockRuntimeId":4584},{"id":"minecraft:gold_block","blockRuntimeId":4975},{"id":"minecraft:iron_block","blockRuntimeId":5134},{"id":"minecraft:copper_block","blockRuntimeId":3677},{"id":"minecraft:exposed_copper","blockRuntimeId":4752},{"id":"minecraft:weathered_copper","blockRuntimeId":7741},{"id":"minecraft:oxidized_copper","blockRuntimeId":5754},{"id":"minecraft:waxed_copper","blockRuntimeId":7685},{"id":"minecraft:waxed_exposed_copper","blockRuntimeId":7699},{"id":"minecraft:waxed_weathered_copper","blockRuntimeId":7727},{"id":"minecraft:waxed_oxidized_copper","blockRuntimeId":7713},{"id":"minecraft:cut_copper","blockRuntimeId":3910},{"id":"minecraft:exposed_cut_copper","blockRuntimeId":4753},{"id":"minecraft:weathered_cut_copper","blockRuntimeId":7742},{"id":"minecraft:oxidized_cut_copper","blockRuntimeId":5755},{"id":"minecraft:waxed_cut_copper","blockRuntimeId":7686},{"id":"minecraft:waxed_exposed_cut_copper","blockRuntimeId":7700},{"id":"minecraft:waxed_weathered_cut_copper","blockRuntimeId":7728},{"id":"minecraft:waxed_oxidized_cut_copper","blockRuntimeId":7714},{"id":"minecraft:emerald_block","blockRuntimeId":4717},{"id":"minecraft:diamond_block","blockRuntimeId":4474},{"id":"minecraft:lapis_block","blockRuntimeId":5365},{"id":"minecraft:raw_iron_block","blockRuntimeId":6579},{"id":"minecraft:raw_copper_block","blockRuntimeId":6577},{"id":"minecraft:raw_gold_block","blockRuntimeId":6578},{"id":"minecraft:quartz_block","blockRuntimeId":6545},{"id":"minecraft:quartz_block","blockRuntimeId":6547},{"id":"minecraft:quartz_block","blockRuntimeId":6546},{"id":"minecraft:quartz_block","blockRuntimeId":6548},{"id":"minecraft:prismarine","blockRuntimeId":6438},{"id":"minecraft:prismarine","blockRuntimeId":6439},{"id":"minecraft:slime","blockRuntimeId":6864},{"id":"minecraft:honey_block","blockRuntimeId":5112},{"id":"minecraft:honeycomb_block","blockRuntimeId":5113},{"id":"minecraft:hay_block","blockRuntimeId":5084},{"id":"minecraft:bone_block","blockRuntimeId":692},{"id":"minecraft:nether_brick","blockRuntimeId":5688},{"id":"minecraft:red_nether_brick","blockRuntimeId":6624},{"id":"minecraft:netherite_block","blockRuntimeId":5705},{"id":"minecraft:lodestone","blockRuntimeId":5563},{"id":"minecraft:wool","blockRuntimeId":7915},{"id":"minecraft:wool","blockRuntimeId":7923},{"id":"minecraft:wool","blockRuntimeId":7922},{"id":"minecraft:wool","blockRuntimeId":7930},{"id":"minecraft:wool","blockRuntimeId":7927},{"id":"minecraft:wool","blockRuntimeId":7929},{"id":"minecraft:wool","blockRuntimeId":7916},{"id":"minecraft:wool","blockRuntimeId":7919},{"id":"minecraft:wool","blockRuntimeId":7920},{"id":"minecraft:wool","blockRuntimeId":7928},{"id":"minecraft:wool","blockRuntimeId":7924},{"id":"minecraft:wool","blockRuntimeId":7918},{"id":"minecraft:wool","blockRuntimeId":7926},{"id":"minecraft:wool","blockRuntimeId":7925},{"id":"minecraft:wool","blockRuntimeId":7917},{"id":"minecraft:wool","blockRuntimeId":7921},{"id":"minecraft:carpet","blockRuntimeId":963},{"id":"minecraft:carpet","blockRuntimeId":971},{"id":"minecraft:carpet","blockRuntimeId":970},{"id":"minecraft:carpet","blockRuntimeId":978},{"id":"minecraft:carpet","blockRuntimeId":975},{"id":"minecraft:carpet","blockRuntimeId":977},{"id":"minecraft:carpet","blockRuntimeId":964},{"id":"minecraft:carpet","blockRuntimeId":967},{"id":"minecraft:carpet","blockRuntimeId":968},{"id":"minecraft:carpet","blockRuntimeId":976},{"id":"minecraft:carpet","blockRuntimeId":972},{"id":"minecraft:carpet","blockRuntimeId":966},{"id":"minecraft:carpet","blockRuntimeId":974},{"id":"minecraft:carpet","blockRuntimeId":973},{"id":"minecraft:carpet","blockRuntimeId":965},{"id":"minecraft:carpet","blockRuntimeId":969},{"id":"minecraft:concrete_powder","blockRuntimeId":3660},{"id":"minecraft:concrete_powder","blockRuntimeId":3668},{"id":"minecraft:concrete_powder","blockRuntimeId":3667},{"id":"minecraft:concrete_powder","blockRuntimeId":3675},{"id":"minecraft:concrete_powder","blockRuntimeId":3672},{"id":"minecraft:concrete_powder","blockRuntimeId":3674},{"id":"minecraft:concrete_powder","blockRuntimeId":3661},{"id":"minecraft:concrete_powder","blockRuntimeId":3664},{"id":"minecraft:concrete_powder","blockRuntimeId":3665},{"id":"minecraft:concrete_powder","blockRuntimeId":3673},{"id":"minecraft:concrete_powder","blockRuntimeId":3669},{"id":"minecraft:concrete_powder","blockRuntimeId":3663},{"id":"minecraft:concrete_powder","blockRuntimeId":3671},{"id":"minecraft:concrete_powder","blockRuntimeId":3670},{"id":"minecraft:concrete_powder","blockRuntimeId":3662},{"id":"minecraft:concrete_powder","blockRuntimeId":3666},{"id":"minecraft:concrete","blockRuntimeId":3644},{"id":"minecraft:concrete","blockRuntimeId":3652},{"id":"minecraft:concrete","blockRuntimeId":3651},{"id":"minecraft:concrete","blockRuntimeId":3659},{"id":"minecraft:concrete","blockRuntimeId":3656},{"id":"minecraft:concrete","blockRuntimeId":3658},{"id":"minecraft:concrete","blockRuntimeId":3645},{"id":"minecraft:concrete","blockRuntimeId":3648},{"id":"minecraft:concrete","blockRuntimeId":3649},{"id":"minecraft:concrete","blockRuntimeId":3657},{"id":"minecraft:concrete","blockRuntimeId":3653},{"id":"minecraft:concrete","blockRuntimeId":3647},{"id":"minecraft:concrete","blockRuntimeId":3655},{"id":"minecraft:concrete","blockRuntimeId":3654},{"id":"minecraft:concrete","blockRuntimeId":3646},{"id":"minecraft:concrete","blockRuntimeId":3650},{"id":"minecraft:clay","blockRuntimeId":1139},{"id":"minecraft:hardened_clay","blockRuntimeId":5083},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7120},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7128},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7127},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7135},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7132},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7134},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7121},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7124},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7125},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7133},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7129},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7123},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7131},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7130},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7122},{"id":"minecraft:stained_hardened_clay","blockRuntimeId":7126},{"id":"minecraft:white_glazed_terracotta","blockRuntimeId":7800},{"id":"minecraft:silver_glazed_terracotta","blockRuntimeId":6846},{"id":"minecraft:gray_glazed_terracotta","blockRuntimeId":5010},{"id":"minecraft:black_glazed_terracotta","blockRuntimeId":488},{"id":"minecraft:brown_glazed_terracotta","blockRuntimeId":894},{"id":"minecraft:red_glazed_terracotta","blockRuntimeId":6601},{"id":"minecraft:orange_glazed_terracotta","blockRuntimeId":5748},{"id":"minecraft:yellow_glazed_terracotta","blockRuntimeId":7942},{"id":"minecraft:lime_glazed_terracotta","blockRuntimeId":5532},{"id":"minecraft:green_glazed_terracotta","blockRuntimeId":5026},{"id":"minecraft:cyan_glazed_terracotta","blockRuntimeId":3931},{"id":"minecraft:light_blue_glazed_terracotta","blockRuntimeId":5484},{"id":"minecraft:blue_glazed_terracotta","blockRuntimeId":685},{"id":"minecraft:purple_glazed_terracotta","blockRuntimeId":6519},{"id":"minecraft:magenta_glazed_terracotta","blockRuntimeId":5596},{"id":"minecraft:pink_glazed_terracotta","blockRuntimeId":5779},{"id":"minecraft:purpur_block","blockRuntimeId":6525},{"id":"minecraft:purpur_block","blockRuntimeId":6527},{"id":"minecraft:nether_wart_block","blockRuntimeId":5704},{"id":"minecraft:warped_wart_block","blockRuntimeId":7667},{"id":"minecraft:shroomlight","blockRuntimeId":6829},{"id":"minecraft:crimson_nylium","blockRuntimeId":3839},{"id":"minecraft:warped_nylium","blockRuntimeId":7597},{"id":"minecraft:basalt","blockRuntimeId":214},{"id":"minecraft:polished_basalt","blockRuntimeId":5822},{"id":"minecraft:smooth_basalt","blockRuntimeId":6886},{"id":"minecraft:soul_soil","blockRuntimeId":6956},{"id":"minecraft:dirt","blockRuntimeId":4484},{"id":"minecraft:dirt","blockRuntimeId":4485},{"id":"minecraft:farmland","blockRuntimeId":4766},{"id":"minecraft:grass","blockRuntimeId":4997},{"id":"minecraft:grass_path","blockRuntimeId":4998},{"id":"minecraft:podzol","blockRuntimeId":5803},{"id":"minecraft:mycelium","blockRuntimeId":5685},{"id":"minecraft:stone","blockRuntimeId":7180},{"id":"minecraft:iron_ore","blockRuntimeId":5167},{"id":"minecraft:gold_ore","blockRuntimeId":4976},{"id":"minecraft:diamond_ore","blockRuntimeId":4475},{"id":"minecraft:lapis_ore","blockRuntimeId":5366},{"id":"minecraft:redstone_ore","blockRuntimeId":6647},{"id":"minecraft:coal_ore","blockRuntimeId":1142},{"id":"minecraft:copper_ore","blockRuntimeId":3678},{"id":"minecraft:emerald_ore","blockRuntimeId":4718},{"id":"minecraft:quartz_ore","blockRuntimeId":6558},{"id":"minecraft:nether_gold_ore","blockRuntimeId":5698},{"id":"minecraft:ancient_debris","blockRuntimeId":143},{"id":"minecraft:deepslate_iron_ore","blockRuntimeId":4283},{"id":"minecraft:deepslate_gold_ore","blockRuntimeId":4282},{"id":"minecraft:deepslate_diamond_ore","blockRuntimeId":4280},{"id":"minecraft:deepslate_lapis_ore","blockRuntimeId":4284},{"id":"minecraft:deepslate_redstone_ore","blockRuntimeId":4285},{"id":"minecraft:deepslate_emerald_ore","blockRuntimeId":4281},{"id":"minecraft:deepslate_coal_ore","blockRuntimeId":4278},{"id":"minecraft:deepslate_copper_ore","blockRuntimeId":4279},{"id":"minecraft:gravel","blockRuntimeId":4999},{"id":"minecraft:stone","blockRuntimeId":7181},{"id":"minecraft:stone","blockRuntimeId":7183},{"id":"minecraft:stone","blockRuntimeId":7185},{"id":"minecraft:blackstone","blockRuntimeId":494},{"id":"minecraft:deepslate","blockRuntimeId":4100},{"id":"minecraft:stone","blockRuntimeId":7182},{"id":"minecraft:stone","blockRuntimeId":7184},{"id":"minecraft:stone","blockRuntimeId":7186},{"id":"minecraft:polished_blackstone","blockRuntimeId":5825},{"id":"minecraft:polished_deepslate","blockRuntimeId":6203},{"id":"minecraft:sand","blockRuntimeId":6704},{"id":"minecraft:sand","blockRuntimeId":6705},{"id":"minecraft:cactus","blockRuntimeId":920},{"id":"minecraft:log","blockRuntimeId":5564},{"id":"minecraft:stripped_oak_log","blockRuntimeId":7319},{"id":"minecraft:log","blockRuntimeId":5565},{"id":"minecraft:stripped_spruce_log","blockRuntimeId":7322},{"id":"minecraft:log","blockRuntimeId":5566},{"id":"minecraft:stripped_birch_log","blockRuntimeId":7304},{"id":"minecraft:log","blockRuntimeId":5567},{"id":"minecraft:stripped_jungle_log","blockRuntimeId":7316},{"id":"minecraft:log2","blockRuntimeId":5576},{"id":"minecraft:stripped_acacia_log","blockRuntimeId":7301},{"id":"minecraft:log2","blockRuntimeId":5577},{"id":"minecraft:stripped_dark_oak_log","blockRuntimeId":7313},{"id":"minecraft:crimson_stem","blockRuntimeId":3884},{"id":"minecraft:stripped_crimson_stem","blockRuntimeId":7310},{"id":"minecraft:warped_stem","blockRuntimeId":7642},{"id":"minecraft:stripped_warped_stem","blockRuntimeId":7328},{"id":"minecraft:wood","blockRuntimeId":7807},{"id":"minecraft:wood","blockRuntimeId":7813},{"id":"minecraft:wood","blockRuntimeId":7808},{"id":"minecraft:wood","blockRuntimeId":7814},{"id":"minecraft:wood","blockRuntimeId":7809},{"id":"minecraft:wood","blockRuntimeId":7815},{"id":"minecraft:wood","blockRuntimeId":7810},{"id":"minecraft:wood","blockRuntimeId":7816},{"id":"minecraft:wood","blockRuntimeId":7811},{"id":"minecraft:wood","blockRuntimeId":7817},{"id":"minecraft:wood","blockRuntimeId":7812},{"id":"minecraft:wood","blockRuntimeId":7818},{"id":"minecraft:crimson_hyphae","blockRuntimeId":3836},{"id":"minecraft:stripped_crimson_hyphae","blockRuntimeId":7307},{"id":"minecraft:warped_hyphae","blockRuntimeId":7594},{"id":"minecraft:stripped_warped_hyphae","blockRuntimeId":7325},{"id":"minecraft:leaves","blockRuntimeId":5410},{"id":"minecraft:leaves","blockRuntimeId":5411},{"id":"minecraft:leaves","blockRuntimeId":5412},{"id":"minecraft:leaves","blockRuntimeId":5413},{"id":"minecraft:leaves2","blockRuntimeId":5426},{"id":"minecraft:leaves2","blockRuntimeId":5427},{"id":"minecraft:azalea_leaves","blockRuntimeId":169},{"id":"minecraft:azalea_leaves_flowered","blockRuntimeId":173},{"id":"minecraft:sapling","blockRuntimeId":6718},{"id":"minecraft:sapling","blockRuntimeId":6719},{"id":"minecraft:sapling","blockRuntimeId":6720},{"id":"minecraft:sapling","blockRuntimeId":6721},{"id":"minecraft:sapling","blockRuntimeId":6722},{"id":"minecraft:sapling","blockRuntimeId":6723},{"id":"minecraft:bee_nest","blockRuntimeId":236},{"id":"minecraft:wheat_seeds"},{"id":"minecraft:pumpkin_seeds"},{"id":"minecraft:melon_seeds"},{"id":"minecraft:beetroot_seeds"},{"id":"minecraft:wheat"},{"id":"minecraft:beetroot"},{"id":"minecraft:potato"},{"id":"minecraft:poisonous_potato"},{"id":"minecraft:carrot"},{"id":"minecraft:golden_carrot"},{"id":"minecraft:apple"},{"id":"minecraft:golden_apple"},{"id":"minecraft:enchanted_golden_apple"},{"id":"minecraft:melon_block","blockRuntimeId":5609},{"id":"minecraft:melon_slice"},{"id":"minecraft:glistering_melon_slice"},{"id":"minecraft:sweet_berries"},{"id":"minecraft:glow_berries"},{"id":"minecraft:pumpkin","blockRuntimeId":6457},{"id":"minecraft:carved_pumpkin","blockRuntimeId":988},{"id":"minecraft:lit_pumpkin","blockRuntimeId":5551},{"id":"minecraft:honeycomb"},{"id":"minecraft:tallgrass","blockRuntimeId":7349},{"id":"minecraft:double_plant","blockRuntimeId":4504},{"id":"minecraft:tallgrass","blockRuntimeId":7348},{"id":"minecraft:double_plant","blockRuntimeId":4503},{"id":"minecraft:nether_sprouts"},{"id":"minecraft:coral","blockRuntimeId":3682},{"id":"minecraft:coral","blockRuntimeId":3680},{"id":"minecraft:coral","blockRuntimeId":3681},{"id":"minecraft:coral","blockRuntimeId":3679},{"id":"minecraft:coral","blockRuntimeId":3683},{"id":"minecraft:coral","blockRuntimeId":3687},{"id":"minecraft:coral","blockRuntimeId":3685},{"id":"minecraft:coral","blockRuntimeId":3686},{"id":"minecraft:coral","blockRuntimeId":3684},{"id":"minecraft:coral","blockRuntimeId":3688},{"id":"minecraft:coral_fan","blockRuntimeId":3702},{"id":"minecraft:coral_fan","blockRuntimeId":3700},{"id":"minecraft:coral_fan","blockRuntimeId":3701},{"id":"minecraft:coral_fan","blockRuntimeId":3699},{"id":"minecraft:coral_fan","blockRuntimeId":3703},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3712},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3710},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3711},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3709},{"id":"minecraft:coral_fan_dead","blockRuntimeId":3713},{"id":"minecraft:kelp"},{"id":"minecraft:seagrass","blockRuntimeId":6825},{"id":"minecraft:crimson_roots","blockRuntimeId":3857},{"id":"minecraft:warped_roots","blockRuntimeId":7615},{"id":"minecraft:yellow_flower","blockRuntimeId":7941},{"id":"minecraft:red_flower","blockRuntimeId":6590},{"id":"minecraft:red_flower","blockRuntimeId":6591},{"id":"minecraft:red_flower","blockRuntimeId":6592},{"id":"minecraft:red_flower","blockRuntimeId":6593},{"id":"minecraft:red_flower","blockRuntimeId":6594},{"id":"minecraft:red_flower","blockRuntimeId":6595},{"id":"minecraft:red_flower","blockRuntimeId":6596},{"id":"minecraft:red_flower","blockRuntimeId":6597},{"id":"minecraft:red_flower","blockRuntimeId":6598},{"id":"minecraft:red_flower","blockRuntimeId":6599},{"id":"minecraft:red_flower","blockRuntimeId":6600},{"id":"minecraft:double_plant","blockRuntimeId":4501},{"id":"minecraft:double_plant","blockRuntimeId":4502},{"id":"minecraft:double_plant","blockRuntimeId":4505},{"id":"minecraft:double_plant","blockRuntimeId":4506},{"id":"minecraft:wither_rose","blockRuntimeId":7806},{"id":"minecraft:white_dye"},{"id":"minecraft:light_gray_dye"},{"id":"minecraft:gray_dye"},{"id":"minecraft:black_dye"},{"id":"minecraft:brown_dye"},{"id":"minecraft:red_dye"},{"id":"minecraft:orange_dye"},{"id":"minecraft:yellow_dye"},{"id":"minecraft:lime_dye"},{"id":"minecraft:green_dye"},{"id":"minecraft:cyan_dye"},{"id":"minecraft:light_blue_dye"},{"id":"minecraft:blue_dye"},{"id":"minecraft:purple_dye"},{"id":"minecraft:magenta_dye"},{"id":"minecraft:pink_dye"},{"id":"minecraft:ink_sac"},{"id":"minecraft:glow_ink_sac"},{"id":"minecraft:cocoa_beans"},{"id":"minecraft:lapis_lazuli"},{"id":"minecraft:bone_meal"},{"id":"minecraft:vine","blockRuntimeId":7502},{"id":"minecraft:weeping_vines","blockRuntimeId":7756},{"id":"minecraft:twisting_vines","blockRuntimeId":7430},{"id":"minecraft:waterlily","blockRuntimeId":7684},{"id":"minecraft:deadbush","blockRuntimeId":4099},{"id":"minecraft:bamboo","blockRuntimeId":177},{"id":"minecraft:snow","blockRuntimeId":6912},{"id":"minecraft:ice","blockRuntimeId":5126},{"id":"minecraft:packed_ice","blockRuntimeId":5768},{"id":"minecraft:blue_ice","blockRuntimeId":691},{"id":"minecraft:snow_layer","blockRuntimeId":6913},{"id":"minecraft:pointed_dripstone","blockRuntimeId":5809},{"id":"minecraft:dripstone_block","blockRuntimeId":4585},{"id":"minecraft:moss_carpet","blockRuntimeId":5666},{"id":"minecraft:moss_block","blockRuntimeId":5665},{"id":"minecraft:dirt_with_roots","blockRuntimeId":4486},{"id":"minecraft:hanging_roots","blockRuntimeId":5048},{"id":"minecraft:big_dripleaf","blockRuntimeId":328},{"id":"minecraft:small_dripleaf_block","blockRuntimeId":6878},{"id":"minecraft:spore_blossom","blockRuntimeId":6965},{"id":"minecraft:azalea","blockRuntimeId":168},{"id":"minecraft:flowering_azalea","blockRuntimeId":4815},{"id":"minecraft:glow_lichen","blockRuntimeId":4972},{"id":"minecraft:amethyst_block","blockRuntimeId":136},{"id":"minecraft:budding_amethyst","blockRuntimeId":919},{"id":"minecraft:amethyst_cluster","blockRuntimeId":137},{"id":"minecraft:large_amethyst_bud","blockRuntimeId":5367},{"id":"minecraft:medium_amethyst_bud","blockRuntimeId":5603},{"id":"minecraft:small_amethyst_bud","blockRuntimeId":6865},{"id":"minecraft:tuff","blockRuntimeId":7417},{"id":"minecraft:calcite","blockRuntimeId":943},{"id":"minecraft:chicken"},{"id":"minecraft:porkchop"},{"id":"minecraft:beef"},{"id":"minecraft:mutton"},{"id":"minecraft:rabbit"},{"id":"minecraft:cod"},{"id":"minecraft:salmon"},{"id":"minecraft:tropical_fish"},{"id":"minecraft:pufferfish"},{"id":"minecraft:brown_mushroom","blockRuntimeId":900},{"id":"minecraft:red_mushroom","blockRuntimeId":6607},{"id":"minecraft:crimson_fungus","blockRuntimeId":3835},{"id":"minecraft:warped_fungus","blockRuntimeId":7593},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":915},{"id":"minecraft:red_mushroom_block","blockRuntimeId":6622},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":916},{"id":"minecraft:brown_mushroom_block","blockRuntimeId":901},{"id":"minecraft:egg"},{"id":"minecraft:sugar_cane"},{"id":"minecraft:sugar"},{"id":"minecraft:rotten_flesh"},{"id":"minecraft:bone"},{"id":"minecraft:web","blockRuntimeId":7755},{"id":"minecraft:spider_eye"},{"id":"minecraft:mob_spawner","blockRuntimeId":5658},{"id":"minecraft:monster_egg","blockRuntimeId":5659},{"id":"minecraft:monster_egg","blockRuntimeId":5660},{"id":"minecraft:monster_egg","blockRuntimeId":5661},{"id":"minecraft:monster_egg","blockRuntimeId":5662},{"id":"minecraft:monster_egg","blockRuntimeId":5663},{"id":"minecraft:monster_egg","blockRuntimeId":5664},{"id":"minecraft:infested_deepslate","blockRuntimeId":5127},{"id":"minecraft:dragon_egg","blockRuntimeId":4583},{"id":"minecraft:turtle_egg","blockRuntimeId":7418},{"id":"minecraft:chicken_spawn_egg"},{"id":"minecraft:bee_spawn_egg"},{"id":"minecraft:cow_spawn_egg"},{"id":"minecraft:pig_spawn_egg"},{"id":"minecraft:sheep_spawn_egg"},{"id":"minecraft:wolf_spawn_egg"},{"id":"minecraft:polar_bear_spawn_egg"},{"id":"minecraft:ocelot_spawn_egg"},{"id":"minecraft:cat_spawn_egg"},{"id":"minecraft:mooshroom_spawn_egg"},{"id":"minecraft:bat_spawn_egg"},{"id":"minecraft:parrot_spawn_egg"},{"id":"minecraft:rabbit_spawn_egg"},{"id":"minecraft:llama_spawn_egg"},{"id":"minecraft:horse_spawn_egg"},{"id":"minecraft:donkey_spawn_egg"},{"id":"minecraft:mule_spawn_egg"},{"id":"minecraft:skeleton_horse_spawn_egg"},{"id":"minecraft:zombie_horse_spawn_egg"},{"id":"minecraft:tropical_fish_spawn_egg"},{"id":"minecraft:cod_spawn_egg"},{"id":"minecraft:pufferfish_spawn_egg"},{"id":"minecraft:salmon_spawn_egg"},{"id":"minecraft:dolphin_spawn_egg"},{"id":"minecraft:turtle_spawn_egg"},{"id":"minecraft:panda_spawn_egg"},{"id":"minecraft:fox_spawn_egg"},{"id":"minecraft:creeper_spawn_egg"},{"id":"minecraft:enderman_spawn_egg"},{"id":"minecraft:silverfish_spawn_egg"},{"id":"minecraft:skeleton_spawn_egg"},{"id":"minecraft:wither_skeleton_spawn_egg"},{"id":"minecraft:stray_spawn_egg"},{"id":"minecraft:slime_spawn_egg"},{"id":"minecraft:spider_spawn_egg"},{"id":"minecraft:zombie_spawn_egg"},{"id":"minecraft:zombie_pigman_spawn_egg"},{"id":"minecraft:husk_spawn_egg"},{"id":"minecraft:drowned_spawn_egg"},{"id":"minecraft:squid_spawn_egg"},{"id":"minecraft:glow_squid_spawn_egg"},{"id":"minecraft:cave_spider_spawn_egg"},{"id":"minecraft:witch_spawn_egg"},{"id":"minecraft:guardian_spawn_egg"},{"id":"minecraft:elder_guardian_spawn_egg"},{"id":"minecraft:endermite_spawn_egg"},{"id":"minecraft:magma_cube_spawn_egg"},{"id":"minecraft:strider_spawn_egg"},{"id":"minecraft:hoglin_spawn_egg"},{"id":"minecraft:piglin_spawn_egg"},{"id":"minecraft:zoglin_spawn_egg"},{"id":"minecraft:piglin_brute_spawn_egg"},{"id":"minecraft:goat_spawn_egg"},{"id":"minecraft:axolotl_spawn_egg"},{"id":"minecraft:ghast_spawn_egg"},{"id":"minecraft:blaze_spawn_egg"},{"id":"minecraft:shulker_spawn_egg"},{"id":"minecraft:vindicator_spawn_egg"},{"id":"minecraft:evoker_spawn_egg"},{"id":"minecraft:vex_spawn_egg"},{"id":"minecraft:villager_spawn_egg"},{"id":"minecraft:wandering_trader_spawn_egg"},{"id":"minecraft:zombie_villager_spawn_egg"},{"id":"minecraft:phantom_spawn_egg"},{"id":"minecraft:pillager_spawn_egg"},{"id":"minecraft:ravager_spawn_egg"},{"id":"minecraft:obsidian","blockRuntimeId":5737},{"id":"minecraft:crying_obsidian","blockRuntimeId":3909},{"id":"minecraft:bedrock","blockRuntimeId":234},{"id":"minecraft:soul_sand","blockRuntimeId":6955},{"id":"minecraft:netherrack","blockRuntimeId":5706},{"id":"minecraft:magma","blockRuntimeId":5602},{"id":"minecraft:nether_wart"},{"id":"minecraft:end_stone","blockRuntimeId":4745},{"id":"minecraft:chorus_flower","blockRuntimeId":1132},{"id":"minecraft:chorus_plant","blockRuntimeId":1138},{"id":"minecraft:chorus_fruit"},{"id":"minecraft:popped_chorus_fruit"},{"id":"minecraft:sponge","blockRuntimeId":6963},{"id":"minecraft:sponge","blockRuntimeId":6964},{"id":"minecraft:coral_block","blockRuntimeId":3689},{"id":"minecraft:coral_block","blockRuntimeId":3690},{"id":"minecraft:coral_block","blockRuntimeId":3691},{"id":"minecraft:coral_block","blockRuntimeId":3692},{"id":"minecraft:coral_block","blockRuntimeId":3693},{"id":"minecraft:coral_block","blockRuntimeId":3694},{"id":"minecraft:coral_block","blockRuntimeId":3695},{"id":"minecraft:coral_block","blockRuntimeId":3696},{"id":"minecraft:coral_block","blockRuntimeId":3697},{"id":"minecraft:coral_block","blockRuntimeId":3698},{"id":"minecraft:leather_helmet"},{"id":"minecraft:chainmail_helmet"},{"id":"minecraft:iron_helmet"},{"id":"minecraft:golden_helmet"},{"id":"minecraft:diamond_helmet"},{"id":"minecraft:netherite_helmet"},{"id":"minecraft:leather_chestplate"},{"id":"minecraft:chainmail_chestplate"},{"id":"minecraft:iron_chestplate"},{"id":"minecraft:golden_chestplate"},{"id":"minecraft:diamond_chestplate"},{"id":"minecraft:netherite_chestplate"},{"id":"minecraft:leather_leggings"},{"id":"minecraft:chainmail_leggings"},{"id":"minecraft:iron_leggings"},{"id":"minecraft:golden_leggings"},{"id":"minecraft:diamond_leggings"},{"id":"minecraft:netherite_leggings"},{"id":"minecraft:leather_boots"},{"id":"minecraft:chainmail_boots"},{"id":"minecraft:iron_boots"},{"id":"minecraft:golden_boots"},{"id":"minecraft:diamond_boots"},{"id":"minecraft:netherite_boots"},{"id":"minecraft:wooden_sword"},{"id":"minecraft:stone_sword"},{"id":"minecraft:iron_sword"},{"id":"minecraft:golden_sword"},{"id":"minecraft:diamond_sword"},{"id":"minecraft:netherite_sword"},{"id":"minecraft:wooden_axe"},{"id":"minecraft:stone_axe"},{"id":"minecraft:iron_axe"},{"id":"minecraft:golden_axe"},{"id":"minecraft:diamond_axe"},{"id":"minecraft:netherite_axe"},{"id":"minecraft:wooden_pickaxe"},{"id":"minecraft:stone_pickaxe"},{"id":"minecraft:iron_pickaxe"},{"id":"minecraft:golden_pickaxe"},{"id":"minecraft:diamond_pickaxe"},{"id":"minecraft:netherite_pickaxe"},{"id":"minecraft:wooden_shovel"},{"id":"minecraft:stone_shovel"},{"id":"minecraft:iron_shovel"},{"id":"minecraft:golden_shovel"},{"id":"minecraft:diamond_shovel"},{"id":"minecraft:netherite_shovel"},{"id":"minecraft:wooden_hoe"},{"id":"minecraft:stone_hoe"},{"id":"minecraft:iron_hoe"},{"id":"minecraft:golden_hoe"},{"id":"minecraft:diamond_hoe"},{"id":"minecraft:netherite_hoe"},{"id":"minecraft:bow"},{"id":"minecraft:crossbow"},{"id":"minecraft:arrow"},{"id":"minecraft:arrow","damage":6},{"id":"minecraft:arrow","damage":7},{"id":"minecraft:arrow","damage":8},{"id":"minecraft:arrow","damage":9},{"id":"minecraft:arrow","damage":10},{"id":"minecraft:arrow","damage":11},{"id":"minecraft:arrow","damage":12},{"id":"minecraft:arrow","damage":13},{"id":"minecraft:arrow","damage":14},{"id":"minecraft:arrow","damage":15},{"id":"minecraft:arrow","damage":16},{"id":"minecraft:arrow","damage":17},{"id":"minecraft:arrow","damage":18},{"id":"minecraft:arrow","damage":19},{"id":"minecraft:arrow","damage":20},{"id":"minecraft:arrow","damage":21},{"id":"minecraft:arrow","damage":22},{"id":"minecraft:arrow","damage":23},{"id":"minecraft:arrow","damage":24},{"id":"minecraft:arrow","damage":25},{"id":"minecraft:arrow","damage":26},{"id":"minecraft:arrow","damage":27},{"id":"minecraft:arrow","damage":28},{"id":"minecraft:arrow","damage":29},{"id":"minecraft:arrow","damage":30},{"id":"minecraft:arrow","damage":31},{"id":"minecraft:arrow","damage":32},{"id":"minecraft:arrow","damage":33},{"id":"minecraft:arrow","damage":34},{"id":"minecraft:arrow","damage":35},{"id":"minecraft:arrow","damage":36},{"id":"minecraft:arrow","damage":37},{"id":"minecraft:arrow","damage":38},{"id":"minecraft:arrow","damage":39},{"id":"minecraft:arrow","damage":40},{"id":"minecraft:arrow","damage":41},{"id":"minecraft:arrow","damage":42},{"id":"minecraft:arrow","damage":43},{"id":"minecraft:shield"},{"id":"minecraft:cooked_chicken"},{"id":"minecraft:cooked_porkchop"},{"id":"minecraft:cooked_beef"},{"id":"minecraft:cooked_mutton"},{"id":"minecraft:cooked_rabbit"},{"id":"minecraft:cooked_cod"},{"id":"minecraft:cooked_salmon"},{"id":"minecraft:bread"},{"id":"minecraft:mushroom_stew"},{"id":"minecraft:beetroot_soup"},{"id":"minecraft:rabbit_stew"},{"id":"minecraft:baked_potato"},{"id":"minecraft:cookie"},{"id":"minecraft:pumpkin_pie"},{"id":"minecraft:cake"},{"id":"minecraft:dried_kelp"},{"id":"minecraft:fishing_rod"},{"id":"minecraft:carrot_on_a_stick"},{"id":"minecraft:warped_fungus_on_a_stick"},{"id":"minecraft:snowball"},{"id":"minecraft:shears"},{"id":"minecraft:flint_and_steel"},{"id":"minecraft:lead"},{"id":"minecraft:clock"},{"id":"minecraft:compass"},{"id":"minecraft:empty_map"},{"id":"minecraft:empty_map","damage":2},{"id":"minecraft:saddle"},{"id":"minecraft:leather_horse_armor"},{"id":"minecraft:iron_horse_armor"},{"id":"minecraft:golden_horse_armor"},{"id":"minecraft:diamond_horse_armor"},{"id":"minecraft:trident"},{"id":"minecraft:turtle_helmet"},{"id":"minecraft:elytra"},{"id":"minecraft:totem_of_undying"},{"id":"minecraft:glass_bottle"},{"id":"minecraft:experience_bottle"},{"id":"minecraft:potion"},{"id":"minecraft:potion","damage":1},{"id":"minecraft:potion","damage":2},{"id":"minecraft:potion","damage":3},{"id":"minecraft:potion","damage":4},{"id":"minecraft:potion","damage":5},{"id":"minecraft:potion","damage":6},{"id":"minecraft:potion","damage":7},{"id":"minecraft:potion","damage":8},{"id":"minecraft:potion","damage":9},{"id":"minecraft:potion","damage":10},{"id":"minecraft:potion","damage":11},{"id":"minecraft:potion","damage":12},{"id":"minecraft:potion","damage":13},{"id":"minecraft:potion","damage":14},{"id":"minecraft:potion","damage":15},{"id":"minecraft:potion","damage":16},{"id":"minecraft:potion","damage":17},{"id":"minecraft:potion","damage":18},{"id":"minecraft:potion","damage":19},{"id":"minecraft:potion","damage":20},{"id":"minecraft:potion","damage":21},{"id":"minecraft:potion","damage":22},{"id":"minecraft:potion","damage":23},{"id":"minecraft:potion","damage":24},{"id":"minecraft:potion","damage":25},{"id":"minecraft:potion","damage":26},{"id":"minecraft:potion","damage":27},{"id":"minecraft:potion","damage":28},{"id":"minecraft:potion","damage":29},{"id":"minecraft:potion","damage":30},{"id":"minecraft:potion","damage":31},{"id":"minecraft:potion","damage":32},{"id":"minecraft:potion","damage":33},{"id":"minecraft:potion","damage":34},{"id":"minecraft:potion","damage":35},{"id":"minecraft:potion","damage":36},{"id":"minecraft:potion","damage":37},{"id":"minecraft:potion","damage":38},{"id":"minecraft:potion","damage":39},{"id":"minecraft:potion","damage":40},{"id":"minecraft:potion","damage":41},{"id":"minecraft:potion","damage":42},{"id":"minecraft:splash_potion"},{"id":"minecraft:splash_potion","damage":1},{"id":"minecraft:splash_potion","damage":2},{"id":"minecraft:splash_potion","damage":3},{"id":"minecraft:splash_potion","damage":4},{"id":"minecraft:splash_potion","damage":5},{"id":"minecraft:splash_potion","damage":6},{"id":"minecraft:splash_potion","damage":7},{"id":"minecraft:splash_potion","damage":8},{"id":"minecraft:splash_potion","damage":9},{"id":"minecraft:splash_potion","damage":10},{"id":"minecraft:splash_potion","damage":11},{"id":"minecraft:splash_potion","damage":12},{"id":"minecraft:splash_potion","damage":13},{"id":"minecraft:splash_potion","damage":14},{"id":"minecraft:splash_potion","damage":15},{"id":"minecraft:splash_potion","damage":16},{"id":"minecraft:splash_potion","damage":17},{"id":"minecraft:splash_potion","damage":18},{"id":"minecraft:splash_potion","damage":19},{"id":"minecraft:splash_potion","damage":20},{"id":"minecraft:splash_potion","damage":21},{"id":"minecraft:splash_potion","damage":22},{"id":"minecraft:splash_potion","damage":23},{"id":"minecraft:splash_potion","damage":24},{"id":"minecraft:splash_potion","damage":25},{"id":"minecraft:splash_potion","damage":26},{"id":"minecraft:splash_potion","damage":27},{"id":"minecraft:splash_potion","damage":28},{"id":"minecraft:splash_potion","damage":29},{"id":"minecraft:splash_potion","damage":30},{"id":"minecraft:splash_potion","damage":31},{"id":"minecraft:splash_potion","damage":32},{"id":"minecraft:splash_potion","damage":33},{"id":"minecraft:splash_potion","damage":34},{"id":"minecraft:splash_potion","damage":35},{"id":"minecraft:splash_potion","damage":36},{"id":"minecraft:splash_potion","damage":37},{"id":"minecraft:splash_potion","damage":38},{"id":"minecraft:splash_potion","damage":39},{"id":"minecraft:splash_potion","damage":40},{"id":"minecraft:splash_potion","damage":41},{"id":"minecraft:splash_potion","damage":42},{"id":"minecraft:lingering_potion"},{"id":"minecraft:lingering_potion","damage":1},{"id":"minecraft:lingering_potion","damage":2},{"id":"minecraft:lingering_potion","damage":3},{"id":"minecraft:lingering_potion","damage":4},{"id":"minecraft:lingering_potion","damage":5},{"id":"minecraft:lingering_potion","damage":6},{"id":"minecraft:lingering_potion","damage":7},{"id":"minecraft:lingering_potion","damage":8},{"id":"minecraft:lingering_potion","damage":9},{"id":"minecraft:lingering_potion","damage":10},{"id":"minecraft:lingering_potion","damage":11},{"id":"minecraft:lingering_potion","damage":12},{"id":"minecraft:lingering_potion","damage":13},{"id":"minecraft:lingering_potion","damage":14},{"id":"minecraft:lingering_potion","damage":15},{"id":"minecraft:lingering_potion","damage":16},{"id":"minecraft:lingering_potion","damage":17},{"id":"minecraft:lingering_potion","damage":18},{"id":"minecraft:lingering_potion","damage":19},{"id":"minecraft:lingering_potion","damage":20},{"id":"minecraft:lingering_potion","damage":21},{"id":"minecraft:lingering_potion","damage":22},{"id":"minecraft:lingering_potion","damage":23},{"id":"minecraft:lingering_potion","damage":24},{"id":"minecraft:lingering_potion","damage":25},{"id":"minecraft:lingering_potion","damage":26},{"id":"minecraft:lingering_potion","damage":27},{"id":"minecraft:lingering_potion","damage":28},{"id":"minecraft:lingering_potion","damage":29},{"id":"minecraft:lingering_potion","damage":30},{"id":"minecraft:lingering_potion","damage":31},{"id":"minecraft:lingering_potion","damage":32},{"id":"minecraft:lingering_potion","damage":33},{"id":"minecraft:lingering_potion","damage":34},{"id":"minecraft:lingering_potion","damage":35},{"id":"minecraft:lingering_potion","damage":36},{"id":"minecraft:lingering_potion","damage":37},{"id":"minecraft:lingering_potion","damage":38},{"id":"minecraft:lingering_potion","damage":39},{"id":"minecraft:lingering_potion","damage":40},{"id":"minecraft:lingering_potion","damage":41},{"id":"minecraft:lingering_potion","damage":42},{"id":"minecraft:spyglass"},{"id":"minecraft:stick"},{"id":"minecraft:bed"},{"id":"minecraft:bed","damage":8},{"id":"minecraft:bed","damage":7},{"id":"minecraft:bed","damage":15},{"id":"minecraft:bed","damage":12},{"id":"minecraft:bed","damage":14},{"id":"minecraft:bed","damage":1},{"id":"minecraft:bed","damage":4},{"id":"minecraft:bed","damage":5},{"id":"minecraft:bed","damage":13},{"id":"minecraft:bed","damage":9},{"id":"minecraft:bed","damage":3},{"id":"minecraft:bed","damage":11},{"id":"minecraft:bed","damage":10},{"id":"minecraft:bed","damage":2},{"id":"minecraft:bed","damage":6},{"id":"minecraft:torch","blockRuntimeId":7357},{"id":"minecraft:soul_torch","blockRuntimeId":6957},{"id":"minecraft:sea_pickle","blockRuntimeId":6817},{"id":"minecraft:lantern","blockRuntimeId":5363},{"id":"minecraft:soul_lantern","blockRuntimeId":6953},{"id":"minecraft:candle","blockRuntimeId":953},{"id":"minecraft:white_candle","blockRuntimeId":7790},{"id":"minecraft:orange_candle","blockRuntimeId":5738},{"id":"minecraft:magenta_candle","blockRuntimeId":5586},{"id":"minecraft:light_blue_candle","blockRuntimeId":5474},{"id":"minecraft:yellow_candle","blockRuntimeId":7931},{"id":"minecraft:lime_candle","blockRuntimeId":5522},{"id":"minecraft:pink_candle","blockRuntimeId":5769},{"id":"minecraft:gray_candle","blockRuntimeId":5000},{"id":"minecraft:light_gray_candle","blockRuntimeId":5490},{"id":"minecraft:cyan_candle","blockRuntimeId":3921},{"id":"minecraft:purple_candle","blockRuntimeId":6509},{"id":"minecraft:blue_candle","blockRuntimeId":675},{"id":"minecraft:brown_candle","blockRuntimeId":884},{"id":"minecraft:green_candle","blockRuntimeId":5016},{"id":"minecraft:red_candle","blockRuntimeId":6580},{"id":"minecraft:black_candle","blockRuntimeId":478},{"id":"minecraft:crafting_table","blockRuntimeId":3771},{"id":"minecraft:cartography_table","blockRuntimeId":987},{"id":"minecraft:fletching_table","blockRuntimeId":4812},{"id":"minecraft:smithing_table","blockRuntimeId":6879},{"id":"minecraft:beehive","blockRuntimeId":260},{"id":"minecraft:campfire"},{"id":"minecraft:soul_campfire"},{"id":"minecraft:furnace","blockRuntimeId":4876},{"id":"minecraft:blast_furnace","blockRuntimeId":669},{"id":"minecraft:smoker","blockRuntimeId":6880},{"id":"minecraft:respawn_anchor","blockRuntimeId":6699},{"id":"minecraft:brewing_stand"},{"id":"minecraft:anvil","blockRuntimeId":152},{"id":"minecraft:anvil","blockRuntimeId":156},{"id":"minecraft:anvil","blockRuntimeId":160},{"id":"minecraft:grindstone","blockRuntimeId":5032},{"id":"minecraft:enchanting_table","blockRuntimeId":4719},{"id":"minecraft:bookshelf","blockRuntimeId":704},{"id":"minecraft:lectern","blockRuntimeId":5434},{"id":"minecraft:cauldron"},{"id":"minecraft:composter","blockRuntimeId":3635},{"id":"minecraft:chest","blockRuntimeId":1123},{"id":"minecraft:trapped_chest","blockRuntimeId":7379},{"id":"minecraft:ender_chest","blockRuntimeId":4746},{"id":"minecraft:barrel","blockRuntimeId":201},{"id":"minecraft:undyed_shulker_box","blockRuntimeId":7462},{"id":"minecraft:shulker_box","blockRuntimeId":6830},{"id":"minecraft:shulker_box","blockRuntimeId":6838},{"id":"minecraft:shulker_box","blockRuntimeId":6837},{"id":"minecraft:shulker_box","blockRuntimeId":6845},{"id":"minecraft:shulker_box","blockRuntimeId":6842},{"id":"minecraft:shulker_box","blockRuntimeId":6844},{"id":"minecraft:shulker_box","blockRuntimeId":6831},{"id":"minecraft:shulker_box","blockRuntimeId":6834},{"id":"minecraft:shulker_box","blockRuntimeId":6835},{"id":"minecraft:shulker_box","blockRuntimeId":6843},{"id":"minecraft:shulker_box","blockRuntimeId":6839},{"id":"minecraft:shulker_box","blockRuntimeId":6833},{"id":"minecraft:shulker_box","blockRuntimeId":6841},{"id":"minecraft:shulker_box","blockRuntimeId":6840},{"id":"minecraft:shulker_box","blockRuntimeId":6832},{"id":"minecraft:shulker_box","blockRuntimeId":6836},{"id":"minecraft:armor_stand"},{"id":"minecraft:noteblock","blockRuntimeId":5716},{"id":"minecraft:jukebox","blockRuntimeId":5208},{"id":"minecraft:music_disc_13"},{"id":"minecraft:music_disc_cat"},{"id":"minecraft:music_disc_blocks"},{"id":"minecraft:music_disc_chirp"},{"id":"minecraft:music_disc_far"},{"id":"minecraft:music_disc_mall"},{"id":"minecraft:music_disc_mellohi"},{"id":"minecraft:music_disc_stal"},{"id":"minecraft:music_disc_strad"},{"id":"minecraft:music_disc_ward"},{"id":"minecraft:music_disc_11"},{"id":"minecraft:music_disc_wait"},{"id":"minecraft:music_disc_pigstep"},{"id":"minecraft:glowstone_dust"},{"id":"minecraft:glowstone","blockRuntimeId":4974},{"id":"minecraft:redstone_lamp","blockRuntimeId":6646},{"id":"minecraft:sealantern","blockRuntimeId":6828},{"id":"minecraft:oak_sign"},{"id":"minecraft:spruce_sign"},{"id":"minecraft:birch_sign"},{"id":"minecraft:jungle_sign"},{"id":"minecraft:acacia_sign"},{"id":"minecraft:dark_oak_sign"},{"id":"minecraft:crimson_sign"},{"id":"minecraft:warped_sign"},{"id":"minecraft:painting"},{"id":"minecraft:frame"},{"id":"minecraft:glow_frame"},{"id":"minecraft:honey_bottle"},{"id":"minecraft:flower_pot"},{"id":"minecraft:bowl"},{"id":"minecraft:bucket"},{"id":"minecraft:milk_bucket"},{"id":"minecraft:water_bucket"},{"id":"minecraft:lava_bucket"},{"id":"minecraft:cod_bucket"},{"id":"minecraft:salmon_bucket"},{"id":"minecraft:tropical_fish_bucket"},{"id":"minecraft:pufferfish_bucket"},{"id":"minecraft:powder_snow_bucket"},{"id":"minecraft:axolotl_bucket"},{"id":"minecraft:skull","damage":3},{"id":"minecraft:skull","damage":2},{"id":"minecraft:skull","damage":4},{"id":"minecraft:skull","damage":5},{"id":"minecraft:skull"},{"id":"minecraft:skull","damage":1},{"id":"minecraft:beacon","blockRuntimeId":217},{"id":"minecraft:bell","blockRuntimeId":292},{"id":"minecraft:conduit","blockRuntimeId":3676},{"id":"minecraft:stonecutter_block","blockRuntimeId":7295},{"id":"minecraft:end_portal_frame","blockRuntimeId":4731},{"id":"minecraft:coal"},{"id":"minecraft:charcoal"},{"id":"minecraft:diamond"},{"id":"minecraft:iron_nugget"},{"id":"minecraft:raw_iron"},{"id":"minecraft:raw_gold"},{"id":"minecraft:raw_copper"},{"id":"minecraft:copper_ingot"},{"id":"minecraft:iron_ingot"},{"id":"minecraft:netherite_scrap"},{"id":"minecraft:netherite_ingot"},{"id":"minecraft:gold_nugget"},{"id":"minecraft:gold_ingot"},{"id":"minecraft:emerald"},{"id":"minecraft:quartz"},{"id":"minecraft:clay_ball"},{"id":"minecraft:brick"},{"id":"minecraft:netherbrick"},{"id":"minecraft:prismarine_shard"},{"id":"minecraft:amethyst_shard"},{"id":"minecraft:prismarine_crystals"},{"id":"minecraft:nautilus_shell"},{"id":"minecraft:heart_of_the_sea"},{"id":"minecraft:scute"},{"id":"minecraft:phantom_membrane"},{"id":"minecraft:string"},{"id":"minecraft:feather"},{"id":"minecraft:flint"},{"id":"minecraft:gunpowder"},{"id":"minecraft:leather"},{"id":"minecraft:rabbit_hide"},{"id":"minecraft:rabbit_foot"},{"id":"minecraft:fire_charge"},{"id":"minecraft:blaze_rod"},{"id":"minecraft:blaze_powder"},{"id":"minecraft:magma_cream"},{"id":"minecraft:fermented_spider_eye"},{"id":"minecraft:dragon_breath"},{"id":"minecraft:shulker_shell"},{"id":"minecraft:ghast_tear"},{"id":"minecraft:slime_ball"},{"id":"minecraft:ender_pearl"},{"id":"minecraft:ender_eye"},{"id":"minecraft:nether_star"},{"id":"minecraft:end_rod","blockRuntimeId":4739},{"id":"minecraft:lightning_rod","blockRuntimeId":5516},{"id":"minecraft:end_crystal"},{"id":"minecraft:paper"},{"id":"minecraft:book"},{"id":"minecraft:writable_book"},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA="},{"id":"minecraft:enchanted_book","nbt_b64":"CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA="},{"id":"minecraft:oak_boat"},{"id":"minecraft:spruce_boat"},{"id":"minecraft:birch_boat"},{"id":"minecraft:jungle_boat"},{"id":"minecraft:acacia_boat"},{"id":"minecraft:dark_oak_boat"},{"id":"minecraft:rail","blockRuntimeId":6567},{"id":"minecraft:golden_rail","blockRuntimeId":4977},{"id":"minecraft:detector_rail","blockRuntimeId":4462},{"id":"minecraft:activator_rail","blockRuntimeId":122},{"id":"minecraft:minecart"},{"id":"minecraft:chest_minecart"},{"id":"minecraft:hopper_minecart"},{"id":"minecraft:tnt_minecart"},{"id":"minecraft:redstone"},{"id":"minecraft:redstone_block","blockRuntimeId":6645},{"id":"minecraft:redstone_torch","blockRuntimeId":6648},{"id":"minecraft:lever","blockRuntimeId":5442},{"id":"minecraft:wooden_button","blockRuntimeId":7843},{"id":"minecraft:spruce_button","blockRuntimeId":6966},{"id":"minecraft:birch_button","blockRuntimeId":356},{"id":"minecraft:jungle_button","blockRuntimeId":5209},{"id":"minecraft:acacia_button"},{"id":"minecraft:dark_oak_button","blockRuntimeId":3937},{"id":"minecraft:stone_button","blockRuntimeId":7195},{"id":"minecraft:crimson_button","blockRuntimeId":3772},{"id":"minecraft:warped_button","blockRuntimeId":7530},{"id":"minecraft:polished_blackstone_button","blockRuntimeId":6001},{"id":"minecraft:tripwire_hook","blockRuntimeId":7401},{"id":"minecraft:wooden_pressure_plate","blockRuntimeId":7887},{"id":"minecraft:spruce_pressure_plate","blockRuntimeId":7026},{"id":"minecraft:birch_pressure_plate","blockRuntimeId":416},{"id":"minecraft:jungle_pressure_plate","blockRuntimeId":5269},{"id":"minecraft:acacia_pressure_plate","blockRuntimeId":60},{"id":"minecraft:dark_oak_pressure_plate","blockRuntimeId":3997},{"id":"minecraft:crimson_pressure_plate","blockRuntimeId":3841},{"id":"minecraft:warped_pressure_plate","blockRuntimeId":7599},{"id":"minecraft:stone_pressure_plate","blockRuntimeId":7207},{"id":"minecraft:light_weighted_pressure_plate","blockRuntimeId":5500},{"id":"minecraft:heavy_weighted_pressure_plate","blockRuntimeId":5096},{"id":"minecraft:polished_blackstone_pressure_plate","blockRuntimeId":6015},{"id":"minecraft:observer","blockRuntimeId":5725},{"id":"minecraft:daylight_detector","blockRuntimeId":4067},{"id":"minecraft:repeater"},{"id":"minecraft:comparator"},{"id":"minecraft:hopper"},{"id":"minecraft:dropper","blockRuntimeId":4589},{"id":"minecraft:dispenser","blockRuntimeId":4490},{"id":"minecraft:piston","blockRuntimeId":5786},{"id":"minecraft:sticky_piston","blockRuntimeId":7169},{"id":"minecraft:tnt","blockRuntimeId":7353},{"id":"minecraft:name_tag"},{"id":"minecraft:loom","blockRuntimeId":5582},{"id":"minecraft:banner"},{"id":"minecraft:banner","damage":8},{"id":"minecraft:banner","damage":7},{"id":"minecraft:banner","damage":15},{"id":"minecraft:banner","damage":12},{"id":"minecraft:banner","damage":14},{"id":"minecraft:banner","damage":1},{"id":"minecraft:banner","damage":4},{"id":"minecraft:banner","damage":5},{"id":"minecraft:banner","damage":13},{"id":"minecraft:banner","damage":9},{"id":"minecraft:banner","damage":3},{"id":"minecraft:banner","damage":11},{"id":"minecraft:banner","damage":10},{"id":"minecraft:banner","damage":2},{"id":"minecraft:banner","damage":6},{"id":"minecraft:banner","damage":15,"nbt_b64":"CgAAAwQAVHlwZQEAAAAA"},{"id":"minecraft:creeper_banner_pattern"},{"id":"minecraft:skull_banner_pattern"},{"id":"minecraft:flower_banner_pattern"},{"id":"minecraft:mojang_banner_pattern"},{"id":"minecraft:field_masoned_banner_pattern"},{"id":"minecraft:bordure_indented_banner_pattern"},{"id":"minecraft:piglin_banner_pattern"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_rocket","nbt_b64":"CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA"},{"id":"minecraft:firework_star","nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA="},{"id":"minecraft:firework_star","damage":8,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA="},{"id":"minecraft:firework_star","damage":7,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA="},{"id":"minecraft:firework_star","damage":15,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA="},{"id":"minecraft:firework_star","damage":12,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA="},{"id":"minecraft:firework_star","damage":14,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA="},{"id":"minecraft:firework_star","damage":1,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA="},{"id":"minecraft:firework_star","damage":4,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA="},{"id":"minecraft:firework_star","damage":5,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA="},{"id":"minecraft:firework_star","damage":13,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA="},{"id":"minecraft:firework_star","damage":9,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA="},{"id":"minecraft:firework_star","damage":3,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA="},{"id":"minecraft:firework_star","damage":11,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA="},{"id":"minecraft:firework_star","damage":10,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA="},{"id":"minecraft:firework_star","damage":2,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA="},{"id":"minecraft:firework_star","damage":6,"nbt_b64":"CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA="},{"id":"minecraft:chain"},{"id":"minecraft:target","blockRuntimeId":7351},{"id":"minecraft:lodestone_compass"}]} diff --git a/src/main/resources/entity_identifiers_419.dat b/src/main/resources/entity_identifiers_419.dat deleted file mode 100644 index 24e14e8ffcc7e4e709c250adaa5cf1aeb28ac8bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7193 zcmb7J-|H6dXYrd>Ro=^9lBC`uhS&7u}S#xY5mEyTDY;knY9wW1#r_&AF zmZh$EqQqn}Msemqk@5zh&j--yDD<2G+O(!o0?^M9(dQ26w2H^Z zil_q+bM$VV3Z=dIt7u>p@Io8wd*kX|V_j319Fld6hDEQgwc>^)f*T;Xo<@KQHE+4e zB=?P((BSCZHLo)7`;YOItw+4(#`F=tfo2&sXVKa@y!k;IbpKE)jnTDCxtd8^0L4k7 z?-vamOW71oiS1k{(P$sOhiIOlc1gAG(jVduK)oXewse_D!2+SVkLCcbpLRAAW;+ny z#{GaKq6%<U?`kb#jrs#uBDNn3ht9XP+S+KSg)T#*R?BPaBL;J9}$y)Qs_N_Fy2J-0X?Is zn$Urdi4LGDNR1ot!pq;yG!IZV(n8oZA3h=afJAhaQwYN?Q76`Q(AF~RUvO&_40${< z)KjX<(upujluqYiG(RQ2BU{ZFr4SR|vrtjRCC*&bGfs9t(26V;_KZv>LkE2v$!7&>edKph(1LTq#-Qek1_N z;{nOIeH6XpHA{4}y7-?62*$lYdg2JQNx=M*0eam0C8&)y1=BO;i^$5n;tHsqB2uAn zc#hO;x>S0SrvsAl*C1`^OOYk5atlAW@DY%WdPY5b>zE-N!93{VEZPOxIjijf)}RUkmW# zDL{#A+;^2_#TxhhO!O`GERh9y5k&tDA|BPGtrfQgt92uLb$l}*8P5U|C|}sMJN|tY zycJN4M*~e5B|10eRey%R9WabLfl7M&5O$3LIe91G821A0u$Y5oymCWFw-(smBeEgY zO?3Ye>fHc4{u)#rO6EmVfp}`=+x-3Av)Ix#X4s)01T5oG!MW+a3w6t=_v3RS!^MM$ zaw9ks?!r$SmMY!)Irbru=-@!qjT2$Iu%L?lZ1+4}+bp%2TV~v~((C9m0S_rnVxiqy z%jIn9&MN11kk;FeG`X6_)*lVI)$jsu;b(DN9yUsyVe;?c`1zl z`uHg3*wJ~gj@A=*;<~B^2mTCv-_e70-_w3}?#Fh=k;v|r-nRP>(JoS3?=?$I+po3% z5;;)Z6X7@FKZsDI1539HdmV6R*6N$ZuW=rzS|n}V{(wH#UrCE1dc#cnj{7}sdp+^R skbu94XjJp=zTEy;^Y>2hjX^bopLq}hR0nPW*z8Z66Q|<$PbQQ90FT1(TL1t6 diff --git a/src/main/resources/extras_407.json b/src/main/resources/extras_407.json deleted file mode 100644 index f9b41b4f4..000000000 --- a/src/main/resources/extras_407.json +++ /dev/null @@ -1 +0,0 @@ -{"potionMixes":[{"inputId":373,"inputMeta":17,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":42},{"inputId":438,"inputMeta":17,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":42},{"inputId":441,"inputMeta":17,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":42},{"inputId":373,"inputMeta":27,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":24},{"inputId":438,"inputMeta":27,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":24},{"inputId":441,"inputMeta":27,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":24},{"inputId":373,"inputMeta":4,"reagentId":377,"reagentMeta":0,"outputId":373,"outputMeta":31},{"inputId":438,"inputMeta":4,"reagentId":377,"reagentMeta":0,"outputId":438,"outputMeta":31},{"inputId":441,"inputMeta":4,"reagentId":377,"reagentMeta":0,"outputId":441,"outputMeta":31},{"inputId":373,"inputMeta":4,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":34},{"inputId":438,"inputMeta":4,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":34},{"inputId":441,"inputMeta":4,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":34},{"inputId":373,"inputMeta":4,"reagentId":370,"reagentMeta":0,"outputId":373,"outputMeta":28},{"inputId":438,"inputMeta":4,"reagentId":370,"reagentMeta":0,"outputId":438,"outputMeta":28},{"inputId":441,"inputMeta":4,"reagentId":370,"reagentMeta":0,"outputId":441,"outputMeta":28},{"inputId":373,"inputMeta":4,"reagentId":396,"reagentMeta":0,"outputId":373,"outputMeta":5},{"inputId":438,"inputMeta":4,"reagentId":396,"reagentMeta":0,"outputId":438,"outputMeta":5},{"inputId":441,"inputMeta":4,"reagentId":396,"reagentMeta":0,"outputId":441,"outputMeta":5},{"inputId":373,"inputMeta":4,"reagentId":378,"reagentMeta":0,"outputId":373,"outputMeta":12},{"inputId":438,"inputMeta":4,"reagentId":378,"reagentMeta":0,"outputId":438,"outputMeta":12},{"inputId":441,"inputMeta":4,"reagentId":378,"reagentMeta":0,"outputId":441,"outputMeta":12},{"inputId":373,"inputMeta":4,"reagentId":470,"reagentMeta":0,"outputId":373,"outputMeta":40},{"inputId":438,"inputMeta":4,"reagentId":470,"reagentMeta":0,"outputId":438,"outputMeta":40},{"inputId":441,"inputMeta":4,"reagentId":470,"reagentMeta":0,"outputId":441,"outputMeta":40},{"inputId":373,"inputMeta":4,"reagentId":462,"reagentMeta":0,"outputId":373,"outputMeta":19},{"inputId":438,"inputMeta":4,"reagentId":462,"reagentMeta":0,"outputId":438,"outputMeta":19},{"inputId":441,"inputMeta":4,"reagentId":462,"reagentMeta":0,"outputId":441,"outputMeta":19},{"inputId":373,"inputMeta":4,"reagentId":414,"reagentMeta":0,"outputId":373,"outputMeta":9},{"inputId":438,"inputMeta":4,"reagentId":414,"reagentMeta":0,"outputId":438,"outputMeta":9},{"inputId":441,"inputMeta":4,"reagentId":414,"reagentMeta":0,"outputId":441,"outputMeta":9},{"inputId":373,"inputMeta":4,"reagentId":382,"reagentMeta":0,"outputId":373,"outputMeta":21},{"inputId":438,"inputMeta":4,"reagentId":382,"reagentMeta":0,"outputId":438,"outputMeta":21},{"inputId":441,"inputMeta":4,"reagentId":382,"reagentMeta":0,"outputId":441,"outputMeta":21},{"inputId":373,"inputMeta":4,"reagentId":375,"reagentMeta":0,"outputId":373,"outputMeta":25},{"inputId":438,"inputMeta":4,"reagentId":375,"reagentMeta":0,"outputId":438,"outputMeta":25},{"inputId":441,"inputMeta":4,"reagentId":375,"reagentMeta":0,"outputId":441,"outputMeta":25},{"inputId":373,"inputMeta":4,"reagentId":353,"reagentMeta":0,"outputId":373,"outputMeta":14},{"inputId":438,"inputMeta":4,"reagentId":353,"reagentMeta":0,"outputId":438,"outputMeta":14},{"inputId":441,"inputMeta":4,"reagentId":353,"reagentMeta":0,"outputId":441,"outputMeta":14},{"inputId":373,"inputMeta":4,"reagentId":469,"reagentMeta":0,"outputId":373,"outputMeta":37},{"inputId":438,"inputMeta":4,"reagentId":469,"reagentMeta":0,"outputId":438,"outputMeta":37},{"inputId":441,"inputMeta":4,"reagentId":469,"reagentMeta":0,"outputId":441,"outputMeta":37},{"inputId":373,"inputMeta":12,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":13},{"inputId":438,"inputMeta":12,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":13},{"inputId":441,"inputMeta":12,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":13},{"inputId":373,"inputMeta":23,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":24},{"inputId":438,"inputMeta":23,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":24},{"inputId":441,"inputMeta":23,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":24},{"inputId":373,"inputMeta":21,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":23},{"inputId":438,"inputMeta":21,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":23},{"inputId":441,"inputMeta":21,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":23},{"inputId":373,"inputMeta":21,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":22},{"inputId":438,"inputMeta":21,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":22},{"inputId":441,"inputMeta":21,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":22},{"inputId":373,"inputMeta":7,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":8},{"inputId":438,"inputMeta":7,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":8},{"inputId":441,"inputMeta":7,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":8},{"inputId":373,"inputMeta":9,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":17},{"inputId":438,"inputMeta":9,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":17},{"inputId":441,"inputMeta":9,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":17},{"inputId":373,"inputMeta":9,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":11},{"inputId":438,"inputMeta":9,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":11},{"inputId":441,"inputMeta":9,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":11},{"inputId":373,"inputMeta":9,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":10},{"inputId":438,"inputMeta":9,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":10},{"inputId":441,"inputMeta":9,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":10},{"inputId":373,"inputMeta":6,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":8},{"inputId":438,"inputMeta":6,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":8},{"inputId":441,"inputMeta":6,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":8},{"inputId":373,"inputMeta":15,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":18},{"inputId":438,"inputMeta":15,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":18},{"inputId":441,"inputMeta":15,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":18},{"inputId":373,"inputMeta":10,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":18},{"inputId":438,"inputMeta":10,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":18},{"inputId":441,"inputMeta":10,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":18},{"inputId":373,"inputMeta":2,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":35},{"inputId":438,"inputMeta":2,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":35},{"inputId":441,"inputMeta":2,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":35},{"inputId":373,"inputMeta":26,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":23},{"inputId":438,"inputMeta":26,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":23},{"inputId":441,"inputMeta":26,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":23},{"inputId":373,"inputMeta":32,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":35},{"inputId":438,"inputMeta":32,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":35},{"inputId":441,"inputMeta":32,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":35},{"inputId":373,"inputMeta":1,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":34},{"inputId":438,"inputMeta":1,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":34},{"inputId":441,"inputMeta":1,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":34},{"inputId":373,"inputMeta":5,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":7},{"inputId":438,"inputMeta":5,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":7},{"inputId":441,"inputMeta":5,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":7},{"inputId":373,"inputMeta":5,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":6},{"inputId":438,"inputMeta":5,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":6},{"inputId":441,"inputMeta":5,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":6},{"inputId":373,"inputMeta":25,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":23},{"inputId":438,"inputMeta":25,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":23},{"inputId":441,"inputMeta":25,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":23},{"inputId":373,"inputMeta":25,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":27},{"inputId":438,"inputMeta":25,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":27},{"inputId":441,"inputMeta":25,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":27},{"inputId":373,"inputMeta":25,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":26},{"inputId":438,"inputMeta":25,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":26},{"inputId":441,"inputMeta":25,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":26},{"inputId":373,"inputMeta":28,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":30},{"inputId":438,"inputMeta":28,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":30},{"inputId":441,"inputMeta":28,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":30},{"inputId":373,"inputMeta":28,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":29},{"inputId":438,"inputMeta":28,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":29},{"inputId":441,"inputMeta":28,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":29},{"inputId":373,"inputMeta":17,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":18},{"inputId":438,"inputMeta":17,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":18},{"inputId":441,"inputMeta":17,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":18},{"inputId":373,"inputMeta":40,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":41},{"inputId":438,"inputMeta":40,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":41},{"inputId":441,"inputMeta":40,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":41},{"inputId":373,"inputMeta":31,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":34},{"inputId":438,"inputMeta":31,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":34},{"inputId":441,"inputMeta":31,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":34},{"inputId":373,"inputMeta":31,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":33},{"inputId":438,"inputMeta":31,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":33},{"inputId":441,"inputMeta":31,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":33},{"inputId":373,"inputMeta":31,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":32},{"inputId":438,"inputMeta":31,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":32},{"inputId":441,"inputMeta":31,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":32},{"inputId":373,"inputMeta":22,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":24},{"inputId":438,"inputMeta":22,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":24},{"inputId":441,"inputMeta":22,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":24},{"inputId":373,"inputMeta":33,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":34},{"inputId":438,"inputMeta":33,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":34},{"inputId":441,"inputMeta":33,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":34},{"inputId":373,"inputMeta":14,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":17},{"inputId":438,"inputMeta":14,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":17},{"inputId":441,"inputMeta":14,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":17},{"inputId":373,"inputMeta":14,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":16},{"inputId":438,"inputMeta":14,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":16},{"inputId":441,"inputMeta":14,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":16},{"inputId":373,"inputMeta":14,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":15},{"inputId":438,"inputMeta":14,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":15},{"inputId":441,"inputMeta":14,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":15},{"inputId":373,"inputMeta":3,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":34},{"inputId":438,"inputMeta":3,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":34},{"inputId":441,"inputMeta":3,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":34},{"inputId":373,"inputMeta":37,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":39},{"inputId":438,"inputMeta":37,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":39},{"inputId":441,"inputMeta":37,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":39},{"inputId":373,"inputMeta":37,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":38},{"inputId":438,"inputMeta":37,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":38},{"inputId":441,"inputMeta":37,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":38},{"inputId":373,"inputMeta":0,"reagentId":377,"reagentMeta":0,"outputId":373,"outputMeta":1},{"inputId":438,"inputMeta":0,"reagentId":377,"reagentMeta":0,"outputId":438,"outputMeta":1},{"inputId":441,"inputMeta":0,"reagentId":377,"reagentMeta":0,"outputId":441,"outputMeta":1},{"inputId":373,"inputMeta":19,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":20},{"inputId":438,"inputMeta":19,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":20},{"inputId":441,"inputMeta":19,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":20},{"inputId":373,"inputMeta":0,"reagentId":376,"reagentMeta":0,"outputId":373,"outputMeta":34},{"inputId":438,"inputMeta":0,"reagentId":376,"reagentMeta":0,"outputId":438,"outputMeta":34},{"inputId":441,"inputMeta":0,"reagentId":376,"reagentMeta":0,"outputId":441,"outputMeta":34},{"inputId":373,"inputMeta":0,"reagentId":370,"reagentMeta":0,"outputId":373,"outputMeta":1},{"inputId":438,"inputMeta":0,"reagentId":370,"reagentMeta":0,"outputId":438,"outputMeta":1},{"inputId":441,"inputMeta":0,"reagentId":370,"reagentMeta":0,"outputId":441,"outputMeta":1},{"inputId":373,"inputMeta":0,"reagentId":348,"reagentMeta":0,"outputId":373,"outputMeta":3},{"inputId":438,"inputMeta":0,"reagentId":348,"reagentMeta":0,"outputId":438,"outputMeta":3},{"inputId":441,"inputMeta":0,"reagentId":348,"reagentMeta":0,"outputId":441,"outputMeta":3},{"inputId":373,"inputMeta":0,"reagentId":378,"reagentMeta":0,"outputId":373,"outputMeta":1},{"inputId":438,"inputMeta":0,"reagentId":378,"reagentMeta":0,"outputId":438,"outputMeta":1},{"inputId":441,"inputMeta":0,"reagentId":378,"reagentMeta":0,"outputId":441,"outputMeta":1},{"inputId":373,"inputMeta":0,"reagentId":372,"reagentMeta":0,"outputId":373,"outputMeta":4},{"inputId":438,"inputMeta":0,"reagentId":372,"reagentMeta":0,"outputId":438,"outputMeta":4},{"inputId":441,"inputMeta":0,"reagentId":372,"reagentMeta":0,"outputId":441,"outputMeta":4},{"inputId":373,"inputMeta":0,"reagentId":414,"reagentMeta":0,"outputId":373,"outputMeta":1},{"inputId":438,"inputMeta":0,"reagentId":414,"reagentMeta":0,"outputId":438,"outputMeta":1},{"inputId":441,"inputMeta":0,"reagentId":414,"reagentMeta":0,"outputId":441,"outputMeta":1},{"inputId":373,"inputMeta":0,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":1},{"inputId":438,"inputMeta":0,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":1},{"inputId":441,"inputMeta":0,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":1},{"inputId":373,"inputMeta":0,"reagentId":382,"reagentMeta":0,"outputId":373,"outputMeta":1},{"inputId":438,"inputMeta":0,"reagentId":382,"reagentMeta":0,"outputId":438,"outputMeta":1},{"inputId":441,"inputMeta":0,"reagentId":382,"reagentMeta":0,"outputId":441,"outputMeta":1},{"inputId":373,"inputMeta":0,"reagentId":375,"reagentMeta":0,"outputId":373,"outputMeta":1},{"inputId":438,"inputMeta":0,"reagentId":375,"reagentMeta":0,"outputId":438,"outputMeta":1},{"inputId":441,"inputMeta":0,"reagentId":375,"reagentMeta":0,"outputId":441,"outputMeta":1},{"inputId":373,"inputMeta":0,"reagentId":353,"reagentMeta":0,"outputId":373,"outputMeta":1},{"inputId":438,"inputMeta":0,"reagentId":353,"reagentMeta":0,"outputId":438,"outputMeta":1},{"inputId":441,"inputMeta":0,"reagentId":353,"reagentMeta":0,"outputId":441,"outputMeta":1},{"inputId":373,"inputMeta":34,"reagentId":331,"reagentMeta":0,"outputId":373,"outputMeta":35},{"inputId":438,"inputMeta":34,"reagentId":331,"reagentMeta":0,"outputId":438,"outputMeta":35},{"inputId":441,"inputMeta":34,"reagentId":331,"reagentMeta":0,"outputId":441,"outputMeta":35}],"containerMixes":[{"inputId":373,"reagentId":289,"outputId":438},{"inputId":438,"reagentId":437,"outputId":441}]} \ No newline at end of file diff --git a/src/main/resources/item_mappings.json b/src/main/resources/item_mappings.json deleted file mode 100644 index 614aa3b58..000000000 --- a/src/main/resources/item_mappings.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "minecraft:banner_pattern": { - "0": "minecraft:creeper_banner_pattern", - "1": "minecraft:skull_banner_pattern", - "2": "minecraft:flower_banner_pattern", - "3": "minecraft:mojang_banner_pattern", - "4": "minecraft:field_masoned_banner_pattern", - "5": "minecraft:bordure_indented_banner_pattern", - "6": "minecraft:piglin_banner_pattern" - }, - "minecraft:boat": { - "0": "minecraft:oak_boat", - "1": "minecraft:spruce_boat", - "2": "minecraft:birch_boat", - "3": "minecraft:jungle_boat", - "4": "minecraft:acacia_boat", - "5": "minecraft:dark_oak_boat" - }, - "minecraft:bucket": { - "0": "minecraft:bucket", - "1": "minecraft:milk_bucket", - "2": "minecraft:cod_bucket", - "3": "minecraft:salmon_bucket", - "4": "minecraft:tropical_fish_bucket", - "5": "minecraft:pufferfish_bucket", - "8": "minecraft:water_bucket", - "10": "minecraft:lava_bucket" - }, - "minecraft:coal": { - "1": "minecraft:charcoal" - }, - "minecraft:dye": { - "0": "minecraft:ink_sac", - "1": "minecraft:red_dye", - "2": "minecraft:green_dye", - "3": "minecraft:cocoa_beans", - "4": "minecraft:lapis_lazuli", - "5": "minecraft:purple_dye", - "6": "minecraft:cyan_dye", - "7": "minecraft:light_gray_dye", - "8": "minecraft:gray_dye", - "9": "minecraft:pink_dye", - "10": "minecraft:lime_dye", - "11": "minecraft:yellow_dye", - "12": "minecraft:light_blue_dye", - "13": "minecraft:magenta_dye", - "14": "minecraft:orange_dye", - "15": "minecraft:bone_meal", - "16": "minecraft:black_dye", - "17": "minecraft:brown_dye", - "18": "minecraft:blue_dye", - "19": "minecraft:white_dye" - }, - "minecraft:spawn_egg": { - "0": "", - "10": "minecraft:chicken_spawn_egg", - "11": "minecraft:cow_spawn_egg", - "12": "minecraft:pig_spawn_egg", - "13": "minecraft:sheep_spawn_egg", - "14": "minecraft:wolf_spawn_egg", - "15": "minecraft:villager_spawn_egg", - "16": "minecraft:mooshroom_spawn_egg", - "17": "minecraft:squid_spawn_egg", - "18": "minecraft:rabbit_spawn_egg", - "19": "minecraft:bat_spawn_egg", - "22": "minecraft:ocelot_spawn_egg", - "23": "minecraft:horse_spawn_egg", - "24": "minecraft:donkey_spawn_egg", - "25": "minecraft:mule_spawn_egg", - "26": "minecraft:skeleton_horse_spawn_egg", - "27": "minecraft:zombie_horse_spawn_egg", - "28": "minecraft:polar_bear_spawn_egg", - "29": "minecraft:llama_spawn_egg", - "30": "minecraft:parrot_spawn_egg", - "31": "minecraft:dolphin_spawn_egg", - "32": "minecraft:zombie_spawn_egg", - "33": "minecraft:creeper_spawn_egg", - "34": "minecraft:skeleton_spawn_egg", - "35": "minecraft:spider_spawn_egg", - "36": "minecraft:zombie_pigman_spawn_egg", - "37": "minecraft:slime_spawn_egg", - "38": "minecraft:enderman_spawn_egg", - "39": "minecraft:silverfish_spawn_egg", - "40": "minecraft:cave_spider_spawn_egg", - "41": "minecraft:ghast_spawn_egg", - "42": "minecraft:magma_cube_spawn_egg", - "43": "minecraft:blaze_spawn_egg", - "44": "minecraft:zombie_villager_spawn_egg", - "45": "minecraft:witch_spawn_egg", - "46": "minecraft:stray_spawn_egg", - "47": "minecraft:husk_spawn_egg", - "48": "minecraft:wither_skeleton_spawn_egg", - "49": "minecraft:guardian_spawn_egg", - "50": "minecraft:elder_guardian_spawn_egg", - "51": "minecraft:npc_spawn_egg", - "54": "minecraft:shulker_spawn_egg", - "55": "minecraft:endermite_spawn_egg", - "56": "minecraft:agent_spawn_egg", - "57": "minecraft:vindicator_spawn_egg", - "58": "minecraft:phantom_spawn_egg", - "59": "minecraft:ravager_spawn_egg", - "74": "minecraft:turtle_spawn_egg", - "75": "minecraft:cat_spawn_egg", - "104": "minecraft:evoker_spawn_egg", - "105": "minecraft:vex_spawn_egg", - "108": "minecraft:pufferfish_spawn_egg", - "109": "minecraft:salmon_spawn_egg", - "110": "minecraft:drowned_spawn_egg", - "111": "minecraft:tropical_fish_spawn_egg", - "112": "minecraft:cod_spawn_egg", - "113": "minecraft:panda_spawn_egg", - "114": "minecraft:pillager_spawn_egg", - "115": "minecraft:villager_spawn_egg", - "116": "minecraft:zombie_villager_spawn_egg", - "118": "minecraft:wandering_trader_spawn_egg", - "121": "minecraft:fox_spawn_egg", - "122": "minecraft:bee_spawn_egg", - "123": "minecraft:piglin_spawn_egg", - "124": "minecraft:hoglin_spawn_egg", - "125": "minecraft:strider_spawn_egg", - "126": "minecraft:zoglin_spawn_egg", - "127": "minecraft:piglin_brute_spawn_egg", - "128": "minecraft:goat_spawn_egg", - "129": "minecraft:glow_squid_spawn_egg", - "130": "minecraft:axolotl_spawn_egg" - } -} \ No newline at end of file diff --git a/src/main/resources/lang/eng/lang.ini b/src/main/resources/lang/eng/lang.ini deleted file mode 100644 index 62051f7a4..000000000 --- a/src/main/resources/lang/eng/lang.ini +++ /dev/null @@ -1,356 +0,0 @@ -language.name=English - -multiplayer.player.joined={%0} joined the game -multiplayer.player.left={%0} left the game - -chat.type.text=<{%0}> {%1} -chat.type.emote=* {%0} {%1} -chat.type.announcement=[{%0}] {%1} -chat.type.admin=[{%0}: {%1}] -chat.type.achievement={%0} has just earned the achievement {%1} - -disconnectionScreen.serverFull=Server is full! -disconnectionScreen.noReason=Disconnected from server -disconnectionScreen.invalidSkin=Invalid skin! -disconnectionScreen.invalidName=Invalid name! -disconnectionScreen.resourcePack=Encountered a problem while downloading or applying resource pack -disconnectionScreen.notAuthenticated=Not authenticated! -disconnectionScreen.loggedinOtherLocation=Already connected - -death.fell.accident.generic={%0} fell from a high place -death.attack.inFire={%0} went up in flames -death.attack.onFire={%0} burned to death -death.attack.lava={%0} tried to swim in lava -death.attack.inWall={%0} suffocated in a wall -death.attack.drown={%0} drowned -death.attack.cactus={%0} was pricked to death -death.attack.generic={%0} died -death.attack.explosion={%0} blew up -death.attack.explosion.player={%0} was blown up by {%1} -death.attack.magic={%0} was killed by magic -death.attack.wither={%0} withered away -death.attack.mob={%0} was slain by {%1} -death.attack.player={%0} was slain by {%1} -death.attack.player.item={%0} was slain by {%1} using {%2} -death.attack.arrow={%0} was shot by {%1} -death.attack.arrow.item={%0} was shot by {%1} using {%2} -death.attack.fall={%0} hit the ground too hard -death.attack.outOfWorld={%0} fell out of the world -death.attack.magma={%0} discovered floor was lava -death.attack.starve={%0} starved to death -death.attack.lightningBolt={%0} was struck by lightning -death.attack.anvil={%0} was squashed by a falling anvil - -gameMode.survival=Survival -gameMode.creative=Creative -gameMode.adventure=Adventure -gameMode.spectator=Spectator -gameMode.changed=Your game mode has been updated - -potion.moveSpeed=Speed -potion.moveSlowdown=Slowness -potion.digSpeed=Haste -potion.digSlowDown=Mining Fatigue -potion.damageBoost=Strength -potion.heal=Instant Health -potion.harm=Instant Damage -potion.jump=Jump Boost -potion.confusion=Nausea -potion.regeneration=Regeneration -potion.resistance=Resistance -potion.fireResistance=Fire Resistance -potion.waterBreathing=Water Breathing -potion.invisibility=Invisibility -potion.blindness=Blindness -potion.nightVision=Night Vision -potion.hunger=Hunger -potion.weakness=Weakness -potion.poison=Poison -potion.wither=Wither -potion.healthBoost=Health Boost -potion.absorption=Absorption -potion.saturation=Saturation -potion.levitation=Levitation -potion.conduitPower=Conduit Power - -commands.generic.exception=An unknown error occurred while attempting to perform this command -commands.generic.permission=You do not have permission to use this command -commands.generic.ingame=You can only perform this command as a player -commands.generic.unknown=Unknown command. Try /help for a list of commands -commands.generic.player.notFound=That player cannot be found -commands.generic.usage=Usage: {%0} - -commands.time.added=Added {%0} to the time -commands.time.set=Set the time to {%0} -commands.time.query=Time is {%0} - -commands.give.item.notFound=There is no such item with name {%0} -commands.give.success=Given {%0} * {%1} to {%2} -commands.give.tagError=Data tag parsing failed: {%0} - -commands.effect.usage=/effect [seconds] [amplifier] [hideParticles] OR /effect clear -commands.effect.notFound=There is no such mob effect with ID {%0} -commands.effect.success=Gave {%0} * {%1} to {%2} for {%3} seconds -commands.effect.success.removed=Took {%0} from {%1} -commands.effect.success.removed.all=Took all effects from {%0} -commands.effect.failure.notActive=Couldn't take {%0} from {%1} as they do not have the effect -commands.effect.failure.notActive.all=Couldn't take any effects from {%0} as they do not have any - -commands.enchant.noItem=The target doesn't hold an item -commands.enchant.notFound=There is no such enchantment with ID {%0} -commands.enchant.success=Enchanting succeeded -commands.enchant.usage=/enchant [level] - -commands.particle.success=Playing effect {%0} for {%1} times - -commands.players.usage=/list -commands.players.list=There are {%0}/{%1} players online: - -commands.kill.successful=Killed {%0} - -commands.banlist.ips=There are {%0} total banned IP addresses: -commands.banlist.players=There are {%0} total banned players: -commands.banlist.usage=/banlist [ips|players] - -commands.defaultgamemode.usage=/defaultgamemode -commands.defaultgamemode.success=The world's default game mode is now {%0} - -commands.op.success=Opped {%0} - -commands.deop.success=De-opped {%0} -commands.deop.usage=/deop - -commands.say.usage=/say - -commands.ban.success=Banned player {%0} -commands.ban.usage=/ban [reason ...] - -commands.unban.success=Unbanned player {%0} -commands.unban.usage=/pardon - -commands.banip.invalid=You have entered an invalid IP address or a player that is not online -commands.banip.offline.invalid=There is no IP address in player data or IP address is invalid -commands.banip.success=Banned IP address {%0} -commands.banip.success.players=Banned IP address {%0} belonging to {%1} -commands.banip.usage=/ban-ip [reason ...] - -commands.unbanip.invalid=You have entered an invalid IP address -commands.unbanip.success=Unbanned IP address {%0} -commands.unbanip.usage=/pardon-ip

- -commands.save.usage=/save-all -commands.save-on.usage=/save-on -commands.save-off.usage=/save-off -commands.save.enabled=Turned on world auto-saving -commands.save.disabled=Turned off world auto-saving -commands.save.start=Saving... -commands.save.success=Saved the world - -commands.stop.usage=/stop -commands.stop.start=Stopping the server - -commands.kick.success=Kicked {%0} from the game -commands.kick.success.reason=Kicked {%0} from the game: '{%1}' -commands.kick.usage=/kick [reason ...] - -commands.tp.success=Teleported {%0} to {%1} -commands.tp.success.coordinates=Teleported {%0} to {%1}, {%2}, {%3} -commands.tp.usage=/tp [target player] OR /tp [target player] [ ] - -commands.whitelist.list=There are {%0} (out of {%1} seen) whitelisted players: -commands.whitelist.enabled=Turned on the whitelist -commands.whitelist.disabled=Turned off the whitelist -commands.whitelist.reloaded=Reloaded the whitelist -commands.whitelist.add.success=Added {%0} to the whitelist -commands.whitelist.add.usage=/whitelist add -commands.whitelist.remove.success=Removed {%0} from the whitelist -commands.whitelist.remove.usage=/whitelist remove -commands.whitelist.usage=/whitelist - -commands.gamemode.success.self=Set own game mode to {%0} -commands.gamemode.success.other=Set {%0}'s game mode to {%1} -commands.gamemode.usage=/gamemode [player] - -commands.help.header=--- Showing help page {%0} of {%1} (/help ) --- -commands.help.usage=/help [page|command name] - -commands.message.usage=/tell -commands.message.sameTarget=You can't send a private message to yourself! - -commands.difficulty.usage=/difficulty -commands.difficulty.success=Set game difficulty to {%0} - -commands.spawnpoint.usage=/spawnpoint [player] [ ] -commands.spawnpoint.success=Set {%0}'s spawn point to ({%1}, {%2}, {%3}) - -commands.setworldspawn.usage=/setworldspawn [ ] -commands.setworldspawn.success=Set the world spawn point to ({%0}, {%1}, {%2}) - -commands.weather.clear=Changing to clear weather -commands.weather.rain=Changing to rainy weather -commands.weather.thunder=Changing to rain and thunder -commands.weather.usage=/weather [duration in seconds] - -commands.xp.success=Given {%0} experience to {%1} -commands.xp.success.levels=Given {%0} levels to {%1} -commands.xp.success.levels.minus=Taken {%0} levels from {%1} -commands.xp.usage=/xp [player] OR /xp L [player] - -commands.playsound.usage=/playsound [player] -commands.playsound.success=Played sound '{%0}' to {%1} - -commands.debug.usage=/debugpaste - -commands.gamerule.success=Game rule {%0} has been updated to {%1} -commands.gamerule.usage=/gamerule [value] - -commands.spawn.usage=/spawn - -commands.seed.success=Seed: {%0} - -nukkit.data.saveError=Could not save player "{%0}": {%1} -nukkit.data.playerCorrupted=Corrupted player data found for {%0} - -nukkit.command.exception=Unhandled exception executing command '{%0}' in {%1}: {%2} - -nukkit.level.notFound=Level "{%0}" not found -nukkit.level.loadError=Could not load level "{%0}": {%1} -nukkit.level.generationError=Could not generate level "{%0}": {%1} -nukkit.level.tickError=Could not tick level "{%0}": {%1} -nukkit.level.chunkUnloadError=Error while unloading a chunk: {%0} -nukkit.level.backgroundGeneration=Spawn terrain for level "{%0}" is being generated in the background -nukkit.level.defaultError=No default level has been loaded -nukkit.level.preparing=Preparing level "{%0}" -nukkit.level.unloading=Unloading level "{%0}" - -nukkit.server.networkError=[Network] Stopped interface {%0} due to {%1} -nukkit.server.networkStart=Opening server on {%0}:{%1} -nukkit.server.startFinished=Done ({%0}s)! For help, type "help" -nukkit.server.rcon.emptyPasswordError=Failed to start RCON: password is empty -nukkit.server.rcon.startupError=Failed to start RCON: {%0} -nukkit.server.rcon.running=RCON is running on {%0}:{%1} - -nukkit.command.plugins.description=Gets a list of plugins running on the server -nukkit.command.plugins.success=Plugins ({%0}): {%1} -nukkit.command.plugins.usage=/plugins - -nukkit.command.reload.description=Reloads the server configuration and plugins -nukkit.command.reload.usage=/reload -nukkit.command.reload.reloading=Reloading server... -nukkit.command.reload.reloaded=Reload completed - -nukkit.command.timings.description=Records timings to see performance of the server. -nukkit.command.timings.usage=/timings -nukkit.command.timings.enable=Enabled timings and reset -nukkit.command.timings.disable=Disabled timings -nukkit.command.timings.timingsDisabled=Please enable timings by typing /timings on -nukkit.command.timings.verboseEnable=Enabled verbose timings -nukkit.command.timings.verboseDisable=Disabled verbose timings -nukkit.command.timings.reset=Timings reset -nukkit.command.timings.rcon=Warning: Timings report done over RCON will cause lag spikes, you should use /timings report in game or console -nukkit.command.timings.uploadStart=Preparing timings report... -nukkit.command.timings.uploadError=Upload Error: {%0}: {%1}, check logs for more information -nukkit.command.timings.reportError=An error happened while pasting the report, check logs for more information -nukkit.command.timings.timingsLocation=View timings report: {%0} -nukkit.command.timings.timingsResponse=Timings response: {%0} -nukkit.command.timings.timingsWrite=Timings written to {%0} - -nukkit.command.title.description=Sends a title to the specified player or modifies title settings for that player -nukkit.command.title.usage=/title OR /title OR /title <player> <times> <fade in time> <stay time> <fade out time> -nukkit.command.title.clear=Successfully cleared {%0}'s screen -nukkit.command.title.reset=Successfully reset title animation settings for {%0} -nukkit.command.title.title=Successfully shown "{%0}" title to {%1} -nukkit.command.title.subtitle=Successfully set subtitle to "{%0}" for {%1}'s next title -nukkit.command.title.actionbar=Successfully shown "{%0}" actionbar title to {%1} -nukkit.command.title.times.success=Successfully set title animation times to {%0}, {%1}, {%2} for {%3} -nukkit.command.title.times.fail=Times of title animations must be numeric values - -nukkit.command.version.description=Gets the version of this server including any plugins in use -nukkit.command.version.usage=/version [plugin name] -nukkit.command.version.noSuchPlugin=This server is not running any plugin by that name. Use /plugins to get a list of plugins. - -nukkit.command.give.usage=/give <player> <item[:damage]> [amount] [tags...] -nukkit.command.kill.usage=/kill [player] -nukkit.command.particle.usage=/particle <name> <x> <y> <z> <xd> <yd> <zd> [count] [data] -nukkit.command.time.usage=/time <set|add> <value> OR /time <start|stop|query> -nukkit.command.transferserver.usage=/transferserver <address> <port> -nukkit.command.summon.usage=/summon <entity> [player] -nukkit.command.world.usage=/world <world> [player] -nukkit.command.generateworld.usage=/genworld <name> <type> <seed> -nukkit.command.seed.usage=/seed -nukkit.command.gc.usage=/gc -nukkit.command.status.usage=/status -nukkit.command.op.usage=/op <player> -nukkit.command.me.usage=/me <action ...> - -nukkit.command.ban.player.description=Prevents the specified player from using this server -nukkit.command.ban.ip.description=Prevents the specified IP address from using this server -nukkit.command.banlist.description=View all players banned from this server -nukkit.command.defaultgamemode.description=Set the default gamemode -nukkit.command.deop.description=Takes the specified player's operator status -nukkit.command.difficulty.description=Sets the game difficulty -nukkit.command.enchant.description=Adds enchantments on items -nukkit.command.effect.description=Adds/Removes effects on players -nukkit.command.gamemode.description=Changes the player to a specific game mode -nukkit.command.help.description=Shows the help menu -nukkit.command.kick.description=Removes the specified player from the server -nukkit.command.list.description=Lists all online players -nukkit.command.me.description=Performs the specified action in chat -nukkit.command.op.description=Gives the specified player operator status -nukkit.command.unban.player.description=Allows the specified player to use this server -nukkit.command.unban.ip.description=Allows the specified IP address to use this server -nukkit.command.save.description=Saves the server to disk -nukkit.command.saveoff.description=Disables server autosaving -nukkit.command.saveon.description=Enables server autosaving -nukkit.command.say.description=Broadcasts the given message as the sender -nukkit.command.setworldspawn.description=Sets a worlds's spawn point. If no coordinates are specified, the player's coordinates will be used. -nukkit.command.spawnpoint.description=Sets a player's spawn point -nukkit.command.stop.description=Stops the server -nukkit.command.tp.description=Teleports the given player (or yourself) to another player or coordinates -nukkit.command.tell.description=Sends a private message to the given player -nukkit.command.weather.description=Sets the weather in current world -nukkit.command.xp.description=Gives the specified player a certain amount of experience -nukkit.command.whitelist.description=Manages the list of players allowed to use this server -nukkit.command.give.description=Gives the specified player a certain amount of items -nukkit.command.kill.description=Commit suicide or kill other players -nukkit.command.particle.description=Adds particles to a world -nukkit.command.time.description=Changes the time in all worlds -nukkit.command.transferserver.description=Transfers you to other server -nukkit.command.summon.description=Summon entity -nukkit.command.world.description=Switch world -nukkit.command.generateworld.description=Generate new world -nukkit.command.seed.description=Show world's seed -nukkit.command.gc.description=Fires garbage collection tasks -nukkit.command.status.description=Reads back the server's performance -nukkit.command.playsound.description=Plays a sound -nukkit.command.debug.description=Paste debug information -nukkit.command.gamerule.description=Sets or queries a game rule value -nukkit.command.spawn.description=Teleport to world's spawnpoint - -nukkit.player.logIn={%0}[/{%1}:{%2}] logged in -nukkit.player.logOut={%0}[/{%1}:{%2}] logged out due to {%3} -nukkit.player.invalidEntity={%0} tried to attack an invalid entity - -nukkit.plugin.load=Loading {%0} -nukkit.plugin.enable=Enabling {%0} -nukkit.plugin.disable=Disabling {%0} -nukkit.plugin.restrictedName=Restricted name -nukkit.plugin.incompatibleAPI=Incompatible API version -nukkit.plugin.unknownDependency=Unknown dependency: -nukkit.plugin.circularDependency=Circular dependency detected -nukkit.plugin.genericLoadError=Could not load plugin '{%0}' -nukkit.plugin.spacesDiscouraged=Plugin '{%0}' uses spaces in its name, this is discouraged -nukkit.plugin.loadError=Could not load plugin '{%0}': {%1} -nukkit.plugin.duplicateError=Could not load plugin '{%0}': plugin exists -nukkit.plugin.fileError=Could not load '{%0}' in folder '{%1}': {%2} -nukkit.plugin.commandError=Could not load command {%0} for plugin {%1} -nukkit.plugin.aliasError=Could not load alias {%0} for plugin {%1} -nukkit.plugin.eventError=Could not pass event '{%0}' to '{%1}': {%2} on {%3} - -nukkit.resources.invalid-path=Resource packs path '{%0}' exists and is not a directory -nukkit.resources.unknown-format=Could not load '{%0}' due to format not recognized -nukkit.resources.fail=Could not load '{%0}': {%1} -nukkit.resources.success=Loaded {%0} resource packs -nukkit.resources.zip.not-found=File '{%0}' is not found -nukkit.resources.zip.no-manifest='manifest.json' is not found -nukkit.resources.zip.invalid-manifest='manifest.json' is invalid or incomplete diff --git a/src/main/resources/legacy_item_ids.json b/src/main/resources/legacy_item_ids.json deleted file mode 100644 index 733f11f4f..000000000 --- a/src/main/resources/legacy_item_ids.json +++ /dev/null @@ -1,810 +0,0 @@ -{ - "minecraft:quartz_bricks": -304, - "minecraft:cracked_nether_bricks": -303, - "minecraft:chiseled_nether_bricks": -302, - "minecraft:stripped_warped_hyphae": -301, - "minecraft:stripped_crimson_hyphae": -300, - "minecraft:crimson_hyphae": -299, - "minecraft:warped_hyphae": -298, - "minecraft:polished_blackstone_wall": -297, - "minecraft:polished_blackstone_button": -296, - "minecraft:polished_blackstone_pressure_plate": -295, - "minecraft:polished_blackstone_double_slab": -294, - "minecraft:polished_blackstone_slab": -293, - "minecraft:polished_blackstone_stairs": -292, - "minecraft:polished_blackstone": -291, - "minecraft:item.soul_campfire": -290, - "minecraft:crying_obsidian": -289, - "minecraft:nether_gold_ore": -288, - "minecraft:twisting_vines": -287, - "minecraft:item.chain": -286, - "minecraft:polished_blackstone_brick_double_slab": -285, - "minecraft:polished_blackstone_brick_slab": -284, - "minecraft:blackstone_double_slab": -283, - "minecraft:blackstone_slab": -282, - "minecraft:gilded_blackstone": -281, - "minecraft:cracked_polished_blackstone_bricks": -280, - "minecraft:chiseled_polished_blackstone": -279, - "minecraft:polished_blackstone_brick_wall": -278, - "minecraft:blackstone_wall": -277, - "minecraft:blackstone_stairs": -276, - "minecraft:polished_blackstone_brick_stairs": -275, - "minecraft:polished_blackstone_bricks": -274, - "minecraft:blackstone": -273, - "minecraft:respawn_anchor": -272, - "minecraft:ancient_debris": -271, - "minecraft:netherite_block": -270, - "minecraft:soul_lantern": -269, - "minecraft:soul_torch": -268, - "minecraft:warped_double_slab": -267, - "minecraft:crimson_double_slab": -266, - "minecraft:warped_slab": -265, - "minecraft:crimson_slab": -264, - "minecraft:warped_pressure_plate": -263, - "minecraft:crimson_pressure_plate": -262, - "minecraft:warped_button": -261, - "minecraft:crimson_button": -260, - "minecraft:warped_fence_gate": -259, - "minecraft:crimson_fence_gate": -258, - "minecraft:warped_fence": -257, - "minecraft:crimson_fence": -256, - "minecraft:warped_stairs": -255, - "minecraft:crimson_stairs": -254, - "minecraft:warped_wall_sign": -253, - "minecraft:crimson_wall_sign": -252, - "minecraft:warped_standing_sign": -251, - "minecraft:crimson_standing_sign": -250, - "minecraft:warped_trapdoor": -247, - "minecraft:crimson_trapdoor": -246, - "minecraft:item.warped_door": -245, - "minecraft:item.crimson_door": -244, - "minecraft:warped_planks": -243, - "minecraft:crimson_planks": -242, - "minecraft:stripped_warped_stem": -241, - "minecraft:stripped_crimson_stem": -240, - "minecraft:target": -239, - "minecraft:item.nether_sprouts": -238, - "minecraft:soul_fire": -237, - "minecraft:soul_soil": -236, - "minecraft:polished_basalt": -235, - "minecraft:basalt": -234, - "minecraft:warped_nylium": -233, - "minecraft:crimson_nylium": -232, - "minecraft:weeping_vines": -231, - "minecraft:shroomlight": -230, - "minecraft:warped_fungus": -229, - "minecraft:crimson_fungus": -228, - "minecraft:warped_wart_block": -227, - "minecraft:warped_stem": -226, - "minecraft:crimson_stem": -225, - "minecraft:warped_roots": -224, - "minecraft:crimson_roots": -223, - "minecraft:lodestone": -222, - "minecraft:honeycomb_block": -221, - "minecraft:honey_block": -220, - "minecraft:beehive": -219, - "minecraft:bee_nest": -218, - "minecraft:stickypistonarmcollision": -217, - "minecraft:wither_rose": -216, - "minecraft:light_block": -215, - "minecraft:lit_blast_furnace": -214, - "minecraft:composter": -213, - "minecraft:wood": -212, - "minecraft:jigsaw": -211, - "minecraft:lava_cauldron": -210, - "minecraft:item.campfire": -209, - "minecraft:lantern": -208, - "minecraft:sweet_berry_bush": -207, - "minecraft:bell": -206, - "minecraft:loom": -204, - "minecraft:barrel": -203, - "minecraft:smithing_table": -202, - "minecraft:fletching_table": -201, - "minecraft:cartography_table": -200, - "minecraft:lit_smoker": -199, - "minecraft:smoker": -198, - "minecraft:stonecutter_block": -197, - "minecraft:blast_furnace": -196, - "minecraft:grindstone": -195, - "minecraft:lectern": -194, - "minecraft:darkoak_wall_sign": -193, - "minecraft:darkoak_standing_sign": -192, - "minecraft:acacia_wall_sign": -191, - "minecraft:acacia_standing_sign": -190, - "minecraft:jungle_wall_sign": -189, - "minecraft:jungle_standing_sign": -188, - "minecraft:birch_wall_sign": -187, - "minecraft:birch_standing_sign": -186, - "minecraft:smooth_quartz_stairs": -185, - "minecraft:red_nether_brick_stairs": -184, - "minecraft:smooth_stone": -183, - "minecraft:spruce_wall_sign": -182, - "minecraft:spruce_standing_sign": -181, - "minecraft:normal_stone_stairs": -180, - "minecraft:mossy_cobblestone_stairs": -179, - "minecraft:end_brick_stairs": -178, - "minecraft:smooth_sandstone_stairs": -177, - "minecraft:smooth_red_sandstone_stairs": -176, - "minecraft:mossy_stone_brick_stairs": -175, - "minecraft:polished_andesite_stairs": -174, - "minecraft:polished_diorite_stairs": -173, - "minecraft:polished_granite_stairs": -172, - "minecraft:andesite_stairs": -171, - "minecraft:diorite_stairs": -170, - "minecraft:granite_stairs": -169, - "minecraft:real_double_stone_slab4": -168, - "minecraft:real_double_stone_slab3": -167, - "minecraft:double_stone_slab4": -166, - "minecraft:scaffolding": -165, - "minecraft:bamboo_sapling": -164, - "minecraft:bamboo": -163, - "minecraft:double_stone_slab3": -162, - "minecraft:barrier": -161, - "minecraft:bubble_column": -160, - "minecraft:turtle_egg": -159, - "minecraft:air": -158, - "minecraft:conduit": -157, - "minecraft:sea_pickle": -156, - "minecraft:carved_pumpkin": -155, - "minecraft:spruce_pressure_plate": -154, - "minecraft:jungle_pressure_plate": -153, - "minecraft:dark_oak_pressure_plate": -152, - "minecraft:birch_pressure_plate": -151, - "minecraft:acacia_pressure_plate": -150, - "minecraft:spruce_trapdoor": -149, - "minecraft:jungle_trapdoor": -148, - "minecraft:dark_oak_trapdoor": -147, - "minecraft:birch_trapdoor": -146, - "minecraft:acacia_trapdoor": -145, - "minecraft:spruce_button": -144, - "minecraft:jungle_button": -143, - "minecraft:dark_oak_button": -142, - "minecraft:birch_button": -141, - "minecraft:acacia_button": -140, - "minecraft:dried_kelp_block": -139, - "minecraft:item.kelp": -138, - "minecraft:coral_fan_hang3": -137, - "minecraft:coral_fan_hang2": -136, - "minecraft:coral_fan_hang": -135, - "minecraft:coral_fan_dead": -134, - "minecraft:coral_fan": -133, - "minecraft:coral_block": -132, - "minecraft:coral": -131, - "minecraft:seagrass": -130, - "minecraft:element_118": -129, - "minecraft:element_117": -128, - "minecraft:element_116": -127, - "minecraft:element_115": -126, - "minecraft:element_114": -125, - "minecraft:element_113": -124, - "minecraft:element_112": -123, - "minecraft:element_111": -122, - "minecraft:element_110": -121, - "minecraft:element_109": -120, - "minecraft:element_108": -119, - "minecraft:element_107": -118, - "minecraft:element_106": -117, - "minecraft:element_105": -116, - "minecraft:element_104": -115, - "minecraft:element_103": -114, - "minecraft:element_102": -113, - "minecraft:element_101": -112, - "minecraft:element_100": -111, - "minecraft:element_99": -110, - "minecraft:element_98": -109, - "minecraft:element_97": -108, - "minecraft:element_96": -107, - "minecraft:element_95": -106, - "minecraft:element_94": -105, - "minecraft:element_93": -104, - "minecraft:element_92": -103, - "minecraft:element_91": -102, - "minecraft:element_90": -101, - "minecraft:element_89": -100, - "minecraft:element_88": -99, - "minecraft:element_87": -98, - "minecraft:element_86": -97, - "minecraft:element_85": -96, - "minecraft:element_84": -95, - "minecraft:element_83": -94, - "minecraft:element_82": -93, - "minecraft:element_81": -92, - "minecraft:element_80": -91, - "minecraft:element_79": -90, - "minecraft:element_78": -89, - "minecraft:element_77": -88, - "minecraft:element_76": -87, - "minecraft:element_75": -86, - "minecraft:element_74": -85, - "minecraft:element_73": -84, - "minecraft:element_72": -83, - "minecraft:element_71": -82, - "minecraft:element_70": -81, - "minecraft:element_69": -80, - "minecraft:element_68": -79, - "minecraft:element_67": -78, - "minecraft:element_66": -77, - "minecraft:element_65": -76, - "minecraft:element_64": -75, - "minecraft:element_63": -74, - "minecraft:element_62": -73, - "minecraft:element_61": -72, - "minecraft:element_60": -71, - "minecraft:element_59": -70, - "minecraft:element_58": -69, - "minecraft:element_57": -68, - "minecraft:element_56": -67, - "minecraft:element_55": -66, - "minecraft:element_54": -65, - "minecraft:element_53": -64, - "minecraft:element_52": -63, - "minecraft:element_51": -62, - "minecraft:element_50": -61, - "minecraft:element_49": -60, - "minecraft:element_48": -59, - "minecraft:element_47": -58, - "minecraft:element_46": -57, - "minecraft:element_45": -56, - "minecraft:element_44": -55, - "minecraft:element_43": -54, - "minecraft:element_42": -53, - "minecraft:element_41": -52, - "minecraft:element_40": -51, - "minecraft:element_39": -50, - "minecraft:element_38": -49, - "minecraft:element_37": -48, - "minecraft:element_36": -47, - "minecraft:element_35": -46, - "minecraft:element_34": -45, - "minecraft:element_33": -44, - "minecraft:element_32": -43, - "minecraft:element_31": -42, - "minecraft:element_30": -41, - "minecraft:element_29": -40, - "minecraft:element_28": -39, - "minecraft:element_27": -38, - "minecraft:element_26": -37, - "minecraft:element_25": -36, - "minecraft:element_24": -35, - "minecraft:element_23": -34, - "minecraft:element_22": -33, - "minecraft:element_21": -32, - "minecraft:element_20": -31, - "minecraft:element_19": -30, - "minecraft:element_18": -29, - "minecraft:element_17": -28, - "minecraft:element_16": -27, - "minecraft:element_15": -26, - "minecraft:element_14": -25, - "minecraft:element_13": -24, - "minecraft:element_12": -23, - "minecraft:element_11": -22, - "minecraft:element_10": -21, - "minecraft:element_9": -20, - "minecraft:element_8": -19, - "minecraft:element_7": -18, - "minecraft:element_6": -17, - "minecraft:element_5": -16, - "minecraft:element_4": -15, - "minecraft:element_3": -14, - "minecraft:element_2": -13, - "minecraft:element_1": -12, - "minecraft:blue_ice": -11, - "minecraft:stripped_oak_log": -10, - "minecraft:stripped_dark_oak_log": -9, - "minecraft:stripped_acacia_log": -8, - "minecraft:stripped_jungle_log": -7, - "minecraft:stripped_birch_log": -6, - "minecraft:stripped_spruce_log": -5, - "minecraft:prismarine_bricks_stairs": -4, - "minecraft:dark_prismarine_stairs": -3, - "minecraft:prismarine_stairs": -2, - "minecraft:stone": 1, - "minecraft:grass": 2, - "minecraft:dirt": 3, - "minecraft:cobblestone": 4, - "minecraft:planks": 5, - "minecraft:sapling": 6, - "minecraft:bedrock": 7, - "minecraft:flowing_water": 8, - "minecraft:water": 9, - "minecraft:flowing_lava": 10, - "minecraft:lava": 11, - "minecraft:sand": 12, - "minecraft:gravel": 13, - "minecraft:gold_ore": 14, - "minecraft:iron_ore": 15, - "minecraft:coal_ore": 16, - "minecraft:log": 17, - "minecraft:leaves": 18, - "minecraft:sponge": 19, - "minecraft:glass": 20, - "minecraft:lapis_ore": 21, - "minecraft:lapis_block": 22, - "minecraft:dispenser": 23, - "minecraft:sandstone": 24, - "minecraft:noteblock": 25, - "minecraft:item.bed": 26, - "minecraft:golden_rail": 27, - "minecraft:detector_rail": 28, - "minecraft:sticky_piston": 29, - "minecraft:web": 30, - "minecraft:tallgrass": 31, - "minecraft:deadbush": 32, - "minecraft:piston": 33, - "minecraft:pistonarmcollision": 34, - "minecraft:wool": 35, - "minecraft:element_0": 36, - "minecraft:yellow_flower": 37, - "minecraft:red_flower": 38, - "minecraft:brown_mushroom": 39, - "minecraft:red_mushroom": 40, - "minecraft:gold_block": 41, - "minecraft:iron_block": 42, - "minecraft:real_double_stone_slab": 43, - "minecraft:double_stone_slab": 44, - "minecraft:brick_block": 45, - "minecraft:tnt": 46, - "minecraft:bookshelf": 47, - "minecraft:mossy_cobblestone": 48, - "minecraft:obsidian": 49, - "minecraft:torch": 50, - "minecraft:fire": 51, - "minecraft:mob_spawner": 52, - "minecraft:oak_stairs": 53, - "minecraft:chest": 54, - "minecraft:redstone_wire": 55, - "minecraft:diamond_ore": 56, - "minecraft:diamond_block": 57, - "minecraft:crafting_table": 58, - "minecraft:item.wheat": 59, - "minecraft:farmland": 60, - "minecraft:furnace": 61, - "minecraft:lit_furnace": 62, - "minecraft:standing_sign": 63, - "minecraft:item.wooden_door": 64, - "minecraft:ladder": 65, - "minecraft:rail": 66, - "minecraft:stone_stairs": 67, - "minecraft:wall_sign": 68, - "minecraft:lever": 69, - "minecraft:stone_pressure_plate": 70, - "minecraft:item.iron_door": 71, - "minecraft:wooden_pressure_plate": 72, - "minecraft:redstone_ore": 73, - "minecraft:lit_redstone_ore": 74, - "minecraft:unlit_redstone_torch": 75, - "minecraft:redstone_torch": 76, - "minecraft:stone_button": 77, - "minecraft:snow_layer": 78, - "minecraft:ice": 79, - "minecraft:snow": 80, - "minecraft:cactus": 81, - "minecraft:clay": 82, - "minecraft:item.reeds": 83, - "minecraft:jukebox": 84, - "minecraft:fence": 85, - "minecraft:pumpkin": 86, - "minecraft:netherrack": 87, - "minecraft:soul_sand": 88, - "minecraft:glowstone": 89, - "minecraft:portal": 90, - "minecraft:lit_pumpkin": 91, - "minecraft:item.cake": 92, - "minecraft:unpowered_repeater": 93, - "minecraft:powered_repeater": 94, - "minecraft:invisiblebedrock": 95, - "minecraft:trapdoor": 96, - "minecraft:monster_egg": 97, - "minecraft:stonebrick": 98, - "minecraft:brown_mushroom_block": 99, - "minecraft:red_mushroom_block": 100, - "minecraft:iron_bars": 101, - "minecraft:glass_pane": 102, - "minecraft:melon_block": 103, - "minecraft:pumpkin_stem": 104, - "minecraft:melon_stem": 105, - "minecraft:vine": 106, - "minecraft:fence_gate": 107, - "minecraft:brick_stairs": 108, - "minecraft:stone_brick_stairs": 109, - "minecraft:mycelium": 110, - "minecraft:waterlily": 111, - "minecraft:nether_brick": 112, - "minecraft:nether_brick_fence": 113, - "minecraft:nether_brick_stairs": 114, - "minecraft:item.nether_wart": 115, - "minecraft:enchanting_table": 116, - "minecraft:brewingstandblock": 117, - "minecraft:item.cauldron": 118, - "minecraft:end_portal": 119, - "minecraft:end_portal_frame": 120, - "minecraft:end_stone": 121, - "minecraft:dragon_egg": 122, - "minecraft:redstone_lamp": 123, - "minecraft:lit_redstone_lamp": 124, - "minecraft:dropper": 125, - "minecraft:activator_rail": 126, - "minecraft:cocoa": 127, - "minecraft:sandstone_stairs": 128, - "minecraft:emerald_ore": 129, - "minecraft:ender_chest": 130, - "minecraft:tripwire_hook": 131, - "minecraft:tripwire": 132, - "minecraft:emerald_block": 133, - "minecraft:spruce_stairs": 134, - "minecraft:birch_stairs": 135, - "minecraft:jungle_stairs": 136, - "minecraft:command_block": 137, - "minecraft:beacon": 138, - "minecraft:cobblestone_wall": 139, - "minecraft:item.flower_pot": 140, - "minecraft:carrots": 141, - "minecraft:potatoes": 142, - "minecraft:wooden_button": 143, - "minecraft:item.skull": 144, - "minecraft:anvil": 145, - "minecraft:trapped_chest": 146, - "minecraft:light_weighted_pressure_plate": 147, - "minecraft:heavy_weighted_pressure_plate": 148, - "minecraft:unpowered_comparator": 149, - "minecraft:powered_comparator": 150, - "minecraft:daylight_detector": 151, - "minecraft:redstone_block": 152, - "minecraft:quartz_ore": 153, - "minecraft:item.hopper": 154, - "minecraft:quartz_block": 155, - "minecraft:quartz_stairs": 156, - "minecraft:double_wooden_slab": 157, - "minecraft:wooden_slab": 158, - "minecraft:stained_hardened_clay": 159, - "minecraft:stained_glass_pane": 160, - "minecraft:leaves2": 161, - "minecraft:log2": 162, - "minecraft:acacia_stairs": 163, - "minecraft:dark_oak_stairs": 164, - "minecraft:slime": 165, - "minecraft:glow_stick": 166, - "minecraft:iron_trapdoor": 167, - "minecraft:prismarine": 168, - "minecraft:sealantern": 169, - "minecraft:hay_block": 170, - "minecraft:carpet": 171, - "minecraft:hardened_clay": 172, - "minecraft:coal_block": 173, - "minecraft:packed_ice": 174, - "minecraft:double_plant": 175, - "minecraft:standing_banner": 176, - "minecraft:wall_banner": 177, - "minecraft:daylight_detector_inverted": 178, - "minecraft:red_sandstone": 179, - "minecraft:red_sandstone_stairs": 180, - "minecraft:real_double_stone_slab2": 181, - "minecraft:double_stone_slab2": 182, - "minecraft:spruce_fence_gate": 183, - "minecraft:birch_fence_gate": 184, - "minecraft:jungle_fence_gate": 185, - "minecraft:dark_oak_fence_gate": 186, - "minecraft:acacia_fence_gate": 187, - "minecraft:repeating_command_block": 188, - "minecraft:chain_command_block": 189, - "minecraft:hard_glass_pane": 190, - "minecraft:hard_stained_glass_pane": 191, - "minecraft:chemical_heat": 192, - "minecraft:item.spruce_door": 193, - "minecraft:item.birch_door": 194, - "minecraft:item.jungle_door": 195, - "minecraft:item.acacia_door": 196, - "minecraft:item.dark_oak_door": 197, - "minecraft:grass_path": 198, - "minecraft:item.frame": 199, - "minecraft:chorus_flower": 200, - "minecraft:purpur_block": 201, - "minecraft:colored_torch_rg": 202, - "minecraft:purpur_stairs": 203, - "minecraft:colored_torch_bp": 204, - "minecraft:undyed_shulker_box": 205, - "minecraft:end_bricks": 206, - "minecraft:frosted_ice": 207, - "minecraft:end_rod": 208, - "minecraft:end_gateway": 209, - "minecraft:allow": 210, - "minecraft:deny": 211, - "minecraft:border_block": 212, - "minecraft:magma": 213, - "minecraft:nether_wart_block": 214, - "minecraft:red_nether_brick": 215, - "minecraft:bone_block": 216, - "minecraft:structure_void": 217, - "minecraft:shulker_box": 218, - "minecraft:purple_glazed_terracotta": 219, - "minecraft:white_glazed_terracotta": 220, - "minecraft:orange_glazed_terracotta": 221, - "minecraft:magenta_glazed_terracotta": 222, - "minecraft:light_blue_glazed_terracotta": 223, - "minecraft:yellow_glazed_terracotta": 224, - "minecraft:lime_glazed_terracotta": 225, - "minecraft:pink_glazed_terracotta": 226, - "minecraft:gray_glazed_terracotta": 227, - "minecraft:silver_glazed_terracotta": 228, - "minecraft:cyan_glazed_terracotta": 229, - "minecraft:blue_glazed_terracotta": 231, - "minecraft:brown_glazed_terracotta": 232, - "minecraft:green_glazed_terracotta": 233, - "minecraft:red_glazed_terracotta": 234, - "minecraft:black_glazed_terracotta": 235, - "minecraft:concrete": 236, - "minecraft:concrete_powder": 237, - "minecraft:chemistry_table": 238, - "minecraft:underwater_torch": 239, - "minecraft:chorus_plant": 240, - "minecraft:stained_glass": 241, - "minecraft:item.camera": 242, - "minecraft:podzol": 243, - "minecraft:item.beetroot": 244, - "minecraft:stonecutter": 245, - "minecraft:glowingobsidian": 246, - "minecraft:netherreactor": 247, - "minecraft:info_update": 248, - "minecraft:info_update2": 249, - "minecraft:movingblock": 250, - "minecraft:observer": 251, - "minecraft:structure_block": 252, - "minecraft:hard_glass": 253, - "minecraft:hard_stained_glass": 254, - "minecraft:reserved6": 255, - "minecraft:iron_shovel": 256, - "minecraft:iron_pickaxe": 257, - "minecraft:iron_axe": 258, - "minecraft:flint_and_steel": 259, - "minecraft:apple": 260, - "minecraft:bow": 261, - "minecraft:arrow": 262, - "minecraft:coal": 263, - "minecraft:diamond": 264, - "minecraft:iron_ingot": 265, - "minecraft:gold_ingot": 266, - "minecraft:iron_sword": 267, - "minecraft:wooden_sword": 268, - "minecraft:wooden_shovel": 269, - "minecraft:wooden_pickaxe": 270, - "minecraft:wooden_axe": 271, - "minecraft:stone_sword": 272, - "minecraft:stone_shovel": 273, - "minecraft:stone_pickaxe": 274, - "minecraft:stone_axe": 275, - "minecraft:diamond_sword": 276, - "minecraft:diamond_shovel": 277, - "minecraft:diamond_pickaxe": 278, - "minecraft:diamond_axe": 279, - "minecraft:stick": 280, - "minecraft:bowl": 281, - "minecraft:mushroom_stew": 282, - "minecraft:golden_sword": 283, - "minecraft:golden_shovel": 284, - "minecraft:golden_pickaxe": 285, - "minecraft:golden_axe": 286, - "minecraft:string": 287, - "minecraft:feather": 288, - "minecraft:gunpowder": 289, - "minecraft:wooden_hoe": 290, - "minecraft:stone_hoe": 291, - "minecraft:iron_hoe": 292, - "minecraft:diamond_hoe": 293, - "minecraft:golden_hoe": 294, - "minecraft:wheat_seeds": 295, - "minecraft:wheat": 296, - "minecraft:bread": 297, - "minecraft:leather_helmet": 298, - "minecraft:leather_chestplate": 299, - "minecraft:leather_leggings": 300, - "minecraft:leather_boots": 301, - "minecraft:chainmail_helmet": 302, - "minecraft:chainmail_chestplate": 303, - "minecraft:chainmail_leggings": 304, - "minecraft:chainmail_boots": 305, - "minecraft:iron_helmet": 306, - "minecraft:iron_chestplate": 307, - "minecraft:iron_leggings": 308, - "minecraft:iron_boots": 309, - "minecraft:diamond_helmet": 310, - "minecraft:diamond_chestplate": 311, - "minecraft:diamond_leggings": 312, - "minecraft:diamond_boots": 313, - "minecraft:golden_helmet": 314, - "minecraft:golden_chestplate": 315, - "minecraft:golden_leggings": 316, - "minecraft:golden_boots": 317, - "minecraft:flint": 318, - "minecraft:porkchop": 319, - "minecraft:cooked_porkchop": 320, - "minecraft:painting": 321, - "minecraft:golden_apple": 322, - "minecraft:wooden_door": 324, - "minecraft:bucket": 325, - "minecraft:minecart": 328, - "minecraft:saddle": 329, - "minecraft:iron_door": 330, - "minecraft:redstone": 331, - "minecraft:snowball": 332, - "minecraft:boat": 333, - "minecraft:leather": 334, - "minecraft:kelp": 335, - "minecraft:brick": 336, - "minecraft:clay_ball": 337, - "minecraft:paper": 339, - "minecraft:book": 340, - "minecraft:slime_ball": 341, - "minecraft:chest_minecart": 342, - "minecraft:egg": 344, - "minecraft:compass": 345, - "minecraft:fishing_rod": 346, - "minecraft:clock": 347, - "minecraft:glowstone_dust": 348, - "minecraft:dye": 351, - "minecraft:bone": 352, - "minecraft:sugar": 353, - "minecraft:cake": 354, - "minecraft:bed": 355, - "minecraft:repeater": 356, - "minecraft:cookie": 357, - "minecraft:shears": 359, - "minecraft:pumpkin_seeds": 361, - "minecraft:melon_seeds": 362, - "minecraft:beef": 363, - "minecraft:cooked_beef": 364, - "minecraft:chicken": 365, - "minecraft:cooked_chicken": 366, - "minecraft:rotten_flesh": 367, - "minecraft:ender_pearl": 368, - "minecraft:blaze_rod": 369, - "minecraft:ghast_tear": 370, - "minecraft:gold_nugget": 371, - "minecraft:nether_wart": 372, - "minecraft:potion": 373, - "minecraft:glass_bottle": 374, - "minecraft:spider_eye": 375, - "minecraft:fermented_spider_eye": 376, - "minecraft:blaze_powder": 377, - "minecraft:magma_cream": 378, - "minecraft:brewing_stand": 379, - "minecraft:cauldron": 380, - "minecraft:ender_eye": 381, - "minecraft:spawn_egg": 383, - "minecraft:experience_bottle": 384, - "minecraft:writable_book": 386, - "minecraft:written_book": 387, - "minecraft:emerald": 388, - "minecraft:frame": 389, - "minecraft:flower_pot": 390, - "minecraft:carrot": 391, - "minecraft:potato": 392, - "minecraft:baked_potato": 393, - "minecraft:poisonous_potato": 394, - "minecraft:golden_carrot": 396, - "minecraft:skull": 397, - "minecraft:pumpkin_pie": 400, - "minecraft:enchanted_book": 403, - "minecraft:comparator": 404, - "minecraft:netherbrick": 405, - "minecraft:quartz": 406, - "minecraft:tnt_minecart": 407, - "minecraft:hopper_minecart": 408, - "minecraft:prismarine_shard": 409, - "minecraft:hopper": 410, - "minecraft:rabbit": 411, - "minecraft:cooked_rabbit": 412, - "minecraft:rabbit_stew": 413, - "minecraft:rabbit_foot": 414, - "minecraft:rabbit_hide": 415, - "minecraft:lead": 420, - "minecraft:name_tag": 421, - "minecraft:prismarine_crystals": 422, - "minecraft:armor_stand": 425, - "minecraft:end_crystal": 426, - "minecraft:spruce_door": 427, - "minecraft:birch_door": 428, - "minecraft:jungle_door": 429, - "minecraft:acacia_door": 430, - "minecraft:dark_oak_door": 431, - "minecraft:chorus_fruit": 432, - "minecraft:banner_pattern": 434, - "minecraft:dragon_breath": 437, - "minecraft:splash_potion": 438, - "minecraft:lingering_potion": 441, - "minecraft:sparkler": 442, - "minecraft:command_block_minecart": 443, - "minecraft:elytra": 444, - "minecraft:shulker_shell": 445, - "minecraft:banner": 446, - "minecraft:medicine": 447, - "minecraft:balloon": 448, - "minecraft:rapid_fertilizer": 449, - "minecraft:bleach": 451, - "minecraft:iron_nugget": 452, - "minecraft:ice_bomb": 453, - "minecraft:trident": 455, - "minecraft:beetroot": 457, - "minecraft:beetroot_seeds": 458, - "minecraft:beetroot_soup": 459, - "minecraft:salmon": 460, - "minecraft:pufferfish": 462, - "minecraft:cooked_salmon": 463, - "minecraft:dried_kelp": 464, - "minecraft:nautilus_shell": 465, - "minecraft:heart_of_the_sea": 467, - "minecraft:turtle_helmet": 469, - "minecraft:phantom_membrane": 470, - "minecraft:crossbow": 471, - "minecraft:spruce_sign": 472, - "minecraft:birch_sign": 473, - "minecraft:jungle_sign": 474, - "minecraft:acacia_sign": 475, - "minecraft:sweet_berries": 477, - "minecraft:camera": 498, - "minecraft:compound": 499, - "minecraft:shield": 513, - "minecraft:campfire": 720, - "minecraft:suspicious_stew": 734, - "minecraft:honeycomb": 736, - "minecraft:honey_bottle": 737, - "minecraft:netherite_ingot": 742, - "minecraft:netherite_sword": 743, - "minecraft:netherite_shovel": 744, - "minecraft:netherite_pickaxe": 745, - "minecraft:netherite_axe": 746, - "minecraft:netherite_hoe": 747, - "minecraft:netherite_helmet": 748, - "minecraft:netherite_chestplate": 749, - "minecraft:netherite_leggings": 750, - "minecraft:netherite_boots": 751, - "minecraft:netherite_scrap": 752, - "minecraft:crimson_sign": 753, - "minecraft:warped_sign": 754, - "minecraft:crimson_door": 755, - "minecraft:warped_door": 756, - "minecraft:warped_fungus_on_a_stick": 757, - "minecraft:chain": 758, - "minecraft:nether_sprouts": 760, - "minecraft:soul_campfire": 801, - "minecraft:enchanted_golden_apple": 466, - "minecraft:carrot_on_a_stick": 398, - "minecraft:popped_chorus_fruit": 433, - "minecraft:tropical_fish": 461, - "minecraft:cooked_cod": 350, - "minecraft:dark_oak_sign": 476, - "minecraft:empty_map": 395, - "minecraft:fire_charge": 385, - "minecraft:firework_rocket": 401, - "minecraft:firework_star": 402, - "minecraft:cod": 349, - "minecraft:diamond_horse_armor": 419, - "minecraft:golden_horse_armor": 418, - "minecraft:iron_horse_armor": 417, - "minecraft:leather_horse_armor": 416, - "minecraft:lodestone_compass": 741, - "minecraft:filled_map": 358, - "minecraft:melon_slice": 360, - "minecraft:cooked_mutton": 424, - "minecraft:mutton": 423, - "minecraft:nether_star": 399, - "minecraft:music_disc_11": 510, - "minecraft:music_disc_13": 500, - "minecraft:music_disc_blocks": 502, - "minecraft:music_disc_cat": 501, - "minecraft:music_disc_chirp": 503, - "minecraft:music_disc_far": 504, - "minecraft:music_disc_mall": 505, - "minecraft:music_disc_mellohi": 506, - "minecraft:music_disc_pigstep": 759, - "minecraft:music_disc_stal": 507, - "minecraft:music_disc_strad": 508, - "minecraft:music_disc_wait": 511, - "minecraft:music_disc_ward": 509, - "minecraft:sugar_cane": 338, - "minecraft:oak_sign": 323, - "minecraft:glistering_melon_slice": 382, - "minecraft:totem_of_undying": 450, - "minecraft:scute": 468, - "minecraft:spyglass": 772 -} \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml deleted file mode 100644 index 851db6943..000000000 --- a/src/main/resources/log4j2.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Configuration status="WARN"> - <Appenders> - <TerminalConsole name="Console"> - <PatternLayout pattern="%cyan{%d{HH:mm:ss}} [%style{%highlight{%-5level}{STYLE=Logback}}] %minecraftFormatting{%msg}%n"/> - </TerminalConsole> - <RollingRandomAccessFile name="File" fileName="logs/server.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz"> - <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level - %msg%n"/> - <Policies> - <TimeBasedTriggeringPolicy/> - <OnStartupTriggeringPolicy/> - </Policies> - </RollingRandomAccessFile> - </Appenders> - <Loggers> - <Root level="INFO"> - <AppenderRef ref="Console"/> - <AppenderRef ref="File"/> - </Root> - </Loggers> -</Configuration> \ No newline at end of file diff --git a/src/main/resources/recipes313.json b/src/main/resources/recipes313.json deleted file mode 100644 index b762a7303..000000000 --- a/src/main/resources/recipes313.json +++ /dev/null @@ -1 +0,0 @@ -{"version":313,"recipes":[{"type":1,"output":[{"id":328}],"shape":["A A","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":53,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":5,"count":4}],"shape":["A"],"input":{"A":{"id":-10,"damage":-1}}},{"type":1,"output":[{"id":5,"count":4}],"shape":["A"],"input":{"A":{"id":17}}},{"type":1,"output":[{"id":214}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":372,"damage":-1}}},{"type":1,"output":[{"id":114,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":112,"damage":-1}}},{"type":1,"output":[{"id":113,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":112,"damage":-1}}},{"type":1,"output":[{"id":112}],"shape":["AA","AA"],"input":{"A":{"id":405,"damage":-1}}},{"type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1}],"output":[{"id":282}]},{"type":0,"input":[{"id":98},{"id":106,"damage":-1}],"output":[{"id":98,"damage":1}]},{"type":1,"output":[{"id":139,"damage":1,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":48,"damage":-1}}},{"type":0,"input":[{"id":4,"damage":-1},{"id":106,"damage":-1}],"output":[{"id":48}]},{"type":1,"output":[{"id":158,"count":6}],"shape":["AAA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":362}],"shape":["A"],"input":{"A":{"id":360,"damage":-1}}},{"type":1,"output":[{"id":103}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":360,"damage":-1}}},{"type":1,"output":[{"id":395}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":339,"damage":-1}}},{"type":0,"input":[{"id":377,"damage":-1},{"id":341,"damage":-1}],"output":[{"id":378}]},{"type":1,"output":[{"id":213}],"shape":["AA","AA"],"input":{"A":{"id":378,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":2,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":13}}},{"type":1,"output":[{"id":160,"damage":2,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":2}}},{"type":1,"output":[{"id":241,"damage":2,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":13}}},{"type":0,"input":[{"id":175,"damage":1}],"output":[{"id":351,"damage":13,"count":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":2,"count":8}]},{"type":1,"output":[{"id":171,"damage":2,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":2}}},{"type":1,"output":[{"id":339,"count":3}],"shape":["AAA"],"input":{"A":{"id":338,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":9}}},{"type":1,"output":[{"id":160,"damage":6,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":6}}},{"type":1,"output":[{"id":241,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":9}}},{"type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":9,"count":2}]},{"type":0,"input":[{"id":38,"damage":7}],"output":[{"id":351,"damage":9}]},{"type":0,"input":[{"id":175,"damage":5}],"output":[{"id":351,"damage":9,"count":2}]},{"type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":9,"count":2}]},{"type":0,"input":[{"id":351,"damage":9},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":6,"count":8}]},{"type":1,"output":[{"id":171,"damage":6,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":6}}},{"type":1,"output":[{"id":446,"damage":9}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":6},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":155,"damage":2,"count":2}],"shape":["A","A"],"input":{"A":{"id":155}}},{"type":1,"output":[{"id":446,"damage":13}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":2},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":174}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":79,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":1,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":14}}},{"type":1,"output":[{"id":160,"damage":1,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":1}}},{"type":1,"output":[{"id":241,"damage":1,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":14}}},{"type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":11}],"output":[{"id":351,"damage":14,"count":2}]},{"type":0,"input":[{"id":38,"damage":5}],"output":[{"id":351,"damage":14}]},{"type":0,"input":[{"id":351,"damage":14},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":1,"count":8}]},{"type":1,"output":[{"id":171,"damage":1,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":1}}},{"type":1,"output":[{"id":446,"damage":14}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":251}],"shape":["AAA","BBC","AAA"],"input":{"A":{"id":4,"damage":-1},"B":{"id":331,"damage":-1},"C":{"id":406,"damage":-1}}},{"type":1,"output":[{"id":333,"damage":4}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":4},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":446,"damage":12}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":3},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":69}],"shape":["A","B"],"input":{"A":{"id":280,"damage":-1},"B":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":300}],"shape":["AAA","A A","A A"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":416}],"shape":["A A","AAA","A A"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":298}],"shape":["AAA","A A"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":299}],"shape":["A A","AAA","AAA"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":301}],"shape":["A A","A A"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":334}],"shape":["AA","AA"],"input":{"A":{"id":415,"damage":-1}}},{"type":1,"output":[{"id":420,"count":2}],"shape":["AA ","AB "," A"],"input":{"A":{"id":287,"damage":-1},"B":{"id":341,"damage":-1}}},{"type":1,"output":[{"id":351,"damage":4,"count":9}],"shape":["A"],"input":{"A":{"id":22,"damage":-1}}},{"type":1,"output":[{"id":22}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":351,"damage":4}}},{"type":1,"output":[{"id":171,"damage":3,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":3}}},{"type":1,"output":[{"id":158,"damage":3,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":136,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":5,"damage":3,"count":4}],"shape":["A"],"input":{"A":{"id":-7,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":3,"count":4}],"shape":["A"],"input":{"A":{"id":17,"damage":3}}},{"type":1,"output":[{"id":185}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":3}}},{"type":1,"output":[{"id":85,"damage":3,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":3},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":429,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":333,"damage":3}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":3},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":389}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":167}],"shape":["AA","AA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":267}],"shape":["A","A","B"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":160,"damage":8,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":8}}},{"type":1,"output":[{"id":395,"damage":2}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":339,"damage":-1},"B":{"id":345,"damage":-1}}},{"type":1,"output":[{"id":91}],"shape":["A","B"],"input":{"A":{"id":-155,"damage":-1},"B":{"id":50,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":5,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":10}}},{"type":1,"output":[{"id":160,"damage":5,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":5}}},{"type":1,"output":[{"id":241,"damage":5,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":10}}},{"type":0,"input":[{"id":351,"damage":2},{"id":351,"damage":19}],"output":[{"id":351,"damage":10,"count":2}]},{"type":0,"input":[{"id":351,"damage":10},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":5,"count":8}]},{"type":1,"output":[{"id":171,"damage":5,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":5}}},{"type":1,"output":[{"id":446,"damage":10}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":5},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":147}],"shape":["AA"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":7}}},{"type":1,"output":[{"id":1,"damage":6,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":1,"damage":5}}},{"type":1,"output":[{"id":241,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":7}}},{"type":0,"input":[{"id":38,"damage":6}],"output":[{"id":351,"damage":7}]},{"type":0,"input":[{"id":351,"damage":7},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":8,"count":8}]},{"type":1,"output":[{"id":171,"damage":8,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":8}}},{"type":1,"output":[{"id":446,"damage":7}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":8},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":3,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":12}}},{"type":1,"output":[{"id":160,"damage":3,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":3}}},{"type":1,"output":[{"id":241,"damage":3,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":12}}},{"type":0,"input":[{"id":38,"damage":1}],"output":[{"id":351,"damage":12}]},{"type":0,"input":[{"id":351,"damage":12},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":3,"count":8}]},{"type":1,"output":[{"id":134,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":98,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":272}],"shape":["A","A","B"],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":67,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":273}],"shape":["A","B","B"],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":70}],"shape":["AA"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":274}],"shape":["AAA"," B "," B "],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":291}],"shape":["AA"," B"," B"],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":77,"damage":5}],"shape":["A"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":275}],"shape":["AA","AB"," B"],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":29,"damage":1}],"shape":["A","B"],"input":{"A":{"id":341,"damage":-1},"B":{"id":33,"damage":-1}}},{"type":1,"output":[{"id":158,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":35}],"shape":["AA","AA"],"input":{"A":{"id":287,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":1,"count":4}],"shape":["A"],"input":{"A":{"id":-5,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":1,"count":4}],"shape":["A"],"input":{"A":{"id":17,"damage":1}}},{"type":1,"output":[{"id":183}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":1}}},{"type":1,"output":[{"id":85,"damage":1,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":427,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":333,"damage":1}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":1},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":382}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":371,"damage":-1},"B":{"id":360,"damage":-1}}},{"type":1,"output":[{"id":78,"count":6}],"shape":["AAA"],"input":{"A":{"id":80,"damage":-1}}},{"type":1,"output":[{"id":80}],"shape":["AA","AA"],"input":{"A":{"id":332,"damage":-1}}},{"type":1,"output":[{"id":24,"damage":2,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":24}}},{"type":1,"output":[{"id":179,"damage":2,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":179}}},{"type":1,"output":[{"id":160,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241}}},{"type":1,"output":[{"id":159,"damage":4,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":11}}},{"type":1,"output":[{"id":160,"damage":4,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":4}}},{"type":1,"output":[{"id":241,"damage":4,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":11}}},{"type":0,"input":[{"id":175}],"output":[{"id":351,"damage":11,"count":2}]},{"type":0,"input":[{"id":37}],"output":[{"id":351,"damage":11}]},{"type":0,"input":[{"id":351,"damage":11},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":4,"count":8}]},{"type":1,"output":[{"id":171,"damage":4,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":4}}},{"type":1,"output":[{"id":446,"damage":11}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":4},"B":{"id":280,"damage":-1}}},{"type":0,"input":[{"id":340,"damage":-1},{"id":351},{"id":288,"damage":-1}],"output":[{"id":386}]},{"type":1,"output":[{"id":324,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":159,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":19}}},{"type":1,"output":[{"id":341,"count":9}],"shape":["A"],"input":{"A":{"id":165,"damage":-1}}},{"type":1,"output":[{"id":241,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":19}}},{"type":0,"input":[{"id":351,"damage":15}],"output":[{"id":351,"damage":19}]},{"type":0,"input":[{"id":351,"damage":19},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"count":8}]},{"type":1,"output":[{"id":171,"count":3}],"shape":["AA"],"input":{"A":{"id":35}}},{"type":1,"output":[{"id":446,"damage":15}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":296,"count":9}],"shape":["A"],"input":{"A":{"id":170,"damage":-1}}},{"type":1,"output":[{"id":469}],"shape":["AAA","A A"],"input":{"A":{"id":468,"damage":-1}}},{"type":0,"input":[{"id":54,"damage":-1},{"id":131,"damage":-1}],"output":[{"id":146}]},{"type":1,"output":[{"id":407}],"shape":["A","B"],"input":{"A":{"id":46},"B":{"id":328,"damage":-1}}},{"type":1,"output":[{"id":353}],"shape":["A"],"input":{"A":{"id":338,"damage":-1}}},{"type":1,"output":[{"id":171,"damage":10,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":10}}},{"type":1,"output":[{"id":66,"count":16}],"shape":["A A","ABA","A A"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":413}],"shape":[" A ","BCD"," E "],"input":{"A":{"id":412,"damage":-1},"B":{"id":391,"damage":-1},"C":{"id":393,"damage":-1},"D":{"id":40,"damage":-1},"E":{"id":281,"damage":-1}}},{"type":1,"output":[{"id":413}],"shape":[" A ","BCD"," E "],"input":{"A":{"id":412,"damage":-1},"B":{"id":391,"damage":-1},"C":{"id":393,"damage":-1},"D":{"id":39,"damage":-1},"E":{"id":281,"damage":-1}}},{"type":1,"output":[{"id":155}],"shape":["AA","AA"],"input":{"A":{"id":406,"damage":-1}}},{"type":1,"output":[{"id":203,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":201,"damage":-1}}},{"type":1,"output":[{"id":201,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":433,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":5}}},{"type":1,"output":[{"id":160,"damage":10,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":10}}},{"type":1,"output":[{"id":241,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":5}}},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1}],"output":[{"id":351,"damage":5,"count":2}]},{"type":0,"input":[{"id":351,"damage":5},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":10,"count":8}]},{"type":1,"output":[{"id":446,"damage":1}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":14},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":446,"damage":5}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":10},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":361,"count":4}],"shape":["A"],"input":{"A":{"id":86,"damage":-1}}},{"type":0,"input":[{"id":86,"damage":-1},{"id":353,"damage":-1},{"id":344,"damage":-1}],"output":[{"id":400}]},{"type":1,"output":[{"id":-3,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":168,"damage":1}}},{"type":1,"output":[{"id":-4,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":168,"damage":2}}},{"type":1,"output":[{"id":-2,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":168}}},{"type":1,"output":[{"id":168,"damage":2}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":409,"damage":-1}}},{"type":1,"output":[{"id":168}],"shape":["AA","AA"],"input":{"A":{"id":409,"damage":-1}}},{"type":1,"output":[{"id":1,"damage":2,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":1,"damage":1}}},{"type":1,"output":[{"id":1,"damage":4,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":1,"damage":3}}},{"type":1,"output":[{"id":159,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":1}}},{"type":1,"output":[{"id":165}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":341,"damage":-1}}},{"type":1,"output":[{"id":205}],"shape":["A","B","A"],"input":{"A":{"id":445,"damage":-1},"B":{"id":54,"damage":-1}}},{"type":1,"output":[{"id":359}],"shape":[" A","A "],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":169}],"shape":["ABA","BBB","ABA"],"input":{"A":{"id":409,"damage":-1},"B":{"id":422,"damage":-1}}},{"type":1,"output":[{"id":-165,"count":6}],"shape":["ABA","A A","A A"],"input":{"A":{"id":-163,"damage":-1},"B":{"id":287,"damage":-1}}},{"type":1,"output":[{"id":24}],"shape":["AA","AA"],"input":{"A":{"id":12}}},{"type":1,"output":[{"id":356}],"shape":["ABA","CCC"],"input":{"A":{"id":76,"damage":-1},"B":{"id":331,"damage":-1},"C":{"id":1}}},{"type":1,"output":[{"id":76}],"shape":["A","B"],"input":{"A":{"id":331,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":123}],"shape":[" A ","ABA"," A "],"input":{"A":{"id":331,"damage":-1},"B":{"id":89,"damage":-1}}},{"type":1,"output":[{"id":152}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":331,"count":9}],"shape":["A"],"input":{"A":{"id":152,"damage":-1}}},{"type":1,"output":[{"id":65,"count":3}],"shape":["A A","AAA","A A"],"input":{"A":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":160,"damage":14,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":14}}},{"type":1,"output":[{"id":241,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":1}}},{"type":1,"output":[{"id":179}],"shape":["AA","AA"],"input":{"A":{"id":12,"damage":1}}},{"type":1,"output":[{"id":215}],"shape":["AB","BA"],"input":{"A":{"id":405,"damage":-1},"B":{"id":372,"damage":-1}}},{"type":0,"input":[{"id":38,"damage":4}],"output":[{"id":351,"damage":1}]},{"type":0,"input":[{"id":175,"damage":4}],"output":[{"id":351,"damage":1,"count":2}]},{"type":0,"input":[{"id":38}],"output":[{"id":351,"damage":1}]},{"type":0,"input":[{"id":457,"damage":-1}],"output":[{"id":351,"damage":1}]},{"type":0,"input":[{"id":351,"damage":1},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":14,"count":8}]},{"type":1,"output":[{"id":171,"damage":14,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":14}}},{"type":1,"output":[{"id":342}],"shape":["A","B"],"input":{"A":{"id":54,"damage":-1},"B":{"id":328,"damage":-1}}},{"type":1,"output":[{"id":471}],"shape":["ABA","CDC"," A "],"input":{"A":{"id":280,"damage":-1},"B":{"id":265,"damage":-1},"C":{"id":287,"damage":-1},"D":{"id":131,"damage":-1}}},{"type":1,"output":[{"id":357,"count":8}],"shape":["ABA"],"input":{"A":{"id":296,"damage":-1},"B":{"id":351,"damage":3}}},{"type":1,"output":[{"id":-157}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":465,"damage":-1},"B":{"id":467,"damage":-1}}},{"type":1,"output":[{"id":345}],"shape":[" A ","ABA"," A "],"input":{"A":{"id":265,"damage":-1},"B":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":404}],"shape":[" A ","ABA","CCC"],"input":{"A":{"id":76,"damage":-1},"B":{"id":406,"damage":-1},"C":{"id":1}}},{"type":0,"input":[{"id":30,"damage":-1}],"output":[{"id":287,"count":9}]},{"type":1,"output":[{"id":139,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":3,"damage":1,"count":4}],"shape":["AB","BA"],"input":{"A":{"id":3},"B":{"id":13,"damage":-1}}},{"type":1,"output":[{"id":173}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":263}}},{"type":1,"output":[{"id":263,"count":9}],"shape":["A"],"input":{"A":{"id":173,"damage":-1}}},{"type":1,"output":[{"id":347}],"shape":[" A ","ABA"," A "],"input":{"A":{"id":266,"damage":-1},"B":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":82}],"shape":["AA","AA"],"input":{"A":{"id":337,"damage":-1}}},{"type":1,"output":[{"id":446,"damage":6}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":9},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":380}],"shape":["A A","A A","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":398}],"shape":["A "," B"],"input":{"A":{"id":346,"damage":-1},"B":{"id":391,"damage":-1}}},{"type":1,"output":[{"id":354},{"id":325,"count":3}],"shape":["AAA","BCB","DDD"],"input":{"A":{"id":325,"damage":1},"B":{"id":353,"damage":-1},"C":{"id":344,"damage":-1},"D":{"id":296,"damage":-1}}},{"type":1,"output":[{"id":325}],"shape":["A A"," A "],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":17}}},{"type":1,"output":[{"id":160,"damage":12,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":12}}},{"type":1,"output":[{"id":241,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":17}}},{"type":0,"input":[{"id":351,"damage":3}],"output":[{"id":351,"damage":17}]},{"type":0,"input":[{"id":351,"damage":17},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":12,"count":8}]},{"type":1,"output":[{"id":171,"damage":12,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":12}}},{"type":1,"output":[{"id":446,"damage":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":12},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":5,"count":4}],"shape":["A"],"input":{"A":{"id":-9,"damage":-1}}},{"type":1,"output":[{"id":312}],"shape":["AAA","A A","A A"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":293}],"shape":["AA"," B"," B"],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":310}],"shape":["AAA","A A"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":311}],"shape":["A A","AAA","AAA"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":313}],"shape":["A A","A A"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":57}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":279}],"shape":["AA","AB"," B"],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":256}],"shape":["A","B","B"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":28,"count":6}],"shape":["A A","ABA","ACA"],"input":{"A":{"id":265,"damage":-1},"B":{"id":70,"damage":-1},"C":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":168,"damage":1}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":409,"damage":-1},"B":{"id":351,"damage":16}}},{"type":1,"output":[{"id":158,"damage":5,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":164,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":108,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":45,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":5,"count":4}],"shape":["A"],"input":{"A":{"id":162,"damage":1}}},{"type":1,"output":[{"id":186}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":5}}},{"type":1,"output":[{"id":85,"damage":5,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":5},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":431,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":333,"damage":5}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":5},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":6}}},{"type":1,"output":[{"id":160,"damage":9,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":9}}},{"type":1,"output":[{"id":241,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":6}}},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":2}],"output":[{"id":351,"damage":6,"count":2}]},{"type":0,"input":[{"id":351,"damage":6},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":9,"count":8}]},{"type":1,"output":[{"id":171,"damage":9,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":9}}},{"type":1,"output":[{"id":262,"count":4}],"shape":["A","B","C"],"input":{"A":{"id":318,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":288,"damage":-1}}},{"type":1,"output":[{"id":446}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":15},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":158,"damage":2,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":135,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":5,"damage":2,"count":4}],"shape":["A"],"input":{"A":{"id":-6,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":2,"count":4}],"shape":["A"],"input":{"A":{"id":17,"damage":2}}},{"type":1,"output":[{"id":184}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":2}}},{"type":1,"output":[{"id":85,"damage":2,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":2},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":428,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":333,"damage":2}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":2},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":459}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":457,"damage":-1},"B":{"id":281,"damage":-1}}},{"type":1,"output":[{"id":138}],"shape":["AAA","ABA","CCC"],"input":{"A":{"id":20,"damage":-1},"B":{"id":399,"damage":-1},"C":{"id":49,"damage":-1}}},{"type":0,"input":[{"id":395,"damage":1},{"id":345,"damage":-1}],"output":[{"id":395,"damage":2}]},{"type":1,"output":[{"id":171,"damage":15,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":15}}},{"type":1,"output":[{"id":425}],"shape":["AAA"," A ","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":44}}},{"type":1,"output":[{"id":145}],"shape":["AAA"," B ","BBB"],"input":{"A":{"id":42,"damage":-1},"B":{"id":265,"damage":-1}}},{"type":0,"input":[{"id":1,"damage":3},{"id":4,"damage":-1}],"output":[{"id":1,"damage":5,"count":2}]},{"type":1,"output":[{"id":126,"count":6}],"shape":["ABA","ACA","ABA"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":76,"damage":-1}}},{"type":1,"output":[{"id":158,"damage":4,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":163,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":5,"damage":4,"count":4}],"shape":["A"],"input":{"A":{"id":-8,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":4,"count":4}],"shape":["A"],"input":{"A":{"id":162}}},{"type":1,"output":[{"id":187}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":4}}},{"type":1,"output":[{"id":85,"damage":4,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":4},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":430,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":241,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":18}}},{"type":1,"output":[{"id":45}],"shape":["AA","AA"],"input":{"A":{"id":336,"damage":-1}}},{"type":1,"output":[{"id":379}],"shape":[" A ","BBB"],"input":{"A":{"id":369,"damage":-1},"B":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":297}],"shape":["AAA"],"input":{"A":{"id":296,"damage":-1}}},{"type":1,"output":[{"id":261}],"shape":[" AB","A B"," AB"],"input":{"A":{"id":280,"damage":-1},"B":{"id":287,"damage":-1}}},{"type":0,"input":[{"id":339},{"id":339},{"id":339},{"id":334}],"output":[{"id":340}]},{"type":0,"input":[{"id":352,"damage":-1}],"output":[{"id":351,"damage":15,"count":3}]},{"type":0,"input":[{"id":216,"damage":-1}],"output":[{"id":351,"damage":15,"count":9}]},{"type":1,"output":[{"id":216}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":351,"damage":15}}},{"type":1,"output":[{"id":333}],"shape":["ABA","AAA"],"input":{"A":{"id":5},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":18}}},{"type":1,"output":[{"id":160,"damage":11,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":11}}},{"type":1,"output":[{"id":264,"count":9}],"shape":["A"],"input":{"A":{"id":57,"damage":-1}}},{"type":1,"output":[{"id":-11}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":174,"damage":-1}}},{"type":0,"input":[{"id":351,"damage":4}],"output":[{"id":351,"damage":18}]},{"type":0,"input":[{"id":351,"damage":18},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":11,"count":8}]},{"type":1,"output":[{"id":171,"damage":11,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":11}}},{"type":1,"output":[{"id":446,"damage":4}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":11},"B":{"id":280,"damage":-1}}},{"type":0,"input":[{"id":369,"damage":-1}],"output":[{"id":377,"count":2}]},{"type":1,"output":[{"id":159,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":16}}},{"type":1,"output":[{"id":160,"damage":15,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":15}}},{"type":1,"output":[{"id":241,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":16}}},{"type":0,"input":[{"id":351}],"output":[{"id":351,"damage":16}]},{"type":0,"input":[{"id":351,"damage":16},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":15,"count":8}]},{"type":1,"output":[{"id":283}],"shape":["A","A","B"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":171,"damage":13,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":13}}},{"type":1,"output":[{"id":446,"damage":2}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":13},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":8}}},{"type":1,"output":[{"id":160,"damage":7,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":7}}},{"type":1,"output":[{"id":241,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":8}}},{"type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":19}],"output":[{"id":351,"damage":8,"count":2}]},{"type":0,"input":[{"id":351,"damage":8},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":7,"count":8}]},{"type":1,"output":[{"id":171,"damage":7,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":7}}},{"type":1,"output":[{"id":446,"damage":8}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":7},"B":{"id":280,"damage":-1}}},{"type":0,"input":[{"id":1,"damage":3},{"id":406,"damage":-1}],"output":[{"id":1,"damage":1}]},{"type":0,"input":[{"id":351,"damage":2},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":13,"count":8}]},{"type":1,"output":[{"id":278}],"shape":["AAA"," B "," B "],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":27,"count":6}],"shape":["A A","ABA","ACA"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":285}],"shape":["AAA"," B "," B "],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":316}],"shape":["AAA","A A","A A"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":294}],"shape":["AA"," B"," B"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":314}],"shape":["AAA","A A"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":315}],"shape":["A A","AAA","AAA"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":396}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":371,"damage":-1},"B":{"id":391,"damage":-1}}},{"type":1,"output":[{"id":317}],"shape":["A A","A A"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":286}],"shape":["AA","AB"," B"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":42}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":257}],"shape":["AAA"," B "," B "],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":452,"count":9}],"shape":["A"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":308}],"shape":["AAA","A A","A A"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":265}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":452,"damage":-1}}},{"type":1,"output":[{"id":265,"count":9}],"shape":["A"],"input":{"A":{"id":42,"damage":-1}}},{"type":1,"output":[{"id":292}],"shape":["AA"," B"," B"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":306}],"shape":["AAA","A A"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":330,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":307}],"shape":["A A","AAA","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":309}],"shape":["A A","A A"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":284}],"shape":["A","B","B"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":101,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":258}],"shape":["AA","AB"," B"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":408}],"shape":["A","B"],"input":{"A":{"id":410,"damage":-1},"B":{"id":328,"damage":-1}}},{"type":1,"output":[{"id":410}],"shape":["A A","ABA"," A "],"input":{"A":{"id":265,"damage":-1},"B":{"id":54,"damage":-1}}},{"type":1,"output":[{"id":148}],"shape":["AA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":170}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":296,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":2}}},{"type":1,"output":[{"id":160,"damage":13,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":13}}},{"type":1,"output":[{"id":241,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":2}}},{"type":1,"output":[{"id":426}],"shape":["AAA","ABA","ACA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":381,"damage":-1},"C":{"id":370,"damage":-1}}},{"type":1,"output":[{"id":89}],"shape":["AA","AA"],"input":{"A":{"id":348,"damage":-1}}},{"type":1,"output":[{"id":102,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":20,"damage":-1}}},{"type":1,"output":[{"id":374,"count":3}],"shape":["A A"," A "],"input":{"A":{"id":20,"damage":-1}}},{"type":1,"output":[{"id":61}],"shape":["AAA","A A","AAA"],"input":{"A":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":390}],"shape":["A A"," A "],"input":{"A":{"id":336,"damage":-1}}},{"type":0,"input":[{"id":265,"damage":-1},{"id":318,"damage":-1}],"output":[{"id":259}]},{"type":1,"output":[{"id":346}],"shape":[" A"," AB","A B"],"input":{"A":{"id":280,"damage":-1},"B":{"id":287,"damage":-1}}},{"type":0,"input":[{"id":375,"damage":-1},{"id":39,"damage":-1},{"id":353,"damage":-1}],"output":[{"id":376}]},{"type":1,"output":[{"id":107}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5}}},{"type":1,"output":[{"id":85,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5},"B":{"id":280,"damage":-1}}},{"type":0,"input":[{"id":368,"damage":-1},{"id":377,"damage":-1}],"output":[{"id":381}]},{"type":1,"output":[{"id":130}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":49,"damage":-1},"B":{"id":381,"damage":-1}}},{"type":1,"output":[{"id":208,"count":4}],"shape":["A","B"],"input":{"A":{"id":369,"damage":-1},"B":{"id":433,"damage":-1}}},{"type":1,"output":[{"id":371,"count":9}],"shape":["A"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":206,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":121,"damage":-1}}},{"type":1,"output":[{"id":116}],"shape":[" A ","BCB","CCC"],"input":{"A":{"id":340,"damage":-1},"B":{"id":264,"damage":-1},"C":{"id":49,"damage":-1}}},{"type":0,"input":[{"id":395},{"id":345,"damage":-1}],"output":[{"id":395,"damage":2}]},{"type":1,"output":[{"id":133}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":388,"damage":-1}}},{"type":1,"output":[{"id":388,"count":9}],"shape":["A"],"input":{"A":{"id":133,"damage":-1}}},{"type":1,"output":[{"id":125,"damage":3}],"shape":["AAA","A A","ABA"],"input":{"A":{"id":4,"damage":-1},"B":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":-139}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":464,"damage":-1}}},{"type":1,"output":[{"id":464,"count":9}],"shape":["A"],"input":{"A":{"id":-139,"damage":-1}}},{"type":1,"output":[{"id":23,"damage":3}],"shape":["AAA","ABA","ACA"],"input":{"A":{"id":4,"damage":-1},"B":{"id":261,"damage":-1},"C":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":1,"damage":3,"count":2}],"shape":["AB","BA"],"input":{"A":{"id":4,"damage":-1},"B":{"id":406,"damage":-1}}},{"type":1,"output":[{"id":276}],"shape":["A","A","B"],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":277}],"shape":["A","B","B"],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":322}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":266,"damage":-1},"B":{"id":260,"damage":-1}}},{"type":1,"output":[{"id":41}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":266}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":371,"damage":-1}}},{"type":1,"output":[{"id":266,"count":9}],"shape":["A"],"input":{"A":{"id":41,"damage":-1}}},{"type":1,"output":[{"id":241,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":15}}},{"type":1,"output":[{"id":159,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":15}}},{"type":0,"input":[{"id":351,"damage":15},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"count":8}]},{"type":0,"input":[{"id":38,"damage":2}],"output":[{"id":351,"damage":13}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1}],"output":[{"id":351,"damage":5,"count":2}]},{"type":0,"input":[{"id":38,"damage":8}],"output":[{"id":351,"damage":7}]},{"type":1,"output":[{"id":168,"damage":1}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":409,"damage":-1},"B":{"id":351}}},{"type":0,"input":[{"id":351,"damage":3},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":12,"count":8}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":2}],"output":[{"id":351,"damage":6,"count":2}]},{"type":0,"input":[{"id":351,"damage":2},{"id":351,"damage":15}],"output":[{"id":351,"damage":10,"count":2}]},{"type":1,"output":[{"id":159,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":4}}},{"type":1,"output":[{"id":241,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":3}}},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":19}],"output":[{"id":351,"damage":12,"count":2}]},{"type":0,"input":[{"id":351},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":15,"count":8}]},{"type":1,"output":[{"id":241,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351}}},{"type":1,"output":[{"id":159,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351}}},{"type":1,"output":[{"id":159,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":3}}},{"type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":15}],"output":[{"id":351,"damage":8,"count":2}]},{"type":1,"output":[{"id":241,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":4}}},{"type":0,"input":[{"id":351,"damage":4},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":11,"count":8}]},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":15}],"output":[{"id":351,"damage":12,"count":2}]},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":3}]},{"type":0,"input":[{"id":38,"damage":3}],"output":[{"id":351,"damage":7}]},{"type":0,"input":[{"id":351},{"id":351,"damage":19}],"output":[{"id":351,"damage":8,"count":2}]},{"type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":19},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":3}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":19}],"output":[{"id":351,"damage":12,"count":2}]},{"type":0,"input":[{"id":351},{"id":351,"damage":15}],"output":[{"id":351,"damage":8,"count":2}]},{"type":0,"input":[{"id":351,"damage":5},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":2}]},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":13,"count":4}]},{"type":0,"input":[{"id":351,"damage":8},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":2}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":15}],"output":[{"id":351,"damage":12,"count":2}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":3}]},{"type":0,"input":[{"id":351},{"id":351,"damage":19},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":3}]},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":13,"count":4}]},{"type":0,"input":[{"id":351,"damage":8},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":2}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":13,"count":4}]},{"type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":15},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":3}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":13,"count":4}]},{"type":0,"input":[{"id":351},{"id":351,"damage":15},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":3}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":1}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":2}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":3}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":4}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":5}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":6}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":7}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":8}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":9}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":10}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":11}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":12}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":13}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":14}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":15}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":1}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":2}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":3}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":4}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":5}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":6}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":7}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":8}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":9}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":10}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":12}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":13}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":14}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":15}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":1}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":2}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":3}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":4}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":5}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":6}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":7}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":8}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":9}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":10}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":11}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":13}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":14}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":15}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":1}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":2}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":3}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":4}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":5}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":6}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":7}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":8}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":9}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":10}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":11}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":12}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":13}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":14}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":1}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":2}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":3}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":4}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":5}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":6}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":7}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":8}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":9}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":10}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":11}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":12}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":13}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":14}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":15}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":2}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":3}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":4}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":5}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":6}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":7}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":8}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":9}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":10}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":11}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":12}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":13}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":14}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":15}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":1}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":3}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":4}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":5}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":6}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":7}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":8}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":9}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":10}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":11}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":12}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":13}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":14}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":15}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":1}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":2}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":4}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":5}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":6}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":7}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":8}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":9}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":10}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":11}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":12}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":13}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":14}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":15}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":1}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":2}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":3}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":5}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":6}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":7}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":8}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":9}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":10}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":11}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":12}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":13}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":14}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":15}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":1}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":2}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":3}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":4}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":6}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":7}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":8}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":9}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":10}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":11}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":12}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":13}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":14}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":15}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":1}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":2}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":3}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":4}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":5}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":7}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":8}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":9}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":10}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":11}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":12}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":13}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":14}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":15}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":1}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":2}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":3}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":4}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":5}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":6}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":8}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":9}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":10}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":11}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":12}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":13}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":14}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":15}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":1}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":2}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":3}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":4}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":5}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":6}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":7}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":9}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":10}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":11}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":12}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":13}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":14}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":15}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":1}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":2}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":3}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":4}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":5}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":6}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":7}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":8}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":10}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":11}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":12}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":13}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":14}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":15}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":1}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":2}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":3}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":4}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":5}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":6}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":7}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":8}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":9}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":11}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":12}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":13}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":14}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":15}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":1}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":2}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":3}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":4}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":5}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":6}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":7}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":8}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":9}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":10}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":12}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":13}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":14}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":15}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":1}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":2}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":3}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":4}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":5}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":6}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":7}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":8}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":9}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":10}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":11}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":13}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":14}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":15}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":1}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":2}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":3}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":4}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":5}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":6}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":7}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":8}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":9}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":10}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":11}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":12}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":14}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":15}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":1}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":2}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":3}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":4}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":5}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":6}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":7}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":8}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":9}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":10}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":11}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":12}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":13}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":15}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351},{"id":35}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":1}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":2}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":3}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":4}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":5}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":6}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":7}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":8}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":9}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":10}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":11}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":12}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":13}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":14}],"output":[{"id":35,"damage":15}]},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":1,"output":[{"id":355}],"shape":["AAA","BBB"],"input":{"A":{"id":35},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":1}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":1},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":2}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":2},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":3}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":3},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":4}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":4},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":5}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":5},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":6}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":6},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":7}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":7},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":8}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":8},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":9}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":9},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":10}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":10},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":11}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":11},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":12}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":12},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":13}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":13},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":14}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":14},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":15}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":15},"B":{"id":5,"damage":-1}}},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":1,"output":[{"id":54}],"shape":["AAA","A A","AAA"],"input":{"A":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":58}],"shape":["AA","AA"],"input":{"A":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":281,"count":4}],"shape":["A A"," A "],"input":{"A":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":151}],"shape":["AAA","BBB","CCC"],"input":{"A":{"id":20,"damage":-1},"B":{"id":406},"C":{"id":158,"damage":-1}}},{"type":1,"output":[{"id":84}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":5,"damage":-1},"B":{"id":264}}},{"type":1,"output":[{"id":25}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":5,"damage":-1},"B":{"id":331}}},{"type":1,"output":[{"id":321}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":280},"B":{"id":35,"damage":-1}}},{"type":1,"output":[{"id":33,"damage":1}],"shape":["AAA","BCB","BDB"],"input":{"A":{"id":5,"damage":-1},"B":{"id":4,"damage":-1},"C":{"id":265},"D":{"id":331}}},{"type":1,"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":280}],"shape":["A","A"],"input":{"A":{"id":-163,"damage":-1}}},{"type":1,"output":[{"id":280,"count":4}],"shape":["A","A"],"input":{"A":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":47}],"shape":["AAA","BBB","AAA"],"input":{"A":{"id":5,"damage":-1},"B":{"id":340}}},{"type":1,"output":[{"id":143,"damage":5}],"shape":["A"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":-140,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":-141,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":-142,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":-143,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":-144,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":131,"count":2}],"shape":["A","B","C"],"input":{"A":{"id":265},"B":{"id":280},"C":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":50,"count":4}],"shape":["A","B"],"input":{"A":{"id":263,"damage":-1},"B":{"id":280}}},{"type":0,"input":[{"id":377},{"id":263},{"id":289}],"output":[{"id":385,"count":3}]},{"type":0,"input":[{"id":377},{"id":263,"damage":1},{"id":289}],"output":[{"id":385,"count":3}]},{"type":1,"output":[{"id":46}],"shape":["ABA","BAB","ABA"],"input":{"A":{"id":289},"B":{"id":12,"damage":-1}}},{"type":1,"output":[{"id":44,"count":6}],"shape":["AAA"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":44,"damage":5,"count":6}],"shape":["AAA"],"input":{"A":{"id":98,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":4,"count":6}],"shape":["AAA"],"input":{"A":{"id":45,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":3,"count":6}],"shape":["AAA"],"input":{"A":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":7,"count":6}],"shape":["AAA"],"input":{"A":{"id":112,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":24,"damage":-1}}},{"type":1,"output":[{"id":182,"count":6}],"shape":["AAA"],"input":{"A":{"id":179,"damage":-1}}},{"type":1,"output":[{"id":182,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":201,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":6,"count":6}],"shape":["AAA"],"input":{"A":{"id":155,"damage":-1}}},{"type":1,"output":[{"id":182,"damage":2,"count":6}],"shape":["AAA"],"input":{"A":{"id":168}}},{"type":1,"output":[{"id":182,"damage":3,"count":6}],"shape":["AAA"],"input":{"A":{"id":168,"damage":1}}},{"type":1,"output":[{"id":182,"damage":4,"count":6}],"shape":["AAA"],"input":{"A":{"id":168,"damage":2}}},{"type":1,"output":[{"id":109,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":98,"damage":-1}}},{"type":1,"output":[{"id":128,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":24,"damage":-1}}},{"type":1,"output":[{"id":180,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":179,"damage":-1}}},{"type":1,"output":[{"id":156,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":155,"damage":-1}}},{"type":1,"output":[{"id":155,"damage":1}],"shape":["A","A"],"input":{"A":{"id":44,"damage":6}}},{"type":1,"output":[{"id":179,"damage":1}],"shape":["A","A"],"input":{"A":{"id":182}}},{"type":1,"output":[{"id":24,"damage":1}],"shape":["A","A"],"input":{"A":{"id":44,"damage":1}}},{"type":1,"output":[{"id":98,"damage":3}],"shape":["A","A"],"input":{"A":{"id":44,"damage":5}}},{"type":1,"output":[{"id":201,"damage":2}],"shape":["A","A"],"input":{"A":{"id":182,"damage":1}}},{"type":0,"input":[{"id":339},{"id":289}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":19}],"output":[{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":18}],"output":[{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":17}],"output":[{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":16}],"output":[{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":15}],"output":[{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":14}],"output":[{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":13}],"output":[{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":12}],"output":[{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":11}],"output":[{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":10}],"output":[{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":9}],"output":[{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":8}],"output":[{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":7}],"output":[{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":6}],"output":[{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":5}],"output":[{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":4}],"output":[{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":3}],"output":[{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":2}],"output":[{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":1}],"output":[{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351}],"output":[{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"}]},{"type":1,"output":[{"id":270}],"shape":["AAA"," B "," B "],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":269}],"shape":["A","B","B"],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":271}],"shape":["AA","AB"," B"],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":290}],"shape":["AA"," B"," B"],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":268}],"shape":["A","A","B"],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":262,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":5}}},{"type":1,"output":[{"id":262,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":6}}},{"type":1,"output":[{"id":262,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":7}}},{"type":1,"output":[{"id":262,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":8}}},{"type":1,"output":[{"id":262,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":9}}},{"type":1,"output":[{"id":262,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":10}}},{"type":1,"output":[{"id":262,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":11}}},{"type":1,"output":[{"id":262,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":12}}},{"type":1,"output":[{"id":262,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":13}}},{"type":1,"output":[{"id":262,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":14}}},{"type":1,"output":[{"id":262,"damage":16,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":15}}},{"type":1,"output":[{"id":262,"damage":17,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":16}}},{"type":1,"output":[{"id":262,"damage":18,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":17}}},{"type":1,"output":[{"id":262,"damage":19,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":18}}},{"type":1,"output":[{"id":262,"damage":20,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":19}}},{"type":1,"output":[{"id":262,"damage":21,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":20}}},{"type":1,"output":[{"id":262,"damage":22,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":21}}},{"type":1,"output":[{"id":262,"damage":23,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":22}}},{"type":1,"output":[{"id":262,"damage":24,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":23}}},{"type":1,"output":[{"id":262,"damage":25,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":24}}},{"type":1,"output":[{"id":262,"damage":26,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":25}}},{"type":1,"output":[{"id":262,"damage":27,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":26}}},{"type":1,"output":[{"id":262,"damage":28,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":27}}},{"type":1,"output":[{"id":262,"damage":29,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":28}}},{"type":1,"output":[{"id":262,"damage":30,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":29}}},{"type":1,"output":[{"id":262,"damage":31,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":30}}},{"type":1,"output":[{"id":262,"damage":32,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":31}}},{"type":1,"output":[{"id":262,"damage":33,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":32}}},{"type":1,"output":[{"id":262,"damage":34,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":33}}},{"type":1,"output":[{"id":262,"damage":35,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":34}}},{"type":1,"output":[{"id":262,"damage":36,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":35}}},{"type":1,"output":[{"id":262,"damage":37,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":36}}},{"type":1,"output":[{"id":262,"damage":38,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":37}}},{"type":1,"output":[{"id":262,"damage":39,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":38}}},{"type":1,"output":[{"id":262,"damage":40,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":39}}},{"type":1,"output":[{"id":262,"damage":41,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":40}}},{"type":1,"output":[{"id":262,"damage":42,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":41}}},{"type":6,"input":[{"id":451},{"id":35,"damage":1}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":1}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":1}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":1}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":2}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":2}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":2}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":2}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":3}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":3}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":3}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":3}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":4}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":4}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":4}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":4}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":5}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":5}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":5}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":5}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":6}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":6}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":6}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":6}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":7}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":7}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":7}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":7}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":8}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":8}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":8}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":8}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":9}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":9}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":9}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":9}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":10}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":10}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":10}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":10}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":11}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":11}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":11}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":11}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":12}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":12}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":12}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":12}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":13}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":13}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":13}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":13}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":14}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":14}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":14}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":14}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":15}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":15}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":15}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":19},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241},{"id":241},{"id":241},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160},{"id":160},{"id":160},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":19},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254},{"id":254},{"id":254},{"id":254},{"id":254},{"id":254}],"output":[{"id":191,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":18},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":11}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":11},{"id":241,"damage":11},{"id":241,"damage":11},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":11,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":11},{"id":160,"damage":11},{"id":160,"damage":11},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":11,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":18},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":11,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":11},{"id":254,"damage":11},{"id":254,"damage":11},{"id":254,"damage":11},{"id":254,"damage":11},{"id":254,"damage":11}],"output":[{"id":191,"damage":11,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":17},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":12}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":12},{"id":241,"damage":12},{"id":241,"damage":12},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":12,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":12},{"id":160,"damage":12},{"id":160,"damage":12},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":12,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":17},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":12,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":12},{"id":254,"damage":12},{"id":254,"damage":12},{"id":254,"damage":12},{"id":254,"damage":12},{"id":254,"damage":12}],"output":[{"id":191,"damage":12,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":16},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":15}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":15},{"id":241,"damage":15},{"id":241,"damage":15},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":15,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":15},{"id":160,"damage":15},{"id":160,"damage":15},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":15,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":16},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":15,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":15},{"id":254,"damage":15},{"id":254,"damage":15},{"id":254,"damage":15},{"id":254,"damage":15},{"id":254,"damage":15}],"output":[{"id":191,"damage":15,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":15},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":15},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":14},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":1}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":1},{"id":241,"damage":1},{"id":241,"damage":1},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":1,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":1},{"id":160,"damage":1},{"id":160,"damage":1},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":1,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":14},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":1,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":1},{"id":254,"damage":1},{"id":254,"damage":1},{"id":254,"damage":1},{"id":254,"damage":1},{"id":254,"damage":1}],"output":[{"id":191,"damage":1,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":2}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":2},{"id":241,"damage":2},{"id":241,"damage":2},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":2,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":2},{"id":160,"damage":2},{"id":160,"damage":2},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":2,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":13},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":2,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":2},{"id":254,"damage":2},{"id":254,"damage":2},{"id":254,"damage":2},{"id":254,"damage":2},{"id":254,"damage":2}],"output":[{"id":191,"damage":2,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":12},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":3},{"id":241,"damage":3},{"id":241,"damage":3},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":3,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":3},{"id":160,"damage":3},{"id":160,"damage":3},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":3,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":12},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":3,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":3},{"id":254,"damage":3},{"id":254,"damage":3},{"id":254,"damage":3},{"id":254,"damage":3},{"id":254,"damage":3}],"output":[{"id":191,"damage":3,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":11},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":4}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":4},{"id":241,"damage":4},{"id":241,"damage":4},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":4,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":4},{"id":160,"damage":4},{"id":160,"damage":4},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":4,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":11},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":4,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":4},{"id":254,"damage":4},{"id":254,"damage":4},{"id":254,"damage":4},{"id":254,"damage":4},{"id":254,"damage":4}],"output":[{"id":191,"damage":4,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":10},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":5}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":5},{"id":241,"damage":5},{"id":241,"damage":5},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":5,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":5},{"id":160,"damage":5},{"id":160,"damage":5},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":5,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":10},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":5,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":5},{"id":254,"damage":5},{"id":254,"damage":5},{"id":254,"damage":5},{"id":254,"damage":5},{"id":254,"damage":5}],"output":[{"id":191,"damage":5,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":9},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":6}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":6},{"id":241,"damage":6},{"id":241,"damage":6},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":6,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":6},{"id":160,"damage":6},{"id":160,"damage":6},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":6,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":9},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":6,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":6},{"id":254,"damage":6},{"id":254,"damage":6},{"id":254,"damage":6},{"id":254,"damage":6},{"id":254,"damage":6}],"output":[{"id":191,"damage":6,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":8},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":7}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":7},{"id":241,"damage":7},{"id":241,"damage":7},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":7,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":7},{"id":160,"damage":7},{"id":160,"damage":7},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":7,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":8},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":7,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":7},{"id":254,"damage":7},{"id":254,"damage":7},{"id":254,"damage":7},{"id":254,"damage":7},{"id":254,"damage":7}],"output":[{"id":191,"damage":7,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":7},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":8},{"id":241,"damage":8},{"id":241,"damage":8},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":8,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":8},{"id":160,"damage":8},{"id":160,"damage":8},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":8,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":7},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":8,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":8},{"id":254,"damage":8},{"id":254,"damage":8},{"id":254,"damage":8},{"id":254,"damage":8},{"id":254,"damage":8}],"output":[{"id":191,"damage":8,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":6},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":9}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":9},{"id":241,"damage":9},{"id":241,"damage":9},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":9,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":9},{"id":160,"damage":9},{"id":160,"damage":9},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":9,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":6},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":9,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":9},{"id":254,"damage":9},{"id":254,"damage":9},{"id":254,"damage":9},{"id":254,"damage":9},{"id":254,"damage":9}],"output":[{"id":191,"damage":9,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":5},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":10}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":10},{"id":241,"damage":10},{"id":241,"damage":10},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":10,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":10},{"id":160,"damage":10},{"id":160,"damage":10},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":10,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":5},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":10,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":10},{"id":254,"damage":10},{"id":254,"damage":10},{"id":254,"damage":10},{"id":254,"damage":10},{"id":254,"damage":10}],"output":[{"id":191,"damage":10,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":4},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":11}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":4},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":11,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":3},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":12}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":3},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":12,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":2},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":13}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":13},{"id":241,"damage":13},{"id":241,"damage":13},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":13,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":13},{"id":160,"damage":13},{"id":160,"damage":13},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":13,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":2},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":13,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":13},{"id":254,"damage":13},{"id":254,"damage":13},{"id":254,"damage":13},{"id":254,"damage":13},{"id":254,"damage":13}],"output":[{"id":191,"damage":13,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":1},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":14}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":14},{"id":241,"damage":14},{"id":241,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":14,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":14},{"id":160,"damage":14},{"id":160,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":14,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":14,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":14},{"id":254,"damage":14},{"id":254,"damage":14},{"id":254,"damage":14},{"id":254,"damage":14},{"id":254,"damage":14}],"output":[{"id":191,"damage":14,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":15}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":15,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":19},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":15}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":18},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":4}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":17},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":15},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":15}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":14},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":14}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":13},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":13}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":12},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":12}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":11},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":11}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":10},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":10}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":9},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":9}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":8},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":7},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":7}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":6},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":6}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":5},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":5}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":4},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":4}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":3},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":2},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":2}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":1},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":1}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":23},{"id":-23},{"id":280}],"output":[{"id":442,"damage":4}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":24},{"id":-23},{"id":280}],"output":[{"id":442,"damage":2}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":25},{"id":-23},{"id":280}],"output":[{"id":442,"damage":14}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":21},{"id":-23},{"id":280}],"output":[{"id":442,"damage":5}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":22},{"id":-23},{"id":280}],"output":[{"id":442,"damage":1}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":-23},{"id":50}],"output":[{"id":239}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":-22},{"id":46}],"output":[{"id":46,"damage":2}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":20},{"id":20},{"id":20},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":253,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":102},{"id":102},{"id":102},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":190,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":253},{"id":253},{"id":253},{"id":253},{"id":253},{"id":253}],"output":[{"id":190,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":499,"damage":22},{"id":50}],"output":[{"id":202}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":499,"damage":24},{"id":50}],"output":[{"id":202,"damage":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":499,"damage":23},{"id":50}],"output":[{"id":204}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":499,"damage":21},{"id":50}],"output":[{"id":204,"damage":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":4,"uuid":"b5c5d105-75a2-4076-af2b-923ea2bf4bf0"},{"type":4,"uuid":"d81aaeaf-e172-4440-9225-868df030d27b"},{"type":4,"uuid":"00000000-0000-0000-0000-000000000002"},{"type":4,"uuid":"85939755-ba10-4d9d-a4cc-efb7a8e943c4"},{"type":4,"uuid":"d392b075-4ba1-40ae-8789-af868d56f6ce"},{"type":4,"uuid":"aecd2294-4b94-434b-8667-4499bb2c9327"},{"type":4,"uuid":"00000000-0000-0000-0000-000000000001"},{"type":4,"uuid":"d1ca6b84-338e-4f2f-9c6b-76cc8b4bd98d"},{"type":2,"inputId":-156,"output":{"id":351,"damage":10}},{"type":2,"inputId":-10,"output":{"id":263,"damage":1}},{"type":2,"inputId":-9,"output":{"id":263,"damage":1}},{"type":2,"inputId":-8,"output":{"id":263,"damage":1}},{"type":2,"inputId":-7,"output":{"id":263,"damage":1}},{"type":2,"inputId":-6,"output":{"id":263,"damage":1}},{"type":2,"inputId":-5,"output":{"id":263,"damage":1}},{"type":2,"inputId":4,"output":{"id":1}},{"type":2,"inputId":12,"output":{"id":20}},{"type":2,"inputId":14,"output":{"id":266}},{"type":2,"inputId":15,"output":{"id":265}},{"type":2,"inputId":16,"output":{"id":263}},{"type":2,"inputId":17,"output":{"id":263,"damage":1}},{"type":2,"inputId":21,"output":{"id":351,"damage":4}},{"type":2,"inputId":56,"output":{"id":264}},{"type":2,"inputId":73,"output":{"id":331}},{"type":2,"inputId":81,"output":{"id":351,"damage":2}},{"type":2,"inputId":82,"output":{"id":172}},{"type":2,"inputId":87,"output":{"id":405}},{"type":2,"inputId":129,"output":{"id":388}},{"type":2,"inputId":153,"output":{"id":406}},{"type":2,"inputId":162,"output":{"id":263,"damage":1}},{"type":2,"inputId":256,"output":{"id":452}},{"type":2,"inputId":257,"output":{"id":452}},{"type":2,"inputId":258,"output":{"id":452}},{"type":2,"inputId":267,"output":{"id":452}},{"type":2,"inputId":283,"output":{"id":371}},{"type":2,"inputId":284,"output":{"id":371}},{"type":2,"inputId":285,"output":{"id":371}},{"type":2,"inputId":286,"output":{"id":371}},{"type":2,"inputId":292,"output":{"id":452}},{"type":2,"inputId":294,"output":{"id":371}},{"type":2,"inputId":302,"output":{"id":452}},{"type":2,"inputId":303,"output":{"id":452}},{"type":2,"inputId":304,"output":{"id":452}},{"type":2,"inputId":305,"output":{"id":452}},{"type":2,"inputId":306,"output":{"id":452}},{"type":2,"inputId":307,"output":{"id":452}},{"type":2,"inputId":308,"output":{"id":452}},{"type":2,"inputId":309,"output":{"id":452}},{"type":2,"inputId":314,"output":{"id":371}},{"type":2,"inputId":315,"output":{"id":371}},{"type":2,"inputId":316,"output":{"id":371}},{"type":2,"inputId":317,"output":{"id":371}},{"type":2,"inputId":319,"output":{"id":320}},{"type":2,"inputId":335,"output":{"id":464}},{"type":2,"inputId":337,"output":{"id":336}},{"type":2,"inputId":349,"output":{"id":350}},{"type":2,"inputId":363,"output":{"id":364}},{"type":2,"inputId":365,"output":{"id":366}},{"type":2,"inputId":392,"output":{"id":393}},{"type":2,"inputId":411,"output":{"id":412}},{"type":2,"inputId":417,"output":{"id":452}},{"type":2,"inputId":418,"output":{"id":371}},{"type":2,"inputId":423,"output":{"id":424}},{"type":2,"inputId":432,"output":{"id":433}},{"type":2,"inputId":460,"output":{"id":463}},{"type":3,"inputId":19,"inputDamage":1,"output":{"id":19}},{"type":3,"inputId":98,"inputDamage":0,"output":{"id":98,"damage":2}},{"type":3,"inputId":159,"inputDamage":0,"output":{"id":220}},{"type":3,"inputId":159,"inputDamage":1,"output":{"id":221}},{"type":3,"inputId":159,"inputDamage":2,"output":{"id":222}},{"type":3,"inputId":159,"inputDamage":3,"output":{"id":223}},{"type":3,"inputId":159,"inputDamage":4,"output":{"id":224}},{"type":3,"inputId":159,"inputDamage":5,"output":{"id":225}},{"type":3,"inputId":159,"inputDamage":6,"output":{"id":226}},{"type":3,"inputId":159,"inputDamage":7,"output":{"id":227}},{"type":3,"inputId":159,"inputDamage":8,"output":{"id":228}},{"type":3,"inputId":159,"inputDamage":9,"output":{"id":229}},{"type":3,"inputId":159,"inputDamage":10,"output":{"id":219}},{"type":3,"inputId":159,"inputDamage":11,"output":{"id":231}},{"type":3,"inputId":159,"inputDamage":12,"output":{"id":232}},{"type":3,"inputId":159,"inputDamage":13,"output":{"id":233}},{"type":3,"inputId":159,"inputDamage":14,"output":{"id":234}},{"type":3,"inputId":159,"inputDamage":15,"output":{"id":235}}]} \ No newline at end of file diff --git a/src/main/resources/recipes332.json b/src/main/resources/recipes332.json deleted file mode 100644 index 08399d206..000000000 --- a/src/main/resources/recipes332.json +++ /dev/null @@ -1 +0,0 @@ -{"version":332,"recipes":[{"type":1,"output":[{"id":5,"count":4}],"shape":["A"],"input":{"A":{"id":-10,"damage":-1}}},{"type":1,"output":[{"id":174}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":79,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":1,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":14}}},{"type":1,"output":[{"id":160,"damage":1,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":1}}},{"type":1,"output":[{"id":241,"damage":1,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":14}}},{"type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":11}],"output":[{"id":351,"damage":14,"count":2}]},{"type":0,"input":[{"id":38,"damage":5}],"output":[{"id":351,"damage":14}]},{"type":0,"input":[{"id":351,"damage":14},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":1,"count":8}]},{"type":1,"output":[{"id":171,"damage":1,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":1}}},{"type":1,"output":[{"id":446,"damage":14}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":251}],"shape":["AAA","BBC","AAA"],"input":{"A":{"id":4,"damage":-1},"B":{"id":331,"damage":-1},"C":{"id":406,"damage":-1}}},{"type":1,"output":[{"id":158,"count":6}],"shape":["AAA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":53,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":339,"count":3}],"shape":["AAA"],"input":{"A":{"id":338,"damage":-1}}},{"type":1,"output":[{"id":5,"count":4}],"shape":["A"],"input":{"A":{"id":17}}},{"type":1,"output":[{"id":214}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":372,"damage":-1}}},{"type":1,"output":[{"id":139,"damage":9,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":112,"damage":-1}}},{"type":1,"output":[{"id":114,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":112,"damage":-1}}},{"type":1,"output":[{"id":113,"count":6}],"shape":["ABA","ABA"],"input":{"A":{"id":112,"damage":-1},"B":{"id":405,"damage":-1}}},{"type":1,"output":[{"id":112}],"shape":["AA","AA"],"input":{"A":{"id":405,"damage":-1}}},{"type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1}],"output":[{"id":282}]},{"type":0,"input":[{"id":98},{"id":106,"damage":-1}],"output":[{"id":98,"damage":1}]},{"type":1,"output":[{"id":139,"damage":8,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":98,"damage":1}}},{"type":1,"output":[{"id":-175,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":98,"damage":1}}},{"type":1,"output":[{"id":139,"damage":1,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":48,"damage":-1}}},{"type":1,"output":[{"id":-179,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":48,"damage":-1}}},{"type":1,"output":[{"id":-174,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":1,"damage":6}}},{"type":1,"output":[{"id":361,"count":4}],"shape":["A"],"input":{"A":{"id":86,"damage":-1}}},{"type":0,"input":[{"id":86,"damage":-1},{"id":353,"damage":-1},{"id":344,"damage":-1}],"output":[{"id":400}]},{"type":1,"output":[{"id":139,"damage":11,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":168}}},{"type":1,"output":[{"id":-3,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":168,"damage":1}}},{"type":1,"output":[{"id":-4,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":168,"damage":2}}},{"type":1,"output":[{"id":-2,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":168}}},{"type":1,"output":[{"id":168,"damage":2}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":409,"damage":-1}}},{"type":1,"output":[{"id":168}],"shape":["AA","AA"],"input":{"A":{"id":409,"damage":-1}}},{"type":1,"output":[{"id":-172,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":1,"damage":2}}},{"type":1,"output":[{"id":1,"damage":2,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":1,"damage":1}}},{"type":1,"output":[{"id":-173,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":1,"damage":4}}},{"type":1,"output":[{"id":1,"damage":4,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":1,"damage":3}}},{"type":0,"input":[{"id":4,"damage":-1},{"id":106,"damage":-1}],"output":[{"id":48}]},{"type":1,"output":[{"id":1,"damage":6,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":1,"damage":5}}},{"type":1,"output":[{"id":159,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":9}}},{"type":1,"output":[{"id":160,"damage":6,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":6}}},{"type":1,"output":[{"id":241,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":9}}},{"type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":9,"count":2}]},{"type":0,"input":[{"id":38,"damage":7}],"output":[{"id":351,"damage":9}]},{"type":0,"input":[{"id":175,"damage":5}],"output":[{"id":351,"damage":9,"count":2}]},{"type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":9,"count":2}]},{"type":0,"input":[{"id":351,"damage":9},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":6,"count":8}]},{"type":1,"output":[{"id":171,"damage":6,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":6}}},{"type":1,"output":[{"id":446,"damage":9}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":6},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":155,"damage":2,"count":2}],"shape":["A","A"],"input":{"A":{"id":155}}},{"type":1,"output":[{"id":300}],"shape":["AAA","A A","A A"],"input":{"A":{"id":334,"damage":-1}}},{"type":0,"input":[{"id":38,"damage":6}],"output":[{"id":351,"damage":7}]},{"type":0,"input":[{"id":351,"damage":7},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":8,"count":8}]},{"type":1,"output":[{"id":171,"damage":8,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":8}}},{"type":1,"output":[{"id":446,"damage":7}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":8},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":3,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":12}}},{"type":1,"output":[{"id":160,"damage":3,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":3}}},{"type":1,"output":[{"id":241,"damage":3,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":12}}},{"type":0,"input":[{"id":38,"damage":1}],"output":[{"id":351,"damage":12}]},{"type":0,"input":[{"id":351,"damage":12},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":3,"count":8}]},{"type":1,"output":[{"id":171,"damage":3,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":3}}},{"type":1,"output":[{"id":446,"damage":12}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":3},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":69}],"shape":["A","B"],"input":{"A":{"id":280,"damage":-1},"B":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":241,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":7}}},{"type":1,"output":[{"id":333,"damage":4}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":4},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":298}],"shape":["AAA","A A"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":299}],"shape":["A A","AAA","AAA"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":301}],"shape":["A A","A A"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":334}],"shape":["AA","AA"],"input":{"A":{"id":415,"damage":-1}}},{"type":1,"output":[{"id":420,"count":2}],"shape":["AA ","AB "," A"],"input":{"A":{"id":287,"damage":-1},"B":{"id":341,"damage":-1}}},{"type":1,"output":[{"id":351,"damage":4,"count":9}],"shape":["A"],"input":{"A":{"id":22,"damage":-1}}},{"type":1,"output":[{"id":22}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":351,"damage":4}}},{"type":1,"output":[{"id":65,"count":3}],"shape":["A A","AAA","A A"],"input":{"A":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":158,"damage":3,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":136,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":5,"damage":3,"count":4}],"shape":["A"],"input":{"A":{"id":-7,"damage":-1}}},{"type":1,"output":[{"id":446,"damage":13}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":2},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":328}],"shape":["A A","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":362}],"shape":["A"],"input":{"A":{"id":360,"damage":-1}}},{"type":1,"output":[{"id":103}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":360,"damage":-1}}},{"type":1,"output":[{"id":395}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":339,"damage":-1}}},{"type":0,"input":[{"id":377,"damage":-1},{"id":341,"damage":-1}],"output":[{"id":378}]},{"type":1,"output":[{"id":213}],"shape":["AA","AA"],"input":{"A":{"id":378,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":2,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":13}}},{"type":1,"output":[{"id":160,"damage":2,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":2}}},{"type":1,"output":[{"id":241,"damage":2,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":13}}},{"type":0,"input":[{"id":175,"damage":1}],"output":[{"id":351,"damage":13,"count":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":2,"count":8}]},{"type":1,"output":[{"id":171,"damage":2,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":2}}},{"type":1,"output":[{"id":446,"damage":5}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":10},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":395,"damage":2}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":339,"damage":-1},"B":{"id":345,"damage":-1}}},{"type":1,"output":[{"id":91}],"shape":["A","B"],"input":{"A":{"id":-155,"damage":-1},"B":{"id":50,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":5,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":10}}},{"type":1,"output":[{"id":160,"damage":5,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":5}}},{"type":1,"output":[{"id":241,"damage":5,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":10}}},{"type":0,"input":[{"id":351,"damage":2},{"id":351,"damage":19}],"output":[{"id":351,"damage":10,"count":2}]},{"type":0,"input":[{"id":351,"damage":10},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":5,"count":8}]},{"type":1,"output":[{"id":171,"damage":5,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":5}}},{"type":1,"output":[{"id":446,"damage":10}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":5},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":147}],"shape":["AA"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":7}}},{"type":1,"output":[{"id":160,"damage":8,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":8}}},{"type":1,"output":[{"id":5,"damage":1,"count":4}],"shape":["A"],"input":{"A":{"id":-5,"damage":-1}}},{"type":1,"output":[{"id":-180,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":273}],"shape":["A","B","B"],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":70}],"shape":["AA"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":274}],"shape":["AAA"," B "," B "],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":291}],"shape":["AA"," B"," B"],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":77,"damage":5}],"shape":["A"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":139,"damage":7,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":98}}},{"type":1,"output":[{"id":109,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":98}}},{"type":1,"output":[{"id":275}],"shape":["AA","AB"," B"],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":29,"damage":1}],"shape":["A","B"],"input":{"A":{"id":341,"damage":-1},"B":{"id":33,"damage":-1}}},{"type":1,"output":[{"id":158,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":134,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":272}],"shape":["A","A","B"],"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":1,"count":4}],"shape":["A"],"input":{"A":{"id":17,"damage":1}}},{"type":1,"output":[{"id":183}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":1}}},{"type":1,"output":[{"id":85,"damage":1,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":427,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":333,"damage":1}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":1},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":382}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":371,"damage":-1},"B":{"id":360,"damage":-1}}},{"type":1,"output":[{"id":78,"count":6}],"shape":["AAA"],"input":{"A":{"id":80,"damage":-1}}},{"type":1,"output":[{"id":80}],"shape":["AA","AA"],"input":{"A":{"id":332,"damage":-1}}},{"type":1,"output":[{"id":-177,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":24,"damage":3}}},{"type":1,"output":[{"id":24,"damage":2,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":24}}},{"type":1,"output":[{"id":-176,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":179,"damage":3}}},{"type":1,"output":[{"id":179,"damage":2,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":179}}},{"type":1,"output":[{"id":241,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":19}}},{"type":1,"output":[{"id":159,"damage":4,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":11}}},{"type":1,"output":[{"id":160,"damage":4,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":4}}},{"type":1,"output":[{"id":241,"damage":4,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":11}}},{"type":0,"input":[{"id":175}],"output":[{"id":351,"damage":11,"count":2}]},{"type":0,"input":[{"id":37}],"output":[{"id":351,"damage":11}]},{"type":0,"input":[{"id":351,"damage":11},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":4,"count":8}]},{"type":1,"output":[{"id":171,"damage":4,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":4}}},{"type":1,"output":[{"id":446,"damage":11}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":4},"B":{"id":280,"damage":-1}}},{"type":0,"input":[{"id":340,"damage":-1},{"id":351},{"id":288,"damage":-1}],"output":[{"id":386}]},{"type":1,"output":[{"id":324,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":159,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":19}}},{"type":1,"output":[{"id":160,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241}}},{"type":1,"output":[{"id":-185,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":155,"damage":3}}},{"type":0,"input":[{"id":38,"damage":10}],"output":[{"id":351,"damage":19}]},{"type":0,"input":[{"id":351,"damage":15}],"output":[{"id":351,"damage":19}]},{"type":0,"input":[{"id":351,"damage":19},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"count":8}]},{"type":1,"output":[{"id":171,"count":3}],"shape":["AA"],"input":{"A":{"id":35}}},{"type":1,"output":[{"id":446,"damage":15}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":296,"count":9}],"shape":["A"],"input":{"A":{"id":170,"damage":-1}}},{"type":1,"output":[{"id":469}],"shape":["AAA","A A"],"input":{"A":{"id":468,"damage":-1}}},{"type":0,"input":[{"id":54,"damage":-1},{"id":131,"damage":-1}],"output":[{"id":146}]},{"type":1,"output":[{"id":407}],"shape":["A","B"],"input":{"A":{"id":46},"B":{"id":328,"damage":-1}}},{"type":1,"output":[{"id":353}],"shape":["A"],"input":{"A":{"id":338,"damage":-1}}},{"type":1,"output":[{"id":35}],"shape":["AA","AA"],"input":{"A":{"id":287,"damage":-1}}},{"type":1,"output":[{"id":98,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":66,"count":16}],"shape":["A A","ABA","A A"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":180,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":179}}},{"type":1,"output":[{"id":179}],"shape":["AA","AA"],"input":{"A":{"id":12,"damage":1}}},{"type":1,"output":[{"id":139,"damage":13,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":215,"damage":-1}}},{"type":1,"output":[{"id":-184,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":215,"damage":-1}}},{"type":1,"output":[{"id":215}],"shape":["AB","BA"],"input":{"A":{"id":405,"damage":-1},"B":{"id":372,"damage":-1}}},{"type":0,"input":[{"id":38,"damage":4}],"output":[{"id":351,"damage":1}]},{"type":0,"input":[{"id":175,"damage":4}],"output":[{"id":351,"damage":1,"count":2}]},{"type":0,"input":[{"id":38}],"output":[{"id":351,"damage":1}]},{"type":0,"input":[{"id":457,"damage":-1}],"output":[{"id":351,"damage":1}]},{"type":0,"input":[{"id":351,"damage":1},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":14,"count":8}]},{"type":1,"output":[{"id":171,"damage":14,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":14}}},{"type":1,"output":[{"id":446,"damage":1}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":14},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":139,"damage":12,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":179}}},{"type":1,"output":[{"id":413}],"shape":[" A ","BCD"," E "],"input":{"A":{"id":412,"damage":-1},"B":{"id":391,"damage":-1},"C":{"id":393,"damage":-1},"D":{"id":40,"damage":-1},"E":{"id":281,"damage":-1}}},{"type":1,"output":[{"id":413}],"shape":[" A ","BCD"," E "],"input":{"A":{"id":412,"damage":-1},"B":{"id":391,"damage":-1},"C":{"id":393,"damage":-1},"D":{"id":39,"damage":-1},"E":{"id":281,"damage":-1}}},{"type":1,"output":[{"id":156,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":155}}},{"type":1,"output":[{"id":155}],"shape":["AA","AA"],"input":{"A":{"id":406,"damage":-1}}},{"type":1,"output":[{"id":203,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":201,"damage":-1}}},{"type":1,"output":[{"id":201,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":433,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":5}}},{"type":1,"output":[{"id":160,"damage":10,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":10}}},{"type":1,"output":[{"id":241,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":5}}},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1}],"output":[{"id":351,"damage":5,"count":2}]},{"type":0,"input":[{"id":351,"damage":5},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":10,"count":8}]},{"type":1,"output":[{"id":171,"damage":10,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":10}}},{"type":1,"output":[{"id":-165,"count":6}],"shape":["ABA","A A","A A"],"input":{"A":{"id":-163,"damage":-1},"B":{"id":287,"damage":-1}}},{"type":1,"output":[{"id":-202}],"shape":["AB "],"input":{"A":{"id":58,"damage":-1},"B":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":341,"count":9}],"shape":["A"],"input":{"A":{"id":165,"damage":-1}}},{"type":1,"output":[{"id":165}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":341,"damage":-1}}},{"type":1,"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":5,"damage":1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":5},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":5,"damage":3},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":5,"damage":5},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":5,"damage":2},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":5,"damage":4},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":205}],"shape":["A","B","A"],"input":{"A":{"id":445,"damage":-1},"B":{"id":54,"damage":-1}}},{"type":1,"output":[{"id":359}],"shape":[" A","A "],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":169}],"shape":["ABA","BBB","ABA"],"input":{"A":{"id":409,"damage":-1},"B":{"id":422,"damage":-1}}},{"type":1,"output":[{"id":416}],"shape":["A A","AAA","A A"],"input":{"A":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":139,"damage":5,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":24}}},{"type":1,"output":[{"id":128,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":24}}},{"type":1,"output":[{"id":24}],"shape":["AA","AA"],"input":{"A":{"id":12}}},{"type":1,"output":[{"id":356}],"shape":["ABA","CCC"],"input":{"A":{"id":76,"damage":-1},"B":{"id":331,"damage":-1},"C":{"id":1}}},{"type":1,"output":[{"id":76}],"shape":["A","B"],"input":{"A":{"id":331,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":123}],"shape":[" A ","ABA"," A "],"input":{"A":{"id":331,"damage":-1},"B":{"id":89,"damage":-1}}},{"type":1,"output":[{"id":152}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":331,"count":9}],"shape":["A"],"input":{"A":{"id":152,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":1}}},{"type":1,"output":[{"id":160,"damage":14,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":14}}},{"type":1,"output":[{"id":241,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":1}}},{"type":1,"output":[{"id":263,"count":9}],"shape":["A"],"input":{"A":{"id":173,"damage":-1}}},{"type":0,"input":[{"id":351,"damage":6},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":9,"count":8}]},{"type":1,"output":[{"id":171,"damage":9,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":9}}},{"type":1,"output":[{"id":446,"damage":6}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":9},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":471}],"shape":["ABA","CDC"," A "],"input":{"A":{"id":280,"damage":-1},"B":{"id":265,"damage":-1},"C":{"id":287,"damage":-1},"D":{"id":131,"damage":-1}}},{"type":1,"output":[{"id":357,"count":8}],"shape":["ABA"],"input":{"A":{"id":296,"damage":-1},"B":{"id":351,"damage":3}}},{"type":1,"output":[{"id":-157}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":465,"damage":-1},"B":{"id":467,"damage":-1}}},{"type":1,"output":[{"id":345}],"shape":[" A ","ABA"," A "],"input":{"A":{"id":265,"damage":-1},"B":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":404}],"shape":[" A ","ABA","CCC"],"input":{"A":{"id":76,"damage":-1},"B":{"id":406,"damage":-1},"C":{"id":1}}},{"type":0,"input":[{"id":30,"damage":-1}],"output":[{"id":287,"count":9}]},{"type":1,"output":[{"id":139,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":67,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":3,"damage":1,"count":4}],"shape":["AB","BA"],"input":{"A":{"id":3},"B":{"id":13,"damage":-1}}},{"type":1,"output":[{"id":173}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":263}}},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":2}],"output":[{"id":351,"damage":6,"count":2}]},{"type":1,"output":[{"id":347}],"shape":[" A ","ABA"," A "],"input":{"A":{"id":266,"damage":-1},"B":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":82}],"shape":["AA","AA"],"input":{"A":{"id":337,"damage":-1}}},{"type":1,"output":[{"id":342}],"shape":["A","B"],"input":{"A":{"id":54,"damage":-1},"B":{"id":328,"damage":-1}}},{"type":1,"output":[{"id":380}],"shape":["A A","A A","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":398}],"shape":["A "," B"],"input":{"A":{"id":346,"damage":-1},"B":{"id":391,"damage":-1}}},{"type":1,"output":[{"id":354},{"id":325,"count":3}],"shape":["AAA","BCB","DDD"],"input":{"A":{"id":325,"damage":1},"B":{"id":353,"damage":-1},"C":{"id":344,"damage":-1},"D":{"id":296,"damage":-1}}},{"type":1,"output":[{"id":325}],"shape":["A A"," A "],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":17}}},{"type":1,"output":[{"id":160,"damage":12,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":12}}},{"type":1,"output":[{"id":241,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":17}}},{"type":0,"input":[{"id":351,"damage":3}],"output":[{"id":351,"damage":17}]},{"type":0,"input":[{"id":351,"damage":17},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":12,"count":8}]},{"type":1,"output":[{"id":171,"damage":12,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":12}}},{"type":1,"output":[{"id":28,"count":6}],"shape":["A A","ABA","ACA"],"input":{"A":{"id":265,"damage":-1},"B":{"id":70,"damage":-1},"C":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":-170,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":1,"damage":3}}},{"type":1,"output":[{"id":1,"damage":3,"count":2}],"shape":["AB","BA"],"input":{"A":{"id":4,"damage":-1},"B":{"id":406,"damage":-1}}},{"type":1,"output":[{"id":276}],"shape":["A","A","B"],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":277}],"shape":["A","B","B"],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":278}],"shape":["AAA"," B "," B "],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":312}],"shape":["AAA","A A","A A"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":293}],"shape":["AA"," B"," B"],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":3,"count":4}],"shape":["A"],"input":{"A":{"id":17,"damage":3}}},{"type":1,"output":[{"id":311}],"shape":["A A","AAA","AAA"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":313}],"shape":["A A","A A"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":57}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":279}],"shape":["AA","AB"," B"],"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":264,"count":9}],"shape":["A"],"input":{"A":{"id":57,"damage":-1}}},{"type":1,"output":[{"id":446,"damage":3}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":12},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":168,"damage":1}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":409,"damage":-1},"B":{"id":351,"damage":16}}},{"type":1,"output":[{"id":158,"damage":5,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":164,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":5,"damage":5,"count":4}],"shape":["A"],"input":{"A":{"id":-9,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":5,"count":4}],"shape":["A"],"input":{"A":{"id":162,"damage":1}}},{"type":1,"output":[{"id":186}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":5}}},{"type":1,"output":[{"id":85,"damage":5,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":5},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":431,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":333,"damage":5}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":5},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":6}}},{"type":1,"output":[{"id":160,"damage":9,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":9}}},{"type":1,"output":[{"id":241,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":6}}},{"type":1,"output":[{"id":425}],"shape":["AAA"," A ","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":44}}},{"type":1,"output":[{"id":446}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":15},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":158,"damage":2,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":135,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":5,"damage":2,"count":4}],"shape":["A"],"input":{"A":{"id":-6,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":2,"count":4}],"shape":["A"],"input":{"A":{"id":17,"damage":2}}},{"type":1,"output":[{"id":184}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":2}}},{"type":1,"output":[{"id":85,"damage":2,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":2},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":428,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":333,"damage":2}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":2},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":459}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":457,"damage":-1},"B":{"id":281,"damage":-1}}},{"type":1,"output":[{"id":138}],"shape":["AAA","ABA","CCC"],"input":{"A":{"id":20,"damage":-1},"B":{"id":399,"damage":-1},"C":{"id":49,"damage":-1}}},{"type":0,"input":[{"id":395,"damage":1},{"id":345,"damage":-1}],"output":[{"id":395,"damage":2}]},{"type":1,"output":[{"id":262,"count":4}],"shape":["A","B","C"],"input":{"A":{"id":318,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":288,"damage":-1}}},{"type":1,"output":[{"id":171,"damage":15,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":15}}},{"type":1,"output":[{"id":145}],"shape":["AAA"," B ","BBB"],"input":{"A":{"id":42,"damage":-1},"B":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":139,"damage":4,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":1,"damage":5}}},{"type":1,"output":[{"id":-171,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":1,"damage":5}}},{"type":0,"input":[{"id":1,"damage":3},{"id":4,"damage":-1}],"output":[{"id":1,"damage":5,"count":2}]},{"type":1,"output":[{"id":126,"count":6}],"shape":["ABA","ACA","ABA"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":76,"damage":-1}}},{"type":1,"output":[{"id":158,"damage":4,"count":6}],"shape":["AAA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":163,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":5,"damage":4,"count":4}],"shape":["A"],"input":{"A":{"id":-8,"damage":-1}}},{"type":1,"output":[{"id":5,"damage":4,"count":4}],"shape":["A"],"input":{"A":{"id":162}}},{"type":1,"output":[{"id":187}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":4}}},{"type":1,"output":[{"id":85,"damage":4,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":4},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":430,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":241,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":18}}},{"type":1,"output":[{"id":139,"damage":6,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":45,"damage":-1}}},{"type":1,"output":[{"id":108,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":45,"damage":-1}}},{"type":1,"output":[{"id":45}],"shape":["AA","AA"],"input":{"A":{"id":336,"damage":-1}}},{"type":1,"output":[{"id":379}],"shape":[" A ","BBB"],"input":{"A":{"id":369,"damage":-1},"B":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":297}],"shape":["AAA"],"input":{"A":{"id":296,"damage":-1}}},{"type":1,"output":[{"id":261}],"shape":[" AB","A B"," AB"],"input":{"A":{"id":280,"damage":-1},"B":{"id":287,"damage":-1}}},{"type":0,"input":[{"id":339},{"id":339},{"id":339},{"id":334}],"output":[{"id":340}]},{"type":0,"input":[{"id":352,"damage":-1}],"output":[{"id":351,"damage":15,"count":3}]},{"type":0,"input":[{"id":216,"damage":-1}],"output":[{"id":351,"damage":15,"count":9}]},{"type":1,"output":[{"id":216}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":351,"damage":15}}},{"type":1,"output":[{"id":333}],"shape":["ABA","AAA"],"input":{"A":{"id":5},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":18}}},{"type":1,"output":[{"id":160,"damage":11,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":11}}},{"type":1,"output":[{"id":310}],"shape":["AAA","A A"],"input":{"A":{"id":264,"damage":-1}}},{"type":1,"output":[{"id":-11}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":174,"damage":-1}}},{"type":0,"input":[{"id":351,"damage":4}],"output":[{"id":351,"damage":18}]},{"type":0,"input":[{"id":38,"damage":9}],"output":[{"id":351,"damage":18}]},{"type":0,"input":[{"id":351,"damage":18},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":11,"count":8}]},{"type":1,"output":[{"id":171,"damage":11,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":11}}},{"type":1,"output":[{"id":446,"damage":4}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":11},"B":{"id":280,"damage":-1}}},{"type":0,"input":[{"id":369,"damage":-1}],"output":[{"id":377,"count":2}]},{"type":1,"output":[{"id":159,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":16}}},{"type":1,"output":[{"id":160,"damage":15,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":15}}},{"type":1,"output":[{"id":241,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":16}}},{"type":0,"input":[{"id":351}],"output":[{"id":351,"damage":16}]},{"type":0,"input":[{"id":351,"damage":16},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":15,"count":8}]},{"type":1,"output":[{"id":160,"damage":7,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":7}}},{"type":1,"output":[{"id":410}],"shape":["A A","ABA"," A "],"input":{"A":{"id":265,"damage":-1},"B":{"id":54,"damage":-1}}},{"type":1,"output":[{"id":148}],"shape":["AA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":170}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":296,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":2}}},{"type":1,"output":[{"id":160,"damage":13,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":241,"damage":13}}},{"type":1,"output":[{"id":241,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":2}}},{"type":0,"input":[{"id":351,"damage":2},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":13,"count":8}]},{"type":1,"output":[{"id":171,"damage":13,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":13}}},{"type":1,"output":[{"id":446,"damage":2}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":13},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":159,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":8}}},{"type":1,"output":[{"id":408}],"shape":["A","B"],"input":{"A":{"id":410,"damage":-1},"B":{"id":328,"damage":-1}}},{"type":1,"output":[{"id":241,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":8}}},{"type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":19}],"output":[{"id":351,"damage":8,"count":2}]},{"type":0,"input":[{"id":351,"damage":8},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":7,"count":8}]},{"type":1,"output":[{"id":139,"damage":3,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":1,"damage":3}}},{"type":1,"output":[{"id":446,"damage":8}],"shape":["AAA","AAA"," B "],"input":{"A":{"id":35,"damage":7},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":139,"damage":2,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":1,"damage":1}}},{"type":1,"output":[{"id":-169,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":1,"damage":1}}},{"type":0,"input":[{"id":1,"damage":3},{"id":406,"damage":-1}],"output":[{"id":1,"damage":1}]},{"type":1,"output":[{"id":283}],"shape":["A","A","B"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":284}],"shape":["A","B","B"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":308}],"shape":["AAA","A A","A A"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":185}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":3}}},{"type":1,"output":[{"id":85,"damage":3,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5,"damage":3},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":429,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":333,"damage":3}],"shape":["ABA","AAA"],"input":{"A":{"id":5,"damage":3},"B":{"id":269,"damage":-1}}},{"type":1,"output":[{"id":389}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":334,"damage":-1}}},{"type":1,"output":[{"id":167}],"shape":["AA","AA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":267}],"shape":["A","A","B"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":256}],"shape":["A","B","B"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":257}],"shape":["AAA"," B "," B "],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":452,"count":9}],"shape":["A"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":171,"damage":7,"count":3}],"shape":["AA"],"input":{"A":{"id":35,"damage":7}}},{"type":1,"output":[{"id":265}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":452,"damage":-1}}},{"type":1,"output":[{"id":265,"count":9}],"shape":["A"],"input":{"A":{"id":42,"damage":-1}}},{"type":1,"output":[{"id":292}],"shape":["AA"," B"," B"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":306}],"shape":["AAA","A A"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":330,"count":3}],"shape":["AA","AA","AA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":307}],"shape":["A A","AAA","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":309}],"shape":["A A","A A"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":42}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":101,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":265,"damage":-1}}},{"type":1,"output":[{"id":258}],"shape":["AA","AB"," B"],"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":130}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":49,"damage":-1},"B":{"id":381,"damage":-1}}},{"type":1,"output":[{"id":41}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":89}],"shape":["AA","AA"],"input":{"A":{"id":348,"damage":-1}}},{"type":1,"output":[{"id":102,"count":16}],"shape":["AAA","AAA"],"input":{"A":{"id":20,"damage":-1}}},{"type":1,"output":[{"id":374,"count":3}],"shape":["A A"," A "],"input":{"A":{"id":20,"damage":-1}}},{"type":1,"output":[{"id":61}],"shape":["AAA","A A","AAA"],"input":{"A":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":390}],"shape":["A A"," A "],"input":{"A":{"id":336,"damage":-1}}},{"type":0,"input":[{"id":265,"damage":-1},{"id":318,"damage":-1}],"output":[{"id":259}]},{"type":1,"output":[{"id":-201}],"shape":["AB "],"input":{"A":{"id":58,"damage":-1},"B":{"id":262}}},{"type":1,"output":[{"id":346}],"shape":[" A"," AB","A B"],"input":{"A":{"id":280,"damage":-1},"B":{"id":287,"damage":-1}}},{"type":0,"input":[{"id":375,"damage":-1},{"id":39,"damage":-1},{"id":353,"damage":-1}],"output":[{"id":376}]},{"type":1,"output":[{"id":107}],"shape":["ABA","ABA"],"input":{"A":{"id":280,"damage":-1},"B":{"id":5}}},{"type":1,"output":[{"id":85,"count":3}],"shape":["ABA","ABA"],"input":{"A":{"id":5},"B":{"id":280,"damage":-1}}},{"type":0,"input":[{"id":368,"damage":-1},{"id":377,"damage":-1}],"output":[{"id":381}]},{"type":1,"output":[{"id":285}],"shape":["AAA"," B "," B "],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":208,"count":4}],"shape":["A","B"],"input":{"A":{"id":369,"damage":-1},"B":{"id":433,"damage":-1}}},{"type":1,"output":[{"id":426}],"shape":["AAA","ABA","ACA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":381,"damage":-1},"C":{"id":370,"damage":-1}}},{"type":1,"output":[{"id":206,"count":4}],"shape":["AA","AA"],"input":{"A":{"id":121,"damage":-1}}},{"type":1,"output":[{"id":139,"damage":10,"count":6}],"shape":["AAA","AAA"],"input":{"A":{"id":206,"damage":-1}}},{"type":1,"output":[{"id":-178,"count":4}],"shape":["A ","AA ","AAA"],"input":{"A":{"id":206,"damage":-1}}},{"type":1,"output":[{"id":116}],"shape":[" A ","BCB","CCC"],"input":{"A":{"id":340,"damage":-1},"B":{"id":264,"damage":-1},"C":{"id":49,"damage":-1}}},{"type":0,"input":[{"id":395},{"id":345,"damage":-1}],"output":[{"id":395,"damage":2}]},{"type":1,"output":[{"id":133}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":388,"damage":-1}}},{"type":1,"output":[{"id":388,"count":9}],"shape":["A"],"input":{"A":{"id":133,"damage":-1}}},{"type":1,"output":[{"id":125,"damage":3}],"shape":["AAA","A A","ABA"],"input":{"A":{"id":4,"damage":-1},"B":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":-139}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":464,"damage":-1}}},{"type":1,"output":[{"id":464,"count":9}],"shape":["A"],"input":{"A":{"id":-139,"damage":-1}}},{"type":1,"output":[{"id":23,"damage":3}],"shape":["AAA","ABA","ACA"],"input":{"A":{"id":4,"damage":-1},"B":{"id":261,"damage":-1},"C":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":317}],"shape":["A A","A A"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":27,"count":6}],"shape":["A A","ABA","ACA"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":331,"damage":-1}}},{"type":1,"output":[{"id":316}],"shape":["AAA","A A","A A"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":294}],"shape":["AA"," B"," B"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":314}],"shape":["AAA","A A"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":315}],"shape":["A A","AAA","AAA"],"input":{"A":{"id":266,"damage":-1}}},{"type":1,"output":[{"id":396}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":371,"damage":-1},"B":{"id":391,"damage":-1}}},{"type":1,"output":[{"id":286}],"shape":["AA","AB"," B"],"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}}},{"type":1,"output":[{"id":266,"count":9}],"shape":["A"],"input":{"A":{"id":41,"damage":-1}}},{"type":1,"output":[{"id":266}],"shape":["AAA","AAA","AAA"],"input":{"A":{"id":371,"damage":-1}}},{"type":1,"output":[{"id":322}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":266,"damage":-1},"B":{"id":260,"damage":-1}}},{"type":1,"output":[{"id":371,"count":9}],"shape":["A"],"input":{"A":{"id":266,"damage":-1}}},{"type":0,"input":[{"id":351,"damage":2},{"id":351,"damage":15}],"output":[{"id":351,"damage":10,"count":2}]},{"type":0,"input":[{"id":38,"damage":8}],"output":[{"id":351,"damage":7}]},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":19}],"output":[{"id":351,"damage":12,"count":2}]},{"type":0,"input":[{"id":351,"damage":15},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"count":8}]},{"type":0,"input":[{"id":38,"damage":2}],"output":[{"id":351,"damage":13}]},{"type":1,"output":[{"id":168,"damage":1}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":409,"damage":-1},"B":{"id":351}}},{"type":0,"input":[{"id":351,"damage":3},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":12,"count":8}]},{"type":1,"output":[{"id":241,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":15}}},{"type":1,"output":[{"id":159,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":15}}},{"type":1,"output":[{"id":241,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":3}}},{"type":1,"output":[{"id":159,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":3}}},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":2}],"output":[{"id":351,"damage":6,"count":2}]},{"type":1,"output":[{"id":241,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":4}}},{"type":1,"output":[{"id":159,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":4}}},{"type":0,"input":[{"id":351,"damage":4},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":11,"count":8}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1}],"output":[{"id":351,"damage":5,"count":2}]},{"type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":15}],"output":[{"id":351,"damage":8,"count":2}]},{"type":0,"input":[{"id":351},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":15,"count":8}]},{"type":1,"output":[{"id":159,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":172,"damage":-1},"B":{"id":351}}},{"type":1,"output":[{"id":241,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":20,"damage":-1},"B":{"id":351}}},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":15}],"output":[{"id":351,"damage":12,"count":2}]},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":3}]},{"type":0,"input":[{"id":351},{"id":351,"damage":19}],"output":[{"id":351,"damage":8,"count":2}]},{"type":0,"input":[{"id":38,"damage":3}],"output":[{"id":351,"damage":7}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":19}],"output":[{"id":351,"damage":12,"count":2}]},{"type":0,"input":[{"id":351,"damage":5},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":2}]},{"type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":19},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":3}]},{"type":0,"input":[{"id":351},{"id":351,"damage":15}],"output":[{"id":351,"damage":8,"count":2}]},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":13,"count":4}]},{"type":0,"input":[{"id":351,"damage":8},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":2}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":15}],"output":[{"id":351,"damage":12,"count":2}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":3}]},{"type":0,"input":[{"id":351},{"id":351,"damage":19},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":3}]},{"type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":13,"count":4}]},{"type":0,"input":[{"id":351,"damage":8},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":2}]},{"type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":15},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":3}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":13,"count":4}]},{"type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":13,"count":4}]},{"type":0,"input":[{"id":351},{"id":351,"damage":15},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":3}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":1}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":2}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":3}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":4}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":5}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":6}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":7}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":8}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":9}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":10}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":11}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":12}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":13}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":14}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":15}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":1}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":2}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":3}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":4}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":5}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":6}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":7}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":8}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":9}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":10}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":12}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":13}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":14}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":15}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":1}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":2}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":3}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":4}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":5}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":6}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":7}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":8}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":9}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":10}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":11}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":13}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":14}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":15}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":1}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":2}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":3}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":4}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":5}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":6}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":7}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":8}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":9}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":10}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":11}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":12}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":13}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":14}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":1}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":2}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":3}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":4}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":5}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":6}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":7}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":8}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":9}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":10}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":11}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":12}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":13}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":14}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":15}],"output":[{"id":35}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":2}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":3}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":4}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":5}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":6}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":7}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":8}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":9}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":10}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":11}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":12}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":13}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":14}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":15}],"output":[{"id":35,"damage":1}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":1}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":3}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":4}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":5}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":6}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":7}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":8}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":9}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":10}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":11}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":12}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":13}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":14}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":15}],"output":[{"id":35,"damage":2}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":1}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":2}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":4}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":5}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":6}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":7}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":8}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":9}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":10}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":11}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":12}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":13}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":14}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":15}],"output":[{"id":35,"damage":3}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":1}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":2}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":3}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":5}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":6}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":7}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":8}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":9}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":10}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":11}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":12}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":13}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":14}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":15}],"output":[{"id":35,"damage":4}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":1}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":2}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":3}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":4}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":6}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":7}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":8}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":9}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":10}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":11}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":12}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":13}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":14}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":15}],"output":[{"id":35,"damage":5}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":1}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":2}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":3}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":4}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":5}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":7}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":8}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":9}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":10}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":11}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":12}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":13}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":14}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":15}],"output":[{"id":35,"damage":6}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":1}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":2}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":3}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":4}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":5}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":6}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":8}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":9}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":10}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":11}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":12}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":13}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":14}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":15}],"output":[{"id":35,"damage":7}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":1}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":2}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":3}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":4}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":5}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":6}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":7}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":9}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":10}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":11}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":12}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":13}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":14}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":15}],"output":[{"id":35,"damage":8}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":1}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":2}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":3}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":4}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":5}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":6}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":7}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":8}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":10}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":11}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":12}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":13}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":14}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":15}],"output":[{"id":35,"damage":9}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":1}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":2}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":3}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":4}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":5}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":6}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":7}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":8}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":9}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":11}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":12}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":13}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":14}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":15}],"output":[{"id":35,"damage":10}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":1}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":2}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":3}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":4}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":5}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":6}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":7}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":8}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":9}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":10}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":12}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":13}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":14}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":15}],"output":[{"id":35,"damage":11}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":1}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":2}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":3}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":4}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":5}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":6}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":7}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":8}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":9}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":10}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":11}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":13}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":14}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":15}],"output":[{"id":35,"damage":12}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":1}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":2}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":3}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":4}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":5}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":6}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":7}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":8}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":9}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":10}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":11}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":12}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":14}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":15}],"output":[{"id":35,"damage":13}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":1}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":2}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":3}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":4}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":5}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":6}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":7}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":8}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":9}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":10}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":11}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":12}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":13}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":15}],"output":[{"id":35,"damage":14}]},{"type":0,"input":[{"id":351},{"id":35}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":1}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":2}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":3}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":4}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":5}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":6}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":7}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":8}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":9}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":10}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":11}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":12}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":13}],"output":[{"id":35,"damage":15}]},{"type":0,"input":[{"id":351},{"id":35,"damage":14}],"output":[{"id":35,"damage":15}]},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":19}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":15}],"output":[{"id":218}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":205,"damage":-1},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":14},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":13},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":12},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":11},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":10},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":9},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":8},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":7},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":6},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":5},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":4},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":3},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":2},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218,"damage":1},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":5,"input":[{"id":218},{"id":351}],"output":[{"id":218,"damage":15}],"uuid":"b3840292-a2a7-4762-a814-32e3e7ee7dc0"},{"type":1,"output":[{"id":355}],"shape":["AAA","BBB"],"input":{"A":{"id":35},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":1}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":1},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":2}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":2},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":3}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":3},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":4}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":4},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":5}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":5},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":6}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":6},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":7}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":7},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":8}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":8},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":9}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":9},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":10}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":10},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":11}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":11},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":12}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":12},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":13}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":13},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":14}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":14},"B":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":355,"damage":15}],"shape":["AAA","BBB"],"input":{"A":{"id":35,"damage":15},"B":{"id":5,"damage":-1}}},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":19}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":15}],"output":[{"id":355}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}]},{"type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}]},{"type":0,"input":[{"id":355,"damage":14},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":13},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":12},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":11},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":10},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":9},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":8},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":7},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":6},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":5},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":4},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":3},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":2},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355,"damage":1},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":0,"input":[{"id":355},{"id":351}],"output":[{"id":355,"damage":15}]},{"type":1,"output":[{"id":54}],"shape":["AAA","A A","AAA"],"input":{"A":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":58}],"shape":["AA","AA"],"input":{"A":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":281,"count":4}],"shape":["A A"," A "],"input":{"A":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":151}],"shape":["AAA","BBB","CCC"],"input":{"A":{"id":20,"damage":-1},"B":{"id":406},"C":{"id":158,"damage":-1}}},{"type":1,"output":[{"id":84}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":5,"damage":-1},"B":{"id":264}}},{"type":1,"output":[{"id":25}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":5,"damage":-1},"B":{"id":331}}},{"type":1,"output":[{"id":321}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":280},"B":{"id":35,"damage":-1}}},{"type":1,"output":[{"id":33,"damage":1}],"shape":["AAA","BCB","BDB"],"input":{"A":{"id":5,"damage":-1},"B":{"id":4,"damage":-1},"C":{"id":265},"D":{"id":331}}},{"type":1,"output":[{"id":280}],"shape":["A","A"],"input":{"A":{"id":-163,"damage":-1}}},{"type":1,"output":[{"id":280,"count":4}],"shape":["A","A"],"input":{"A":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":47}],"shape":["AAA","BBB","AAA"],"input":{"A":{"id":5,"damage":-1},"B":{"id":340}}},{"type":1,"output":[{"id":143,"damage":5}],"shape":["A"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":-140,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":-141,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":-142,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":-143,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":-144,"damage":5}],"shape":["A"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":72}],"shape":["AA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":131,"count":2}],"shape":["A","B","C"],"input":{"A":{"id":265},"B":{"id":280},"C":{"id":5,"damage":-1}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":4}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":2}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":5}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":3}}},{"type":1,"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"input":{"A":{"id":5,"damage":1}}},{"type":1,"output":[{"id":50,"count":4}],"shape":["A","B"],"input":{"A":{"id":263,"damage":-1},"B":{"id":280}}},{"type":0,"input":[{"id":377},{"id":263},{"id":289}],"output":[{"id":385,"count":3}]},{"type":0,"input":[{"id":377},{"id":263,"damage":1},{"id":289}],"output":[{"id":385,"count":3}]},{"type":1,"output":[{"id":46}],"shape":["ABA","BAB","ABA"],"input":{"A":{"id":289},"B":{"id":12,"damage":-1}}},{"type":1,"output":[{"id":-166,"damage":2,"count":6}],"shape":["AAA"],"input":{"A":{"id":1}}},{"type":1,"output":[{"id":44,"count":6}],"shape":["AAA"],"input":{"A":{"id":-183,"damage":-1}}},{"type":1,"output":[{"id":-166,"count":6}],"shape":["AAA"],"input":{"A":{"id":98,"damage":1}}},{"type":1,"output":[{"id":44,"damage":5,"count":6}],"shape":["AAA"],"input":{"A":{"id":98,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":4,"count":6}],"shape":["AAA"],"input":{"A":{"id":45,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":3,"count":6}],"shape":["AAA"],"input":{"A":{"id":4,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":7,"count":6}],"shape":["AAA"],"input":{"A":{"id":112,"damage":-1}}},{"type":1,"output":[{"id":44,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":24}}},{"type":1,"output":[{"id":182,"count":6}],"shape":["AAA"],"input":{"A":{"id":179}}},{"type":1,"output":[{"id":44,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":24,"damage":1}}},{"type":1,"output":[{"id":182,"count":6}],"shape":["AAA"],"input":{"A":{"id":179,"damage":1}}},{"type":1,"output":[{"id":182,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":201,"damage":-1}}},{"type":1,"output":[{"id":-166,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":155,"damage":3}}},{"type":1,"output":[{"id":44,"damage":6,"count":6}],"shape":["AAA"],"input":{"A":{"id":155,"damage":-1}}},{"type":1,"output":[{"id":182,"damage":2,"count":6}],"shape":["AAA"],"input":{"A":{"id":168}}},{"type":1,"output":[{"id":182,"damage":3,"count":6}],"shape":["AAA"],"input":{"A":{"id":168,"damage":1}}},{"type":1,"output":[{"id":182,"damage":4,"count":6}],"shape":["AAA"],"input":{"A":{"id":168,"damage":2}}},{"type":1,"output":[{"id":182,"damage":5,"count":6}],"shape":["AAA"],"input":{"A":{"id":48,"damage":-1}}},{"type":1,"output":[{"id":182,"damage":6,"count":6}],"shape":["AAA"],"input":{"A":{"id":24,"damage":3}}},{"type":1,"output":[{"id":182,"damage":7,"count":6}],"shape":["AAA"],"input":{"A":{"id":215,"damage":-1}}},{"type":1,"output":[{"id":-162,"count":6}],"shape":["AAA"],"input":{"A":{"id":206,"damage":-1}}},{"type":1,"output":[{"id":-162,"damage":1,"count":6}],"shape":["AAA"],"input":{"A":{"id":179,"damage":3}}},{"type":1,"output":[{"id":-162,"damage":2,"count":6}],"shape":["AAA"],"input":{"A":{"id":1,"damage":6}}},{"type":1,"output":[{"id":-162,"damage":3,"count":6}],"shape":["AAA"],"input":{"A":{"id":1,"damage":5}}},{"type":1,"output":[{"id":-162,"damage":4,"count":6}],"shape":["AAA"],"input":{"A":{"id":1,"damage":3}}},{"type":1,"output":[{"id":-162,"damage":5,"count":6}],"shape":["AAA"],"input":{"A":{"id":1,"damage":4}}},{"type":1,"output":[{"id":-162,"damage":6,"count":6}],"shape":["AAA"],"input":{"A":{"id":1,"damage":1}}},{"type":1,"output":[{"id":-162,"damage":7,"count":6}],"shape":["AAA"],"input":{"A":{"id":1,"damage":2}}},{"type":1,"output":[{"id":-166,"damage":3,"count":6}],"shape":["AAA"],"input":{"A":{"id":24,"damage":2}}},{"type":1,"output":[{"id":-166,"damage":4,"count":6}],"shape":["AAA"],"input":{"A":{"id":179,"damage":2}}},{"type":1,"output":[{"id":155,"damage":1}],"shape":["A","A"],"input":{"A":{"id":44,"damage":6}}},{"type":1,"output":[{"id":179,"damage":1}],"shape":["A","A"],"input":{"A":{"id":182}}},{"type":1,"output":[{"id":24,"damage":1}],"shape":["A","A"],"input":{"A":{"id":44,"damage":1}}},{"type":1,"output":[{"id":98,"damage":3}],"shape":["A","A"],"input":{"A":{"id":44,"damage":5}}},{"type":1,"output":[{"id":201,"damage":2}],"shape":["A","A"],"input":{"A":{"id":182,"damage":1}}},{"type":0,"input":[{"id":339},{"id":289}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730000000000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":19}],"output":[{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":18}],"output":[{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":17}],"output":[{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":16}],"output":[{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":15}],"output":[{"id":402,"damage":15,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000f070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72f0f0f0ff00"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":14}],"output":[{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":14,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721d80f9ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000e070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":13}],"output":[{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":13,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72bd4ec7ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000d070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":12}],"output":[{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":12,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72dab33aff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000c070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":11}],"output":[{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":11,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f723dd8feff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000b070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":10}],"output":[{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":10,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f721fc780ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f72010000000a070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":9}],"output":[{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":9,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa8bf3ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000009070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":8}],"output":[{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":8,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72524f47ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000008070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":7}],"output":[{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":7,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72979d9dff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000007070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":6}],"output":[{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":6,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f729c9c16ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000006070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":5}],"output":[{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":5,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72b83289ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000005070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":4}],"output":[{"id":402,"damage":4,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000004070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72aa443cff00"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":3}],"output":[{"id":402,"damage":3,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000003070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72325483ff00"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":2}],"output":[{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":2,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72167c5eff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000002070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351,"damage":1}],"output":[{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"}]},{"type":0,"input":[{"id":339},{"id":289},{"id":402,"damage":1,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72262eb0ff00"}],"output":[{"id":401,"count":3,"nbt_hex":"0a00000a090046697265776f726b73090a004578706c6f73696f6e730a01000000070d0046697265776f726b436f6c6f720100000001070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000010600466c69676874010000"}]},{"type":0,"input":[{"id":289},{"id":351}],"output":[{"id":402,"nbt_hex":"0a00000a0d0046697265776f726b734974656d070d0046697265776f726b436f6c6f720100000000070c0046697265776f726b4661646500000000010f0046697265776f726b466c69636b657200010d0046697265776f726b547261696c00010c0046697265776f726b547970650000030b00637573746f6d436f6c6f72211d1dff00"}]},{"type":1,"output":[{"id":270}],"shape":["AAA"," B "," B "],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":269}],"shape":["A","B","B"],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":271}],"shape":["AA","AB"," B"],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":290}],"shape":["AA"," B"," B"],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":268}],"shape":["A","A","B"],"input":{"A":{"id":5,"damage":-1},"B":{"id":280}}},{"type":1,"output":[{"id":262,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":5}}},{"type":1,"output":[{"id":262,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":6}}},{"type":1,"output":[{"id":262,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":7}}},{"type":1,"output":[{"id":262,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":8}}},{"type":1,"output":[{"id":262,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":9}}},{"type":1,"output":[{"id":262,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":10}}},{"type":1,"output":[{"id":262,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":11}}},{"type":1,"output":[{"id":262,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":12}}},{"type":1,"output":[{"id":262,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":13}}},{"type":1,"output":[{"id":262,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":14}}},{"type":1,"output":[{"id":262,"damage":16,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":15}}},{"type":1,"output":[{"id":262,"damage":17,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":16}}},{"type":1,"output":[{"id":262,"damage":18,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":17}}},{"type":1,"output":[{"id":262,"damage":19,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":18}}},{"type":1,"output":[{"id":262,"damage":20,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":19}}},{"type":1,"output":[{"id":262,"damage":21,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":20}}},{"type":1,"output":[{"id":262,"damage":22,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":21}}},{"type":1,"output":[{"id":262,"damage":23,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":22}}},{"type":1,"output":[{"id":262,"damage":24,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":23}}},{"type":1,"output":[{"id":262,"damage":25,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":24}}},{"type":1,"output":[{"id":262,"damage":26,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":25}}},{"type":1,"output":[{"id":262,"damage":27,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":26}}},{"type":1,"output":[{"id":262,"damage":28,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":27}}},{"type":1,"output":[{"id":262,"damage":29,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":28}}},{"type":1,"output":[{"id":262,"damage":30,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":29}}},{"type":1,"output":[{"id":262,"damage":31,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":30}}},{"type":1,"output":[{"id":262,"damage":32,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":31}}},{"type":1,"output":[{"id":262,"damage":33,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":32}}},{"type":1,"output":[{"id":262,"damage":34,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":33}}},{"type":1,"output":[{"id":262,"damage":35,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":34}}},{"type":1,"output":[{"id":262,"damage":36,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":35}}},{"type":1,"output":[{"id":262,"damage":37,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":36}}},{"type":1,"output":[{"id":262,"damage":38,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":37}}},{"type":1,"output":[{"id":262,"damage":39,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":38}}},{"type":1,"output":[{"id":262,"damage":40,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":39}}},{"type":1,"output":[{"id":262,"damage":41,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":40}}},{"type":1,"output":[{"id":262,"damage":42,"count":8}],"shape":["AAA","ABA","AAA"],"input":{"A":{"id":262},"B":{"id":441,"damage":41}}},{"type":6,"input":[{"id":451},{"id":35,"damage":1}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":1}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":1}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":1}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":2}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":2}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":2}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":2}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":3}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":3}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":3}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":3}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":4}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":4}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":4}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":4}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":5}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":5}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":5}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":5}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":6}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":6}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":6}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":6}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":7}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":7}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":7}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":7}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":8}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":8}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":8}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":8}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":9}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":9}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":9}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":9}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":10}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":10}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":10}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":10}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":11}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":11}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":11}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":11}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":12}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":12}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":12}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":12}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":13}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":13}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":13}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":13}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":14}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":14}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":14}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446,"damage":14}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":35,"damage":15}],"output":[{"id":35}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":171,"damage":15}],"output":[{"id":171}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":355,"damage":15}],"output":[{"id":355}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":6,"input":[{"id":451},{"id":446}],"output":[{"id":446,"damage":15}],"uuid":"a22bf1e8-6e23-4882-9e86-d05ded9fc832"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":19},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241},{"id":241},{"id":241},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160},{"id":160},{"id":160},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":19},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254},{"id":254},{"id":254},{"id":254},{"id":254},{"id":254}],"output":[{"id":191,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":18},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":11}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":11},{"id":241,"damage":11},{"id":241,"damage":11},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":11,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":11},{"id":160,"damage":11},{"id":160,"damage":11},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":11,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":18},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":11,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":11},{"id":254,"damage":11},{"id":254,"damage":11},{"id":254,"damage":11},{"id":254,"damage":11},{"id":254,"damage":11}],"output":[{"id":191,"damage":11,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":17},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":12}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":12},{"id":241,"damage":12},{"id":241,"damage":12},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":12,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":12},{"id":160,"damage":12},{"id":160,"damage":12},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":12,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":17},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":12,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":12},{"id":254,"damage":12},{"id":254,"damage":12},{"id":254,"damage":12},{"id":254,"damage":12},{"id":254,"damage":12}],"output":[{"id":191,"damage":12,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":16},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":15}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":15},{"id":241,"damage":15},{"id":241,"damage":15},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":15,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":15},{"id":160,"damage":15},{"id":160,"damage":15},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":15,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":16},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":15,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":15},{"id":254,"damage":15},{"id":254,"damage":15},{"id":254,"damage":15},{"id":254,"damage":15},{"id":254,"damage":15}],"output":[{"id":191,"damage":15,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":15},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":15},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":14},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":1}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":1},{"id":241,"damage":1},{"id":241,"damage":1},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":1,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":1},{"id":160,"damage":1},{"id":160,"damage":1},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":1,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":14},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":1,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":1},{"id":254,"damage":1},{"id":254,"damage":1},{"id":254,"damage":1},{"id":254,"damage":1},{"id":254,"damage":1}],"output":[{"id":191,"damage":1,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":2}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":2},{"id":241,"damage":2},{"id":241,"damage":2},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":2,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":2},{"id":160,"damage":2},{"id":160,"damage":2},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":2,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":13},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":2,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":2},{"id":254,"damage":2},{"id":254,"damage":2},{"id":254,"damage":2},{"id":254,"damage":2},{"id":254,"damage":2}],"output":[{"id":191,"damage":2,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":12},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":3},{"id":241,"damage":3},{"id":241,"damage":3},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":3,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":3},{"id":160,"damage":3},{"id":160,"damage":3},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":3,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":12},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":3,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":3},{"id":254,"damage":3},{"id":254,"damage":3},{"id":254,"damage":3},{"id":254,"damage":3},{"id":254,"damage":3}],"output":[{"id":191,"damage":3,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":11},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":4}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":4},{"id":241,"damage":4},{"id":241,"damage":4},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":4,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":4},{"id":160,"damage":4},{"id":160,"damage":4},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":4,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":11},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":4,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":4},{"id":254,"damage":4},{"id":254,"damage":4},{"id":254,"damage":4},{"id":254,"damage":4},{"id":254,"damage":4}],"output":[{"id":191,"damage":4,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":10},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":5}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":5},{"id":241,"damage":5},{"id":241,"damage":5},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":5,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":5},{"id":160,"damage":5},{"id":160,"damage":5},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":5,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":10},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":5,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":5},{"id":254,"damage":5},{"id":254,"damage":5},{"id":254,"damage":5},{"id":254,"damage":5},{"id":254,"damage":5}],"output":[{"id":191,"damage":5,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":9},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":6}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":6},{"id":241,"damage":6},{"id":241,"damage":6},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":6,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":6},{"id":160,"damage":6},{"id":160,"damage":6},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":6,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":9},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":6,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":6},{"id":254,"damage":6},{"id":254,"damage":6},{"id":254,"damage":6},{"id":254,"damage":6},{"id":254,"damage":6}],"output":[{"id":191,"damage":6,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":8},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":7}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":7},{"id":241,"damage":7},{"id":241,"damage":7},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":7,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":7},{"id":160,"damage":7},{"id":160,"damage":7},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":7,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":8},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":7,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":7},{"id":254,"damage":7},{"id":254,"damage":7},{"id":254,"damage":7},{"id":254,"damage":7},{"id":254,"damage":7}],"output":[{"id":191,"damage":7,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":7},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":8},{"id":241,"damage":8},{"id":241,"damage":8},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":8,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":8},{"id":160,"damage":8},{"id":160,"damage":8},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":8,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":7},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":8,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":8},{"id":254,"damage":8},{"id":254,"damage":8},{"id":254,"damage":8},{"id":254,"damage":8},{"id":254,"damage":8}],"output":[{"id":191,"damage":8,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":6},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":9}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":9},{"id":241,"damage":9},{"id":241,"damage":9},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":9,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":9},{"id":160,"damage":9},{"id":160,"damage":9},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":9,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":6},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":9,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":9},{"id":254,"damage":9},{"id":254,"damage":9},{"id":254,"damage":9},{"id":254,"damage":9},{"id":254,"damage":9}],"output":[{"id":191,"damage":9,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":5},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":10}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":10},{"id":241,"damage":10},{"id":241,"damage":10},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":10,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":10},{"id":160,"damage":10},{"id":160,"damage":10},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":10,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":5},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":10,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":10},{"id":254,"damage":10},{"id":254,"damage":10},{"id":254,"damage":10},{"id":254,"damage":10},{"id":254,"damage":10}],"output":[{"id":191,"damage":10,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":4},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":11}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":4},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":11,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":3},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":12}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":3},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":12,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":2},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":13}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":13},{"id":241,"damage":13},{"id":241,"damage":13},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":13,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":13},{"id":160,"damage":13},{"id":160,"damage":13},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":13,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":2},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":13,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":13},{"id":254,"damage":13},{"id":254,"damage":13},{"id":254,"damage":13},{"id":254,"damage":13},{"id":254,"damage":13}],"output":[{"id":191,"damage":13,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351,"damage":1},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":14}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":241,"damage":14},{"id":241,"damage":14},{"id":241,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":254,"damage":14,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":160,"damage":14},{"id":160,"damage":14},{"id":160,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":191,"damage":14,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351,"damage":1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":14,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":254,"damage":14},{"id":254,"damage":14},{"id":254,"damage":14},{"id":254,"damage":14},{"id":254,"damage":14},{"id":254,"damage":14}],"output":[{"id":191,"damage":14,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":30},{"id":351},{"id":499,"damage":30},{"id":499,"damage":30},{"id":-13},{"id":499,"damage":30},{"id":499,"damage":30},{"id":420},{"id":499,"damage":30}],"output":[{"id":448,"damage":15}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":351},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1},{"id":253,"damage":-1}],"output":[{"id":254,"damage":15,"count":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":19},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":15}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":18},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":4}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":17},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":15},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":15}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":14},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":14}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":13},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":13}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":12},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":12}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":11},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":11}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":10},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":10}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":9},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":9}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":8},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":7},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":7}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":6},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":6}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":5},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":5}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":4},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":4}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":3},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":2},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":2}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":16},{"id":499,"damage":35},{"id":499,"damage":16},{"id":499,"damage":16},{"id":351,"damage":1},{"id":499,"damage":16},{"id":499,"damage":16},{"id":499,"damage":10},{"id":499,"damage":16}],"output":[{"id":166,"damage":1}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":23},{"id":-23},{"id":280}],"output":[{"id":442,"damage":4}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":24},{"id":-23},{"id":280}],"output":[{"id":442,"damage":2}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":25},{"id":-23},{"id":280}],"output":[{"id":442,"damage":14}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":21},{"id":-23},{"id":280}],"output":[{"id":442,"damage":5}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":3,"input":[{"id":499,"damage":22},{"id":-23},{"id":280}],"output":[{"id":442,"damage":1}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":-23},{"id":50}],"output":[{"id":239}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":-22},{"id":46}],"output":[{"id":46,"damage":2}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":20},{"id":20},{"id":20},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":253,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":3,"input":[{"id":499,"damage":13},{"id":499,"damage":13},{"id":499,"damage":13},{"id":102},{"id":102},{"id":102},{"id":499,"damage":14},{"id":499,"damage":14},{"id":499,"damage":14}],"output":[{"id":190,"count":3}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":3,"height":2,"input":[{"id":253},{"id":253},{"id":253},{"id":253},{"id":253},{"id":253}],"output":[{"id":190,"count":16}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":499,"damage":22},{"id":50}],"output":[{"id":202}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":499,"damage":24},{"id":50}],"output":[{"id":202,"damage":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":499,"damage":23},{"id":50}],"output":[{"id":204}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":7,"width":1,"height":2,"input":[{"id":499,"damage":21},{"id":50}],"output":[{"id":204,"damage":8}],"uuid":"585bca32-4359-48a7-b55b-0f33f5af0b08"},{"type":4,"uuid":"b5c5d105-75a2-4076-af2b-923ea2bf4bf0"},{"type":4,"uuid":"d81aaeaf-e172-4440-9225-868df030d27b"},{"type":4,"uuid":"00000000-0000-0000-0000-000000000002"},{"type":4,"uuid":"85939755-ba10-4d9d-a4cc-efb7a8e943c4"},{"type":4,"uuid":"d392b075-4ba1-40ae-8789-af868d56f6ce"},{"type":4,"uuid":"aecd2294-4b94-434b-8667-4499bb2c9327"},{"type":4,"uuid":"00000000-0000-0000-0000-000000000001"},{"type":4,"uuid":"d1ca6b84-338e-4f2f-9c6b-76cc8b4bd98d"},{"type":2,"inputId":-156,"output":{"id":351,"damage":10}},{"type":2,"inputId":-10,"output":{"id":263,"damage":1}},{"type":2,"inputId":-9,"output":{"id":263,"damage":1}},{"type":2,"inputId":-8,"output":{"id":263,"damage":1}},{"type":2,"inputId":-7,"output":{"id":263,"damage":1}},{"type":2,"inputId":-6,"output":{"id":263,"damage":1}},{"type":2,"inputId":-5,"output":{"id":263,"damage":1}},{"type":2,"inputId":4,"output":{"id":1}},{"type":2,"inputId":12,"output":{"id":20}},{"type":2,"inputId":14,"output":{"id":266}},{"type":2,"inputId":15,"output":{"id":265}},{"type":2,"inputId":16,"output":{"id":263}},{"type":2,"inputId":17,"output":{"id":263,"damage":1}},{"type":2,"inputId":21,"output":{"id":351,"damage":4}},{"type":2,"inputId":56,"output":{"id":264}},{"type":2,"inputId":73,"output":{"id":331}},{"type":2,"inputId":81,"output":{"id":351,"damage":2}},{"type":2,"inputId":82,"output":{"id":172}},{"type":2,"inputId":87,"output":{"id":405}},{"type":2,"inputId":129,"output":{"id":388}},{"type":2,"inputId":153,"output":{"id":406}},{"type":2,"inputId":162,"output":{"id":263,"damage":1}},{"type":2,"inputId":256,"output":{"id":452}},{"type":2,"inputId":257,"output":{"id":452}},{"type":2,"inputId":258,"output":{"id":452}},{"type":2,"inputId":267,"output":{"id":452}},{"type":2,"inputId":283,"output":{"id":371}},{"type":2,"inputId":284,"output":{"id":371}},{"type":2,"inputId":285,"output":{"id":371}},{"type":2,"inputId":286,"output":{"id":371}},{"type":2,"inputId":292,"output":{"id":452}},{"type":2,"inputId":294,"output":{"id":371}},{"type":2,"inputId":302,"output":{"id":452}},{"type":2,"inputId":303,"output":{"id":452}},{"type":2,"inputId":304,"output":{"id":452}},{"type":2,"inputId":305,"output":{"id":452}},{"type":2,"inputId":306,"output":{"id":452}},{"type":2,"inputId":307,"output":{"id":452}},{"type":2,"inputId":308,"output":{"id":452}},{"type":2,"inputId":309,"output":{"id":452}},{"type":2,"inputId":314,"output":{"id":371}},{"type":2,"inputId":315,"output":{"id":371}},{"type":2,"inputId":316,"output":{"id":371}},{"type":2,"inputId":317,"output":{"id":371}},{"type":2,"inputId":319,"output":{"id":320}},{"type":2,"inputId":335,"output":{"id":464}},{"type":2,"inputId":337,"output":{"id":336}},{"type":2,"inputId":349,"output":{"id":350}},{"type":2,"inputId":363,"output":{"id":364}},{"type":2,"inputId":365,"output":{"id":366}},{"type":2,"inputId":392,"output":{"id":393}},{"type":2,"inputId":411,"output":{"id":412}},{"type":2,"inputId":417,"output":{"id":452}},{"type":2,"inputId":418,"output":{"id":371}},{"type":2,"inputId":423,"output":{"id":424}},{"type":2,"inputId":432,"output":{"id":433}},{"type":2,"inputId":460,"output":{"id":463}},{"type":3,"inputId":1,"inputDamage":0,"output":{"id":-183}},{"type":3,"inputId":19,"inputDamage":1,"output":{"id":19}},{"type":3,"inputId":24,"inputDamage":0,"output":{"id":24,"damage":3}},{"type":3,"inputId":98,"inputDamage":0,"output":{"id":98,"damage":2}},{"type":3,"inputId":155,"inputDamage":0,"output":{"id":155,"damage":3}},{"type":3,"inputId":159,"inputDamage":0,"output":{"id":220}},{"type":3,"inputId":159,"inputDamage":1,"output":{"id":221}},{"type":3,"inputId":159,"inputDamage":2,"output":{"id":222}},{"type":3,"inputId":159,"inputDamage":3,"output":{"id":223}},{"type":3,"inputId":159,"inputDamage":4,"output":{"id":224}},{"type":3,"inputId":159,"inputDamage":5,"output":{"id":225}},{"type":3,"inputId":159,"inputDamage":6,"output":{"id":226}},{"type":3,"inputId":159,"inputDamage":7,"output":{"id":227}},{"type":3,"inputId":159,"inputDamage":8,"output":{"id":228}},{"type":3,"inputId":159,"inputDamage":9,"output":{"id":229}},{"type":3,"inputId":159,"inputDamage":10,"output":{"id":219}},{"type":3,"inputId":159,"inputDamage":11,"output":{"id":231}},{"type":3,"inputId":159,"inputDamage":12,"output":{"id":232}},{"type":3,"inputId":159,"inputDamage":13,"output":{"id":233}},{"type":3,"inputId":159,"inputDamage":14,"output":{"id":234}},{"type":3,"inputId":159,"inputDamage":15,"output":{"id":235}},{"type":3,"inputId":179,"inputDamage":0,"output":{"id":179,"damage":3}}]} \ No newline at end of file diff --git a/src/main/resources/recipes388.json b/src/main/resources/recipes388.json deleted file mode 100644 index 5a2c9de96..000000000 --- a/src/main/resources/recipes388.json +++ /dev/null @@ -1 +0,0 @@ -{"version":388,"recipes":[{"id":"Bookshelf_woodplanks_recipeId","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":340,"damage":-1}},"output":[{"id":47}],"shape":["AAA","BBB","AAA"],"block":"crafting_table","priority":50},{"id":"Bowl_recipeId","type":1,"input":{"A":{"id":5,"damage":-1}},"output":[{"id":281,"count":4}],"shape":["A A"," A "],"block":"crafting_table","priority":50},{"id":"ButtonAcacia_recipeId","type":1,"input":{"A":{"id":5,"damage":4}},"output":[{"id":-140}],"shape":["A"],"block":"crafting_table","priority":50},{"id":"ButtonBirch_recipeId","type":1,"input":{"A":{"id":5,"damage":2}},"output":[{"id":-141}],"shape":["A"],"block":"crafting_table","priority":50},{"id":"ButtonDarkOak_recipeId","type":1,"input":{"A":{"id":5,"damage":5}},"output":[{"id":-142}],"shape":["A"],"block":"crafting_table","priority":50},{"id":"ButtonJungle_recipeId","type":1,"input":{"A":{"id":5,"damage":3}},"output":[{"id":-143}],"shape":["A"],"block":"crafting_table","priority":50},{"id":"ButtonSpruce_recipeId","type":1,"input":{"A":{"id":5,"damage":1}},"output":[{"id":-144}],"shape":["A"],"block":"crafting_table","priority":50},{"id":"Chest_recipeId","type":1,"input":{"A":{"id":5,"damage":-1}},"output":[{"id":54}],"shape":["AAA","A A","AAA"],"block":"crafting_table","priority":50},{"id":"DaylightDetector_recipeId","type":1,"input":{"A":{"id":20},"B":{"id":406,"damage":-1},"C":{"id":158,"damage":-1}},"output":[{"id":151}],"shape":["AAA","BBB","CCC"],"block":"crafting_table","priority":50},{"id":"FireCharge_blaze_powder_coal_sulphur_recipeId","type":0,"input":[{"id":377,"damage":-1},{"id":263,"damage":1},{"id":289,"damage":-1}],"output":[{"id":385,"count":3}],"block":"crafting_table","priority":50},{"id":"FireCharge_coal_sulphur_recipeId","type":0,"input":[{"id":377,"damage":-1},{"id":263,"damage":-1},{"id":289,"damage":-1}],"output":[{"id":385,"count":3}],"block":"crafting_table","priority":50},{"id":"Jukebox_recipeId","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":264,"damage":-1}},"output":[{"id":84}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"Note_recipeId","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":331,"damage":-1}},"output":[{"id":25}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"Painting_Cobblestone_recipeId","type":1,"input":{"A":{"id":4}},"output":[{"id":44,"damage":3,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"Painting_NetherBrick_recipeId","type":1,"input":{"A":{"id":112}},"output":[{"id":44,"damage":7,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"Painting_VanillaBlocks_recipeId","type":1,"input":{"A":{"id":24}},"output":[{"id":44,"damage":1,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"Painting_recipeId","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":35,"damage":-1}},"output":[{"id":321}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"Piston_recipeId","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":4},"C":{"id":265,"damage":-1},"D":{"id":331,"damage":-1}},"output":[{"id":33,"damage":1}],"shape":["AAA","BCB","BDB"],"block":"crafting_table","priority":50},{"id":"PressurePlateAcacia_recipeId","type":1,"input":{"A":{"id":5,"damage":4}},"output":[{"id":72}],"shape":["AA"],"block":"crafting_table","priority":50},{"id":"PressurePlateBirch_recipeId","type":1,"input":{"A":{"id":5,"damage":2}},"output":[{"id":72}],"shape":["AA"],"block":"crafting_table","priority":50},{"id":"PressurePlateDarkOak_recipeId","type":1,"input":{"A":{"id":5,"damage":5}},"output":[{"id":72}],"shape":["AA"],"block":"crafting_table","priority":50},{"id":"PressurePlateJungle_recipeId","type":1,"input":{"A":{"id":5,"damage":3}},"output":[{"id":72}],"shape":["AA"],"block":"crafting_table","priority":50},{"id":"PressurePlateSpruce_recipeId","type":1,"input":{"A":{"id":5,"damage":1}},"output":[{"id":72}],"shape":["AA"],"block":"crafting_table","priority":50},{"id":"Stick_bamboo_recipeId","type":1,"input":{"A":{"id":-163}},"output":[{"id":280}],"shape":["A","A"],"block":"crafting_table","priority":2},{"id":"StoneSlab4_recipeId","type":1,"input":{"A":{"id":1}},"output":[{"id":-166,"damage":2,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"StoneSlab4_stoneBrick_recipeId","type":1,"input":{"A":{"id":98,"damage":1}},"output":[{"id":-166,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"StoneSlab_Brick_recipeId","type":1,"input":{"A":{"id":45}},"output":[{"id":44,"damage":4,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"StoneSlab_StoneBrick_recipeId","type":1,"input":{"A":{"id":98}},"output":[{"id":44,"damage":5,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"StoneSlab_recipeId","type":1,"input":{"A":{"id":-183}},"output":[{"id":44,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"Torch_recipeId","type":1,"input":{"A":{"id":263,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":50,"count":4}],"shape":["A","B"],"block":"crafting_table","priority":50},{"id":"TrapdoorAcacia_recipeId","type":1,"input":{"A":{"id":5,"damage":4}},"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"block":"crafting_table","priority":50},{"id":"TrapdoorBirch_recipeId","type":1,"input":{"A":{"id":5,"damage":2}},"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"block":"crafting_table","priority":50},{"id":"TrapdoorDarkOak_recipeId","type":1,"input":{"A":{"id":5,"damage":5}},"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"block":"crafting_table","priority":50},{"id":"TrapdoorJungle_recipeId","type":1,"input":{"A":{"id":5,"damage":3}},"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"block":"crafting_table","priority":50},{"id":"TrapdoorSpruce_recipeId","type":1,"input":{"A":{"id":5,"damage":1}},"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"block":"crafting_table","priority":50},{"id":"Trapdoor_recipeId","type":1,"input":{"A":{"id":5}},"output":[{"id":96,"count":2}],"shape":["AAA","AAA"],"block":"crafting_table","priority":50},{"id":"TripwireHook_recipeId","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":5,"damage":-1}},"output":[{"id":131,"count":2}],"shape":["A","B","C"],"block":"crafting_table","priority":50},{"id":"WoodButton_recipeId","type":1,"input":{"A":{"id":5}},"output":[{"id":143}],"shape":["A"],"block":"crafting_table","priority":50},{"id":"WoodPressurePlate_recipeId","type":1,"input":{"A":{"id":5}},"output":[{"id":72}],"shape":["AA"],"block":"crafting_table","priority":50},{"id":"WorkBench_recipeId","type":1,"input":{"A":{"id":5,"damage":-1}},"output":[{"id":58}],"shape":["AA","AA"],"block":"crafting_table","priority":50},{"id":"acacia_stairs_acacia_recipeId","type":1,"input":{"A":{"id":5,"damage":4}},"output":[{"id":163,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":50},{"type":4,"uuid":"d81aaeaf-e172-4440-9225-868df030d27b"},{"type":4,"uuid":"b5c5d105-75a2-4076-af2b-923ea2bf4bf0"},{"type":4,"uuid":"00000000-0000-0000-0000-000000000002"},{"id":"bed_color_0","type":1,"input":{"A":{"id":35},"B":{"id":5,"damage":-1}},"output":[{"id":355}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_1","type":1,"input":{"A":{"id":35,"damage":1},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":1}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_10","type":1,"input":{"A":{"id":35,"damage":10},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":10}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_11","type":1,"input":{"A":{"id":35,"damage":11},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":11}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_12","type":1,"input":{"A":{"id":35,"damage":12},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":12}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_13","type":1,"input":{"A":{"id":35,"damage":13},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":13}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_14","type":1,"input":{"A":{"id":35,"damage":14},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":14}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_15","type":1,"input":{"A":{"id":35,"damage":15},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":15}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_2","type":1,"input":{"A":{"id":35,"damage":2},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":2}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_3","type":1,"input":{"A":{"id":35,"damage":3},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":3}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_4","type":1,"input":{"A":{"id":35,"damage":4},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":4}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_5","type":1,"input":{"A":{"id":35,"damage":5},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":5}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_6","type":1,"input":{"A":{"id":35,"damage":6},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":6}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_7","type":1,"input":{"A":{"id":35,"damage":7},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":7}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_8","type":1,"input":{"A":{"id":35,"damage":8},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":8}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_color_9","type":1,"input":{"A":{"id":35,"damage":9},"B":{"id":5,"damage":-1}},"output":[{"id":355,"damage":9}],"shape":["AAA","BBB"],"block":"crafting_table","priority":1},{"id":"bed_dye_0_1","type":0,"input":[{"id":355,"damage":14},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_10","type":0,"input":[{"id":355,"damage":5},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_11","type":0,"input":[{"id":355,"damage":4},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_12","type":0,"input":[{"id":355,"damage":3},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_13","type":0,"input":[{"id":355,"damage":2},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_14","type":0,"input":[{"id":355,"damage":1},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_15","type":0,"input":[{"id":355},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_2","type":0,"input":[{"id":355,"damage":13},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_3","type":0,"input":[{"id":355,"damage":12},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_4","type":0,"input":[{"id":355,"damage":11},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_5","type":0,"input":[{"id":355,"damage":10},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_6","type":0,"input":[{"id":355,"damage":9},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_7","type":0,"input":[{"id":355,"damage":8},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_8","type":0,"input":[{"id":355,"damage":7},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_0_9","type":0,"input":[{"id":355,"damage":6},{"id":351}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_15","type":0,"input":[{"id":355},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_10_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":10}],"output":[{"id":355,"damage":5}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_15","type":0,"input":[{"id":355},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_11_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":11}],"output":[{"id":355,"damage":4}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_15","type":0,"input":[{"id":355},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_12_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":12}],"output":[{"id":355,"damage":3}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_15","type":0,"input":[{"id":355},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_13_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":13}],"output":[{"id":355,"damage":2}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_15","type":0,"input":[{"id":355},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_14_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":14}],"output":[{"id":355,"damage":1}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_15_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":15}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_15","type":0,"input":[{"id":355},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_16_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":16}],"output":[{"id":355,"damage":15}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_15","type":0,"input":[{"id":355},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_17_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":17}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_15","type":0,"input":[{"id":355},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_18_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":18}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_19_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":19}],"output":[{"id":355}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_15","type":0,"input":[{"id":355},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_1_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":1}],"output":[{"id":355,"damage":14}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_15","type":0,"input":[{"id":355},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_2_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":2}],"output":[{"id":355,"damage":13}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_15","type":0,"input":[{"id":355},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_3_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":3}],"output":[{"id":355,"damage":12}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_15","type":0,"input":[{"id":355},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_4_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":4}],"output":[{"id":355,"damage":11}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_15","type":0,"input":[{"id":355},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_5_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":5}],"output":[{"id":355,"damage":10}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_15","type":0,"input":[{"id":355},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_6_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":6}],"output":[{"id":355,"damage":9}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_15","type":0,"input":[{"id":355},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_7_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":7}],"output":[{"id":355,"damage":8}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_15","type":0,"input":[{"id":355},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_8_9","type":0,"input":[{"id":355,"damage":6},{"id":351,"damage":8}],"output":[{"id":355,"damage":7}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_0","type":0,"input":[{"id":355,"damage":15},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_1","type":0,"input":[{"id":355,"damage":14},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_10","type":0,"input":[{"id":355,"damage":5},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_11","type":0,"input":[{"id":355,"damage":4},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_12","type":0,"input":[{"id":355,"damage":3},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_13","type":0,"input":[{"id":355,"damage":2},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_14","type":0,"input":[{"id":355,"damage":1},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_15","type":0,"input":[{"id":355},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_2","type":0,"input":[{"id":355,"damage":13},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_3","type":0,"input":[{"id":355,"damage":12},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_4","type":0,"input":[{"id":355,"damage":11},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_5","type":0,"input":[{"id":355,"damage":10},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_6","type":0,"input":[{"id":355,"damage":9},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_7","type":0,"input":[{"id":355,"damage":8},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"bed_dye_9_8","type":0,"input":[{"id":355,"damage":7},{"id":351,"damage":9}],"output":[{"id":355,"damage":6}],"block":"crafting_table","priority":50},{"id":"birch_stairs_birch_recipeId","type":1,"input":{"A":{"id":5,"damage":2}},"output":[{"id":135,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":50},{"type":4,"uuid":"d1ca6b84-338e-4f2f-9c6b-76cc8b4bd98d"},{"id":"chiseled_quartz_recipeId","type":1,"input":{"A":{"id":44,"damage":6}},"output":[{"id":155,"damage":1}],"shape":["A","A"],"block":"crafting_table","priority":50},{"id":"chiseled_stonebrick_recipeId","type":1,"input":{"A":{"id":44,"damage":5}},"output":[{"id":98,"damage":3}],"shape":["A","A"],"block":"crafting_table","priority":50},{"type":4,"uuid":"85939755-ba10-4d9d-a4cc-efb7a8e943c4"},{"id":"dark_oak_stairs_dark_oak_recipeId","type":1,"input":{"A":{"id":5,"damage":5}},"output":[{"id":164,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":50},{"type":4,"uuid":"d392b075-4ba1-40ae-8789-af868d56f6ce"},{"id":"heiroglyphs_redsandstone_recipeId","type":1,"input":{"A":{"id":182}},"output":[{"id":179,"damage":1}],"shape":["A","A"],"block":"crafting_table","priority":50},{"id":"heiroglyphs_sandstone_recipeId","type":1,"input":{"A":{"id":44,"damage":1}},"output":[{"id":24,"damage":1}],"shape":["A","A"],"block":"crafting_table","priority":50},{"id":"jungle_stairs_jungle_recipeId","type":1,"input":{"A":{"id":5,"damage":3}},"output":[{"id":136,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":50},{"id":"lines_purpur_recipeId","type":1,"input":{"A":{"id":182,"damage":1}},"output":[{"id":201,"damage":2}],"shape":["A","A"],"block":"crafting_table","priority":50},{"id":"loom_block_wood_planks_recipeId","type":1,"input":{"A":{"id":287,"damage":-1},"B":{"id":5,"damage":-1}},"output":[{"id":-204}],"shape":["AA","BB"],"block":"crafting_table","priority":50},{"id":"minecraft:acacia_boat","type":1,"input":{"A":{"id":5,"damage":4},"B":{"id":269}},"output":[{"id":333,"damage":4}],"shape":["ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_door","type":1,"input":{"A":{"id":5,"damage":4}},"output":[{"id":430,"count":3}],"shape":["AA","AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_fence","type":1,"input":{"A":{"id":5,"damage":4},"B":{"id":280,"damage":-1}},"output":[{"id":85,"damage":4,"count":3}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_fence_gate","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":4}},"output":[{"id":187}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_planks","type":1,"input":{"A":{"id":162}},"output":[{"id":5,"damage":4,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_planks_from_stripped","type":1,"input":{"A":{"id":-8,"damage":-1}},"output":[{"id":5,"damage":4,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_planks_from_stripped_wood","type":1,"input":{"A":{"id":-212,"damage":12}},"output":[{"id":5,"damage":4,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_planks_from_wood","type":1,"input":{"A":{"id":-212,"damage":4}},"output":[{"id":5,"damage":4,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_stairs","type":1,"input":{"A":{"id":5,"damage":4}},"output":[{"id":163,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_wood","type":1,"input":{"A":{"id":162}},"output":[{"id":-212,"damage":4,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_wood_stripped","type":1,"input":{"A":{"id":-8,"damage":-1}},"output":[{"id":-212,"damage":12,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:acacia_wooden_slab","type":1,"input":{"A":{"id":5,"damage":4}},"output":[{"id":158,"damage":4,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:activator_rail","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":76,"damage":-1}},"output":[{"id":126,"count":6}],"shape":["ABA","ACA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:andesite","type":0,"input":[{"id":1,"damage":3},{"id":4,"damage":-1}],"output":[{"id":1,"damage":5,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:andesite_stairs","type":1,"input":{"A":{"id":1,"damage":5}},"output":[{"id":-171,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:andesite_wall","type":1,"input":{"A":{"id":1,"damage":5}},"output":[{"id":139,"damage":4,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:anvil","type":1,"input":{"A":{"id":42,"damage":-1},"B":{"id":265,"damage":-1}},"output":[{"id":145}],"shape":["AAA"," B ","BBB"],"block":"crafting_table","priority":0},{"id":"minecraft:armor_stand","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":44}},"output":[{"id":425}],"shape":["AAA"," A ","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:arrow","type":1,"input":{"A":{"id":318,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":288,"damage":-1}},"output":[{"id":262,"count":4}],"shape":["A","B","C"],"block":"crafting_table","priority":0},{"id":"minecraft:banner_pattern_bricks","type":0,"input":[{"id":339,"damage":-1},{"id":45,"damage":-1}],"output":[{"id":434,"damage":4}],"block":"crafting_table","priority":0},{"id":"minecraft:banner_pattern_creeper","type":0,"input":[{"id":339,"damage":-1},{"id":397,"damage":4}],"output":[{"id":434}],"block":"crafting_table","priority":0},{"id":"minecraft:banner_pattern_flower","type":0,"input":[{"id":339,"damage":-1},{"id":38,"damage":8}],"output":[{"id":434,"damage":2}],"block":"crafting_table","priority":0},{"id":"minecraft:banner_pattern_skull","type":0,"input":[{"id":339,"damage":-1},{"id":397,"damage":1}],"output":[{"id":434,"damage":1}],"block":"crafting_table","priority":0},{"id":"minecraft:banner_pattern_thing","type":0,"input":[{"id":339,"damage":-1},{"id":466,"damage":-1}],"output":[{"id":434,"damage":3}],"block":"crafting_table","priority":0},{"id":"minecraft:banner_pattern_vines","type":0,"input":[{"id":339,"damage":-1},{"id":106,"damage":-1}],"output":[{"id":434,"damage":5}],"block":"crafting_table","priority":0},{"id":"minecraft:barrel","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":158,"damage":-1}},"output":[{"id":-203}],"shape":["ABA","A A","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:basic_map_to_enhanced","type":0,"input":[{"id":395,"damage":1},{"id":345,"damage":-1}],"output":[{"id":395,"damage":2}],"block":"crafting_table","priority":0},{"id":"minecraft:beacon","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":399,"damage":-1},"C":{"id":49,"damage":-1}},"output":[{"id":138}],"shape":["AAA","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:beetroot_soup","type":0,"input":[{"id":281,"damage":-1},{"id":457,"damage":-1},{"id":457,"damage":-1},{"id":457,"damage":-1},{"id":457,"damage":-1},{"id":457,"damage":-1},{"id":457,"damage":-1}],"output":[{"id":459}],"block":"crafting_table","priority":0},{"id":"minecraft:birch_boat","type":1,"input":{"A":{"id":5,"damage":2},"B":{"id":269}},"output":[{"id":333,"damage":2}],"shape":["ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_door","type":1,"input":{"A":{"id":5,"damage":2}},"output":[{"id":428,"count":3}],"shape":["AA","AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_fence","type":1,"input":{"A":{"id":5,"damage":2},"B":{"id":280,"damage":-1}},"output":[{"id":85,"damage":2,"count":3}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_fence_gate","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":2}},"output":[{"id":184}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_planks","type":1,"input":{"A":{"id":17,"damage":2}},"output":[{"id":5,"damage":2,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_planks_from_stripped","type":1,"input":{"A":{"id":-6,"damage":-1}},"output":[{"id":5,"damage":2,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_planks_from_stripped_wood","type":1,"input":{"A":{"id":-212,"damage":10}},"output":[{"id":5,"damage":2,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_planks_from_wood","type":1,"input":{"A":{"id":-212,"damage":2}},"output":[{"id":5,"damage":2,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_stairs","type":1,"input":{"A":{"id":5,"damage":2}},"output":[{"id":135,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_wood","type":1,"input":{"A":{"id":17,"damage":2}},"output":[{"id":-212,"damage":2,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_wood_stripped","type":1,"input":{"A":{"id":-6,"damage":-1}},"output":[{"id":-212,"damage":10,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:birch_wooden_slab","type":1,"input":{"A":{"id":5,"damage":2}},"output":[{"id":158,"damage":2,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:black_banner","type":1,"input":{"A":{"id":35,"damage":15},"B":{"id":280,"damage":-1}},"output":[{"id":446}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:black_carpet","type":1,"input":{"A":{"id":35,"damage":15}},"output":[{"id":171,"damage":15,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:black_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":16}},"output":[{"id":171,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:black_concrete_powder","type":0,"input":[{"id":351,"damage":16},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":15,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:black_concrete_powder_from_ink_sac","type":0,"input":[{"id":351},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":15,"count":8}],"block":"crafting_table","priority":1},{"id":"minecraft:black_dye_from_ink_sac","type":0,"input":[{"id":351}],"output":[{"id":351,"damage":16}],"block":"crafting_table","priority":0},{"id":"minecraft:black_dye_from_wither_rose","type":0,"input":[{"id":-216,"damage":-1}],"output":[{"id":351,"damage":16}],"block":"crafting_table","priority":0},{"id":"minecraft:black_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":16}},"output":[{"id":241,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:black_stained_glass_from_ink_sac","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351}},"output":[{"id":241,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:black_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":15}},"output":[{"id":160,"damage":15,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:black_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":16}},"output":[{"id":160,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:black_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":16}},"output":[{"id":159,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:black_stained_hardened_clay_from_ink_sac","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351}},"output":[{"id":159,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:blast_furnace","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":61,"damage":-1},"C":{"id":-183,"damage":-1}},"output":[{"id":-196}],"shape":["AAA","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:blaze_powder","type":0,"input":[{"id":369,"damage":-1}],"output":[{"id":377,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:blue_banner","type":1,"input":{"A":{"id":35,"damage":11},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":4}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:blue_carpet","type":1,"input":{"A":{"id":35,"damage":11}},"output":[{"id":171,"damage":11,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:blue_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":18}},"output":[{"id":171,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:blue_concrete_powder","type":0,"input":[{"id":351,"damage":18},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":11,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:blue_concrete_powder_from_lapis_lazuli","type":0,"input":[{"id":351,"damage":4},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":11,"count":8}],"block":"crafting_table","priority":1},{"id":"minecraft:blue_dye_from_cornflower","type":0,"input":[{"id":38,"damage":9}],"output":[{"id":351,"damage":18}],"block":"crafting_table","priority":0},{"id":"minecraft:blue_dye_from_lapis_lazuli","type":0,"input":[{"id":351,"damage":4}],"output":[{"id":351,"damage":18}],"block":"crafting_table","priority":0},{"id":"minecraft:blue_ice","type":1,"input":{"A":{"id":174,"damage":-1}},"output":[{"id":-11}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:blue_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":18}},"output":[{"id":241,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:blue_stained_glass_from_lapis_lazuli","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":4}},"output":[{"id":241,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:blue_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":11}},"output":[{"id":160,"damage":11,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:blue_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":18}},"output":[{"id":160,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:blue_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":18}},"output":[{"id":159,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:blue_stained_hardened_clay_from_lapis_lazuli","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":4}},"output":[{"id":159,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:boat","type":1,"input":{"A":{"id":5},"B":{"id":269}},"output":[{"id":333}],"shape":["ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:bone_block","type":1,"input":{"A":{"id":351,"damage":15}},"output":[{"id":216}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:bone_meal_from_block","type":0,"input":[{"id":216,"damage":-1}],"output":[{"id":351,"damage":15,"count":9}],"block":"crafting_table","priority":0},{"id":"minecraft:bone_meal_from_bone","type":0,"input":[{"id":352,"damage":-1}],"output":[{"id":351,"damage":15,"count":3}],"block":"crafting_table","priority":0},{"id":"minecraft:book","type":0,"input":[{"id":339},{"id":339},{"id":339},{"id":334}],"output":[{"id":340}],"block":"crafting_table","priority":0},{"id":"minecraft:bow","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":287,"damage":-1}},"output":[{"id":261}],"shape":[" AB","A B"," AB"],"block":"crafting_table","priority":0},{"id":"minecraft:bread","type":1,"input":{"A":{"id":296,"damage":-1}},"output":[{"id":297}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:brewing_stand","type":1,"input":{"A":{"id":369,"damage":-1},"B":{"id":4,"damage":-1}},"output":[{"id":379}],"shape":[" A ","BBB"],"block":"crafting_table","priority":0},{"id":"minecraft:brick_block","type":1,"input":{"A":{"id":336,"damage":-1}},"output":[{"id":45}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:brick_stairs","type":1,"input":{"A":{"id":45,"damage":-1}},"output":[{"id":108,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:brick_wall","type":1,"input":{"A":{"id":45,"damage":-1}},"output":[{"id":139,"damage":6,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:brown_banner","type":1,"input":{"A":{"id":35,"damage":12},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":3}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:brown_carpet","type":1,"input":{"A":{"id":35,"damage":12}},"output":[{"id":171,"damage":12,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:brown_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":17}},"output":[{"id":171,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:brown_concrete_powder","type":0,"input":[{"id":351,"damage":17},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":12,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:brown_concrete_powder_from_cocoa_beans","type":0,"input":[{"id":351,"damage":3},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":12,"count":8}],"block":"crafting_table","priority":1},{"id":"minecraft:brown_dye_from_cocoa_beans","type":0,"input":[{"id":351,"damage":3}],"output":[{"id":351,"damage":17}],"block":"crafting_table","priority":0},{"id":"minecraft:brown_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":17}},"output":[{"id":241,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:brown_stained_glass_from_cocoa_beans","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":3}},"output":[{"id":241,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:brown_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":12}},"output":[{"id":160,"damage":12,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:brown_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":17}},"output":[{"id":160,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:brown_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":17}},"output":[{"id":159,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:brown_stained_hardened_clay_from_cocoa_beans","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":3}},"output":[{"id":159,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:bucket","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":325}],"shape":["A A"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:cake","type":1,"input":{"A":{"id":325,"damage":1},"B":{"id":353,"damage":-1},"C":{"id":344,"damage":-1},"D":{"id":296,"damage":-1}},"output":[{"id":354},{"id":325,"count":3}],"shape":["AAA","BCB","DDD"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":17,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire_from_log2","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":162,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire_from_stripped_acacia_log","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":-8,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire_from_stripped_birch_log","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":-6,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire_from_stripped_dark_oak_log","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":-9,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire_from_stripped_jungle_log","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":-7,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire_from_stripped_oak_log","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":-10,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire_from_stripped_spruce_log","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":-5,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:campfire_from_wood","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":263,"damage":-1},"C":{"id":-212,"damage":-1}},"output":[{"id":720}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:carrot_on_a_stick","type":1,"input":{"A":{"id":346},"B":{"id":391,"damage":-1}},"output":[{"id":398}],"shape":["A "," B"],"block":"crafting_table","priority":0},{"id":"minecraft:cartography_table","type":1,"input":{"A":{"id":339,"damage":-1},"B":{"id":5,"damage":-1}},"output":[{"id":-200}],"shape":["AA","BB","BB"],"block":"crafting_table","priority":0},{"id":"minecraft:cauldron","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":380}],"shape":["A A","A A","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:chest_minecart","type":1,"input":{"A":{"id":54,"damage":-1},"B":{"id":328,"damage":-1}},"output":[{"id":342}],"shape":["A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:clay","type":1,"input":{"A":{"id":337,"damage":-1}},"output":[{"id":82}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:clock","type":1,"input":{"A":{"id":266,"damage":-1},"B":{"id":331,"damage":-1}},"output":[{"id":347}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:coal","type":1,"input":{"A":{"id":173,"damage":-1}},"output":[{"id":263,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:coal_block","type":1,"input":{"A":{"id":263}},"output":[{"id":173}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:coarse_dirt","type":1,"input":{"A":{"id":3},"B":{"id":13,"damage":-1}},"output":[{"id":3,"damage":1,"count":4}],"shape":["AB","BA"],"block":"crafting_table","priority":0},{"id":"minecraft:cobblestone_stairs","type":1,"input":{"A":{"id":4,"damage":-1}},"output":[{"id":67,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:cobblestone_wall","type":1,"input":{"A":{"id":4,"damage":-1}},"output":[{"id":139,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:cobweb_to_string","type":0,"input":[{"id":30,"damage":-1}],"output":[{"id":287,"count":9}],"block":"crafting_table","priority":0},{"id":"minecraft:comparator","type":1,"input":{"A":{"id":76,"damage":-1},"B":{"id":406,"damage":-1},"C":{"id":1}},"output":[{"id":404}],"shape":[" A ","ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:compass","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":331,"damage":-1}},"output":[{"id":345}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:composter","type":1,"input":{"A":{"id":158,"damage":-1}},"output":[{"id":-213}],"shape":["A A","A A","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:conduit","type":1,"input":{"A":{"id":465,"damage":-1},"B":{"id":467,"damage":-1}},"output":[{"id":-157}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:cookie","type":1,"input":{"A":{"id":296,"damage":-1},"B":{"id":351,"damage":3}},"output":[{"id":357,"count":8}],"shape":["ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:crossbow","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":265,"damage":-1},"C":{"id":287,"damage":-1},"D":{"id":131,"damage":-1}},"output":[{"id":471}],"shape":["ABA","CDC"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_banner","type":1,"input":{"A":{"id":35,"damage":9},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":6}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_carpet","type":1,"input":{"A":{"id":35,"damage":9}},"output":[{"id":171,"damage":9,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":6}},"output":[{"id":171,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_concrete_powder","type":0,"input":[{"id":351,"damage":6},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":9,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_dye","type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":2}],"output":[{"id":351,"damage":6,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_dye_from_lapis_lazuli","type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":2}],"output":[{"id":351,"damage":6,"count":2}],"block":"crafting_table","priority":1},{"id":"minecraft:cyan_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":6}},"output":[{"id":241,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":9}},"output":[{"id":160,"damage":9,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":6}},"output":[{"id":160,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:cyan_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":6}},"output":[{"id":159,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_boat","type":1,"input":{"A":{"id":5,"damage":5},"B":{"id":269}},"output":[{"id":333,"damage":5}],"shape":["ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_door","type":1,"input":{"A":{"id":5,"damage":5}},"output":[{"id":431,"count":3}],"shape":["AA","AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_fence","type":1,"input":{"A":{"id":5,"damage":5},"B":{"id":280,"damage":-1}},"output":[{"id":85,"damage":5,"count":3}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_fence_gate","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":5}},"output":[{"id":186}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_planks","type":1,"input":{"A":{"id":162,"damage":1}},"output":[{"id":5,"damage":5,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_planks_from_stripped","type":1,"input":{"A":{"id":-9,"damage":-1}},"output":[{"id":5,"damage":5,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_planks_from_stripped_wood","type":1,"input":{"A":{"id":-212,"damage":13}},"output":[{"id":5,"damage":5,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_planks_from_wood","type":1,"input":{"A":{"id":-212,"damage":5}},"output":[{"id":5,"damage":5,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_stairs","type":1,"input":{"A":{"id":5,"damage":5}},"output":[{"id":164,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_wood","type":1,"input":{"A":{"id":162,"damage":1}},"output":[{"id":-212,"damage":5,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_wood_stripped","type":1,"input":{"A":{"id":-9,"damage":-1}},"output":[{"id":-212,"damage":13,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_oak_wooden_slab","type":1,"input":{"A":{"id":5,"damage":5}},"output":[{"id":158,"damage":5,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_prismarine","type":1,"input":{"A":{"id":409,"damage":-1},"B":{"id":351,"damage":16}},"output":[{"id":168,"damage":1}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:dark_prismarine_from_ink_sac","type":1,"input":{"A":{"id":409,"damage":-1},"B":{"id":351}},"output":[{"id":168,"damage":1}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:detector_rail","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":70,"damage":-1},"C":{"id":331,"damage":-1}},"output":[{"id":28,"count":6}],"shape":["A A","ABA","ACA"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond","type":1,"input":{"A":{"id":57,"damage":-1}},"output":[{"id":264,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_axe","type":1,"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":279}],"shape":["AA","AB"," B"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_block","type":1,"input":{"A":{"id":264,"damage":-1}},"output":[{"id":57}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_boots","type":1,"input":{"A":{"id":264,"damage":-1}},"output":[{"id":313}],"shape":["A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_chestplate","type":1,"input":{"A":{"id":264,"damage":-1}},"output":[{"id":311}],"shape":["A A","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_helmet","type":1,"input":{"A":{"id":264,"damage":-1}},"output":[{"id":310}],"shape":["AAA","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_hoe","type":1,"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":293}],"shape":["AA"," B"," B"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_leggings","type":1,"input":{"A":{"id":264,"damage":-1}},"output":[{"id":312}],"shape":["AAA","A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_pickaxe","type":1,"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":278}],"shape":["AAA"," B "," B "],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_shovel","type":1,"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":277}],"shape":["A","B","B"],"block":"crafting_table","priority":0},{"id":"minecraft:diamond_sword","type":1,"input":{"A":{"id":264,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":276}],"shape":["A","A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:diorite","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":406,"damage":-1}},"output":[{"id":1,"damage":3,"count":2}],"shape":["AB","BA"],"block":"crafting_table","priority":0},{"id":"minecraft:diorite_stairs","type":1,"input":{"A":{"id":1,"damage":3}},"output":[{"id":-170,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:diorite_wall","type":1,"input":{"A":{"id":1,"damage":3}},"output":[{"id":139,"damage":3,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:dispenser","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":261},"C":{"id":331,"damage":-1}},"output":[{"id":23,"damage":3}],"shape":["AAA","ABA","ACA"],"block":"crafting_table","priority":0},{"id":"minecraft:dried_kelp","type":1,"input":{"A":{"id":-139,"damage":-1}},"output":[{"id":464,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:dried_kelp_block","type":1,"input":{"A":{"id":464,"damage":-1}},"output":[{"id":-139}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:dropper","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":331,"damage":-1}},"output":[{"id":125,"damage":3}],"shape":["AAA","A A","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:emerald","type":1,"input":{"A":{"id":133,"damage":-1}},"output":[{"id":388,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:emerald_block","type":1,"input":{"A":{"id":388,"damage":-1}},"output":[{"id":133}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:empty_map_to_enhanced","type":0,"input":[{"id":395},{"id":345,"damage":-1}],"output":[{"id":395,"damage":2}],"block":"crafting_table","priority":0},{"id":"minecraft:enchanting_table","type":1,"input":{"A":{"id":340,"damage":-1},"B":{"id":264,"damage":-1},"C":{"id":49,"damage":-1}},"output":[{"id":116}],"shape":[" A ","BCB","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:end_brick_stairs","type":1,"input":{"A":{"id":206,"damage":-1}},"output":[{"id":-178,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:end_brick_wall","type":1,"input":{"A":{"id":206,"damage":-1}},"output":[{"id":139,"damage":10,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:end_bricks","type":1,"input":{"A":{"id":121,"damage":-1}},"output":[{"id":206,"count":4}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:end_crystal","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":381,"damage":-1},"C":{"id":370,"damage":-1}},"output":[{"id":426}],"shape":["AAA","ABA","ACA"],"block":"crafting_table","priority":0},{"id":"minecraft:end_rod","type":1,"input":{"A":{"id":369,"damage":-1},"B":{"id":433,"damage":-1}},"output":[{"id":208,"count":4}],"shape":["A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:ender_chest","type":1,"input":{"A":{"id":49,"damage":-1},"B":{"id":381,"damage":-1}},"output":[{"id":130}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:ender_eye","type":0,"input":[{"id":368,"damage":-1},{"id":377,"damage":-1}],"output":[{"id":381}],"block":"crafting_table","priority":0},{"id":"minecraft:fence","type":1,"input":{"A":{"id":5},"B":{"id":280,"damage":-1}},"output":[{"id":85,"count":3}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:fence_gate","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":5}},"output":[{"id":107}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:fermented_spider_eye","type":0,"input":[{"id":375,"damage":-1},{"id":39,"damage":-1},{"id":353,"damage":-1}],"output":[{"id":376}],"block":"crafting_table","priority":0},{"id":"minecraft:fishing_rod","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":287,"damage":-1}},"output":[{"id":346}],"shape":[" A"," AB","A B"],"block":"crafting_table","priority":0},{"id":"minecraft:fletching_table","type":1,"input":{"A":{"id":318,"damage":-1},"B":{"id":5,"damage":-1}},"output":[{"id":-201}],"shape":["AA","BB","BB"],"block":"crafting_table","priority":0},{"id":"minecraft:flint_and_steel","type":0,"input":[{"id":265,"damage":-1},{"id":318,"damage":-1}],"output":[{"id":259}],"block":"crafting_table","priority":0},{"id":"minecraft:flower_pot","type":1,"input":{"A":{"id":336,"damage":-1}},"output":[{"id":390}],"shape":["A A"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:furnace","type":1,"input":{"A":{"id":4,"damage":-1}},"output":[{"id":61}],"shape":["AAA","A A","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:glass_bottle","type":1,"input":{"A":{"id":20,"damage":-1}},"output":[{"id":374,"count":3}],"shape":["A A"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:glass_pane","type":1,"input":{"A":{"id":20,"damage":-1}},"output":[{"id":102,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:glowstone","type":1,"input":{"A":{"id":348,"damage":-1}},"output":[{"id":89}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:gold_block","type":1,"input":{"A":{"id":266,"damage":-1}},"output":[{"id":41}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:gold_ingot_from_block","type":1,"input":{"A":{"id":41,"damage":-1}},"output":[{"id":266,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:gold_ingot_from_nuggets","type":1,"input":{"A":{"id":371,"damage":-1}},"output":[{"id":266}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:gold_nugget","type":1,"input":{"A":{"id":266,"damage":-1}},"output":[{"id":371,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_apple","type":1,"input":{"A":{"id":266,"damage":-1},"B":{"id":260,"damage":-1}},"output":[{"id":322}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_axe","type":1,"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":286}],"shape":["AA","AB"," B"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_boots","type":1,"input":{"A":{"id":266,"damage":-1}},"output":[{"id":317}],"shape":["A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_carrot","type":1,"input":{"A":{"id":371,"damage":-1},"B":{"id":391,"damage":-1}},"output":[{"id":396}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_chestplate","type":1,"input":{"A":{"id":266,"damage":-1}},"output":[{"id":315}],"shape":["A A","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_helmet","type":1,"input":{"A":{"id":266,"damage":-1}},"output":[{"id":314}],"shape":["AAA","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_hoe","type":1,"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":294}],"shape":["AA"," B"," B"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_leggings","type":1,"input":{"A":{"id":266,"damage":-1}},"output":[{"id":316}],"shape":["AAA","A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_pickaxe","type":1,"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":285}],"shape":["AAA"," B "," B "],"block":"crafting_table","priority":0},{"id":"minecraft:golden_rail","type":1,"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1},"C":{"id":331,"damage":-1}},"output":[{"id":27,"count":6}],"shape":["A A","ABA","ACA"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_shovel","type":1,"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":284}],"shape":["A","B","B"],"block":"crafting_table","priority":0},{"id":"minecraft:golden_sword","type":1,"input":{"A":{"id":266,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":283}],"shape":["A","A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:granite","type":0,"input":[{"id":1,"damage":3},{"id":406,"damage":-1}],"output":[{"id":1,"damage":1}],"block":"crafting_table","priority":0},{"id":"minecraft:granite_stairs","type":1,"input":{"A":{"id":1,"damage":1}},"output":[{"id":-169,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:granite_wall","type":1,"input":{"A":{"id":1,"damage":1}},"output":[{"id":139,"damage":2,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:gray_banner","type":1,"input":{"A":{"id":35,"damage":7},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":8}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:gray_carpet","type":1,"input":{"A":{"id":35,"damage":7}},"output":[{"id":171,"damage":7,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:gray_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":8}},"output":[{"id":171,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:gray_concrete_powder","type":0,"input":[{"id":351,"damage":8},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":7,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:gray_dye","type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":19}],"output":[{"id":351,"damage":8,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:gray_dye_from_black_bonemeal","type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":15}],"output":[{"id":351,"damage":8,"count":2}],"block":"crafting_table","priority":1},{"id":"minecraft:gray_dye_from_ink_bonemeal","type":0,"input":[{"id":351},{"id":351,"damage":15}],"output":[{"id":351,"damage":8,"count":2}],"block":"crafting_table","priority":3},{"id":"minecraft:gray_dye_from_ink_white","type":0,"input":[{"id":351},{"id":351,"damage":19}],"output":[{"id":351,"damage":8,"count":2}],"block":"crafting_table","priority":2},{"id":"minecraft:gray_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":8}},"output":[{"id":241,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:gray_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":7}},"output":[{"id":160,"damage":7,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:gray_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":8}},"output":[{"id":160,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:gray_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":8}},"output":[{"id":159,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:green_banner","type":1,"input":{"A":{"id":35,"damage":13},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":2}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:green_carpet","type":1,"input":{"A":{"id":35,"damage":13}},"output":[{"id":171,"damage":13,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:green_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":2}},"output":[{"id":171,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:green_concrete_powder","type":0,"input":[{"id":351,"damage":2},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":13,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:green_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":2}},"output":[{"id":241,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:green_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":13}},"output":[{"id":160,"damage":13,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:green_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":2}},"output":[{"id":160,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:green_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":2}},"output":[{"id":159,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:grindstone","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":-166,"damage":2},"C":{"id":5,"damage":-1}},"output":[{"id":-195}],"shape":["ABA","C C"],"block":"crafting_table","priority":0},{"id":"minecraft:hay_block","type":1,"input":{"A":{"id":296,"damage":-1}},"output":[{"id":170}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:heavy_weighted_pressure_plate","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":148}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:hopper","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":54,"damage":-1}},"output":[{"id":410}],"shape":["A A","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:hopper_minecart","type":1,"input":{"A":{"id":410,"damage":-1},"B":{"id":328,"damage":-1}},"output":[{"id":408}],"shape":["A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_axe","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":258}],"shape":["AA","AB"," B"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_bars","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":101,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_block","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":42}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_boots","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":309}],"shape":["A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_chestplate","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":307}],"shape":["A A","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_door","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":330,"count":3}],"shape":["AA","AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_helmet","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":306}],"shape":["AAA","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_hoe","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":292}],"shape":["AA"," B"," B"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_ingot_from_block","type":1,"input":{"A":{"id":42,"damage":-1}},"output":[{"id":265,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_ingot_from_nuggets","type":1,"input":{"A":{"id":452,"damage":-1}},"output":[{"id":265}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_leggings","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":308}],"shape":["AAA","A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_nugget","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":452,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_pickaxe","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":257}],"shape":["AAA"," B "," B "],"block":"crafting_table","priority":0},{"id":"minecraft:iron_shovel","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":256}],"shape":["A","B","B"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_sword","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":267}],"shape":["A","A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:iron_trapdoor","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":167}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:item_frame","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":334,"damage":-1}},"output":[{"id":389}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_boat","type":1,"input":{"A":{"id":5,"damage":3},"B":{"id":269}},"output":[{"id":333,"damage":3}],"shape":["ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_door","type":1,"input":{"A":{"id":5,"damage":3}},"output":[{"id":429,"count":3}],"shape":["AA","AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_fence","type":1,"input":{"A":{"id":5,"damage":3},"B":{"id":280,"damage":-1}},"output":[{"id":85,"damage":3,"count":3}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_fence_gate","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":3}},"output":[{"id":185}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_planks","type":1,"input":{"A":{"id":17,"damage":3}},"output":[{"id":5,"damage":3,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_planks_from_stripped","type":1,"input":{"A":{"id":-7,"damage":-1}},"output":[{"id":5,"damage":3,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_planks_from_stripped_wood","type":1,"input":{"A":{"id":-212,"damage":11}},"output":[{"id":5,"damage":3,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_planks_from_wood","type":1,"input":{"A":{"id":-212,"damage":3}},"output":[{"id":5,"damage":3,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_stairs","type":1,"input":{"A":{"id":5,"damage":3}},"output":[{"id":136,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_wood","type":1,"input":{"A":{"id":17,"damage":3}},"output":[{"id":-212,"damage":3,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_wood_stripped","type":1,"input":{"A":{"id":-7,"damage":-1}},"output":[{"id":-212,"damage":11,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:jungle_wooden_slab","type":1,"input":{"A":{"id":5,"damage":3}},"output":[{"id":158,"damage":3,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:ladder","type":1,"input":{"A":{"id":280,"damage":-1}},"output":[{"id":65,"count":3}],"shape":["A A","AAA","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:lantern","type":1,"input":{"A":{"id":452,"damage":-1},"B":{"id":50,"damage":-1}},"output":[{"id":-208}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:lapis_block","type":1,"input":{"A":{"id":351,"damage":4}},"output":[{"id":22}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:lapis_lazuli","type":1,"input":{"A":{"id":22,"damage":-1}},"output":[{"id":351,"damage":4,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:lead","type":1,"input":{"A":{"id":287,"damage":-1},"B":{"id":341,"damage":-1}},"output":[{"id":420,"count":2}],"shape":["AA ","AB "," A"],"block":"crafting_table","priority":0},{"id":"minecraft:leather","type":1,"input":{"A":{"id":415,"damage":-1}},"output":[{"id":334}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:leather_boots","type":1,"input":{"A":{"id":334,"damage":-1}},"output":[{"id":301}],"shape":["A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:leather_chestplate","type":1,"input":{"A":{"id":334,"damage":-1}},"output":[{"id":299}],"shape":["A A","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:leather_helmet","type":1,"input":{"A":{"id":334,"damage":-1}},"output":[{"id":298}],"shape":["AAA","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:leather_horse_armor","type":1,"input":{"A":{"id":334,"damage":-1}},"output":[{"id":416}],"shape":["A A","AAA","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:leather_leggings","type":1,"input":{"A":{"id":334,"damage":-1}},"output":[{"id":300}],"shape":["AAA","A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:lectern","type":1,"input":{"A":{"id":158,"damage":-1},"B":{"id":47,"damage":-1}},"output":[{"id":-194}],"shape":["AAA"," B "," A "],"block":"crafting_table","priority":0},{"id":"minecraft:lever","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":4,"damage":-1}},"output":[{"id":69}],"shape":["A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_banner","type":1,"input":{"A":{"id":35,"damage":3},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":12}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_carpet","type":1,"input":{"A":{"id":35,"damage":3}},"output":[{"id":171,"damage":3,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":12}},"output":[{"id":171,"damage":3,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_concrete_powder","type":0,"input":[{"id":351,"damage":12},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":3,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_dye","type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":19}],"output":[{"id":351,"damage":12,"count":2}],"block":"crafting_table","priority":1},{"id":"minecraft:light_blue_dye_from_blue_bonemeal","type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":15}],"output":[{"id":351,"damage":12,"count":2}],"block":"crafting_table","priority":2},{"id":"minecraft:light_blue_dye_from_blue_orchid","type":0,"input":[{"id":38,"damage":1}],"output":[{"id":351,"damage":12}],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_dye_from_lapis_bonemeal","type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":15}],"output":[{"id":351,"damage":12,"count":2}],"block":"crafting_table","priority":4},{"id":"minecraft:light_blue_dye_from_lapis_white","type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":19}],"output":[{"id":351,"damage":12,"count":2}],"block":"crafting_table","priority":3},{"id":"minecraft:light_blue_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":12}},"output":[{"id":241,"damage":3,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":3}},"output":[{"id":160,"damage":3,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":12}},"output":[{"id":160,"damage":3,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_blue_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":12}},"output":[{"id":159,"damage":3,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray__carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":7}},"output":[{"id":171,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray_banner","type":1,"input":{"A":{"id":35,"damage":8},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":7}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray_carpet","type":1,"input":{"A":{"id":35,"damage":8}},"output":[{"id":171,"damage":8,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray_concrete_powder","type":0,"input":[{"id":351,"damage":7},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":8,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray_dye","type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":19},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":3}],"block":"crafting_table","priority":3},{"id":"minecraft:light_gray_dye_from_azure_bluet","type":0,"input":[{"id":38,"damage":3}],"output":[{"id":351,"damage":7}],"block":"crafting_table","priority":2},{"id":"minecraft:light_gray_dye_from_black_bonemeal","type":0,"input":[{"id":351,"damage":16},{"id":351,"damage":15},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":3}],"block":"crafting_table","priority":7},{"id":"minecraft:light_gray_dye_from_gray_bonemeal","type":0,"input":[{"id":351,"damage":8},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":2}],"block":"crafting_table","priority":6},{"id":"minecraft:light_gray_dye_from_gray_white","type":0,"input":[{"id":351,"damage":8},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":2}],"block":"crafting_table","priority":4},{"id":"minecraft:light_gray_dye_from_ink_bonemeal","type":0,"input":[{"id":351},{"id":351,"damage":15},{"id":351,"damage":15}],"output":[{"id":351,"damage":7,"count":3}],"block":"crafting_table","priority":8},{"id":"minecraft:light_gray_dye_from_ink_white","type":0,"input":[{"id":351},{"id":351,"damage":19},{"id":351,"damage":19}],"output":[{"id":351,"damage":7,"count":3}],"block":"crafting_table","priority":5},{"id":"minecraft:light_gray_dye_from_oxeye_daisy","type":0,"input":[{"id":38,"damage":8}],"output":[{"id":351,"damage":7}],"block":"crafting_table","priority":1},{"id":"minecraft:light_gray_dye_from_white_tulip","type":0,"input":[{"id":38,"damage":6}],"output":[{"id":351,"damage":7}],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":7}},"output":[{"id":241,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":8}},"output":[{"id":160,"damage":8,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":7}},"output":[{"id":160,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_gray_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":7}},"output":[{"id":159,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:light_weighted_pressure_plate","type":1,"input":{"A":{"id":266,"damage":-1}},"output":[{"id":147}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:lime__carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":10}},"output":[{"id":171,"damage":5,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:lime_banner","type":1,"input":{"A":{"id":35,"damage":5},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":10}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:lime_carpet","type":1,"input":{"A":{"id":35,"damage":5}},"output":[{"id":171,"damage":5,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:lime_concrete_powder","type":0,"input":[{"id":351,"damage":10},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":5,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:lime_dye","type":0,"input":[{"id":351,"damage":2},{"id":351,"damage":19}],"output":[{"id":351,"damage":10,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:lime_dye_from_bonemeal","type":0,"input":[{"id":351,"damage":2},{"id":351,"damage":15}],"output":[{"id":351,"damage":10,"count":2}],"block":"crafting_table","priority":1},{"id":"minecraft:lime_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":10}},"output":[{"id":241,"damage":5,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:lime_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":5}},"output":[{"id":160,"damage":5,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:lime_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":10}},"output":[{"id":160,"damage":5,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:lime_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":10}},"output":[{"id":159,"damage":5,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:lit_pumpkin","type":1,"input":{"A":{"id":-155,"damage":-1},"B":{"id":50,"damage":-1}},"output":[{"id":91}],"shape":["A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:locator_map","type":1,"input":{"A":{"id":339,"damage":-1},"B":{"id":345,"damage":-1}},"output":[{"id":395,"damage":2}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_banner","type":1,"input":{"A":{"id":35,"damage":2},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":13}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_carpet","type":1,"input":{"A":{"id":35,"damage":2}},"output":[{"id":171,"damage":2,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":13}},"output":[{"id":171,"damage":2,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_concrete_powder","type":0,"input":[{"id":351,"damage":13},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":2,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_dye","type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":3}],"block":"crafting_table","priority":2},{"id":"minecraft:magenta_dye_from_allium","type":0,"input":[{"id":38,"damage":2}],"output":[{"id":351,"damage":13}],"block":"crafting_table","priority":1},{"id":"minecraft:magenta_dye_from_blue_ink_bonemeal","type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":13,"count":4}],"block":"crafting_table","priority":6},{"id":"minecraft:magenta_dye_from_blue_ink_white","type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":13,"count":4}],"block":"crafting_table","priority":4},{"id":"minecraft:magenta_dye_from_lapis_ink_bonemeal","type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":13,"count":4}],"block":"crafting_table","priority":8},{"id":"minecraft:magenta_dye_from_lapis_ink_white","type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":13,"count":4}],"block":"crafting_table","priority":7},{"id":"minecraft:magenta_dye_from_lapis_red_pink","type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":3}],"block":"crafting_table","priority":5},{"id":"minecraft:magenta_dye_from_lilac","type":0,"input":[{"id":175,"damage":1}],"output":[{"id":351,"damage":13,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_dye_from_purple_and_pink","type":0,"input":[{"id":351,"damage":5},{"id":351,"damage":9}],"output":[{"id":351,"damage":13,"count":2}],"block":"crafting_table","priority":3},{"id":"minecraft:magenta_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":13}},"output":[{"id":241,"damage":2,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":2}},"output":[{"id":160,"damage":2,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":13}},"output":[{"id":160,"damage":2,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:magenta_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":13}},"output":[{"id":159,"damage":2,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:magma","type":1,"input":{"A":{"id":378,"damage":-1}},"output":[{"id":213}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:magma_cream","type":0,"input":[{"id":377,"damage":-1},{"id":341,"damage":-1}],"output":[{"id":378}],"block":"crafting_table","priority":0},{"id":"minecraft:map","type":1,"input":{"A":{"id":339,"damage":-1}},"output":[{"id":395}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:melon_block","type":1,"input":{"A":{"id":360,"damage":-1}},"output":[{"id":103}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:melon_seeds","type":1,"input":{"A":{"id":360,"damage":-1}},"output":[{"id":362}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:minecart","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":328}],"shape":["A A","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:mossy_cobblestone","type":0,"input":[{"id":4,"damage":-1},{"id":106,"damage":-1}],"output":[{"id":48}],"block":"crafting_table","priority":0},{"id":"minecraft:mossy_cobblestone_stairs","type":1,"input":{"A":{"id":48,"damage":-1}},"output":[{"id":-179,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:mossy_cobblestone_wall","type":1,"input":{"A":{"id":48,"damage":-1}},"output":[{"id":139,"damage":1,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:mossy_stone_brick_stairs","type":1,"input":{"A":{"id":98,"damage":1}},"output":[{"id":-175,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:mossy_stone_brick_wall","type":1,"input":{"A":{"id":98,"damage":1}},"output":[{"id":139,"damage":8,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:mossy_stonebrick","type":0,"input":[{"id":98},{"id":106,"damage":-1}],"output":[{"id":98,"damage":1}],"block":"crafting_table","priority":0},{"id":"minecraft:mushroom_stew","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1}],"output":[{"id":282}],"block":"crafting_table","priority":0},{"id":"minecraft:nether_brick","type":1,"input":{"A":{"id":405,"damage":-1}},"output":[{"id":112}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:nether_brick_fence","type":1,"input":{"A":{"id":112,"damage":-1},"B":{"id":405,"damage":-1}},"output":[{"id":113,"count":6}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:nether_brick_stairs","type":1,"input":{"A":{"id":112,"damage":-1}},"output":[{"id":114,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:nether_brick_wall","type":1,"input":{"A":{"id":112,"damage":-1}},"output":[{"id":139,"damage":9,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:nether_wart_block","type":1,"input":{"A":{"id":372,"damage":-1}},"output":[{"id":214}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:oak_planks","type":1,"input":{"A":{"id":17}},"output":[{"id":5,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:oak_planks_from_stripped","type":1,"input":{"A":{"id":-10,"damage":-1}},"output":[{"id":5,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:oak_planks_from_stripped_wood","type":1,"input":{"A":{"id":-212,"damage":8}},"output":[{"id":5,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:oak_planks_from_wood","type":1,"input":{"A":{"id":-212}},"output":[{"id":5,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:oak_stairs","type":1,"input":{"A":{"id":5}},"output":[{"id":53,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:oak_wood","type":1,"input":{"A":{"id":17}},"output":[{"id":-212,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:oak_wood_stripped","type":1,"input":{"A":{"id":-10,"damage":-1}},"output":[{"id":-212,"damage":8,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:oak_wooden_slab","type":1,"input":{"A":{"id":5}},"output":[{"id":158,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:observer","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":331,"damage":-1},"C":{"id":406,"damage":-1}},"output":[{"id":251}],"shape":["AAA","BBC","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:orange_banner","type":1,"input":{"A":{"id":35,"damage":1},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":14}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:orange_carpet","type":1,"input":{"A":{"id":35,"damage":1}},"output":[{"id":171,"damage":1,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:orange_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":14}},"output":[{"id":171,"damage":1,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:orange_concrete_powder","type":0,"input":[{"id":351,"damage":14},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":1,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:orange_dye_from_orange_tulip","type":0,"input":[{"id":38,"damage":5}],"output":[{"id":351,"damage":14}],"block":"crafting_table","priority":0},{"id":"minecraft:orange_dye_from_red_yellow","type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":11}],"output":[{"id":351,"damage":14,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:orange_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":14}},"output":[{"id":241,"damage":1,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:orange_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":1}},"output":[{"id":160,"damage":1,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:orange_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":14}},"output":[{"id":160,"damage":1,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:orange_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":14}},"output":[{"id":159,"damage":1,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:packed_ice","type":1,"input":{"A":{"id":79,"damage":-1}},"output":[{"id":174}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:paper","type":1,"input":{"A":{"id":338,"damage":-1}},"output":[{"id":339,"count":3}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:pillar_quartz_block","type":1,"input":{"A":{"id":155}},"output":[{"id":155,"damage":2,"count":2}],"shape":["A","A"],"block":"crafting_table","priority":0},{"id":"minecraft:pink_banner","type":1,"input":{"A":{"id":35,"damage":6},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":9}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:pink_carpet","type":1,"input":{"A":{"id":35,"damage":6}},"output":[{"id":171,"damage":6,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:pink_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":9}},"output":[{"id":171,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:pink_concrete_powder","type":0,"input":[{"id":351,"damage":9},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":6,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:pink_dye","type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":19}],"output":[{"id":351,"damage":9,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:pink_dye_from_peony","type":0,"input":[{"id":175,"damage":5}],"output":[{"id":351,"damage":9,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:pink_dye_from_pink_tulip","type":0,"input":[{"id":38,"damage":7}],"output":[{"id":351,"damage":9}],"block":"crafting_table","priority":0},{"id":"minecraft:pink_dye_from_red_bonemeal","type":0,"input":[{"id":351,"damage":1},{"id":351,"damage":15}],"output":[{"id":351,"damage":9,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:pink_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":9}},"output":[{"id":241,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:pink_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":6}},"output":[{"id":160,"damage":6,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:pink_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":9}},"output":[{"id":160,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:pink_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":9}},"output":[{"id":159,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:polished_andesite","type":1,"input":{"A":{"id":1,"damage":5}},"output":[{"id":1,"damage":6,"count":4}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:polished_andesite_stairs","type":1,"input":{"A":{"id":1,"damage":6}},"output":[{"id":-174,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:polished_diorite","type":1,"input":{"A":{"id":1,"damage":3}},"output":[{"id":1,"damage":4,"count":4}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:polished_diorite_stairs","type":1,"input":{"A":{"id":1,"damage":4}},"output":[{"id":-173,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:polished_granite","type":1,"input":{"A":{"id":1,"damage":1}},"output":[{"id":1,"damage":2,"count":4}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:polished_granite_stairs","type":1,"input":{"A":{"id":1,"damage":2}},"output":[{"id":-172,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:prismarine","type":1,"input":{"A":{"id":409,"damage":-1}},"output":[{"id":168}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:prismarine_bricks","type":1,"input":{"A":{"id":409,"damage":-1}},"output":[{"id":168,"damage":2}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:prismarine_stairs","type":1,"input":{"A":{"id":168}},"output":[{"id":-2,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:prismarine_stairs_bricks","type":1,"input":{"A":{"id":168,"damage":2}},"output":[{"id":-4,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:prismarine_stairs_dark","type":1,"input":{"A":{"id":168,"damage":1}},"output":[{"id":-3,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:prismarine_wall","type":1,"input":{"A":{"id":168}},"output":[{"id":139,"damage":11,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:pumpkin_pie","type":0,"input":[{"id":86,"damage":-1},{"id":353,"damage":-1},{"id":344,"damage":-1}],"output":[{"id":400}],"block":"crafting_table","priority":0},{"id":"minecraft:pumpkin_seeds","type":1,"input":{"A":{"id":86,"damage":-1}},"output":[{"id":361,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:purple_banner","type":1,"input":{"A":{"id":35,"damage":10},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":5}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:purple_carpet","type":1,"input":{"A":{"id":35,"damage":10}},"output":[{"id":171,"damage":10,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:purple_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":5}},"output":[{"id":171,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:purple_concrete_powder","type":0,"input":[{"id":351,"damage":5},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":10,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:purple_dye","type":0,"input":[{"id":351,"damage":18},{"id":351,"damage":1}],"output":[{"id":351,"damage":5,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:purple_dye_from_lapis_lazuli","type":0,"input":[{"id":351,"damage":4},{"id":351,"damage":1}],"output":[{"id":351,"damage":5,"count":2}],"block":"crafting_table","priority":1},{"id":"minecraft:purple_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":5}},"output":[{"id":241,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:purple_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":10}},"output":[{"id":160,"damage":10,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:purple_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":5}},"output":[{"id":160,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:purple_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":5}},"output":[{"id":159,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:purpur_block","type":1,"input":{"A":{"id":433,"damage":-1}},"output":[{"id":201,"count":4}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:purpur_stairs","type":1,"input":{"A":{"id":201,"damage":-1}},"output":[{"id":203,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:quartz_block","type":1,"input":{"A":{"id":406,"damage":-1}},"output":[{"id":155}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:quartz_stairs","type":1,"input":{"A":{"id":155}},"output":[{"id":156,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:rabbit_stew_from_brown_mushroom","type":0,"input":[{"id":281,"damage":-1},{"id":393,"damage":-1},{"id":391,"damage":-1},{"id":39,"damage":-1},{"id":412,"damage":-1}],"output":[{"id":413}],"block":"crafting_table","priority":0},{"id":"minecraft:rabbit_stew_from_red_mushroom","type":0,"input":[{"id":281,"damage":-1},{"id":393,"damage":-1},{"id":391,"damage":-1},{"id":40,"damage":-1},{"id":412,"damage":-1}],"output":[{"id":413}],"block":"crafting_table","priority":0},{"id":"minecraft:rail","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":66,"count":16}],"shape":["A A","ABA","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:red_banner","type":1,"input":{"A":{"id":35,"damage":14},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":1}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:red_carpet","type":1,"input":{"A":{"id":35,"damage":14}},"output":[{"id":171,"damage":14,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":1}},"output":[{"id":171,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_concrete_powder","type":0,"input":[{"id":351,"damage":1},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":14,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:red_dye_from_beetroot","type":0,"input":[{"id":457,"damage":-1}],"output":[{"id":351,"damage":1}],"block":"crafting_table","priority":0},{"id":"minecraft:red_dye_from_poppy","type":0,"input":[{"id":38}],"output":[{"id":351,"damage":1}],"block":"crafting_table","priority":0},{"id":"minecraft:red_dye_from_rose_bush","type":0,"input":[{"id":175,"damage":4}],"output":[{"id":351,"damage":1,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:red_dye_from_tulip","type":0,"input":[{"id":38,"damage":4}],"output":[{"id":351,"damage":1}],"block":"crafting_table","priority":0},{"id":"minecraft:red_nether_brick","type":1,"input":{"A":{"id":405,"damage":-1},"B":{"id":372,"damage":-1}},"output":[{"id":215}],"shape":["AB","BA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_nether_brick_stairs","type":1,"input":{"A":{"id":215,"damage":-1}},"output":[{"id":-184,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_nether_brick_wall","type":1,"input":{"A":{"id":215,"damage":-1}},"output":[{"id":139,"damage":13,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_sandstone","type":1,"input":{"A":{"id":12,"damage":1}},"output":[{"id":179}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_sandstone_stairs","type":1,"input":{"A":{"id":179}},"output":[{"id":180,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_sandstone_wall","type":1,"input":{"A":{"id":179}},"output":[{"id":139,"damage":12,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":1}},"output":[{"id":241,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":14}},"output":[{"id":160,"damage":14,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":1}},"output":[{"id":160,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:red_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":1}},"output":[{"id":159,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:redstone","type":1,"input":{"A":{"id":152,"damage":-1}},"output":[{"id":331,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:redstone_block","type":1,"input":{"A":{"id":331,"damage":-1}},"output":[{"id":152}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:redstone_lamp","type":1,"input":{"A":{"id":331,"damage":-1},"B":{"id":89,"damage":-1}},"output":[{"id":123}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:redstone_torch","type":1,"input":{"A":{"id":331,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":76}],"shape":["A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:repeater","type":1,"input":{"A":{"id":76,"damage":-1},"B":{"id":331,"damage":-1},"C":{"id":1}},"output":[{"id":356}],"shape":["ABA","CCC"],"block":"crafting_table","priority":0},{"id":"minecraft:sandstone","type":1,"input":{"A":{"id":12}},"output":[{"id":24}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:sandstone_stairs","type":1,"input":{"A":{"id":24}},"output":[{"id":128,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:sandstone_wall","type":1,"input":{"A":{"id":24}},"output":[{"id":139,"damage":5,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:scaffolding","type":1,"input":{"A":{"id":-163,"damage":-1},"B":{"id":287,"damage":-1}},"output":[{"id":-165,"count":6}],"shape":["ABA","A A","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:sealantern","type":1,"input":{"A":{"id":409,"damage":-1},"B":{"id":422,"damage":-1}},"output":[{"id":169}],"shape":["ABA","BBB","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:shears","type":1,"input":{"A":{"id":265,"damage":-1}},"output":[{"id":359}],"shape":[" A","A "],"block":"crafting_table","priority":0},{"id":"minecraft:shield","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":265,"damage":-1}},"output":[{"id":513}],"shape":["ABA","AAA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:shulker_box","type":1,"input":{"A":{"id":445,"damage":-1},"B":{"id":54,"damage":-1}},"output":[{"id":205}],"shape":["A","B","A"],"block":"crafting_table","priority":0},{"id":"minecraft:sign_acacia","type":1,"input":{"A":{"id":5,"damage":4},"B":{"id":280,"damage":-1}},"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:sign_birch","type":1,"input":{"A":{"id":5,"damage":2},"B":{"id":280,"damage":-1}},"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:sign_darkoak","type":1,"input":{"A":{"id":5,"damage":5},"B":{"id":280,"damage":-1}},"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:sign_jungle","type":1,"input":{"A":{"id":5,"damage":3},"B":{"id":280,"damage":-1}},"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:sign_oak","type":1,"input":{"A":{"id":5},"B":{"id":280,"damage":-1}},"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:sign_spruce","type":1,"input":{"A":{"id":5,"damage":1},"B":{"id":280,"damage":-1}},"output":[{"id":323,"count":3}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:slime","type":1,"input":{"A":{"id":341,"damage":-1}},"output":[{"id":165}],"shape":["AAA","AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:slime_ball","type":1,"input":{"A":{"id":165,"damage":-1}},"output":[{"id":341,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:smithing_table","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":5,"damage":-1}},"output":[{"id":-202}],"shape":["AA","BB","BB"],"block":"crafting_table","priority":0},{"id":"minecraft:smoker","type":1,"input":{"A":{"id":17,"damage":-1},"B":{"id":61,"damage":-1}},"output":[{"id":-198}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:smoker_from_log2","type":1,"input":{"A":{"id":162,"damage":-1},"B":{"id":61,"damage":-1}},"output":[{"id":-198}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:smoker_from_stripped_acacia","type":1,"input":{"A":{"id":-8,"damage":-1},"B":{"id":61,"damage":-1}},"output":[{"id":-198}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:smoker_from_stripped_birch","type":1,"input":{"A":{"id":-6,"damage":-1},"B":{"id":61,"damage":-1}},"output":[{"id":-198}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:smoker_from_stripped_dark_oak","type":1,"input":{"A":{"id":-9,"damage":-1},"B":{"id":61,"damage":-1}},"output":[{"id":-198}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:smoker_from_stripped_jungle","type":1,"input":{"A":{"id":-7,"damage":-1},"B":{"id":61,"damage":-1}},"output":[{"id":-198}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:smoker_from_stripped_oak","type":1,"input":{"A":{"id":-10,"damage":-1},"B":{"id":61,"damage":-1}},"output":[{"id":-198}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:smoker_from_stripped_spruce","type":1,"input":{"A":{"id":-5,"damage":-1},"B":{"id":61,"damage":-1}},"output":[{"id":-198}],"shape":[" A ","ABA"," A "],"block":"crafting_table","priority":0},{"id":"minecraft:smooth_quartz_stairs","type":1,"input":{"A":{"id":155,"damage":3}},"output":[{"id":-185,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:smooth_red_sandstone","type":1,"input":{"A":{"id":179}},"output":[{"id":179,"damage":2,"count":4}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:smooth_red_sandstone_stairs","type":1,"input":{"A":{"id":179,"damage":3}},"output":[{"id":-176,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:smooth_sandstone","type":1,"input":{"A":{"id":24}},"output":[{"id":24,"damage":2,"count":4}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:smooth_sandstone_stairs","type":1,"input":{"A":{"id":24,"damage":3}},"output":[{"id":-177,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:snow","type":1,"input":{"A":{"id":332,"damage":-1}},"output":[{"id":80}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:snow_layer","type":1,"input":{"A":{"id":80,"damage":-1}},"output":[{"id":78,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:speckled_melon","type":1,"input":{"A":{"id":371,"damage":-1},"B":{"id":360,"damage":-1}},"output":[{"id":382}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_boat","type":1,"input":{"A":{"id":5,"damage":1},"B":{"id":269}},"output":[{"id":333,"damage":1}],"shape":["ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_door","type":1,"input":{"A":{"id":5,"damage":1}},"output":[{"id":427,"count":3}],"shape":["AA","AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_fence","type":1,"input":{"A":{"id":5,"damage":1},"B":{"id":280,"damage":-1}},"output":[{"id":85,"damage":1,"count":3}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_fence_gate","type":1,"input":{"A":{"id":280,"damage":-1},"B":{"id":5,"damage":1}},"output":[{"id":183}],"shape":["ABA","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_planks","type":1,"input":{"A":{"id":17,"damage":1}},"output":[{"id":5,"damage":1,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_planks_from_stripped","type":1,"input":{"A":{"id":-5,"damage":-1}},"output":[{"id":5,"damage":1,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_planks_from_stripped_wood","type":1,"input":{"A":{"id":-212,"damage":9}},"output":[{"id":5,"damage":1,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_planks_from_wood","type":1,"input":{"A":{"id":-212,"damage":1}},"output":[{"id":5,"damage":1,"count":4}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_stairs","type":1,"input":{"A":{"id":5,"damage":1}},"output":[{"id":134,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_wood","type":1,"input":{"A":{"id":17,"damage":1}},"output":[{"id":-212,"damage":1,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_wood_stripped","type":1,"input":{"A":{"id":-5,"damage":-1}},"output":[{"id":-212,"damage":9,"count":3}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:spruce_wooden_slab","type":1,"input":{"A":{"id":5,"damage":1}},"output":[{"id":158,"damage":1,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:sticky_piston","type":1,"input":{"A":{"id":341,"damage":-1},"B":{"id":33,"damage":-1}},"output":[{"id":29,"damage":1}],"shape":["A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_axe","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":275}],"shape":["AA","AB"," B"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_brick_stairs","type":1,"input":{"A":{"id":98}},"output":[{"id":109,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_brick_wall","type":1,"input":{"A":{"id":98}},"output":[{"id":139,"damage":7,"count":6}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_button","type":1,"input":{"A":{"id":1}},"output":[{"id":77}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_hoe","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":291}],"shape":["AA"," B"," B"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_pickaxe","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":274}],"shape":["AAA"," B "," B "],"block":"crafting_table","priority":0},{"id":"minecraft:stone_pressure_plate","type":1,"input":{"A":{"id":1}},"output":[{"id":70}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_shovel","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":273}],"shape":["A","B","B"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_stairs","type":1,"input":{"A":{"id":1}},"output":[{"id":-180,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:stone_sword","type":1,"input":{"A":{"id":4,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":272}],"shape":["A","A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:stonebrick","type":1,"input":{"A":{"id":1}},"output":[{"id":98,"count":4}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:stonecutter","type":1,"input":{"A":{"id":265,"damage":-1},"B":{"id":1,"damage":-1}},"output":[{"id":-197}],"shape":[" A ","BBB"],"block":"crafting_table","priority":0},{"id":"minecraft:string_to_wool","type":1,"input":{"A":{"id":287,"damage":-1}},"output":[{"id":35}],"shape":["AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:sugar","type":1,"input":{"A":{"id":338,"damage":-1}},"output":[{"id":353}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_allium","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":2}],"output":[{"id":734,"damage":7}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_azure_bluet","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":3}],"output":[{"id":734,"damage":3}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_blue_orchid","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":1}],"output":[{"id":734,"damage":6}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_cornflower","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":9}],"output":[{"id":734,"damage":1}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_dandelion","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":37,"damage":-1}],"output":[{"id":734,"damage":5}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_lily_of_the_valley","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":10}],"output":[{"id":734,"damage":4}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_oxeye_daisy","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":8}],"output":[{"id":734,"damage":8}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_poppy","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38}],"output":[{"id":734}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_tulip_orange","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":5}],"output":[{"id":734,"damage":2}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_tulip_pink","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":7}],"output":[{"id":734,"damage":2}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_tulip_red","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":4}],"output":[{"id":734,"damage":2}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_tulip_white","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":38,"damage":6}],"output":[{"id":734,"damage":2}],"block":"crafting_table","priority":0},{"id":"minecraft:suspicious_stew_from_wither_rose","type":0,"input":[{"id":39,"damage":-1},{"id":40,"damage":-1},{"id":281,"damage":-1},{"id":-216,"damage":-1}],"output":[{"id":734,"damage":9}],"block":"crafting_table","priority":0},{"id":"minecraft:tnt","type":1,"input":{"A":{"id":289,"damage":-1},"B":{"id":12,"damage":-1}},"output":[{"id":46}],"shape":["ABA","BAB","ABA"],"block":"crafting_table","priority":0},{"id":"minecraft:tnt_minecart","type":1,"input":{"A":{"id":46},"B":{"id":328,"damage":-1}},"output":[{"id":407}],"shape":["A","B"],"block":"crafting_table","priority":0},{"id":"minecraft:trapped_chest","type":0,"input":[{"id":54,"damage":-1},{"id":131,"damage":-1}],"output":[{"id":146}],"block":"crafting_table","priority":0},{"id":"minecraft:turtle_helmet","type":1,"input":{"A":{"id":468,"damage":-1}},"output":[{"id":469}],"shape":["AAA","A A"],"block":"crafting_table","priority":0},{"id":"minecraft:wheat","type":1,"input":{"A":{"id":170,"damage":-1}},"output":[{"id":296,"count":9}],"shape":["A"],"block":"crafting_table","priority":0},{"id":"minecraft:white_banner","type":1,"input":{"A":{"id":35},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":15}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:white_carpet","type":1,"input":{"A":{"id":35}},"output":[{"id":171,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:white_concrete_powder","type":0,"input":[{"id":351,"damage":19},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:white_concrete_powder_from_bonemeal","type":0,"input":[{"id":351,"damage":15},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"count":8}],"block":"crafting_table","priority":1},{"id":"minecraft:white_dye_from_bone_meal","type":0,"input":[{"id":351,"damage":15}],"output":[{"id":351,"damage":19}],"block":"crafting_table","priority":0},{"id":"minecraft:white_dye_from_lily_of_the_valley","type":0,"input":[{"id":38,"damage":10}],"output":[{"id":351,"damage":19}],"block":"crafting_table","priority":0},{"id":"minecraft:white_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":19}},"output":[{"id":241,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:white_stained_glass_from_bonemeal","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":15}},"output":[{"id":241,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:white_stained_glass_pane","type":1,"input":{"A":{"id":241}},"output":[{"id":160,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:white_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":19}},"output":[{"id":160,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:white_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":19}},"output":[{"id":159,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:white_stained_hardened_clay_from_bonemeal","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":15}},"output":[{"id":159,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":1},{"id":"minecraft:wooden_door","type":1,"input":{"A":{"id":5}},"output":[{"id":324,"count":3}],"shape":["AA","AA","AA"],"block":"crafting_table","priority":0},{"id":"minecraft:writable_book","type":0,"input":[{"id":340,"damage":-1},{"id":351},{"id":288,"damage":-1}],"output":[{"id":386}],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_banner","type":1,"input":{"A":{"id":35,"damage":4},"B":{"id":280,"damage":-1}},"output":[{"id":446,"damage":11}],"shape":["AAA","AAA"," B "],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_carpet","type":1,"input":{"A":{"id":35,"damage":4}},"output":[{"id":171,"damage":4,"count":3}],"shape":["AA"],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_carpet_from_white","type":1,"input":{"A":{"id":171},"B":{"id":351,"damage":11}},"output":[{"id":171,"damage":4,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_concrete_powder","type":0,"input":[{"id":351,"damage":11},{"id":12},{"id":12},{"id":12},{"id":12},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1},{"id":13,"damage":-1}],"output":[{"id":237,"damage":4,"count":8}],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_dye_from_dandelion","type":0,"input":[{"id":37}],"output":[{"id":351,"damage":11}],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_dye_from_sunflower","type":0,"input":[{"id":175}],"output":[{"id":351,"damage":11,"count":2}],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_stained_glass","type":1,"input":{"A":{"id":20,"damage":-1},"B":{"id":351,"damage":11}},"output":[{"id":241,"damage":4,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_stained_glass_pane","type":1,"input":{"A":{"id":241,"damage":4}},"output":[{"id":160,"damage":4,"count":16}],"shape":["AAA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_stained_glass_pane_from_pane","type":1,"input":{"A":{"id":102,"damage":-1},"B":{"id":351,"damage":11}},"output":[{"id":160,"damage":4,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"minecraft:yellow_stained_hardened_clay","type":1,"input":{"A":{"id":172,"damage":-1},"B":{"id":351,"damage":11}},"output":[{"id":159,"damage":4,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":0},{"id":"oak_stairs_oak_recipeId","type":1,"input":{"A":{"id":5}},"output":[{"id":53,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_0_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_10_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAACgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_11_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAACwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_12_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_13_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_14_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_15_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_16_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_17_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_18_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_19_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAADwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_1_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_2_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_3_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAAAwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_4_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_5_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_6_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_7_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAABwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_8_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAACAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_charge_9_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1},{"id":402,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMKAQAAAAcNAEZpcmV3b3JrQ29sb3IBAAAACQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAAA"}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_0_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351}],"output":[{"id":402,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IhHR3/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_10_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":10}],"output":[{"id":402,"damage":10,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Ifx4D/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_11_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":11}],"output":[{"id":402,"damage":11,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3I92P7/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_12_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":12}],"output":[{"id":402,"damage":12,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Laszr/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_13_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":13}],"output":[{"id":402,"damage":13,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3K9Tsf/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_14_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":14}],"output":[{"id":402,"damage":14,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IdgPn/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_15_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":15}],"output":[{"id":402,"damage":15,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Lw8PD/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_16_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":16}],"output":[{"id":402,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IhHR3/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_17_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":17}],"output":[{"id":402,"damage":3,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IyVIP/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_18_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":18}],"output":[{"id":402,"damage":4,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3KqRDz/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_19_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":19}],"output":[{"id":402,"damage":15,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Lw8PD/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_1_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":1}],"output":[{"id":402,"damage":1,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3ImLrD/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_2_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":2}],"output":[{"id":402,"damage":2,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IWfF7/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_3_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":3}],"output":[{"id":402,"damage":3,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3IyVIP/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_4_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":4}],"output":[{"id":402,"damage":4,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3KqRDz/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_5_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":5}],"output":[{"id":402,"damage":5,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3K4Mon/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_6_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":6}],"output":[{"id":402,"damage":6,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3KcnBb/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_7_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":7}],"output":[{"id":402,"damage":7,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3KXnZ3/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_8_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":8}],"output":[{"id":402,"damage":8,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3JST0f/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_dye_9_recipeId","type":0,"input":[{"id":289,"damage":-1},{"id":351,"damage":9}],"output":[{"id":402,"damage":9,"nbt_b64":"CgAAAwsAY3VzdG9tQ29sb3Kqi/P/Cg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQEMAEZpcmV3b3JrVHlwZQAHDABGaXJld29ya0ZhZGUAAAAAAQ0ARmlyZXdvcmtUcmFpbAABDwBGaXJld29ya0ZsaWNrZXIAAAA="}],"block":"crafting_table","priority":50},{"id":"paper_sulphur_recipeId","type":0,"input":[{"id":339,"damage":-1},{"id":289,"damage":-1}],"output":[{"id":401,"count":3,"nbt_b64":"CgAACgkARmlyZXdvcmtzAQYARmxpZ2h0AQkKAEV4cGxvc2lvbnMAAAAAAAAA"}],"block":"crafting_table","priority":50},{"type":4,"uuid":"00000000-0000-0000-0000-000000000001"},{"id":"shulkerBox_shulker_box_color_block_0_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_15_0","type":5,"input":[{"id":218},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_0_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_15_0","type":5,"input":[{"id":218},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_10_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_15_0","type":5,"input":[{"id":218},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_11_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_15_0","type":5,"input":[{"id":218},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_12_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_15_0","type":5,"input":[{"id":218},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_13_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_15_0","type":5,"input":[{"id":218},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_14_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_15_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_15_0","type":5,"input":[{"id":218},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_16_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_15_0","type":5,"input":[{"id":218},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_17_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_15_0","type":5,"input":[{"id":218},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_18_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_19_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_15_0","type":5,"input":[{"id":218},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_1_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_15_0","type":5,"input":[{"id":218},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_2_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_15_0","type":5,"input":[{"id":218},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_3_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_15_0","type":5,"input":[{"id":218},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_4_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_15_0","type":5,"input":[{"id":218},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_5_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_15_0","type":5,"input":[{"id":218},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_6_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_15_0","type":5,"input":[{"id":218},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_7_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_15_0","type":5,"input":[{"id":218},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_8_9_0","type":5,"input":[{"id":218,"damage":6},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_0_0","type":5,"input":[{"id":218,"damage":15},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_10_0","type":5,"input":[{"id":218,"damage":5},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_11_0","type":5,"input":[{"id":218,"damage":4},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_12_0","type":5,"input":[{"id":218,"damage":3},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_13_0","type":5,"input":[{"id":218,"damage":2},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_14_0","type":5,"input":[{"id":218,"damage":1},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_15_0","type":5,"input":[{"id":218},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_1_0","type":5,"input":[{"id":218,"damage":14},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_2_0","type":5,"input":[{"id":218,"damage":13},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_3_0","type":5,"input":[{"id":218,"damage":12},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_4_0","type":5,"input":[{"id":218,"damage":11},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_5_0","type":5,"input":[{"id":218,"damage":10},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_6_0","type":5,"input":[{"id":218,"damage":9},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_7_0","type":5,"input":[{"id":218,"damage":8},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_block_9_8_0","type":5,"input":[{"id":218,"damage":7},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_0_0","type":5,"input":[{"id":205},{"id":351}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_10_0","type":5,"input":[{"id":205},{"id":351,"damage":10}],"output":[{"id":218,"damage":5}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_11_0","type":5,"input":[{"id":205},{"id":351,"damage":11}],"output":[{"id":218,"damage":4}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_12_0","type":5,"input":[{"id":205},{"id":351,"damage":12}],"output":[{"id":218,"damage":3}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_13_0","type":5,"input":[{"id":205},{"id":351,"damage":13}],"output":[{"id":218,"damage":2}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_14_0","type":5,"input":[{"id":205},{"id":351,"damage":14}],"output":[{"id":218,"damage":1}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_15_0","type":5,"input":[{"id":205},{"id":351,"damage":15}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_16_0","type":5,"input":[{"id":205},{"id":351,"damage":16}],"output":[{"id":218,"damage":15}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_17_0","type":5,"input":[{"id":205},{"id":351,"damage":17}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_18_0","type":5,"input":[{"id":205},{"id":351,"damage":18}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_19_0","type":5,"input":[{"id":205},{"id":351,"damage":19}],"output":[{"id":218}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_1_0","type":5,"input":[{"id":205},{"id":351,"damage":1}],"output":[{"id":218,"damage":14}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_2_0","type":5,"input":[{"id":205},{"id":351,"damage":2}],"output":[{"id":218,"damage":13}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_3_0","type":5,"input":[{"id":205},{"id":351,"damage":3}],"output":[{"id":218,"damage":12}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_4_0","type":5,"input":[{"id":205},{"id":351,"damage":4}],"output":[{"id":218,"damage":11}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_5_0","type":5,"input":[{"id":205},{"id":351,"damage":5}],"output":[{"id":218,"damage":10}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_6_0","type":5,"input":[{"id":205},{"id":351,"damage":6}],"output":[{"id":218,"damage":9}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_7_0","type":5,"input":[{"id":205},{"id":351,"damage":7}],"output":[{"id":218,"damage":8}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_8_0","type":5,"input":[{"id":205},{"id":351,"damage":8}],"output":[{"id":218,"damage":7}],"block":"crafting_table","priority":0},{"id":"shulkerBox_shulker_box_color_dye_9_0","type":5,"input":[{"id":205},{"id":351,"damage":9}],"output":[{"id":218,"damage":6}],"block":"crafting_table","priority":0},{"id":"slab3_endstonebrick_recipeId","type":1,"input":{"A":{"id":206}},"output":[{"id":-162,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"spruce_stairs_spruce_recipeId","type":1,"input":{"A":{"id":5,"damage":1}},"output":[{"id":134,"count":4}],"shape":["A ","AA ","AAA"],"block":"crafting_table","priority":50},{"id":"stick_wood_recipeId","type":1,"input":{"A":{"id":5,"damage":-1}},"output":[{"id":280,"count":4}],"shape":["A","A"],"block":"crafting_table","priority":1},{"id":"stoneslab2_RedSandstone_recipeId","type":1,"input":{"A":{"id":179}},"output":[{"id":182,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab2_prismarine_bricks_recipeId","type":1,"input":{"A":{"id":168,"damage":2}},"output":[{"id":182,"damage":4,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab2_prismarine_recipeId","type":1,"input":{"A":{"id":168,"damage":1}},"output":[{"id":182,"damage":3,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab2_purpur_recipeId","type":1,"input":{"A":{"id":201}},"output":[{"id":182,"damage":1,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab2_recipeId","type":1,"input":{"A":{"id":48}},"output":[{"id":182,"damage":5,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab2_rednetherbrick_recipeId","type":1,"input":{"A":{"id":215}},"output":[{"id":182,"damage":7,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab2_redsandstone_heiroglyphs_recipeId","type":1,"input":{"A":{"id":179,"damage":1}},"output":[{"id":182,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab2_smoothsandstone_smooth_recipeId","type":1,"input":{"A":{"id":24,"damage":3}},"output":[{"id":182,"damage":6,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab3_andesite_recipeId","type":1,"input":{"A":{"id":1,"damage":5}},"output":[{"id":-162,"damage":3,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab3_diorite_recipeId","type":1,"input":{"A":{"id":1,"damage":3}},"output":[{"id":-162,"damage":4,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab3_granite","type":1,"input":{"A":{"id":1,"damage":1}},"output":[{"id":-162,"damage":6,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab3_polishedGranite_GraniteSmooth_recipeId","type":1,"input":{"A":{"id":1,"damage":2}},"output":[{"id":-162,"damage":7,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab3_polished_andesite_andesitesmooth_recipeId","type":1,"input":{"A":{"id":1,"damage":6}},"output":[{"id":-162,"damage":2,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab3_polished_diorite_dioritesmooth_recipeId","type":1,"input":{"A":{"id":1,"damage":4}},"output":[{"id":-162,"damage":5,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab3_smooth_recipeId","type":1,"input":{"A":{"id":179,"damage":3}},"output":[{"id":-162,"damage":1,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab4_cut_redsandstone_cut_recipeId","type":1,"input":{"A":{"id":179,"damage":2}},"output":[{"id":-166,"damage":4,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab4_cut_sandstone_cut_recipeId","type":1,"input":{"A":{"id":24,"damage":2}},"output":[{"id":-166,"damage":3,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab4_smoothquartz_smooth_recipeId","type":1,"input":{"A":{"id":155,"damage":3}},"output":[{"id":-166,"damage":1,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab_quartz_recipeId","type":1,"input":{"A":{"id":155}},"output":[{"id":44,"damage":6,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab_recipeId","type":1,"input":{"A":{"id":168}},"output":[{"id":182,"damage":2,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"stoneslab_sandstone_heiroglyphs_recipeId","type":1,"input":{"A":{"id":24,"damage":1}},"output":[{"id":44,"damage":1,"count":6}],"shape":["AAA"],"block":"crafting_table","priority":50},{"id":"tool_material_recipe_0_0","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":270}],"shape":["AAA"," B "," B "],"block":"crafting_table","priority":50},{"id":"tool_material_recipe_0_1","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":269}],"shape":["A","B","B"],"block":"crafting_table","priority":50},{"id":"tool_material_recipe_0_2","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":271}],"shape":["AA","AB"," B"],"block":"crafting_table","priority":50},{"id":"tool_material_recipe_0_3","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":290}],"shape":["AA"," B"," B"],"block":"crafting_table","priority":50},{"type":4,"uuid":"aecd2294-4b94-434b-8667-4499bb2c9327"},{"id":"weapon_arrow_recipe_10","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":10}},"output":[{"id":262,"damage":11,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_11","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":11}},"output":[{"id":262,"damage":12,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_12","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":12}},"output":[{"id":262,"damage":13,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_13","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":13}},"output":[{"id":262,"damage":14,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_14","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":14}},"output":[{"id":262,"damage":15,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_15","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":15}},"output":[{"id":262,"damage":16,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_16","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":16}},"output":[{"id":262,"damage":17,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_17","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":17}},"output":[{"id":262,"damage":18,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_18","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":18}},"output":[{"id":262,"damage":19,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_19","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":19}},"output":[{"id":262,"damage":20,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_20","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":20}},"output":[{"id":262,"damage":21,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_21","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":21}},"output":[{"id":262,"damage":22,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_22","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":22}},"output":[{"id":262,"damage":23,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_23","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":23}},"output":[{"id":262,"damage":24,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_24","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":24}},"output":[{"id":262,"damage":25,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_25","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":25}},"output":[{"id":262,"damage":26,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_26","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":26}},"output":[{"id":262,"damage":27,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_27","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":27}},"output":[{"id":262,"damage":28,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_28","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":28}},"output":[{"id":262,"damage":29,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_29","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":29}},"output":[{"id":262,"damage":30,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_30","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":30}},"output":[{"id":262,"damage":31,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_31","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":31}},"output":[{"id":262,"damage":32,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_32","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":32}},"output":[{"id":262,"damage":33,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_33","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":33}},"output":[{"id":262,"damage":34,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_34","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":34}},"output":[{"id":262,"damage":35,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_35","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":35}},"output":[{"id":262,"damage":36,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_36","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":36}},"output":[{"id":262,"damage":37,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_37","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":37}},"output":[{"id":262,"damage":38,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_38","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":38}},"output":[{"id":262,"damage":39,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_39","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":39}},"output":[{"id":262,"damage":40,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_40","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":40}},"output":[{"id":262,"damage":41,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_41","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":41}},"output":[{"id":262,"damage":42,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_5","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":5}},"output":[{"id":262,"damage":6,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_6","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":6}},"output":[{"id":262,"damage":7,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_7","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":7}},"output":[{"id":262,"damage":8,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_8","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":8}},"output":[{"id":262,"damage":9,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_arrow_recipe_9","type":1,"input":{"A":{"id":262},"B":{"id":441,"damage":9}},"output":[{"id":262,"damage":10,"count":8}],"shape":["AAA","ABA","AAA"],"block":"crafting_table","priority":50},{"id":"weapon_stick_recipe_0_0","type":1,"input":{"A":{"id":5,"damage":-1},"B":{"id":280,"damage":-1}},"output":[{"id":268}],"shape":["A","A","B"],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_1","type":0,"input":[{"id":351},{"id":35,"damage":14}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_10","type":0,"input":[{"id":351},{"id":35,"damage":5}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_11","type":0,"input":[{"id":351},{"id":35,"damage":4}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_12","type":0,"input":[{"id":351},{"id":35,"damage":3}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_13","type":0,"input":[{"id":351},{"id":35,"damage":2}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_14","type":0,"input":[{"id":351},{"id":35,"damage":1}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_15","type":0,"input":[{"id":351},{"id":35}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_2","type":0,"input":[{"id":351},{"id":35,"damage":13}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_3","type":0,"input":[{"id":351},{"id":35,"damage":12}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_4","type":0,"input":[{"id":351},{"id":35,"damage":11}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_5","type":0,"input":[{"id":351},{"id":35,"damage":10}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_6","type":0,"input":[{"id":351},{"id":35,"damage":9}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_7","type":0,"input":[{"id":351},{"id":35,"damage":8}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_8","type":0,"input":[{"id":351},{"id":35,"damage":7}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_0_9","type":0,"input":[{"id":351},{"id":35,"damage":6}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_0","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":15}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_1","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":14}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_11","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":4}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_12","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":3}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_13","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":2}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_14","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":1}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_15","type":0,"input":[{"id":351,"damage":10},{"id":35}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_2","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":13}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_3","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":12}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_4","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":11}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_5","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":10}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_6","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":9}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_7","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":8}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_8","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":7}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_10_9","type":0,"input":[{"id":351,"damage":10},{"id":35,"damage":6}],"output":[{"id":35,"damage":5}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_0","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":15}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_1","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":14}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_10","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":5}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_12","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":3}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_13","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":2}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_14","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":1}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_15","type":0,"input":[{"id":351,"damage":11},{"id":35}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_2","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":13}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_3","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":12}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_4","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":11}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_5","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":10}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_6","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":9}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_7","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":8}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_8","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":7}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_11_9","type":0,"input":[{"id":351,"damage":11},{"id":35,"damage":6}],"output":[{"id":35,"damage":4}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_0","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":15}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_1","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":14}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_10","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":5}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_11","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":4}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_13","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":2}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_14","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":1}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_15","type":0,"input":[{"id":351,"damage":12},{"id":35}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_2","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":13}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_3","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":12}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_4","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":11}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_5","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":10}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_6","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":9}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_7","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":8}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_8","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":7}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_12_9","type":0,"input":[{"id":351,"damage":12},{"id":35,"damage":6}],"output":[{"id":35,"damage":3}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_0","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":15}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_1","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":14}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_10","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":5}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_11","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":4}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_12","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":3}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_14","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":1}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_15","type":0,"input":[{"id":351,"damage":13},{"id":35}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_2","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":13}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_3","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":12}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_4","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":11}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_5","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":10}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_6","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":9}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_7","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":8}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_8","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":7}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_13_9","type":0,"input":[{"id":351,"damage":13},{"id":35,"damage":6}],"output":[{"id":35,"damage":2}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_0","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":15}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_1","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":14}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_10","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":5}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_11","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":4}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_12","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":3}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_13","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":2}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_15","type":0,"input":[{"id":351,"damage":14},{"id":35}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_2","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":13}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_3","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":12}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_4","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":11}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_5","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":10}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_6","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":9}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_7","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":8}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_8","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":7}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_14_9","type":0,"input":[{"id":351,"damage":14},{"id":35,"damage":6}],"output":[{"id":35,"damage":1}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_0","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":15}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_1","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":14}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_10","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":5}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_11","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":4}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_12","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":3}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_13","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":2}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_14","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":1}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_2","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":13}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_3","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":12}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_4","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":11}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_5","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":10}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_6","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":9}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_7","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":8}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_8","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":7}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_15_9","type":0,"input":[{"id":351,"damage":15},{"id":35,"damage":6}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_1","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":14}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_10","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":5}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_11","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":4}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_12","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":3}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_13","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":2}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_14","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":1}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_15","type":0,"input":[{"id":351,"damage":16},{"id":35}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_2","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":13}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_3","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":12}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_4","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":11}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_5","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":10}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_6","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":9}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_7","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":8}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_8","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":7}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_16_9","type":0,"input":[{"id":351,"damage":16},{"id":35,"damage":6}],"output":[{"id":35,"damage":15}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_0","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":15}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_1","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":14}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_10","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":5}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_11","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":4}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_12","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":3}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_13","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":2}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_14","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":1}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_15","type":0,"input":[{"id":351,"damage":17},{"id":35}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_2","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":13}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_4","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":11}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_5","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":10}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_6","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":9}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_7","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":8}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_8","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":7}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_17_9","type":0,"input":[{"id":351,"damage":17},{"id":35,"damage":6}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_0","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":15}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_1","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":14}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_10","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":5}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_11","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":4}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_12","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":3}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_13","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":2}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_14","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":1}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_15","type":0,"input":[{"id":351,"damage":18},{"id":35}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_2","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":13}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_3","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":12}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_5","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":10}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_6","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":9}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_7","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":8}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_8","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":7}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_18_9","type":0,"input":[{"id":351,"damage":18},{"id":35,"damage":6}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_0","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":15}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_1","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":14}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_10","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":5}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_11","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":4}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_12","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":3}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_13","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":2}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_14","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":1}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_2","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":13}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_3","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":12}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_4","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":11}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_5","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":10}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_6","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":9}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_7","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":8}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_8","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":7}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_19_9","type":0,"input":[{"id":351,"damage":19},{"id":35,"damage":6}],"output":[{"id":35}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_0","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":15}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_10","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":5}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_11","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":4}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_12","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":3}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_13","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":2}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_14","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":1}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_15","type":0,"input":[{"id":351,"damage":1},{"id":35}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_2","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":13}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_3","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":12}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_4","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":11}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_5","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":10}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_6","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":9}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_7","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":8}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_8","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":7}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_1_9","type":0,"input":[{"id":351,"damage":1},{"id":35,"damage":6}],"output":[{"id":35,"damage":14}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_0","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":15}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_1","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":14}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_10","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":5}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_11","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":4}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_12","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":3}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_13","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":2}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_14","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":1}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_15","type":0,"input":[{"id":351,"damage":2},{"id":35}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_3","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":12}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_4","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":11}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_5","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":10}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_6","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":9}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_7","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":8}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_8","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":7}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_2_9","type":0,"input":[{"id":351,"damage":2},{"id":35,"damage":6}],"output":[{"id":35,"damage":13}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_0","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":15}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_1","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":14}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_10","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":5}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_11","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":4}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_12","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":3}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_13","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":2}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_14","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":1}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_15","type":0,"input":[{"id":351,"damage":3},{"id":35}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_2","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":13}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_4","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":11}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_5","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":10}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_6","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":9}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_7","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":8}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_8","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":7}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_3_9","type":0,"input":[{"id":351,"damage":3},{"id":35,"damage":6}],"output":[{"id":35,"damage":12}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_0","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":15}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_1","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":14}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_10","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":5}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_11","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":4}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_12","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":3}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_13","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":2}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_14","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":1}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_15","type":0,"input":[{"id":351,"damage":4},{"id":35}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_2","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":13}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_3","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":12}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_5","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":10}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_6","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":9}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_7","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":8}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_8","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":7}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_4_9","type":0,"input":[{"id":351,"damage":4},{"id":35,"damage":6}],"output":[{"id":35,"damage":11}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_0","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":15}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_1","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":14}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_10","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":5}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_11","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":4}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_12","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":3}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_13","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":2}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_14","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":1}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_15","type":0,"input":[{"id":351,"damage":5},{"id":35}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_2","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":13}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_3","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":12}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_4","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":11}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_6","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":9}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_7","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":8}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_8","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":7}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_5_9","type":0,"input":[{"id":351,"damage":5},{"id":35,"damage":6}],"output":[{"id":35,"damage":10}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_0","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":15}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_1","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":14}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_10","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":5}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_11","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":4}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_12","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":3}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_13","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":2}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_14","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":1}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_15","type":0,"input":[{"id":351,"damage":6},{"id":35}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_2","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":13}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_3","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":12}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_4","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":11}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_5","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":10}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_7","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":8}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_8","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":7}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_6_9","type":0,"input":[{"id":351,"damage":6},{"id":35,"damage":6}],"output":[{"id":35,"damage":9}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_0","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":15}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_1","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":14}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_10","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":5}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_11","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":4}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_12","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":3}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_13","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":2}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_14","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":1}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_15","type":0,"input":[{"id":351,"damage":7},{"id":35}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_2","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":13}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_3","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":12}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_4","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":11}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_5","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":10}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_6","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":9}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_8","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":7}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_7_9","type":0,"input":[{"id":351,"damage":7},{"id":35,"damage":6}],"output":[{"id":35,"damage":8}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_0","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":15}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_1","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":14}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_10","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":5}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_11","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":4}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_12","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":3}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_13","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":2}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_14","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":1}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_15","type":0,"input":[{"id":351,"damage":8},{"id":35}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_2","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":13}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_3","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":12}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_4","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":11}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_5","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":10}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_6","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":9}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_7","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":8}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_8_9","type":0,"input":[{"id":351,"damage":8},{"id":35,"damage":6}],"output":[{"id":35,"damage":7}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_0","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":15}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_1","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":14}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_10","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":5}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_11","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":4}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_12","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":3}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_13","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":2}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_14","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":1}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_15","type":0,"input":[{"id":351,"damage":9},{"id":35}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_2","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":13}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_3","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":12}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_4","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":11}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_5","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":10}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_6","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":9}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_7","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":8}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"wool_dye_wool_9_8","type":0,"input":[{"id":351,"damage":9},{"id":35,"damage":7}],"output":[{"id":35,"damage":6}],"block":"crafting_table","priority":50},{"id":"minecraft:stonecutter_andesite_slab","type":0,"input":[{"id":1,"damage":5}],"output":[{"id":-162,"damage":3,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_andesite_stairs","type":0,"input":[{"id":1,"damage":5}],"output":[{"id":-171}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_andesite_wall","type":0,"input":[{"id":1,"damage":5}],"output":[{"id":139,"damage":4}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_brick_slab","type":0,"input":[{"id":45}],"output":[{"id":44,"damage":4,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_brick_stairs","type":0,"input":[{"id":45}],"output":[{"id":108}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_brick_wall","type":0,"input":[{"id":45}],"output":[{"id":139,"damage":6}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_cobbledouble_stone_slab","type":0,"input":[{"id":4}],"output":[{"id":44,"damage":3,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_cobblestone_stairs","type":0,"input":[{"id":4}],"output":[{"id":67}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_cobblestone_wall","type":0,"input":[{"id":4}],"output":[{"id":139}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_dark_prismarine_slab","type":0,"input":[{"id":168,"damage":1}],"output":[{"id":182,"damage":3,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_dark_prismarine_stairs","type":0,"input":[{"id":168,"damage":1}],"output":[{"id":-3}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_diorite_slab","type":0,"input":[{"id":1,"damage":3}],"output":[{"id":-162,"damage":4,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_diorite_stairs","type":0,"input":[{"id":1,"damage":3}],"output":[{"id":-170}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_diorite_wall","type":0,"input":[{"id":1,"damage":3}],"output":[{"id":139,"damage":3}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_double_stone_slab","type":0,"input":[{"id":1}],"output":[{"id":-166,"damage":2,"count":2}],"block":"stonecutter","priority":5},{"id":"minecraft:stonecutter_endbrick_slab","type":0,"input":[{"id":121}],"output":[{"id":-162,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_endbrick_slab2","type":0,"input":[{"id":206}],"output":[{"id":-162,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_endbrick_stairs","type":0,"input":[{"id":121}],"output":[{"id":-178}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_endbrick_stairs2","type":0,"input":[{"id":206}],"output":[{"id":-178}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_endbrick_wall","type":0,"input":[{"id":121}],"output":[{"id":139,"damage":10}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_endbrick_wall2","type":0,"input":[{"id":206}],"output":[{"id":139,"damage":10}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_endbricks","type":0,"input":[{"id":121}],"output":[{"id":206}],"block":"stonecutter","priority":3},{"id":"minecraft:stonecutter_granite_slab","type":0,"input":[{"id":1,"damage":1}],"output":[{"id":-162,"damage":6,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_granite_stairs","type":0,"input":[{"id":1,"damage":1}],"output":[{"id":-169}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_granite_wall","type":0,"input":[{"id":1,"damage":1}],"output":[{"id":139,"damage":2}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_mossy_cobbledouble_stone_slab","type":0,"input":[{"id":48}],"output":[{"id":182,"damage":5,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_mossy_cobblestone_stairs","type":0,"input":[{"id":48}],"output":[{"id":-179}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_mossy_cobblestone_wall","type":0,"input":[{"id":48}],"output":[{"id":139,"damage":1}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_mossy_stonebrick_slab","type":0,"input":[{"id":98,"damage":1}],"output":[{"id":-166,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_mossy_stonebrick_stairs","type":0,"input":[{"id":98,"damage":1}],"output":[{"id":-175}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_mossy_stonebrick_wall","type":0,"input":[{"id":98,"damage":1}],"output":[{"id":139,"damage":8}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_nether_brick_slab","type":0,"input":[{"id":112}],"output":[{"id":44,"damage":7,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_nether_brick_stairs","type":0,"input":[{"id":112}],"output":[{"id":114}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_nether_brick_wall","type":0,"input":[{"id":112}],"output":[{"id":139,"damage":9}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_polished_andesite","type":0,"input":[{"id":1,"damage":5}],"output":[{"id":1,"damage":6}],"block":"stonecutter","priority":3},{"id":"minecraft:stonecutter_polished_andesite_slab","type":0,"input":[{"id":1,"damage":5}],"output":[{"id":-162,"damage":2,"count":2}],"block":"stonecutter","priority":4},{"id":"minecraft:stonecutter_polished_andesite_slab2","type":0,"input":[{"id":1,"damage":6}],"output":[{"id":-162,"damage":2,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_polished_andesite_stairs","type":0,"input":[{"id":1,"damage":5}],"output":[{"id":-174}],"block":"stonecutter","priority":5},{"id":"minecraft:stonecutter_polished_andesite_stairs2","type":0,"input":[{"id":1,"damage":6}],"output":[{"id":-174}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_polished_diorite","type":0,"input":[{"id":1,"damage":3}],"output":[{"id":1,"damage":4}],"block":"stonecutter","priority":3},{"id":"minecraft:stonecutter_polished_diorite_slab","type":0,"input":[{"id":1,"damage":3}],"output":[{"id":-162,"damage":5,"count":2}],"block":"stonecutter","priority":4},{"id":"minecraft:stonecutter_polished_diorite_slab2","type":0,"input":[{"id":1,"damage":4}],"output":[{"id":-162,"damage":5,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_polished_diorite_stairs","type":0,"input":[{"id":1,"damage":3}],"output":[{"id":-173}],"block":"stonecutter","priority":5},{"id":"minecraft:stonecutter_polished_diorite_stairs2","type":0,"input":[{"id":1,"damage":4}],"output":[{"id":-173}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_polished_granite","type":0,"input":[{"id":1,"damage":1}],"output":[{"id":1,"damage":2}],"block":"stonecutter","priority":3},{"id":"minecraft:stonecutter_polished_granite_slab","type":0,"input":[{"id":1,"damage":1}],"output":[{"id":-162,"damage":7,"count":2}],"block":"stonecutter","priority":4},{"id":"minecraft:stonecutter_polished_granite_slab2","type":0,"input":[{"id":1,"damage":2}],"output":[{"id":-162,"damage":7,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_polished_granite_stairs","type":0,"input":[{"id":1,"damage":1}],"output":[{"id":-172}],"block":"stonecutter","priority":5},{"id":"minecraft:stonecutter_polished_granite_stairs2","type":0,"input":[{"id":1,"damage":2}],"output":[{"id":-172}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_prismarine_brick_slab","type":0,"input":[{"id":168,"damage":2}],"output":[{"id":182,"damage":4,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_prismarine_brick_stairs","type":0,"input":[{"id":168,"damage":2}],"output":[{"id":-4}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_prismarine_slab","type":0,"input":[{"id":168}],"output":[{"id":182,"damage":2,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_prismarine_stairs","type":0,"input":[{"id":168}],"output":[{"id":-2}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_prismarine_wall","type":0,"input":[{"id":168}],"output":[{"id":139,"damage":11}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_purpur_lines","type":0,"input":[{"id":201}],"output":[{"id":201,"damage":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_purpur_slab","type":0,"input":[{"id":201}],"output":[{"id":182,"damage":1,"count":2}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_purpur_stairs","type":0,"input":[{"id":201}],"output":[{"id":203}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_quartz_chiseled","type":0,"input":[{"id":155}],"output":[{"id":155,"damage":1}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_quartz_lines","type":0,"input":[{"id":155}],"output":[{"id":155,"damage":2}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_quartz_slab","type":0,"input":[{"id":155}],"output":[{"id":-166,"damage":1,"count":2}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_quartz_stairs","type":0,"input":[{"id":155}],"output":[{"id":156}],"block":"stonecutter","priority":3},{"id":"minecraft:stonecutter_red_nether_brick_slab","type":0,"input":[{"id":215}],"output":[{"id":182,"damage":7,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_red_nether_brick_stairs","type":0,"input":[{"id":215}],"output":[{"id":-184}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_red_nether_brick_wall","type":0,"input":[{"id":215}],"output":[{"id":139,"damage":13}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_red_sanddouble_stone_slab","type":0,"input":[{"id":179}],"output":[{"id":182,"count":2}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_red_sandstone_cut","type":0,"input":[{"id":179}],"output":[{"id":179,"damage":2}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_red_sandstone_heiroglyphs","type":0,"input":[{"id":179}],"output":[{"id":179,"damage":1}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_red_sandstone_stairs","type":0,"input":[{"id":179}],"output":[{"id":180}],"block":"stonecutter","priority":3},{"id":"minecraft:stonecutter_red_sandstone_wall","type":0,"input":[{"id":179}],"output":[{"id":139,"damage":12}],"block":"stonecutter","priority":4},{"id":"minecraft:stonecutter_sanddouble_stone_slab","type":0,"input":[{"id":24}],"output":[{"id":44,"damage":1,"count":2}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_sandstone_cut","type":0,"input":[{"id":24}],"output":[{"id":24,"damage":2}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_sandstone_heiroglyphs","type":0,"input":[{"id":24}],"output":[{"id":24,"damage":1}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_sandstone_stairs","type":0,"input":[{"id":24}],"output":[{"id":128}],"block":"stonecutter","priority":3},{"id":"minecraft:stonecutter_sandstone_wall","type":0,"input":[{"id":24}],"output":[{"id":139,"damage":5}],"block":"stonecutter","priority":4},{"id":"minecraft:stonecutter_smooth_double_stone_slab","type":0,"input":[{"id":-183}],"output":[{"id":44,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_smooth_quartz_slab","type":0,"input":[{"id":155,"damage":3}],"output":[{"id":-166,"damage":1,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_smooth_quartz_stairs","type":0,"input":[{"id":155,"damage":3}],"output":[{"id":-185}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_smooth_red_sanddouble_stone_slab","type":0,"input":[{"id":179,"damage":3}],"output":[{"id":-162,"damage":1,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_smooth_red_sandstone_stairs","type":0,"input":[{"id":179,"damage":3}],"output":[{"id":-176}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_smooth_sanddouble_stone_slab","type":0,"input":[{"id":24,"damage":3}],"output":[{"id":182,"damage":6,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_smooth_sandstone_stairs","type":0,"input":[{"id":24,"damage":3}],"output":[{"id":-177}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_stone_stairs","type":0,"input":[{"id":1}],"output":[{"id":-180}],"block":"stonecutter","priority":6},{"id":"minecraft:stonecutter_stonebrick","type":0,"input":[{"id":1}],"output":[{"id":98}],"block":"stonecutter","priority":4},{"id":"minecraft:stonecutter_stonebrick_chiseled","type":0,"input":[{"id":1}],"output":[{"id":98,"damage":3}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_stonebrick_slab","type":0,"input":[{"id":1}],"output":[{"id":44,"damage":5,"count":2}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_stonebrick_slab2","type":0,"input":[{"id":98}],"output":[{"id":44,"damage":5,"count":2}],"block":"stonecutter","priority":0},{"id":"minecraft:stonecutter_stonebrick_stairs","type":0,"input":[{"id":1}],"output":[{"id":109}],"block":"stonecutter","priority":2},{"id":"minecraft:stonecutter_stonebrick_stairs2","type":0,"input":[{"id":98}],"output":[{"id":109}],"block":"stonecutter","priority":1},{"id":"minecraft:stonecutter_stonebrick_wall","type":0,"input":[{"id":1}],"output":[{"id":139,"damage":7}],"block":"stonecutter","priority":3},{"id":"minecraft:stonecutter_stonebrick_wall2","type":0,"input":[{"id":98}],"output":[{"id":139,"damage":7}],"block":"stonecutter","priority":2},{"type":4,"uuid":"442d85ed-8272-4543-a6f1-418f90ded05d"},{"type":4,"uuid":"8b36268c-1829-483c-a0f1-993b7156a8f2"},{"type":4,"uuid":"602234e4-cac1-4353-8bb7-b1ebff70024b"},{"id":"minecraft:cartography_table_locator_map","type":0,"input":[{"id":339,"damage":-1},{"id":345,"damage":-1}],"output":[{"id":395,"damage":2}],"block":"cartography_table","priority":0},{"id":"minecraft:cartography_table_map","type":0,"input":[{"id":339,"damage":-1}],"output":[{"id":395}],"block":"cartography_table","priority":0},{"type":4,"uuid":"98c84b38-1085-46bd-b1ce-dd38c159e6cc"},{"type":3,"input":{"id":-212},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":2},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":3},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":4},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":5},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":8},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":9},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":10},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":11},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":12},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-212,"damage":13},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-156,"damage":-1},"output":{"id":351,"damage":10},"block":"furnace"},{"type":3,"input":{"id":-10,"damage":-1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-9,"damage":-1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-8,"damage":-1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-7,"damage":-1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-6,"damage":-1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":-5,"damage":-1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":1},"output":{"id":-183},"block":"furnace"},{"type":3,"input":{"id":4,"damage":-1},"output":{"id":1},"block":"furnace"},{"type":3,"input":{"id":12,"damage":-1},"output":{"id":20},"block":"furnace"},{"type":3,"input":{"id":14,"damage":-1},"output":{"id":266},"block":"furnace"},{"type":3,"input":{"id":14,"damage":-1},"output":{"id":266},"block":"blast_furnace"},{"type":3,"input":{"id":15,"damage":-1},"output":{"id":265},"block":"furnace"},{"type":3,"input":{"id":15,"damage":-1},"output":{"id":265},"block":"blast_furnace"},{"type":3,"input":{"id":16,"damage":-1},"output":{"id":263},"block":"furnace"},{"type":3,"input":{"id":16,"damage":-1},"output":{"id":263},"block":"blast_furnace"},{"type":3,"input":{"id":17},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":17,"damage":1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":17,"damage":2},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":17,"damage":3},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":19,"damage":1},"output":{"id":19},"block":"furnace"},{"type":3,"input":{"id":21,"damage":-1},"output":{"id":351,"damage":4},"block":"furnace"},{"type":3,"input":{"id":21,"damage":-1},"output":{"id":351,"damage":4},"block":"blast_furnace"},{"type":3,"input":{"id":24,"damage":-1},"output":{"id":24,"damage":3},"block":"furnace"},{"type":3,"input":{"id":56,"damage":-1},"output":{"id":264},"block":"furnace"},{"type":3,"input":{"id":56,"damage":-1},"output":{"id":264},"block":"blast_furnace"},{"type":3,"input":{"id":73,"damage":-1},"output":{"id":331},"block":"furnace"},{"type":3,"input":{"id":73,"damage":-1},"output":{"id":331},"block":"blast_furnace"},{"type":3,"input":{"id":81,"damage":-1},"output":{"id":351,"damage":2},"block":"furnace"},{"type":3,"input":{"id":82,"damage":-1},"output":{"id":172},"block":"furnace"},{"type":3,"input":{"id":87,"damage":-1},"output":{"id":405},"block":"furnace"},{"type":3,"input":{"id":98},"output":{"id":98,"damage":2},"block":"furnace"},{"type":3,"input":{"id":129,"damage":-1},"output":{"id":388},"block":"furnace"},{"type":3,"input":{"id":129,"damage":-1},"output":{"id":388},"block":"blast_furnace"},{"type":3,"input":{"id":153,"damage":-1},"output":{"id":406},"block":"furnace"},{"type":3,"input":{"id":153,"damage":-1},"output":{"id":406},"block":"blast_furnace"},{"type":3,"input":{"id":155,"damage":-1},"output":{"id":155,"damage":3},"block":"furnace"},{"type":3,"input":{"id":159},"output":{"id":220},"block":"furnace"},{"type":3,"input":{"id":159,"damage":1},"output":{"id":221},"block":"furnace"},{"type":3,"input":{"id":159,"damage":2},"output":{"id":222},"block":"furnace"},{"type":3,"input":{"id":159,"damage":3},"output":{"id":223},"block":"furnace"},{"type":3,"input":{"id":159,"damage":4},"output":{"id":224},"block":"furnace"},{"type":3,"input":{"id":159,"damage":5},"output":{"id":225},"block":"furnace"},{"type":3,"input":{"id":159,"damage":6},"output":{"id":226},"block":"furnace"},{"type":3,"input":{"id":159,"damage":7},"output":{"id":227},"block":"furnace"},{"type":3,"input":{"id":159,"damage":8},"output":{"id":228},"block":"furnace"},{"type":3,"input":{"id":159,"damage":9},"output":{"id":229},"block":"furnace"},{"type":3,"input":{"id":159,"damage":10},"output":{"id":219},"block":"furnace"},{"type":3,"input":{"id":159,"damage":11},"output":{"id":231},"block":"furnace"},{"type":3,"input":{"id":159,"damage":12},"output":{"id":232},"block":"furnace"},{"type":3,"input":{"id":159,"damage":13},"output":{"id":233},"block":"furnace"},{"type":3,"input":{"id":159,"damage":14},"output":{"id":234},"block":"furnace"},{"type":3,"input":{"id":159,"damage":15},"output":{"id":235},"block":"furnace"},{"type":3,"input":{"id":162},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":162,"damage":1},"output":{"id":263,"damage":1},"block":"furnace"},{"type":3,"input":{"id":179,"damage":-1},"output":{"id":179,"damage":3},"block":"furnace"},{"type":3,"input":{"id":256},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":256},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":257},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":257},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":258},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":258},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":267},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":267},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":283},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":283},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":284},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":284},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":285},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":285},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":286},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":286},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":292},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":292},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":294},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":294},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":302},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":302},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":303},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":303},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":304},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":304},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":305},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":305},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":306},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":306},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":307},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":307},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":308},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":308},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":309},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":309},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":314},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":314},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":315},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":315},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":316},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":316},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":317},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":317},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":319,"damage":-1},"output":{"id":320},"block":"smoker"},{"type":3,"input":{"id":319,"damage":-1},"output":{"id":320},"block":"furnace"},{"type":3,"input":{"id":319,"damage":-1},"output":{"id":320},"block":"campfire"},{"type":3,"input":{"id":335,"damage":-1},"output":{"id":464},"block":"smoker"},{"type":3,"input":{"id":335,"damage":-1},"output":{"id":464},"block":"furnace"},{"type":3,"input":{"id":335,"damage":-1},"output":{"id":464},"block":"campfire"},{"type":3,"input":{"id":337,"damage":-1},"output":{"id":336},"block":"furnace"},{"type":3,"input":{"id":349,"damage":-1},"output":{"id":350},"block":"smoker"},{"type":3,"input":{"id":349,"damage":-1},"output":{"id":350},"block":"furnace"},{"type":3,"input":{"id":349,"damage":-1},"output":{"id":350},"block":"campfire"},{"type":3,"input":{"id":363,"damage":-1},"output":{"id":364},"block":"smoker"},{"type":3,"input":{"id":363,"damage":-1},"output":{"id":364},"block":"furnace"},{"type":3,"input":{"id":363,"damage":-1},"output":{"id":364},"block":"campfire"},{"type":3,"input":{"id":365,"damage":-1},"output":{"id":366},"block":"smoker"},{"type":3,"input":{"id":365,"damage":-1},"output":{"id":366},"block":"furnace"},{"type":3,"input":{"id":365,"damage":-1},"output":{"id":366},"block":"campfire"},{"type":3,"input":{"id":392,"damage":-1},"output":{"id":393},"block":"smoker"},{"type":3,"input":{"id":392,"damage":-1},"output":{"id":393},"block":"furnace"},{"type":3,"input":{"id":392,"damage":-1},"output":{"id":393},"block":"campfire"},{"type":3,"input":{"id":411,"damage":-1},"output":{"id":412},"block":"smoker"},{"type":3,"input":{"id":411,"damage":-1},"output":{"id":412},"block":"furnace"},{"type":3,"input":{"id":411,"damage":-1},"output":{"id":412},"block":"campfire"},{"type":3,"input":{"id":417,"damage":-1},"output":{"id":452},"block":"furnace"},{"type":3,"input":{"id":417,"damage":-1},"output":{"id":452},"block":"blast_furnace"},{"type":3,"input":{"id":418,"damage":-1},"output":{"id":371},"block":"furnace"},{"type":3,"input":{"id":418,"damage":-1},"output":{"id":371},"block":"blast_furnace"},{"type":3,"input":{"id":423,"damage":-1},"output":{"id":424},"block":"smoker"},{"type":3,"input":{"id":423,"damage":-1},"output":{"id":424},"block":"furnace"},{"type":3,"input":{"id":423,"damage":-1},"output":{"id":424},"block":"campfire"},{"type":3,"input":{"id":432,"damage":-1},"output":{"id":433},"block":"furnace"},{"type":3,"input":{"id":460,"damage":-1},"output":{"id":463},"block":"smoker"},{"type":3,"input":{"id":460,"damage":-1},"output":{"id":463},"block":"furnace"},{"type":3,"input":{"id":460,"damage":-1},"output":{"id":463},"block":"campfire"}],"potionMixes":[{"fromPotionId":4,"ingredient":377,"toPotionId":31},{"fromPotionId":4,"ingredient":376,"toPotionId":34},{"fromPotionId":4,"ingredient":370,"toPotionId":28},{"fromPotionId":4,"ingredient":396,"toPotionId":5},{"fromPotionId":4,"ingredient":378,"toPotionId":12},{"fromPotionId":4,"ingredient":470,"toPotionId":40},{"fromPotionId":4,"ingredient":462,"toPotionId":19},{"fromPotionId":4,"ingredient":414,"toPotionId":9},{"fromPotionId":4,"ingredient":382,"toPotionId":21},{"fromPotionId":4,"ingredient":375,"toPotionId":25},{"fromPotionId":4,"ingredient":353,"toPotionId":14},{"fromPotionId":4,"ingredient":469,"toPotionId":37},{"fromPotionId":12,"ingredient":331,"toPotionId":13},{"fromPotionId":23,"ingredient":348,"toPotionId":24},{"fromPotionId":21,"ingredient":376,"toPotionId":23},{"fromPotionId":21,"ingredient":348,"toPotionId":22},{"fromPotionId":7,"ingredient":331,"toPotionId":8},{"fromPotionId":9,"ingredient":376,"toPotionId":17},{"fromPotionId":9,"ingredient":348,"toPotionId":11},{"fromPotionId":9,"ingredient":331,"toPotionId":10},{"fromPotionId":6,"ingredient":376,"toPotionId":8},{"fromPotionId":15,"ingredient":376,"toPotionId":18},{"fromPotionId":10,"ingredient":376,"toPotionId":18},{"fromPotionId":2,"ingredient":376,"toPotionId":35},{"fromPotionId":26,"ingredient":376,"toPotionId":23},{"fromPotionId":32,"ingredient":376,"toPotionId":35},{"fromPotionId":1,"ingredient":376,"toPotionId":34},{"fromPotionId":5,"ingredient":376,"toPotionId":7},{"fromPotionId":5,"ingredient":331,"toPotionId":6},{"fromPotionId":25,"ingredient":376,"toPotionId":23},{"fromPotionId":25,"ingredient":348,"toPotionId":27},{"fromPotionId":25,"ingredient":331,"toPotionId":26},{"fromPotionId":28,"ingredient":348,"toPotionId":30},{"fromPotionId":28,"ingredient":331,"toPotionId":29},{"fromPotionId":17,"ingredient":331,"toPotionId":18},{"fromPotionId":40,"ingredient":331,"toPotionId":41},{"fromPotionId":31,"ingredient":376,"toPotionId":34},{"fromPotionId":31,"ingredient":348,"toPotionId":33},{"fromPotionId":31,"ingredient":331,"toPotionId":32},{"fromPotionId":22,"ingredient":376,"toPotionId":24},{"fromPotionId":27,"ingredient":376,"toPotionId":23},{"fromPotionId":33,"ingredient":376,"toPotionId":34},{"fromPotionId":14,"ingredient":376,"toPotionId":17},{"fromPotionId":14,"ingredient":348,"toPotionId":16},{"fromPotionId":14,"ingredient":331,"toPotionId":15},{"fromPotionId":3,"ingredient":376,"toPotionId":34},{"fromPotionId":37,"ingredient":348,"toPotionId":39},{"fromPotionId":37,"ingredient":331,"toPotionId":38},{"fromPotionId":0,"ingredient":377,"toPotionId":1},{"fromPotionId":19,"ingredient":331,"toPotionId":20},{"fromPotionId":0,"ingredient":376,"toPotionId":34},{"fromPotionId":0,"ingredient":370,"toPotionId":1},{"fromPotionId":0,"ingredient":348,"toPotionId":3},{"fromPotionId":0,"ingredient":378,"toPotionId":1},{"fromPotionId":0,"ingredient":372,"toPotionId":4},{"fromPotionId":0,"ingredient":414,"toPotionId":1},{"fromPotionId":0,"ingredient":331,"toPotionId":1},{"fromPotionId":0,"ingredient":382,"toPotionId":1},{"fromPotionId":0,"ingredient":375,"toPotionId":1},{"fromPotionId":0,"ingredient":353,"toPotionId":1},{"fromPotionId":34,"ingredient":331,"toPotionId":35}],"containerMixes":[{"fromItemId":373,"ingredient":289,"toItemId":438},{"fromItemId":438,"ingredient":437,"toItemId":441}]} \ No newline at end of file diff --git a/src/main/resources/runtime_block_states_388.dat b/src/main/resources/runtime_block_states_388.dat deleted file mode 100644 index fcc4f2ea10609b1b94f5e1a39f7524944b5e2aa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318311 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 diff --git a/src/main/resources/runtime_block_states_389.dat b/src/main/resources/runtime_block_states_389.dat deleted file mode 100644 index 4b94e0961a03b8806dff4dcf0c6aa3c047d45082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379861 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 diff --git a/src/main/resources/runtime_block_states_407.dat b/src/main/resources/runtime_block_states_407.dat deleted file mode 100644 index 4097a34a025d783cf43d592f1691ff1991c7df62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405618 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 av8En3Hq2DaOV(7;FJ~$yt$k2Wlm7#mBpu8E diff --git a/src/main/resources/runtime_block_states_419.dat b/src/main/resources/runtime_block_states_419.dat deleted file mode 100644 index aa0c3659408bb7cf2190d8069ee14098cf920564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431009 zcmdR11#~3WvF(u-v>@2^uI)8bOfj>=cF<wwWYUs)rSXnt#se#_!_3Ug%*@Qp%*@Qm zPx9Z4q^h3VRo$)bdTTl7pMR2-RQL9K1^4l$AlMuP<Iz~Kt`ROo!9fePMl{n7cXzK5 z&V)0yusYrAcAJgSVB_AX-KjMjm8oEAbFiV)4ZBfiG??1$eycH8ovpQ_nXdbJ;Qmty zwlDozwbhO~ooKc?UF!zHXfRTnbw7RdNU&};?1ue++0^bey0wMq688i5A5$KcygVwv zqhiZrBrlH<;4xy$V>B<1QQ$FZ%VS+$9_xU|I$Iv=^YT~^Jk}TGAp<H=l#G`Rz@u=y zl;p9|iih&$BE3qoJ;s2?hNAr<^N{n0z+)5e*l5c`&L0Ag&A?;KmWP}_1Rh&}$0l1I za{dr_Yy}>hZF$J~L*OwEJhl|&AqR%+y+Xa603L<or6i9@mB-G6{+Mkx+lu;dWxCml z8Uu0REP@1?=>KJP-iecF@Eet2ve#-w?do*BIkRU-kpv&n6v<ZVDJy0!sQ@$gFFBZ@ zMmgM^nM*Uk%n7+1%uuyVm@{*U2bkq+Gt@ChmS)!P1q(kzWiw^Ytf-%%);ZdoSy4Yj z^|RfaSy4YjJ#=hoX8n=Ts{M>A59c#fNIT4#<?=Iu8EU4hnKR4fX96=+Q3skc%jIVR zGt^Zllx9{ap9#!RX&r3Ntf-%%_BzR&Sy4YjHFk(Ov!Z^6`t0hZnH9=sq+mIpO@VS; zJNj%JFk3tNY&$SpJNoPZV77Mj*$!Z~cJ$d!V77Mj*@3`p?dY?EfZ5v7X9okbwWH5= z0kgHE&kg}*Ye%0Q3e47yK06GUtsQ-KI51l~`s@f`ws!Q{k-&`g*`bN~v)xf+CaTW4 z)w)8nXj^KH>S9>056_pqTbnOCg_NQ#6Q}+&nBe@_sh*fPwV%NR=fh6(#Kful3??}L zb-ED~Vbqwx1n0ZX@WdqBPjG(gOixU*{RHQ;&ho@0+fQ)*>TDw>!l*CqCp?cp`2^>y z&hf+q{6t`a^Hb+~Vgi05Fv0n#^E@#DKM|PV{L}eHOfvF`zy#-;F7U)8+fQ(Q=|WFT zvi$_-ldj>3Nw%Nh{LwXu$&m?tGT0&1Ye&^qUDqh1!DKs{?YNCdQMFT>YlQW|ZlRS8 zMNie_$hEuxlRs7n7}dwMy#SBU76<}Hv2h(Qz@tfE)E3wE0=zB>j8fuyUVzspfl)bJ z<OO&`5*UTT#a@6nCV^2GT;B`uSP~dzzzw_rZ%P7V)xV(^;LS;3Eb=$<0=y*&j5Ynn zUVyhIfw6?�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%0Dfw^I;4hCb|t-Nuk7?_*vTL$C#dTK@( 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�ge=3JAa2?=C^6*&rp{RR^d;>l*t)@|Nc+usv-{ztwHAh7V}oDi49+c{;Mk?E zb_VC6T!Lf&;tlPzZ#xg?5**vwXPo_V9?~T^cD&CzgHKVk6CB&&=bXWLz6imwSGtRK L0gjFID(}AmOx576 diff --git a/src/main/resources/runtime_block_states_428.dat b/src/main/resources/runtime_block_states_428.dat deleted file mode 100644 index adeab4d7b7a36eae810c11b1bdefd4b7ab33e1b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430907 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 bo#5CG-{=g^^F;`bz0zH@3vg_tmwW#Q+O!%( diff --git a/src/main/resources/runtime_block_states_440.dat b/src/main/resources/runtime_block_states_440.dat deleted file mode 100644 index ea577b153a48b8f1c7d7714c0fc2a84446d147ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430907 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 diff --git a/src/main/resources/runtime_block_states_448.dat b/src/main/resources/runtime_block_states_448.dat deleted file mode 100644 index c1fc224aacad8100c01c2fa4de316e9f4c9ed210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430907 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 T=Zg>=d!@T*7vR`Pul4>LDLrDS diff --git a/src/main/resources/runtime_block_states_465.dat b/src/main/resources/runtime_block_states_465.dat deleted file mode 100644 index bce7f0855610ef418a99bf2b632d46fefb156bc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431099 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∋k`?p1q7 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%0A&1%U#po&$CiL|+gnpuRcQj)Le5yfZ+)fJ){# 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 diff --git a/src/main/resources/runtime_block_states_471.dat b/src/main/resources/runtime_block_states_471.dat deleted file mode 100644 index 52312b884ed46d2e966055757cf107c7b3fae562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431099 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 A2mk;8 diff --git a/src/main/resources/runtime_item_states_361.json b/src/main/resources/runtime_item_states_361.json deleted file mode 100644 index 6f89c676e..000000000 --- a/src/main/resources/runtime_item_states_361.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"minecraft:item.reeds","id":83},{"name":"minecraft:air","id":-158},{"name":"minecraft:stripped_jungle_log","id":-7},{"name":"minecraft:unlit_redstone_torch","id":75},{"name":"minecraft:item.birch_door","id":194},{"name":"minecraft:apple","id":260},{"name":"minecraft:cooked_porkchop","id":320},{"name":"minecraft:beacon","id":138},{"name":"minecraft:stone_stairs","id":67},{"name":"minecraft:appleenchanted","id":466},{"name":"minecraft:tripwire","id":132},{"name":"minecraft:leather_leggings","id":300},{"name":"minecraft:bread","id":297},{"name":"minecraft:porkchop","id":319},{"name":"minecraft:spruce_fence_gate","id":183},{"name":"minecraft:fish","id":349},{"name":"minecraft:element_52","id":-63},{"name":"minecraft:diamond_sword","id":276},{"name":"minecraft:element_38","id":-49},{"name":"minecraft:sandstone_stairs","id":128},{"name":"minecraft:acacia_sign","id":475},{"name":"minecraft:rabbit_stew","id":413},{"name":"minecraft:birch_sign","id":473},{"name":"minecraft:horsearmorgold","id":418},{"name":"minecraft:element_74","id":-85},{"name":"minecraft:pufferfish","id":462},{"name":"minecraft:redstone_block","id":152},{"name":"minecraft:golden_apple","id":322},{"name":"minecraft:item.wooden_door","id":64},{"name":"minecraft:emerald","id":388},{"name":"minecraft:element_47","id":-58},{"name":"minecraft:mushroom_stew","id":282},{"name":"minecraft:stone_axe","id":275},{"name":"minecraft:salmon","id":460},{"name":"minecraft:feather","id":288},{"name":"minecraft:clownfish","id":461},{"name":"minecraft:diamond","id":264},{"name":"minecraft:cooked_fish","id":350},{"name":"minecraft:element_32","id":-43},{"name":"minecraft:double_stone_slab4","id":-166},{"name":"minecraft:element_5","id":-16},{"name":"minecraft:element_25","id":-36},{"name":"minecraft:polished_granite_stairs","id":-172},{"name":"minecraft:bowl","id":281},{"name":"minecraft:red_mushroom_block","id":100},{"name":"minecraft:mossy_stone_brick_stairs","id":-175},{"name":"minecraft:cooked_salmon","id":463},{"name":"minecraft:element_87","id":-98},{"name":"minecraft:pumpkin_seeds","id":361},{"name":"minecraft:element_53","id":-64},{"name":"minecraft:dried_kelp","id":464},{"name":"minecraft:brewingstandblock","id":117},{"name":"minecraft:wooden_pickaxe","id":270},{"name":"minecraft:cookie","id":357},{"name":"minecraft:gold_ingot","id":266},{"name":"minecraft:sweet_berries","id":477},{"name":"minecraft:melon","id":360},{"name":"minecraft:iron_pickaxe","id":257},{"name":"minecraft:glow_stick","id":166},{"name":"minecraft:beef","id":363},{"name":"minecraft:stone_hoe","id":291},{"name":"minecraft:cooked_beef","id":364},{"name":"minecraft:lime_glazed_terracotta","id":225},{"name":"minecraft:chicken","id":365},{"name":"minecraft:element_31","id":-42},{"name":"minecraft:cooked_chicken","id":366},{"name":"minecraft:rotten_flesh","id":367},{"name":"minecraft:darkoak_sign","id":476},{"name":"minecraft:stone_sword","id":272},{"name":"minecraft:spider_eye","id":375},{"name":"minecraft:diamond_axe","id":279},{"name":"minecraft:element_105","id":-116},{"name":"minecraft:carrot","id":391},{"name":"minecraft:stripped_birch_log","id":-6},{"name":"minecraft:potato","id":392},{"name":"minecraft:baked_potato","id":393},{"name":"minecraft:element_15","id":-26},{"name":"minecraft:carpet","id":171},{"name":"minecraft:poisonous_potato","id":394},{"name":"minecraft:beetroot_seeds","id":458},{"name":"minecraft:noteblock","id":25},{"name":"minecraft:golden_carrot","id":396},{"name":"minecraft:pumpkin_pie","id":400},{"name":"minecraft:beetroot","id":457},{"name":"minecraft:coral_fan_dead","id":-134},{"name":"minecraft:iron_ingot","id":265},{"name":"minecraft:beetroot_soup","id":459},{"name":"minecraft:rabbit","id":411},{"name":"minecraft:cooked_rabbit","id":412},{"name":"minecraft:iron_helmet","id":306},{"name":"minecraft:wheat_seeds","id":295},{"name":"minecraft:melon_seeds","id":362},{"name":"minecraft:lit_redstone_ore","id":74},{"name":"minecraft:nether_wart","id":372},{"name":"minecraft:record_strad","id":508},{"name":"minecraft:iron_sword","id":267},{"name":"minecraft:iron_shovel","id":256},{"name":"minecraft:stone_pickaxe","id":274},{"name":"minecraft:leather","id":334},{"name":"minecraft:command_block_minecart","id":443},{"name":"minecraft:stone_shovel","id":273},{"name":"minecraft:written_book","id":387},{"name":"minecraft:diorite_stairs","id":-170},{"name":"minecraft:arrow","id":262},{"name":"minecraft:element_97","id":-108},{"name":"minecraft:campfire","id":720},{"name":"minecraft:polished_andesite_stairs","id":-174},{"name":"minecraft:acacia_stairs","id":163},{"name":"minecraft:iron_axe","id":258},{"name":"minecraft:flint_and_steel","id":259},{"name":"minecraft:bow","id":261},{"name":"minecraft:nautilus_shell","id":465},{"name":"minecraft:coal","id":263},{"name":"minecraft:bookshelf","id":47},{"name":"minecraft:wooden_sword","id":268},{"name":"minecraft:diamond_pickaxe","id":278},{"name":"minecraft:deadbush","id":32},{"name":"minecraft:ender_chest","id":130},{"name":"minecraft:record_stal","id":507},{"name":"minecraft:wooden_shovel","id":269},{"name":"minecraft:dark_oak_trapdoor","id":-147},{"name":"minecraft:record_mall","id":505},{"name":"minecraft:wooden_axe","id":271},{"name":"minecraft:powered_comparator","id":150},{"name":"minecraft:diamond_shovel","id":277},{"name":"minecraft:golden_rail","id":27},{"name":"minecraft:lit_furnace","id":62},{"name":"minecraft:stick","id":280},{"name":"minecraft:slime_ball","id":341},{"name":"minecraft:element_58","id":-69},{"name":"minecraft:golden_sword","id":283},{"name":"minecraft:golden_shovel","id":284},{"name":"minecraft:chest","id":54},{"name":"minecraft:golden_pickaxe","id":285},{"name":"minecraft:golden_axe","id":286},{"name":"minecraft:element_62","id":-73},{"name":"minecraft:string","id":287},{"name":"minecraft:glowstone_dust","id":348},{"name":"minecraft:gunpowder","id":289},{"name":"minecraft:spawn_egg","id":383},{"name":"minecraft:fence","id":85},{"name":"minecraft:wooden_hoe","id":290},{"name":"minecraft:shulker_shell","id":445},{"name":"minecraft:iron_hoe","id":292},{"name":"minecraft:diamond_hoe","id":293},{"name":"minecraft:golden_hoe","id":294},{"name":"minecraft:turtle_shell_piece","id":468},{"name":"minecraft:sweet_berry_bush","id":-207},{"name":"minecraft:info_update2","id":249},{"name":"minecraft:muttoncooked","id":424},{"name":"minecraft:wheat","id":296},{"name":"minecraft:dark_oak_door","id":431},{"name":"minecraft:grindstone","id":-195},{"name":"minecraft:element_46","id":-57},{"name":"minecraft:potion","id":373},{"name":"minecraft:leather_helmet","id":298},{"name":"minecraft:element_48","id":-59},{"name":"minecraft:leather_chestplate","id":299},{"name":"minecraft:leather_boots","id":301},{"name":"minecraft:lectern","id":-194},{"name":"minecraft:smithing_table","id":-202},{"name":"minecraft:bedrock","id":7},{"name":"minecraft:chainmail_helmet","id":302},{"name":"minecraft:stonebrick","id":98},{"name":"minecraft:chainmail_chestplate","id":303},{"name":"minecraft:lit_blast_furnace","id":-214},{"name":"minecraft:element_11","id":-22},{"name":"minecraft:chainmail_leggings","id":304},{"name":"minecraft:saddle","id":329},{"name":"minecraft:purpur_block","id":201},{"name":"minecraft:chainmail_boots","id":305},{"name":"minecraft:ladder","id":65},{"name":"minecraft:iron_chestplate","id":307},{"name":"minecraft:diamond_helmet","id":310},{"name":"minecraft:iron_leggings","id":308},{"name":"minecraft:iron_boots","id":309},{"name":"minecraft:element_104","id":-115},{"name":"minecraft:chorus_fruit_popped","id":433},{"name":"minecraft:diamond_chestplate","id":311},{"name":"minecraft:diamond_leggings","id":312},{"name":"minecraft:element_75","id":-86},{"name":"minecraft:diamond_boots","id":313},{"name":"minecraft:acacia_button","id":-140},{"name":"minecraft:standing_banner","id":176},{"name":"minecraft:golden_helmet","id":314},{"name":"minecraft:golden_chestplate","id":315},{"name":"minecraft:golden_leggings","id":316},{"name":"minecraft:golden_boots","id":317},{"name":"minecraft:item.hopper","id":154},{"name":"minecraft:shield","id":513},{"name":"minecraft:flint","id":318},{"name":"minecraft:painting","id":321},{"name":"minecraft:sign","id":323},{"name":"minecraft:wooden_door","id":324},{"name":"minecraft:bucket","id":325},{"name":"minecraft:minecart","id":328},{"name":"minecraft:prismarine_stairs","id":-2},{"name":"minecraft:iron_door","id":330},{"name":"minecraft:tripwire_hook","id":131},{"name":"minecraft:redstone","id":331},{"name":"minecraft:andesite_stairs","id":-171},{"name":"minecraft:sponge","id":19},{"name":"minecraft:snowball","id":332},{"name":"minecraft:boat","id":333},{"name":"minecraft:item.dark_oak_door","id":197},{"name":"minecraft:kelp","id":335},{"name":"minecraft:brick","id":336},{"name":"minecraft:clay_ball","id":337},{"name":"minecraft:real_double_stone_slab","id":43},{"name":"minecraft:reeds","id":338},{"name":"minecraft:dirt","id":3},{"name":"minecraft:magma","id":213},{"name":"minecraft:red_mushroom","id":40},{"name":"minecraft:paper","id":339},{"name":"minecraft:book","id":340},{"name":"minecraft:chest_minecart","id":342},{"name":"minecraft:flowing_lava","id":10},{"name":"minecraft:element_86","id":-97},{"name":"minecraft:red_glazed_terracotta","id":234},{"name":"minecraft:crafting_table","id":58},{"name":"minecraft:egg","id":344},{"name":"minecraft:real_double_stone_slab4","id":-168},{"name":"minecraft:end_gateway","id":209},{"name":"minecraft:compass","id":345},{"name":"minecraft:horsearmordiamond","id":419},{"name":"minecraft:sapling","id":6},{"name":"minecraft:fishing_rod","id":346},{"name":"minecraft:name_tag","id":421},{"name":"minecraft:clock","id":347},{"name":"minecraft:element_96","id":-107},{"name":"minecraft:dye","id":351},{"name":"minecraft:anvil","id":145},{"name":"minecraft:conduit","id":-157},{"name":"minecraft:bone","id":352},{"name":"minecraft:soul_sand","id":88},{"name":"minecraft:sugar","id":353},{"name":"minecraft:cake","id":354},{"name":"minecraft:element_113","id":-124},{"name":"minecraft:mossy_cobblestone","id":48},{"name":"minecraft:bed","id":355},{"name":"minecraft:flowing_water","id":8},{"name":"minecraft:item.frame","id":199},{"name":"minecraft:repeater","id":356},{"name":"minecraft:map","id":358},{"name":"minecraft:shears","id":359},{"name":"minecraft:double_stone_slab2","id":182},{"name":"minecraft:element_3","id":-14},{"name":"minecraft:element_23","id":-34},{"name":"minecraft:skull","id":397},{"name":"minecraft:ender_pearl","id":368},{"name":"minecraft:carved_pumpkin","id":-155},{"name":"minecraft:yellow_flower","id":37},{"name":"minecraft:shulker_box","id":218},{"name":"minecraft:blaze_rod","id":369},{"name":"minecraft:lit_pumpkin","id":91},{"name":"minecraft:ghast_tear","id":370},{"name":"minecraft:gold_nugget","id":371},{"name":"minecraft:glass_bottle","id":374},{"name":"minecraft:emptymap","id":395},{"name":"minecraft:fermented_spider_eye","id":376},{"name":"minecraft:element_81","id":-92},{"name":"minecraft:monster_egg","id":97},{"name":"minecraft:blaze_powder","id":377},{"name":"minecraft:armor_stand","id":425},{"name":"minecraft:magma_cream","id":378},{"name":"minecraft:brewing_stand","id":379},{"name":"minecraft:darkoak_standing_sign","id":-192},{"name":"minecraft:glowingobsidian","id":246},{"name":"minecraft:cauldron","id":380},{"name":"minecraft:nether_brick","id":112},{"name":"minecraft:ender_eye","id":381},{"name":"minecraft:experience_bottle","id":384},{"name":"minecraft:speckled_melon","id":382},{"name":"minecraft:coral","id":-131},{"name":"minecraft:fireball","id":385},{"name":"minecraft:writable_book","id":386},{"name":"minecraft:frame","id":389},{"name":"minecraft:smoker","id":-198},{"name":"minecraft:flower_pot","id":390},{"name":"minecraft:carrotonastick","id":398},{"name":"minecraft:netherstar","id":399},{"name":"minecraft:element_16","id":-27},{"name":"minecraft:fireworks","id":401},{"name":"minecraft:element_30","id":-41},{"name":"minecraft:fireworkscharge","id":402},{"name":"minecraft:trident","id":455},{"name":"minecraft:enchanted_book","id":403},{"name":"minecraft:comparator","id":404},{"name":"minecraft:netherbrick","id":405},{"name":"minecraft:concrete","id":236},{"name":"minecraft:element_73","id":-84},{"name":"minecraft:quartz","id":406},{"name":"minecraft:tnt_minecart","id":407},{"name":"minecraft:leaves2","id":161},{"name":"minecraft:element_102","id":-113},{"name":"minecraft:coral_fan_hang2","id":-136},{"name":"minecraft:element_67","id":-78},{"name":"minecraft:hopper_minecart","id":408},{"name":"minecraft:lead","id":420},{"name":"minecraft:sea_pickle","id":-156},{"name":"minecraft:hopper","id":410},{"name":"minecraft:rabbit_foot","id":414},{"name":"minecraft:rabbit_hide","id":415},{"name":"minecraft:acacia_standing_sign","id":-190},{"name":"minecraft:horsearmorleather","id":416},{"name":"minecraft:item.wheat","id":59},{"name":"minecraft:horsearmoriron","id":417},{"name":"minecraft:record_13","id":500},{"name":"minecraft:record_cat","id":501},{"name":"minecraft:element_89","id":-100},{"name":"minecraft:stone_button","id":77},{"name":"minecraft:record_blocks","id":502},{"name":"minecraft:bamboo","id":-163},{"name":"minecraft:element_72","id":-83},{"name":"minecraft:record_chirp","id":503},{"name":"minecraft:frosted_ice","id":207},{"name":"minecraft:record_far","id":504},{"name":"minecraft:record_wait","id":511},{"name":"minecraft:spruce_door","id":427},{"name":"minecraft:record_mellohi","id":506},{"name":"minecraft:vine","id":106},{"name":"minecraft:record_ward","id":509},{"name":"minecraft:jungle_stairs","id":136},{"name":"minecraft:ice_bomb","id":453},{"name":"minecraft:record_11","id":510},{"name":"minecraft:prismarine_crystals","id":422},{"name":"minecraft:banner","id":446},{"name":"minecraft:glass_pane","id":102},{"name":"minecraft:muttonraw","id":423},{"name":"minecraft:end_crystal","id":426},{"name":"minecraft:element_55","id":-66},{"name":"minecraft:birch_door","id":428},{"name":"minecraft:darkoak_wall_sign","id":-193},{"name":"minecraft:jungle_door","id":429},{"name":"minecraft:acacia_door","id":430},{"name":"minecraft:element_116","id":-127},{"name":"minecraft:chorus_fruit","id":432},{"name":"minecraft:cobblestone_wall","id":139},{"name":"minecraft:cobblestone","id":4},{"name":"minecraft:dragon_breath","id":437},{"name":"minecraft:cactus","id":81},{"name":"minecraft:splash_potion","id":438},{"name":"minecraft:spruce_stairs","id":134},{"name":"minecraft:loom","id":-204},{"name":"minecraft:powered_repeater","id":94},{"name":"minecraft:lingering_potion","id":441},{"name":"minecraft:elytra","id":444},{"name":"minecraft:prismarine_shard","id":409},{"name":"minecraft:element_112","id":-123},{"name":"minecraft:totem","id":450},{"name":"minecraft:iron_nugget","id":452},{"name":"minecraft:pumpkin_stem","id":104},{"name":"minecraft:element_50","id":-61},{"name":"minecraft:lever","id":69},{"name":"minecraft:heart_of_the_sea","id":467},{"name":"minecraft:element_92","id":-103},{"name":"minecraft:grass","id":2},{"name":"minecraft:turtle_helmet","id":469},{"name":"minecraft:wall_banner","id":177},{"name":"minecraft:spruce_button","id":-144},{"name":"minecraft:phantom_membrane","id":470},{"name":"minecraft:crossbow","id":471},{"name":"minecraft:spruce_sign","id":472},{"name":"minecraft:quartz_stairs","id":156},{"name":"minecraft:daylight_detector_inverted","id":178},{"name":"minecraft:jungle_sign","id":474},{"name":"minecraft:red_flower","id":38},{"name":"minecraft:tallgrass","id":31},{"name":"minecraft:banner_pattern","id":434},{"name":"minecraft:compound","id":499},{"name":"minecraft:bleach","id":451},{"name":"minecraft:element_40","id":-51},{"name":"minecraft:rapid_fertilizer","id":449},{"name":"minecraft:balloon","id":448},{"name":"minecraft:redstone_ore","id":73},{"name":"minecraft:stonecutter_block","id":-197},{"name":"minecraft:medicine","id":447},{"name":"minecraft:gold_block","id":41},{"name":"minecraft:stripped_oak_log","id":-10},{"name":"minecraft:blue_ice","id":-11},{"name":"minecraft:sparkler","id":442},{"name":"minecraft:stone","id":1},{"name":"minecraft:sand","id":12},{"name":"minecraft:stained_hardened_clay","id":159},{"name":"minecraft:wool","id":35},{"name":"minecraft:unpowered_comparator","id":149},{"name":"minecraft:log","id":17},{"name":"minecraft:item.kelp","id":-138},{"name":"minecraft:coral_block","id":-132},{"name":"minecraft:element_54","id":-65},{"name":"minecraft:double_stone_slab","id":44},{"name":"minecraft:double_stone_slab3","id":-162},{"name":"minecraft:element_2","id":-13},{"name":"minecraft:element_22","id":-33},{"name":"minecraft:real_double_stone_slab2","id":181},{"name":"minecraft:real_double_stone_slab3","id":-167},{"name":"minecraft:coral_fan","id":-133},{"name":"minecraft:leaves","id":18},{"name":"minecraft:element_10","id":-21},{"name":"minecraft:birch_button","id":-141},{"name":"minecraft:sandstone","id":24},{"name":"minecraft:red_sandstone","id":179},{"name":"minecraft:element_91","id":-102},{"name":"minecraft:wooden_slab","id":158},{"name":"minecraft:end_stone","id":121},{"name":"minecraft:double_plant","id":175},{"name":"minecraft:waterlily","id":111},{"name":"minecraft:snow_layer","id":78},{"name":"minecraft:black_glazed_terracotta","id":235},{"name":"minecraft:planks","id":5},{"name":"minecraft:redstone_torch","id":76},{"name":"minecraft:quartz_block","id":155},{"name":"minecraft:seagrass","id":-130},{"name":"minecraft:brown_mushroom_block","id":99},{"name":"minecraft:log2","id":162},{"name":"minecraft:end_portal_frame","id":120},{"name":"minecraft:lantern","id":-208},{"name":"minecraft:prismarine","id":168},{"name":"minecraft:sealantern","id":169},{"name":"minecraft:hard_stained_glass","id":254},{"name":"minecraft:concrete_powder","id":237},{"name":"minecraft:stained_glass","id":241},{"name":"minecraft:element_82","id":-93},{"name":"minecraft:stained_glass_pane","id":160},{"name":"minecraft:quartz_ore","id":153},{"name":"minecraft:undyed_shulker_box","id":205},{"name":"minecraft:element_107","id":-118},{"name":"minecraft:piston","id":33},{"name":"minecraft:sticky_piston","id":29},{"name":"minecraft:turtle_egg","id":-159},{"name":"minecraft:acacia_fence_gate","id":187},{"name":"minecraft:colored_torch_bp","id":204},{"name":"minecraft:lava","id":11},{"name":"minecraft:scaffolding","id":-165},{"name":"minecraft:blast_furnace","id":-196},{"name":"minecraft:item.cauldron","id":118},{"name":"minecraft:barrel","id":-203},{"name":"minecraft:bell","id":-206},{"name":"minecraft:element_42","id":-53},{"name":"minecraft:cartography_table","id":-200},{"name":"minecraft:end_rod","id":208},{"name":"minecraft:fletching_table","id":-201},{"name":"minecraft:wood","id":-212},{"name":"minecraft:chemistry_table","id":238},{"name":"minecraft:element_70","id":-81},{"name":"minecraft:tnt","id":46},{"name":"minecraft:hard_stained_glass_pane","id":191},{"name":"minecraft:colored_torch_rg","id":202},{"name":"minecraft:brown_mushroom","id":39},{"name":"minecraft:element_0","id":36},{"name":"minecraft:element_20","id":-31},{"name":"minecraft:element_1","id":-12},{"name":"minecraft:element_21","id":-32},{"name":"minecraft:element_4","id":-15},{"name":"minecraft:element_24","id":-35},{"name":"minecraft:element_6","id":-17},{"name":"minecraft:element_26","id":-37},{"name":"minecraft:element_7","id":-18},{"name":"minecraft:element_27","id":-38},{"name":"minecraft:element_8","id":-19},{"name":"minecraft:element_28","id":-39},{"name":"minecraft:dark_oak_pressure_plate","id":-152},{"name":"minecraft:element_9","id":-20},{"name":"minecraft:element_29","id":-40},{"name":"minecraft:item.spruce_door","id":193},{"name":"minecraft:element_12","id":-23},{"name":"minecraft:cyan_glazed_terracotta","id":229},{"name":"minecraft:element_13","id":-24},{"name":"minecraft:element_14","id":-25},{"name":"minecraft:iron_ore","id":15},{"name":"minecraft:element_17","id":-28},{"name":"minecraft:element_18","id":-29},{"name":"minecraft:birch_pressure_plate","id":-151},{"name":"minecraft:element_19","id":-30},{"name":"minecraft:wooden_pressure_plate","id":72},{"name":"minecraft:element_33","id":-44},{"name":"minecraft:element_34","id":-45},{"name":"minecraft:element_35","id":-46},{"name":"minecraft:composter","id":-213},{"name":"minecraft:element_36","id":-47},{"name":"minecraft:element_37","id":-48},{"name":"minecraft:element_39","id":-50},{"name":"minecraft:element_41","id":-52},{"name":"minecraft:hay_block","id":170},{"name":"minecraft:element_43","id":-54},{"name":"minecraft:lit_redstone_lamp","id":124},{"name":"minecraft:element_44","id":-55},{"name":"minecraft:element_45","id":-56},{"name":"minecraft:element_49","id":-60},{"name":"minecraft:element_51","id":-62},{"name":"minecraft:element_56","id":-67},{"name":"minecraft:element_57","id":-68},{"name":"minecraft:element_59","id":-70},{"name":"minecraft:element_60","id":-71},{"name":"minecraft:dropper","id":125},{"name":"minecraft:element_61","id":-72},{"name":"minecraft:element_63","id":-74},{"name":"minecraft:element_64","id":-75},{"name":"minecraft:element_65","id":-76},{"name":"minecraft:coral_fan_hang3","id":-137},{"name":"minecraft:element_66","id":-77},{"name":"minecraft:redstone_lamp","id":123},{"name":"minecraft:element_68","id":-79},{"name":"minecraft:spruce_trapdoor","id":-149},{"name":"minecraft:purple_glazed_terracotta","id":219},{"name":"minecraft:element_69","id":-80},{"name":"minecraft:iron_block","id":42},{"name":"minecraft:element_71","id":-82},{"name":"minecraft:element_76","id":-87},{"name":"minecraft:element_77","id":-88},{"name":"minecraft:water","id":9},{"name":"minecraft:element_78","id":-89},{"name":"minecraft:element_79","id":-90},{"name":"minecraft:element_80","id":-91},{"name":"minecraft:netherreactor","id":247},{"name":"minecraft:element_83","id":-94},{"name":"minecraft:element_84","id":-95},{"name":"minecraft:jungle_wall_sign","id":-189},{"name":"minecraft:end_brick_stairs","id":-178},{"name":"minecraft:element_85","id":-96},{"name":"minecraft:element_88","id":-99},{"name":"minecraft:element_90","id":-101},{"name":"minecraft:birch_standing_sign","id":-186},{"name":"minecraft:gold_ore","id":14},{"name":"minecraft:element_93","id":-104},{"name":"minecraft:element_94","id":-105},{"name":"minecraft:element_95","id":-106},{"name":"minecraft:glass","id":20},{"name":"minecraft:red_nether_brick","id":215},{"name":"minecraft:element_98","id":-109},{"name":"minecraft:element_99","id":-110},{"name":"minecraft:element_100","id":-111},{"name":"minecraft:element_101","id":-112},{"name":"minecraft:element_103","id":-114},{"name":"minecraft:element_106","id":-117},{"name":"minecraft:element_108","id":-119},{"name":"minecraft:element_109","id":-120},{"name":"minecraft:element_110","id":-121},{"name":"minecraft:element_111","id":-122},{"name":"minecraft:element_114","id":-125},{"name":"minecraft:birch_fence_gate","id":184},{"name":"minecraft:element_115","id":-126},{"name":"minecraft:element_117","id":-128},{"name":"minecraft:slime","id":165},{"name":"minecraft:spruce_standing_sign","id":-181},{"name":"minecraft:element_118","id":-129},{"name":"minecraft:gravel","id":13},{"name":"minecraft:detector_rail","id":28},{"name":"minecraft:oak_stairs","id":53},{"name":"minecraft:coal_ore","id":16},{"name":"minecraft:diamond_block","id":57},{"name":"minecraft:item.cake","id":92},{"name":"minecraft:spruce_pressure_plate","id":-154},{"name":"minecraft:diamond_ore","id":56},{"name":"minecraft:furnace","id":61},{"name":"minecraft:underwater_torch","id":239},{"name":"minecraft:web","id":30},{"name":"minecraft:jungle_standing_sign","id":-188},{"name":"minecraft:standing_sign","id":63},{"name":"minecraft:lapis_ore","id":21},{"name":"minecraft:item.bed","id":26},{"name":"minecraft:lapis_block","id":22},{"name":"minecraft:stripped_acacia_log","id":-8},{"name":"minecraft:dispenser","id":23},{"name":"minecraft:obsidian","id":49},{"name":"minecraft:brick_block","id":45},{"name":"minecraft:dried_kelp_block","id":-139},{"name":"minecraft:structure_block","id":252},{"name":"minecraft:pistonarmcollision","id":34},{"name":"minecraft:green_glazed_terracotta","id":233},{"name":"minecraft:acacia_trapdoor","id":-145},{"name":"minecraft:carrots","id":141},{"name":"minecraft:rail","id":66},{"name":"minecraft:torch","id":50},{"name":"minecraft:mob_spawner","id":52},{"name":"minecraft:lava_cauldron","id":-210},{"name":"minecraft:redstone_wire","id":55},{"name":"minecraft:farmland","id":60},{"name":"minecraft:wall_sign","id":68},{"name":"minecraft:stone_pressure_plate","id":70},{"name":"minecraft:red_sandstone_stairs","id":180},{"name":"minecraft:item.iron_door","id":71},{"name":"minecraft:red_nether_brick_stairs","id":-184},{"name":"minecraft:ice","id":79},{"name":"minecraft:snow","id":80},{"name":"minecraft:command_block","id":137},{"name":"minecraft:clay","id":82},{"name":"minecraft:jukebox","id":84},{"name":"minecraft:pumpkin","id":86},{"name":"minecraft:item.acacia_door","id":196},{"name":"minecraft:nether_brick_stairs","id":114},{"name":"minecraft:netherrack","id":87},{"name":"minecraft:glowstone","id":89},{"name":"minecraft:hard_glass","id":253},{"name":"minecraft:portal","id":90},{"name":"minecraft:item.beetroot","id":244},{"name":"minecraft:unpowered_repeater","id":93},{"name":"minecraft:invisiblebedrock","id":95},{"name":"minecraft:trapdoor","id":96},{"name":"minecraft:item.jungle_door","id":195},{"name":"minecraft:iron_bars","id":101},{"name":"minecraft:chain_command_block","id":189},{"name":"minecraft:melon_block","id":103},{"name":"minecraft:emerald_block","id":133},{"name":"minecraft:chemical_heat","id":192},{"name":"minecraft:melon_stem","id":105},{"name":"minecraft:fence_gate","id":107},{"name":"minecraft:brick_stairs","id":108},{"name":"minecraft:stone_brick_stairs","id":109},{"name":"minecraft:mycelium","id":110},{"name":"minecraft:smooth_stone","id":-183},{"name":"minecraft:nether_brick_fence","id":113},{"name":"minecraft:item.nether_wart","id":115},{"name":"minecraft:enchanting_table","id":116},{"name":"minecraft:end_portal","id":119},{"name":"minecraft:dragon_egg","id":122},{"name":"minecraft:granite_stairs","id":-169},{"name":"minecraft:podzol","id":243},{"name":"minecraft:activator_rail","id":126},{"name":"minecraft:cocoa","id":127},{"name":"minecraft:emerald_ore","id":129},{"name":"minecraft:brown_glazed_terracotta","id":232},{"name":"minecraft:pink_glazed_terracotta","id":226},{"name":"minecraft:observer","id":251},{"name":"minecraft:info_update","id":248},{"name":"minecraft:birch_stairs","id":135},{"name":"minecraft:coral_fan_hang","id":-135},{"name":"minecraft:packed_ice","id":174},{"name":"minecraft:item.flower_pot","id":140},{"name":"minecraft:potatoes","id":142},{"name":"minecraft:wooden_button","id":143},{"name":"minecraft:item.skull","id":144},{"name":"minecraft:trapped_chest","id":146},{"name":"minecraft:light_weighted_pressure_plate","id":147},{"name":"minecraft:heavy_weighted_pressure_plate","id":148},{"name":"minecraft:daylight_detector","id":151},{"name":"minecraft:smooth_sandstone_stairs","id":-177},{"name":"minecraft:repeating_command_block","id":188},{"name":"minecraft:double_wooden_slab","id":157},{"name":"minecraft:dark_oak_stairs","id":164},{"name":"minecraft:iron_trapdoor","id":167},{"name":"minecraft:hardened_clay","id":172},{"name":"minecraft:coal_block","id":173},{"name":"minecraft:purpur_stairs","id":203},{"name":"minecraft:jungle_fence_gate","id":185},{"name":"minecraft:dark_oak_fence_gate","id":186},{"name":"minecraft:grass_path","id":198},{"name":"minecraft:bone_block","id":216},{"name":"minecraft:normal_stone_stairs","id":-180},{"name":"minecraft:chorus_flower","id":200},{"name":"minecraft:jungle_pressure_plate","id":-153},{"name":"minecraft:end_bricks","id":206},{"name":"minecraft:blue_glazed_terracotta","id":231},{"name":"minecraft:movingblock","id":250},{"name":"minecraft:light_blue_glazed_terracotta","id":223},{"name":"minecraft:nether_wart_block","id":214},{"name":"minecraft:white_glazed_terracotta","id":220},{"name":"minecraft:orange_glazed_terracotta","id":221},{"name":"minecraft:magenta_glazed_terracotta","id":222},{"name":"minecraft:yellow_glazed_terracotta","id":224},{"name":"minecraft:barrier","id":-161},{"name":"minecraft:gray_glazed_terracotta","id":227},{"name":"minecraft:silver_glazed_terracotta","id":228},{"name":"minecraft:chorus_plant","id":240},{"name":"minecraft:stonecutter","id":245},{"name":"minecraft:reserved6","id":255},{"name":"minecraft:dark_prismarine_stairs","id":-3},{"name":"minecraft:prismarine_bricks_stairs","id":-4},{"name":"minecraft:stripped_spruce_log","id":-5},{"name":"minecraft:stripped_dark_oak_log","id":-9},{"name":"minecraft:fire","id":51},{"name":"minecraft:hard_glass_pane","id":190},{"name":"minecraft:mossy_cobblestone_stairs","id":-179},{"name":"minecraft:smooth_red_sandstone_stairs","id":-176},{"name":"minecraft:bamboo_sapling","id":-164},{"name":"minecraft:jungle_button","id":-143},{"name":"minecraft:birch_wall_sign","id":-187},{"name":"minecraft:spruce_wall_sign","id":-182},{"name":"minecraft:jungle_trapdoor","id":-148},{"name":"minecraft:dark_oak_button","id":-142},{"name":"minecraft:birch_trapdoor","id":-146},{"name":"minecraft:jigsaw","id":-211},{"name":"minecraft:acacia_pressure_plate","id":-150},{"name":"minecraft:bubble_column","id":-160},{"name":"minecraft:polished_diorite_stairs","id":-173},{"name":"minecraft:smooth_quartz_stairs","id":-185},{"name":"minecraft:acacia_wall_sign","id":-191},{"name":"minecraft:lit_smoker","id":-199},{"name":"minecraft:item.campfire","id":-209}] \ No newline at end of file diff --git a/src/main/resources/runtime_item_states_419.json b/src/main/resources/runtime_item_states_419.json deleted file mode 100644 index f979f2ba9..000000000 --- a/src/main/resources/runtime_item_states_419.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"minecraft:acacia_boat","id":377},{"name":"minecraft:acacia_button","id":-140},{"name":"minecraft:acacia_door","id":546},{"name":"minecraft:acacia_fence_gate","id":187},{"name":"minecraft:acacia_pressure_plate","id":-150},{"name":"minecraft:acacia_sign","id":569},{"name":"minecraft:acacia_stairs","id":163},{"name":"minecraft:acacia_standing_sign","id":-190},{"name":"minecraft:acacia_trapdoor","id":-145},{"name":"minecraft:acacia_wall_sign","id":-191},{"name":"minecraft:activator_rail","id":126},{"name":"minecraft:agent_spawn_egg","id":485},{"name":"minecraft:air","id":-158},{"name":"minecraft:allow","id":210},{"name":"minecraft:ancient_debris","id":-271},{"name":"minecraft:andesite_stairs","id":-171},{"name":"minecraft:anvil","id":145},{"name":"minecraft:apple","id":257},{"name":"minecraft:armor_stand","id":542},{"name":"minecraft:arrow","id":301},{"name":"minecraft:baked_potato","id":281},{"name":"minecraft:balloon","id":587},{"name":"minecraft:bamboo","id":-163},{"name":"minecraft:bamboo_sapling","id":-164},{"name":"minecraft:banner","id":557},{"name":"minecraft:banner_pattern","id":613},{"name":"minecraft:barrel","id":-203},{"name":"minecraft:barrier","id":-161},{"name":"minecraft:basalt","id":-234},{"name":"minecraft:bat_spawn_egg","id":451},{"name":"minecraft:beacon","id":138},{"name":"minecraft:bed","id":416},{"name":"minecraft:bedrock","id":7},{"name":"minecraft:bee_nest","id":-218},{"name":"minecraft:bee_spawn_egg","id":492},{"name":"minecraft:beef","id":273},{"name":"minecraft:beehive","id":-219},{"name":"minecraft:beetroot","id":285},{"name":"minecraft:beetroot_seeds","id":295},{"name":"minecraft:beetroot_soup","id":286},{"name":"minecraft:bell","id":-206},{"name":"minecraft:birch_boat","id":374},{"name":"minecraft:birch_button","id":-141},{"name":"minecraft:birch_door","id":544},{"name":"minecraft:birch_fence_gate","id":184},{"name":"minecraft:birch_pressure_plate","id":-151},{"name":"minecraft:birch_sign","id":567},{"name":"minecraft:birch_stairs","id":135},{"name":"minecraft:birch_standing_sign","id":-186},{"name":"minecraft:birch_trapdoor","id":-146},{"name":"minecraft:birch_wall_sign","id":-187},{"name":"minecraft:black_dye","id":393},{"name":"minecraft:black_glazed_terracotta","id":235},{"name":"minecraft:blackstone","id":-273},{"name":"minecraft:blackstone_double_slab","id":-283},{"name":"minecraft:blackstone_slab","id":-282},{"name":"minecraft:blackstone_stairs","id":-276},{"name":"minecraft:blackstone_wall","id":-277},{"name":"minecraft:blast_furnace","id":-196},{"name":"minecraft:blaze_powder","id":427},{"name":"minecraft:blaze_rod","id":421},{"name":"minecraft:blaze_spawn_egg","id":454},{"name":"minecraft:bleach","id":585},{"name":"minecraft:blue_dye","id":397},{"name":"minecraft:blue_glazed_terracotta","id":231},{"name":"minecraft:blue_ice","id":-11},{"name":"minecraft:boat","id":611},{"name":"minecraft:bone","id":413},{"name":"minecraft:bone_block","id":216},{"name":"minecraft:bone_meal","id":409},{"name":"minecraft:book","id":385},{"name":"minecraft:bookshelf","id":47},{"name":"minecraft:border_block","id":212},{"name":"minecraft:bordure_indented_banner_pattern","id":576},{"name":"minecraft:bow","id":300},{"name":"minecraft:bowl","id":321},{"name":"minecraft:bread","id":261},{"name":"minecraft:brewing_stand","id":429},{"name":"minecraft:brewingstandblock","id":117},{"name":"minecraft:brick","id":381},{"name":"minecraft:brick_block","id":45},{"name":"minecraft:brick_stairs","id":108},{"name":"minecraft:brown_dye","id":396},{"name":"minecraft:brown_glazed_terracotta","id":232},{"name":"minecraft:brown_mushroom","id":39},{"name":"minecraft:brown_mushroom_block","id":99},{"name":"minecraft:bubble_column","id":-160},{"name":"minecraft:bucket","id":360},{"name":"minecraft:cactus","id":81},{"name":"minecraft:cake","id":415},{"name":"minecraft:camera","id":582},{"name":"minecraft:campfire","id":578},{"name":"minecraft:carpet","id":171},{"name":"minecraft:carrot","id":279},{"name":"minecraft:carrot_on_a_stick","id":507},{"name":"minecraft:carrots","id":141},{"name":"minecraft:cartography_table","id":-200},{"name":"minecraft:carved_pumpkin","id":-155},{"name":"minecraft:cat_spawn_egg","id":486},{"name":"minecraft:cauldron","id":430},{"name":"minecraft:cave_spider_spawn_egg","id":455},{"name":"minecraft:chain","id":607},{"name":"minecraft:chain_command_block","id":189},{"name":"minecraft:chainmail_boots","id":342},{"name":"minecraft:chainmail_chestplate","id":340},{"name":"minecraft:chainmail_helmet","id":339},{"name":"minecraft:chainmail_leggings","id":341},{"name":"minecraft:charcoal","id":303},{"name":"minecraft:chemical_heat","id":192},{"name":"minecraft:chemistry_table","id":238},{"name":"minecraft:chest","id":54},{"name":"minecraft:chest_minecart","id":387},{"name":"minecraft:chicken","id":275},{"name":"minecraft:chicken_spawn_egg","id":433},{"name":"minecraft:chiseled_nether_bricks","id":-302},{"name":"minecraft:chiseled_polished_blackstone","id":-279},{"name":"minecraft:chorus_flower","id":200},{"name":"minecraft:chorus_fruit","id":548},{"name":"minecraft:chorus_plant","id":240},{"name":"minecraft:clay","id":82},{"name":"minecraft:clay_ball","id":382},{"name":"minecraft:clock","id":391},{"name":"minecraft:coal","id":302},{"name":"minecraft:coal_block","id":173},{"name":"minecraft:coal_ore","id":16},{"name":"minecraft:cobblestone","id":4},{"name":"minecraft:cobblestone_wall","id":139},{"name":"minecraft:cocoa","id":127},{"name":"minecraft:cocoa_beans","id":410},{"name":"minecraft:cod","id":264},{"name":"minecraft:cod_bucket","id":364},{"name":"minecraft:cod_spawn_egg","id":478},{"name":"minecraft:colored_torch_bp","id":204},{"name":"minecraft:colored_torch_rg","id":202},{"name":"minecraft:command_block","id":137},{"name":"minecraft:command_block_minecart","id":553},{"name":"minecraft:comparator","id":512},{"name":"minecraft:compass","id":389},{"name":"minecraft:composter","id":-213},{"name":"minecraft:compound","id":583},{"name":"minecraft:concrete","id":236},{"name":"minecraft:concrete_powder","id":237},{"name":"minecraft:conduit","id":-157},{"name":"minecraft:cooked_beef","id":274},{"name":"minecraft:cooked_chicken","id":276},{"name":"minecraft:cooked_cod","id":268},{"name":"minecraft:cooked_mutton","id":541},{"name":"minecraft:cooked_porkchop","id":263},{"name":"minecraft:cooked_rabbit","id":289},{"name":"minecraft:cooked_salmon","id":269},{"name":"minecraft:cookie","id":271},{"name":"minecraft:coral","id":-131},{"name":"minecraft:coral_block","id":-132},{"name":"minecraft:coral_fan","id":-133},{"name":"minecraft:coral_fan_dead","id":-134},{"name":"minecraft:coral_fan_hang","id":-135},{"name":"minecraft:coral_fan_hang2","id":-136},{"name":"minecraft:coral_fan_hang3","id":-137},{"name":"minecraft:cow_spawn_egg","id":434},{"name":"minecraft:cracked_nether_bricks","id":-303},{"name":"minecraft:cracked_polished_blackstone_bricks","id":-280},{"name":"minecraft:crafting_table","id":58},{"name":"minecraft:creeper_banner_pattern","id":572},{"name":"minecraft:creeper_spawn_egg","id":439},{"name":"minecraft:crimson_button","id":-260},{"name":"minecraft:crimson_door","id":604},{"name":"minecraft:crimson_double_slab","id":-266},{"name":"minecraft:crimson_fence","id":-256},{"name":"minecraft:crimson_fence_gate","id":-258},{"name":"minecraft:crimson_fungus","id":-228},{"name":"minecraft:crimson_hyphae","id":-299},{"name":"minecraft:crimson_nylium","id":-232},{"name":"minecraft:crimson_planks","id":-242},{"name":"minecraft:crimson_pressure_plate","id":-262},{"name":"minecraft:crimson_roots","id":-223},{"name":"minecraft:crimson_sign","id":602},{"name":"minecraft:crimson_slab","id":-264},{"name":"minecraft:crimson_stairs","id":-254},{"name":"minecraft:crimson_standing_sign","id":-250},{"name":"minecraft:crimson_stem","id":-225},{"name":"minecraft:crimson_trapdoor","id":-246},{"name":"minecraft:crimson_wall_sign","id":-252},{"name":"minecraft:crossbow","id":565},{"name":"minecraft:crying_obsidian","id":-289},{"name":"minecraft:cyan_dye","id":399},{"name":"minecraft:cyan_glazed_terracotta","id":229},{"name":"minecraft:dark_oak_boat","id":378},{"name":"minecraft:dark_oak_button","id":-142},{"name":"minecraft:dark_oak_door","id":547},{"name":"minecraft:dark_oak_fence_gate","id":186},{"name":"minecraft:dark_oak_pressure_plate","id":-152},{"name":"minecraft:dark_oak_sign","id":570},{"name":"minecraft:dark_oak_stairs","id":164},{"name":"minecraft:dark_oak_trapdoor","id":-147},{"name":"minecraft:dark_prismarine_stairs","id":-3},{"name":"minecraft:darkoak_standing_sign","id":-192},{"name":"minecraft:darkoak_wall_sign","id":-193},{"name":"minecraft:daylight_detector","id":151},{"name":"minecraft:daylight_detector_inverted","id":178},{"name":"minecraft:deadbush","id":32},{"name":"minecraft:deny","id":211},{"name":"minecraft:detector_rail","id":28},{"name":"minecraft:diamond","id":304},{"name":"minecraft:diamond_axe","id":319},{"name":"minecraft:diamond_block","id":57},{"name":"minecraft:diamond_boots","id":350},{"name":"minecraft:diamond_chestplate","id":348},{"name":"minecraft:diamond_helmet","id":347},{"name":"minecraft:diamond_hoe","id":332},{"name":"minecraft:diamond_horse_armor","id":523},{"name":"minecraft:diamond_leggings","id":349},{"name":"minecraft:diamond_ore","id":56},{"name":"minecraft:diamond_pickaxe","id":318},{"name":"minecraft:diamond_shovel","id":317},{"name":"minecraft:diamond_sword","id":316},{"name":"minecraft:diorite_stairs","id":-170},{"name":"minecraft:dirt","id":3},{"name":"minecraft:dispenser","id":23},{"name":"minecraft:dolphin_spawn_egg","id":482},{"name":"minecraft:donkey_spawn_egg","id":463},{"name":"minecraft:double_plant","id":175},{"name":"minecraft:double_stone_slab","id":44},{"name":"minecraft:double_stone_slab2","id":182},{"name":"minecraft:double_stone_slab3","id":-162},{"name":"minecraft:double_stone_slab4","id":-166},{"name":"minecraft:double_wooden_slab","id":157},{"name":"minecraft:dragon_breath","id":550},{"name":"minecraft:dragon_egg","id":122},{"name":"minecraft:dried_kelp","id":270},{"name":"minecraft:dried_kelp_block","id":-139},{"name":"minecraft:dropper","id":125},{"name":"minecraft:drowned_spawn_egg","id":481},{"name":"minecraft:dye","id":612},{"name":"minecraft:egg","id":388},{"name":"minecraft:elder_guardian_spawn_egg","id":469},{"name":"minecraft:element_0","id":36},{"name":"minecraft:element_1","id":-12},{"name":"minecraft:element_10","id":-21},{"name":"minecraft:element_100","id":-111},{"name":"minecraft:element_101","id":-112},{"name":"minecraft:element_102","id":-113},{"name":"minecraft:element_103","id":-114},{"name":"minecraft:element_104","id":-115},{"name":"minecraft:element_105","id":-116},{"name":"minecraft:element_106","id":-117},{"name":"minecraft:element_107","id":-118},{"name":"minecraft:element_108","id":-119},{"name":"minecraft:element_109","id":-120},{"name":"minecraft:element_11","id":-22},{"name":"minecraft:element_110","id":-121},{"name":"minecraft:element_111","id":-122},{"name":"minecraft:element_112","id":-123},{"name":"minecraft:element_113","id":-124},{"name":"minecraft:element_114","id":-125},{"name":"minecraft:element_115","id":-126},{"name":"minecraft:element_116","id":-127},{"name":"minecraft:element_117","id":-128},{"name":"minecraft:element_118","id":-129},{"name":"minecraft:element_12","id":-23},{"name":"minecraft:element_13","id":-24},{"name":"minecraft:element_14","id":-25},{"name":"minecraft:element_15","id":-26},{"name":"minecraft:element_16","id":-27},{"name":"minecraft:element_17","id":-28},{"name":"minecraft:element_18","id":-29},{"name":"minecraft:element_19","id":-30},{"name":"minecraft:element_2","id":-13},{"name":"minecraft:element_20","id":-31},{"name":"minecraft:element_21","id":-32},{"name":"minecraft:element_22","id":-33},{"name":"minecraft:element_23","id":-34},{"name":"minecraft:element_24","id":-35},{"name":"minecraft:element_25","id":-36},{"name":"minecraft:element_26","id":-37},{"name":"minecraft:element_27","id":-38},{"name":"minecraft:element_28","id":-39},{"name":"minecraft:element_29","id":-40},{"name":"minecraft:element_3","id":-14},{"name":"minecraft:element_30","id":-41},{"name":"minecraft:element_31","id":-42},{"name":"minecraft:element_32","id":-43},{"name":"minecraft:element_33","id":-44},{"name":"minecraft:element_34","id":-45},{"name":"minecraft:element_35","id":-46},{"name":"minecraft:element_36","id":-47},{"name":"minecraft:element_37","id":-48},{"name":"minecraft:element_38","id":-49},{"name":"minecraft:element_39","id":-50},{"name":"minecraft:element_4","id":-15},{"name":"minecraft:element_40","id":-51},{"name":"minecraft:element_41","id":-52},{"name":"minecraft:element_42","id":-53},{"name":"minecraft:element_43","id":-54},{"name":"minecraft:element_44","id":-55},{"name":"minecraft:element_45","id":-56},{"name":"minecraft:element_46","id":-57},{"name":"minecraft:element_47","id":-58},{"name":"minecraft:element_48","id":-59},{"name":"minecraft:element_49","id":-60},{"name":"minecraft:element_5","id":-16},{"name":"minecraft:element_50","id":-61},{"name":"minecraft:element_51","id":-62},{"name":"minecraft:element_52","id":-63},{"name":"minecraft:element_53","id":-64},{"name":"minecraft:element_54","id":-65},{"name":"minecraft:element_55","id":-66},{"name":"minecraft:element_56","id":-67},{"name":"minecraft:element_57","id":-68},{"name":"minecraft:element_58","id":-69},{"name":"minecraft:element_59","id":-70},{"name":"minecraft:element_6","id":-17},{"name":"minecraft:element_60","id":-71},{"name":"minecraft:element_61","id":-72},{"name":"minecraft:element_62","id":-73},{"name":"minecraft:element_63","id":-74},{"name":"minecraft:element_64","id":-75},{"name":"minecraft:element_65","id":-76},{"name":"minecraft:element_66","id":-77},{"name":"minecraft:element_67","id":-78},{"name":"minecraft:element_68","id":-79},{"name":"minecraft:element_69","id":-80},{"name":"minecraft:element_7","id":-18},{"name":"minecraft:element_70","id":-81},{"name":"minecraft:element_71","id":-82},{"name":"minecraft:element_72","id":-83},{"name":"minecraft:element_73","id":-84},{"name":"minecraft:element_74","id":-85},{"name":"minecraft:element_75","id":-86},{"name":"minecraft:element_76","id":-87},{"name":"minecraft:element_77","id":-88},{"name":"minecraft:element_78","id":-89},{"name":"minecraft:element_79","id":-90},{"name":"minecraft:element_8","id":-19},{"name":"minecraft:element_80","id":-91},{"name":"minecraft:element_81","id":-92},{"name":"minecraft:element_82","id":-93},{"name":"minecraft:element_83","id":-94},{"name":"minecraft:element_84","id":-95},{"name":"minecraft:element_85","id":-96},{"name":"minecraft:element_86","id":-97},{"name":"minecraft:element_87","id":-98},{"name":"minecraft:element_88","id":-99},{"name":"minecraft:element_89","id":-100},{"name":"minecraft:element_9","id":-20},{"name":"minecraft:element_90","id":-101},{"name":"minecraft:element_91","id":-102},{"name":"minecraft:element_92","id":-103},{"name":"minecraft:element_93","id":-104},{"name":"minecraft:element_94","id":-105},{"name":"minecraft:element_95","id":-106},{"name":"minecraft:element_96","id":-107},{"name":"minecraft:element_97","id":-108},{"name":"minecraft:element_98","id":-109},{"name":"minecraft:element_99","id":-110},{"name":"minecraft:elytra","id":554},{"name":"minecraft:emerald","id":502},{"name":"minecraft:emerald_block","id":133},{"name":"minecraft:emerald_ore","id":129},{"name":"minecraft:empty_map","id":505},{"name":"minecraft:enchanted_book","id":511},{"name":"minecraft:enchanted_golden_apple","id":259},{"name":"minecraft:enchanting_table","id":116},{"name":"minecraft:end_brick_stairs","id":-178},{"name":"minecraft:end_bricks","id":206},{"name":"minecraft:end_crystal","id":615},{"name":"minecraft:end_gateway","id":209},{"name":"minecraft:end_portal","id":119},{"name":"minecraft:end_portal_frame","id":120},{"name":"minecraft:end_rod","id":208},{"name":"minecraft:end_stone","id":121},{"name":"minecraft:ender_chest","id":130},{"name":"minecraft:ender_eye","id":431},{"name":"minecraft:ender_pearl","id":420},{"name":"minecraft:enderman_spawn_egg","id":440},{"name":"minecraft:endermite_spawn_egg","id":458},{"name":"minecraft:evoker_spawn_egg","id":473},{"name":"minecraft:experience_bottle","id":498},{"name":"minecraft:farmland","id":60},{"name":"minecraft:feather","id":327},{"name":"minecraft:fence","id":85},{"name":"minecraft:fence_gate","id":107},{"name":"minecraft:fermented_spider_eye","id":426},{"name":"minecraft:field_masoned_banner_pattern","id":575},{"name":"minecraft:filled_map","id":418},{"name":"minecraft:fire","id":51},{"name":"minecraft:fire_charge","id":499},{"name":"minecraft:firework_rocket","id":509},{"name":"minecraft:firework_star","id":510},{"name":"minecraft:fishing_rod","id":390},{"name":"minecraft:fletching_table","id":-201},{"name":"minecraft:flint","id":356},{"name":"minecraft:flint_and_steel","id":299},{"name":"minecraft:flower_banner_pattern","id":571},{"name":"minecraft:flower_pot","id":504},{"name":"minecraft:flowing_lava","id":10},{"name":"minecraft:flowing_water","id":8},{"name":"minecraft:fox_spawn_egg","id":488},{"name":"minecraft:frame","id":503},{"name":"minecraft:frosted_ice","id":207},{"name":"minecraft:furnace","id":61},{"name":"minecraft:ghast_spawn_egg","id":452},{"name":"minecraft:ghast_tear","id":422},{"name":"minecraft:gilded_blackstone","id":-281},{"name":"minecraft:glass","id":20},{"name":"minecraft:glass_bottle","id":425},{"name":"minecraft:glass_pane","id":102},{"name":"minecraft:glistering_melon_slice","id":432},{"name":"minecraft:glow_stick","id":166},{"name":"minecraft:glowingobsidian","id":246},{"name":"minecraft:glowstone","id":89},{"name":"minecraft:glowstone_dust","id":392},{"name":"minecraft:gold_block","id":41},{"name":"minecraft:gold_ingot","id":306},{"name":"minecraft:gold_nugget","id":423},{"name":"minecraft:gold_ore","id":14},{"name":"minecraft:golden_apple","id":258},{"name":"minecraft:golden_axe","id":325},{"name":"minecraft:golden_boots","id":354},{"name":"minecraft:golden_carrot","id":283},{"name":"minecraft:golden_chestplate","id":352},{"name":"minecraft:golden_helmet","id":351},{"name":"minecraft:golden_hoe","id":333},{"name":"minecraft:golden_horse_armor","id":522},{"name":"minecraft:golden_leggings","id":353},{"name":"minecraft:golden_pickaxe","id":324},{"name":"minecraft:golden_rail","id":27},{"name":"minecraft:golden_shovel","id":323},{"name":"minecraft:golden_sword","id":322},{"name":"minecraft:granite_stairs","id":-169},{"name":"minecraft:grass","id":2},{"name":"minecraft:grass_path","id":198},{"name":"minecraft:gravel","id":13},{"name":"minecraft:gray_dye","id":401},{"name":"minecraft:gray_glazed_terracotta","id":227},{"name":"minecraft:green_dye","id":395},{"name":"minecraft:green_glazed_terracotta","id":233},{"name":"minecraft:grindstone","id":-195},{"name":"minecraft:guardian_spawn_egg","id":459},{"name":"minecraft:gunpowder","id":328},{"name":"minecraft:hard_glass","id":253},{"name":"minecraft:hard_glass_pane","id":190},{"name":"minecraft:hard_stained_glass","id":254},{"name":"minecraft:hard_stained_glass_pane","id":191},{"name":"minecraft:hardened_clay","id":172},{"name":"minecraft:hay_block","id":170},{"name":"minecraft:heart_of_the_sea","id":561},{"name":"minecraft:heavy_weighted_pressure_plate","id":148},{"name":"minecraft:hoglin_spawn_egg","id":494},{"name":"minecraft:honey_block","id":-220},{"name":"minecraft:honey_bottle","id":581},{"name":"minecraft:honeycomb","id":580},{"name":"minecraft:honeycomb_block","id":-221},{"name":"minecraft:hopper","id":517},{"name":"minecraft:hopper_minecart","id":516},{"name":"minecraft:horse_spawn_egg","id":456},{"name":"minecraft:husk_spawn_egg","id":461},{"name":"minecraft:ice","id":79},{"name":"minecraft:ice_bomb","id":584},{"name":"minecraft:info_update","id":248},{"name":"minecraft:info_update2","id":249},{"name":"minecraft:ink_sac","id":411},{"name":"minecraft:invisiblebedrock","id":95},{"name":"minecraft:iron_axe","id":298},{"name":"minecraft:iron_bars","id":101},{"name":"minecraft:iron_block","id":42},{"name":"minecraft:iron_boots","id":346},{"name":"minecraft:iron_chestplate","id":344},{"name":"minecraft:iron_door","id":370},{"name":"minecraft:iron_helmet","id":343},{"name":"minecraft:iron_hoe","id":331},{"name":"minecraft:iron_horse_armor","id":521},{"name":"minecraft:iron_ingot","id":305},{"name":"minecraft:iron_leggings","id":345},{"name":"minecraft:iron_nugget","id":559},{"name":"minecraft:iron_ore","id":15},{"name":"minecraft:iron_pickaxe","id":297},{"name":"minecraft:iron_shovel","id":296},{"name":"minecraft:iron_sword","id":307},{"name":"minecraft:iron_trapdoor","id":167},{"name":"minecraft:item.acacia_door","id":196},{"name":"minecraft:item.bed","id":26},{"name":"minecraft:item.beetroot","id":244},{"name":"minecraft:item.birch_door","id":194},{"name":"minecraft:item.cake","id":92},{"name":"minecraft:item.camera","id":242},{"name":"minecraft:item.campfire","id":-209},{"name":"minecraft:item.cauldron","id":118},{"name":"minecraft:item.chain","id":-286},{"name":"minecraft:item.crimson_door","id":-244},{"name":"minecraft:item.dark_oak_door","id":197},{"name":"minecraft:item.flower_pot","id":140},{"name":"minecraft:item.frame","id":199},{"name":"minecraft:item.hopper","id":154},{"name":"minecraft:item.iron_door","id":71},{"name":"minecraft:item.jungle_door","id":195},{"name":"minecraft:item.kelp","id":-138},{"name":"minecraft:nether_brick","id":112},{"name":"minecraft:item.nether_sprouts","id":-238},{"name":"minecraft:item.nether_wart","id":115},{"name":"minecraft:item.reeds","id":83},{"name":"minecraft:item.skull","id":144},{"name":"minecraft:item.soul_campfire","id":-290},{"name":"minecraft:item.spruce_door","id":193},{"name":"minecraft:item.warped_door","id":-245},{"name":"minecraft:item.wheat","id":59},{"name":"minecraft:item.wooden_door","id":64},{"name":"minecraft:jigsaw","id":-211},{"name":"minecraft:jukebox","id":84},{"name":"minecraft:jungle_boat","id":375},{"name":"minecraft:jungle_button","id":-143},{"name":"minecraft:jungle_door","id":545},{"name":"minecraft:jungle_fence_gate","id":185},{"name":"minecraft:jungle_pressure_plate","id":-153},{"name":"minecraft:jungle_sign","id":568},{"name":"minecraft:jungle_stairs","id":136},{"name":"minecraft:jungle_standing_sign","id":-188},{"name":"minecraft:jungle_trapdoor","id":-148},{"name":"minecraft:jungle_wall_sign","id":-189},{"name":"minecraft:kelp","id":380},{"name":"minecraft:ladder","id":65},{"name":"minecraft:lantern","id":-208},{"name":"minecraft:lapis_block","id":22},{"name":"minecraft:lapis_lazuli","id":412},{"name":"minecraft:lapis_ore","id":21},{"name":"minecraft:lava","id":11},{"name":"minecraft:lava_bucket","id":363},{"name":"minecraft:lava_cauldron","id":-210},{"name":"minecraft:lead","id":537},{"name":"minecraft:leather","id":379},{"name":"minecraft:leather_boots","id":338},{"name":"minecraft:leather_chestplate","id":336},{"name":"minecraft:leather_helmet","id":335},{"name":"minecraft:leather_horse_armor","id":520},{"name":"minecraft:leather_leggings","id":337},{"name":"minecraft:leaves","id":18},{"name":"minecraft:leaves2","id":161},{"name":"minecraft:lectern","id":-194},{"name":"minecraft:lever","id":69},{"name":"minecraft:light_block","id":-215},{"name":"minecraft:light_blue_dye","id":405},{"name":"minecraft:light_blue_glazed_terracotta","id":223},{"name":"minecraft:light_gray_dye","id":400},{"name":"minecraft:light_weighted_pressure_plate","id":147},{"name":"minecraft:lime_dye","id":403},{"name":"minecraft:lime_glazed_terracotta","id":225},{"name":"minecraft:lingering_potion","id":552},{"name":"minecraft:lit_blast_furnace","id":-214},{"name":"minecraft:lit_furnace","id":62},{"name":"minecraft:lit_pumpkin","id":91},{"name":"minecraft:lit_redstone_lamp","id":124},{"name":"minecraft:lit_redstone_ore","id":74},{"name":"minecraft:lit_smoker","id":-199},{"name":"minecraft:llama_spawn_egg","id":471},{"name":"minecraft:lodestone","id":-222},{"name":"minecraft:lodestone_compass","id":590},{"name":"minecraft:log","id":17},{"name":"minecraft:log2","id":162},{"name":"minecraft:loom","id":-204},{"name":"minecraft:magenta_dye","id":406},{"name":"minecraft:magenta_glazed_terracotta","id":222},{"name":"minecraft:magma","id":213},{"name":"minecraft:magma_cream","id":428},{"name":"minecraft:magma_cube_spawn_egg","id":453},{"name":"minecraft:medicine","id":588},{"name":"minecraft:melon_block","id":103},{"name":"minecraft:melon_seeds","id":293},{"name":"minecraft:melon_slice","id":272},{"name":"minecraft:melon_stem","id":105},{"name":"minecraft:milk_bucket","id":361},{"name":"minecraft:minecart","id":368},{"name":"minecraft:mob_spawner","id":52},{"name":"minecraft:mojang_banner_pattern","id":574},{"name":"minecraft:monster_egg","id":97},{"name":"minecraft:mooshroom_spawn_egg","id":438},{"name":"minecraft:mossy_cobblestone","id":48},{"name":"minecraft:mossy_cobblestone_stairs","id":-179},{"name":"minecraft:mossy_stone_brick_stairs","id":-175},{"name":"minecraft:movingblock","id":250},{"name":"minecraft:mule_spawn_egg","id":464},{"name":"minecraft:mushroom_stew","id":260},{"name":"minecraft:music_disc_11","id":534},{"name":"minecraft:music_disc_13","id":524},{"name":"minecraft:music_disc_blocks","id":526},{"name":"minecraft:music_disc_cat","id":525},{"name":"minecraft:music_disc_chirp","id":527},{"name":"minecraft:music_disc_far","id":528},{"name":"minecraft:music_disc_mall","id":529},{"name":"minecraft:music_disc_mellohi","id":530},{"name":"minecraft:music_disc_pigstep","id":608},{"name":"minecraft:music_disc_stal","id":531},{"name":"minecraft:music_disc_strad","id":532},{"name":"minecraft:music_disc_wait","id":535},{"name":"minecraft:music_disc_ward","id":533},{"name":"minecraft:mutton","id":540},{"name":"minecraft:mycelium","id":110},{"name":"minecraft:name_tag","id":538},{"name":"minecraft:nautilus_shell","id":560},{"name":"minecraft:netherbrick","id":513},{"name":"minecraft:nether_brick_fence","id":113},{"name":"minecraft:nether_brick_stairs","id":114},{"name":"minecraft:nether_gold_ore","id":-288},{"name":"minecraft:nether_sprouts","id":609},{"name":"minecraft:nether_star","id":508},{"name":"minecraft:nether_wart","id":294},{"name":"minecraft:nether_wart_block","id":214},{"name":"minecraft:netherite_axe","id":595},{"name":"minecraft:netherite_block","id":-270},{"name":"minecraft:netherite_boots","id":600},{"name":"minecraft:netherite_chestplate","id":598},{"name":"minecraft:netherite_helmet","id":597},{"name":"minecraft:netherite_hoe","id":596},{"name":"minecraft:netherite_ingot","id":591},{"name":"minecraft:netherite_leggings","id":599},{"name":"minecraft:netherite_pickaxe","id":594},{"name":"minecraft:netherite_scrap","id":601},{"name":"minecraft:netherite_shovel","id":593},{"name":"minecraft:netherite_sword","id":592},{"name":"minecraft:netherrack","id":87},{"name":"minecraft:netherreactor","id":247},{"name":"minecraft:normal_stone_stairs","id":-180},{"name":"minecraft:noteblock","id":25},{"name":"minecraft:npc_spawn_egg","id":468},{"name":"minecraft:oak_boat","id":373},{"name":"minecraft:oak_sign","id":358},{"name":"minecraft:oak_stairs","id":53},{"name":"minecraft:observer","id":251},{"name":"minecraft:obsidian","id":49},{"name":"minecraft:ocelot_spawn_egg","id":449},{"name":"minecraft:orange_dye","id":407},{"name":"minecraft:orange_glazed_terracotta","id":221},{"name":"minecraft:packed_ice","id":174},{"name":"minecraft:painting","id":357},{"name":"minecraft:panda_spawn_egg","id":487},{"name":"minecraft:paper","id":384},{"name":"minecraft:parrot_spawn_egg","id":476},{"name":"minecraft:phantom_membrane","id":564},{"name":"minecraft:phantom_spawn_egg","id":484},{"name":"minecraft:pig_spawn_egg","id":435},{"name":"minecraft:piglin_banner_pattern","id":577},{"name":"minecraft:piglin_brute_spawn_egg","id":497},{"name":"minecraft:piglin_spawn_egg","id":495},{"name":"minecraft:pillager_spawn_egg","id":489},{"name":"minecraft:pink_dye","id":402},{"name":"minecraft:pink_glazed_terracotta","id":226},{"name":"minecraft:piston","id":33},{"name":"minecraft:pistonarmcollision","id":34},{"name":"minecraft:planks","id":5},{"name":"minecraft:podzol","id":243},{"name":"minecraft:poisonous_potato","id":282},{"name":"minecraft:polar_bear_spawn_egg","id":470},{"name":"minecraft:polished_andesite_stairs","id":-174},{"name":"minecraft:polished_basalt","id":-235},{"name":"minecraft:polished_blackstone","id":-291},{"name":"minecraft:polished_blackstone_brick_double_slab","id":-285},{"name":"minecraft:polished_blackstone_brick_slab","id":-284},{"name":"minecraft:polished_blackstone_brick_stairs","id":-275},{"name":"minecraft:polished_blackstone_brick_wall","id":-278},{"name":"minecraft:polished_blackstone_bricks","id":-274},{"name":"minecraft:polished_blackstone_button","id":-296},{"name":"minecraft:polished_blackstone_double_slab","id":-294},{"name":"minecraft:polished_blackstone_pressure_plate","id":-295},{"name":"minecraft:polished_blackstone_slab","id":-293},{"name":"minecraft:polished_blackstone_stairs","id":-292},{"name":"minecraft:polished_blackstone_wall","id":-297},{"name":"minecraft:polished_diorite_stairs","id":-173},{"name":"minecraft:polished_granite_stairs","id":-172},{"name":"minecraft:popped_chorus_fruit","id":549},{"name":"minecraft:porkchop","id":262},{"name":"minecraft:portal","id":90},{"name":"minecraft:potato","id":280},{"name":"minecraft:potatoes","id":142},{"name":"minecraft:potion","id":424},{"name":"minecraft:powered_comparator","id":150},{"name":"minecraft:powered_repeater","id":94},{"name":"minecraft:prismarine","id":168},{"name":"minecraft:prismarine_bricks_stairs","id":-4},{"name":"minecraft:prismarine_crystals","id":539},{"name":"minecraft:prismarine_shard","id":555},{"name":"minecraft:prismarine_stairs","id":-2},{"name":"minecraft:pufferfish","id":267},{"name":"minecraft:pufferfish_bucket","id":367},{"name":"minecraft:pufferfish_spawn_egg","id":479},{"name":"minecraft:pumpkin","id":86},{"name":"minecraft:pumpkin_pie","id":284},{"name":"minecraft:pumpkin_seeds","id":292},{"name":"minecraft:pumpkin_stem","id":104},{"name":"minecraft:purple_dye","id":398},{"name":"minecraft:purple_glazed_terracotta","id":219},{"name":"minecraft:purpur_block","id":201},{"name":"minecraft:purpur_stairs","id":203},{"name":"minecraft:quartz","id":514},{"name":"minecraft:quartz_block","id":155},{"name":"minecraft:quartz_bricks","id":-304},{"name":"minecraft:quartz_ore","id":153},{"name":"minecraft:quartz_stairs","id":156},{"name":"minecraft:rabbit","id":288},{"name":"minecraft:rabbit_foot","id":518},{"name":"minecraft:rabbit_hide","id":519},{"name":"minecraft:rabbit_spawn_egg","id":457},{"name":"minecraft:rabbit_stew","id":290},{"name":"minecraft:rail","id":66},{"name":"minecraft:rapid_fertilizer","id":586},{"name":"minecraft:ravager_spawn_egg","id":491},{"name":"minecraft:real_double_stone_slab","id":43},{"name":"minecraft:real_double_stone_slab2","id":181},{"name":"minecraft:real_double_stone_slab3","id":-167},{"name":"minecraft:real_double_stone_slab4","id":-168},{"name":"minecraft:red_dye","id":394},{"name":"minecraft:red_flower","id":38},{"name":"minecraft:red_glazed_terracotta","id":234},{"name":"minecraft:red_mushroom","id":40},{"name":"minecraft:red_mushroom_block","id":100},{"name":"minecraft:red_nether_brick","id":215},{"name":"minecraft:red_nether_brick_stairs","id":-184},{"name":"minecraft:red_sandstone","id":179},{"name":"minecraft:red_sandstone_stairs","id":180},{"name":"minecraft:redstone","id":371},{"name":"minecraft:redstone_block","id":152},{"name":"minecraft:redstone_lamp","id":123},{"name":"minecraft:redstone_ore","id":73},{"name":"minecraft:redstone_torch","id":76},{"name":"minecraft:redstone_wire","id":55},{"name":"minecraft:repeater","id":417},{"name":"minecraft:repeating_command_block","id":188},{"name":"minecraft:reserved6","id":255},{"name":"minecraft:respawn_anchor","id":-272},{"name":"minecraft:rotten_flesh","id":277},{"name":"minecraft:saddle","id":369},{"name":"minecraft:salmon","id":265},{"name":"minecraft:salmon_bucket","id":365},{"name":"minecraft:salmon_spawn_egg","id":480},{"name":"minecraft:sand","id":12},{"name":"minecraft:sandstone","id":24},{"name":"minecraft:sandstone_stairs","id":128},{"name":"minecraft:sapling","id":6},{"name":"minecraft:scaffolding","id":-165},{"name":"minecraft:scute","id":562},{"name":"minecraft:sea_pickle","id":-156},{"name":"minecraft:seagrass","id":-130},{"name":"minecraft:sealantern","id":169},{"name":"minecraft:shears","id":419},{"name":"minecraft:sheep_spawn_egg","id":436},{"name":"minecraft:shield","id":355},{"name":"minecraft:shroomlight","id":-230},{"name":"minecraft:shulker_box","id":218},{"name":"minecraft:shulker_shell","id":556},{"name":"minecraft:shulker_spawn_egg","id":467},{"name":"minecraft:silver_glazed_terracotta","id":228},{"name":"minecraft:silverfish_spawn_egg","id":441},{"name":"minecraft:skeleton_horse_spawn_egg","id":465},{"name":"minecraft:skeleton_spawn_egg","id":442},{"name":"minecraft:skull","id":506},{"name":"minecraft:skull_banner_pattern","id":573},{"name":"minecraft:slime","id":165},{"name":"minecraft:slime_ball","id":386},{"name":"minecraft:slime_spawn_egg","id":443},{"name":"minecraft:smithing_table","id":-202},{"name":"minecraft:smoker","id":-198},{"name":"minecraft:smooth_quartz_stairs","id":-185},{"name":"minecraft:smooth_red_sandstone_stairs","id":-176},{"name":"minecraft:smooth_sandstone_stairs","id":-177},{"name":"minecraft:smooth_stone","id":-183},{"name":"minecraft:snow","id":80},{"name":"minecraft:snow_layer","id":78},{"name":"minecraft:snowball","id":372},{"name":"minecraft:soul_campfire","id":610},{"name":"minecraft:soul_fire","id":-237},{"name":"minecraft:soul_lantern","id":-269},{"name":"minecraft:soul_sand","id":88},{"name":"minecraft:soul_soil","id":-236},{"name":"minecraft:soul_torch","id":-268},{"name":"minecraft:sparkler","id":589},{"name":"minecraft:spawn_egg","id":614},{"name":"minecraft:spider_eye","id":278},{"name":"minecraft:spider_spawn_egg","id":444},{"name":"minecraft:splash_potion","id":551},{"name":"minecraft:sponge","id":19},{"name":"minecraft:spruce_boat","id":376},{"name":"minecraft:spruce_button","id":-144},{"name":"minecraft:spruce_door","id":543},{"name":"minecraft:spruce_fence_gate","id":183},{"name":"minecraft:spruce_pressure_plate","id":-154},{"name":"minecraft:spruce_sign","id":566},{"name":"minecraft:spruce_stairs","id":134},{"name":"minecraft:spruce_standing_sign","id":-181},{"name":"minecraft:spruce_trapdoor","id":-149},{"name":"minecraft:spruce_wall_sign","id":-182},{"name":"minecraft:squid_spawn_egg","id":448},{"name":"minecraft:stained_glass","id":241},{"name":"minecraft:stained_glass_pane","id":160},{"name":"minecraft:stained_hardened_clay","id":159},{"name":"minecraft:standing_banner","id":176},{"name":"minecraft:standing_sign","id":63},{"name":"minecraft:stick","id":320},{"name":"minecraft:sticky_piston","id":29},{"name":"minecraft:stickypistonarmcollision","id":-217},{"name":"minecraft:stone","id":1},{"name":"minecraft:stone_axe","id":315},{"name":"minecraft:stone_brick_stairs","id":109},{"name":"minecraft:stone_button","id":77},{"name":"minecraft:stone_hoe","id":330},{"name":"minecraft:stone_pickaxe","id":314},{"name":"minecraft:stone_pressure_plate","id":70},{"name":"minecraft:stone_shovel","id":313},{"name":"minecraft:stone_stairs","id":67},{"name":"minecraft:stone_sword","id":312},{"name":"minecraft:stonebrick","id":98},{"name":"minecraft:stonecutter","id":245},{"name":"minecraft:stonecutter_block","id":-197},{"name":"minecraft:stray_spawn_egg","id":460},{"name":"minecraft:strider_spawn_egg","id":493},{"name":"minecraft:string","id":326},{"name":"minecraft:stripped_acacia_log","id":-8},{"name":"minecraft:stripped_birch_log","id":-6},{"name":"minecraft:stripped_crimson_hyphae","id":-300},{"name":"minecraft:stripped_crimson_stem","id":-240},{"name":"minecraft:stripped_dark_oak_log","id":-9},{"name":"minecraft:stripped_jungle_log","id":-7},{"name":"minecraft:stripped_oak_log","id":-10},{"name":"minecraft:stripped_spruce_log","id":-5},{"name":"minecraft:stripped_warped_hyphae","id":-301},{"name":"minecraft:stripped_warped_stem","id":-241},{"name":"minecraft:structure_block","id":252},{"name":"minecraft:structure_void","id":217},{"name":"minecraft:sugar","id":414},{"name":"minecraft:sugar_cane","id":383},{"name":"minecraft:suspicious_stew","id":579},{"name":"minecraft:sweet_berries","id":287},{"name":"minecraft:sweet_berry_bush","id":-207},{"name":"minecraft:tallgrass","id":31},{"name":"minecraft:target","id":-239},{"name":"minecraft:tnt","id":46},{"name":"minecraft:tnt_minecart","id":515},{"name":"minecraft:torch","id":50},{"name":"minecraft:totem_of_undying","id":558},{"name":"minecraft:trapdoor","id":96},{"name":"minecraft:trapped_chest","id":146},{"name":"minecraft:trident","id":536},{"name":"minecraft:tripwire","id":132},{"name":"minecraft:tripwire_hook","id":131},{"name":"minecraft:tropical_fish","id":266},{"name":"minecraft:tropical_fish_bucket","id":366},{"name":"minecraft:tropical_fish_spawn_egg","id":477},{"name":"minecraft:turtle_egg","id":-159},{"name":"minecraft:turtle_helmet","id":563},{"name":"minecraft:turtle_spawn_egg","id":483},{"name":"minecraft:twisting_vines","id":-287},{"name":"minecraft:underwater_torch","id":239},{"name":"minecraft:undyed_shulker_box","id":205},{"name":"minecraft:unknown","id":-305},{"name":"minecraft:unlit_redstone_torch","id":75},{"name":"minecraft:unpowered_comparator","id":149},{"name":"minecraft:unpowered_repeater","id":93},{"name":"minecraft:vex_spawn_egg","id":474},{"name":"minecraft:villager_spawn_egg","id":447},{"name":"minecraft:vindicator_spawn_egg","id":472},{"name":"minecraft:vine","id":106},{"name":"minecraft:wall_banner","id":177},{"name":"minecraft:wall_sign","id":68},{"name":"minecraft:wandering_trader_spawn_egg","id":490},{"name":"minecraft:warped_button","id":-261},{"name":"minecraft:warped_door","id":605},{"name":"minecraft:warped_double_slab","id":-267},{"name":"minecraft:warped_fence","id":-257},{"name":"minecraft:warped_fence_gate","id":-259},{"name":"minecraft:warped_fungus","id":-229},{"name":"minecraft:warped_fungus_on_a_stick","id":606},{"name":"minecraft:warped_hyphae","id":-298},{"name":"minecraft:warped_nylium","id":-233},{"name":"minecraft:warped_planks","id":-243},{"name":"minecraft:warped_pressure_plate","id":-263},{"name":"minecraft:warped_roots","id":-224},{"name":"minecraft:warped_sign","id":603},{"name":"minecraft:warped_slab","id":-265},{"name":"minecraft:warped_stairs","id":-255},{"name":"minecraft:warped_standing_sign","id":-251},{"name":"minecraft:warped_stem","id":-226},{"name":"minecraft:warped_trapdoor","id":-247},{"name":"minecraft:warped_wall_sign","id":-253},{"name":"minecraft:warped_wart_block","id":-227},{"name":"minecraft:water","id":9},{"name":"minecraft:water_bucket","id":362},{"name":"minecraft:waterlily","id":111},{"name":"minecraft:web","id":30},{"name":"minecraft:weeping_vines","id":-231},{"name":"minecraft:wheat","id":334},{"name":"minecraft:wheat_seeds","id":291},{"name":"minecraft:white_dye","id":408},{"name":"minecraft:white_glazed_terracotta","id":220},{"name":"minecraft:witch_spawn_egg","id":450},{"name":"minecraft:wither_rose","id":-216},{"name":"minecraft:wither_skeleton_spawn_egg","id":462},{"name":"minecraft:wolf_spawn_egg","id":437},{"name":"minecraft:wood","id":-212},{"name":"minecraft:wooden_axe","id":311},{"name":"minecraft:wooden_button","id":143},{"name":"minecraft:wooden_door","id":359},{"name":"minecraft:wooden_hoe","id":329},{"name":"minecraft:wooden_pickaxe","id":310},{"name":"minecraft:wooden_pressure_plate","id":72},{"name":"minecraft:wooden_shovel","id":309},{"name":"minecraft:wooden_slab","id":158},{"name":"minecraft:wooden_sword","id":308},{"name":"minecraft:wool","id":35},{"name":"minecraft:writable_book","id":500},{"name":"minecraft:written_book","id":501},{"name":"minecraft:yellow_dye","id":404},{"name":"minecraft:yellow_flower","id":37},{"name":"minecraft:yellow_glazed_terracotta","id":224},{"name":"minecraft:zoglin_spawn_egg","id":496},{"name":"minecraft:zombie_horse_spawn_egg","id":466},{"name":"minecraft:zombie_pigman_spawn_egg","id":446},{"name":"minecraft:zombie_spawn_egg","id":445},{"name":"minecraft:zombie_villager_spawn_egg","id":475}] \ No newline at end of file diff --git a/src/main/resources/runtime_item_states_440.json b/src/main/resources/runtime_item_states_440.json deleted file mode 100644 index 94c0692fc..000000000 --- a/src/main/resources/runtime_item_states_440.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"minecraft:acacia_boat","id":379},{"name":"minecraft:acacia_button","id":-140},{"name":"minecraft:acacia_door","id":556},{"name":"minecraft:acacia_fence_gate","id":187},{"name":"minecraft:acacia_pressure_plate","id":-150},{"name":"minecraft:acacia_sign","id":579},{"name":"minecraft:acacia_stairs","id":163},{"name":"minecraft:acacia_standing_sign","id":-190},{"name":"minecraft:acacia_trapdoor","id":-145},{"name":"minecraft:acacia_wall_sign","id":-191},{"name":"minecraft:activator_rail","id":126},{"name":"minecraft:agent_spawn_egg","id":487},{"name":"minecraft:air","id":-158},{"name":"minecraft:allow","id":210},{"name":"minecraft:amethyst_block","id":-327},{"name":"minecraft:amethyst_cluster","id":-329},{"name":"minecraft:amethyst_shard","id":623},{"name":"minecraft:ancient_debris","id":-271},{"name":"minecraft:andesite_stairs","id":-171},{"name":"minecraft:anvil","id":145},{"name":"minecraft:apple","id":257},{"name":"minecraft:armor_stand","id":552},{"name":"minecraft:arrow","id":301},{"name":"minecraft:axolotl_bucket","id":369},{"name":"minecraft:axolotl_spawn_egg","id":500},{"name":"minecraft:azalea","id":-337},{"name":"minecraft:azalea_leaves","id":-324},{"name":"minecraft:azalea_leaves_flowered","id":-325},{"name":"minecraft:baked_potato","id":281},{"name":"minecraft:balloon","id":597},{"name":"minecraft:bamboo","id":-163},{"name":"minecraft:bamboo_sapling","id":-164},{"name":"minecraft:banner","id":567},{"name":"minecraft:banner_pattern","id":627},{"name":"minecraft:barrel","id":-203},{"name":"minecraft:barrier","id":-161},{"name":"minecraft:basalt","id":-234},{"name":"minecraft:bat_spawn_egg","id":453},{"name":"minecraft:beacon","id":138},{"name":"minecraft:bed","id":418},{"name":"minecraft:bedrock","id":7},{"name":"minecraft:bee_nest","id":-218},{"name":"minecraft:bee_spawn_egg","id":494},{"name":"minecraft:beef","id":273},{"name":"minecraft:beehive","id":-219},{"name":"minecraft:beetroot","id":285},{"name":"minecraft:beetroot_seeds","id":295},{"name":"minecraft:beetroot_soup","id":286},{"name":"minecraft:bell","id":-206},{"name":"minecraft:big_dripleaf","id":-323},{"name":"minecraft:birch_boat","id":376},{"name":"minecraft:birch_button","id":-141},{"name":"minecraft:birch_door","id":554},{"name":"minecraft:birch_fence_gate","id":184},{"name":"minecraft:birch_pressure_plate","id":-151},{"name":"minecraft:birch_sign","id":577},{"name":"minecraft:birch_stairs","id":135},{"name":"minecraft:birch_standing_sign","id":-186},{"name":"minecraft:birch_trapdoor","id":-146},{"name":"minecraft:birch_wall_sign","id":-187},{"name":"minecraft:black_dye","id":395},{"name":"minecraft:black_glazed_terracotta","id":235},{"name":"minecraft:blackstone","id":-273},{"name":"minecraft:blackstone_double_slab","id":-283},{"name":"minecraft:blackstone_slab","id":-282},{"name":"minecraft:blackstone_stairs","id":-276},{"name":"minecraft:blackstone_wall","id":-277},{"name":"minecraft:blast_furnace","id":-196},{"name":"minecraft:blaze_powder","id":429},{"name":"minecraft:blaze_rod","id":423},{"name":"minecraft:blaze_spawn_egg","id":456},{"name":"minecraft:bleach","id":595},{"name":"minecraft:blue_dye","id":399},{"name":"minecraft:blue_glazed_terracotta","id":231},{"name":"minecraft:blue_ice","id":-11},{"name":"minecraft:boat","id":625},{"name":"minecraft:bone","id":415},{"name":"minecraft:bone_block","id":216},{"name":"minecraft:bone_meal","id":411},{"name":"minecraft:book","id":387},{"name":"minecraft:bookshelf","id":47},{"name":"minecraft:border_block","id":212},{"name":"minecraft:bordure_indented_banner_pattern","id":586},{"name":"minecraft:bow","id":300},{"name":"minecraft:bowl","id":321},{"name":"minecraft:bread","id":261},{"name":"minecraft:brewing_stand","id":431},{"name":"minecraft:brewingstandblock","id":117},{"name":"minecraft:brick","id":383},{"name":"minecraft:brick_block","id":45},{"name":"minecraft:brick_stairs","id":108},{"name":"minecraft:brown_dye","id":398},{"name":"minecraft:brown_glazed_terracotta","id":232},{"name":"minecraft:brown_mushroom","id":39},{"name":"minecraft:brown_mushroom_block","id":99},{"name":"minecraft:bubble_column","id":-160},{"name":"minecraft:bucket","id":360},{"name":"minecraft:budding_amethyst","id":-328},{"name":"minecraft:cactus","id":81},{"name":"minecraft:cake","id":417},{"name":"minecraft:calcite","id":-326},{"name":"minecraft:camera","id":592},{"name":"minecraft:campfire","id":588},{"name":"minecraft:carpet","id":171},{"name":"minecraft:carrot","id":279},{"name":"minecraft:carrot_on_a_stick","id":517},{"name":"minecraft:carrots","id":141},{"name":"minecraft:cartography_table","id":-200},{"name":"minecraft:carved_pumpkin","id":-155},{"name":"minecraft:cat_spawn_egg","id":488},{"name":"minecraft:cauldron","id":432},{"name":"minecraft:cave_spider_spawn_egg","id":457},{"name":"minecraft:cave_vines","id":-322},{"name":"minecraft:cave_vines_body_with_berries","id":-375},{"name":"minecraft:cave_vines_head_with_berries","id":-376},{"name":"minecraft:chain","id":617},{"name":"minecraft:chain_command_block","id":189},{"name":"minecraft:chainmail_boots","id":342},{"name":"minecraft:chainmail_chestplate","id":340},{"name":"minecraft:chainmail_helmet","id":339},{"name":"minecraft:chainmail_leggings","id":341},{"name":"minecraft:charcoal","id":303},{"name":"minecraft:chemical_heat","id":192},{"name":"minecraft:chemistry_table","id":238},{"name":"minecraft:chest","id":54},{"name":"minecraft:chest_minecart","id":389},{"name":"minecraft:chicken","id":275},{"name":"minecraft:chicken_spawn_egg","id":435},{"name":"minecraft:chiseled_deepslate","id":-395},{"name":"minecraft:chiseled_nether_bricks","id":-302},{"name":"minecraft:chiseled_polished_blackstone","id":-279},{"name":"minecraft:chorus_flower","id":200},{"name":"minecraft:chorus_fruit","id":558},{"name":"minecraft:chorus_plant","id":240},{"name":"minecraft:clay","id":82},{"name":"minecraft:clay_ball","id":384},{"name":"minecraft:clock","id":393},{"name":"minecraft:coal","id":302},{"name":"minecraft:coal_block","id":173},{"name":"minecraft:coal_ore","id":16},{"name":"minecraft:cobbled_deepslate","id":-379},{"name":"minecraft:cobbled_deepslate_double_slab","id":-396},{"name":"minecraft:cobbled_deepslate_slab","id":-380},{"name":"minecraft:cobbled_deepslate_stairs","id":-381},{"name":"minecraft:cobbled_deepslate_wall","id":-382},{"name":"minecraft:cobblestone","id":4},{"name":"minecraft:cobblestone_wall","id":139},{"name":"minecraft:cocoa","id":127},{"name":"minecraft:cocoa_beans","id":412},{"name":"minecraft:cod","id":264},{"name":"minecraft:cod_bucket","id":364},{"name":"minecraft:cod_spawn_egg","id":480},{"name":"minecraft:colored_torch_bp","id":204},{"name":"minecraft:colored_torch_rg","id":202},{"name":"minecraft:command_block","id":137},{"name":"minecraft:command_block_minecart","id":563},{"name":"minecraft:comparator","id":522},{"name":"minecraft:compass","id":391},{"name":"minecraft:composter","id":-213},{"name":"minecraft:compound","id":593},{"name":"minecraft:concrete","id":236},{"name":"minecraft:concrete_powder","id":237},{"name":"minecraft:conduit","id":-157},{"name":"minecraft:cooked_beef","id":274},{"name":"minecraft:cooked_chicken","id":276},{"name":"minecraft:cooked_cod","id":268},{"name":"minecraft:cooked_mutton","id":551},{"name":"minecraft:cooked_porkchop","id":263},{"name":"minecraft:cooked_rabbit","id":289},{"name":"minecraft:cooked_salmon","id":269},{"name":"minecraft:cookie","id":271},{"name":"minecraft:copper_block","id":-340},{"name":"minecraft:copper_ingot","id":504},{"name":"minecraft:copper_ore","id":-311},{"name":"minecraft:coral","id":-131},{"name":"minecraft:coral_block","id":-132},{"name":"minecraft:coral_fan","id":-133},{"name":"minecraft:coral_fan_dead","id":-134},{"name":"minecraft:coral_fan_hang","id":-135},{"name":"minecraft:coral_fan_hang2","id":-136},{"name":"minecraft:coral_fan_hang3","id":-137},{"name":"minecraft:cow_spawn_egg","id":436},{"name":"minecraft:cracked_deepslate_bricks","id":-410},{"name":"minecraft:cracked_deepslate_tiles","id":-409},{"name":"minecraft:cracked_nether_bricks","id":-303},{"name":"minecraft:cracked_polished_blackstone_bricks","id":-280},{"name":"minecraft:crafting_table","id":58},{"name":"minecraft:creeper_banner_pattern","id":582},{"name":"minecraft:creeper_spawn_egg","id":441},{"name":"minecraft:crimson_button","id":-260},{"name":"minecraft:crimson_door","id":614},{"name":"minecraft:crimson_double_slab","id":-266},{"name":"minecraft:crimson_fence","id":-256},{"name":"minecraft:crimson_fence_gate","id":-258},{"name":"minecraft:crimson_fungus","id":-228},{"name":"minecraft:crimson_hyphae","id":-299},{"name":"minecraft:crimson_nylium","id":-232},{"name":"minecraft:crimson_planks","id":-242},{"name":"minecraft:crimson_pressure_plate","id":-262},{"name":"minecraft:crimson_roots","id":-223},{"name":"minecraft:crimson_sign","id":612},{"name":"minecraft:crimson_slab","id":-264},{"name":"minecraft:crimson_stairs","id":-254},{"name":"minecraft:crimson_standing_sign","id":-250},{"name":"minecraft:crimson_stem","id":-225},{"name":"minecraft:crimson_trapdoor","id":-246},{"name":"minecraft:crimson_wall_sign","id":-252},{"name":"minecraft:crossbow","id":575},{"name":"minecraft:crying_obsidian","id":-289},{"name":"minecraft:cut_copper","id":-347},{"name":"minecraft:cut_copper_slab","id":-361},{"name":"minecraft:cut_copper_stairs","id":-354},{"name":"minecraft:cyan_dye","id":401},{"name":"minecraft:cyan_glazed_terracotta","id":229},{"name":"minecraft:dark_oak_boat","id":380},{"name":"minecraft:dark_oak_button","id":-142},{"name":"minecraft:dark_oak_door","id":557},{"name":"minecraft:dark_oak_fence_gate","id":186},{"name":"minecraft:dark_oak_pressure_plate","id":-152},{"name":"minecraft:dark_oak_sign","id":580},{"name":"minecraft:dark_oak_stairs","id":164},{"name":"minecraft:dark_oak_trapdoor","id":-147},{"name":"minecraft:dark_prismarine_stairs","id":-3},{"name":"minecraft:darkoak_standing_sign","id":-192},{"name":"minecraft:darkoak_wall_sign","id":-193},{"name":"minecraft:daylight_detector","id":151},{"name":"minecraft:daylight_detector_inverted","id":178},{"name":"minecraft:deadbush","id":32},{"name":"minecraft:deepslate","id":-378},{"name":"minecraft:deepslate_brick_double_slab","id":-399},{"name":"minecraft:deepslate_brick_slab","id":-392},{"name":"minecraft:deepslate_brick_stairs","id":-393},{"name":"minecraft:deepslate_brick_wall","id":-394},{"name":"minecraft:deepslate_bricks","id":-391},{"name":"minecraft:deepslate_coal_ore","id":-406},{"name":"minecraft:deepslate_copper_ore","id":-408},{"name":"minecraft:deepslate_diamond_ore","id":-405},{"name":"minecraft:deepslate_emerald_ore","id":-407},{"name":"minecraft:deepslate_gold_ore","id":-402},{"name":"minecraft:deepslate_iron_ore","id":-401},{"name":"minecraft:deepslate_lapis_ore","id":-400},{"name":"minecraft:deepslate_redstone_ore","id":-403},{"name":"minecraft:deepslate_tile_double_slab","id":-398},{"name":"minecraft:deepslate_tile_slab","id":-388},{"name":"minecraft:deepslate_tile_stairs","id":-389},{"name":"minecraft:deepslate_tile_wall","id":-390},{"name":"minecraft:deepslate_tiles","id":-387},{"name":"minecraft:deny","id":211},{"name":"minecraft:detector_rail","id":28},{"name":"minecraft:diamond","id":304},{"name":"minecraft:diamond_axe","id":319},{"name":"minecraft:diamond_block","id":57},{"name":"minecraft:diamond_boots","id":350},{"name":"minecraft:diamond_chestplate","id":348},{"name":"minecraft:diamond_helmet","id":347},{"name":"minecraft:diamond_hoe","id":332},{"name":"minecraft:diamond_horse_armor","id":533},{"name":"minecraft:diamond_leggings","id":349},{"name":"minecraft:diamond_ore","id":56},{"name":"minecraft:diamond_pickaxe","id":318},{"name":"minecraft:diamond_shovel","id":317},{"name":"minecraft:diamond_sword","id":316},{"name":"minecraft:diorite_stairs","id":-170},{"name":"minecraft:dirt","id":3},{"name":"minecraft:dirt_with_roots","id":-318},{"name":"minecraft:dispenser","id":23},{"name":"minecraft:dolphin_spawn_egg","id":484},{"name":"minecraft:donkey_spawn_egg","id":465},{"name":"minecraft:double_cut_copper_slab","id":-368},{"name":"minecraft:double_plant","id":175},{"name":"minecraft:double_stone_slab","id":44},{"name":"minecraft:double_stone_slab2","id":182},{"name":"minecraft:double_stone_slab3","id":-162},{"name":"minecraft:double_stone_slab4","id":-166},{"name":"minecraft:double_wooden_slab","id":157},{"name":"minecraft:dragon_breath","id":560},{"name":"minecraft:dragon_egg","id":122},{"name":"minecraft:dried_kelp","id":270},{"name":"minecraft:dried_kelp_block","id":-139},{"name":"minecraft:dripstone_block","id":-317},{"name":"minecraft:dropper","id":125},{"name":"minecraft:drowned_spawn_egg","id":483},{"name":"minecraft:dye","id":626},{"name":"minecraft:egg","id":390},{"name":"minecraft:elder_guardian_spawn_egg","id":471},{"name":"minecraft:element_0","id":36},{"name":"minecraft:element_1","id":-12},{"name":"minecraft:element_10","id":-21},{"name":"minecraft:element_100","id":-111},{"name":"minecraft:element_101","id":-112},{"name":"minecraft:element_102","id":-113},{"name":"minecraft:element_103","id":-114},{"name":"minecraft:element_104","id":-115},{"name":"minecraft:element_105","id":-116},{"name":"minecraft:element_106","id":-117},{"name":"minecraft:element_107","id":-118},{"name":"minecraft:element_108","id":-119},{"name":"minecraft:element_109","id":-120},{"name":"minecraft:element_11","id":-22},{"name":"minecraft:element_110","id":-121},{"name":"minecraft:element_111","id":-122},{"name":"minecraft:element_112","id":-123},{"name":"minecraft:element_113","id":-124},{"name":"minecraft:element_114","id":-125},{"name":"minecraft:element_115","id":-126},{"name":"minecraft:element_116","id":-127},{"name":"minecraft:element_117","id":-128},{"name":"minecraft:element_118","id":-129},{"name":"minecraft:element_12","id":-23},{"name":"minecraft:element_13","id":-24},{"name":"minecraft:element_14","id":-25},{"name":"minecraft:element_15","id":-26},{"name":"minecraft:element_16","id":-27},{"name":"minecraft:element_17","id":-28},{"name":"minecraft:element_18","id":-29},{"name":"minecraft:element_19","id":-30},{"name":"minecraft:element_2","id":-13},{"name":"minecraft:element_20","id":-31},{"name":"minecraft:element_21","id":-32},{"name":"minecraft:element_22","id":-33},{"name":"minecraft:element_23","id":-34},{"name":"minecraft:element_24","id":-35},{"name":"minecraft:element_25","id":-36},{"name":"minecraft:element_26","id":-37},{"name":"minecraft:element_27","id":-38},{"name":"minecraft:element_28","id":-39},{"name":"minecraft:element_29","id":-40},{"name":"minecraft:element_3","id":-14},{"name":"minecraft:element_30","id":-41},{"name":"minecraft:element_31","id":-42},{"name":"minecraft:element_32","id":-43},{"name":"minecraft:element_33","id":-44},{"name":"minecraft:element_34","id":-45},{"name":"minecraft:element_35","id":-46},{"name":"minecraft:element_36","id":-47},{"name":"minecraft:element_37","id":-48},{"name":"minecraft:element_38","id":-49},{"name":"minecraft:element_39","id":-50},{"name":"minecraft:element_4","id":-15},{"name":"minecraft:element_40","id":-51},{"name":"minecraft:element_41","id":-52},{"name":"minecraft:element_42","id":-53},{"name":"minecraft:element_43","id":-54},{"name":"minecraft:element_44","id":-55},{"name":"minecraft:element_45","id":-56},{"name":"minecraft:element_46","id":-57},{"name":"minecraft:element_47","id":-58},{"name":"minecraft:element_48","id":-59},{"name":"minecraft:element_49","id":-60},{"name":"minecraft:element_5","id":-16},{"name":"minecraft:element_50","id":-61},{"name":"minecraft:element_51","id":-62},{"name":"minecraft:element_52","id":-63},{"name":"minecraft:element_53","id":-64},{"name":"minecraft:element_54","id":-65},{"name":"minecraft:element_55","id":-66},{"name":"minecraft:element_56","id":-67},{"name":"minecraft:element_57","id":-68},{"name":"minecraft:element_58","id":-69},{"name":"minecraft:element_59","id":-70},{"name":"minecraft:element_6","id":-17},{"name":"minecraft:element_60","id":-71},{"name":"minecraft:element_61","id":-72},{"name":"minecraft:element_62","id":-73},{"name":"minecraft:element_63","id":-74},{"name":"minecraft:element_64","id":-75},{"name":"minecraft:element_65","id":-76},{"name":"minecraft:element_66","id":-77},{"name":"minecraft:element_67","id":-78},{"name":"minecraft:element_68","id":-79},{"name":"minecraft:element_69","id":-80},{"name":"minecraft:element_7","id":-18},{"name":"minecraft:element_70","id":-81},{"name":"minecraft:element_71","id":-82},{"name":"minecraft:element_72","id":-83},{"name":"minecraft:element_73","id":-84},{"name":"minecraft:element_74","id":-85},{"name":"minecraft:element_75","id":-86},{"name":"minecraft:element_76","id":-87},{"name":"minecraft:element_77","id":-88},{"name":"minecraft:element_78","id":-89},{"name":"minecraft:element_79","id":-90},{"name":"minecraft:element_8","id":-19},{"name":"minecraft:element_80","id":-91},{"name":"minecraft:element_81","id":-92},{"name":"minecraft:element_82","id":-93},{"name":"minecraft:element_83","id":-94},{"name":"minecraft:element_84","id":-95},{"name":"minecraft:element_85","id":-96},{"name":"minecraft:element_86","id":-97},{"name":"minecraft:element_87","id":-98},{"name":"minecraft:element_88","id":-99},{"name":"minecraft:element_89","id":-100},{"name":"minecraft:element_9","id":-20},{"name":"minecraft:element_90","id":-101},{"name":"minecraft:element_91","id":-102},{"name":"minecraft:element_92","id":-103},{"name":"minecraft:element_93","id":-104},{"name":"minecraft:element_94","id":-105},{"name":"minecraft:element_95","id":-106},{"name":"minecraft:element_96","id":-107},{"name":"minecraft:element_97","id":-108},{"name":"minecraft:element_98","id":-109},{"name":"minecraft:element_99","id":-110},{"name":"minecraft:elytra","id":564},{"name":"minecraft:emerald","id":512},{"name":"minecraft:emerald_block","id":133},{"name":"minecraft:emerald_ore","id":129},{"name":"minecraft:empty_map","id":515},{"name":"minecraft:enchanted_book","id":521},{"name":"minecraft:enchanted_golden_apple","id":259},{"name":"minecraft:enchanting_table","id":116},{"name":"minecraft:end_brick_stairs","id":-178},{"name":"minecraft:end_bricks","id":206},{"name":"minecraft:end_crystal","id":629},{"name":"minecraft:end_gateway","id":209},{"name":"minecraft:end_portal","id":119},{"name":"minecraft:end_portal_frame","id":120},{"name":"minecraft:end_rod","id":208},{"name":"minecraft:end_stone","id":121},{"name":"minecraft:ender_chest","id":130},{"name":"minecraft:ender_eye","id":433},{"name":"minecraft:ender_pearl","id":422},{"name":"minecraft:enderman_spawn_egg","id":442},{"name":"minecraft:endermite_spawn_egg","id":460},{"name":"minecraft:evoker_spawn_egg","id":475},{"name":"minecraft:experience_bottle","id":508},{"name":"minecraft:exposed_copper","id":-341},{"name":"minecraft:exposed_cut_copper","id":-348},{"name":"minecraft:exposed_cut_copper_slab","id":-362},{"name":"minecraft:exposed_cut_copper_stairs","id":-355},{"name":"minecraft:exposed_double_cut_copper_slab","id":-369},{"name":"minecraft:farmland","id":60},{"name":"minecraft:feather","id":327},{"name":"minecraft:fence","id":85},{"name":"minecraft:fence_gate","id":107},{"name":"minecraft:fermented_spider_eye","id":428},{"name":"minecraft:field_masoned_banner_pattern","id":585},{"name":"minecraft:filled_map","id":420},{"name":"minecraft:fire","id":51},{"name":"minecraft:fire_charge","id":509},{"name":"minecraft:firework_rocket","id":519},{"name":"minecraft:firework_star","id":520},{"name":"minecraft:fishing_rod","id":392},{"name":"minecraft:fletching_table","id":-201},{"name":"minecraft:flint","id":356},{"name":"minecraft:flint_and_steel","id":299},{"name":"minecraft:flower_banner_pattern","id":581},{"name":"minecraft:flower_pot","id":514},{"name":"minecraft:flowering_azalea","id":-338},{"name":"minecraft:flowing_lava","id":10},{"name":"minecraft:flowing_water","id":8},{"name":"minecraft:fox_spawn_egg","id":490},{"name":"minecraft:frame","id":513},{"name":"minecraft:frosted_ice","id":207},{"name":"minecraft:furnace","id":61},{"name":"minecraft:ghast_spawn_egg","id":454},{"name":"minecraft:ghast_tear","id":424},{"name":"minecraft:gilded_blackstone","id":-281},{"name":"minecraft:glass","id":20},{"name":"minecraft:glass_bottle","id":427},{"name":"minecraft:glass_pane","id":102},{"name":"minecraft:glistering_melon_slice","id":434},{"name":"minecraft:glow_berries","id":630},{"name":"minecraft:glow_frame","id":621},{"name":"minecraft:glow_ink_sac","id":503},{"name":"minecraft:glow_lichen","id":-411},{"name":"minecraft:glow_squid_spawn_egg","id":502},{"name":"minecraft:glow_stick","id":166},{"name":"minecraft:glowingobsidian","id":246},{"name":"minecraft:glowstone","id":89},{"name":"minecraft:glowstone_dust","id":394},{"name":"minecraft:goat_horn","id":622},{"name":"minecraft:goat_spawn_egg","id":501},{"name":"minecraft:gold_block","id":41},{"name":"minecraft:gold_ingot","id":306},{"name":"minecraft:gold_nugget","id":425},{"name":"minecraft:gold_ore","id":14},{"name":"minecraft:golden_apple","id":258},{"name":"minecraft:golden_axe","id":325},{"name":"minecraft:golden_boots","id":354},{"name":"minecraft:golden_carrot","id":283},{"name":"minecraft:golden_chestplate","id":352},{"name":"minecraft:golden_helmet","id":351},{"name":"minecraft:golden_hoe","id":333},{"name":"minecraft:golden_horse_armor","id":532},{"name":"minecraft:golden_leggings","id":353},{"name":"minecraft:golden_pickaxe","id":324},{"name":"minecraft:golden_rail","id":27},{"name":"minecraft:golden_shovel","id":323},{"name":"minecraft:golden_sword","id":322},{"name":"minecraft:granite_stairs","id":-169},{"name":"minecraft:grass","id":2},{"name":"minecraft:grass_path","id":198},{"name":"minecraft:gravel","id":13},{"name":"minecraft:gray_dye","id":403},{"name":"minecraft:gray_glazed_terracotta","id":227},{"name":"minecraft:green_dye","id":397},{"name":"minecraft:green_glazed_terracotta","id":233},{"name":"minecraft:grindstone","id":-195},{"name":"minecraft:guardian_spawn_egg","id":461},{"name":"minecraft:gunpowder","id":328},{"name":"minecraft:hanging_roots","id":-319},{"name":"minecraft:hard_glass","id":253},{"name":"minecraft:hard_glass_pane","id":190},{"name":"minecraft:hard_stained_glass","id":254},{"name":"minecraft:hard_stained_glass_pane","id":191},{"name":"minecraft:hardened_clay","id":172},{"name":"minecraft:hay_block","id":170},{"name":"minecraft:heart_of_the_sea","id":571},{"name":"minecraft:heavy_weighted_pressure_plate","id":148},{"name":"minecraft:hoglin_spawn_egg","id":496},{"name":"minecraft:honey_block","id":-220},{"name":"minecraft:honey_bottle","id":591},{"name":"minecraft:honeycomb","id":590},{"name":"minecraft:honeycomb_block","id":-221},{"name":"minecraft:hopper","id":527},{"name":"minecraft:hopper_minecart","id":526},{"name":"minecraft:horse_spawn_egg","id":458},{"name":"minecraft:husk_spawn_egg","id":463},{"name":"minecraft:ice","id":79},{"name":"minecraft:ice_bomb","id":594},{"name":"minecraft:infested_deepslate","id":-454},{"name":"minecraft:info_update","id":248},{"name":"minecraft:info_update2","id":249},{"name":"minecraft:ink_sac","id":413},{"name":"minecraft:invisiblebedrock","id":95},{"name":"minecraft:iron_axe","id":298},{"name":"minecraft:iron_bars","id":101},{"name":"minecraft:iron_block","id":42},{"name":"minecraft:iron_boots","id":346},{"name":"minecraft:iron_chestplate","id":344},{"name":"minecraft:iron_door","id":372},{"name":"minecraft:iron_helmet","id":343},{"name":"minecraft:iron_hoe","id":331},{"name":"minecraft:iron_horse_armor","id":531},{"name":"minecraft:iron_ingot","id":305},{"name":"minecraft:iron_leggings","id":345},{"name":"minecraft:iron_nugget","id":569},{"name":"minecraft:iron_ore","id":15},{"name":"minecraft:iron_pickaxe","id":297},{"name":"minecraft:iron_shovel","id":296},{"name":"minecraft:iron_sword","id":307},{"name":"minecraft:iron_trapdoor","id":167},{"name":"minecraft:item.acacia_door","id":196},{"name":"minecraft:item.bed","id":26},{"name":"minecraft:item.beetroot","id":244},{"name":"minecraft:item.birch_door","id":194},{"name":"minecraft:item.cake","id":92},{"name":"minecraft:item.camera","id":242},{"name":"minecraft:item.campfire","id":-209},{"name":"minecraft:item.cauldron","id":118},{"name":"minecraft:item.chain","id":-286},{"name":"minecraft:item.crimson_door","id":-244},{"name":"minecraft:item.dark_oak_door","id":197},{"name":"minecraft:item.flower_pot","id":140},{"name":"minecraft:item.frame","id":199},{"name":"minecraft:item.glow_frame","id":-339},{"name":"minecraft:item.hopper","id":154},{"name":"minecraft:item.iron_door","id":71},{"name":"minecraft:item.jungle_door","id":195},{"name":"minecraft:item.kelp","id":-138},{"name":"minecraft:item.nether_sprouts","id":-238},{"name":"minecraft:item.nether_wart","id":115},{"name":"minecraft:item.reeds","id":83},{"name":"minecraft:item.skull","id":144},{"name":"minecraft:item.soul_campfire","id":-290},{"name":"minecraft:item.spruce_door","id":193},{"name":"minecraft:item.warped_door","id":-245},{"name":"minecraft:item.wheat","id":59},{"name":"minecraft:item.wooden_door","id":64},{"name":"minecraft:jigsaw","id":-211},{"name":"minecraft:jukebox","id":84},{"name":"minecraft:jungle_boat","id":377},{"name":"minecraft:jungle_button","id":-143},{"name":"minecraft:jungle_door","id":555},{"name":"minecraft:jungle_fence_gate","id":185},{"name":"minecraft:jungle_pressure_plate","id":-153},{"name":"minecraft:jungle_sign","id":578},{"name":"minecraft:jungle_stairs","id":136},{"name":"minecraft:jungle_standing_sign","id":-188},{"name":"minecraft:jungle_trapdoor","id":-148},{"name":"minecraft:jungle_wall_sign","id":-189},{"name":"minecraft:kelp","id":382},{"name":"minecraft:ladder","id":65},{"name":"minecraft:lantern","id":-208},{"name":"minecraft:lapis_block","id":22},{"name":"minecraft:lapis_lazuli","id":414},{"name":"minecraft:lapis_ore","id":21},{"name":"minecraft:large_amethyst_bud","id":-330},{"name":"minecraft:lava","id":11},{"name":"minecraft:lava_bucket","id":363},{"name":"minecraft:lava_cauldron","id":-210},{"name":"minecraft:lead","id":547},{"name":"minecraft:leather","id":381},{"name":"minecraft:leather_boots","id":338},{"name":"minecraft:leather_chestplate","id":336},{"name":"minecraft:leather_helmet","id":335},{"name":"minecraft:leather_horse_armor","id":530},{"name":"minecraft:leather_leggings","id":337},{"name":"minecraft:leaves","id":18},{"name":"minecraft:leaves2","id":161},{"name":"minecraft:lectern","id":-194},{"name":"minecraft:lever","id":69},{"name":"minecraft:light_block","id":-215},{"name":"minecraft:light_blue_dye","id":407},{"name":"minecraft:light_blue_glazed_terracotta","id":223},{"name":"minecraft:light_gray_dye","id":402},{"name":"minecraft:light_weighted_pressure_plate","id":147},{"name":"minecraft:lightning_rod","id":-312},{"name":"minecraft:lime_dye","id":405},{"name":"minecraft:lime_glazed_terracotta","id":225},{"name":"minecraft:lingering_potion","id":562},{"name":"minecraft:lit_blast_furnace","id":-214},{"name":"minecraft:lit_deepslate_redstone_ore","id":-404},{"name":"minecraft:lit_furnace","id":62},{"name":"minecraft:lit_pumpkin","id":91},{"name":"minecraft:lit_redstone_lamp","id":124},{"name":"minecraft:lit_redstone_ore","id":74},{"name":"minecraft:lit_smoker","id":-199},{"name":"minecraft:llama_spawn_egg","id":473},{"name":"minecraft:lodestone","id":-222},{"name":"minecraft:lodestone_compass","id":600},{"name":"minecraft:log","id":17},{"name":"minecraft:log2","id":162},{"name":"minecraft:loom","id":-204},{"name":"minecraft:magenta_dye","id":408},{"name":"minecraft:magenta_glazed_terracotta","id":222},{"name":"minecraft:magma","id":213},{"name":"minecraft:magma_cream","id":430},{"name":"minecraft:magma_cube_spawn_egg","id":455},{"name":"minecraft:medicine","id":598},{"name":"minecraft:medium_amethyst_bud","id":-331},{"name":"minecraft:melon_block","id":103},{"name":"minecraft:melon_seeds","id":293},{"name":"minecraft:melon_slice","id":272},{"name":"minecraft:melon_stem","id":105},{"name":"minecraft:milk_bucket","id":361},{"name":"minecraft:minecart","id":370},{"name":"minecraft:mob_spawner","id":52},{"name":"minecraft:mojang_banner_pattern","id":584},{"name":"minecraft:monster_egg","id":97},{"name":"minecraft:mooshroom_spawn_egg","id":440},{"name":"minecraft:moss_block","id":-320},{"name":"minecraft:moss_carpet","id":-335},{"name":"minecraft:mossy_cobblestone","id":48},{"name":"minecraft:mossy_cobblestone_stairs","id":-179},{"name":"minecraft:mossy_stone_brick_stairs","id":-175},{"name":"minecraft:movingblock","id":250},{"name":"minecraft:mule_spawn_egg","id":466},{"name":"minecraft:mushroom_stew","id":260},{"name":"minecraft:music_disc_11","id":544},{"name":"minecraft:music_disc_13","id":534},{"name":"minecraft:music_disc_blocks","id":536},{"name":"minecraft:music_disc_cat","id":535},{"name":"minecraft:music_disc_chirp","id":537},{"name":"minecraft:music_disc_far","id":538},{"name":"minecraft:music_disc_mall","id":539},{"name":"minecraft:music_disc_mellohi","id":540},{"name":"minecraft:music_disc_pigstep","id":618},{"name":"minecraft:music_disc_stal","id":541},{"name":"minecraft:music_disc_strad","id":542},{"name":"minecraft:music_disc_wait","id":545},{"name":"minecraft:music_disc_ward","id":543},{"name":"minecraft:mutton","id":550},{"name":"minecraft:mycelium","id":110},{"name":"minecraft:name_tag","id":548},{"name":"minecraft:nautilus_shell","id":570},{"name":"minecraft:nether_brick","id":112},{"name":"minecraft:nether_brick_fence","id":113},{"name":"minecraft:nether_brick_stairs","id":114},{"name":"minecraft:nether_gold_ore","id":-288},{"name":"minecraft:nether_sprouts","id":619},{"name":"minecraft:nether_star","id":518},{"name":"minecraft:nether_wart","id":294},{"name":"minecraft:nether_wart_block","id":214},{"name":"minecraft:netherbrick","id":523},{"name":"minecraft:netherite_axe","id":605},{"name":"minecraft:netherite_block","id":-270},{"name":"minecraft:netherite_boots","id":610},{"name":"minecraft:netherite_chestplate","id":608},{"name":"minecraft:netherite_helmet","id":607},{"name":"minecraft:netherite_hoe","id":606},{"name":"minecraft:netherite_ingot","id":601},{"name":"minecraft:netherite_leggings","id":609},{"name":"minecraft:netherite_pickaxe","id":604},{"name":"minecraft:netherite_scrap","id":611},{"name":"minecraft:netherite_shovel","id":603},{"name":"minecraft:netherite_sword","id":602},{"name":"minecraft:netherrack","id":87},{"name":"minecraft:netherreactor","id":247},{"name":"minecraft:normal_stone_stairs","id":-180},{"name":"minecraft:noteblock","id":25},{"name":"minecraft:npc_spawn_egg","id":470},{"name":"minecraft:oak_boat","id":375},{"name":"minecraft:oak_sign","id":358},{"name":"minecraft:oak_stairs","id":53},{"name":"minecraft:observer","id":251},{"name":"minecraft:obsidian","id":49},{"name":"minecraft:ocelot_spawn_egg","id":451},{"name":"minecraft:orange_dye","id":409},{"name":"minecraft:orange_glazed_terracotta","id":221},{"name":"minecraft:oxidized_copper","id":-343},{"name":"minecraft:oxidized_cut_copper","id":-350},{"name":"minecraft:oxidized_cut_copper_slab","id":-364},{"name":"minecraft:oxidized_cut_copper_stairs","id":-357},{"name":"minecraft:oxidized_double_cut_copper_slab","id":-371},{"name":"minecraft:packed_ice","id":174},{"name":"minecraft:painting","id":357},{"name":"minecraft:panda_spawn_egg","id":489},{"name":"minecraft:paper","id":386},{"name":"minecraft:parrot_spawn_egg","id":478},{"name":"minecraft:phantom_membrane","id":574},{"name":"minecraft:phantom_spawn_egg","id":486},{"name":"minecraft:pig_spawn_egg","id":437},{"name":"minecraft:piglin_banner_pattern","id":587},{"name":"minecraft:piglin_brute_spawn_egg","id":499},{"name":"minecraft:piglin_spawn_egg","id":497},{"name":"minecraft:pillager_spawn_egg","id":491},{"name":"minecraft:pink_dye","id":404},{"name":"minecraft:pink_glazed_terracotta","id":226},{"name":"minecraft:piston","id":33},{"name":"minecraft:pistonarmcollision","id":34},{"name":"minecraft:planks","id":5},{"name":"minecraft:podzol","id":243},{"name":"minecraft:pointed_dripstone","id":-308},{"name":"minecraft:poisonous_potato","id":282},{"name":"minecraft:polar_bear_spawn_egg","id":472},{"name":"minecraft:polished_andesite_stairs","id":-174},{"name":"minecraft:polished_basalt","id":-235},{"name":"minecraft:polished_blackstone","id":-291},{"name":"minecraft:polished_blackstone_brick_double_slab","id":-285},{"name":"minecraft:polished_blackstone_brick_slab","id":-284},{"name":"minecraft:polished_blackstone_brick_stairs","id":-275},{"name":"minecraft:polished_blackstone_brick_wall","id":-278},{"name":"minecraft:polished_blackstone_bricks","id":-274},{"name":"minecraft:polished_blackstone_button","id":-296},{"name":"minecraft:polished_blackstone_double_slab","id":-294},{"name":"minecraft:polished_blackstone_pressure_plate","id":-295},{"name":"minecraft:polished_blackstone_slab","id":-293},{"name":"minecraft:polished_blackstone_stairs","id":-292},{"name":"minecraft:polished_blackstone_wall","id":-297},{"name":"minecraft:polished_deepslate","id":-383},{"name":"minecraft:polished_deepslate_double_slab","id":-397},{"name":"minecraft:polished_deepslate_slab","id":-384},{"name":"minecraft:polished_deepslate_stairs","id":-385},{"name":"minecraft:polished_deepslate_wall","id":-386},{"name":"minecraft:polished_diorite_stairs","id":-173},{"name":"minecraft:polished_granite_stairs","id":-172},{"name":"minecraft:popped_chorus_fruit","id":559},{"name":"minecraft:porkchop","id":262},{"name":"minecraft:portal","id":90},{"name":"minecraft:potato","id":280},{"name":"minecraft:potatoes","id":142},{"name":"minecraft:potion","id":426},{"name":"minecraft:powder_snow","id":-306},{"name":"minecraft:powder_snow_bucket","id":368},{"name":"minecraft:powered_comparator","id":150},{"name":"minecraft:powered_repeater","id":94},{"name":"minecraft:prismarine","id":168},{"name":"minecraft:prismarine_bricks_stairs","id":-4},{"name":"minecraft:prismarine_crystals","id":549},{"name":"minecraft:prismarine_shard","id":565},{"name":"minecraft:prismarine_stairs","id":-2},{"name":"minecraft:pufferfish","id":267},{"name":"minecraft:pufferfish_bucket","id":367},{"name":"minecraft:pufferfish_spawn_egg","id":481},{"name":"minecraft:pumpkin","id":86},{"name":"minecraft:pumpkin_pie","id":284},{"name":"minecraft:pumpkin_seeds","id":292},{"name":"minecraft:pumpkin_stem","id":104},{"name":"minecraft:purple_dye","id":400},{"name":"minecraft:purple_glazed_terracotta","id":219},{"name":"minecraft:purpur_block","id":201},{"name":"minecraft:purpur_stairs","id":203},{"name":"minecraft:quartz","id":524},{"name":"minecraft:quartz_block","id":155},{"name":"minecraft:quartz_bricks","id":-304},{"name":"minecraft:quartz_ore","id":153},{"name":"minecraft:quartz_stairs","id":156},{"name":"minecraft:rabbit","id":288},{"name":"minecraft:rabbit_foot","id":528},{"name":"minecraft:rabbit_hide","id":529},{"name":"minecraft:rabbit_spawn_egg","id":459},{"name":"minecraft:rabbit_stew","id":290},{"name":"minecraft:rail","id":66},{"name":"minecraft:rapid_fertilizer","id":596},{"name":"minecraft:ravager_spawn_egg","id":493},{"name":"minecraft:raw_copper","id":507},{"name":"minecraft:raw_copper_block","id":-452},{"name":"minecraft:raw_gold","id":506},{"name":"minecraft:raw_gold_block","id":-453},{"name":"minecraft:raw_iron","id":505},{"name":"minecraft:raw_iron_block","id":-451},{"name":"minecraft:real_double_stone_slab","id":43},{"name":"minecraft:real_double_stone_slab2","id":181},{"name":"minecraft:real_double_stone_slab3","id":-167},{"name":"minecraft:real_double_stone_slab4","id":-168},{"name":"minecraft:red_dye","id":396},{"name":"minecraft:red_flower","id":38},{"name":"minecraft:red_glazed_terracotta","id":234},{"name":"minecraft:red_mushroom","id":40},{"name":"minecraft:red_mushroom_block","id":100},{"name":"minecraft:red_nether_brick","id":215},{"name":"minecraft:red_nether_brick_stairs","id":-184},{"name":"minecraft:red_sandstone","id":179},{"name":"minecraft:red_sandstone_stairs","id":180},{"name":"minecraft:redstone","id":373},{"name":"minecraft:redstone_block","id":152},{"name":"minecraft:redstone_lamp","id":123},{"name":"minecraft:redstone_ore","id":73},{"name":"minecraft:redstone_torch","id":76},{"name":"minecraft:redstone_wire","id":55},{"name":"minecraft:repeater","id":419},{"name":"minecraft:repeating_command_block","id":188},{"name":"minecraft:reserved6","id":255},{"name":"minecraft:respawn_anchor","id":-272},{"name":"minecraft:rotten_flesh","id":277},{"name":"minecraft:saddle","id":371},{"name":"minecraft:salmon","id":265},{"name":"minecraft:salmon_bucket","id":365},{"name":"minecraft:salmon_spawn_egg","id":482},{"name":"minecraft:sand","id":12},{"name":"minecraft:sandstone","id":24},{"name":"minecraft:sandstone_stairs","id":128},{"name":"minecraft:sapling","id":6},{"name":"minecraft:scaffolding","id":-165},{"name":"minecraft:sculk_sensor","id":-307},{"name":"minecraft:scute","id":572},{"name":"minecraft:sea_pickle","id":-156},{"name":"minecraft:seagrass","id":-130},{"name":"minecraft:sealantern","id":169},{"name":"minecraft:shears","id":421},{"name":"minecraft:sheep_spawn_egg","id":438},{"name":"minecraft:shield","id":355},{"name":"minecraft:shroomlight","id":-230},{"name":"minecraft:shulker_box","id":218},{"name":"minecraft:shulker_shell","id":566},{"name":"minecraft:shulker_spawn_egg","id":469},{"name":"minecraft:silver_glazed_terracotta","id":228},{"name":"minecraft:silverfish_spawn_egg","id":443},{"name":"minecraft:skeleton_horse_spawn_egg","id":467},{"name":"minecraft:skeleton_spawn_egg","id":444},{"name":"minecraft:skull","id":516},{"name":"minecraft:skull_banner_pattern","id":583},{"name":"minecraft:slime","id":165},{"name":"minecraft:slime_ball","id":388},{"name":"minecraft:slime_spawn_egg","id":445},{"name":"minecraft:small_amethyst_bud","id":-332},{"name":"minecraft:small_dripleaf_block","id":-336},{"name":"minecraft:smithing_table","id":-202},{"name":"minecraft:smoker","id":-198},{"name":"minecraft:smooth_basalt","id":-377},{"name":"minecraft:smooth_quartz_stairs","id":-185},{"name":"minecraft:smooth_red_sandstone_stairs","id":-176},{"name":"minecraft:smooth_sandstone_stairs","id":-177},{"name":"minecraft:smooth_stone","id":-183},{"name":"minecraft:snow","id":80},{"name":"minecraft:snow_layer","id":78},{"name":"minecraft:snowball","id":374},{"name":"minecraft:soul_campfire","id":620},{"name":"minecraft:soul_fire","id":-237},{"name":"minecraft:soul_lantern","id":-269},{"name":"minecraft:soul_sand","id":88},{"name":"minecraft:soul_soil","id":-236},{"name":"minecraft:soul_torch","id":-268},{"name":"minecraft:sparkler","id":599},{"name":"minecraft:spawn_egg","id":628},{"name":"minecraft:spider_eye","id":278},{"name":"minecraft:spider_spawn_egg","id":446},{"name":"minecraft:splash_potion","id":561},{"name":"minecraft:sponge","id":19},{"name":"minecraft:spore_blossom","id":-321},{"name":"minecraft:spruce_boat","id":378},{"name":"minecraft:spruce_button","id":-144},{"name":"minecraft:spruce_door","id":553},{"name":"minecraft:spruce_fence_gate","id":183},{"name":"minecraft:spruce_pressure_plate","id":-154},{"name":"minecraft:spruce_sign","id":576},{"name":"minecraft:spruce_stairs","id":134},{"name":"minecraft:spruce_standing_sign","id":-181},{"name":"minecraft:spruce_trapdoor","id":-149},{"name":"minecraft:spruce_wall_sign","id":-182},{"name":"minecraft:spyglass","id":772},{"name":"minecraft:squid_spawn_egg","id":450},{"name":"minecraft:stained_glass","id":241},{"name":"minecraft:stained_glass_pane","id":160},{"name":"minecraft:stained_hardened_clay","id":159},{"name":"minecraft:standing_banner","id":176},{"name":"minecraft:standing_sign","id":63},{"name":"minecraft:stick","id":320},{"name":"minecraft:sticky_piston","id":29},{"name":"minecraft:stickypistonarmcollision","id":-217},{"name":"minecraft:stone","id":1},{"name":"minecraft:stone_axe","id":315},{"name":"minecraft:stone_brick_stairs","id":109},{"name":"minecraft:stone_button","id":77},{"name":"minecraft:stone_hoe","id":330},{"name":"minecraft:stone_pickaxe","id":314},{"name":"minecraft:stone_pressure_plate","id":70},{"name":"minecraft:stone_shovel","id":313},{"name":"minecraft:stone_stairs","id":67},{"name":"minecraft:stone_sword","id":312},{"name":"minecraft:stonebrick","id":98},{"name":"minecraft:stonecutter","id":245},{"name":"minecraft:stonecutter_block","id":-197},{"name":"minecraft:stray_spawn_egg","id":462},{"name":"minecraft:strider_spawn_egg","id":495},{"name":"minecraft:string","id":326},{"name":"minecraft:stripped_acacia_log","id":-8},{"name":"minecraft:stripped_birch_log","id":-6},{"name":"minecraft:stripped_crimson_hyphae","id":-300},{"name":"minecraft:stripped_crimson_stem","id":-240},{"name":"minecraft:stripped_dark_oak_log","id":-9},{"name":"minecraft:stripped_jungle_log","id":-7},{"name":"minecraft:stripped_oak_log","id":-10},{"name":"minecraft:stripped_spruce_log","id":-5},{"name":"minecraft:stripped_warped_hyphae","id":-301},{"name":"minecraft:stripped_warped_stem","id":-241},{"name":"minecraft:structure_block","id":252},{"name":"minecraft:structure_void","id":217},{"name":"minecraft:sugar","id":416},{"name":"minecraft:sugar_cane","id":385},{"name":"minecraft:suspicious_stew","id":589},{"name":"minecraft:sweet_berries","id":287},{"name":"minecraft:sweet_berry_bush","id":-207},{"name":"minecraft:tallgrass","id":31},{"name":"minecraft:target","id":-239},{"name":"minecraft:tinted_glass","id":-334},{"name":"minecraft:tnt","id":46},{"name":"minecraft:tnt_minecart","id":525},{"name":"minecraft:torch","id":50},{"name":"minecraft:totem_of_undying","id":568},{"name":"minecraft:trapdoor","id":96},{"name":"minecraft:trapped_chest","id":146},{"name":"minecraft:trident","id":546},{"name":"minecraft:tripwire","id":132},{"name":"minecraft:tripwire_hook","id":131},{"name":"minecraft:tropical_fish","id":266},{"name":"minecraft:tropical_fish_bucket","id":366},{"name":"minecraft:tropical_fish_spawn_egg","id":479},{"name":"minecraft:tuff","id":-333},{"name":"minecraft:turtle_egg","id":-159},{"name":"minecraft:turtle_helmet","id":573},{"name":"minecraft:turtle_spawn_egg","id":485},{"name":"minecraft:twisting_vines","id":-287},{"name":"minecraft:underwater_torch","id":239},{"name":"minecraft:undyed_shulker_box","id":205},{"name":"minecraft:unknown","id":-305},{"name":"minecraft:unlit_redstone_torch","id":75},{"name":"minecraft:unpowered_comparator","id":149},{"name":"minecraft:unpowered_repeater","id":93},{"name":"minecraft:vex_spawn_egg","id":476},{"name":"minecraft:villager_spawn_egg","id":449},{"name":"minecraft:vindicator_spawn_egg","id":474},{"name":"minecraft:vine","id":106},{"name":"minecraft:wall_banner","id":177},{"name":"minecraft:wall_sign","id":68},{"name":"minecraft:wandering_trader_spawn_egg","id":492},{"name":"minecraft:warped_button","id":-261},{"name":"minecraft:warped_door","id":615},{"name":"minecraft:warped_double_slab","id":-267},{"name":"minecraft:warped_fence","id":-257},{"name":"minecraft:warped_fence_gate","id":-259},{"name":"minecraft:warped_fungus","id":-229},{"name":"minecraft:warped_fungus_on_a_stick","id":616},{"name":"minecraft:warped_hyphae","id":-298},{"name":"minecraft:warped_nylium","id":-233},{"name":"minecraft:warped_planks","id":-243},{"name":"minecraft:warped_pressure_plate","id":-263},{"name":"minecraft:warped_roots","id":-224},{"name":"minecraft:warped_sign","id":613},{"name":"minecraft:warped_slab","id":-265},{"name":"minecraft:warped_stairs","id":-255},{"name":"minecraft:warped_standing_sign","id":-251},{"name":"minecraft:warped_stem","id":-226},{"name":"minecraft:warped_trapdoor","id":-247},{"name":"minecraft:warped_wall_sign","id":-253},{"name":"minecraft:warped_wart_block","id":-227},{"name":"minecraft:water","id":9},{"name":"minecraft:water_bucket","id":362},{"name":"minecraft:waterlily","id":111},{"name":"minecraft:waxed_copper","id":-344},{"name":"minecraft:waxed_cut_copper","id":-351},{"name":"minecraft:waxed_cut_copper_slab","id":-365},{"name":"minecraft:waxed_cut_copper_stairs","id":-358},{"name":"minecraft:waxed_double_cut_copper_slab","id":-372},{"name":"minecraft:waxed_exposed_copper","id":-345},{"name":"minecraft:waxed_exposed_cut_copper","id":-352},{"name":"minecraft:waxed_exposed_cut_copper_slab","id":-366},{"name":"minecraft:waxed_exposed_cut_copper_stairs","id":-359},{"name":"minecraft:waxed_exposed_double_cut_copper_slab","id":-373},{"name":"minecraft:waxed_oxidized_copper","id":-446},{"name":"minecraft:waxed_oxidized_cut_copper","id":-447},{"name":"minecraft:waxed_oxidized_cut_copper_slab","id":-449},{"name":"minecraft:waxed_oxidized_cut_copper_stairs","id":-448},{"name":"minecraft:waxed_oxidized_double_cut_copper_slab","id":-450},{"name":"minecraft:waxed_weathered_copper","id":-346},{"name":"minecraft:waxed_weathered_cut_copper","id":-353},{"name":"minecraft:waxed_weathered_cut_copper_slab","id":-367},{"name":"minecraft:waxed_weathered_cut_copper_stairs","id":-360},{"name":"minecraft:waxed_weathered_double_cut_copper_slab","id":-374},{"name":"minecraft:weathered_copper","id":-342},{"name":"minecraft:weathered_cut_copper","id":-349},{"name":"minecraft:weathered_cut_copper_slab","id":-363},{"name":"minecraft:weathered_cut_copper_stairs","id":-356},{"name":"minecraft:weathered_double_cut_copper_slab","id":-370},{"name":"minecraft:web","id":30},{"name":"minecraft:weeping_vines","id":-231},{"name":"minecraft:wheat","id":334},{"name":"minecraft:wheat_seeds","id":291},{"name":"minecraft:white_dye","id":410},{"name":"minecraft:white_glazed_terracotta","id":220},{"name":"minecraft:witch_spawn_egg","id":452},{"name":"minecraft:wither_rose","id":-216},{"name":"minecraft:wither_skeleton_spawn_egg","id":464},{"name":"minecraft:wolf_spawn_egg","id":439},{"name":"minecraft:wood","id":-212},{"name":"minecraft:wooden_axe","id":311},{"name":"minecraft:wooden_button","id":143},{"name":"minecraft:wooden_door","id":359},{"name":"minecraft:wooden_hoe","id":329},{"name":"minecraft:wooden_pickaxe","id":310},{"name":"minecraft:wooden_pressure_plate","id":72},{"name":"minecraft:wooden_shovel","id":309},{"name":"minecraft:wooden_slab","id":158},{"name":"minecraft:wooden_sword","id":308},{"name":"minecraft:wool","id":35},{"name":"minecraft:writable_book","id":510},{"name":"minecraft:written_book","id":511},{"name":"minecraft:yellow_dye","id":406},{"name":"minecraft:yellow_flower","id":37},{"name":"minecraft:yellow_glazed_terracotta","id":224},{"name":"minecraft:zoglin_spawn_egg","id":498},{"name":"minecraft:zombie_horse_spawn_egg","id":468},{"name":"minecraft:zombie_pigman_spawn_egg","id":448},{"name":"minecraft:zombie_spawn_egg","id":447},{"name":"minecraft:zombie_villager_spawn_egg","id":477}] \ No newline at end of file diff --git a/src/main/resources/runtime_item_states_448.json b/src/main/resources/runtime_item_states_448.json deleted file mode 100644 index f9206beb6..000000000 --- a/src/main/resources/runtime_item_states_448.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"minecraft:acacia_boat","id":379},{"name":"minecraft:acacia_button","id":-140},{"name":"minecraft:acacia_door","id":556},{"name":"minecraft:acacia_fence_gate","id":187},{"name":"minecraft:acacia_pressure_plate","id":-150},{"name":"minecraft:acacia_sign","id":579},{"name":"minecraft:acacia_stairs","id":163},{"name":"minecraft:acacia_standing_sign","id":-190},{"name":"minecraft:acacia_trapdoor","id":-145},{"name":"minecraft:acacia_wall_sign","id":-191},{"name":"minecraft:activator_rail","id":126},{"name":"minecraft:agent_spawn_egg","id":487},{"name":"minecraft:air","id":-158},{"name":"minecraft:allow","id":210},{"name":"minecraft:amethyst_block","id":-327},{"name":"minecraft:amethyst_cluster","id":-329},{"name":"minecraft:amethyst_shard","id":624},{"name":"minecraft:ancient_debris","id":-271},{"name":"minecraft:andesite_stairs","id":-171},{"name":"minecraft:anvil","id":145},{"name":"minecraft:apple","id":257},{"name":"minecraft:armor_stand","id":552},{"name":"minecraft:arrow","id":301},{"name":"minecraft:axolotl_bucket","id":369},{"name":"minecraft:axolotl_spawn_egg","id":500},{"name":"minecraft:azalea","id":-337},{"name":"minecraft:azalea_leaves","id":-324},{"name":"minecraft:azalea_leaves_flowered","id":-325},{"name":"minecraft:baked_potato","id":281},{"name":"minecraft:balloon","id":598},{"name":"minecraft:bamboo","id":-163},{"name":"minecraft:bamboo_sapling","id":-164},{"name":"minecraft:banner","id":567},{"name":"minecraft:banner_pattern","id":628},{"name":"minecraft:barrel","id":-203},{"name":"minecraft:barrier","id":-161},{"name":"minecraft:basalt","id":-234},{"name":"minecraft:bat_spawn_egg","id":453},{"name":"minecraft:beacon","id":138},{"name":"minecraft:bed","id":418},{"name":"minecraft:bedrock","id":7},{"name":"minecraft:bee_nest","id":-218},{"name":"minecraft:bee_spawn_egg","id":494},{"name":"minecraft:beef","id":273},{"name":"minecraft:beehive","id":-219},{"name":"minecraft:beetroot","id":285},{"name":"minecraft:beetroot_seeds","id":295},{"name":"minecraft:beetroot_soup","id":286},{"name":"minecraft:bell","id":-206},{"name":"minecraft:big_dripleaf","id":-323},{"name":"minecraft:birch_boat","id":376},{"name":"minecraft:birch_button","id":-141},{"name":"minecraft:birch_door","id":554},{"name":"minecraft:birch_fence_gate","id":184},{"name":"minecraft:birch_pressure_plate","id":-151},{"name":"minecraft:birch_sign","id":577},{"name":"minecraft:birch_stairs","id":135},{"name":"minecraft:birch_standing_sign","id":-186},{"name":"minecraft:birch_trapdoor","id":-146},{"name":"minecraft:birch_wall_sign","id":-187},{"name":"minecraft:black_candle","id":-428},{"name":"minecraft:black_candle_cake","id":-445},{"name":"minecraft:black_dye","id":395},{"name":"minecraft:black_glazed_terracotta","id":235},{"name":"minecraft:blackstone","id":-273},{"name":"minecraft:blackstone_double_slab","id":-283},{"name":"minecraft:blackstone_slab","id":-282},{"name":"minecraft:blackstone_stairs","id":-276},{"name":"minecraft:blackstone_wall","id":-277},{"name":"minecraft:blast_furnace","id":-196},{"name":"minecraft:blaze_powder","id":429},{"name":"minecraft:blaze_rod","id":423},{"name":"minecraft:blaze_spawn_egg","id":456},{"name":"minecraft:bleach","id":596},{"name":"minecraft:blue_candle","id":-424},{"name":"minecraft:blue_candle_cake","id":-441},{"name":"minecraft:blue_dye","id":399},{"name":"minecraft:blue_glazed_terracotta","id":231},{"name":"minecraft:blue_ice","id":-11},{"name":"minecraft:boat","id":626},{"name":"minecraft:bone","id":415},{"name":"minecraft:bone_block","id":216},{"name":"minecraft:bone_meal","id":411},{"name":"minecraft:book","id":387},{"name":"minecraft:bookshelf","id":47},{"name":"minecraft:border_block","id":212},{"name":"minecraft:bordure_indented_banner_pattern","id":586},{"name":"minecraft:bow","id":300},{"name":"minecraft:bowl","id":321},{"name":"minecraft:bread","id":261},{"name":"minecraft:brewing_stand","id":431},{"name":"minecraft:brewingstandblock","id":117},{"name":"minecraft:brick","id":383},{"name":"minecraft:brick_block","id":45},{"name":"minecraft:brick_stairs","id":108},{"name":"minecraft:brown_candle","id":-425},{"name":"minecraft:brown_candle_cake","id":-442},{"name":"minecraft:brown_dye","id":398},{"name":"minecraft:brown_glazed_terracotta","id":232},{"name":"minecraft:brown_mushroom","id":39},{"name":"minecraft:brown_mushroom_block","id":99},{"name":"minecraft:bubble_column","id":-160},{"name":"minecraft:bucket","id":360},{"name":"minecraft:budding_amethyst","id":-328},{"name":"minecraft:cactus","id":81},{"name":"minecraft:cake","id":417},{"name":"minecraft:calcite","id":-326},{"name":"minecraft:camera","id":593},{"name":"minecraft:campfire","id":588},{"name":"minecraft:candle","id":-412},{"name":"minecraft:candle_cake","id":-429},{"name":"minecraft:carpet","id":171},{"name":"minecraft:carrot","id":279},{"name":"minecraft:carrot_on_a_stick","id":517},{"name":"minecraft:carrots","id":141},{"name":"minecraft:cartography_table","id":-200},{"name":"minecraft:carved_pumpkin","id":-155},{"name":"minecraft:cat_spawn_egg","id":488},{"name":"minecraft:cauldron","id":432},{"name":"minecraft:cave_spider_spawn_egg","id":457},{"name":"minecraft:cave_vines","id":-322},{"name":"minecraft:cave_vines_body_with_berries","id":-375},{"name":"minecraft:cave_vines_head_with_berries","id":-376},{"name":"minecraft:chain","id":618},{"name":"minecraft:chain_command_block","id":189},{"name":"minecraft:chainmail_boots","id":342},{"name":"minecraft:chainmail_chestplate","id":340},{"name":"minecraft:chainmail_helmet","id":339},{"name":"minecraft:chainmail_leggings","id":341},{"name":"minecraft:charcoal","id":303},{"name":"minecraft:chemical_heat","id":192},{"name":"minecraft:chemistry_table","id":238},{"name":"minecraft:chest","id":54},{"name":"minecraft:chest_minecart","id":389},{"name":"minecraft:chicken","id":275},{"name":"minecraft:chicken_spawn_egg","id":435},{"name":"minecraft:chiseled_deepslate","id":-395},{"name":"minecraft:chiseled_nether_bricks","id":-302},{"name":"minecraft:chiseled_polished_blackstone","id":-279},{"name":"minecraft:chorus_flower","id":200},{"name":"minecraft:chorus_fruit","id":558},{"name":"minecraft:chorus_plant","id":240},{"name":"minecraft:clay","id":82},{"name":"minecraft:clay_ball","id":384},{"name":"minecraft:clock","id":393},{"name":"minecraft:coal","id":302},{"name":"minecraft:coal_block","id":173},{"name":"minecraft:coal_ore","id":16},{"name":"minecraft:cobbled_deepslate","id":-379},{"name":"minecraft:cobbled_deepslate_double_slab","id":-396},{"name":"minecraft:cobbled_deepslate_slab","id":-380},{"name":"minecraft:cobbled_deepslate_stairs","id":-381},{"name":"minecraft:cobbled_deepslate_wall","id":-382},{"name":"minecraft:cobblestone","id":4},{"name":"minecraft:cobblestone_wall","id":139},{"name":"minecraft:cocoa","id":127},{"name":"minecraft:cocoa_beans","id":412},{"name":"minecraft:cod","id":264},{"name":"minecraft:cod_bucket","id":364},{"name":"minecraft:cod_spawn_egg","id":480},{"name":"minecraft:colored_torch_bp","id":204},{"name":"minecraft:colored_torch_rg","id":202},{"name":"minecraft:command_block","id":137},{"name":"minecraft:command_block_minecart","id":563},{"name":"minecraft:comparator","id":522},{"name":"minecraft:compass","id":391},{"name":"minecraft:composter","id":-213},{"name":"minecraft:compound","id":594},{"name":"minecraft:concrete","id":236},{"name":"minecraft:concrete_powder","id":237},{"name":"minecraft:conduit","id":-157},{"name":"minecraft:cooked_beef","id":274},{"name":"minecraft:cooked_chicken","id":276},{"name":"minecraft:cooked_cod","id":268},{"name":"minecraft:cooked_mutton","id":551},{"name":"minecraft:cooked_porkchop","id":263},{"name":"minecraft:cooked_rabbit","id":289},{"name":"minecraft:cooked_salmon","id":269},{"name":"minecraft:cookie","id":271},{"name":"minecraft:copper_block","id":-340},{"name":"minecraft:copper_ingot","id":504},{"name":"minecraft:copper_ore","id":-311},{"name":"minecraft:coral","id":-131},{"name":"minecraft:coral_block","id":-132},{"name":"minecraft:coral_fan","id":-133},{"name":"minecraft:coral_fan_dead","id":-134},{"name":"minecraft:coral_fan_hang","id":-135},{"name":"minecraft:coral_fan_hang2","id":-136},{"name":"minecraft:coral_fan_hang3","id":-137},{"name":"minecraft:cow_spawn_egg","id":436},{"name":"minecraft:cracked_deepslate_bricks","id":-410},{"name":"minecraft:cracked_deepslate_tiles","id":-409},{"name":"minecraft:cracked_nether_bricks","id":-303},{"name":"minecraft:cracked_polished_blackstone_bricks","id":-280},{"name":"minecraft:crafting_table","id":58},{"name":"minecraft:creeper_banner_pattern","id":582},{"name":"minecraft:creeper_spawn_egg","id":441},{"name":"minecraft:crimson_button","id":-260},{"name":"minecraft:crimson_door","id":615},{"name":"minecraft:crimson_double_slab","id":-266},{"name":"minecraft:crimson_fence","id":-256},{"name":"minecraft:crimson_fence_gate","id":-258},{"name":"minecraft:crimson_fungus","id":-228},{"name":"minecraft:crimson_hyphae","id":-299},{"name":"minecraft:crimson_nylium","id":-232},{"name":"minecraft:crimson_planks","id":-242},{"name":"minecraft:crimson_pressure_plate","id":-262},{"name":"minecraft:crimson_roots","id":-223},{"name":"minecraft:crimson_sign","id":613},{"name":"minecraft:crimson_slab","id":-264},{"name":"minecraft:crimson_stairs","id":-254},{"name":"minecraft:crimson_standing_sign","id":-250},{"name":"minecraft:crimson_stem","id":-225},{"name":"minecraft:crimson_trapdoor","id":-246},{"name":"minecraft:crimson_wall_sign","id":-252},{"name":"minecraft:crossbow","id":575},{"name":"minecraft:crying_obsidian","id":-289},{"name":"minecraft:cut_copper","id":-347},{"name":"minecraft:cut_copper_slab","id":-361},{"name":"minecraft:cut_copper_stairs","id":-354},{"name":"minecraft:cyan_candle","id":-422},{"name":"minecraft:cyan_candle_cake","id":-439},{"name":"minecraft:cyan_dye","id":401},{"name":"minecraft:cyan_glazed_terracotta","id":229},{"name":"minecraft:dark_oak_boat","id":380},{"name":"minecraft:dark_oak_button","id":-142},{"name":"minecraft:dark_oak_door","id":557},{"name":"minecraft:dark_oak_fence_gate","id":186},{"name":"minecraft:dark_oak_pressure_plate","id":-152},{"name":"minecraft:dark_oak_sign","id":580},{"name":"minecraft:dark_oak_stairs","id":164},{"name":"minecraft:dark_oak_trapdoor","id":-147},{"name":"minecraft:dark_prismarine_stairs","id":-3},{"name":"minecraft:darkoak_standing_sign","id":-192},{"name":"minecraft:darkoak_wall_sign","id":-193},{"name":"minecraft:daylight_detector","id":151},{"name":"minecraft:daylight_detector_inverted","id":178},{"name":"minecraft:deadbush","id":32},{"name":"minecraft:debug_stick","id":590},{"name":"minecraft:deepslate","id":-378},{"name":"minecraft:deepslate_brick_double_slab","id":-399},{"name":"minecraft:deepslate_brick_slab","id":-392},{"name":"minecraft:deepslate_brick_stairs","id":-393},{"name":"minecraft:deepslate_brick_wall","id":-394},{"name":"minecraft:deepslate_bricks","id":-391},{"name":"minecraft:deepslate_coal_ore","id":-406},{"name":"minecraft:deepslate_copper_ore","id":-408},{"name":"minecraft:deepslate_diamond_ore","id":-405},{"name":"minecraft:deepslate_emerald_ore","id":-407},{"name":"minecraft:deepslate_gold_ore","id":-402},{"name":"minecraft:deepslate_iron_ore","id":-401},{"name":"minecraft:deepslate_lapis_ore","id":-400},{"name":"minecraft:deepslate_redstone_ore","id":-403},{"name":"minecraft:deepslate_tile_double_slab","id":-398},{"name":"minecraft:deepslate_tile_slab","id":-388},{"name":"minecraft:deepslate_tile_stairs","id":-389},{"name":"minecraft:deepslate_tile_wall","id":-390},{"name":"minecraft:deepslate_tiles","id":-387},{"name":"minecraft:deny","id":211},{"name":"minecraft:detector_rail","id":28},{"name":"minecraft:diamond","id":304},{"name":"minecraft:diamond_axe","id":319},{"name":"minecraft:diamond_block","id":57},{"name":"minecraft:diamond_boots","id":350},{"name":"minecraft:diamond_chestplate","id":348},{"name":"minecraft:diamond_helmet","id":347},{"name":"minecraft:diamond_hoe","id":332},{"name":"minecraft:diamond_horse_armor","id":533},{"name":"minecraft:diamond_leggings","id":349},{"name":"minecraft:diamond_ore","id":56},{"name":"minecraft:diamond_pickaxe","id":318},{"name":"minecraft:diamond_shovel","id":317},{"name":"minecraft:diamond_sword","id":316},{"name":"minecraft:diorite_stairs","id":-170},{"name":"minecraft:dirt","id":3},{"name":"minecraft:dirt_with_roots","id":-318},{"name":"minecraft:dispenser","id":23},{"name":"minecraft:dolphin_spawn_egg","id":484},{"name":"minecraft:donkey_spawn_egg","id":465},{"name":"minecraft:double_cut_copper_slab","id":-368},{"name":"minecraft:double_plant","id":175},{"name":"minecraft:double_stone_slab","id":44},{"name":"minecraft:double_stone_slab2","id":182},{"name":"minecraft:double_stone_slab3","id":-162},{"name":"minecraft:double_stone_slab4","id":-166},{"name":"minecraft:double_wooden_slab","id":157},{"name":"minecraft:dragon_breath","id":560},{"name":"minecraft:dragon_egg","id":122},{"name":"minecraft:dried_kelp","id":270},{"name":"minecraft:dried_kelp_block","id":-139},{"name":"minecraft:dripstone_block","id":-317},{"name":"minecraft:dropper","id":125},{"name":"minecraft:drowned_spawn_egg","id":483},{"name":"minecraft:dye","id":627},{"name":"minecraft:egg","id":390},{"name":"minecraft:elder_guardian_spawn_egg","id":471},{"name":"minecraft:element_0","id":36},{"name":"minecraft:element_1","id":-12},{"name":"minecraft:element_10","id":-21},{"name":"minecraft:element_100","id":-111},{"name":"minecraft:element_101","id":-112},{"name":"minecraft:element_102","id":-113},{"name":"minecraft:element_103","id":-114},{"name":"minecraft:element_104","id":-115},{"name":"minecraft:element_105","id":-116},{"name":"minecraft:element_106","id":-117},{"name":"minecraft:element_107","id":-118},{"name":"minecraft:element_108","id":-119},{"name":"minecraft:element_109","id":-120},{"name":"minecraft:element_11","id":-22},{"name":"minecraft:element_110","id":-121},{"name":"minecraft:element_111","id":-122},{"name":"minecraft:element_112","id":-123},{"name":"minecraft:element_113","id":-124},{"name":"minecraft:element_114","id":-125},{"name":"minecraft:element_115","id":-126},{"name":"minecraft:element_116","id":-127},{"name":"minecraft:element_117","id":-128},{"name":"minecraft:element_118","id":-129},{"name":"minecraft:element_12","id":-23},{"name":"minecraft:element_13","id":-24},{"name":"minecraft:element_14","id":-25},{"name":"minecraft:element_15","id":-26},{"name":"minecraft:element_16","id":-27},{"name":"minecraft:element_17","id":-28},{"name":"minecraft:element_18","id":-29},{"name":"minecraft:element_19","id":-30},{"name":"minecraft:element_2","id":-13},{"name":"minecraft:element_20","id":-31},{"name":"minecraft:element_21","id":-32},{"name":"minecraft:element_22","id":-33},{"name":"minecraft:element_23","id":-34},{"name":"minecraft:element_24","id":-35},{"name":"minecraft:element_25","id":-36},{"name":"minecraft:element_26","id":-37},{"name":"minecraft:element_27","id":-38},{"name":"minecraft:element_28","id":-39},{"name":"minecraft:element_29","id":-40},{"name":"minecraft:element_3","id":-14},{"name":"minecraft:element_30","id":-41},{"name":"minecraft:element_31","id":-42},{"name":"minecraft:element_32","id":-43},{"name":"minecraft:element_33","id":-44},{"name":"minecraft:element_34","id":-45},{"name":"minecraft:element_35","id":-46},{"name":"minecraft:element_36","id":-47},{"name":"minecraft:element_37","id":-48},{"name":"minecraft:element_38","id":-49},{"name":"minecraft:element_39","id":-50},{"name":"minecraft:element_4","id":-15},{"name":"minecraft:element_40","id":-51},{"name":"minecraft:element_41","id":-52},{"name":"minecraft:element_42","id":-53},{"name":"minecraft:element_43","id":-54},{"name":"minecraft:element_44","id":-55},{"name":"minecraft:element_45","id":-56},{"name":"minecraft:element_46","id":-57},{"name":"minecraft:element_47","id":-58},{"name":"minecraft:element_48","id":-59},{"name":"minecraft:element_49","id":-60},{"name":"minecraft:element_5","id":-16},{"name":"minecraft:element_50","id":-61},{"name":"minecraft:element_51","id":-62},{"name":"minecraft:element_52","id":-63},{"name":"minecraft:element_53","id":-64},{"name":"minecraft:element_54","id":-65},{"name":"minecraft:element_55","id":-66},{"name":"minecraft:element_56","id":-67},{"name":"minecraft:element_57","id":-68},{"name":"minecraft:element_58","id":-69},{"name":"minecraft:element_59","id":-70},{"name":"minecraft:element_6","id":-17},{"name":"minecraft:element_60","id":-71},{"name":"minecraft:element_61","id":-72},{"name":"minecraft:element_62","id":-73},{"name":"minecraft:element_63","id":-74},{"name":"minecraft:element_64","id":-75},{"name":"minecraft:element_65","id":-76},{"name":"minecraft:element_66","id":-77},{"name":"minecraft:element_67","id":-78},{"name":"minecraft:element_68","id":-79},{"name":"minecraft:element_69","id":-80},{"name":"minecraft:element_7","id":-18},{"name":"minecraft:element_70","id":-81},{"name":"minecraft:element_71","id":-82},{"name":"minecraft:element_72","id":-83},{"name":"minecraft:element_73","id":-84},{"name":"minecraft:element_74","id":-85},{"name":"minecraft:element_75","id":-86},{"name":"minecraft:element_76","id":-87},{"name":"minecraft:element_77","id":-88},{"name":"minecraft:element_78","id":-89},{"name":"minecraft:element_79","id":-90},{"name":"minecraft:element_8","id":-19},{"name":"minecraft:element_80","id":-91},{"name":"minecraft:element_81","id":-92},{"name":"minecraft:element_82","id":-93},{"name":"minecraft:element_83","id":-94},{"name":"minecraft:element_84","id":-95},{"name":"minecraft:element_85","id":-96},{"name":"minecraft:element_86","id":-97},{"name":"minecraft:element_87","id":-98},{"name":"minecraft:element_88","id":-99},{"name":"minecraft:element_89","id":-100},{"name":"minecraft:element_9","id":-20},{"name":"minecraft:element_90","id":-101},{"name":"minecraft:element_91","id":-102},{"name":"minecraft:element_92","id":-103},{"name":"minecraft:element_93","id":-104},{"name":"minecraft:element_94","id":-105},{"name":"minecraft:element_95","id":-106},{"name":"minecraft:element_96","id":-107},{"name":"minecraft:element_97","id":-108},{"name":"minecraft:element_98","id":-109},{"name":"minecraft:element_99","id":-110},{"name":"minecraft:elytra","id":564},{"name":"minecraft:emerald","id":512},{"name":"minecraft:emerald_block","id":133},{"name":"minecraft:emerald_ore","id":129},{"name":"minecraft:empty_map","id":515},{"name":"minecraft:enchanted_book","id":521},{"name":"minecraft:enchanted_golden_apple","id":259},{"name":"minecraft:enchanting_table","id":116},{"name":"minecraft:end_brick_stairs","id":-178},{"name":"minecraft:end_bricks","id":206},{"name":"minecraft:end_crystal","id":632},{"name":"minecraft:end_gateway","id":209},{"name":"minecraft:end_portal","id":119},{"name":"minecraft:end_portal_frame","id":120},{"name":"minecraft:end_rod","id":208},{"name":"minecraft:end_stone","id":121},{"name":"minecraft:ender_chest","id":130},{"name":"minecraft:ender_eye","id":433},{"name":"minecraft:ender_pearl","id":422},{"name":"minecraft:enderman_spawn_egg","id":442},{"name":"minecraft:endermite_spawn_egg","id":460},{"name":"minecraft:evoker_spawn_egg","id":475},{"name":"minecraft:experience_bottle","id":508},{"name":"minecraft:exposed_copper","id":-341},{"name":"minecraft:exposed_cut_copper","id":-348},{"name":"minecraft:exposed_cut_copper_slab","id":-362},{"name":"minecraft:exposed_cut_copper_stairs","id":-355},{"name":"minecraft:exposed_double_cut_copper_slab","id":-369},{"name":"minecraft:farmland","id":60},{"name":"minecraft:feather","id":327},{"name":"minecraft:fence","id":85},{"name":"minecraft:fence_gate","id":107},{"name":"minecraft:fermented_spider_eye","id":428},{"name":"minecraft:field_masoned_banner_pattern","id":585},{"name":"minecraft:filled_map","id":420},{"name":"minecraft:fire","id":51},{"name":"minecraft:fire_charge","id":509},{"name":"minecraft:firework_rocket","id":519},{"name":"minecraft:firework_star","id":520},{"name":"minecraft:fishing_rod","id":392},{"name":"minecraft:fletching_table","id":-201},{"name":"minecraft:flint","id":356},{"name":"minecraft:flint_and_steel","id":299},{"name":"minecraft:flower_banner_pattern","id":581},{"name":"minecraft:flower_pot","id":514},{"name":"minecraft:flowering_azalea","id":-338},{"name":"minecraft:flowing_lava","id":10},{"name":"minecraft:flowing_water","id":8},{"name":"minecraft:fox_spawn_egg","id":490},{"name":"minecraft:frame","id":513},{"name":"minecraft:frosted_ice","id":207},{"name":"minecraft:furnace","id":61},{"name":"minecraft:ghast_spawn_egg","id":454},{"name":"minecraft:ghast_tear","id":424},{"name":"minecraft:gilded_blackstone","id":-281},{"name":"minecraft:glass","id":20},{"name":"minecraft:glass_bottle","id":427},{"name":"minecraft:glass_pane","id":102},{"name":"minecraft:glistering_melon_slice","id":434},{"name":"minecraft:glow_berries","id":631},{"name":"minecraft:glow_frame","id":622},{"name":"minecraft:glow_ink_sac","id":503},{"name":"minecraft:glow_lichen","id":-411},{"name":"minecraft:glow_squid_spawn_egg","id":502},{"name":"minecraft:glow_stick","id":166},{"name":"minecraft:glowingobsidian","id":246},{"name":"minecraft:glowstone","id":89},{"name":"minecraft:glowstone_dust","id":394},{"name":"minecraft:goat_horn","id":623},{"name":"minecraft:goat_spawn_egg","id":501},{"name":"minecraft:gold_block","id":41},{"name":"minecraft:gold_ingot","id":306},{"name":"minecraft:gold_nugget","id":425},{"name":"minecraft:gold_ore","id":14},{"name":"minecraft:golden_apple","id":258},{"name":"minecraft:golden_axe","id":325},{"name":"minecraft:golden_boots","id":354},{"name":"minecraft:golden_carrot","id":283},{"name":"minecraft:golden_chestplate","id":352},{"name":"minecraft:golden_helmet","id":351},{"name":"minecraft:golden_hoe","id":333},{"name":"minecraft:golden_horse_armor","id":532},{"name":"minecraft:golden_leggings","id":353},{"name":"minecraft:golden_pickaxe","id":324},{"name":"minecraft:golden_rail","id":27},{"name":"minecraft:golden_shovel","id":323},{"name":"minecraft:golden_sword","id":322},{"name":"minecraft:granite_stairs","id":-169},{"name":"minecraft:grass","id":2},{"name":"minecraft:grass_path","id":198},{"name":"minecraft:gravel","id":13},{"name":"minecraft:gray_candle","id":-420},{"name":"minecraft:gray_candle_cake","id":-437},{"name":"minecraft:gray_dye","id":403},{"name":"minecraft:gray_glazed_terracotta","id":227},{"name":"minecraft:green_candle","id":-426},{"name":"minecraft:green_candle_cake","id":-443},{"name":"minecraft:green_dye","id":397},{"name":"minecraft:green_glazed_terracotta","id":233},{"name":"minecraft:grindstone","id":-195},{"name":"minecraft:guardian_spawn_egg","id":461},{"name":"minecraft:gunpowder","id":328},{"name":"minecraft:hanging_roots","id":-319},{"name":"minecraft:hard_glass","id":253},{"name":"minecraft:hard_glass_pane","id":190},{"name":"minecraft:hard_stained_glass","id":254},{"name":"minecraft:hard_stained_glass_pane","id":191},{"name":"minecraft:hardened_clay","id":172},{"name":"minecraft:hay_block","id":170},{"name":"minecraft:heart_of_the_sea","id":571},{"name":"minecraft:heavy_weighted_pressure_plate","id":148},{"name":"minecraft:hoglin_spawn_egg","id":496},{"name":"minecraft:honey_block","id":-220},{"name":"minecraft:honey_bottle","id":592},{"name":"minecraft:honeycomb","id":591},{"name":"minecraft:honeycomb_block","id":-221},{"name":"minecraft:hopper","id":527},{"name":"minecraft:hopper_minecart","id":526},{"name":"minecraft:horse_spawn_egg","id":458},{"name":"minecraft:husk_spawn_egg","id":463},{"name":"minecraft:ice","id":79},{"name":"minecraft:ice_bomb","id":595},{"name":"minecraft:infested_deepslate","id":-454},{"name":"minecraft:info_update","id":248},{"name":"minecraft:info_update2","id":249},{"name":"minecraft:ink_sac","id":413},{"name":"minecraft:invisiblebedrock","id":95},{"name":"minecraft:iron_axe","id":298},{"name":"minecraft:iron_bars","id":101},{"name":"minecraft:iron_block","id":42},{"name":"minecraft:iron_boots","id":346},{"name":"minecraft:iron_chestplate","id":344},{"name":"minecraft:iron_door","id":372},{"name":"minecraft:iron_helmet","id":343},{"name":"minecraft:iron_hoe","id":331},{"name":"minecraft:iron_horse_armor","id":531},{"name":"minecraft:iron_ingot","id":305},{"name":"minecraft:iron_leggings","id":345},{"name":"minecraft:iron_nugget","id":569},{"name":"minecraft:iron_ore","id":15},{"name":"minecraft:iron_pickaxe","id":297},{"name":"minecraft:iron_shovel","id":296},{"name":"minecraft:iron_sword","id":307},{"name":"minecraft:iron_trapdoor","id":167},{"name":"minecraft:item.acacia_door","id":196},{"name":"minecraft:item.bed","id":26},{"name":"minecraft:item.beetroot","id":244},{"name":"minecraft:item.birch_door","id":194},{"name":"minecraft:item.cake","id":92},{"name":"minecraft:item.camera","id":242},{"name":"minecraft:item.campfire","id":-209},{"name":"minecraft:item.cauldron","id":118},{"name":"minecraft:item.chain","id":-286},{"name":"minecraft:item.crimson_door","id":-244},{"name":"minecraft:item.dark_oak_door","id":197},{"name":"minecraft:item.flower_pot","id":140},{"name":"minecraft:item.frame","id":199},{"name":"minecraft:item.glow_frame","id":-339},{"name":"minecraft:item.hopper","id":154},{"name":"minecraft:item.iron_door","id":71},{"name":"minecraft:item.jungle_door","id":195},{"name":"minecraft:item.kelp","id":-138},{"name":"minecraft:item.nether_sprouts","id":-238},{"name":"minecraft:item.nether_wart","id":115},{"name":"minecraft:item.reeds","id":83},{"name":"minecraft:item.skull","id":144},{"name":"minecraft:item.soul_campfire","id":-290},{"name":"minecraft:item.spruce_door","id":193},{"name":"minecraft:item.warped_door","id":-245},{"name":"minecraft:item.wheat","id":59},{"name":"minecraft:item.wooden_door","id":64},{"name":"minecraft:jigsaw","id":-211},{"name":"minecraft:jukebox","id":84},{"name":"minecraft:jungle_boat","id":377},{"name":"minecraft:jungle_button","id":-143},{"name":"minecraft:jungle_door","id":555},{"name":"minecraft:jungle_fence_gate","id":185},{"name":"minecraft:jungle_pressure_plate","id":-153},{"name":"minecraft:jungle_sign","id":578},{"name":"minecraft:jungle_stairs","id":136},{"name":"minecraft:jungle_standing_sign","id":-188},{"name":"minecraft:jungle_trapdoor","id":-148},{"name":"minecraft:jungle_wall_sign","id":-189},{"name":"minecraft:kelp","id":382},{"name":"minecraft:ladder","id":65},{"name":"minecraft:lantern","id":-208},{"name":"minecraft:lapis_block","id":22},{"name":"minecraft:lapis_lazuli","id":414},{"name":"minecraft:lapis_ore","id":21},{"name":"minecraft:large_amethyst_bud","id":-330},{"name":"minecraft:lava","id":11},{"name":"minecraft:lava_bucket","id":363},{"name":"minecraft:lava_cauldron","id":-210},{"name":"minecraft:lead","id":547},{"name":"minecraft:leather","id":381},{"name":"minecraft:leather_boots","id":338},{"name":"minecraft:leather_chestplate","id":336},{"name":"minecraft:leather_helmet","id":335},{"name":"minecraft:leather_horse_armor","id":530},{"name":"minecraft:leather_leggings","id":337},{"name":"minecraft:leaves","id":18},{"name":"minecraft:leaves2","id":161},{"name":"minecraft:lectern","id":-194},{"name":"minecraft:lever","id":69},{"name":"minecraft:light_block","id":-215},{"name":"minecraft:light_blue_candle","id":-416},{"name":"minecraft:light_blue_candle_cake","id":-433},{"name":"minecraft:light_blue_dye","id":407},{"name":"minecraft:light_blue_glazed_terracotta","id":223},{"name":"minecraft:light_gray_candle","id":-421},{"name":"minecraft:light_gray_candle_cake","id":-438},{"name":"minecraft:light_gray_dye","id":402},{"name":"minecraft:light_weighted_pressure_plate","id":147},{"name":"minecraft:lightning_rod","id":-312},{"name":"minecraft:lime_candle","id":-418},{"name":"minecraft:lime_candle_cake","id":-435},{"name":"minecraft:lime_dye","id":405},{"name":"minecraft:lime_glazed_terracotta","id":225},{"name":"minecraft:lingering_potion","id":562},{"name":"minecraft:lit_blast_furnace","id":-214},{"name":"minecraft:lit_deepslate_redstone_ore","id":-404},{"name":"minecraft:lit_furnace","id":62},{"name":"minecraft:lit_pumpkin","id":91},{"name":"minecraft:lit_redstone_lamp","id":124},{"name":"minecraft:lit_redstone_ore","id":74},{"name":"minecraft:lit_smoker","id":-199},{"name":"minecraft:llama_spawn_egg","id":473},{"name":"minecraft:lodestone","id":-222},{"name":"minecraft:lodestone_compass","id":601},{"name":"minecraft:log","id":17},{"name":"minecraft:log2","id":162},{"name":"minecraft:loom","id":-204},{"name":"minecraft:magenta_candle","id":-415},{"name":"minecraft:magenta_candle_cake","id":-432},{"name":"minecraft:magenta_dye","id":408},{"name":"minecraft:magenta_glazed_terracotta","id":222},{"name":"minecraft:magma","id":213},{"name":"minecraft:magma_cream","id":430},{"name":"minecraft:magma_cube_spawn_egg","id":455},{"name":"minecraft:medicine","id":599},{"name":"minecraft:medium_amethyst_bud","id":-331},{"name":"minecraft:melon_block","id":103},{"name":"minecraft:melon_seeds","id":293},{"name":"minecraft:melon_slice","id":272},{"name":"minecraft:melon_stem","id":105},{"name":"minecraft:milk_bucket","id":361},{"name":"minecraft:minecart","id":370},{"name":"minecraft:mob_spawner","id":52},{"name":"minecraft:mojang_banner_pattern","id":584},{"name":"minecraft:monster_egg","id":97},{"name":"minecraft:mooshroom_spawn_egg","id":440},{"name":"minecraft:moss_block","id":-320},{"name":"minecraft:moss_carpet","id":-335},{"name":"minecraft:mossy_cobblestone","id":48},{"name":"minecraft:mossy_cobblestone_stairs","id":-179},{"name":"minecraft:mossy_stone_brick_stairs","id":-175},{"name":"minecraft:movingblock","id":250},{"name":"minecraft:mule_spawn_egg","id":466},{"name":"minecraft:mushroom_stew","id":260},{"name":"minecraft:music_disc_11","id":544},{"name":"minecraft:music_disc_13","id":534},{"name":"minecraft:music_disc_blocks","id":536},{"name":"minecraft:music_disc_cat","id":535},{"name":"minecraft:music_disc_chirp","id":537},{"name":"minecraft:music_disc_far","id":538},{"name":"minecraft:music_disc_mall","id":539},{"name":"minecraft:music_disc_mellohi","id":540},{"name":"minecraft:music_disc_pigstep","id":619},{"name":"minecraft:music_disc_stal","id":541},{"name":"minecraft:music_disc_strad","id":542},{"name":"minecraft:music_disc_wait","id":545},{"name":"minecraft:music_disc_ward","id":543},{"name":"minecraft:mutton","id":550},{"name":"minecraft:mycelium","id":110},{"name":"minecraft:name_tag","id":548},{"name":"minecraft:nautilus_shell","id":570},{"name":"minecraft:nether_brick","id":112},{"name":"minecraft:nether_brick_fence","id":113},{"name":"minecraft:nether_brick_stairs","id":114},{"name":"minecraft:nether_gold_ore","id":-288},{"name":"minecraft:nether_sprouts","id":620},{"name":"minecraft:nether_star","id":518},{"name":"minecraft:nether_wart","id":294},{"name":"minecraft:nether_wart_block","id":214},{"name":"minecraft:netherbrick","id":523},{"name":"minecraft:netherite_axe","id":606},{"name":"minecraft:netherite_block","id":-270},{"name":"minecraft:netherite_boots","id":611},{"name":"minecraft:netherite_chestplate","id":609},{"name":"minecraft:netherite_helmet","id":608},{"name":"minecraft:netherite_hoe","id":607},{"name":"minecraft:netherite_ingot","id":602},{"name":"minecraft:netherite_leggings","id":610},{"name":"minecraft:netherite_pickaxe","id":605},{"name":"minecraft:netherite_scrap","id":612},{"name":"minecraft:netherite_shovel","id":604},{"name":"minecraft:netherite_sword","id":603},{"name":"minecraft:netherrack","id":87},{"name":"minecraft:netherreactor","id":247},{"name":"minecraft:normal_stone_stairs","id":-180},{"name":"minecraft:noteblock","id":25},{"name":"minecraft:npc_spawn_egg","id":470},{"name":"minecraft:oak_boat","id":375},{"name":"minecraft:oak_sign","id":358},{"name":"minecraft:oak_stairs","id":53},{"name":"minecraft:observer","id":251},{"name":"minecraft:obsidian","id":49},{"name":"minecraft:ocelot_spawn_egg","id":451},{"name":"minecraft:orange_candle","id":-414},{"name":"minecraft:orange_candle_cake","id":-431},{"name":"minecraft:orange_dye","id":409},{"name":"minecraft:orange_glazed_terracotta","id":221},{"name":"minecraft:oxidized_copper","id":-343},{"name":"minecraft:oxidized_cut_copper","id":-350},{"name":"minecraft:oxidized_cut_copper_slab","id":-364},{"name":"minecraft:oxidized_cut_copper_stairs","id":-357},{"name":"minecraft:oxidized_double_cut_copper_slab","id":-371},{"name":"minecraft:packed_ice","id":174},{"name":"minecraft:painting","id":357},{"name":"minecraft:panda_spawn_egg","id":489},{"name":"minecraft:paper","id":386},{"name":"minecraft:parrot_spawn_egg","id":478},{"name":"minecraft:phantom_membrane","id":574},{"name":"minecraft:phantom_spawn_egg","id":486},{"name":"minecraft:pig_spawn_egg","id":437},{"name":"minecraft:piglin_banner_pattern","id":587},{"name":"minecraft:piglin_brute_spawn_egg","id":499},{"name":"minecraft:piglin_spawn_egg","id":497},{"name":"minecraft:pillager_spawn_egg","id":491},{"name":"minecraft:pink_candle","id":-419},{"name":"minecraft:pink_candle_cake","id":-436},{"name":"minecraft:pink_dye","id":404},{"name":"minecraft:pink_glazed_terracotta","id":226},{"name":"minecraft:piston","id":33},{"name":"minecraft:pistonarmcollision","id":34},{"name":"minecraft:planks","id":5},{"name":"minecraft:podzol","id":243},{"name":"minecraft:pointed_dripstone","id":-308},{"name":"minecraft:poisonous_potato","id":282},{"name":"minecraft:polar_bear_spawn_egg","id":472},{"name":"minecraft:polished_andesite_stairs","id":-174},{"name":"minecraft:polished_basalt","id":-235},{"name":"minecraft:polished_blackstone","id":-291},{"name":"minecraft:polished_blackstone_brick_double_slab","id":-285},{"name":"minecraft:polished_blackstone_brick_slab","id":-284},{"name":"minecraft:polished_blackstone_brick_stairs","id":-275},{"name":"minecraft:polished_blackstone_brick_wall","id":-278},{"name":"minecraft:polished_blackstone_bricks","id":-274},{"name":"minecraft:polished_blackstone_button","id":-296},{"name":"minecraft:polished_blackstone_double_slab","id":-294},{"name":"minecraft:polished_blackstone_pressure_plate","id":-295},{"name":"minecraft:polished_blackstone_slab","id":-293},{"name":"minecraft:polished_blackstone_stairs","id":-292},{"name":"minecraft:polished_blackstone_wall","id":-297},{"name":"minecraft:polished_deepslate","id":-383},{"name":"minecraft:polished_deepslate_double_slab","id":-397},{"name":"minecraft:polished_deepslate_slab","id":-384},{"name":"minecraft:polished_deepslate_stairs","id":-385},{"name":"minecraft:polished_deepslate_wall","id":-386},{"name":"minecraft:polished_diorite_stairs","id":-173},{"name":"minecraft:polished_granite_stairs","id":-172},{"name":"minecraft:popped_chorus_fruit","id":559},{"name":"minecraft:porkchop","id":262},{"name":"minecraft:portal","id":90},{"name":"minecraft:potato","id":280},{"name":"minecraft:potatoes","id":142},{"name":"minecraft:potion","id":426},{"name":"minecraft:powder_snow","id":-306},{"name":"minecraft:powder_snow_bucket","id":368},{"name":"minecraft:powered_comparator","id":150},{"name":"minecraft:powered_repeater","id":94},{"name":"minecraft:prismarine","id":168},{"name":"minecraft:prismarine_bricks_stairs","id":-4},{"name":"minecraft:prismarine_crystals","id":549},{"name":"minecraft:prismarine_shard","id":565},{"name":"minecraft:prismarine_stairs","id":-2},{"name":"minecraft:pufferfish","id":267},{"name":"minecraft:pufferfish_bucket","id":367},{"name":"minecraft:pufferfish_spawn_egg","id":481},{"name":"minecraft:pumpkin","id":86},{"name":"minecraft:pumpkin_pie","id":284},{"name":"minecraft:pumpkin_seeds","id":292},{"name":"minecraft:pumpkin_stem","id":104},{"name":"minecraft:purple_candle","id":-423},{"name":"minecraft:purple_candle_cake","id":-440},{"name":"minecraft:purple_dye","id":400},{"name":"minecraft:purple_glazed_terracotta","id":219},{"name":"minecraft:purpur_block","id":201},{"name":"minecraft:purpur_stairs","id":203},{"name":"minecraft:quartz","id":524},{"name":"minecraft:quartz_block","id":155},{"name":"minecraft:quartz_bricks","id":-304},{"name":"minecraft:quartz_ore","id":153},{"name":"minecraft:quartz_stairs","id":156},{"name":"minecraft:rabbit","id":288},{"name":"minecraft:rabbit_foot","id":528},{"name":"minecraft:rabbit_hide","id":529},{"name":"minecraft:rabbit_spawn_egg","id":459},{"name":"minecraft:rabbit_stew","id":290},{"name":"minecraft:rail","id":66},{"name":"minecraft:rapid_fertilizer","id":597},{"name":"minecraft:ravager_spawn_egg","id":493},{"name":"minecraft:raw_copper","id":507},{"name":"minecraft:raw_copper_block","id":-452},{"name":"minecraft:raw_gold","id":506},{"name":"minecraft:raw_gold_block","id":-453},{"name":"minecraft:raw_iron","id":505},{"name":"minecraft:raw_iron_block","id":-451},{"name":"minecraft:real_double_stone_slab","id":43},{"name":"minecraft:real_double_stone_slab2","id":181},{"name":"minecraft:real_double_stone_slab3","id":-167},{"name":"minecraft:real_double_stone_slab4","id":-168},{"name":"minecraft:red_candle","id":-427},{"name":"minecraft:red_candle_cake","id":-444},{"name":"minecraft:red_dye","id":396},{"name":"minecraft:red_flower","id":38},{"name":"minecraft:red_glazed_terracotta","id":234},{"name":"minecraft:red_mushroom","id":40},{"name":"minecraft:red_mushroom_block","id":100},{"name":"minecraft:red_nether_brick","id":215},{"name":"minecraft:red_nether_brick_stairs","id":-184},{"name":"minecraft:red_sandstone","id":179},{"name":"minecraft:red_sandstone_stairs","id":180},{"name":"minecraft:redstone","id":373},{"name":"minecraft:redstone_block","id":152},{"name":"minecraft:redstone_lamp","id":123},{"name":"minecraft:redstone_ore","id":73},{"name":"minecraft:redstone_torch","id":76},{"name":"minecraft:redstone_wire","id":55},{"name":"minecraft:repeater","id":419},{"name":"minecraft:repeating_command_block","id":188},{"name":"minecraft:reserved6","id":255},{"name":"minecraft:respawn_anchor","id":-272},{"name":"minecraft:rotten_flesh","id":277},{"name":"minecraft:saddle","id":371},{"name":"minecraft:salmon","id":265},{"name":"minecraft:salmon_bucket","id":365},{"name":"minecraft:salmon_spawn_egg","id":482},{"name":"minecraft:sand","id":12},{"name":"minecraft:sandstone","id":24},{"name":"minecraft:sandstone_stairs","id":128},{"name":"minecraft:sapling","id":6},{"name":"minecraft:scaffolding","id":-165},{"name":"minecraft:sculk_sensor","id":-307},{"name":"minecraft:scute","id":572},{"name":"minecraft:sea_pickle","id":-156},{"name":"minecraft:seagrass","id":-130},{"name":"minecraft:sealantern","id":169},{"name":"minecraft:shears","id":421},{"name":"minecraft:sheep_spawn_egg","id":438},{"name":"minecraft:shield","id":355},{"name":"minecraft:shroomlight","id":-230},{"name":"minecraft:shulker_box","id":218},{"name":"minecraft:shulker_shell","id":566},{"name":"minecraft:shulker_spawn_egg","id":469},{"name":"minecraft:silver_glazed_terracotta","id":228},{"name":"minecraft:silverfish_spawn_egg","id":443},{"name":"minecraft:skeleton_horse_spawn_egg","id":467},{"name":"minecraft:skeleton_spawn_egg","id":444},{"name":"minecraft:skull","id":516},{"name":"minecraft:skull_banner_pattern","id":583},{"name":"minecraft:slime","id":165},{"name":"minecraft:slime_ball","id":388},{"name":"minecraft:slime_spawn_egg","id":445},{"name":"minecraft:small_amethyst_bud","id":-332},{"name":"minecraft:small_dripleaf_block","id":-336},{"name":"minecraft:smithing_table","id":-202},{"name":"minecraft:smoker","id":-198},{"name":"minecraft:smooth_basalt","id":-377},{"name":"minecraft:smooth_quartz_stairs","id":-185},{"name":"minecraft:smooth_red_sandstone_stairs","id":-176},{"name":"minecraft:smooth_sandstone_stairs","id":-177},{"name":"minecraft:smooth_stone","id":-183},{"name":"minecraft:snow","id":80},{"name":"minecraft:snow_layer","id":78},{"name":"minecraft:snowball","id":374},{"name":"minecraft:soul_campfire","id":621},{"name":"minecraft:soul_fire","id":-237},{"name":"minecraft:soul_lantern","id":-269},{"name":"minecraft:soul_sand","id":88},{"name":"minecraft:soul_soil","id":-236},{"name":"minecraft:soul_torch","id":-268},{"name":"minecraft:sparkler","id":600},{"name":"minecraft:spawn_egg","id":629},{"name":"minecraft:spider_eye","id":278},{"name":"minecraft:spider_spawn_egg","id":446},{"name":"minecraft:splash_potion","id":561},{"name":"minecraft:sponge","id":19},{"name":"minecraft:spore_blossom","id":-321},{"name":"minecraft:spruce_boat","id":378},{"name":"minecraft:spruce_button","id":-144},{"name":"minecraft:spruce_door","id":553},{"name":"minecraft:spruce_fence_gate","id":183},{"name":"minecraft:spruce_pressure_plate","id":-154},{"name":"minecraft:spruce_sign","id":576},{"name":"minecraft:spruce_stairs","id":134},{"name":"minecraft:spruce_standing_sign","id":-181},{"name":"minecraft:spruce_trapdoor","id":-149},{"name":"minecraft:spruce_wall_sign","id":-182},{"name":"minecraft:spyglass","id":772},{"name":"minecraft:squid_spawn_egg","id":450},{"name":"minecraft:stained_glass","id":241},{"name":"minecraft:stained_glass_pane","id":160},{"name":"minecraft:stained_hardened_clay","id":159},{"name":"minecraft:standing_banner","id":176},{"name":"minecraft:standing_sign","id":63},{"name":"minecraft:stick","id":320},{"name":"minecraft:sticky_piston","id":29},{"name":"minecraft:stickypistonarmcollision","id":-217},{"name":"minecraft:stone","id":1},{"name":"minecraft:stone_axe","id":315},{"name":"minecraft:stone_brick_stairs","id":109},{"name":"minecraft:stone_button","id":77},{"name":"minecraft:stone_hoe","id":330},{"name":"minecraft:stone_pickaxe","id":314},{"name":"minecraft:stone_pressure_plate","id":70},{"name":"minecraft:stone_shovel","id":313},{"name":"minecraft:stone_stairs","id":67},{"name":"minecraft:stone_sword","id":312},{"name":"minecraft:stonebrick","id":98},{"name":"minecraft:stonecutter","id":245},{"name":"minecraft:stonecutter_block","id":-197},{"name":"minecraft:stray_spawn_egg","id":462},{"name":"minecraft:strider_spawn_egg","id":495},{"name":"minecraft:string","id":326},{"name":"minecraft:stripped_acacia_log","id":-8},{"name":"minecraft:stripped_birch_log","id":-6},{"name":"minecraft:stripped_crimson_hyphae","id":-300},{"name":"minecraft:stripped_crimson_stem","id":-240},{"name":"minecraft:stripped_dark_oak_log","id":-9},{"name":"minecraft:stripped_jungle_log","id":-7},{"name":"minecraft:stripped_oak_log","id":-10},{"name":"minecraft:stripped_spruce_log","id":-5},{"name":"minecraft:stripped_warped_hyphae","id":-301},{"name":"minecraft:stripped_warped_stem","id":-241},{"name":"minecraft:structure_block","id":252},{"name":"minecraft:structure_void","id":217},{"name":"minecraft:sugar","id":416},{"name":"minecraft:sugar_cane","id":385},{"name":"minecraft:suspicious_stew","id":589},{"name":"minecraft:sweet_berries","id":287},{"name":"minecraft:sweet_berry_bush","id":-207},{"name":"minecraft:tallgrass","id":31},{"name":"minecraft:target","id":-239},{"name":"minecraft:tinted_glass","id":-334},{"name":"minecraft:tnt","id":46},{"name":"minecraft:tnt_minecart","id":525},{"name":"minecraft:torch","id":50},{"name":"minecraft:totem_of_undying","id":568},{"name":"minecraft:trapdoor","id":96},{"name":"minecraft:trapped_chest","id":146},{"name":"minecraft:trident","id":546},{"name":"minecraft:tripwire","id":132},{"name":"minecraft:tripwire_hook","id":131},{"name":"minecraft:tropical_fish","id":266},{"name":"minecraft:tropical_fish_bucket","id":366},{"name":"minecraft:tropical_fish_spawn_egg","id":479},{"name":"minecraft:tuff","id":-333},{"name":"minecraft:turtle_egg","id":-159},{"name":"minecraft:turtle_helmet","id":573},{"name":"minecraft:turtle_spawn_egg","id":485},{"name":"minecraft:twisting_vines","id":-287},{"name":"minecraft:underwater_torch","id":239},{"name":"minecraft:undyed_shulker_box","id":205},{"name":"minecraft:unknown","id":-305},{"name":"minecraft:unlit_redstone_torch","id":75},{"name":"minecraft:unpowered_comparator","id":149},{"name":"minecraft:unpowered_repeater","id":93},{"name":"minecraft:vex_spawn_egg","id":476},{"name":"minecraft:villager_spawn_egg","id":449},{"name":"minecraft:vindicator_spawn_egg","id":474},{"name":"minecraft:vine","id":106},{"name":"minecraft:wall_banner","id":177},{"name":"minecraft:wall_sign","id":68},{"name":"minecraft:wandering_trader_spawn_egg","id":492},{"name":"minecraft:warped_button","id":-261},{"name":"minecraft:warped_door","id":616},{"name":"minecraft:warped_double_slab","id":-267},{"name":"minecraft:warped_fence","id":-257},{"name":"minecraft:warped_fence_gate","id":-259},{"name":"minecraft:warped_fungus","id":-229},{"name":"minecraft:warped_fungus_on_a_stick","id":617},{"name":"minecraft:warped_hyphae","id":-298},{"name":"minecraft:warped_nylium","id":-233},{"name":"minecraft:warped_planks","id":-243},{"name":"minecraft:warped_pressure_plate","id":-263},{"name":"minecraft:warped_roots","id":-224},{"name":"minecraft:warped_sign","id":614},{"name":"minecraft:warped_slab","id":-265},{"name":"minecraft:warped_stairs","id":-255},{"name":"minecraft:warped_standing_sign","id":-251},{"name":"minecraft:warped_stem","id":-226},{"name":"minecraft:warped_trapdoor","id":-247},{"name":"minecraft:warped_wall_sign","id":-253},{"name":"minecraft:warped_wart_block","id":-227},{"name":"minecraft:water","id":9},{"name":"minecraft:water_bucket","id":362},{"name":"minecraft:waterlily","id":111},{"name":"minecraft:waxed_copper","id":-344},{"name":"minecraft:waxed_cut_copper","id":-351},{"name":"minecraft:waxed_cut_copper_slab","id":-365},{"name":"minecraft:waxed_cut_copper_stairs","id":-358},{"name":"minecraft:waxed_double_cut_copper_slab","id":-372},{"name":"minecraft:waxed_exposed_copper","id":-345},{"name":"minecraft:waxed_exposed_cut_copper","id":-352},{"name":"minecraft:waxed_exposed_cut_copper_slab","id":-366},{"name":"minecraft:waxed_exposed_cut_copper_stairs","id":-359},{"name":"minecraft:waxed_exposed_double_cut_copper_slab","id":-373},{"name":"minecraft:waxed_oxidized_copper","id":-446},{"name":"minecraft:waxed_oxidized_cut_copper","id":-447},{"name":"minecraft:waxed_oxidized_cut_copper_slab","id":-449},{"name":"minecraft:waxed_oxidized_cut_copper_stairs","id":-448},{"name":"minecraft:waxed_oxidized_double_cut_copper_slab","id":-450},{"name":"minecraft:waxed_weathered_copper","id":-346},{"name":"minecraft:waxed_weathered_cut_copper","id":-353},{"name":"minecraft:waxed_weathered_cut_copper_slab","id":-367},{"name":"minecraft:waxed_weathered_cut_copper_stairs","id":-360},{"name":"minecraft:waxed_weathered_double_cut_copper_slab","id":-374},{"name":"minecraft:weathered_copper","id":-342},{"name":"minecraft:weathered_cut_copper","id":-349},{"name":"minecraft:weathered_cut_copper_slab","id":-363},{"name":"minecraft:weathered_cut_copper_stairs","id":-356},{"name":"minecraft:weathered_double_cut_copper_slab","id":-370},{"name":"minecraft:web","id":30},{"name":"minecraft:weeping_vines","id":-231},{"name":"minecraft:wheat","id":334},{"name":"minecraft:wheat_seeds","id":291},{"name":"minecraft:white_candle","id":-413},{"name":"minecraft:white_candle_cake","id":-430},{"name":"minecraft:white_dye","id":410},{"name":"minecraft:white_glazed_terracotta","id":220},{"name":"minecraft:witch_spawn_egg","id":452},{"name":"minecraft:wither_rose","id":-216},{"name":"minecraft:wither_skeleton_spawn_egg","id":464},{"name":"minecraft:wolf_spawn_egg","id":439},{"name":"minecraft:wood","id":-212},{"name":"minecraft:wooden_axe","id":311},{"name":"minecraft:wooden_button","id":143},{"name":"minecraft:wooden_door","id":359},{"name":"minecraft:wooden_hoe","id":329},{"name":"minecraft:wooden_pickaxe","id":310},{"name":"minecraft:wooden_pressure_plate","id":72},{"name":"minecraft:wooden_shovel","id":309},{"name":"minecraft:wooden_slab","id":158},{"name":"minecraft:wooden_sword","id":308},{"name":"minecraft:wool","id":35},{"name":"minecraft:writable_book","id":510},{"name":"minecraft:written_book","id":511},{"name":"minecraft:yellow_candle","id":-417},{"name":"minecraft:yellow_candle_cake","id":-434},{"name":"minecraft:yellow_dye","id":406},{"name":"minecraft:yellow_flower","id":37},{"name":"minecraft:yellow_glazed_terracotta","id":224},{"name":"minecraft:zoglin_spawn_egg","id":498},{"name":"minecraft:zombie_horse_spawn_egg","id":468},{"name":"minecraft:zombie_pigman_spawn_egg","id":448},{"name":"minecraft:zombie_spawn_egg","id":447},{"name":"minecraft:zombie_villager_spawn_egg","id":477}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_223.json b/src/main/resources/runtimeid_table_223.json deleted file mode 100644 index 1bf6a7461..000000000 --- a/src/main/resources/runtimeid_table_223.json +++ /dev/null @@ -1 +0,0 @@ -[{"runtimeID":0,"name":"minecraft:air","id":0,"data":0},{"runtimeID":1,"name":"minecraft:stone","id":1,"data":0},{"runtimeID":2,"name":"minecraft:stone","id":1,"data":1},{"runtimeID":3,"name":"minecraft:stone","id":1,"data":2},{"runtimeID":4,"name":"minecraft:stone","id":1,"data":3},{"runtimeID":5,"name":"minecraft:stone","id":1,"data":4},{"runtimeID":6,"name":"minecraft:stone","id":1,"data":5},{"runtimeID":7,"name":"minecraft:stone","id":1,"data":6},{"runtimeID":8,"name":"minecraft:stone","id":1,"data":7},{"runtimeID":9,"name":"minecraft:grass","id":2,"data":0},{"runtimeID":10,"name":"minecraft:grass","id":2,"data":1},{"runtimeID":11,"name":"minecraft:grass","id":2,"data":2},{"runtimeID":12,"name":"minecraft:grass","id":2,"data":3},{"runtimeID":13,"name":"minecraft:grass","id":2,"data":4},{"runtimeID":14,"name":"minecraft:grass","id":2,"data":5},{"runtimeID":15,"name":"minecraft:grass","id":2,"data":6},{"runtimeID":16,"name":"minecraft:grass","id":2,"data":7},{"runtimeID":17,"name":"minecraft:grass","id":2,"data":8},{"runtimeID":18,"name":"minecraft:grass","id":2,"data":9},{"runtimeID":19,"name":"minecraft:grass","id":2,"data":10},{"runtimeID":20,"name":"minecraft:grass","id":2,"data":11},{"runtimeID":21,"name":"minecraft:grass","id":2,"data":12},{"runtimeID":22,"name":"minecraft:grass","id":2,"data":13},{"runtimeID":23,"name":"minecraft:grass","id":2,"data":14},{"runtimeID":24,"name":"minecraft:grass","id":2,"data":15},{"runtimeID":25,"name":"minecraft:dirt","id":3,"data":0},{"runtimeID":26,"name":"minecraft:dirt","id":3,"data":1},{"runtimeID":27,"name":"minecraft:cobblestone","id":4,"data":0},{"runtimeID":28,"name":"minecraft:planks","id":5,"data":0},{"runtimeID":29,"name":"minecraft:planks","id":5,"data":1},{"runtimeID":30,"name":"minecraft:planks","id":5,"data":2},{"runtimeID":31,"name":"minecraft:planks","id":5,"data":3},{"runtimeID":32,"name":"minecraft:planks","id":5,"data":4},{"runtimeID":33,"name":"minecraft:planks","id":5,"data":5},{"runtimeID":34,"name":"minecraft:planks","id":5,"data":6},{"runtimeID":35,"name":"minecraft:planks","id":5,"data":7},{"runtimeID":36,"name":"minecraft:sapling","id":6,"data":0},{"runtimeID":37,"name":"minecraft:sapling","id":6,"data":1},{"runtimeID":38,"name":"minecraft:sapling","id":6,"data":2},{"runtimeID":39,"name":"minecraft:sapling","id":6,"data":3},{"runtimeID":40,"name":"minecraft:sapling","id":6,"data":4},{"runtimeID":41,"name":"minecraft:sapling","id":6,"data":5},{"runtimeID":42,"name":"minecraft:sapling","id":6,"data":6},{"runtimeID":43,"name":"minecraft:sapling","id":6,"data":7},{"runtimeID":44,"name":"minecraft:sapling","id":6,"data":8},{"runtimeID":45,"name":"minecraft:sapling","id":6,"data":9},{"runtimeID":46,"name":"minecraft:sapling","id":6,"data":10},{"runtimeID":47,"name":"minecraft:sapling","id":6,"data":11},{"runtimeID":48,"name":"minecraft:sapling","id":6,"data":12},{"runtimeID":49,"name":"minecraft:sapling","id":6,"data":13},{"runtimeID":50,"name":"minecraft:sapling","id":6,"data":14},{"runtimeID":51,"name":"minecraft:sapling","id":6,"data":15},{"runtimeID":52,"name":"minecraft:bedrock","id":7,"data":0},{"runtimeID":53,"name":"minecraft:bedrock","id":7,"data":1},{"runtimeID":54,"name":"minecraft:flowing_water","id":8,"data":0},{"runtimeID":55,"name":"minecraft:flowing_water","id":8,"data":1},{"runtimeID":56,"name":"minecraft:flowing_water","id":8,"data":2},{"runtimeID":57,"name":"minecraft:flowing_water","id":8,"data":3},{"runtimeID":58,"name":"minecraft:flowing_water","id":8,"data":4},{"runtimeID":59,"name":"minecraft:flowing_water","id":8,"data":5},{"runtimeID":60,"name":"minecraft:flowing_water","id":8,"data":6},{"runtimeID":61,"name":"minecraft:flowing_water","id":8,"data":7},{"runtimeID":62,"name":"minecraft:flowing_water","id":8,"data":8},{"runtimeID":63,"name":"minecraft:flowing_water","id":8,"data":9},{"runtimeID":64,"name":"minecraft:flowing_water","id":8,"data":10},{"runtimeID":65,"name":"minecraft:flowing_water","id":8,"data":11},{"runtimeID":66,"name":"minecraft:flowing_water","id":8,"data":12},{"runtimeID":67,"name":"minecraft:flowing_water","id":8,"data":13},{"runtimeID":68,"name":"minecraft:flowing_water","id":8,"data":14},{"runtimeID":69,"name":"minecraft:flowing_water","id":8,"data":15},{"runtimeID":70,"name":"minecraft:water","id":9,"data":0},{"runtimeID":71,"name":"minecraft:water","id":9,"data":1},{"runtimeID":72,"name":"minecraft:water","id":9,"data":2},{"runtimeID":73,"name":"minecraft:water","id":9,"data":3},{"runtimeID":74,"name":"minecraft:water","id":9,"data":4},{"runtimeID":75,"name":"minecraft:water","id":9,"data":5},{"runtimeID":76,"name":"minecraft:water","id":9,"data":6},{"runtimeID":77,"name":"minecraft:water","id":9,"data":7},{"runtimeID":78,"name":"minecraft:water","id":9,"data":8},{"runtimeID":79,"name":"minecraft:water","id":9,"data":9},{"runtimeID":80,"name":"minecraft:water","id":9,"data":10},{"runtimeID":81,"name":"minecraft:water","id":9,"data":11},{"runtimeID":82,"name":"minecraft:water","id":9,"data":12},{"runtimeID":83,"name":"minecraft:water","id":9,"data":13},{"runtimeID":84,"name":"minecraft:water","id":9,"data":14},{"runtimeID":85,"name":"minecraft:water","id":9,"data":15},{"runtimeID":86,"name":"minecraft:flowing_lava","id":10,"data":0},{"runtimeID":87,"name":"minecraft:flowing_lava","id":10,"data":1},{"runtimeID":88,"name":"minecraft:flowing_lava","id":10,"data":2},{"runtimeID":89,"name":"minecraft:flowing_lava","id":10,"data":3},{"runtimeID":90,"name":"minecraft:flowing_lava","id":10,"data":4},{"runtimeID":91,"name":"minecraft:flowing_lava","id":10,"data":5},{"runtimeID":92,"name":"minecraft:flowing_lava","id":10,"data":6},{"runtimeID":93,"name":"minecraft:flowing_lava","id":10,"data":7},{"runtimeID":94,"name":"minecraft:flowing_lava","id":10,"data":8},{"runtimeID":95,"name":"minecraft:flowing_lava","id":10,"data":9},{"runtimeID":96,"name":"minecraft:flowing_lava","id":10,"data":10},{"runtimeID":97,"name":"minecraft:flowing_lava","id":10,"data":11},{"runtimeID":98,"name":"minecraft:flowing_lava","id":10,"data":12},{"runtimeID":99,"name":"minecraft:flowing_lava","id":10,"data":13},{"runtimeID":100,"name":"minecraft:flowing_lava","id":10,"data":14},{"runtimeID":101,"name":"minecraft:flowing_lava","id":10,"data":15},{"runtimeID":102,"name":"minecraft:lava","id":11,"data":0},{"runtimeID":103,"name":"minecraft:lava","id":11,"data":1},{"runtimeID":104,"name":"minecraft:lava","id":11,"data":2},{"runtimeID":105,"name":"minecraft:lava","id":11,"data":3},{"runtimeID":106,"name":"minecraft:lava","id":11,"data":4},{"runtimeID":107,"name":"minecraft:lava","id":11,"data":5},{"runtimeID":108,"name":"minecraft:lava","id":11,"data":6},{"runtimeID":109,"name":"minecraft:lava","id":11,"data":7},{"runtimeID":110,"name":"minecraft:lava","id":11,"data":8},{"runtimeID":111,"name":"minecraft:lava","id":11,"data":9},{"runtimeID":112,"name":"minecraft:lava","id":11,"data":10},{"runtimeID":113,"name":"minecraft:lava","id":11,"data":11},{"runtimeID":114,"name":"minecraft:lava","id":11,"data":12},{"runtimeID":115,"name":"minecraft:lava","id":11,"data":13},{"runtimeID":116,"name":"minecraft:lava","id":11,"data":14},{"runtimeID":117,"name":"minecraft:lava","id":11,"data":15},{"runtimeID":118,"name":"minecraft:sand","id":12,"data":0},{"runtimeID":119,"name":"minecraft:sand","id":12,"data":1},{"runtimeID":120,"name":"minecraft:gravel","id":13,"data":0},{"runtimeID":121,"name":"minecraft:gold_ore","id":14,"data":0},{"runtimeID":122,"name":"minecraft:iron_ore","id":15,"data":0},{"runtimeID":123,"name":"minecraft:coal_ore","id":16,"data":0},{"runtimeID":124,"name":"minecraft:log","id":17,"data":0},{"runtimeID":125,"name":"minecraft:log","id":17,"data":1},{"runtimeID":126,"name":"minecraft:log","id":17,"data":2},{"runtimeID":127,"name":"minecraft:log","id":17,"data":3},{"runtimeID":128,"name":"minecraft:log","id":17,"data":4},{"runtimeID":129,"name":"minecraft:log","id":17,"data":5},{"runtimeID":130,"name":"minecraft:log","id":17,"data":6},{"runtimeID":131,"name":"minecraft:log","id":17,"data":7},{"runtimeID":132,"name":"minecraft:log","id":17,"data":8},{"runtimeID":133,"name":"minecraft:log","id":17,"data":9},{"runtimeID":134,"name":"minecraft:log","id":17,"data":10},{"runtimeID":135,"name":"minecraft:log","id":17,"data":11},{"runtimeID":136,"name":"minecraft:log","id":17,"data":12},{"runtimeID":137,"name":"minecraft:log","id":17,"data":13},{"runtimeID":138,"name":"minecraft:log","id":17,"data":14},{"runtimeID":139,"name":"minecraft:log","id":17,"data":15},{"runtimeID":140,"name":"minecraft:leaves","id":18,"data":0},{"runtimeID":141,"name":"minecraft:leaves","id":18,"data":1},{"runtimeID":142,"name":"minecraft:leaves","id":18,"data":2},{"runtimeID":143,"name":"minecraft:leaves","id":18,"data":3},{"runtimeID":144,"name":"minecraft:leaves","id":18,"data":4},{"runtimeID":145,"name":"minecraft:leaves","id":18,"data":5},{"runtimeID":146,"name":"minecraft:leaves","id":18,"data":6},{"runtimeID":147,"name":"minecraft:leaves","id":18,"data":7},{"runtimeID":148,"name":"minecraft:leaves","id":18,"data":8},{"runtimeID":149,"name":"minecraft:leaves","id":18,"data":9},{"runtimeID":150,"name":"minecraft:leaves","id":18,"data":10},{"runtimeID":151,"name":"minecraft:leaves","id":18,"data":11},{"runtimeID":152,"name":"minecraft:leaves","id":18,"data":12},{"runtimeID":153,"name":"minecraft:leaves","id":18,"data":13},{"runtimeID":154,"name":"minecraft:leaves","id":18,"data":14},{"runtimeID":155,"name":"minecraft:leaves","id":18,"data":15},{"runtimeID":156,"name":"minecraft:sponge","id":19,"data":0},{"runtimeID":157,"name":"minecraft:sponge","id":19,"data":1},{"runtimeID":158,"name":"minecraft:glass","id":20,"data":0},{"runtimeID":159,"name":"minecraft:lapis_ore","id":21,"data":0},{"runtimeID":160,"name":"minecraft:lapis_block","id":22,"data":0},{"runtimeID":161,"name":"minecraft:dispenser","id":23,"data":0},{"runtimeID":162,"name":"minecraft:dispenser","id":23,"data":1},{"runtimeID":163,"name":"minecraft:dispenser","id":23,"data":2},{"runtimeID":164,"name":"minecraft:dispenser","id":23,"data":3},{"runtimeID":165,"name":"minecraft:dispenser","id":23,"data":4},{"runtimeID":166,"name":"minecraft:dispenser","id":23,"data":5},{"runtimeID":167,"name":"minecraft:dispenser","id":23,"data":6},{"runtimeID":168,"name":"minecraft:dispenser","id":23,"data":7},{"runtimeID":169,"name":"minecraft:dispenser","id":23,"data":8},{"runtimeID":170,"name":"minecraft:dispenser","id":23,"data":9},{"runtimeID":171,"name":"minecraft:dispenser","id":23,"data":10},{"runtimeID":172,"name":"minecraft:dispenser","id":23,"data":11},{"runtimeID":173,"name":"minecraft:dispenser","id":23,"data":12},{"runtimeID":174,"name":"minecraft:dispenser","id":23,"data":13},{"runtimeID":175,"name":"minecraft:dispenser","id":23,"data":14},{"runtimeID":176,"name":"minecraft:dispenser","id":23,"data":15},{"runtimeID":177,"name":"minecraft:sandstone","id":24,"data":0},{"runtimeID":178,"name":"minecraft:sandstone","id":24,"data":1},{"runtimeID":179,"name":"minecraft:sandstone","id":24,"data":2},{"runtimeID":180,"name":"minecraft:sandstone","id":24,"data":3},{"runtimeID":181,"name":"minecraft:noteblock","id":25,"data":0},{"runtimeID":182,"name":"minecraft:bed","id":26,"data":0},{"runtimeID":183,"name":"minecraft:bed","id":26,"data":1},{"runtimeID":184,"name":"minecraft:bed","id":26,"data":2},{"runtimeID":185,"name":"minecraft:bed","id":26,"data":3},{"runtimeID":186,"name":"minecraft:bed","id":26,"data":4},{"runtimeID":187,"name":"minecraft:bed","id":26,"data":5},{"runtimeID":188,"name":"minecraft:bed","id":26,"data":6},{"runtimeID":189,"name":"minecraft:bed","id":26,"data":7},{"runtimeID":190,"name":"minecraft:bed","id":26,"data":8},{"runtimeID":191,"name":"minecraft:bed","id":26,"data":9},{"runtimeID":192,"name":"minecraft:bed","id":26,"data":10},{"runtimeID":193,"name":"minecraft:bed","id":26,"data":11},{"runtimeID":194,"name":"minecraft:bed","id":26,"data":12},{"runtimeID":195,"name":"minecraft:bed","id":26,"data":13},{"runtimeID":196,"name":"minecraft:bed","id":26,"data":14},{"runtimeID":197,"name":"minecraft:bed","id":26,"data":15},{"runtimeID":198,"name":"minecraft:golden_rail","id":27,"data":0},{"runtimeID":199,"name":"minecraft:golden_rail","id":27,"data":1},{"runtimeID":200,"name":"minecraft:golden_rail","id":27,"data":2},{"runtimeID":201,"name":"minecraft:golden_rail","id":27,"data":3},{"runtimeID":202,"name":"minecraft:golden_rail","id":27,"data":4},{"runtimeID":203,"name":"minecraft:golden_rail","id":27,"data":5},{"runtimeID":204,"name":"minecraft:golden_rail","id":27,"data":6},{"runtimeID":205,"name":"minecraft:golden_rail","id":27,"data":7},{"runtimeID":206,"name":"minecraft:golden_rail","id":27,"data":8},{"runtimeID":207,"name":"minecraft:golden_rail","id":27,"data":9},{"runtimeID":208,"name":"minecraft:golden_rail","id":27,"data":10},{"runtimeID":209,"name":"minecraft:golden_rail","id":27,"data":11},{"runtimeID":210,"name":"minecraft:golden_rail","id":27,"data":12},{"runtimeID":211,"name":"minecraft:golden_rail","id":27,"data":13},{"runtimeID":212,"name":"minecraft:golden_rail","id":27,"data":14},{"runtimeID":213,"name":"minecraft:golden_rail","id":27,"data":15},{"runtimeID":214,"name":"minecraft:detector_rail","id":28,"data":0},{"runtimeID":215,"name":"minecraft:detector_rail","id":28,"data":1},{"runtimeID":216,"name":"minecraft:detector_rail","id":28,"data":2},{"runtimeID":217,"name":"minecraft:detector_rail","id":28,"data":3},{"runtimeID":218,"name":"minecraft:detector_rail","id":28,"data":4},{"runtimeID":219,"name":"minecraft:detector_rail","id":28,"data":5},{"runtimeID":220,"name":"minecraft:detector_rail","id":28,"data":6},{"runtimeID":221,"name":"minecraft:detector_rail","id":28,"data":7},{"runtimeID":222,"name":"minecraft:detector_rail","id":28,"data":8},{"runtimeID":223,"name":"minecraft:detector_rail","id":28,"data":9},{"runtimeID":224,"name":"minecraft:detector_rail","id":28,"data":10},{"runtimeID":225,"name":"minecraft:detector_rail","id":28,"data":11},{"runtimeID":226,"name":"minecraft:detector_rail","id":28,"data":12},{"runtimeID":227,"name":"minecraft:detector_rail","id":28,"data":13},{"runtimeID":228,"name":"minecraft:detector_rail","id":28,"data":14},{"runtimeID":229,"name":"minecraft:detector_rail","id":28,"data":15},{"runtimeID":230,"name":"minecraft:sticky_piston","id":29,"data":0},{"runtimeID":231,"name":"minecraft:sticky_piston","id":29,"data":1},{"runtimeID":232,"name":"minecraft:sticky_piston","id":29,"data":2},{"runtimeID":233,"name":"minecraft:sticky_piston","id":29,"data":3},{"runtimeID":234,"name":"minecraft:sticky_piston","id":29,"data":4},{"runtimeID":235,"name":"minecraft:sticky_piston","id":29,"data":5},{"runtimeID":236,"name":"minecraft:sticky_piston","id":29,"data":6},{"runtimeID":237,"name":"minecraft:sticky_piston","id":29,"data":7},{"runtimeID":238,"name":"minecraft:web","id":30,"data":0},{"runtimeID":239,"name":"minecraft:tallgrass","id":31,"data":0},{"runtimeID":240,"name":"minecraft:tallgrass","id":31,"data":1},{"runtimeID":241,"name":"minecraft:tallgrass","id":31,"data":2},{"runtimeID":242,"name":"minecraft:tallgrass","id":31,"data":3},{"runtimeID":243,"name":"minecraft:deadbush","id":32,"data":0},{"runtimeID":244,"name":"minecraft:piston","id":33,"data":0},{"runtimeID":245,"name":"minecraft:piston","id":33,"data":1},{"runtimeID":246,"name":"minecraft:piston","id":33,"data":2},{"runtimeID":247,"name":"minecraft:piston","id":33,"data":3},{"runtimeID":248,"name":"minecraft:piston","id":33,"data":4},{"runtimeID":249,"name":"minecraft:piston","id":33,"data":5},{"runtimeID":250,"name":"minecraft:piston","id":33,"data":6},{"runtimeID":251,"name":"minecraft:piston","id":33,"data":7},{"runtimeID":252,"name":"minecraft:pistonArmCollision","id":34,"data":0},{"runtimeID":253,"name":"minecraft:pistonArmCollision","id":34,"data":1},{"runtimeID":254,"name":"minecraft:pistonArmCollision","id":34,"data":2},{"runtimeID":255,"name":"minecraft:pistonArmCollision","id":34,"data":3},{"runtimeID":256,"name":"minecraft:pistonArmCollision","id":34,"data":4},{"runtimeID":257,"name":"minecraft:pistonArmCollision","id":34,"data":5},{"runtimeID":258,"name":"minecraft:pistonArmCollision","id":34,"data":6},{"runtimeID":259,"name":"minecraft:pistonArmCollision","id":34,"data":7},{"runtimeID":260,"name":"minecraft:wool","id":35,"data":0},{"runtimeID":261,"name":"minecraft:wool","id":35,"data":1},{"runtimeID":262,"name":"minecraft:wool","id":35,"data":2},{"runtimeID":263,"name":"minecraft:wool","id":35,"data":3},{"runtimeID":264,"name":"minecraft:wool","id":35,"data":4},{"runtimeID":265,"name":"minecraft:wool","id":35,"data":5},{"runtimeID":266,"name":"minecraft:wool","id":35,"data":6},{"runtimeID":267,"name":"minecraft:wool","id":35,"data":7},{"runtimeID":268,"name":"minecraft:wool","id":35,"data":8},{"runtimeID":269,"name":"minecraft:wool","id":35,"data":9},{"runtimeID":270,"name":"minecraft:wool","id":35,"data":10},{"runtimeID":271,"name":"minecraft:wool","id":35,"data":11},{"runtimeID":272,"name":"minecraft:wool","id":35,"data":12},{"runtimeID":273,"name":"minecraft:wool","id":35,"data":13},{"runtimeID":274,"name":"minecraft:wool","id":35,"data":14},{"runtimeID":275,"name":"minecraft:wool","id":35,"data":15},{"runtimeID":277,"name":"minecraft:yellow_flower","id":37,"data":0},{"runtimeID":278,"name":"minecraft:yellow_flower","id":37,"data":1},{"runtimeID":279,"name":"minecraft:yellow_flower","id":37,"data":2},{"runtimeID":280,"name":"minecraft:yellow_flower","id":37,"data":3},{"runtimeID":281,"name":"minecraft:yellow_flower","id":37,"data":4},{"runtimeID":282,"name":"minecraft:yellow_flower","id":37,"data":5},{"runtimeID":283,"name":"minecraft:yellow_flower","id":37,"data":6},{"runtimeID":284,"name":"minecraft:yellow_flower","id":37,"data":7},{"runtimeID":285,"name":"minecraft:yellow_flower","id":37,"data":8},{"runtimeID":286,"name":"minecraft:yellow_flower","id":37,"data":9},{"runtimeID":287,"name":"minecraft:yellow_flower","id":37,"data":10},{"runtimeID":288,"name":"minecraft:yellow_flower","id":37,"data":11},{"runtimeID":289,"name":"minecraft:yellow_flower","id":37,"data":12},{"runtimeID":290,"name":"minecraft:yellow_flower","id":37,"data":13},{"runtimeID":291,"name":"minecraft:yellow_flower","id":37,"data":14},{"runtimeID":292,"name":"minecraft:yellow_flower","id":37,"data":15},{"runtimeID":293,"name":"minecraft:red_flower","id":38,"data":0},{"runtimeID":294,"name":"minecraft:red_flower","id":38,"data":1},{"runtimeID":295,"name":"minecraft:red_flower","id":38,"data":2},{"runtimeID":296,"name":"minecraft:red_flower","id":38,"data":3},{"runtimeID":297,"name":"minecraft:red_flower","id":38,"data":4},{"runtimeID":298,"name":"minecraft:red_flower","id":38,"data":5},{"runtimeID":299,"name":"minecraft:red_flower","id":38,"data":6},{"runtimeID":300,"name":"minecraft:red_flower","id":38,"data":7},{"runtimeID":301,"name":"minecraft:red_flower","id":38,"data":8},{"runtimeID":302,"name":"minecraft:red_flower","id":38,"data":9},{"runtimeID":303,"name":"minecraft:red_flower","id":38,"data":10},{"runtimeID":304,"name":"minecraft:red_flower","id":38,"data":11},{"runtimeID":305,"name":"minecraft:red_flower","id":38,"data":12},{"runtimeID":306,"name":"minecraft:red_flower","id":38,"data":13},{"runtimeID":307,"name":"minecraft:red_flower","id":38,"data":14},{"runtimeID":308,"name":"minecraft:red_flower","id":38,"data":15},{"runtimeID":309,"name":"minecraft:brown_mushroom","id":39,"data":0},{"runtimeID":310,"name":"minecraft:red_mushroom","id":40,"data":0},{"runtimeID":311,"name":"minecraft:gold_block","id":41,"data":0},{"runtimeID":312,"name":"minecraft:iron_block","id":42,"data":0},{"runtimeID":313,"name":"minecraft:double_stone_slab","id":43,"data":0},{"runtimeID":314,"name":"minecraft:double_stone_slab","id":43,"data":1},{"runtimeID":315,"name":"minecraft:double_stone_slab","id":43,"data":2},{"runtimeID":316,"name":"minecraft:double_stone_slab","id":43,"data":3},{"runtimeID":317,"name":"minecraft:double_stone_slab","id":43,"data":4},{"runtimeID":318,"name":"minecraft:double_stone_slab","id":43,"data":5},{"runtimeID":319,"name":"minecraft:double_stone_slab","id":43,"data":6},{"runtimeID":320,"name":"minecraft:double_stone_slab","id":43,"data":7},{"runtimeID":321,"name":"minecraft:double_stone_slab","id":43,"data":8},{"runtimeID":322,"name":"minecraft:double_stone_slab","id":43,"data":9},{"runtimeID":323,"name":"minecraft:double_stone_slab","id":43,"data":10},{"runtimeID":324,"name":"minecraft:double_stone_slab","id":43,"data":11},{"runtimeID":325,"name":"minecraft:double_stone_slab","id":43,"data":12},{"runtimeID":326,"name":"minecraft:double_stone_slab","id":43,"data":13},{"runtimeID":327,"name":"minecraft:double_stone_slab","id":43,"data":14},{"runtimeID":328,"name":"minecraft:double_stone_slab","id":43,"data":15},{"runtimeID":329,"name":"minecraft:stone_slab","id":44,"data":0},{"runtimeID":330,"name":"minecraft:stone_slab","id":44,"data":1},{"runtimeID":331,"name":"minecraft:stone_slab","id":44,"data":2},{"runtimeID":332,"name":"minecraft:stone_slab","id":44,"data":3},{"runtimeID":333,"name":"minecraft:stone_slab","id":44,"data":4},{"runtimeID":334,"name":"minecraft:stone_slab","id":44,"data":5},{"runtimeID":335,"name":"minecraft:stone_slab","id":44,"data":6},{"runtimeID":336,"name":"minecraft:stone_slab","id":44,"data":7},{"runtimeID":337,"name":"minecraft:stone_slab","id":44,"data":8},{"runtimeID":338,"name":"minecraft:stone_slab","id":44,"data":9},{"runtimeID":339,"name":"minecraft:stone_slab","id":44,"data":10},{"runtimeID":340,"name":"minecraft:stone_slab","id":44,"data":11},{"runtimeID":341,"name":"minecraft:stone_slab","id":44,"data":12},{"runtimeID":342,"name":"minecraft:stone_slab","id":44,"data":13},{"runtimeID":343,"name":"minecraft:stone_slab","id":44,"data":14},{"runtimeID":344,"name":"minecraft:stone_slab","id":44,"data":15},{"runtimeID":345,"name":"minecraft:brick_block","id":45,"data":0},{"runtimeID":346,"name":"minecraft:tnt","id":46,"data":0},{"runtimeID":347,"name":"minecraft:tnt","id":46,"data":1},{"runtimeID":348,"name":"minecraft:bookshelf","id":47,"data":0},{"runtimeID":349,"name":"minecraft:mossy_cobblestone","id":48,"data":0},{"runtimeID":350,"name":"minecraft:obsidian","id":49,"data":0},{"runtimeID":351,"name":"minecraft:torch","id":50,"data":0},{"runtimeID":352,"name":"minecraft:torch","id":50,"data":1},{"runtimeID":353,"name":"minecraft:torch","id":50,"data":2},{"runtimeID":354,"name":"minecraft:torch","id":50,"data":3},{"runtimeID":355,"name":"minecraft:torch","id":50,"data":4},{"runtimeID":356,"name":"minecraft:torch","id":50,"data":5},{"runtimeID":357,"name":"minecraft:torch","id":50,"data":6},{"runtimeID":358,"name":"minecraft:torch","id":50,"data":7},{"runtimeID":359,"name":"minecraft:fire","id":51,"data":0},{"runtimeID":360,"name":"minecraft:fire","id":51,"data":1},{"runtimeID":361,"name":"minecraft:fire","id":51,"data":2},{"runtimeID":362,"name":"minecraft:fire","id":51,"data":3},{"runtimeID":363,"name":"minecraft:fire","id":51,"data":4},{"runtimeID":364,"name":"minecraft:fire","id":51,"data":5},{"runtimeID":365,"name":"minecraft:fire","id":51,"data":6},{"runtimeID":366,"name":"minecraft:fire","id":51,"data":7},{"runtimeID":367,"name":"minecraft:fire","id":51,"data":8},{"runtimeID":368,"name":"minecraft:fire","id":51,"data":9},{"runtimeID":369,"name":"minecraft:fire","id":51,"data":10},{"runtimeID":370,"name":"minecraft:fire","id":51,"data":11},{"runtimeID":371,"name":"minecraft:fire","id":51,"data":12},{"runtimeID":372,"name":"minecraft:fire","id":51,"data":13},{"runtimeID":373,"name":"minecraft:fire","id":51,"data":14},{"runtimeID":374,"name":"minecraft:fire","id":51,"data":15},{"runtimeID":375,"name":"minecraft:mob_spawner","id":52,"data":0},{"runtimeID":376,"name":"minecraft:oak_stairs","id":53,"data":0},{"runtimeID":377,"name":"minecraft:oak_stairs","id":53,"data":1},{"runtimeID":378,"name":"minecraft:oak_stairs","id":53,"data":2},{"runtimeID":379,"name":"minecraft:oak_stairs","id":53,"data":3},{"runtimeID":380,"name":"minecraft:oak_stairs","id":53,"data":4},{"runtimeID":381,"name":"minecraft:oak_stairs","id":53,"data":5},{"runtimeID":382,"name":"minecraft:oak_stairs","id":53,"data":6},{"runtimeID":383,"name":"minecraft:oak_stairs","id":53,"data":7},{"runtimeID":384,"name":"minecraft:chest","id":54,"data":0},{"runtimeID":385,"name":"minecraft:chest","id":54,"data":1},{"runtimeID":386,"name":"minecraft:chest","id":54,"data":2},{"runtimeID":387,"name":"minecraft:chest","id":54,"data":3},{"runtimeID":388,"name":"minecraft:chest","id":54,"data":4},{"runtimeID":389,"name":"minecraft:chest","id":54,"data":5},{"runtimeID":390,"name":"minecraft:chest","id":54,"data":6},{"runtimeID":391,"name":"minecraft:chest","id":54,"data":7},{"runtimeID":392,"name":"minecraft:redstone_wire","id":55,"data":0},{"runtimeID":393,"name":"minecraft:redstone_wire","id":55,"data":1},{"runtimeID":394,"name":"minecraft:redstone_wire","id":55,"data":2},{"runtimeID":395,"name":"minecraft:redstone_wire","id":55,"data":3},{"runtimeID":396,"name":"minecraft:redstone_wire","id":55,"data":4},{"runtimeID":397,"name":"minecraft:redstone_wire","id":55,"data":5},{"runtimeID":398,"name":"minecraft:redstone_wire","id":55,"data":6},{"runtimeID":399,"name":"minecraft:redstone_wire","id":55,"data":7},{"runtimeID":400,"name":"minecraft:redstone_wire","id":55,"data":8},{"runtimeID":401,"name":"minecraft:redstone_wire","id":55,"data":9},{"runtimeID":402,"name":"minecraft:redstone_wire","id":55,"data":10},{"runtimeID":403,"name":"minecraft:redstone_wire","id":55,"data":11},{"runtimeID":404,"name":"minecraft:redstone_wire","id":55,"data":12},{"runtimeID":405,"name":"minecraft:redstone_wire","id":55,"data":13},{"runtimeID":406,"name":"minecraft:redstone_wire","id":55,"data":14},{"runtimeID":407,"name":"minecraft:redstone_wire","id":55,"data":15},{"runtimeID":408,"name":"minecraft:diamond_ore","id":56,"data":0},{"runtimeID":409,"name":"minecraft:diamond_block","id":57,"data":0},{"runtimeID":410,"name":"minecraft:crafting_table","id":58,"data":0},{"runtimeID":411,"name":"minecraft:wheat","id":59,"data":0},{"runtimeID":412,"name":"minecraft:wheat","id":59,"data":1},{"runtimeID":413,"name":"minecraft:wheat","id":59,"data":2},{"runtimeID":414,"name":"minecraft:wheat","id":59,"data":3},{"runtimeID":415,"name":"minecraft:wheat","id":59,"data":4},{"runtimeID":416,"name":"minecraft:wheat","id":59,"data":5},{"runtimeID":417,"name":"minecraft:wheat","id":59,"data":6},{"runtimeID":418,"name":"minecraft:wheat","id":59,"data":7},{"runtimeID":419,"name":"minecraft:farmland","id":60,"data":0},{"runtimeID":420,"name":"minecraft:farmland","id":60,"data":1},{"runtimeID":421,"name":"minecraft:farmland","id":60,"data":2},{"runtimeID":422,"name":"minecraft:farmland","id":60,"data":3},{"runtimeID":423,"name":"minecraft:farmland","id":60,"data":4},{"runtimeID":424,"name":"minecraft:farmland","id":60,"data":5},{"runtimeID":425,"name":"minecraft:farmland","id":60,"data":6},{"runtimeID":426,"name":"minecraft:farmland","id":60,"data":7},{"runtimeID":427,"name":"minecraft:furnace","id":61,"data":0},{"runtimeID":428,"name":"minecraft:furnace","id":61,"data":1},{"runtimeID":429,"name":"minecraft:furnace","id":61,"data":2},{"runtimeID":430,"name":"minecraft:furnace","id":61,"data":3},{"runtimeID":431,"name":"minecraft:furnace","id":61,"data":4},{"runtimeID":432,"name":"minecraft:furnace","id":61,"data":5},{"runtimeID":433,"name":"minecraft:furnace","id":61,"data":6},{"runtimeID":434,"name":"minecraft:furnace","id":61,"data":7},{"runtimeID":435,"name":"minecraft:lit_furnace","id":62,"data":0},{"runtimeID":436,"name":"minecraft:lit_furnace","id":62,"data":1},{"runtimeID":437,"name":"minecraft:lit_furnace","id":62,"data":2},{"runtimeID":438,"name":"minecraft:lit_furnace","id":62,"data":3},{"runtimeID":439,"name":"minecraft:lit_furnace","id":62,"data":4},{"runtimeID":440,"name":"minecraft:lit_furnace","id":62,"data":5},{"runtimeID":441,"name":"minecraft:lit_furnace","id":62,"data":6},{"runtimeID":442,"name":"minecraft:lit_furnace","id":62,"data":7},{"runtimeID":443,"name":"minecraft:standing_sign","id":63,"data":0},{"runtimeID":444,"name":"minecraft:standing_sign","id":63,"data":1},{"runtimeID":445,"name":"minecraft:standing_sign","id":63,"data":2},{"runtimeID":446,"name":"minecraft:standing_sign","id":63,"data":3},{"runtimeID":447,"name":"minecraft:standing_sign","id":63,"data":4},{"runtimeID":448,"name":"minecraft:standing_sign","id":63,"data":5},{"runtimeID":449,"name":"minecraft:standing_sign","id":63,"data":6},{"runtimeID":450,"name":"minecraft:standing_sign","id":63,"data":7},{"runtimeID":451,"name":"minecraft:standing_sign","id":63,"data":8},{"runtimeID":452,"name":"minecraft:standing_sign","id":63,"data":9},{"runtimeID":453,"name":"minecraft:standing_sign","id":63,"data":10},{"runtimeID":454,"name":"minecraft:standing_sign","id":63,"data":11},{"runtimeID":455,"name":"minecraft:standing_sign","id":63,"data":12},{"runtimeID":456,"name":"minecraft:standing_sign","id":63,"data":13},{"runtimeID":457,"name":"minecraft:standing_sign","id":63,"data":14},{"runtimeID":458,"name":"minecraft:standing_sign","id":63,"data":15},{"runtimeID":459,"name":"minecraft:wooden_door","id":64,"data":0},{"runtimeID":460,"name":"minecraft:wooden_door","id":64,"data":1},{"runtimeID":461,"name":"minecraft:wooden_door","id":64,"data":2},{"runtimeID":462,"name":"minecraft:wooden_door","id":64,"data":3},{"runtimeID":463,"name":"minecraft:wooden_door","id":64,"data":4},{"runtimeID":464,"name":"minecraft:wooden_door","id":64,"data":5},{"runtimeID":465,"name":"minecraft:wooden_door","id":64,"data":6},{"runtimeID":466,"name":"minecraft:wooden_door","id":64,"data":7},{"runtimeID":467,"name":"minecraft:wooden_door","id":64,"data":8},{"runtimeID":468,"name":"minecraft:wooden_door","id":64,"data":9},{"runtimeID":469,"name":"minecraft:wooden_door","id":64,"data":10},{"runtimeID":470,"name":"minecraft:wooden_door","id":64,"data":11},{"runtimeID":471,"name":"minecraft:wooden_door","id":64,"data":12},{"runtimeID":472,"name":"minecraft:wooden_door","id":64,"data":13},{"runtimeID":473,"name":"minecraft:wooden_door","id":64,"data":14},{"runtimeID":474,"name":"minecraft:wooden_door","id":64,"data":15},{"runtimeID":475,"name":"minecraft:ladder","id":65,"data":0},{"runtimeID":476,"name":"minecraft:ladder","id":65,"data":1},{"runtimeID":477,"name":"minecraft:ladder","id":65,"data":2},{"runtimeID":478,"name":"minecraft:ladder","id":65,"data":3},{"runtimeID":479,"name":"minecraft:ladder","id":65,"data":4},{"runtimeID":480,"name":"minecraft:ladder","id":65,"data":5},{"runtimeID":481,"name":"minecraft:ladder","id":65,"data":6},{"runtimeID":482,"name":"minecraft:ladder","id":65,"data":7},{"runtimeID":483,"name":"minecraft:rail","id":66,"data":0},{"runtimeID":484,"name":"minecraft:rail","id":66,"data":1},{"runtimeID":485,"name":"minecraft:rail","id":66,"data":2},{"runtimeID":486,"name":"minecraft:rail","id":66,"data":3},{"runtimeID":487,"name":"minecraft:rail","id":66,"data":4},{"runtimeID":488,"name":"minecraft:rail","id":66,"data":5},{"runtimeID":489,"name":"minecraft:rail","id":66,"data":6},{"runtimeID":490,"name":"minecraft:rail","id":66,"data":7},{"runtimeID":491,"name":"minecraft:rail","id":66,"data":8},{"runtimeID":492,"name":"minecraft:rail","id":66,"data":9},{"runtimeID":493,"name":"minecraft:rail","id":66,"data":10},{"runtimeID":494,"name":"minecraft:rail","id":66,"data":11},{"runtimeID":495,"name":"minecraft:rail","id":66,"data":12},{"runtimeID":496,"name":"minecraft:rail","id":66,"data":13},{"runtimeID":497,"name":"minecraft:rail","id":66,"data":14},{"runtimeID":498,"name":"minecraft:rail","id":66,"data":15},{"runtimeID":499,"name":"minecraft:stone_stairs","id":67,"data":0},{"runtimeID":500,"name":"minecraft:stone_stairs","id":67,"data":1},{"runtimeID":501,"name":"minecraft:stone_stairs","id":67,"data":2},{"runtimeID":502,"name":"minecraft:stone_stairs","id":67,"data":3},{"runtimeID":503,"name":"minecraft:stone_stairs","id":67,"data":4},{"runtimeID":504,"name":"minecraft:stone_stairs","id":67,"data":5},{"runtimeID":505,"name":"minecraft:stone_stairs","id":67,"data":6},{"runtimeID":506,"name":"minecraft:stone_stairs","id":67,"data":7},{"runtimeID":507,"name":"minecraft:wall_sign","id":68,"data":0},{"runtimeID":508,"name":"minecraft:wall_sign","id":68,"data":1},{"runtimeID":509,"name":"minecraft:wall_sign","id":68,"data":2},{"runtimeID":510,"name":"minecraft:wall_sign","id":68,"data":3},{"runtimeID":511,"name":"minecraft:wall_sign","id":68,"data":4},{"runtimeID":512,"name":"minecraft:wall_sign","id":68,"data":5},{"runtimeID":513,"name":"minecraft:wall_sign","id":68,"data":6},{"runtimeID":514,"name":"minecraft:wall_sign","id":68,"data":7},{"runtimeID":515,"name":"minecraft:wall_sign","id":68,"data":8},{"runtimeID":516,"name":"minecraft:wall_sign","id":68,"data":9},{"runtimeID":517,"name":"minecraft:wall_sign","id":68,"data":10},{"runtimeID":518,"name":"minecraft:wall_sign","id":68,"data":11},{"runtimeID":519,"name":"minecraft:wall_sign","id":68,"data":12},{"runtimeID":520,"name":"minecraft:wall_sign","id":68,"data":13},{"runtimeID":521,"name":"minecraft:wall_sign","id":68,"data":14},{"runtimeID":522,"name":"minecraft:wall_sign","id":68,"data":15},{"runtimeID":523,"name":"minecraft:lever","id":69,"data":0},{"runtimeID":524,"name":"minecraft:lever","id":69,"data":1},{"runtimeID":525,"name":"minecraft:lever","id":69,"data":2},{"runtimeID":526,"name":"minecraft:lever","id":69,"data":3},{"runtimeID":527,"name":"minecraft:lever","id":69,"data":4},{"runtimeID":528,"name":"minecraft:lever","id":69,"data":5},{"runtimeID":529,"name":"minecraft:lever","id":69,"data":6},{"runtimeID":530,"name":"minecraft:lever","id":69,"data":7},{"runtimeID":531,"name":"minecraft:lever","id":69,"data":8},{"runtimeID":532,"name":"minecraft:lever","id":69,"data":9},{"runtimeID":533,"name":"minecraft:lever","id":69,"data":10},{"runtimeID":534,"name":"minecraft:lever","id":69,"data":11},{"runtimeID":535,"name":"minecraft:lever","id":69,"data":12},{"runtimeID":536,"name":"minecraft:lever","id":69,"data":13},{"runtimeID":537,"name":"minecraft:lever","id":69,"data":14},{"runtimeID":538,"name":"minecraft:lever","id":69,"data":15},{"runtimeID":539,"name":"minecraft:stone_pressure_plate","id":70,"data":0},{"runtimeID":540,"name":"minecraft:stone_pressure_plate","id":70,"data":1},{"runtimeID":541,"name":"minecraft:stone_pressure_plate","id":70,"data":2},{"runtimeID":542,"name":"minecraft:stone_pressure_plate","id":70,"data":3},{"runtimeID":543,"name":"minecraft:stone_pressure_plate","id":70,"data":4},{"runtimeID":544,"name":"minecraft:stone_pressure_plate","id":70,"data":5},{"runtimeID":545,"name":"minecraft:stone_pressure_plate","id":70,"data":6},{"runtimeID":546,"name":"minecraft:stone_pressure_plate","id":70,"data":7},{"runtimeID":547,"name":"minecraft:stone_pressure_plate","id":70,"data":8},{"runtimeID":548,"name":"minecraft:stone_pressure_plate","id":70,"data":9},{"runtimeID":549,"name":"minecraft:stone_pressure_plate","id":70,"data":10},{"runtimeID":550,"name":"minecraft:stone_pressure_plate","id":70,"data":11},{"runtimeID":551,"name":"minecraft:stone_pressure_plate","id":70,"data":12},{"runtimeID":552,"name":"minecraft:stone_pressure_plate","id":70,"data":13},{"runtimeID":553,"name":"minecraft:stone_pressure_plate","id":70,"data":14},{"runtimeID":554,"name":"minecraft:stone_pressure_plate","id":70,"data":15},{"runtimeID":555,"name":"minecraft:iron_door","id":71,"data":0},{"runtimeID":556,"name":"minecraft:iron_door","id":71,"data":1},{"runtimeID":557,"name":"minecraft:iron_door","id":71,"data":2},{"runtimeID":558,"name":"minecraft:iron_door","id":71,"data":3},{"runtimeID":559,"name":"minecraft:iron_door","id":71,"data":4},{"runtimeID":560,"name":"minecraft:iron_door","id":71,"data":5},{"runtimeID":561,"name":"minecraft:iron_door","id":71,"data":6},{"runtimeID":562,"name":"minecraft:iron_door","id":71,"data":7},{"runtimeID":563,"name":"minecraft:iron_door","id":71,"data":8},{"runtimeID":564,"name":"minecraft:iron_door","id":71,"data":9},{"runtimeID":565,"name":"minecraft:iron_door","id":71,"data":10},{"runtimeID":566,"name":"minecraft:iron_door","id":71,"data":11},{"runtimeID":567,"name":"minecraft:iron_door","id":71,"data":12},{"runtimeID":568,"name":"minecraft:iron_door","id":71,"data":13},{"runtimeID":569,"name":"minecraft:iron_door","id":71,"data":14},{"runtimeID":570,"name":"minecraft:iron_door","id":71,"data":15},{"runtimeID":571,"name":"minecraft:wooden_pressure_plate","id":72,"data":0},{"runtimeID":572,"name":"minecraft:wooden_pressure_plate","id":72,"data":1},{"runtimeID":573,"name":"minecraft:wooden_pressure_plate","id":72,"data":2},{"runtimeID":574,"name":"minecraft:wooden_pressure_plate","id":72,"data":3},{"runtimeID":575,"name":"minecraft:wooden_pressure_plate","id":72,"data":4},{"runtimeID":576,"name":"minecraft:wooden_pressure_plate","id":72,"data":5},{"runtimeID":577,"name":"minecraft:wooden_pressure_plate","id":72,"data":6},{"runtimeID":578,"name":"minecraft:wooden_pressure_plate","id":72,"data":7},{"runtimeID":579,"name":"minecraft:wooden_pressure_plate","id":72,"data":8},{"runtimeID":580,"name":"minecraft:wooden_pressure_plate","id":72,"data":9},{"runtimeID":581,"name":"minecraft:wooden_pressure_plate","id":72,"data":10},{"runtimeID":582,"name":"minecraft:wooden_pressure_plate","id":72,"data":11},{"runtimeID":583,"name":"minecraft:wooden_pressure_plate","id":72,"data":12},{"runtimeID":584,"name":"minecraft:wooden_pressure_plate","id":72,"data":13},{"runtimeID":585,"name":"minecraft:wooden_pressure_plate","id":72,"data":14},{"runtimeID":586,"name":"minecraft:wooden_pressure_plate","id":72,"data":15},{"runtimeID":587,"name":"minecraft:redstone_ore","id":73,"data":0},{"runtimeID":588,"name":"minecraft:lit_redstone_ore","id":74,"data":0},{"runtimeID":589,"name":"minecraft:unlit_redstone_torch","id":75,"data":0},{"runtimeID":590,"name":"minecraft:unlit_redstone_torch","id":75,"data":1},{"runtimeID":591,"name":"minecraft:unlit_redstone_torch","id":75,"data":2},{"runtimeID":592,"name":"minecraft:unlit_redstone_torch","id":75,"data":3},{"runtimeID":593,"name":"minecraft:unlit_redstone_torch","id":75,"data":4},{"runtimeID":594,"name":"minecraft:unlit_redstone_torch","id":75,"data":5},{"runtimeID":595,"name":"minecraft:unlit_redstone_torch","id":75,"data":6},{"runtimeID":596,"name":"minecraft:unlit_redstone_torch","id":75,"data":7},{"runtimeID":597,"name":"minecraft:redstone_torch","id":76,"data":0},{"runtimeID":598,"name":"minecraft:redstone_torch","id":76,"data":1},{"runtimeID":599,"name":"minecraft:redstone_torch","id":76,"data":2},{"runtimeID":600,"name":"minecraft:redstone_torch","id":76,"data":3},{"runtimeID":601,"name":"minecraft:redstone_torch","id":76,"data":4},{"runtimeID":602,"name":"minecraft:redstone_torch","id":76,"data":5},{"runtimeID":603,"name":"minecraft:redstone_torch","id":76,"data":6},{"runtimeID":604,"name":"minecraft:redstone_torch","id":76,"data":7},{"runtimeID":605,"name":"minecraft:stone_button","id":77,"data":0},{"runtimeID":606,"name":"minecraft:stone_button","id":77,"data":1},{"runtimeID":607,"name":"minecraft:stone_button","id":77,"data":2},{"runtimeID":608,"name":"minecraft:stone_button","id":77,"data":3},{"runtimeID":609,"name":"minecraft:stone_button","id":77,"data":4},{"runtimeID":610,"name":"minecraft:stone_button","id":77,"data":5},{"runtimeID":611,"name":"minecraft:stone_button","id":77,"data":6},{"runtimeID":612,"name":"minecraft:stone_button","id":77,"data":7},{"runtimeID":613,"name":"minecraft:stone_button","id":77,"data":8},{"runtimeID":614,"name":"minecraft:stone_button","id":77,"data":9},{"runtimeID":615,"name":"minecraft:stone_button","id":77,"data":10},{"runtimeID":616,"name":"minecraft:stone_button","id":77,"data":11},{"runtimeID":617,"name":"minecraft:stone_button","id":77,"data":12},{"runtimeID":618,"name":"minecraft:stone_button","id":77,"data":13},{"runtimeID":619,"name":"minecraft:stone_button","id":77,"data":14},{"runtimeID":620,"name":"minecraft:stone_button","id":77,"data":15},{"runtimeID":621,"name":"minecraft:snow_layer","id":78,"data":0},{"runtimeID":622,"name":"minecraft:snow_layer","id":78,"data":1},{"runtimeID":623,"name":"minecraft:snow_layer","id":78,"data":2},{"runtimeID":624,"name":"minecraft:snow_layer","id":78,"data":3},{"runtimeID":625,"name":"minecraft:snow_layer","id":78,"data":4},{"runtimeID":626,"name":"minecraft:snow_layer","id":78,"data":5},{"runtimeID":627,"name":"minecraft:snow_layer","id":78,"data":6},{"runtimeID":628,"name":"minecraft:snow_layer","id":78,"data":7},{"runtimeID":629,"name":"minecraft:snow_layer","id":78,"data":8},{"runtimeID":630,"name":"minecraft:snow_layer","id":78,"data":9},{"runtimeID":631,"name":"minecraft:snow_layer","id":78,"data":10},{"runtimeID":632,"name":"minecraft:snow_layer","id":78,"data":11},{"runtimeID":633,"name":"minecraft:snow_layer","id":78,"data":12},{"runtimeID":634,"name":"minecraft:snow_layer","id":78,"data":13},{"runtimeID":635,"name":"minecraft:snow_layer","id":78,"data":14},{"runtimeID":636,"name":"minecraft:snow_layer","id":78,"data":15},{"runtimeID":637,"name":"minecraft:ice","id":79,"data":0},{"runtimeID":638,"name":"minecraft:snow","id":80,"data":0},{"runtimeID":639,"name":"minecraft:cactus","id":81,"data":0},{"runtimeID":640,"name":"minecraft:cactus","id":81,"data":1},{"runtimeID":641,"name":"minecraft:cactus","id":81,"data":2},{"runtimeID":642,"name":"minecraft:cactus","id":81,"data":3},{"runtimeID":643,"name":"minecraft:cactus","id":81,"data":4},{"runtimeID":644,"name":"minecraft:cactus","id":81,"data":5},{"runtimeID":645,"name":"minecraft:cactus","id":81,"data":6},{"runtimeID":646,"name":"minecraft:cactus","id":81,"data":7},{"runtimeID":647,"name":"minecraft:cactus","id":81,"data":8},{"runtimeID":648,"name":"minecraft:cactus","id":81,"data":9},{"runtimeID":649,"name":"minecraft:cactus","id":81,"data":10},{"runtimeID":650,"name":"minecraft:cactus","id":81,"data":11},{"runtimeID":651,"name":"minecraft:cactus","id":81,"data":12},{"runtimeID":652,"name":"minecraft:cactus","id":81,"data":13},{"runtimeID":653,"name":"minecraft:cactus","id":81,"data":14},{"runtimeID":654,"name":"minecraft:cactus","id":81,"data":15},{"runtimeID":655,"name":"minecraft:clay","id":82,"data":0},{"runtimeID":656,"name":"minecraft:reeds","id":83,"data":0},{"runtimeID":657,"name":"minecraft:reeds","id":83,"data":1},{"runtimeID":658,"name":"minecraft:reeds","id":83,"data":2},{"runtimeID":659,"name":"minecraft:reeds","id":83,"data":3},{"runtimeID":660,"name":"minecraft:reeds","id":83,"data":4},{"runtimeID":661,"name":"minecraft:reeds","id":83,"data":5},{"runtimeID":662,"name":"minecraft:reeds","id":83,"data":6},{"runtimeID":663,"name":"minecraft:reeds","id":83,"data":7},{"runtimeID":664,"name":"minecraft:reeds","id":83,"data":8},{"runtimeID":665,"name":"minecraft:reeds","id":83,"data":9},{"runtimeID":666,"name":"minecraft:reeds","id":83,"data":10},{"runtimeID":667,"name":"minecraft:reeds","id":83,"data":11},{"runtimeID":668,"name":"minecraft:reeds","id":83,"data":12},{"runtimeID":669,"name":"minecraft:reeds","id":83,"data":13},{"runtimeID":670,"name":"minecraft:reeds","id":83,"data":14},{"runtimeID":671,"name":"minecraft:reeds","id":83,"data":15},{"runtimeID":672,"name":"minecraft:jukebox","id":84,"data":0},{"runtimeID":673,"name":"minecraft:fence","id":85,"data":0},{"runtimeID":674,"name":"minecraft:fence","id":85,"data":1},{"runtimeID":675,"name":"minecraft:fence","id":85,"data":2},{"runtimeID":676,"name":"minecraft:fence","id":85,"data":3},{"runtimeID":677,"name":"minecraft:fence","id":85,"data":4},{"runtimeID":678,"name":"minecraft:fence","id":85,"data":5},{"runtimeID":679,"name":"minecraft:fence","id":85,"data":6},{"runtimeID":680,"name":"minecraft:fence","id":85,"data":7},{"runtimeID":681,"name":"minecraft:pumpkin","id":86,"data":0},{"runtimeID":682,"name":"minecraft:pumpkin","id":86,"data":1},{"runtimeID":683,"name":"minecraft:pumpkin","id":86,"data":2},{"runtimeID":684,"name":"minecraft:pumpkin","id":86,"data":3},{"runtimeID":685,"name":"minecraft:netherrack","id":87,"data":0},{"runtimeID":686,"name":"minecraft:soul_sand","id":88,"data":0},{"runtimeID":687,"name":"minecraft:glowstone","id":89,"data":0},{"runtimeID":688,"name":"minecraft:portal","id":90,"data":0},{"runtimeID":689,"name":"minecraft:portal","id":90,"data":1},{"runtimeID":690,"name":"minecraft:portal","id":90,"data":2},{"runtimeID":691,"name":"minecraft:portal","id":90,"data":3},{"runtimeID":692,"name":"minecraft:lit_pumpkin","id":91,"data":0},{"runtimeID":693,"name":"minecraft:lit_pumpkin","id":91,"data":1},{"runtimeID":694,"name":"minecraft:lit_pumpkin","id":91,"data":2},{"runtimeID":695,"name":"minecraft:lit_pumpkin","id":91,"data":3},{"runtimeID":696,"name":"minecraft:cake","id":92,"data":0},{"runtimeID":697,"name":"minecraft:cake","id":92,"data":1},{"runtimeID":698,"name":"minecraft:cake","id":92,"data":2},{"runtimeID":699,"name":"minecraft:cake","id":92,"data":3},{"runtimeID":700,"name":"minecraft:cake","id":92,"data":4},{"runtimeID":701,"name":"minecraft:cake","id":92,"data":5},{"runtimeID":702,"name":"minecraft:cake","id":92,"data":6},{"runtimeID":703,"name":"minecraft:cake","id":92,"data":7},{"runtimeID":704,"name":"minecraft:unpowered_repeater","id":93,"data":0},{"runtimeID":705,"name":"minecraft:unpowered_repeater","id":93,"data":1},{"runtimeID":706,"name":"minecraft:unpowered_repeater","id":93,"data":2},{"runtimeID":707,"name":"minecraft:unpowered_repeater","id":93,"data":3},{"runtimeID":708,"name":"minecraft:unpowered_repeater","id":93,"data":4},{"runtimeID":709,"name":"minecraft:unpowered_repeater","id":93,"data":5},{"runtimeID":710,"name":"minecraft:unpowered_repeater","id":93,"data":6},{"runtimeID":711,"name":"minecraft:unpowered_repeater","id":93,"data":7},{"runtimeID":712,"name":"minecraft:unpowered_repeater","id":93,"data":8},{"runtimeID":713,"name":"minecraft:unpowered_repeater","id":93,"data":9},{"runtimeID":714,"name":"minecraft:unpowered_repeater","id":93,"data":10},{"runtimeID":715,"name":"minecraft:unpowered_repeater","id":93,"data":11},{"runtimeID":716,"name":"minecraft:unpowered_repeater","id":93,"data":12},{"runtimeID":717,"name":"minecraft:unpowered_repeater","id":93,"data":13},{"runtimeID":718,"name":"minecraft:unpowered_repeater","id":93,"data":14},{"runtimeID":719,"name":"minecraft:unpowered_repeater","id":93,"data":15},{"runtimeID":720,"name":"minecraft:powered_repeater","id":94,"data":0},{"runtimeID":721,"name":"minecraft:powered_repeater","id":94,"data":1},{"runtimeID":722,"name":"minecraft:powered_repeater","id":94,"data":2},{"runtimeID":723,"name":"minecraft:powered_repeater","id":94,"data":3},{"runtimeID":724,"name":"minecraft:powered_repeater","id":94,"data":4},{"runtimeID":725,"name":"minecraft:powered_repeater","id":94,"data":5},{"runtimeID":726,"name":"minecraft:powered_repeater","id":94,"data":6},{"runtimeID":727,"name":"minecraft:powered_repeater","id":94,"data":7},{"runtimeID":728,"name":"minecraft:powered_repeater","id":94,"data":8},{"runtimeID":729,"name":"minecraft:powered_repeater","id":94,"data":9},{"runtimeID":730,"name":"minecraft:powered_repeater","id":94,"data":10},{"runtimeID":731,"name":"minecraft:powered_repeater","id":94,"data":11},{"runtimeID":732,"name":"minecraft:powered_repeater","id":94,"data":12},{"runtimeID":733,"name":"minecraft:powered_repeater","id":94,"data":13},{"runtimeID":734,"name":"minecraft:powered_repeater","id":94,"data":14},{"runtimeID":735,"name":"minecraft:powered_repeater","id":94,"data":15},{"runtimeID":736,"name":"minecraft:invisibleBedrock","id":95,"data":0},{"runtimeID":737,"name":"minecraft:trapdoor","id":96,"data":0},{"runtimeID":738,"name":"minecraft:trapdoor","id":96,"data":1},{"runtimeID":739,"name":"minecraft:trapdoor","id":96,"data":2},{"runtimeID":740,"name":"minecraft:trapdoor","id":96,"data":3},{"runtimeID":741,"name":"minecraft:trapdoor","id":96,"data":4},{"runtimeID":742,"name":"minecraft:trapdoor","id":96,"data":5},{"runtimeID":743,"name":"minecraft:trapdoor","id":96,"data":6},{"runtimeID":744,"name":"minecraft:trapdoor","id":96,"data":7},{"runtimeID":745,"name":"minecraft:trapdoor","id":96,"data":8},{"runtimeID":746,"name":"minecraft:trapdoor","id":96,"data":9},{"runtimeID":747,"name":"minecraft:trapdoor","id":96,"data":10},{"runtimeID":748,"name":"minecraft:trapdoor","id":96,"data":11},{"runtimeID":749,"name":"minecraft:trapdoor","id":96,"data":12},{"runtimeID":750,"name":"minecraft:trapdoor","id":96,"data":13},{"runtimeID":751,"name":"minecraft:trapdoor","id":96,"data":14},{"runtimeID":752,"name":"minecraft:trapdoor","id":96,"data":15},{"runtimeID":753,"name":"minecraft:monster_egg","id":97,"data":0},{"runtimeID":754,"name":"minecraft:monster_egg","id":97,"data":1},{"runtimeID":755,"name":"minecraft:monster_egg","id":97,"data":2},{"runtimeID":756,"name":"minecraft:monster_egg","id":97,"data":3},{"runtimeID":757,"name":"minecraft:monster_egg","id":97,"data":4},{"runtimeID":758,"name":"minecraft:monster_egg","id":97,"data":5},{"runtimeID":759,"name":"minecraft:monster_egg","id":97,"data":6},{"runtimeID":760,"name":"minecraft:monster_egg","id":97,"data":7},{"runtimeID":761,"name":"minecraft:stonebrick","id":98,"data":0},{"runtimeID":762,"name":"minecraft:stonebrick","id":98,"data":1},{"runtimeID":763,"name":"minecraft:stonebrick","id":98,"data":2},{"runtimeID":764,"name":"minecraft:stonebrick","id":98,"data":3},{"runtimeID":765,"name":"minecraft:stonebrick","id":98,"data":4},{"runtimeID":766,"name":"minecraft:stonebrick","id":98,"data":5},{"runtimeID":767,"name":"minecraft:stonebrick","id":98,"data":6},{"runtimeID":768,"name":"minecraft:stonebrick","id":98,"data":7},{"runtimeID":769,"name":"minecraft:brown_mushroom_block","id":99,"data":0},{"runtimeID":770,"name":"minecraft:brown_mushroom_block","id":99,"data":1},{"runtimeID":771,"name":"minecraft:brown_mushroom_block","id":99,"data":2},{"runtimeID":772,"name":"minecraft:brown_mushroom_block","id":99,"data":3},{"runtimeID":773,"name":"minecraft:brown_mushroom_block","id":99,"data":4},{"runtimeID":774,"name":"minecraft:brown_mushroom_block","id":99,"data":5},{"runtimeID":775,"name":"minecraft:brown_mushroom_block","id":99,"data":6},{"runtimeID":776,"name":"minecraft:brown_mushroom_block","id":99,"data":7},{"runtimeID":777,"name":"minecraft:brown_mushroom_block","id":99,"data":8},{"runtimeID":778,"name":"minecraft:brown_mushroom_block","id":99,"data":9},{"runtimeID":779,"name":"minecraft:brown_mushroom_block","id":99,"data":10},{"runtimeID":780,"name":"minecraft:brown_mushroom_block","id":99,"data":11},{"runtimeID":781,"name":"minecraft:brown_mushroom_block","id":99,"data":12},{"runtimeID":782,"name":"minecraft:brown_mushroom_block","id":99,"data":13},{"runtimeID":783,"name":"minecraft:brown_mushroom_block","id":99,"data":14},{"runtimeID":784,"name":"minecraft:brown_mushroom_block","id":99,"data":15},{"runtimeID":785,"name":"minecraft:red_mushroom_block","id":100,"data":0},{"runtimeID":786,"name":"minecraft:red_mushroom_block","id":100,"data":1},{"runtimeID":787,"name":"minecraft:red_mushroom_block","id":100,"data":2},{"runtimeID":788,"name":"minecraft:red_mushroom_block","id":100,"data":3},{"runtimeID":789,"name":"minecraft:red_mushroom_block","id":100,"data":4},{"runtimeID":790,"name":"minecraft:red_mushroom_block","id":100,"data":5},{"runtimeID":791,"name":"minecraft:red_mushroom_block","id":100,"data":6},{"runtimeID":792,"name":"minecraft:red_mushroom_block","id":100,"data":7},{"runtimeID":793,"name":"minecraft:red_mushroom_block","id":100,"data":8},{"runtimeID":794,"name":"minecraft:red_mushroom_block","id":100,"data":9},{"runtimeID":795,"name":"minecraft:red_mushroom_block","id":100,"data":10},{"runtimeID":796,"name":"minecraft:red_mushroom_block","id":100,"data":11},{"runtimeID":797,"name":"minecraft:red_mushroom_block","id":100,"data":12},{"runtimeID":798,"name":"minecraft:red_mushroom_block","id":100,"data":13},{"runtimeID":799,"name":"minecraft:red_mushroom_block","id":100,"data":14},{"runtimeID":800,"name":"minecraft:red_mushroom_block","id":100,"data":15},{"runtimeID":801,"name":"minecraft:iron_bars","id":101,"data":0},{"runtimeID":802,"name":"minecraft:glass_pane","id":102,"data":0},{"runtimeID":803,"name":"minecraft:melon_block","id":103,"data":0},{"runtimeID":804,"name":"minecraft:pumpkin_stem","id":104,"data":0},{"runtimeID":805,"name":"minecraft:pumpkin_stem","id":104,"data":1},{"runtimeID":806,"name":"minecraft:pumpkin_stem","id":104,"data":2},{"runtimeID":807,"name":"minecraft:pumpkin_stem","id":104,"data":3},{"runtimeID":808,"name":"minecraft:pumpkin_stem","id":104,"data":4},{"runtimeID":809,"name":"minecraft:pumpkin_stem","id":104,"data":5},{"runtimeID":810,"name":"minecraft:pumpkin_stem","id":104,"data":6},{"runtimeID":811,"name":"minecraft:pumpkin_stem","id":104,"data":7},{"runtimeID":812,"name":"minecraft:melon_stem","id":105,"data":0},{"runtimeID":813,"name":"minecraft:melon_stem","id":105,"data":1},{"runtimeID":814,"name":"minecraft:melon_stem","id":105,"data":2},{"runtimeID":815,"name":"minecraft:melon_stem","id":105,"data":3},{"runtimeID":816,"name":"minecraft:melon_stem","id":105,"data":4},{"runtimeID":817,"name":"minecraft:melon_stem","id":105,"data":5},{"runtimeID":818,"name":"minecraft:melon_stem","id":105,"data":6},{"runtimeID":819,"name":"minecraft:melon_stem","id":105,"data":7},{"runtimeID":820,"name":"minecraft:vine","id":106,"data":0},{"runtimeID":821,"name":"minecraft:vine","id":106,"data":1},{"runtimeID":822,"name":"minecraft:vine","id":106,"data":2},{"runtimeID":823,"name":"minecraft:vine","id":106,"data":3},{"runtimeID":824,"name":"minecraft:vine","id":106,"data":4},{"runtimeID":825,"name":"minecraft:vine","id":106,"data":5},{"runtimeID":826,"name":"minecraft:vine","id":106,"data":6},{"runtimeID":827,"name":"minecraft:vine","id":106,"data":7},{"runtimeID":828,"name":"minecraft:vine","id":106,"data":8},{"runtimeID":829,"name":"minecraft:vine","id":106,"data":9},{"runtimeID":830,"name":"minecraft:vine","id":106,"data":10},{"runtimeID":831,"name":"minecraft:vine","id":106,"data":11},{"runtimeID":832,"name":"minecraft:vine","id":106,"data":12},{"runtimeID":833,"name":"minecraft:vine","id":106,"data":13},{"runtimeID":834,"name":"minecraft:vine","id":106,"data":14},{"runtimeID":835,"name":"minecraft:vine","id":106,"data":15},{"runtimeID":836,"name":"minecraft:fence_gate","id":107,"data":0},{"runtimeID":837,"name":"minecraft:fence_gate","id":107,"data":1},{"runtimeID":838,"name":"minecraft:fence_gate","id":107,"data":2},{"runtimeID":839,"name":"minecraft:fence_gate","id":107,"data":3},{"runtimeID":840,"name":"minecraft:fence_gate","id":107,"data":4},{"runtimeID":841,"name":"minecraft:fence_gate","id":107,"data":5},{"runtimeID":842,"name":"minecraft:fence_gate","id":107,"data":6},{"runtimeID":843,"name":"minecraft:fence_gate","id":107,"data":7},{"runtimeID":844,"name":"minecraft:fence_gate","id":107,"data":8},{"runtimeID":845,"name":"minecraft:fence_gate","id":107,"data":9},{"runtimeID":846,"name":"minecraft:fence_gate","id":107,"data":10},{"runtimeID":847,"name":"minecraft:fence_gate","id":107,"data":11},{"runtimeID":848,"name":"minecraft:fence_gate","id":107,"data":12},{"runtimeID":849,"name":"minecraft:fence_gate","id":107,"data":13},{"runtimeID":850,"name":"minecraft:fence_gate","id":107,"data":14},{"runtimeID":851,"name":"minecraft:fence_gate","id":107,"data":15},{"runtimeID":852,"name":"minecraft:brick_stairs","id":108,"data":0},{"runtimeID":853,"name":"minecraft:brick_stairs","id":108,"data":1},{"runtimeID":854,"name":"minecraft:brick_stairs","id":108,"data":2},{"runtimeID":855,"name":"minecraft:brick_stairs","id":108,"data":3},{"runtimeID":856,"name":"minecraft:brick_stairs","id":108,"data":4},{"runtimeID":857,"name":"minecraft:brick_stairs","id":108,"data":5},{"runtimeID":858,"name":"minecraft:brick_stairs","id":108,"data":6},{"runtimeID":859,"name":"minecraft:brick_stairs","id":108,"data":7},{"runtimeID":860,"name":"minecraft:stone_brick_stairs","id":109,"data":0},{"runtimeID":861,"name":"minecraft:stone_brick_stairs","id":109,"data":1},{"runtimeID":862,"name":"minecraft:stone_brick_stairs","id":109,"data":2},{"runtimeID":863,"name":"minecraft:stone_brick_stairs","id":109,"data":3},{"runtimeID":864,"name":"minecraft:stone_brick_stairs","id":109,"data":4},{"runtimeID":865,"name":"minecraft:stone_brick_stairs","id":109,"data":5},{"runtimeID":866,"name":"minecraft:stone_brick_stairs","id":109,"data":6},{"runtimeID":867,"name":"minecraft:stone_brick_stairs","id":109,"data":7},{"runtimeID":868,"name":"minecraft:mycelium","id":110,"data":0},{"runtimeID":869,"name":"minecraft:waterlily","id":111,"data":0},{"runtimeID":870,"name":"minecraft:nether_brick","id":112,"data":0},{"runtimeID":871,"name":"minecraft:nether_brick_fence","id":113,"data":0},{"runtimeID":872,"name":"minecraft:nether_brick_fence","id":113,"data":1},{"runtimeID":873,"name":"minecraft:nether_brick_fence","id":113,"data":2},{"runtimeID":874,"name":"minecraft:nether_brick_fence","id":113,"data":3},{"runtimeID":875,"name":"minecraft:nether_brick_fence","id":113,"data":4},{"runtimeID":876,"name":"minecraft:nether_brick_fence","id":113,"data":5},{"runtimeID":877,"name":"minecraft:nether_brick_fence","id":113,"data":6},{"runtimeID":878,"name":"minecraft:nether_brick_fence","id":113,"data":7},{"runtimeID":879,"name":"minecraft:nether_brick_stairs","id":114,"data":0},{"runtimeID":880,"name":"minecraft:nether_brick_stairs","id":114,"data":1},{"runtimeID":881,"name":"minecraft:nether_brick_stairs","id":114,"data":2},{"runtimeID":882,"name":"minecraft:nether_brick_stairs","id":114,"data":3},{"runtimeID":883,"name":"minecraft:nether_brick_stairs","id":114,"data":4},{"runtimeID":884,"name":"minecraft:nether_brick_stairs","id":114,"data":5},{"runtimeID":885,"name":"minecraft:nether_brick_stairs","id":114,"data":6},{"runtimeID":886,"name":"minecraft:nether_brick_stairs","id":114,"data":7},{"runtimeID":887,"name":"minecraft:nether_wart","id":115,"data":0},{"runtimeID":888,"name":"minecraft:nether_wart","id":115,"data":1},{"runtimeID":889,"name":"minecraft:nether_wart","id":115,"data":2},{"runtimeID":890,"name":"minecraft:nether_wart","id":115,"data":3},{"runtimeID":891,"name":"minecraft:enchanting_table","id":116,"data":0},{"runtimeID":892,"name":"minecraft:brewing_stand","id":117,"data":0},{"runtimeID":893,"name":"minecraft:brewing_stand","id":117,"data":1},{"runtimeID":894,"name":"minecraft:brewing_stand","id":117,"data":2},{"runtimeID":895,"name":"minecraft:brewing_stand","id":117,"data":3},{"runtimeID":896,"name":"minecraft:brewing_stand","id":117,"data":4},{"runtimeID":897,"name":"minecraft:brewing_stand","id":117,"data":5},{"runtimeID":898,"name":"minecraft:brewing_stand","id":117,"data":6},{"runtimeID":899,"name":"minecraft:brewing_stand","id":117,"data":7},{"runtimeID":900,"name":"minecraft:cauldron","id":118,"data":0},{"runtimeID":901,"name":"minecraft:cauldron","id":118,"data":1},{"runtimeID":902,"name":"minecraft:cauldron","id":118,"data":2},{"runtimeID":903,"name":"minecraft:cauldron","id":118,"data":3},{"runtimeID":904,"name":"minecraft:cauldron","id":118,"data":4},{"runtimeID":905,"name":"minecraft:cauldron","id":118,"data":5},{"runtimeID":906,"name":"minecraft:cauldron","id":118,"data":6},{"runtimeID":907,"name":"minecraft:cauldron","id":118,"data":7},{"runtimeID":908,"name":"minecraft:end_portal","id":119,"data":0},{"runtimeID":909,"name":"minecraft:end_portal_frame","id":120,"data":0},{"runtimeID":910,"name":"minecraft:end_portal_frame","id":120,"data":1},{"runtimeID":911,"name":"minecraft:end_portal_frame","id":120,"data":2},{"runtimeID":912,"name":"minecraft:end_portal_frame","id":120,"data":3},{"runtimeID":913,"name":"minecraft:end_portal_frame","id":120,"data":4},{"runtimeID":914,"name":"minecraft:end_portal_frame","id":120,"data":5},{"runtimeID":915,"name":"minecraft:end_portal_frame","id":120,"data":6},{"runtimeID":916,"name":"minecraft:end_portal_frame","id":120,"data":7},{"runtimeID":917,"name":"minecraft:end_stone","id":121,"data":0},{"runtimeID":918,"name":"minecraft:dragon_egg","id":122,"data":0},{"runtimeID":919,"name":"minecraft:redstone_lamp","id":123,"data":0},{"runtimeID":920,"name":"minecraft:lit_redstone_lamp","id":124,"data":0},{"runtimeID":921,"name":"minecraft:dropper","id":125,"data":0},{"runtimeID":922,"name":"minecraft:dropper","id":125,"data":1},{"runtimeID":923,"name":"minecraft:dropper","id":125,"data":2},{"runtimeID":924,"name":"minecraft:dropper","id":125,"data":3},{"runtimeID":925,"name":"minecraft:dropper","id":125,"data":4},{"runtimeID":926,"name":"minecraft:dropper","id":125,"data":5},{"runtimeID":927,"name":"minecraft:dropper","id":125,"data":6},{"runtimeID":928,"name":"minecraft:dropper","id":125,"data":7},{"runtimeID":929,"name":"minecraft:dropper","id":125,"data":8},{"runtimeID":930,"name":"minecraft:dropper","id":125,"data":9},{"runtimeID":931,"name":"minecraft:dropper","id":125,"data":10},{"runtimeID":932,"name":"minecraft:dropper","id":125,"data":11},{"runtimeID":933,"name":"minecraft:dropper","id":125,"data":12},{"runtimeID":934,"name":"minecraft:dropper","id":125,"data":13},{"runtimeID":935,"name":"minecraft:dropper","id":125,"data":14},{"runtimeID":936,"name":"minecraft:dropper","id":125,"data":15},{"runtimeID":937,"name":"minecraft:activator_rail","id":126,"data":0},{"runtimeID":938,"name":"minecraft:activator_rail","id":126,"data":1},{"runtimeID":939,"name":"minecraft:activator_rail","id":126,"data":2},{"runtimeID":940,"name":"minecraft:activator_rail","id":126,"data":3},{"runtimeID":941,"name":"minecraft:activator_rail","id":126,"data":4},{"runtimeID":942,"name":"minecraft:activator_rail","id":126,"data":5},{"runtimeID":943,"name":"minecraft:activator_rail","id":126,"data":6},{"runtimeID":944,"name":"minecraft:activator_rail","id":126,"data":7},{"runtimeID":945,"name":"minecraft:activator_rail","id":126,"data":8},{"runtimeID":946,"name":"minecraft:activator_rail","id":126,"data":9},{"runtimeID":947,"name":"minecraft:activator_rail","id":126,"data":10},{"runtimeID":948,"name":"minecraft:activator_rail","id":126,"data":11},{"runtimeID":949,"name":"minecraft:activator_rail","id":126,"data":12},{"runtimeID":950,"name":"minecraft:activator_rail","id":126,"data":13},{"runtimeID":951,"name":"minecraft:activator_rail","id":126,"data":14},{"runtimeID":952,"name":"minecraft:activator_rail","id":126,"data":15},{"runtimeID":953,"name":"minecraft:cocoa","id":127,"data":0},{"runtimeID":954,"name":"minecraft:cocoa","id":127,"data":1},{"runtimeID":955,"name":"minecraft:cocoa","id":127,"data":2},{"runtimeID":956,"name":"minecraft:cocoa","id":127,"data":3},{"runtimeID":957,"name":"minecraft:cocoa","id":127,"data":4},{"runtimeID":958,"name":"minecraft:cocoa","id":127,"data":5},{"runtimeID":959,"name":"minecraft:cocoa","id":127,"data":6},{"runtimeID":960,"name":"minecraft:cocoa","id":127,"data":7},{"runtimeID":961,"name":"minecraft:cocoa","id":127,"data":8},{"runtimeID":962,"name":"minecraft:cocoa","id":127,"data":9},{"runtimeID":963,"name":"minecraft:cocoa","id":127,"data":10},{"runtimeID":964,"name":"minecraft:cocoa","id":127,"data":11},{"runtimeID":965,"name":"minecraft:cocoa","id":127,"data":12},{"runtimeID":966,"name":"minecraft:cocoa","id":127,"data":13},{"runtimeID":967,"name":"minecraft:cocoa","id":127,"data":14},{"runtimeID":968,"name":"minecraft:cocoa","id":127,"data":15},{"runtimeID":969,"name":"minecraft:sandstone_stairs","id":128,"data":0},{"runtimeID":970,"name":"minecraft:sandstone_stairs","id":128,"data":1},{"runtimeID":971,"name":"minecraft:sandstone_stairs","id":128,"data":2},{"runtimeID":972,"name":"minecraft:sandstone_stairs","id":128,"data":3},{"runtimeID":973,"name":"minecraft:sandstone_stairs","id":128,"data":4},{"runtimeID":974,"name":"minecraft:sandstone_stairs","id":128,"data":5},{"runtimeID":975,"name":"minecraft:sandstone_stairs","id":128,"data":6},{"runtimeID":976,"name":"minecraft:sandstone_stairs","id":128,"data":7},{"runtimeID":977,"name":"minecraft:emerald_ore","id":129,"data":0},{"runtimeID":978,"name":"minecraft:ender_chest","id":130,"data":0},{"runtimeID":979,"name":"minecraft:ender_chest","id":130,"data":1},{"runtimeID":980,"name":"minecraft:ender_chest","id":130,"data":2},{"runtimeID":981,"name":"minecraft:ender_chest","id":130,"data":3},{"runtimeID":982,"name":"minecraft:ender_chest","id":130,"data":4},{"runtimeID":983,"name":"minecraft:ender_chest","id":130,"data":5},{"runtimeID":984,"name":"minecraft:ender_chest","id":130,"data":6},{"runtimeID":985,"name":"minecraft:ender_chest","id":130,"data":7},{"runtimeID":986,"name":"minecraft:tripwire_hook","id":131,"data":0},{"runtimeID":987,"name":"minecraft:tripwire_hook","id":131,"data":1},{"runtimeID":988,"name":"minecraft:tripwire_hook","id":131,"data":2},{"runtimeID":989,"name":"minecraft:tripwire_hook","id":131,"data":3},{"runtimeID":990,"name":"minecraft:tripwire_hook","id":131,"data":4},{"runtimeID":991,"name":"minecraft:tripwire_hook","id":131,"data":5},{"runtimeID":992,"name":"minecraft:tripwire_hook","id":131,"data":6},{"runtimeID":993,"name":"minecraft:tripwire_hook","id":131,"data":7},{"runtimeID":994,"name":"minecraft:tripwire_hook","id":131,"data":8},{"runtimeID":995,"name":"minecraft:tripwire_hook","id":131,"data":9},{"runtimeID":996,"name":"minecraft:tripwire_hook","id":131,"data":10},{"runtimeID":997,"name":"minecraft:tripwire_hook","id":131,"data":11},{"runtimeID":998,"name":"minecraft:tripwire_hook","id":131,"data":12},{"runtimeID":999,"name":"minecraft:tripwire_hook","id":131,"data":13},{"runtimeID":1000,"name":"minecraft:tripwire_hook","id":131,"data":14},{"runtimeID":1001,"name":"minecraft:tripwire_hook","id":131,"data":15},{"runtimeID":1002,"name":"minecraft:tripWire","id":132,"data":0},{"runtimeID":1003,"name":"minecraft:tripWire","id":132,"data":1},{"runtimeID":1004,"name":"minecraft:tripWire","id":132,"data":2},{"runtimeID":1005,"name":"minecraft:tripWire","id":132,"data":3},{"runtimeID":1006,"name":"minecraft:tripWire","id":132,"data":4},{"runtimeID":1007,"name":"minecraft:tripWire","id":132,"data":5},{"runtimeID":1008,"name":"minecraft:tripWire","id":132,"data":6},{"runtimeID":1009,"name":"minecraft:tripWire","id":132,"data":7},{"runtimeID":1010,"name":"minecraft:tripWire","id":132,"data":8},{"runtimeID":1011,"name":"minecraft:tripWire","id":132,"data":9},{"runtimeID":1012,"name":"minecraft:tripWire","id":132,"data":10},{"runtimeID":1013,"name":"minecraft:tripWire","id":132,"data":11},{"runtimeID":1014,"name":"minecraft:tripWire","id":132,"data":12},{"runtimeID":1015,"name":"minecraft:tripWire","id":132,"data":13},{"runtimeID":1016,"name":"minecraft:tripWire","id":132,"data":14},{"runtimeID":1017,"name":"minecraft:tripWire","id":132,"data":15},{"runtimeID":1018,"name":"minecraft:emerald_block","id":133,"data":0},{"runtimeID":1019,"name":"minecraft:spruce_stairs","id":134,"data":0},{"runtimeID":1020,"name":"minecraft:spruce_stairs","id":134,"data":1},{"runtimeID":1021,"name":"minecraft:spruce_stairs","id":134,"data":2},{"runtimeID":1022,"name":"minecraft:spruce_stairs","id":134,"data":3},{"runtimeID":1023,"name":"minecraft:spruce_stairs","id":134,"data":4},{"runtimeID":1024,"name":"minecraft:spruce_stairs","id":134,"data":5},{"runtimeID":1025,"name":"minecraft:spruce_stairs","id":134,"data":6},{"runtimeID":1026,"name":"minecraft:spruce_stairs","id":134,"data":7},{"runtimeID":1027,"name":"minecraft:birch_stairs","id":135,"data":0},{"runtimeID":1028,"name":"minecraft:birch_stairs","id":135,"data":1},{"runtimeID":1029,"name":"minecraft:birch_stairs","id":135,"data":2},{"runtimeID":1030,"name":"minecraft:birch_stairs","id":135,"data":3},{"runtimeID":1031,"name":"minecraft:birch_stairs","id":135,"data":4},{"runtimeID":1032,"name":"minecraft:birch_stairs","id":135,"data":5},{"runtimeID":1033,"name":"minecraft:birch_stairs","id":135,"data":6},{"runtimeID":1034,"name":"minecraft:birch_stairs","id":135,"data":7},{"runtimeID":1035,"name":"minecraft:jungle_stairs","id":136,"data":0},{"runtimeID":1036,"name":"minecraft:jungle_stairs","id":136,"data":1},{"runtimeID":1037,"name":"minecraft:jungle_stairs","id":136,"data":2},{"runtimeID":1038,"name":"minecraft:jungle_stairs","id":136,"data":3},{"runtimeID":1039,"name":"minecraft:jungle_stairs","id":136,"data":4},{"runtimeID":1040,"name":"minecraft:jungle_stairs","id":136,"data":5},{"runtimeID":1041,"name":"minecraft:jungle_stairs","id":136,"data":6},{"runtimeID":1042,"name":"minecraft:jungle_stairs","id":136,"data":7},{"runtimeID":1043,"name":"minecraft:command_block","id":137,"data":0},{"runtimeID":1044,"name":"minecraft:command_block","id":137,"data":1},{"runtimeID":1045,"name":"minecraft:command_block","id":137,"data":2},{"runtimeID":1046,"name":"minecraft:command_block","id":137,"data":3},{"runtimeID":1047,"name":"minecraft:command_block","id":137,"data":4},{"runtimeID":1048,"name":"minecraft:command_block","id":137,"data":5},{"runtimeID":1049,"name":"minecraft:command_block","id":137,"data":6},{"runtimeID":1050,"name":"minecraft:command_block","id":137,"data":7},{"runtimeID":1051,"name":"minecraft:command_block","id":137,"data":8},{"runtimeID":1052,"name":"minecraft:command_block","id":137,"data":9},{"runtimeID":1053,"name":"minecraft:command_block","id":137,"data":10},{"runtimeID":1054,"name":"minecraft:command_block","id":137,"data":11},{"runtimeID":1055,"name":"minecraft:command_block","id":137,"data":12},{"runtimeID":1056,"name":"minecraft:command_block","id":137,"data":13},{"runtimeID":1057,"name":"minecraft:command_block","id":137,"data":14},{"runtimeID":1058,"name":"minecraft:command_block","id":137,"data":15},{"runtimeID":1059,"name":"minecraft:beacon","id":138,"data":0},{"runtimeID":1060,"name":"minecraft:cobblestone_wall","id":139,"data":0},{"runtimeID":1061,"name":"minecraft:cobblestone_wall","id":139,"data":1},{"runtimeID":1062,"name":"minecraft:flower_pot","id":140,"data":0},{"runtimeID":1063,"name":"minecraft:flower_pot","id":140,"data":1},{"runtimeID":1064,"name":"minecraft:carrots","id":141,"data":0},{"runtimeID":1065,"name":"minecraft:carrots","id":141,"data":1},{"runtimeID":1066,"name":"minecraft:carrots","id":141,"data":2},{"runtimeID":1067,"name":"minecraft:carrots","id":141,"data":3},{"runtimeID":1068,"name":"minecraft:carrots","id":141,"data":4},{"runtimeID":1069,"name":"minecraft:carrots","id":141,"data":5},{"runtimeID":1070,"name":"minecraft:carrots","id":141,"data":6},{"runtimeID":1071,"name":"minecraft:carrots","id":141,"data":7},{"runtimeID":1072,"name":"minecraft:potatoes","id":142,"data":0},{"runtimeID":1073,"name":"minecraft:potatoes","id":142,"data":1},{"runtimeID":1074,"name":"minecraft:potatoes","id":142,"data":2},{"runtimeID":1075,"name":"minecraft:potatoes","id":142,"data":3},{"runtimeID":1076,"name":"minecraft:potatoes","id":142,"data":4},{"runtimeID":1077,"name":"minecraft:potatoes","id":142,"data":5},{"runtimeID":1078,"name":"minecraft:potatoes","id":142,"data":6},{"runtimeID":1079,"name":"minecraft:potatoes","id":142,"data":7},{"runtimeID":1080,"name":"minecraft:wooden_button","id":143,"data":0},{"runtimeID":1081,"name":"minecraft:wooden_button","id":143,"data":1},{"runtimeID":1082,"name":"minecraft:wooden_button","id":143,"data":2},{"runtimeID":1083,"name":"minecraft:wooden_button","id":143,"data":3},{"runtimeID":1084,"name":"minecraft:wooden_button","id":143,"data":4},{"runtimeID":1085,"name":"minecraft:wooden_button","id":143,"data":5},{"runtimeID":1086,"name":"minecraft:wooden_button","id":143,"data":6},{"runtimeID":1087,"name":"minecraft:wooden_button","id":143,"data":7},{"runtimeID":1088,"name":"minecraft:wooden_button","id":143,"data":8},{"runtimeID":1089,"name":"minecraft:wooden_button","id":143,"data":9},{"runtimeID":1090,"name":"minecraft:wooden_button","id":143,"data":10},{"runtimeID":1091,"name":"minecraft:wooden_button","id":143,"data":11},{"runtimeID":1092,"name":"minecraft:wooden_button","id":143,"data":12},{"runtimeID":1093,"name":"minecraft:wooden_button","id":143,"data":13},{"runtimeID":1094,"name":"minecraft:wooden_button","id":143,"data":14},{"runtimeID":1095,"name":"minecraft:wooden_button","id":143,"data":15},{"runtimeID":1096,"name":"minecraft:skull","id":144,"data":0},{"runtimeID":1097,"name":"minecraft:skull","id":144,"data":1},{"runtimeID":1098,"name":"minecraft:skull","id":144,"data":2},{"runtimeID":1099,"name":"minecraft:skull","id":144,"data":3},{"runtimeID":1100,"name":"minecraft:skull","id":144,"data":4},{"runtimeID":1101,"name":"minecraft:skull","id":144,"data":5},{"runtimeID":1102,"name":"minecraft:skull","id":144,"data":6},{"runtimeID":1103,"name":"minecraft:skull","id":144,"data":7},{"runtimeID":1104,"name":"minecraft:skull","id":144,"data":8},{"runtimeID":1105,"name":"minecraft:skull","id":144,"data":9},{"runtimeID":1106,"name":"minecraft:skull","id":144,"data":10},{"runtimeID":1107,"name":"minecraft:skull","id":144,"data":11},{"runtimeID":1108,"name":"minecraft:skull","id":144,"data":12},{"runtimeID":1109,"name":"minecraft:skull","id":144,"data":13},{"runtimeID":1110,"name":"minecraft:skull","id":144,"data":14},{"runtimeID":1111,"name":"minecraft:skull","id":144,"data":15},{"runtimeID":1112,"name":"minecraft:anvil","id":145,"data":0},{"runtimeID":1113,"name":"minecraft:anvil","id":145,"data":1},{"runtimeID":1114,"name":"minecraft:anvil","id":145,"data":2},{"runtimeID":1115,"name":"minecraft:anvil","id":145,"data":3},{"runtimeID":1116,"name":"minecraft:anvil","id":145,"data":4},{"runtimeID":1117,"name":"minecraft:anvil","id":145,"data":5},{"runtimeID":1118,"name":"minecraft:anvil","id":145,"data":6},{"runtimeID":1119,"name":"minecraft:anvil","id":145,"data":7},{"runtimeID":1120,"name":"minecraft:anvil","id":145,"data":8},{"runtimeID":1121,"name":"minecraft:anvil","id":145,"data":9},{"runtimeID":1122,"name":"minecraft:anvil","id":145,"data":10},{"runtimeID":1123,"name":"minecraft:anvil","id":145,"data":11},{"runtimeID":1124,"name":"minecraft:anvil","id":145,"data":12},{"runtimeID":1125,"name":"minecraft:anvil","id":145,"data":13},{"runtimeID":1126,"name":"minecraft:anvil","id":145,"data":14},{"runtimeID":1127,"name":"minecraft:anvil","id":145,"data":15},{"runtimeID":1128,"name":"minecraft:trapped_chest","id":146,"data":0},{"runtimeID":1129,"name":"minecraft:trapped_chest","id":146,"data":1},{"runtimeID":1130,"name":"minecraft:trapped_chest","id":146,"data":2},{"runtimeID":1131,"name":"minecraft:trapped_chest","id":146,"data":3},{"runtimeID":1132,"name":"minecraft:trapped_chest","id":146,"data":4},{"runtimeID":1133,"name":"minecraft:trapped_chest","id":146,"data":5},{"runtimeID":1134,"name":"minecraft:trapped_chest","id":146,"data":6},{"runtimeID":1135,"name":"minecraft:trapped_chest","id":146,"data":7},{"runtimeID":1136,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":0},{"runtimeID":1137,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":1},{"runtimeID":1138,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":2},{"runtimeID":1139,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":3},{"runtimeID":1140,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":4},{"runtimeID":1141,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":5},{"runtimeID":1142,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":6},{"runtimeID":1143,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":7},{"runtimeID":1144,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":8},{"runtimeID":1145,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":9},{"runtimeID":1146,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":10},{"runtimeID":1147,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":11},{"runtimeID":1148,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":12},{"runtimeID":1149,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":13},{"runtimeID":1150,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":14},{"runtimeID":1151,"name":"minecraft:light_weighted_pressure_plate","id":147,"data":15},{"runtimeID":1152,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":0},{"runtimeID":1153,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":1},{"runtimeID":1154,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":2},{"runtimeID":1155,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":3},{"runtimeID":1156,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":4},{"runtimeID":1157,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":5},{"runtimeID":1158,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":6},{"runtimeID":1159,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":7},{"runtimeID":1160,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":8},{"runtimeID":1161,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":9},{"runtimeID":1162,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":10},{"runtimeID":1163,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":11},{"runtimeID":1164,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":12},{"runtimeID":1165,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":13},{"runtimeID":1166,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":14},{"runtimeID":1167,"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":15},{"runtimeID":1168,"name":"minecraft:unpowered_comparator","id":149,"data":0},{"runtimeID":1169,"name":"minecraft:unpowered_comparator","id":149,"data":1},{"runtimeID":1170,"name":"minecraft:unpowered_comparator","id":149,"data":2},{"runtimeID":1171,"name":"minecraft:unpowered_comparator","id":149,"data":3},{"runtimeID":1172,"name":"minecraft:unpowered_comparator","id":149,"data":4},{"runtimeID":1173,"name":"minecraft:unpowered_comparator","id":149,"data":5},{"runtimeID":1174,"name":"minecraft:unpowered_comparator","id":149,"data":6},{"runtimeID":1175,"name":"minecraft:unpowered_comparator","id":149,"data":7},{"runtimeID":1176,"name":"minecraft:unpowered_comparator","id":149,"data":8},{"runtimeID":1177,"name":"minecraft:unpowered_comparator","id":149,"data":9},{"runtimeID":1178,"name":"minecraft:unpowered_comparator","id":149,"data":10},{"runtimeID":1179,"name":"minecraft:unpowered_comparator","id":149,"data":11},{"runtimeID":1180,"name":"minecraft:unpowered_comparator","id":149,"data":12},{"runtimeID":1181,"name":"minecraft:unpowered_comparator","id":149,"data":13},{"runtimeID":1182,"name":"minecraft:unpowered_comparator","id":149,"data":14},{"runtimeID":1183,"name":"minecraft:unpowered_comparator","id":149,"data":15},{"runtimeID":1184,"name":"minecraft:powered_comparator","id":150,"data":0},{"runtimeID":1185,"name":"minecraft:powered_comparator","id":150,"data":1},{"runtimeID":1186,"name":"minecraft:powered_comparator","id":150,"data":2},{"runtimeID":1187,"name":"minecraft:powered_comparator","id":150,"data":3},{"runtimeID":1188,"name":"minecraft:powered_comparator","id":150,"data":4},{"runtimeID":1189,"name":"minecraft:powered_comparator","id":150,"data":5},{"runtimeID":1190,"name":"minecraft:powered_comparator","id":150,"data":6},{"runtimeID":1191,"name":"minecraft:powered_comparator","id":150,"data":7},{"runtimeID":1192,"name":"minecraft:powered_comparator","id":150,"data":8},{"runtimeID":1193,"name":"minecraft:powered_comparator","id":150,"data":9},{"runtimeID":1194,"name":"minecraft:powered_comparator","id":150,"data":10},{"runtimeID":1195,"name":"minecraft:powered_comparator","id":150,"data":11},{"runtimeID":1196,"name":"minecraft:powered_comparator","id":150,"data":12},{"runtimeID":1197,"name":"minecraft:powered_comparator","id":150,"data":13},{"runtimeID":1198,"name":"minecraft:powered_comparator","id":150,"data":14},{"runtimeID":1199,"name":"minecraft:powered_comparator","id":150,"data":15},{"runtimeID":1200,"name":"minecraft:daylight_detector","id":151,"data":0},{"runtimeID":1201,"name":"minecraft:daylight_detector","id":151,"data":1},{"runtimeID":1202,"name":"minecraft:daylight_detector","id":151,"data":2},{"runtimeID":1203,"name":"minecraft:daylight_detector","id":151,"data":3},{"runtimeID":1204,"name":"minecraft:daylight_detector","id":151,"data":4},{"runtimeID":1205,"name":"minecraft:daylight_detector","id":151,"data":5},{"runtimeID":1206,"name":"minecraft:daylight_detector","id":151,"data":6},{"runtimeID":1207,"name":"minecraft:daylight_detector","id":151,"data":7},{"runtimeID":1208,"name":"minecraft:daylight_detector","id":151,"data":8},{"runtimeID":1209,"name":"minecraft:daylight_detector","id":151,"data":9},{"runtimeID":1210,"name":"minecraft:daylight_detector","id":151,"data":10},{"runtimeID":1211,"name":"minecraft:daylight_detector","id":151,"data":11},{"runtimeID":1212,"name":"minecraft:daylight_detector","id":151,"data":12},{"runtimeID":1213,"name":"minecraft:daylight_detector","id":151,"data":13},{"runtimeID":1214,"name":"minecraft:daylight_detector","id":151,"data":14},{"runtimeID":1215,"name":"minecraft:daylight_detector","id":151,"data":15},{"runtimeID":1216,"name":"minecraft:redstone_block","id":152,"data":0},{"runtimeID":1217,"name":"minecraft:quartz_ore","id":153,"data":0},{"runtimeID":1218,"name":"minecraft:hopper","id":154,"data":0},{"runtimeID":1219,"name":"minecraft:hopper","id":154,"data":1},{"runtimeID":1220,"name":"minecraft:hopper","id":154,"data":2},{"runtimeID":1221,"name":"minecraft:hopper","id":154,"data":3},{"runtimeID":1222,"name":"minecraft:hopper","id":154,"data":4},{"runtimeID":1223,"name":"minecraft:hopper","id":154,"data":5},{"runtimeID":1224,"name":"minecraft:hopper","id":154,"data":6},{"runtimeID":1225,"name":"minecraft:hopper","id":154,"data":7},{"runtimeID":1226,"name":"minecraft:hopper","id":154,"data":8},{"runtimeID":1227,"name":"minecraft:hopper","id":154,"data":9},{"runtimeID":1228,"name":"minecraft:hopper","id":154,"data":10},{"runtimeID":1229,"name":"minecraft:hopper","id":154,"data":11},{"runtimeID":1230,"name":"minecraft:hopper","id":154,"data":12},{"runtimeID":1231,"name":"minecraft:hopper","id":154,"data":13},{"runtimeID":1232,"name":"minecraft:hopper","id":154,"data":14},{"runtimeID":1233,"name":"minecraft:hopper","id":154,"data":15},{"runtimeID":1234,"name":"minecraft:quartz_block","id":155,"data":0},{"runtimeID":1235,"name":"minecraft:quartz_block","id":155,"data":1},{"runtimeID":1236,"name":"minecraft:quartz_block","id":155,"data":2},{"runtimeID":1237,"name":"minecraft:quartz_block","id":155,"data":3},{"runtimeID":1238,"name":"minecraft:quartz_block","id":155,"data":4},{"runtimeID":1239,"name":"minecraft:quartz_block","id":155,"data":5},{"runtimeID":1240,"name":"minecraft:quartz_block","id":155,"data":6},{"runtimeID":1241,"name":"minecraft:quartz_block","id":155,"data":7},{"runtimeID":1242,"name":"minecraft:quartz_block","id":155,"data":8},{"runtimeID":1243,"name":"minecraft:quartz_block","id":155,"data":9},{"runtimeID":1244,"name":"minecraft:quartz_block","id":155,"data":10},{"runtimeID":1245,"name":"minecraft:quartz_block","id":155,"data":11},{"runtimeID":1246,"name":"minecraft:quartz_block","id":155,"data":12},{"runtimeID":1247,"name":"minecraft:quartz_block","id":155,"data":13},{"runtimeID":1248,"name":"minecraft:quartz_block","id":155,"data":14},{"runtimeID":1249,"name":"minecraft:quartz_block","id":155,"data":15},{"runtimeID":1250,"name":"minecraft:quartz_stairs","id":156,"data":0},{"runtimeID":1251,"name":"minecraft:quartz_stairs","id":156,"data":1},{"runtimeID":1252,"name":"minecraft:quartz_stairs","id":156,"data":2},{"runtimeID":1253,"name":"minecraft:quartz_stairs","id":156,"data":3},{"runtimeID":1254,"name":"minecraft:quartz_stairs","id":156,"data":4},{"runtimeID":1255,"name":"minecraft:quartz_stairs","id":156,"data":5},{"runtimeID":1256,"name":"minecraft:quartz_stairs","id":156,"data":6},{"runtimeID":1257,"name":"minecraft:quartz_stairs","id":156,"data":7},{"runtimeID":1258,"name":"minecraft:double_wooden_slab","id":157,"data":0},{"runtimeID":1259,"name":"minecraft:double_wooden_slab","id":157,"data":1},{"runtimeID":1260,"name":"minecraft:double_wooden_slab","id":157,"data":2},{"runtimeID":1261,"name":"minecraft:double_wooden_slab","id":157,"data":3},{"runtimeID":1262,"name":"minecraft:double_wooden_slab","id":157,"data":4},{"runtimeID":1263,"name":"minecraft:double_wooden_slab","id":157,"data":5},{"runtimeID":1264,"name":"minecraft:double_wooden_slab","id":157,"data":6},{"runtimeID":1265,"name":"minecraft:double_wooden_slab","id":157,"data":7},{"runtimeID":1266,"name":"minecraft:double_wooden_slab","id":157,"data":8},{"runtimeID":1267,"name":"minecraft:double_wooden_slab","id":157,"data":9},{"runtimeID":1268,"name":"minecraft:double_wooden_slab","id":157,"data":10},{"runtimeID":1269,"name":"minecraft:double_wooden_slab","id":157,"data":11},{"runtimeID":1270,"name":"minecraft:double_wooden_slab","id":157,"data":12},{"runtimeID":1271,"name":"minecraft:double_wooden_slab","id":157,"data":13},{"runtimeID":1272,"name":"minecraft:double_wooden_slab","id":157,"data":14},{"runtimeID":1273,"name":"minecraft:double_wooden_slab","id":157,"data":15},{"runtimeID":1274,"name":"minecraft:wooden_slab","id":158,"data":0},{"runtimeID":1275,"name":"minecraft:wooden_slab","id":158,"data":1},{"runtimeID":1276,"name":"minecraft:wooden_slab","id":158,"data":2},{"runtimeID":1277,"name":"minecraft:wooden_slab","id":158,"data":3},{"runtimeID":1278,"name":"minecraft:wooden_slab","id":158,"data":4},{"runtimeID":1279,"name":"minecraft:wooden_slab","id":158,"data":5},{"runtimeID":1280,"name":"minecraft:wooden_slab","id":158,"data":6},{"runtimeID":1281,"name":"minecraft:wooden_slab","id":158,"data":7},{"runtimeID":1282,"name":"minecraft:wooden_slab","id":158,"data":8},{"runtimeID":1283,"name":"minecraft:wooden_slab","id":158,"data":9},{"runtimeID":1284,"name":"minecraft:wooden_slab","id":158,"data":10},{"runtimeID":1285,"name":"minecraft:wooden_slab","id":158,"data":11},{"runtimeID":1286,"name":"minecraft:wooden_slab","id":158,"data":12},{"runtimeID":1287,"name":"minecraft:wooden_slab","id":158,"data":13},{"runtimeID":1288,"name":"minecraft:wooden_slab","id":158,"data":14},{"runtimeID":1289,"name":"minecraft:wooden_slab","id":158,"data":15},{"runtimeID":1290,"name":"minecraft:stained_hardened_clay","id":159,"data":0},{"runtimeID":1291,"name":"minecraft:stained_hardened_clay","id":159,"data":1},{"runtimeID":1292,"name":"minecraft:stained_hardened_clay","id":159,"data":2},{"runtimeID":1293,"name":"minecraft:stained_hardened_clay","id":159,"data":3},{"runtimeID":1294,"name":"minecraft:stained_hardened_clay","id":159,"data":4},{"runtimeID":1295,"name":"minecraft:stained_hardened_clay","id":159,"data":5},{"runtimeID":1296,"name":"minecraft:stained_hardened_clay","id":159,"data":6},{"runtimeID":1297,"name":"minecraft:stained_hardened_clay","id":159,"data":7},{"runtimeID":1298,"name":"minecraft:stained_hardened_clay","id":159,"data":8},{"runtimeID":1299,"name":"minecraft:stained_hardened_clay","id":159,"data":9},{"runtimeID":1300,"name":"minecraft:stained_hardened_clay","id":159,"data":10},{"runtimeID":1301,"name":"minecraft:stained_hardened_clay","id":159,"data":11},{"runtimeID":1302,"name":"minecraft:stained_hardened_clay","id":159,"data":12},{"runtimeID":1303,"name":"minecraft:stained_hardened_clay","id":159,"data":13},{"runtimeID":1304,"name":"minecraft:stained_hardened_clay","id":159,"data":14},{"runtimeID":1305,"name":"minecraft:stained_hardened_clay","id":159,"data":15},{"runtimeID":1306,"name":"minecraft:stained_glass_pane","id":160,"data":0},{"runtimeID":1307,"name":"minecraft:stained_glass_pane","id":160,"data":1},{"runtimeID":1308,"name":"minecraft:stained_glass_pane","id":160,"data":2},{"runtimeID":1309,"name":"minecraft:stained_glass_pane","id":160,"data":3},{"runtimeID":1310,"name":"minecraft:stained_glass_pane","id":160,"data":4},{"runtimeID":1311,"name":"minecraft:stained_glass_pane","id":160,"data":5},{"runtimeID":1312,"name":"minecraft:stained_glass_pane","id":160,"data":6},{"runtimeID":1313,"name":"minecraft:stained_glass_pane","id":160,"data":7},{"runtimeID":1314,"name":"minecraft:stained_glass_pane","id":160,"data":8},{"runtimeID":1315,"name":"minecraft:stained_glass_pane","id":160,"data":9},{"runtimeID":1316,"name":"minecraft:stained_glass_pane","id":160,"data":10},{"runtimeID":1317,"name":"minecraft:stained_glass_pane","id":160,"data":11},{"runtimeID":1318,"name":"minecraft:stained_glass_pane","id":160,"data":12},{"runtimeID":1319,"name":"minecraft:stained_glass_pane","id":160,"data":13},{"runtimeID":1320,"name":"minecraft:stained_glass_pane","id":160,"data":14},{"runtimeID":1321,"name":"minecraft:stained_glass_pane","id":160,"data":15},{"runtimeID":1322,"name":"minecraft:leaves2","id":161,"data":0},{"runtimeID":1323,"name":"minecraft:leaves2","id":161,"data":1},{"runtimeID":1324,"name":"minecraft:leaves2","id":161,"data":2},{"runtimeID":1325,"name":"minecraft:leaves2","id":161,"data":3},{"runtimeID":1326,"name":"minecraft:leaves2","id":161,"data":4},{"runtimeID":1327,"name":"minecraft:leaves2","id":161,"data":5},{"runtimeID":1328,"name":"minecraft:leaves2","id":161,"data":6},{"runtimeID":1329,"name":"minecraft:leaves2","id":161,"data":7},{"runtimeID":1330,"name":"minecraft:leaves2","id":161,"data":8},{"runtimeID":1331,"name":"minecraft:leaves2","id":161,"data":9},{"runtimeID":1332,"name":"minecraft:leaves2","id":161,"data":10},{"runtimeID":1333,"name":"minecraft:leaves2","id":161,"data":11},{"runtimeID":1334,"name":"minecraft:leaves2","id":161,"data":12},{"runtimeID":1335,"name":"minecraft:leaves2","id":161,"data":13},{"runtimeID":1336,"name":"minecraft:leaves2","id":161,"data":14},{"runtimeID":1337,"name":"minecraft:leaves2","id":161,"data":15},{"runtimeID":1338,"name":"minecraft:log2","id":162,"data":0},{"runtimeID":1339,"name":"minecraft:log2","id":162,"data":1},{"runtimeID":1340,"name":"minecraft:log2","id":162,"data":2},{"runtimeID":1341,"name":"minecraft:log2","id":162,"data":3},{"runtimeID":1342,"name":"minecraft:log2","id":162,"data":4},{"runtimeID":1343,"name":"minecraft:log2","id":162,"data":5},{"runtimeID":1344,"name":"minecraft:log2","id":162,"data":6},{"runtimeID":1345,"name":"minecraft:log2","id":162,"data":7},{"runtimeID":1346,"name":"minecraft:log2","id":162,"data":8},{"runtimeID":1347,"name":"minecraft:log2","id":162,"data":9},{"runtimeID":1348,"name":"minecraft:log2","id":162,"data":10},{"runtimeID":1349,"name":"minecraft:log2","id":162,"data":11},{"runtimeID":1350,"name":"minecraft:log2","id":162,"data":12},{"runtimeID":1351,"name":"minecraft:log2","id":162,"data":13},{"runtimeID":1352,"name":"minecraft:log2","id":162,"data":14},{"runtimeID":1353,"name":"minecraft:log2","id":162,"data":15},{"runtimeID":1354,"name":"minecraft:acacia_stairs","id":163,"data":0},{"runtimeID":1355,"name":"minecraft:acacia_stairs","id":163,"data":1},{"runtimeID":1356,"name":"minecraft:acacia_stairs","id":163,"data":2},{"runtimeID":1357,"name":"minecraft:acacia_stairs","id":163,"data":3},{"runtimeID":1358,"name":"minecraft:acacia_stairs","id":163,"data":4},{"runtimeID":1359,"name":"minecraft:acacia_stairs","id":163,"data":5},{"runtimeID":1360,"name":"minecraft:acacia_stairs","id":163,"data":6},{"runtimeID":1361,"name":"minecraft:acacia_stairs","id":163,"data":7},{"runtimeID":1362,"name":"minecraft:dark_oak_stairs","id":164,"data":0},{"runtimeID":1363,"name":"minecraft:dark_oak_stairs","id":164,"data":1},{"runtimeID":1364,"name":"minecraft:dark_oak_stairs","id":164,"data":2},{"runtimeID":1365,"name":"minecraft:dark_oak_stairs","id":164,"data":3},{"runtimeID":1366,"name":"minecraft:dark_oak_stairs","id":164,"data":4},{"runtimeID":1367,"name":"minecraft:dark_oak_stairs","id":164,"data":5},{"runtimeID":1368,"name":"minecraft:dark_oak_stairs","id":164,"data":6},{"runtimeID":1369,"name":"minecraft:dark_oak_stairs","id":164,"data":7},{"runtimeID":1370,"name":"minecraft:slime","id":165,"data":0},{"runtimeID":1372,"name":"minecraft:iron_trapdoor","id":167,"data":0},{"runtimeID":1373,"name":"minecraft:iron_trapdoor","id":167,"data":1},{"runtimeID":1374,"name":"minecraft:iron_trapdoor","id":167,"data":2},{"runtimeID":1375,"name":"minecraft:iron_trapdoor","id":167,"data":3},{"runtimeID":1376,"name":"minecraft:iron_trapdoor","id":167,"data":4},{"runtimeID":1377,"name":"minecraft:iron_trapdoor","id":167,"data":5},{"runtimeID":1378,"name":"minecraft:iron_trapdoor","id":167,"data":6},{"runtimeID":1379,"name":"minecraft:iron_trapdoor","id":167,"data":7},{"runtimeID":1380,"name":"minecraft:iron_trapdoor","id":167,"data":8},{"runtimeID":1381,"name":"minecraft:iron_trapdoor","id":167,"data":9},{"runtimeID":1382,"name":"minecraft:iron_trapdoor","id":167,"data":10},{"runtimeID":1383,"name":"minecraft:iron_trapdoor","id":167,"data":11},{"runtimeID":1384,"name":"minecraft:iron_trapdoor","id":167,"data":12},{"runtimeID":1385,"name":"minecraft:iron_trapdoor","id":167,"data":13},{"runtimeID":1386,"name":"minecraft:iron_trapdoor","id":167,"data":14},{"runtimeID":1387,"name":"minecraft:iron_trapdoor","id":167,"data":15},{"runtimeID":1388,"name":"minecraft:prismarine","id":168,"data":0},{"runtimeID":1389,"name":"minecraft:prismarine","id":168,"data":1},{"runtimeID":1390,"name":"minecraft:prismarine","id":168,"data":2},{"runtimeID":1391,"name":"minecraft:prismarine","id":168,"data":3},{"runtimeID":1392,"name":"minecraft:seaLantern","id":169,"data":0},{"runtimeID":1393,"name":"minecraft:hay_block","id":170,"data":0},{"runtimeID":1394,"name":"minecraft:hay_block","id":170,"data":1},{"runtimeID":1395,"name":"minecraft:hay_block","id":170,"data":2},{"runtimeID":1396,"name":"minecraft:hay_block","id":170,"data":3},{"runtimeID":1397,"name":"minecraft:hay_block","id":170,"data":4},{"runtimeID":1398,"name":"minecraft:hay_block","id":170,"data":5},{"runtimeID":1399,"name":"minecraft:hay_block","id":170,"data":6},{"runtimeID":1400,"name":"minecraft:hay_block","id":170,"data":7},{"runtimeID":1401,"name":"minecraft:hay_block","id":170,"data":8},{"runtimeID":1402,"name":"minecraft:hay_block","id":170,"data":9},{"runtimeID":1403,"name":"minecraft:hay_block","id":170,"data":10},{"runtimeID":1404,"name":"minecraft:hay_block","id":170,"data":11},{"runtimeID":1405,"name":"minecraft:hay_block","id":170,"data":12},{"runtimeID":1406,"name":"minecraft:hay_block","id":170,"data":13},{"runtimeID":1407,"name":"minecraft:hay_block","id":170,"data":14},{"runtimeID":1408,"name":"minecraft:hay_block","id":170,"data":15},{"runtimeID":1409,"name":"minecraft:carpet","id":171,"data":0},{"runtimeID":1410,"name":"minecraft:carpet","id":171,"data":1},{"runtimeID":1411,"name":"minecraft:carpet","id":171,"data":2},{"runtimeID":1412,"name":"minecraft:carpet","id":171,"data":3},{"runtimeID":1413,"name":"minecraft:carpet","id":171,"data":4},{"runtimeID":1414,"name":"minecraft:carpet","id":171,"data":5},{"runtimeID":1415,"name":"minecraft:carpet","id":171,"data":6},{"runtimeID":1416,"name":"minecraft:carpet","id":171,"data":7},{"runtimeID":1417,"name":"minecraft:carpet","id":171,"data":8},{"runtimeID":1418,"name":"minecraft:carpet","id":171,"data":9},{"runtimeID":1419,"name":"minecraft:carpet","id":171,"data":10},{"runtimeID":1420,"name":"minecraft:carpet","id":171,"data":11},{"runtimeID":1421,"name":"minecraft:carpet","id":171,"data":12},{"runtimeID":1422,"name":"minecraft:carpet","id":171,"data":13},{"runtimeID":1423,"name":"minecraft:carpet","id":171,"data":14},{"runtimeID":1424,"name":"minecraft:carpet","id":171,"data":15},{"runtimeID":1425,"name":"minecraft:hardened_clay","id":172,"data":0},{"runtimeID":1426,"name":"minecraft:coal_block","id":173,"data":0},{"runtimeID":1427,"name":"minecraft:packed_ice","id":174,"data":0},{"runtimeID":1428,"name":"minecraft:double_plant","id":175,"data":0},{"runtimeID":1429,"name":"minecraft:double_plant","id":175,"data":1},{"runtimeID":1430,"name":"minecraft:double_plant","id":175,"data":2},{"runtimeID":1431,"name":"minecraft:double_plant","id":175,"data":3},{"runtimeID":1432,"name":"minecraft:double_plant","id":175,"data":4},{"runtimeID":1433,"name":"minecraft:double_plant","id":175,"data":5},{"runtimeID":1434,"name":"minecraft:double_plant","id":175,"data":6},{"runtimeID":1435,"name":"minecraft:double_plant","id":175,"data":7},{"runtimeID":1436,"name":"minecraft:double_plant","id":175,"data":8},{"runtimeID":1437,"name":"minecraft:double_plant","id":175,"data":9},{"runtimeID":1438,"name":"minecraft:double_plant","id":175,"data":10},{"runtimeID":1439,"name":"minecraft:double_plant","id":175,"data":11},{"runtimeID":1440,"name":"minecraft:double_plant","id":175,"data":12},{"runtimeID":1441,"name":"minecraft:double_plant","id":175,"data":13},{"runtimeID":1442,"name":"minecraft:double_plant","id":175,"data":14},{"runtimeID":1443,"name":"minecraft:double_plant","id":175,"data":15},{"runtimeID":1444,"name":"minecraft:standing_banner","id":176,"data":0},{"runtimeID":1445,"name":"minecraft:standing_banner","id":176,"data":1},{"runtimeID":1446,"name":"minecraft:standing_banner","id":176,"data":2},{"runtimeID":1447,"name":"minecraft:standing_banner","id":176,"data":3},{"runtimeID":1448,"name":"minecraft:standing_banner","id":176,"data":4},{"runtimeID":1449,"name":"minecraft:standing_banner","id":176,"data":5},{"runtimeID":1450,"name":"minecraft:standing_banner","id":176,"data":6},{"runtimeID":1451,"name":"minecraft:standing_banner","id":176,"data":7},{"runtimeID":1452,"name":"minecraft:standing_banner","id":176,"data":8},{"runtimeID":1453,"name":"minecraft:standing_banner","id":176,"data":9},{"runtimeID":1454,"name":"minecraft:standing_banner","id":176,"data":10},{"runtimeID":1455,"name":"minecraft:standing_banner","id":176,"data":11},{"runtimeID":1456,"name":"minecraft:standing_banner","id":176,"data":12},{"runtimeID":1457,"name":"minecraft:standing_banner","id":176,"data":13},{"runtimeID":1458,"name":"minecraft:standing_banner","id":176,"data":14},{"runtimeID":1459,"name":"minecraft:standing_banner","id":176,"data":15},{"runtimeID":1460,"name":"minecraft:wall_banner","id":177,"data":0},{"runtimeID":1461,"name":"minecraft:wall_banner","id":177,"data":1},{"runtimeID":1462,"name":"minecraft:wall_banner","id":177,"data":2},{"runtimeID":1463,"name":"minecraft:wall_banner","id":177,"data":3},{"runtimeID":1464,"name":"minecraft:wall_banner","id":177,"data":4},{"runtimeID":1465,"name":"minecraft:wall_banner","id":177,"data":5},{"runtimeID":1466,"name":"minecraft:wall_banner","id":177,"data":6},{"runtimeID":1467,"name":"minecraft:wall_banner","id":177,"data":7},{"runtimeID":1468,"name":"minecraft:daylight_detector_inverted","id":178,"data":0},{"runtimeID":1469,"name":"minecraft:daylight_detector_inverted","id":178,"data":1},{"runtimeID":1470,"name":"minecraft:daylight_detector_inverted","id":178,"data":2},{"runtimeID":1471,"name":"minecraft:daylight_detector_inverted","id":178,"data":3},{"runtimeID":1472,"name":"minecraft:daylight_detector_inverted","id":178,"data":4},{"runtimeID":1473,"name":"minecraft:daylight_detector_inverted","id":178,"data":5},{"runtimeID":1474,"name":"minecraft:daylight_detector_inverted","id":178,"data":6},{"runtimeID":1475,"name":"minecraft:daylight_detector_inverted","id":178,"data":7},{"runtimeID":1476,"name":"minecraft:daylight_detector_inverted","id":178,"data":8},{"runtimeID":1477,"name":"minecraft:daylight_detector_inverted","id":178,"data":9},{"runtimeID":1478,"name":"minecraft:daylight_detector_inverted","id":178,"data":10},{"runtimeID":1479,"name":"minecraft:daylight_detector_inverted","id":178,"data":11},{"runtimeID":1480,"name":"minecraft:daylight_detector_inverted","id":178,"data":12},{"runtimeID":1481,"name":"minecraft:daylight_detector_inverted","id":178,"data":13},{"runtimeID":1482,"name":"minecraft:daylight_detector_inverted","id":178,"data":14},{"runtimeID":1483,"name":"minecraft:daylight_detector_inverted","id":178,"data":15},{"runtimeID":1484,"name":"minecraft:red_sandstone","id":179,"data":0},{"runtimeID":1485,"name":"minecraft:red_sandstone","id":179,"data":1},{"runtimeID":1486,"name":"minecraft:red_sandstone","id":179,"data":2},{"runtimeID":1487,"name":"minecraft:red_sandstone","id":179,"data":3},{"runtimeID":1488,"name":"minecraft:red_sandstone_stairs","id":180,"data":0},{"runtimeID":1489,"name":"minecraft:red_sandstone_stairs","id":180,"data":1},{"runtimeID":1490,"name":"minecraft:red_sandstone_stairs","id":180,"data":2},{"runtimeID":1491,"name":"minecraft:red_sandstone_stairs","id":180,"data":3},{"runtimeID":1492,"name":"minecraft:red_sandstone_stairs","id":180,"data":4},{"runtimeID":1493,"name":"minecraft:red_sandstone_stairs","id":180,"data":5},{"runtimeID":1494,"name":"minecraft:red_sandstone_stairs","id":180,"data":6},{"runtimeID":1495,"name":"minecraft:red_sandstone_stairs","id":180,"data":7},{"runtimeID":1496,"name":"minecraft:double_stone_slab2","id":181,"data":0},{"runtimeID":1497,"name":"minecraft:double_stone_slab2","id":181,"data":1},{"runtimeID":1498,"name":"minecraft:double_stone_slab2","id":181,"data":2},{"runtimeID":1499,"name":"minecraft:double_stone_slab2","id":181,"data":3},{"runtimeID":1500,"name":"minecraft:double_stone_slab2","id":181,"data":4},{"runtimeID":1501,"name":"minecraft:double_stone_slab2","id":181,"data":5},{"runtimeID":1502,"name":"minecraft:double_stone_slab2","id":181,"data":6},{"runtimeID":1503,"name":"minecraft:double_stone_slab2","id":181,"data":7},{"runtimeID":1504,"name":"minecraft:double_stone_slab2","id":181,"data":8},{"runtimeID":1505,"name":"minecraft:double_stone_slab2","id":181,"data":9},{"runtimeID":1506,"name":"minecraft:double_stone_slab2","id":181,"data":10},{"runtimeID":1507,"name":"minecraft:double_stone_slab2","id":181,"data":11},{"runtimeID":1508,"name":"minecraft:double_stone_slab2","id":181,"data":12},{"runtimeID":1509,"name":"minecraft:double_stone_slab2","id":181,"data":13},{"runtimeID":1510,"name":"minecraft:double_stone_slab2","id":181,"data":14},{"runtimeID":1511,"name":"minecraft:double_stone_slab2","id":181,"data":15},{"runtimeID":1512,"name":"minecraft:stone_slab2","id":182,"data":0},{"runtimeID":1513,"name":"minecraft:stone_slab2","id":182,"data":1},{"runtimeID":1514,"name":"minecraft:stone_slab2","id":182,"data":2},{"runtimeID":1515,"name":"minecraft:stone_slab2","id":182,"data":3},{"runtimeID":1516,"name":"minecraft:stone_slab2","id":182,"data":4},{"runtimeID":1517,"name":"minecraft:stone_slab2","id":182,"data":5},{"runtimeID":1518,"name":"minecraft:stone_slab2","id":182,"data":6},{"runtimeID":1519,"name":"minecraft:stone_slab2","id":182,"data":7},{"runtimeID":1520,"name":"minecraft:stone_slab2","id":182,"data":8},{"runtimeID":1521,"name":"minecraft:stone_slab2","id":182,"data":9},{"runtimeID":1522,"name":"minecraft:stone_slab2","id":182,"data":10},{"runtimeID":1523,"name":"minecraft:stone_slab2","id":182,"data":11},{"runtimeID":1524,"name":"minecraft:stone_slab2","id":182,"data":12},{"runtimeID":1525,"name":"minecraft:stone_slab2","id":182,"data":13},{"runtimeID":1526,"name":"minecraft:stone_slab2","id":182,"data":14},{"runtimeID":1527,"name":"minecraft:stone_slab2","id":182,"data":15},{"runtimeID":1528,"name":"minecraft:spruce_fence_gate","id":183,"data":0},{"runtimeID":1529,"name":"minecraft:spruce_fence_gate","id":183,"data":1},{"runtimeID":1530,"name":"minecraft:spruce_fence_gate","id":183,"data":2},{"runtimeID":1531,"name":"minecraft:spruce_fence_gate","id":183,"data":3},{"runtimeID":1532,"name":"minecraft:spruce_fence_gate","id":183,"data":4},{"runtimeID":1533,"name":"minecraft:spruce_fence_gate","id":183,"data":5},{"runtimeID":1534,"name":"minecraft:spruce_fence_gate","id":183,"data":6},{"runtimeID":1535,"name":"minecraft:spruce_fence_gate","id":183,"data":7},{"runtimeID":1536,"name":"minecraft:spruce_fence_gate","id":183,"data":8},{"runtimeID":1537,"name":"minecraft:spruce_fence_gate","id":183,"data":9},{"runtimeID":1538,"name":"minecraft:spruce_fence_gate","id":183,"data":10},{"runtimeID":1539,"name":"minecraft:spruce_fence_gate","id":183,"data":11},{"runtimeID":1540,"name":"minecraft:spruce_fence_gate","id":183,"data":12},{"runtimeID":1541,"name":"minecraft:spruce_fence_gate","id":183,"data":13},{"runtimeID":1542,"name":"minecraft:spruce_fence_gate","id":183,"data":14},{"runtimeID":1543,"name":"minecraft:spruce_fence_gate","id":183,"data":15},{"runtimeID":1544,"name":"minecraft:birch_fence_gate","id":184,"data":0},{"runtimeID":1545,"name":"minecraft:birch_fence_gate","id":184,"data":1},{"runtimeID":1546,"name":"minecraft:birch_fence_gate","id":184,"data":2},{"runtimeID":1547,"name":"minecraft:birch_fence_gate","id":184,"data":3},{"runtimeID":1548,"name":"minecraft:birch_fence_gate","id":184,"data":4},{"runtimeID":1549,"name":"minecraft:birch_fence_gate","id":184,"data":5},{"runtimeID":1550,"name":"minecraft:birch_fence_gate","id":184,"data":6},{"runtimeID":1551,"name":"minecraft:birch_fence_gate","id":184,"data":7},{"runtimeID":1552,"name":"minecraft:birch_fence_gate","id":184,"data":8},{"runtimeID":1553,"name":"minecraft:birch_fence_gate","id":184,"data":9},{"runtimeID":1554,"name":"minecraft:birch_fence_gate","id":184,"data":10},{"runtimeID":1555,"name":"minecraft:birch_fence_gate","id":184,"data":11},{"runtimeID":1556,"name":"minecraft:birch_fence_gate","id":184,"data":12},{"runtimeID":1557,"name":"minecraft:birch_fence_gate","id":184,"data":13},{"runtimeID":1558,"name":"minecraft:birch_fence_gate","id":184,"data":14},{"runtimeID":1559,"name":"minecraft:birch_fence_gate","id":184,"data":15},{"runtimeID":1560,"name":"minecraft:jungle_fence_gate","id":185,"data":0},{"runtimeID":1561,"name":"minecraft:jungle_fence_gate","id":185,"data":1},{"runtimeID":1562,"name":"minecraft:jungle_fence_gate","id":185,"data":2},{"runtimeID":1563,"name":"minecraft:jungle_fence_gate","id":185,"data":3},{"runtimeID":1564,"name":"minecraft:jungle_fence_gate","id":185,"data":4},{"runtimeID":1565,"name":"minecraft:jungle_fence_gate","id":185,"data":5},{"runtimeID":1566,"name":"minecraft:jungle_fence_gate","id":185,"data":6},{"runtimeID":1567,"name":"minecraft:jungle_fence_gate","id":185,"data":7},{"runtimeID":1568,"name":"minecraft:jungle_fence_gate","id":185,"data":8},{"runtimeID":1569,"name":"minecraft:jungle_fence_gate","id":185,"data":9},{"runtimeID":1570,"name":"minecraft:jungle_fence_gate","id":185,"data":10},{"runtimeID":1571,"name":"minecraft:jungle_fence_gate","id":185,"data":11},{"runtimeID":1572,"name":"minecraft:jungle_fence_gate","id":185,"data":12},{"runtimeID":1573,"name":"minecraft:jungle_fence_gate","id":185,"data":13},{"runtimeID":1574,"name":"minecraft:jungle_fence_gate","id":185,"data":14},{"runtimeID":1575,"name":"minecraft:jungle_fence_gate","id":185,"data":15},{"runtimeID":1576,"name":"minecraft:dark_oak_fence_gate","id":186,"data":0},{"runtimeID":1577,"name":"minecraft:dark_oak_fence_gate","id":186,"data":1},{"runtimeID":1578,"name":"minecraft:dark_oak_fence_gate","id":186,"data":2},{"runtimeID":1579,"name":"minecraft:dark_oak_fence_gate","id":186,"data":3},{"runtimeID":1580,"name":"minecraft:dark_oak_fence_gate","id":186,"data":4},{"runtimeID":1581,"name":"minecraft:dark_oak_fence_gate","id":186,"data":5},{"runtimeID":1582,"name":"minecraft:dark_oak_fence_gate","id":186,"data":6},{"runtimeID":1583,"name":"minecraft:dark_oak_fence_gate","id":186,"data":7},{"runtimeID":1584,"name":"minecraft:dark_oak_fence_gate","id":186,"data":8},{"runtimeID":1585,"name":"minecraft:dark_oak_fence_gate","id":186,"data":9},{"runtimeID":1586,"name":"minecraft:dark_oak_fence_gate","id":186,"data":10},{"runtimeID":1587,"name":"minecraft:dark_oak_fence_gate","id":186,"data":11},{"runtimeID":1588,"name":"minecraft:dark_oak_fence_gate","id":186,"data":12},{"runtimeID":1589,"name":"minecraft:dark_oak_fence_gate","id":186,"data":13},{"runtimeID":1590,"name":"minecraft:dark_oak_fence_gate","id":186,"data":14},{"runtimeID":1591,"name":"minecraft:dark_oak_fence_gate","id":186,"data":15},{"runtimeID":1592,"name":"minecraft:acacia_fence_gate","id":187,"data":0},{"runtimeID":1593,"name":"minecraft:acacia_fence_gate","id":187,"data":1},{"runtimeID":1594,"name":"minecraft:acacia_fence_gate","id":187,"data":2},{"runtimeID":1595,"name":"minecraft:acacia_fence_gate","id":187,"data":3},{"runtimeID":1596,"name":"minecraft:acacia_fence_gate","id":187,"data":4},{"runtimeID":1597,"name":"minecraft:acacia_fence_gate","id":187,"data":5},{"runtimeID":1598,"name":"minecraft:acacia_fence_gate","id":187,"data":6},{"runtimeID":1599,"name":"minecraft:acacia_fence_gate","id":187,"data":7},{"runtimeID":1600,"name":"minecraft:acacia_fence_gate","id":187,"data":8},{"runtimeID":1601,"name":"minecraft:acacia_fence_gate","id":187,"data":9},{"runtimeID":1602,"name":"minecraft:acacia_fence_gate","id":187,"data":10},{"runtimeID":1603,"name":"minecraft:acacia_fence_gate","id":187,"data":11},{"runtimeID":1604,"name":"minecraft:acacia_fence_gate","id":187,"data":12},{"runtimeID":1605,"name":"minecraft:acacia_fence_gate","id":187,"data":13},{"runtimeID":1606,"name":"minecraft:acacia_fence_gate","id":187,"data":14},{"runtimeID":1607,"name":"minecraft:acacia_fence_gate","id":187,"data":15},{"runtimeID":1608,"name":"minecraft:repeating_command_block","id":188,"data":0},{"runtimeID":1609,"name":"minecraft:repeating_command_block","id":188,"data":1},{"runtimeID":1610,"name":"minecraft:repeating_command_block","id":188,"data":2},{"runtimeID":1611,"name":"minecraft:repeating_command_block","id":188,"data":3},{"runtimeID":1612,"name":"minecraft:repeating_command_block","id":188,"data":4},{"runtimeID":1613,"name":"minecraft:repeating_command_block","id":188,"data":5},{"runtimeID":1614,"name":"minecraft:repeating_command_block","id":188,"data":6},{"runtimeID":1615,"name":"minecraft:repeating_command_block","id":188,"data":7},{"runtimeID":1616,"name":"minecraft:repeating_command_block","id":188,"data":8},{"runtimeID":1617,"name":"minecraft:repeating_command_block","id":188,"data":9},{"runtimeID":1618,"name":"minecraft:repeating_command_block","id":188,"data":10},{"runtimeID":1619,"name":"minecraft:repeating_command_block","id":188,"data":11},{"runtimeID":1620,"name":"minecraft:repeating_command_block","id":188,"data":12},{"runtimeID":1621,"name":"minecraft:repeating_command_block","id":188,"data":13},{"runtimeID":1622,"name":"minecraft:repeating_command_block","id":188,"data":14},{"runtimeID":1623,"name":"minecraft:repeating_command_block","id":188,"data":15},{"runtimeID":1624,"name":"minecraft:chain_command_block","id":189,"data":0},{"runtimeID":1625,"name":"minecraft:chain_command_block","id":189,"data":1},{"runtimeID":1626,"name":"minecraft:chain_command_block","id":189,"data":2},{"runtimeID":1627,"name":"minecraft:chain_command_block","id":189,"data":3},{"runtimeID":1628,"name":"minecraft:chain_command_block","id":189,"data":4},{"runtimeID":1629,"name":"minecraft:chain_command_block","id":189,"data":5},{"runtimeID":1630,"name":"minecraft:chain_command_block","id":189,"data":6},{"runtimeID":1631,"name":"minecraft:chain_command_block","id":189,"data":7},{"runtimeID":1632,"name":"minecraft:chain_command_block","id":189,"data":8},{"runtimeID":1633,"name":"minecraft:chain_command_block","id":189,"data":9},{"runtimeID":1634,"name":"minecraft:chain_command_block","id":189,"data":10},{"runtimeID":1635,"name":"minecraft:chain_command_block","id":189,"data":11},{"runtimeID":1636,"name":"minecraft:chain_command_block","id":189,"data":12},{"runtimeID":1637,"name":"minecraft:chain_command_block","id":189,"data":13},{"runtimeID":1638,"name":"minecraft:chain_command_block","id":189,"data":14},{"runtimeID":1639,"name":"minecraft:chain_command_block","id":189,"data":15},{"runtimeID":1643,"name":"minecraft:spruce_door","id":193,"data":0},{"runtimeID":1644,"name":"minecraft:spruce_door","id":193,"data":1},{"runtimeID":1645,"name":"minecraft:spruce_door","id":193,"data":2},{"runtimeID":1646,"name":"minecraft:spruce_door","id":193,"data":3},{"runtimeID":1647,"name":"minecraft:spruce_door","id":193,"data":4},{"runtimeID":1648,"name":"minecraft:spruce_door","id":193,"data":5},{"runtimeID":1649,"name":"minecraft:spruce_door","id":193,"data":6},{"runtimeID":1650,"name":"minecraft:spruce_door","id":193,"data":7},{"runtimeID":1651,"name":"minecraft:spruce_door","id":193,"data":8},{"runtimeID":1652,"name":"minecraft:spruce_door","id":193,"data":9},{"runtimeID":1653,"name":"minecraft:spruce_door","id":193,"data":10},{"runtimeID":1654,"name":"minecraft:spruce_door","id":193,"data":11},{"runtimeID":1655,"name":"minecraft:spruce_door","id":193,"data":12},{"runtimeID":1656,"name":"minecraft:spruce_door","id":193,"data":13},{"runtimeID":1657,"name":"minecraft:spruce_door","id":193,"data":14},{"runtimeID":1658,"name":"minecraft:spruce_door","id":193,"data":15},{"runtimeID":1659,"name":"minecraft:birch_door","id":194,"data":0},{"runtimeID":1660,"name":"minecraft:birch_door","id":194,"data":1},{"runtimeID":1661,"name":"minecraft:birch_door","id":194,"data":2},{"runtimeID":1662,"name":"minecraft:birch_door","id":194,"data":3},{"runtimeID":1663,"name":"minecraft:birch_door","id":194,"data":4},{"runtimeID":1664,"name":"minecraft:birch_door","id":194,"data":5},{"runtimeID":1665,"name":"minecraft:birch_door","id":194,"data":6},{"runtimeID":1666,"name":"minecraft:birch_door","id":194,"data":7},{"runtimeID":1667,"name":"minecraft:birch_door","id":194,"data":8},{"runtimeID":1668,"name":"minecraft:birch_door","id":194,"data":9},{"runtimeID":1669,"name":"minecraft:birch_door","id":194,"data":10},{"runtimeID":1670,"name":"minecraft:birch_door","id":194,"data":11},{"runtimeID":1671,"name":"minecraft:birch_door","id":194,"data":12},{"runtimeID":1672,"name":"minecraft:birch_door","id":194,"data":13},{"runtimeID":1673,"name":"minecraft:birch_door","id":194,"data":14},{"runtimeID":1674,"name":"minecraft:birch_door","id":194,"data":15},{"runtimeID":1675,"name":"minecraft:jungle_door","id":195,"data":0},{"runtimeID":1676,"name":"minecraft:jungle_door","id":195,"data":1},{"runtimeID":1677,"name":"minecraft:jungle_door","id":195,"data":2},{"runtimeID":1678,"name":"minecraft:jungle_door","id":195,"data":3},{"runtimeID":1679,"name":"minecraft:jungle_door","id":195,"data":4},{"runtimeID":1680,"name":"minecraft:jungle_door","id":195,"data":5},{"runtimeID":1681,"name":"minecraft:jungle_door","id":195,"data":6},{"runtimeID":1682,"name":"minecraft:jungle_door","id":195,"data":7},{"runtimeID":1683,"name":"minecraft:jungle_door","id":195,"data":8},{"runtimeID":1684,"name":"minecraft:jungle_door","id":195,"data":9},{"runtimeID":1685,"name":"minecraft:jungle_door","id":195,"data":10},{"runtimeID":1686,"name":"minecraft:jungle_door","id":195,"data":11},{"runtimeID":1687,"name":"minecraft:jungle_door","id":195,"data":12},{"runtimeID":1688,"name":"minecraft:jungle_door","id":195,"data":13},{"runtimeID":1689,"name":"minecraft:jungle_door","id":195,"data":14},{"runtimeID":1690,"name":"minecraft:jungle_door","id":195,"data":15},{"runtimeID":1691,"name":"minecraft:acacia_door","id":196,"data":0},{"runtimeID":1692,"name":"minecraft:acacia_door","id":196,"data":1},{"runtimeID":1693,"name":"minecraft:acacia_door","id":196,"data":2},{"runtimeID":1694,"name":"minecraft:acacia_door","id":196,"data":3},{"runtimeID":1695,"name":"minecraft:acacia_door","id":196,"data":4},{"runtimeID":1696,"name":"minecraft:acacia_door","id":196,"data":5},{"runtimeID":1697,"name":"minecraft:acacia_door","id":196,"data":6},{"runtimeID":1698,"name":"minecraft:acacia_door","id":196,"data":7},{"runtimeID":1699,"name":"minecraft:acacia_door","id":196,"data":8},{"runtimeID":1700,"name":"minecraft:acacia_door","id":196,"data":9},{"runtimeID":1701,"name":"minecraft:acacia_door","id":196,"data":10},{"runtimeID":1702,"name":"minecraft:acacia_door","id":196,"data":11},{"runtimeID":1703,"name":"minecraft:acacia_door","id":196,"data":12},{"runtimeID":1704,"name":"minecraft:acacia_door","id":196,"data":13},{"runtimeID":1705,"name":"minecraft:acacia_door","id":196,"data":14},{"runtimeID":1706,"name":"minecraft:acacia_door","id":196,"data":15},{"runtimeID":1707,"name":"minecraft:dark_oak_door","id":197,"data":0},{"runtimeID":1708,"name":"minecraft:dark_oak_door","id":197,"data":1},{"runtimeID":1709,"name":"minecraft:dark_oak_door","id":197,"data":2},{"runtimeID":1710,"name":"minecraft:dark_oak_door","id":197,"data":3},{"runtimeID":1711,"name":"minecraft:dark_oak_door","id":197,"data":4},{"runtimeID":1712,"name":"minecraft:dark_oak_door","id":197,"data":5},{"runtimeID":1713,"name":"minecraft:dark_oak_door","id":197,"data":6},{"runtimeID":1714,"name":"minecraft:dark_oak_door","id":197,"data":7},{"runtimeID":1715,"name":"minecraft:dark_oak_door","id":197,"data":8},{"runtimeID":1716,"name":"minecraft:dark_oak_door","id":197,"data":9},{"runtimeID":1717,"name":"minecraft:dark_oak_door","id":197,"data":10},{"runtimeID":1718,"name":"minecraft:dark_oak_door","id":197,"data":11},{"runtimeID":1719,"name":"minecraft:dark_oak_door","id":197,"data":12},{"runtimeID":1720,"name":"minecraft:dark_oak_door","id":197,"data":13},{"runtimeID":1721,"name":"minecraft:dark_oak_door","id":197,"data":14},{"runtimeID":1722,"name":"minecraft:dark_oak_door","id":197,"data":15},{"runtimeID":1723,"name":"minecraft:grass_path","id":198,"data":0},{"runtimeID":1724,"name":"minecraft:frame","id":199,"data":0},{"runtimeID":1725,"name":"minecraft:frame","id":199,"data":1},{"runtimeID":1726,"name":"minecraft:frame","id":199,"data":2},{"runtimeID":1727,"name":"minecraft:frame","id":199,"data":3},{"runtimeID":1728,"name":"minecraft:chorus_flower","id":200,"data":0},{"runtimeID":1729,"name":"minecraft:chorus_flower","id":200,"data":1},{"runtimeID":1730,"name":"minecraft:chorus_flower","id":200,"data":2},{"runtimeID":1731,"name":"minecraft:chorus_flower","id":200,"data":3},{"runtimeID":1732,"name":"minecraft:chorus_flower","id":200,"data":4},{"runtimeID":1733,"name":"minecraft:chorus_flower","id":200,"data":5},{"runtimeID":1734,"name":"minecraft:chorus_flower","id":200,"data":6},{"runtimeID":1735,"name":"minecraft:chorus_flower","id":200,"data":7},{"runtimeID":1736,"name":"minecraft:purpur_block","id":201,"data":0},{"runtimeID":1737,"name":"minecraft:purpur_block","id":201,"data":1},{"runtimeID":1738,"name":"minecraft:purpur_block","id":201,"data":2},{"runtimeID":1739,"name":"minecraft:purpur_block","id":201,"data":3},{"runtimeID":1740,"name":"minecraft:purpur_block","id":201,"data":4},{"runtimeID":1741,"name":"minecraft:purpur_block","id":201,"data":5},{"runtimeID":1742,"name":"minecraft:purpur_block","id":201,"data":6},{"runtimeID":1743,"name":"minecraft:purpur_block","id":201,"data":7},{"runtimeID":1744,"name":"minecraft:purpur_block","id":201,"data":8},{"runtimeID":1745,"name":"minecraft:purpur_block","id":201,"data":9},{"runtimeID":1746,"name":"minecraft:purpur_block","id":201,"data":10},{"runtimeID":1747,"name":"minecraft:purpur_block","id":201,"data":11},{"runtimeID":1748,"name":"minecraft:purpur_block","id":201,"data":12},{"runtimeID":1749,"name":"minecraft:purpur_block","id":201,"data":13},{"runtimeID":1750,"name":"minecraft:purpur_block","id":201,"data":14},{"runtimeID":1751,"name":"minecraft:purpur_block","id":201,"data":15},{"runtimeID":1753,"name":"minecraft:purpur_stairs","id":203,"data":0},{"runtimeID":1754,"name":"minecraft:purpur_stairs","id":203,"data":1},{"runtimeID":1755,"name":"minecraft:purpur_stairs","id":203,"data":2},{"runtimeID":1756,"name":"minecraft:purpur_stairs","id":203,"data":3},{"runtimeID":1757,"name":"minecraft:purpur_stairs","id":203,"data":4},{"runtimeID":1758,"name":"minecraft:purpur_stairs","id":203,"data":5},{"runtimeID":1759,"name":"minecraft:purpur_stairs","id":203,"data":6},{"runtimeID":1760,"name":"minecraft:purpur_stairs","id":203,"data":7},{"runtimeID":1762,"name":"minecraft:undyed_shulker_box","id":205,"data":0},{"runtimeID":1763,"name":"minecraft:end_bricks","id":206,"data":0},{"runtimeID":1764,"name":"minecraft:frosted_ice","id":207,"data":0},{"runtimeID":1765,"name":"minecraft:frosted_ice","id":207,"data":1},{"runtimeID":1766,"name":"minecraft:frosted_ice","id":207,"data":2},{"runtimeID":1767,"name":"minecraft:frosted_ice","id":207,"data":3},{"runtimeID":1768,"name":"minecraft:end_rod","id":208,"data":0},{"runtimeID":1769,"name":"minecraft:end_rod","id":208,"data":1},{"runtimeID":1770,"name":"minecraft:end_rod","id":208,"data":2},{"runtimeID":1771,"name":"minecraft:end_rod","id":208,"data":3},{"runtimeID":1772,"name":"minecraft:end_rod","id":208,"data":4},{"runtimeID":1773,"name":"minecraft:end_rod","id":208,"data":5},{"runtimeID":1774,"name":"minecraft:end_rod","id":208,"data":6},{"runtimeID":1775,"name":"minecraft:end_rod","id":208,"data":7},{"runtimeID":1776,"name":"minecraft:end_gateway","id":209,"data":0},{"runtimeID":1780,"name":"minecraft:magma","id":213,"data":0},{"runtimeID":1781,"name":"minecraft:nether_wart_block","id":214,"data":0},{"runtimeID":1782,"name":"minecraft:red_nether_brick","id":215,"data":0},{"runtimeID":1783,"name":"minecraft:bone_block","id":216,"data":0},{"runtimeID":1784,"name":"minecraft:bone_block","id":216,"data":1},{"runtimeID":1785,"name":"minecraft:bone_block","id":216,"data":2},{"runtimeID":1786,"name":"minecraft:bone_block","id":216,"data":3},{"runtimeID":1787,"name":"minecraft:bone_block","id":216,"data":4},{"runtimeID":1788,"name":"minecraft:bone_block","id":216,"data":5},{"runtimeID":1789,"name":"minecraft:bone_block","id":216,"data":6},{"runtimeID":1790,"name":"minecraft:bone_block","id":216,"data":7},{"runtimeID":1791,"name":"minecraft:bone_block","id":216,"data":8},{"runtimeID":1792,"name":"minecraft:bone_block","id":216,"data":9},{"runtimeID":1793,"name":"minecraft:bone_block","id":216,"data":10},{"runtimeID":1794,"name":"minecraft:bone_block","id":216,"data":11},{"runtimeID":1795,"name":"minecraft:bone_block","id":216,"data":12},{"runtimeID":1796,"name":"minecraft:bone_block","id":216,"data":13},{"runtimeID":1797,"name":"minecraft:bone_block","id":216,"data":14},{"runtimeID":1798,"name":"minecraft:bone_block","id":216,"data":15},{"runtimeID":1800,"name":"minecraft:shulker_box","id":218,"data":0},{"runtimeID":1801,"name":"minecraft:shulker_box","id":218,"data":1},{"runtimeID":1802,"name":"minecraft:shulker_box","id":218,"data":2},{"runtimeID":1803,"name":"minecraft:shulker_box","id":218,"data":3},{"runtimeID":1804,"name":"minecraft:shulker_box","id":218,"data":4},{"runtimeID":1805,"name":"minecraft:shulker_box","id":218,"data":5},{"runtimeID":1806,"name":"minecraft:shulker_box","id":218,"data":6},{"runtimeID":1807,"name":"minecraft:shulker_box","id":218,"data":7},{"runtimeID":1808,"name":"minecraft:shulker_box","id":218,"data":8},{"runtimeID":1809,"name":"minecraft:shulker_box","id":218,"data":9},{"runtimeID":1810,"name":"minecraft:shulker_box","id":218,"data":10},{"runtimeID":1811,"name":"minecraft:shulker_box","id":218,"data":11},{"runtimeID":1812,"name":"minecraft:shulker_box","id":218,"data":12},{"runtimeID":1813,"name":"minecraft:shulker_box","id":218,"data":13},{"runtimeID":1814,"name":"minecraft:shulker_box","id":218,"data":14},{"runtimeID":1815,"name":"minecraft:shulker_box","id":218,"data":15},{"runtimeID":1816,"name":"minecraft:purple_glazed_terracotta","id":219,"data":0},{"runtimeID":1817,"name":"minecraft:purple_glazed_terracotta","id":219,"data":1},{"runtimeID":1818,"name":"minecraft:purple_glazed_terracotta","id":219,"data":2},{"runtimeID":1819,"name":"minecraft:purple_glazed_terracotta","id":219,"data":3},{"runtimeID":1820,"name":"minecraft:purple_glazed_terracotta","id":219,"data":4},{"runtimeID":1821,"name":"minecraft:purple_glazed_terracotta","id":219,"data":5},{"runtimeID":1822,"name":"minecraft:purple_glazed_terracotta","id":219,"data":6},{"runtimeID":1823,"name":"minecraft:purple_glazed_terracotta","id":219,"data":7},{"runtimeID":1824,"name":"minecraft:white_glazed_terracotta","id":220,"data":0},{"runtimeID":1825,"name":"minecraft:white_glazed_terracotta","id":220,"data":1},{"runtimeID":1826,"name":"minecraft:white_glazed_terracotta","id":220,"data":2},{"runtimeID":1827,"name":"minecraft:white_glazed_terracotta","id":220,"data":3},{"runtimeID":1828,"name":"minecraft:white_glazed_terracotta","id":220,"data":4},{"runtimeID":1829,"name":"minecraft:white_glazed_terracotta","id":220,"data":5},{"runtimeID":1830,"name":"minecraft:white_glazed_terracotta","id":220,"data":6},{"runtimeID":1831,"name":"minecraft:white_glazed_terracotta","id":220,"data":7},{"runtimeID":1832,"name":"minecraft:orange_glazed_terracotta","id":221,"data":0},{"runtimeID":1833,"name":"minecraft:orange_glazed_terracotta","id":221,"data":1},{"runtimeID":1834,"name":"minecraft:orange_glazed_terracotta","id":221,"data":2},{"runtimeID":1835,"name":"minecraft:orange_glazed_terracotta","id":221,"data":3},{"runtimeID":1836,"name":"minecraft:orange_glazed_terracotta","id":221,"data":4},{"runtimeID":1837,"name":"minecraft:orange_glazed_terracotta","id":221,"data":5},{"runtimeID":1838,"name":"minecraft:orange_glazed_terracotta","id":221,"data":6},{"runtimeID":1839,"name":"minecraft:orange_glazed_terracotta","id":221,"data":7},{"runtimeID":1840,"name":"minecraft:magenta_glazed_terracotta","id":222,"data":0},{"runtimeID":1841,"name":"minecraft:magenta_glazed_terracotta","id":222,"data":1},{"runtimeID":1842,"name":"minecraft:magenta_glazed_terracotta","id":222,"data":2},{"runtimeID":1843,"name":"minecraft:magenta_glazed_terracotta","id":222,"data":3},{"runtimeID":1844,"name":"minecraft:magenta_glazed_terracotta","id":222,"data":4},{"runtimeID":1845,"name":"minecraft:magenta_glazed_terracotta","id":222,"data":5},{"runtimeID":1846,"name":"minecraft:magenta_glazed_terracotta","id":222,"data":6},{"runtimeID":1847,"name":"minecraft:magenta_glazed_terracotta","id":222,"data":7},{"runtimeID":1848,"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":0},{"runtimeID":1849,"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":1},{"runtimeID":1850,"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":2},{"runtimeID":1851,"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":3},{"runtimeID":1852,"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":4},{"runtimeID":1853,"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":5},{"runtimeID":1854,"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":6},{"runtimeID":1855,"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":7},{"runtimeID":1856,"name":"minecraft:yellow_glazed_terracotta","id":224,"data":0},{"runtimeID":1857,"name":"minecraft:yellow_glazed_terracotta","id":224,"data":1},{"runtimeID":1858,"name":"minecraft:yellow_glazed_terracotta","id":224,"data":2},{"runtimeID":1859,"name":"minecraft:yellow_glazed_terracotta","id":224,"data":3},{"runtimeID":1860,"name":"minecraft:yellow_glazed_terracotta","id":224,"data":4},{"runtimeID":1861,"name":"minecraft:yellow_glazed_terracotta","id":224,"data":5},{"runtimeID":1862,"name":"minecraft:yellow_glazed_terracotta","id":224,"data":6},{"runtimeID":1863,"name":"minecraft:yellow_glazed_terracotta","id":224,"data":7},{"runtimeID":1864,"name":"minecraft:lime_glazed_terracotta","id":225,"data":0},{"runtimeID":1865,"name":"minecraft:lime_glazed_terracotta","id":225,"data":1},{"runtimeID":1866,"name":"minecraft:lime_glazed_terracotta","id":225,"data":2},{"runtimeID":1867,"name":"minecraft:lime_glazed_terracotta","id":225,"data":3},{"runtimeID":1868,"name":"minecraft:lime_glazed_terracotta","id":225,"data":4},{"runtimeID":1869,"name":"minecraft:lime_glazed_terracotta","id":225,"data":5},{"runtimeID":1870,"name":"minecraft:lime_glazed_terracotta","id":225,"data":6},{"runtimeID":1871,"name":"minecraft:lime_glazed_terracotta","id":225,"data":7},{"runtimeID":1872,"name":"minecraft:pink_glazed_terracotta","id":226,"data":0},{"runtimeID":1873,"name":"minecraft:pink_glazed_terracotta","id":226,"data":1},{"runtimeID":1874,"name":"minecraft:pink_glazed_terracotta","id":226,"data":2},{"runtimeID":1875,"name":"minecraft:pink_glazed_terracotta","id":226,"data":3},{"runtimeID":1876,"name":"minecraft:pink_glazed_terracotta","id":226,"data":4},{"runtimeID":1877,"name":"minecraft:pink_glazed_terracotta","id":226,"data":5},{"runtimeID":1878,"name":"minecraft:pink_glazed_terracotta","id":226,"data":6},{"runtimeID":1879,"name":"minecraft:pink_glazed_terracotta","id":226,"data":7},{"runtimeID":1880,"name":"minecraft:gray_glazed_terracotta","id":227,"data":0},{"runtimeID":1881,"name":"minecraft:gray_glazed_terracotta","id":227,"data":1},{"runtimeID":1882,"name":"minecraft:gray_glazed_terracotta","id":227,"data":2},{"runtimeID":1883,"name":"minecraft:gray_glazed_terracotta","id":227,"data":3},{"runtimeID":1884,"name":"minecraft:gray_glazed_terracotta","id":227,"data":4},{"runtimeID":1885,"name":"minecraft:gray_glazed_terracotta","id":227,"data":5},{"runtimeID":1886,"name":"minecraft:gray_glazed_terracotta","id":227,"data":6},{"runtimeID":1887,"name":"minecraft:gray_glazed_terracotta","id":227,"data":7},{"runtimeID":1888,"name":"minecraft:silver_glazed_terracotta","id":228,"data":0},{"runtimeID":1889,"name":"minecraft:silver_glazed_terracotta","id":228,"data":1},{"runtimeID":1890,"name":"minecraft:silver_glazed_terracotta","id":228,"data":2},{"runtimeID":1891,"name":"minecraft:silver_glazed_terracotta","id":228,"data":3},{"runtimeID":1892,"name":"minecraft:silver_glazed_terracotta","id":228,"data":4},{"runtimeID":1893,"name":"minecraft:silver_glazed_terracotta","id":228,"data":5},{"runtimeID":1894,"name":"minecraft:silver_glazed_terracotta","id":228,"data":6},{"runtimeID":1895,"name":"minecraft:silver_glazed_terracotta","id":228,"data":7},{"runtimeID":1896,"name":"minecraft:cyan_glazed_terracotta","id":229,"data":0},{"runtimeID":1897,"name":"minecraft:cyan_glazed_terracotta","id":229,"data":1},{"runtimeID":1898,"name":"minecraft:cyan_glazed_terracotta","id":229,"data":2},{"runtimeID":1899,"name":"minecraft:cyan_glazed_terracotta","id":229,"data":3},{"runtimeID":1900,"name":"minecraft:cyan_glazed_terracotta","id":229,"data":4},{"runtimeID":1901,"name":"minecraft:cyan_glazed_terracotta","id":229,"data":5},{"runtimeID":1902,"name":"minecraft:cyan_glazed_terracotta","id":229,"data":6},{"runtimeID":1903,"name":"minecraft:cyan_glazed_terracotta","id":229,"data":7},{"runtimeID":1905,"name":"minecraft:blue_glazed_terracotta","id":231,"data":0},{"runtimeID":1906,"name":"minecraft:blue_glazed_terracotta","id":231,"data":1},{"runtimeID":1907,"name":"minecraft:blue_glazed_terracotta","id":231,"data":2},{"runtimeID":1908,"name":"minecraft:blue_glazed_terracotta","id":231,"data":3},{"runtimeID":1909,"name":"minecraft:blue_glazed_terracotta","id":231,"data":4},{"runtimeID":1910,"name":"minecraft:blue_glazed_terracotta","id":231,"data":5},{"runtimeID":1911,"name":"minecraft:blue_glazed_terracotta","id":231,"data":6},{"runtimeID":1912,"name":"minecraft:blue_glazed_terracotta","id":231,"data":7},{"runtimeID":1913,"name":"minecraft:brown_glazed_terracotta","id":232,"data":0},{"runtimeID":1914,"name":"minecraft:brown_glazed_terracotta","id":232,"data":1},{"runtimeID":1915,"name":"minecraft:brown_glazed_terracotta","id":232,"data":2},{"runtimeID":1916,"name":"minecraft:brown_glazed_terracotta","id":232,"data":3},{"runtimeID":1917,"name":"minecraft:brown_glazed_terracotta","id":232,"data":4},{"runtimeID":1918,"name":"minecraft:brown_glazed_terracotta","id":232,"data":5},{"runtimeID":1919,"name":"minecraft:brown_glazed_terracotta","id":232,"data":6},{"runtimeID":1920,"name":"minecraft:brown_glazed_terracotta","id":232,"data":7},{"runtimeID":1921,"name":"minecraft:green_glazed_terracotta","id":233,"data":0},{"runtimeID":1922,"name":"minecraft:green_glazed_terracotta","id":233,"data":1},{"runtimeID":1923,"name":"minecraft:green_glazed_terracotta","id":233,"data":2},{"runtimeID":1924,"name":"minecraft:green_glazed_terracotta","id":233,"data":3},{"runtimeID":1925,"name":"minecraft:green_glazed_terracotta","id":233,"data":4},{"runtimeID":1926,"name":"minecraft:green_glazed_terracotta","id":233,"data":5},{"runtimeID":1927,"name":"minecraft:green_glazed_terracotta","id":233,"data":6},{"runtimeID":1928,"name":"minecraft:green_glazed_terracotta","id":233,"data":7},{"runtimeID":1929,"name":"minecraft:red_glazed_terracotta","id":234,"data":0},{"runtimeID":1930,"name":"minecraft:red_glazed_terracotta","id":234,"data":1},{"runtimeID":1931,"name":"minecraft:red_glazed_terracotta","id":234,"data":2},{"runtimeID":1932,"name":"minecraft:red_glazed_terracotta","id":234,"data":3},{"runtimeID":1933,"name":"minecraft:red_glazed_terracotta","id":234,"data":4},{"runtimeID":1934,"name":"minecraft:red_glazed_terracotta","id":234,"data":5},{"runtimeID":1935,"name":"minecraft:red_glazed_terracotta","id":234,"data":6},{"runtimeID":1936,"name":"minecraft:red_glazed_terracotta","id":234,"data":7},{"runtimeID":1937,"name":"minecraft:black_glazed_terracotta","id":235,"data":0},{"runtimeID":1938,"name":"minecraft:black_glazed_terracotta","id":235,"data":1},{"runtimeID":1939,"name":"minecraft:black_glazed_terracotta","id":235,"data":2},{"runtimeID":1940,"name":"minecraft:black_glazed_terracotta","id":235,"data":3},{"runtimeID":1941,"name":"minecraft:black_glazed_terracotta","id":235,"data":4},{"runtimeID":1942,"name":"minecraft:black_glazed_terracotta","id":235,"data":5},{"runtimeID":1943,"name":"minecraft:black_glazed_terracotta","id":235,"data":6},{"runtimeID":1944,"name":"minecraft:black_glazed_terracotta","id":235,"data":7},{"runtimeID":1945,"name":"minecraft:concrete","id":236,"data":0},{"runtimeID":1946,"name":"minecraft:concrete","id":236,"data":1},{"runtimeID":1947,"name":"minecraft:concrete","id":236,"data":2},{"runtimeID":1948,"name":"minecraft:concrete","id":236,"data":3},{"runtimeID":1949,"name":"minecraft:concrete","id":236,"data":4},{"runtimeID":1950,"name":"minecraft:concrete","id":236,"data":5},{"runtimeID":1951,"name":"minecraft:concrete","id":236,"data":6},{"runtimeID":1952,"name":"minecraft:concrete","id":236,"data":7},{"runtimeID":1953,"name":"minecraft:concrete","id":236,"data":8},{"runtimeID":1954,"name":"minecraft:concrete","id":236,"data":9},{"runtimeID":1955,"name":"minecraft:concrete","id":236,"data":10},{"runtimeID":1956,"name":"minecraft:concrete","id":236,"data":11},{"runtimeID":1957,"name":"minecraft:concrete","id":236,"data":12},{"runtimeID":1958,"name":"minecraft:concrete","id":236,"data":13},{"runtimeID":1959,"name":"minecraft:concrete","id":236,"data":14},{"runtimeID":1960,"name":"minecraft:concrete","id":236,"data":15},{"runtimeID":1961,"name":"minecraft:concretePowder","id":237,"data":0},{"runtimeID":1962,"name":"minecraft:concretePowder","id":237,"data":1},{"runtimeID":1963,"name":"minecraft:concretePowder","id":237,"data":2},{"runtimeID":1964,"name":"minecraft:concretePowder","id":237,"data":3},{"runtimeID":1965,"name":"minecraft:concretePowder","id":237,"data":4},{"runtimeID":1966,"name":"minecraft:concretePowder","id":237,"data":5},{"runtimeID":1967,"name":"minecraft:concretePowder","id":237,"data":6},{"runtimeID":1968,"name":"minecraft:concretePowder","id":237,"data":7},{"runtimeID":1969,"name":"minecraft:concretePowder","id":237,"data":8},{"runtimeID":1970,"name":"minecraft:concretePowder","id":237,"data":9},{"runtimeID":1971,"name":"minecraft:concretePowder","id":237,"data":10},{"runtimeID":1972,"name":"minecraft:concretePowder","id":237,"data":11},{"runtimeID":1973,"name":"minecraft:concretePowder","id":237,"data":12},{"runtimeID":1974,"name":"minecraft:concretePowder","id":237,"data":13},{"runtimeID":1975,"name":"minecraft:concretePowder","id":237,"data":14},{"runtimeID":1976,"name":"minecraft:concretePowder","id":237,"data":15},{"runtimeID":1979,"name":"minecraft:chorus_plant","id":240,"data":0},{"runtimeID":1980,"name":"minecraft:stained_glass","id":241,"data":0},{"runtimeID":1981,"name":"minecraft:stained_glass","id":241,"data":1},{"runtimeID":1982,"name":"minecraft:stained_glass","id":241,"data":2},{"runtimeID":1983,"name":"minecraft:stained_glass","id":241,"data":3},{"runtimeID":1984,"name":"minecraft:stained_glass","id":241,"data":4},{"runtimeID":1985,"name":"minecraft:stained_glass","id":241,"data":5},{"runtimeID":1986,"name":"minecraft:stained_glass","id":241,"data":6},{"runtimeID":1987,"name":"minecraft:stained_glass","id":241,"data":7},{"runtimeID":1988,"name":"minecraft:stained_glass","id":241,"data":8},{"runtimeID":1989,"name":"minecraft:stained_glass","id":241,"data":9},{"runtimeID":1990,"name":"minecraft:stained_glass","id":241,"data":10},{"runtimeID":1991,"name":"minecraft:stained_glass","id":241,"data":11},{"runtimeID":1992,"name":"minecraft:stained_glass","id":241,"data":12},{"runtimeID":1993,"name":"minecraft:stained_glass","id":241,"data":13},{"runtimeID":1994,"name":"minecraft:stained_glass","id":241,"data":14},{"runtimeID":1995,"name":"minecraft:stained_glass","id":241,"data":15},{"runtimeID":1997,"name":"minecraft:podzol","id":243,"data":0},{"runtimeID":1998,"name":"minecraft:beetroot","id":244,"data":0},{"runtimeID":1999,"name":"minecraft:beetroot","id":244,"data":1},{"runtimeID":2000,"name":"minecraft:beetroot","id":244,"data":2},{"runtimeID":2001,"name":"minecraft:beetroot","id":244,"data":3},{"runtimeID":2002,"name":"minecraft:beetroot","id":244,"data":4},{"runtimeID":2003,"name":"minecraft:beetroot","id":244,"data":5},{"runtimeID":2004,"name":"minecraft:beetroot","id":244,"data":6},{"runtimeID":2005,"name":"minecraft:beetroot","id":244,"data":7},{"runtimeID":2006,"name":"minecraft:stonecutter","id":245,"data":0},{"runtimeID":2007,"name":"minecraft:glowingobsidian","id":246,"data":0},{"runtimeID":2008,"name":"minecraft:netherreactor","id":247,"data":0},{"runtimeID":2009,"name":"minecraft:info_update","id":248,"data":0},{"runtimeID":2010,"name":"minecraft:info_update2","id":249,"data":0},{"runtimeID":2011,"name":"minecraft:movingBlock","id":250,"data":0},{"runtimeID":2012,"name":"minecraft:observer","id":251,"data":0},{"runtimeID":2013,"name":"minecraft:observer","id":251,"data":1},{"runtimeID":2014,"name":"minecraft:observer","id":251,"data":2},{"runtimeID":2015,"name":"minecraft:observer","id":251,"data":3},{"runtimeID":2016,"name":"minecraft:observer","id":251,"data":4},{"runtimeID":2017,"name":"minecraft:observer","id":251,"data":5},{"runtimeID":2018,"name":"minecraft:observer","id":251,"data":6},{"runtimeID":2019,"name":"minecraft:observer","id":251,"data":7},{"runtimeID":2020,"name":"minecraft:observer","id":251,"data":8},{"runtimeID":2021,"name":"minecraft:observer","id":251,"data":9},{"runtimeID":2022,"name":"minecraft:observer","id":251,"data":10},{"runtimeID":2023,"name":"minecraft:observer","id":251,"data":11},{"runtimeID":2024,"name":"minecraft:observer","id":251,"data":12},{"runtimeID":2025,"name":"minecraft:observer","id":251,"data":13},{"runtimeID":2026,"name":"minecraft:observer","id":251,"data":14},{"runtimeID":2027,"name":"minecraft:observer","id":251,"data":15},{"runtimeID":2028,"name":"minecraft:structure_block","id":252,"data":0},{"runtimeID":2029,"name":"minecraft:structure_block","id":252,"data":1},{"runtimeID":2030,"name":"minecraft:structure_block","id":252,"data":2},{"runtimeID":2031,"name":"minecraft:structure_block","id":252,"data":3},{"runtimeID":2032,"name":"minecraft:structure_block","id":252,"data":4},{"runtimeID":2033,"name":"minecraft:structure_block","id":252,"data":5},{"runtimeID":2034,"name":"minecraft:structure_block","id":252,"data":6},{"runtimeID":2035,"name":"minecraft:structure_block","id":252,"data":7},{"runtimeID":2038,"name":"minecraft:reserved6","id":255,"data":0},{"runtimeID":2040,"name":"minecraft:prismarine_stairs","id":257,"data":0},{"runtimeID":2041,"name":"minecraft:prismarine_stairs","id":257,"data":1},{"runtimeID":2042,"name":"minecraft:prismarine_stairs","id":257,"data":2},{"runtimeID":2043,"name":"minecraft:prismarine_stairs","id":257,"data":3},{"runtimeID":2044,"name":"minecraft:prismarine_stairs","id":257,"data":4},{"runtimeID":2045,"name":"minecraft:prismarine_stairs","id":257,"data":5},{"runtimeID":2046,"name":"minecraft:prismarine_stairs","id":257,"data":6},{"runtimeID":2047,"name":"minecraft:prismarine_stairs","id":257,"data":7},{"runtimeID":2048,"name":"minecraft:dark_prismarine_stairs","id":258,"data":0},{"runtimeID":2049,"name":"minecraft:dark_prismarine_stairs","id":258,"data":1},{"runtimeID":2050,"name":"minecraft:dark_prismarine_stairs","id":258,"data":2},{"runtimeID":2051,"name":"minecraft:dark_prismarine_stairs","id":258,"data":3},{"runtimeID":2052,"name":"minecraft:dark_prismarine_stairs","id":258,"data":4},{"runtimeID":2053,"name":"minecraft:dark_prismarine_stairs","id":258,"data":5},{"runtimeID":2054,"name":"minecraft:dark_prismarine_stairs","id":258,"data":6},{"runtimeID":2055,"name":"minecraft:dark_prismarine_stairs","id":258,"data":7},{"runtimeID":2056,"name":"minecraft:prismarine_bricks_stairs","id":259,"data":0},{"runtimeID":2057,"name":"minecraft:prismarine_bricks_stairs","id":259,"data":1},{"runtimeID":2058,"name":"minecraft:prismarine_bricks_stairs","id":259,"data":2},{"runtimeID":2059,"name":"minecraft:prismarine_bricks_stairs","id":259,"data":3},{"runtimeID":2060,"name":"minecraft:prismarine_bricks_stairs","id":259,"data":4},{"runtimeID":2061,"name":"minecraft:prismarine_bricks_stairs","id":259,"data":5},{"runtimeID":2062,"name":"minecraft:prismarine_bricks_stairs","id":259,"data":6},{"runtimeID":2063,"name":"minecraft:prismarine_bricks_stairs","id":259,"data":7},{"runtimeID":2064,"name":"minecraft:stripped_spruce_log","id":260,"data":0},{"runtimeID":2065,"name":"minecraft:stripped_spruce_log","id":260,"data":1},{"runtimeID":2066,"name":"minecraft:stripped_spruce_log","id":260,"data":2},{"runtimeID":2067,"name":"minecraft:stripped_spruce_log","id":260,"data":3},{"runtimeID":2068,"name":"minecraft:stripped_birch_log","id":261,"data":0},{"runtimeID":2069,"name":"minecraft:stripped_birch_log","id":261,"data":1},{"runtimeID":2070,"name":"minecraft:stripped_birch_log","id":261,"data":2},{"runtimeID":2071,"name":"minecraft:stripped_birch_log","id":261,"data":3},{"runtimeID":2072,"name":"minecraft:stripped_jungle_log","id":262,"data":0},{"runtimeID":2073,"name":"minecraft:stripped_jungle_log","id":262,"data":1},{"runtimeID":2074,"name":"minecraft:stripped_jungle_log","id":262,"data":2},{"runtimeID":2075,"name":"minecraft:stripped_jungle_log","id":262,"data":3},{"runtimeID":2076,"name":"minecraft:stripped_acacia_log","id":263,"data":0},{"runtimeID":2077,"name":"minecraft:stripped_acacia_log","id":263,"data":1},{"runtimeID":2078,"name":"minecraft:stripped_acacia_log","id":263,"data":2},{"runtimeID":2079,"name":"minecraft:stripped_acacia_log","id":263,"data":3},{"runtimeID":2080,"name":"minecraft:stripped_dark_oak_log","id":264,"data":0},{"runtimeID":2081,"name":"minecraft:stripped_dark_oak_log","id":264,"data":1},{"runtimeID":2082,"name":"minecraft:stripped_dark_oak_log","id":264,"data":2},{"runtimeID":2083,"name":"minecraft:stripped_dark_oak_log","id":264,"data":3},{"runtimeID":2084,"name":"minecraft:stripped_oak_log","id":265,"data":0},{"runtimeID":2085,"name":"minecraft:stripped_oak_log","id":265,"data":1},{"runtimeID":2086,"name":"minecraft:stripped_oak_log","id":265,"data":2},{"runtimeID":2087,"name":"minecraft:stripped_oak_log","id":265,"data":3}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_261.json b/src/main/resources/runtimeid_table_261.json deleted file mode 100644 index 711318520..000000000 --- a/src/main/resources/runtimeid_table_261.json +++ /dev/null @@ -1 +0,0 @@ -[{"data":0,"id":0,"name":"minecraft:air","runtimeID":0},{"data":0,"id":1,"name":"minecraft:stone","runtimeID":1},{"data":1,"id":1,"name":"minecraft:stone","runtimeID":2},{"data":2,"id":1,"name":"minecraft:stone","runtimeID":3},{"data":3,"id":1,"name":"minecraft:stone","runtimeID":4},{"data":4,"id":1,"name":"minecraft:stone","runtimeID":5},{"data":5,"id":1,"name":"minecraft:stone","runtimeID":6},{"data":6,"id":1,"name":"minecraft:stone","runtimeID":7},{"data":7,"id":1,"name":"minecraft:stone","runtimeID":8},{"data":0,"id":2,"name":"minecraft:grass","runtimeID":9},{"data":1,"id":2,"name":"minecraft:grass","runtimeID":10},{"data":2,"id":2,"name":"minecraft:grass","runtimeID":11},{"data":3,"id":2,"name":"minecraft:grass","runtimeID":12},{"data":4,"id":2,"name":"minecraft:grass","runtimeID":13},{"data":5,"id":2,"name":"minecraft:grass","runtimeID":14},{"data":6,"id":2,"name":"minecraft:grass","runtimeID":15},{"data":7,"id":2,"name":"minecraft:grass","runtimeID":16},{"data":8,"id":2,"name":"minecraft:grass","runtimeID":17},{"data":9,"id":2,"name":"minecraft:grass","runtimeID":18},{"data":10,"id":2,"name":"minecraft:grass","runtimeID":19},{"data":11,"id":2,"name":"minecraft:grass","runtimeID":20},{"data":12,"id":2,"name":"minecraft:grass","runtimeID":21},{"data":13,"id":2,"name":"minecraft:grass","runtimeID":22},{"data":14,"id":2,"name":"minecraft:grass","runtimeID":23},{"data":15,"id":2,"name":"minecraft:grass","runtimeID":24},{"data":0,"id":3,"name":"minecraft:dirt","runtimeID":25},{"data":1,"id":3,"name":"minecraft:dirt","runtimeID":26},{"data":0,"id":4,"name":"minecraft:cobblestone","runtimeID":27},{"data":0,"id":5,"name":"minecraft:planks","runtimeID":28},{"data":1,"id":5,"name":"minecraft:planks","runtimeID":29},{"data":2,"id":5,"name":"minecraft:planks","runtimeID":30},{"data":3,"id":5,"name":"minecraft:planks","runtimeID":31},{"data":4,"id":5,"name":"minecraft:planks","runtimeID":32},{"data":5,"id":5,"name":"minecraft:planks","runtimeID":33},{"data":6,"id":5,"name":"minecraft:planks","runtimeID":34},{"data":7,"id":5,"name":"minecraft:planks","runtimeID":35},{"data":0,"id":6,"name":"minecraft:sapling","runtimeID":36},{"data":1,"id":6,"name":"minecraft:sapling","runtimeID":37},{"data":2,"id":6,"name":"minecraft:sapling","runtimeID":38},{"data":3,"id":6,"name":"minecraft:sapling","runtimeID":39},{"data":4,"id":6,"name":"minecraft:sapling","runtimeID":40},{"data":5,"id":6,"name":"minecraft:sapling","runtimeID":41},{"data":6,"id":6,"name":"minecraft:sapling","runtimeID":42},{"data":7,"id":6,"name":"minecraft:sapling","runtimeID":43},{"data":8,"id":6,"name":"minecraft:sapling","runtimeID":44},{"data":9,"id":6,"name":"minecraft:sapling","runtimeID":45},{"data":10,"id":6,"name":"minecraft:sapling","runtimeID":46},{"data":11,"id":6,"name":"minecraft:sapling","runtimeID":47},{"data":12,"id":6,"name":"minecraft:sapling","runtimeID":48},{"data":13,"id":6,"name":"minecraft:sapling","runtimeID":49},{"data":14,"id":6,"name":"minecraft:sapling","runtimeID":50},{"data":15,"id":6,"name":"minecraft:sapling","runtimeID":51},{"data":0,"id":7,"name":"minecraft:bedrock","runtimeID":52},{"data":1,"id":7,"name":"minecraft:bedrock","runtimeID":53},{"data":0,"id":8,"name":"minecraft:flowing_water","runtimeID":54},{"data":1,"id":8,"name":"minecraft:flowing_water","runtimeID":55},{"data":2,"id":8,"name":"minecraft:flowing_water","runtimeID":56},{"data":3,"id":8,"name":"minecraft:flowing_water","runtimeID":57},{"data":4,"id":8,"name":"minecraft:flowing_water","runtimeID":58},{"data":5,"id":8,"name":"minecraft:flowing_water","runtimeID":59},{"data":6,"id":8,"name":"minecraft:flowing_water","runtimeID":60},{"data":7,"id":8,"name":"minecraft:flowing_water","runtimeID":61},{"data":8,"id":8,"name":"minecraft:flowing_water","runtimeID":62},{"data":9,"id":8,"name":"minecraft:flowing_water","runtimeID":63},{"data":10,"id":8,"name":"minecraft:flowing_water","runtimeID":64},{"data":11,"id":8,"name":"minecraft:flowing_water","runtimeID":65},{"data":12,"id":8,"name":"minecraft:flowing_water","runtimeID":66},{"data":13,"id":8,"name":"minecraft:flowing_water","runtimeID":67},{"data":14,"id":8,"name":"minecraft:flowing_water","runtimeID":68},{"data":15,"id":8,"name":"minecraft:flowing_water","runtimeID":69},{"data":0,"id":9,"name":"minecraft:water","runtimeID":70},{"data":1,"id":9,"name":"minecraft:water","runtimeID":71},{"data":2,"id":9,"name":"minecraft:water","runtimeID":72},{"data":3,"id":9,"name":"minecraft:water","runtimeID":73},{"data":4,"id":9,"name":"minecraft:water","runtimeID":74},{"data":5,"id":9,"name":"minecraft:water","runtimeID":75},{"data":6,"id":9,"name":"minecraft:water","runtimeID":76},{"data":7,"id":9,"name":"minecraft:water","runtimeID":77},{"data":8,"id":9,"name":"minecraft:water","runtimeID":78},{"data":9,"id":9,"name":"minecraft:water","runtimeID":79},{"data":10,"id":9,"name":"minecraft:water","runtimeID":80},{"data":11,"id":9,"name":"minecraft:water","runtimeID":81},{"data":12,"id":9,"name":"minecraft:water","runtimeID":82},{"data":13,"id":9,"name":"minecraft:water","runtimeID":83},{"data":14,"id":9,"name":"minecraft:water","runtimeID":84},{"data":15,"id":9,"name":"minecraft:water","runtimeID":85},{"data":0,"id":10,"name":"minecraft:flowing_lava","runtimeID":86},{"data":1,"id":10,"name":"minecraft:flowing_lava","runtimeID":87},{"data":2,"id":10,"name":"minecraft:flowing_lava","runtimeID":88},{"data":3,"id":10,"name":"minecraft:flowing_lava","runtimeID":89},{"data":4,"id":10,"name":"minecraft:flowing_lava","runtimeID":90},{"data":5,"id":10,"name":"minecraft:flowing_lava","runtimeID":91},{"data":6,"id":10,"name":"minecraft:flowing_lava","runtimeID":92},{"data":7,"id":10,"name":"minecraft:flowing_lava","runtimeID":93},{"data":8,"id":10,"name":"minecraft:flowing_lava","runtimeID":94},{"data":9,"id":10,"name":"minecraft:flowing_lava","runtimeID":95},{"data":10,"id":10,"name":"minecraft:flowing_lava","runtimeID":96},{"data":11,"id":10,"name":"minecraft:flowing_lava","runtimeID":97},{"data":12,"id":10,"name":"minecraft:flowing_lava","runtimeID":98},{"data":13,"id":10,"name":"minecraft:flowing_lava","runtimeID":99},{"data":14,"id":10,"name":"minecraft:flowing_lava","runtimeID":100},{"data":15,"id":10,"name":"minecraft:flowing_lava","runtimeID":101},{"data":0,"id":11,"name":"minecraft:lava","runtimeID":102},{"data":1,"id":11,"name":"minecraft:lava","runtimeID":103},{"data":2,"id":11,"name":"minecraft:lava","runtimeID":104},{"data":3,"id":11,"name":"minecraft:lava","runtimeID":105},{"data":4,"id":11,"name":"minecraft:lava","runtimeID":106},{"data":5,"id":11,"name":"minecraft:lava","runtimeID":107},{"data":6,"id":11,"name":"minecraft:lava","runtimeID":108},{"data":7,"id":11,"name":"minecraft:lava","runtimeID":109},{"data":8,"id":11,"name":"minecraft:lava","runtimeID":110},{"data":9,"id":11,"name":"minecraft:lava","runtimeID":111},{"data":10,"id":11,"name":"minecraft:lava","runtimeID":112},{"data":11,"id":11,"name":"minecraft:lava","runtimeID":113},{"data":12,"id":11,"name":"minecraft:lava","runtimeID":114},{"data":13,"id":11,"name":"minecraft:lava","runtimeID":115},{"data":14,"id":11,"name":"minecraft:lava","runtimeID":116},{"data":15,"id":11,"name":"minecraft:lava","runtimeID":117},{"data":0,"id":12,"name":"minecraft:sand","runtimeID":118},{"data":1,"id":12,"name":"minecraft:sand","runtimeID":119},{"data":0,"id":13,"name":"minecraft:gravel","runtimeID":120},{"data":0,"id":14,"name":"minecraft:gold_ore","runtimeID":121},{"data":0,"id":15,"name":"minecraft:iron_ore","runtimeID":122},{"data":0,"id":16,"name":"minecraft:coal_ore","runtimeID":123},{"data":0,"id":17,"name":"minecraft:log","runtimeID":124},{"data":1,"id":17,"name":"minecraft:log","runtimeID":125},{"data":2,"id":17,"name":"minecraft:log","runtimeID":126},{"data":3,"id":17,"name":"minecraft:log","runtimeID":127},{"data":4,"id":17,"name":"minecraft:log","runtimeID":128},{"data":5,"id":17,"name":"minecraft:log","runtimeID":129},{"data":6,"id":17,"name":"minecraft:log","runtimeID":130},{"data":7,"id":17,"name":"minecraft:log","runtimeID":131},{"data":8,"id":17,"name":"minecraft:log","runtimeID":132},{"data":9,"id":17,"name":"minecraft:log","runtimeID":133},{"data":10,"id":17,"name":"minecraft:log","runtimeID":134},{"data":11,"id":17,"name":"minecraft:log","runtimeID":135},{"data":12,"id":17,"name":"minecraft:log","runtimeID":136},{"data":13,"id":17,"name":"minecraft:log","runtimeID":137},{"data":14,"id":17,"name":"minecraft:log","runtimeID":138},{"data":15,"id":17,"name":"minecraft:log","runtimeID":139},{"data":0,"id":18,"name":"minecraft:leaves","runtimeID":140},{"data":1,"id":18,"name":"minecraft:leaves","runtimeID":141},{"data":2,"id":18,"name":"minecraft:leaves","runtimeID":142},{"data":3,"id":18,"name":"minecraft:leaves","runtimeID":143},{"data":4,"id":18,"name":"minecraft:leaves","runtimeID":144},{"data":5,"id":18,"name":"minecraft:leaves","runtimeID":145},{"data":6,"id":18,"name":"minecraft:leaves","runtimeID":146},{"data":7,"id":18,"name":"minecraft:leaves","runtimeID":147},{"data":8,"id":18,"name":"minecraft:leaves","runtimeID":148},{"data":9,"id":18,"name":"minecraft:leaves","runtimeID":149},{"data":10,"id":18,"name":"minecraft:leaves","runtimeID":150},{"data":11,"id":18,"name":"minecraft:leaves","runtimeID":151},{"data":12,"id":18,"name":"minecraft:leaves","runtimeID":152},{"data":13,"id":18,"name":"minecraft:leaves","runtimeID":153},{"data":14,"id":18,"name":"minecraft:leaves","runtimeID":154},{"data":15,"id":18,"name":"minecraft:leaves","runtimeID":155},{"data":0,"id":19,"name":"minecraft:sponge","runtimeID":156},{"data":1,"id":19,"name":"minecraft:sponge","runtimeID":157},{"data":0,"id":20,"name":"minecraft:glass","runtimeID":158},{"data":0,"id":21,"name":"minecraft:lapis_ore","runtimeID":159},{"data":0,"id":22,"name":"minecraft:lapis_block","runtimeID":160},{"data":0,"id":23,"name":"minecraft:dispenser","runtimeID":161},{"data":1,"id":23,"name":"minecraft:dispenser","runtimeID":162},{"data":2,"id":23,"name":"minecraft:dispenser","runtimeID":163},{"data":3,"id":23,"name":"minecraft:dispenser","runtimeID":164},{"data":4,"id":23,"name":"minecraft:dispenser","runtimeID":165},{"data":5,"id":23,"name":"minecraft:dispenser","runtimeID":166},{"data":6,"id":23,"name":"minecraft:dispenser","runtimeID":167},{"data":7,"id":23,"name":"minecraft:dispenser","runtimeID":168},{"data":8,"id":23,"name":"minecraft:dispenser","runtimeID":169},{"data":9,"id":23,"name":"minecraft:dispenser","runtimeID":170},{"data":10,"id":23,"name":"minecraft:dispenser","runtimeID":171},{"data":11,"id":23,"name":"minecraft:dispenser","runtimeID":172},{"data":12,"id":23,"name":"minecraft:dispenser","runtimeID":173},{"data":13,"id":23,"name":"minecraft:dispenser","runtimeID":174},{"data":14,"id":23,"name":"minecraft:dispenser","runtimeID":175},{"data":15,"id":23,"name":"minecraft:dispenser","runtimeID":176},{"data":0,"id":24,"name":"minecraft:sandstone","runtimeID":177},{"data":1,"id":24,"name":"minecraft:sandstone","runtimeID":178},{"data":2,"id":24,"name":"minecraft:sandstone","runtimeID":179},{"data":3,"id":24,"name":"minecraft:sandstone","runtimeID":180},{"data":0,"id":25,"name":"minecraft:noteblock","runtimeID":181},{"data":0,"id":26,"name":"minecraft:bed","runtimeID":182},{"data":1,"id":26,"name":"minecraft:bed","runtimeID":183},{"data":2,"id":26,"name":"minecraft:bed","runtimeID":184},{"data":3,"id":26,"name":"minecraft:bed","runtimeID":185},{"data":4,"id":26,"name":"minecraft:bed","runtimeID":186},{"data":5,"id":26,"name":"minecraft:bed","runtimeID":187},{"data":6,"id":26,"name":"minecraft:bed","runtimeID":188},{"data":7,"id":26,"name":"minecraft:bed","runtimeID":189},{"data":8,"id":26,"name":"minecraft:bed","runtimeID":190},{"data":9,"id":26,"name":"minecraft:bed","runtimeID":191},{"data":10,"id":26,"name":"minecraft:bed","runtimeID":192},{"data":11,"id":26,"name":"minecraft:bed","runtimeID":193},{"data":12,"id":26,"name":"minecraft:bed","runtimeID":194},{"data":13,"id":26,"name":"minecraft:bed","runtimeID":195},{"data":14,"id":26,"name":"minecraft:bed","runtimeID":196},{"data":15,"id":26,"name":"minecraft:bed","runtimeID":197},{"data":0,"id":27,"name":"minecraft:golden_rail","runtimeID":198},{"data":1,"id":27,"name":"minecraft:golden_rail","runtimeID":199},{"data":2,"id":27,"name":"minecraft:golden_rail","runtimeID":200},{"data":3,"id":27,"name":"minecraft:golden_rail","runtimeID":201},{"data":4,"id":27,"name":"minecraft:golden_rail","runtimeID":202},{"data":5,"id":27,"name":"minecraft:golden_rail","runtimeID":203},{"data":6,"id":27,"name":"minecraft:golden_rail","runtimeID":204},{"data":7,"id":27,"name":"minecraft:golden_rail","runtimeID":205},{"data":8,"id":27,"name":"minecraft:golden_rail","runtimeID":206},{"data":9,"id":27,"name":"minecraft:golden_rail","runtimeID":207},{"data":10,"id":27,"name":"minecraft:golden_rail","runtimeID":208},{"data":11,"id":27,"name":"minecraft:golden_rail","runtimeID":209},{"data":12,"id":27,"name":"minecraft:golden_rail","runtimeID":210},{"data":13,"id":27,"name":"minecraft:golden_rail","runtimeID":211},{"data":14,"id":27,"name":"minecraft:golden_rail","runtimeID":212},{"data":15,"id":27,"name":"minecraft:golden_rail","runtimeID":213},{"data":0,"id":28,"name":"minecraft:detector_rail","runtimeID":214},{"data":1,"id":28,"name":"minecraft:detector_rail","runtimeID":215},{"data":2,"id":28,"name":"minecraft:detector_rail","runtimeID":216},{"data":3,"id":28,"name":"minecraft:detector_rail","runtimeID":217},{"data":4,"id":28,"name":"minecraft:detector_rail","runtimeID":218},{"data":5,"id":28,"name":"minecraft:detector_rail","runtimeID":219},{"data":6,"id":28,"name":"minecraft:detector_rail","runtimeID":220},{"data":7,"id":28,"name":"minecraft:detector_rail","runtimeID":221},{"data":8,"id":28,"name":"minecraft:detector_rail","runtimeID":222},{"data":9,"id":28,"name":"minecraft:detector_rail","runtimeID":223},{"data":10,"id":28,"name":"minecraft:detector_rail","runtimeID":224},{"data":11,"id":28,"name":"minecraft:detector_rail","runtimeID":225},{"data":12,"id":28,"name":"minecraft:detector_rail","runtimeID":226},{"data":13,"id":28,"name":"minecraft:detector_rail","runtimeID":227},{"data":14,"id":28,"name":"minecraft:detector_rail","runtimeID":228},{"data":15,"id":28,"name":"minecraft:detector_rail","runtimeID":229},{"data":0,"id":29,"name":"minecraft:sticky_piston","runtimeID":230},{"data":1,"id":29,"name":"minecraft:sticky_piston","runtimeID":231},{"data":2,"id":29,"name":"minecraft:sticky_piston","runtimeID":232},{"data":3,"id":29,"name":"minecraft:sticky_piston","runtimeID":233},{"data":4,"id":29,"name":"minecraft:sticky_piston","runtimeID":234},{"data":5,"id":29,"name":"minecraft:sticky_piston","runtimeID":235},{"data":6,"id":29,"name":"minecraft:sticky_piston","runtimeID":236},{"data":7,"id":29,"name":"minecraft:sticky_piston","runtimeID":237},{"data":0,"id":30,"name":"minecraft:web","runtimeID":238},{"data":0,"id":31,"name":"minecraft:tallgrass","runtimeID":239},{"data":1,"id":31,"name":"minecraft:tallgrass","runtimeID":240},{"data":2,"id":31,"name":"minecraft:tallgrass","runtimeID":241},{"data":3,"id":31,"name":"minecraft:tallgrass","runtimeID":242},{"data":0,"id":32,"name":"minecraft:deadbush","runtimeID":243},{"data":0,"id":33,"name":"minecraft:piston","runtimeID":244},{"data":1,"id":33,"name":"minecraft:piston","runtimeID":245},{"data":2,"id":33,"name":"minecraft:piston","runtimeID":246},{"data":3,"id":33,"name":"minecraft:piston","runtimeID":247},{"data":4,"id":33,"name":"minecraft:piston","runtimeID":248},{"data":5,"id":33,"name":"minecraft:piston","runtimeID":249},{"data":6,"id":33,"name":"minecraft:piston","runtimeID":250},{"data":7,"id":33,"name":"minecraft:piston","runtimeID":251},{"data":0,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":252},{"data":1,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":253},{"data":2,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":254},{"data":3,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":255},{"data":4,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":256},{"data":5,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":257},{"data":6,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":258},{"data":7,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":259},{"data":0,"id":35,"name":"minecraft:wool","runtimeID":260},{"data":1,"id":35,"name":"minecraft:wool","runtimeID":261},{"data":2,"id":35,"name":"minecraft:wool","runtimeID":262},{"data":3,"id":35,"name":"minecraft:wool","runtimeID":263},{"data":4,"id":35,"name":"minecraft:wool","runtimeID":264},{"data":5,"id":35,"name":"minecraft:wool","runtimeID":265},{"data":6,"id":35,"name":"minecraft:wool","runtimeID":266},{"data":7,"id":35,"name":"minecraft:wool","runtimeID":267},{"data":8,"id":35,"name":"minecraft:wool","runtimeID":268},{"data":9,"id":35,"name":"minecraft:wool","runtimeID":269},{"data":10,"id":35,"name":"minecraft:wool","runtimeID":270},{"data":11,"id":35,"name":"minecraft:wool","runtimeID":271},{"data":12,"id":35,"name":"minecraft:wool","runtimeID":272},{"data":13,"id":35,"name":"minecraft:wool","runtimeID":273},{"data":14,"id":35,"name":"minecraft:wool","runtimeID":274},{"data":15,"id":35,"name":"minecraft:wool","runtimeID":275},{"data":0,"id":36,"name":"minecraft:element_0","runtimeID":276},{"data":1,"id":36,"name":"minecraft:element_0","runtimeID":277},{"data":2,"id":36,"name":"minecraft:element_0","runtimeID":278},{"data":3,"id":36,"name":"minecraft:element_0","runtimeID":279},{"data":4,"id":36,"name":"minecraft:element_0","runtimeID":280},{"data":5,"id":36,"name":"minecraft:element_0","runtimeID":281},{"data":6,"id":36,"name":"minecraft:element_0","runtimeID":282},{"data":7,"id":36,"name":"minecraft:element_0","runtimeID":283},{"data":8,"id":36,"name":"minecraft:element_0","runtimeID":284},{"data":9,"id":36,"name":"minecraft:element_0","runtimeID":285},{"data":10,"id":36,"name":"minecraft:element_0","runtimeID":286},{"data":11,"id":36,"name":"minecraft:element_0","runtimeID":287},{"data":12,"id":36,"name":"minecraft:element_0","runtimeID":288},{"data":13,"id":36,"name":"minecraft:element_0","runtimeID":289},{"data":14,"id":36,"name":"minecraft:element_0","runtimeID":290},{"data":15,"id":36,"name":"minecraft:element_0","runtimeID":291},{"data":0,"id":37,"name":"minecraft:yellow_flower","runtimeID":292},{"data":1,"id":37,"name":"minecraft:yellow_flower","runtimeID":293},{"data":2,"id":37,"name":"minecraft:yellow_flower","runtimeID":294},{"data":3,"id":37,"name":"minecraft:yellow_flower","runtimeID":295},{"data":4,"id":37,"name":"minecraft:yellow_flower","runtimeID":296},{"data":5,"id":37,"name":"minecraft:yellow_flower","runtimeID":297},{"data":6,"id":37,"name":"minecraft:yellow_flower","runtimeID":298},{"data":7,"id":37,"name":"minecraft:yellow_flower","runtimeID":299},{"data":8,"id":37,"name":"minecraft:yellow_flower","runtimeID":300},{"data":9,"id":37,"name":"minecraft:yellow_flower","runtimeID":301},{"data":10,"id":37,"name":"minecraft:yellow_flower","runtimeID":302},{"data":11,"id":37,"name":"minecraft:yellow_flower","runtimeID":303},{"data":12,"id":37,"name":"minecraft:yellow_flower","runtimeID":304},{"data":13,"id":37,"name":"minecraft:yellow_flower","runtimeID":305},{"data":14,"id":37,"name":"minecraft:yellow_flower","runtimeID":306},{"data":15,"id":37,"name":"minecraft:yellow_flower","runtimeID":307},{"data":0,"id":38,"name":"minecraft:red_flower","runtimeID":308},{"data":1,"id":38,"name":"minecraft:red_flower","runtimeID":309},{"data":2,"id":38,"name":"minecraft:red_flower","runtimeID":310},{"data":3,"id":38,"name":"minecraft:red_flower","runtimeID":311},{"data":4,"id":38,"name":"minecraft:red_flower","runtimeID":312},{"data":5,"id":38,"name":"minecraft:red_flower","runtimeID":313},{"data":6,"id":38,"name":"minecraft:red_flower","runtimeID":314},{"data":7,"id":38,"name":"minecraft:red_flower","runtimeID":315},{"data":8,"id":38,"name":"minecraft:red_flower","runtimeID":316},{"data":9,"id":38,"name":"minecraft:red_flower","runtimeID":317},{"data":10,"id":38,"name":"minecraft:red_flower","runtimeID":318},{"data":11,"id":38,"name":"minecraft:red_flower","runtimeID":319},{"data":12,"id":38,"name":"minecraft:red_flower","runtimeID":320},{"data":13,"id":38,"name":"minecraft:red_flower","runtimeID":321},{"data":14,"id":38,"name":"minecraft:red_flower","runtimeID":322},{"data":15,"id":38,"name":"minecraft:red_flower","runtimeID":323},{"data":0,"id":39,"name":"minecraft:brown_mushroom","runtimeID":324},{"data":0,"id":40,"name":"minecraft:red_mushroom","runtimeID":325},{"data":0,"id":41,"name":"minecraft:gold_block","runtimeID":326},{"data":0,"id":42,"name":"minecraft:iron_block","runtimeID":327},{"data":0,"id":43,"name":"minecraft:double_stone_slab","runtimeID":328},{"data":1,"id":43,"name":"minecraft:double_stone_slab","runtimeID":329},{"data":2,"id":43,"name":"minecraft:double_stone_slab","runtimeID":330},{"data":3,"id":43,"name":"minecraft:double_stone_slab","runtimeID":331},{"data":4,"id":43,"name":"minecraft:double_stone_slab","runtimeID":332},{"data":5,"id":43,"name":"minecraft:double_stone_slab","runtimeID":333},{"data":6,"id":43,"name":"minecraft:double_stone_slab","runtimeID":334},{"data":7,"id":43,"name":"minecraft:double_stone_slab","runtimeID":335},{"data":8,"id":43,"name":"minecraft:double_stone_slab","runtimeID":336},{"data":9,"id":43,"name":"minecraft:double_stone_slab","runtimeID":337},{"data":10,"id":43,"name":"minecraft:double_stone_slab","runtimeID":338},{"data":11,"id":43,"name":"minecraft:double_stone_slab","runtimeID":339},{"data":12,"id":43,"name":"minecraft:double_stone_slab","runtimeID":340},{"data":13,"id":43,"name":"minecraft:double_stone_slab","runtimeID":341},{"data":14,"id":43,"name":"minecraft:double_stone_slab","runtimeID":342},{"data":15,"id":43,"name":"minecraft:double_stone_slab","runtimeID":343},{"data":0,"id":44,"name":"minecraft:stone_slab","runtimeID":344},{"data":1,"id":44,"name":"minecraft:stone_slab","runtimeID":345},{"data":2,"id":44,"name":"minecraft:stone_slab","runtimeID":346},{"data":3,"id":44,"name":"minecraft:stone_slab","runtimeID":347},{"data":4,"id":44,"name":"minecraft:stone_slab","runtimeID":348},{"data":5,"id":44,"name":"minecraft:stone_slab","runtimeID":349},{"data":6,"id":44,"name":"minecraft:stone_slab","runtimeID":350},{"data":7,"id":44,"name":"minecraft:stone_slab","runtimeID":351},{"data":8,"id":44,"name":"minecraft:stone_slab","runtimeID":352},{"data":9,"id":44,"name":"minecraft:stone_slab","runtimeID":353},{"data":10,"id":44,"name":"minecraft:stone_slab","runtimeID":354},{"data":11,"id":44,"name":"minecraft:stone_slab","runtimeID":355},{"data":12,"id":44,"name":"minecraft:stone_slab","runtimeID":356},{"data":13,"id":44,"name":"minecraft:stone_slab","runtimeID":357},{"data":14,"id":44,"name":"minecraft:stone_slab","runtimeID":358},{"data":15,"id":44,"name":"minecraft:stone_slab","runtimeID":359},{"data":0,"id":45,"name":"minecraft:brick_block","runtimeID":360},{"data":0,"id":46,"name":"minecraft:tnt","runtimeID":361},{"data":1,"id":46,"name":"minecraft:tnt","runtimeID":362},{"data":2,"id":46,"name":"minecraft:tnt","runtimeID":363},{"data":3,"id":46,"name":"minecraft:tnt","runtimeID":364},{"data":0,"id":47,"name":"minecraft:bookshelf","runtimeID":365},{"data":0,"id":48,"name":"minecraft:mossy_cobblestone","runtimeID":366},{"data":0,"id":49,"name":"minecraft:obsidian","runtimeID":367},{"data":0,"id":50,"name":"minecraft:torch","runtimeID":368},{"data":1,"id":50,"name":"minecraft:torch","runtimeID":369},{"data":2,"id":50,"name":"minecraft:torch","runtimeID":370},{"data":3,"id":50,"name":"minecraft:torch","runtimeID":371},{"data":4,"id":50,"name":"minecraft:torch","runtimeID":372},{"data":5,"id":50,"name":"minecraft:torch","runtimeID":373},{"data":6,"id":50,"name":"minecraft:torch","runtimeID":374},{"data":7,"id":50,"name":"minecraft:torch","runtimeID":375},{"data":0,"id":51,"name":"minecraft:fire","runtimeID":376},{"data":1,"id":51,"name":"minecraft:fire","runtimeID":377},{"data":2,"id":51,"name":"minecraft:fire","runtimeID":378},{"data":3,"id":51,"name":"minecraft:fire","runtimeID":379},{"data":4,"id":51,"name":"minecraft:fire","runtimeID":380},{"data":5,"id":51,"name":"minecraft:fire","runtimeID":381},{"data":6,"id":51,"name":"minecraft:fire","runtimeID":382},{"data":7,"id":51,"name":"minecraft:fire","runtimeID":383},{"data":8,"id":51,"name":"minecraft:fire","runtimeID":384},{"data":9,"id":51,"name":"minecraft:fire","runtimeID":385},{"data":10,"id":51,"name":"minecraft:fire","runtimeID":386},{"data":11,"id":51,"name":"minecraft:fire","runtimeID":387},{"data":12,"id":51,"name":"minecraft:fire","runtimeID":388},{"data":13,"id":51,"name":"minecraft:fire","runtimeID":389},{"data":14,"id":51,"name":"minecraft:fire","runtimeID":390},{"data":15,"id":51,"name":"minecraft:fire","runtimeID":391},{"data":0,"id":52,"name":"minecraft:mob_spawner","runtimeID":392},{"data":0,"id":53,"name":"minecraft:oak_stairs","runtimeID":393},{"data":1,"id":53,"name":"minecraft:oak_stairs","runtimeID":394},{"data":2,"id":53,"name":"minecraft:oak_stairs","runtimeID":395},{"data":3,"id":53,"name":"minecraft:oak_stairs","runtimeID":396},{"data":4,"id":53,"name":"minecraft:oak_stairs","runtimeID":397},{"data":5,"id":53,"name":"minecraft:oak_stairs","runtimeID":398},{"data":6,"id":53,"name":"minecraft:oak_stairs","runtimeID":399},{"data":7,"id":53,"name":"minecraft:oak_stairs","runtimeID":400},{"data":0,"id":54,"name":"minecraft:chest","runtimeID":401},{"data":1,"id":54,"name":"minecraft:chest","runtimeID":402},{"data":2,"id":54,"name":"minecraft:chest","runtimeID":403},{"data":3,"id":54,"name":"minecraft:chest","runtimeID":404},{"data":4,"id":54,"name":"minecraft:chest","runtimeID":405},{"data":5,"id":54,"name":"minecraft:chest","runtimeID":406},{"data":6,"id":54,"name":"minecraft:chest","runtimeID":407},{"data":7,"id":54,"name":"minecraft:chest","runtimeID":408},{"data":0,"id":55,"name":"minecraft:redstone_wire","runtimeID":409},{"data":1,"id":55,"name":"minecraft:redstone_wire","runtimeID":410},{"data":2,"id":55,"name":"minecraft:redstone_wire","runtimeID":411},{"data":3,"id":55,"name":"minecraft:redstone_wire","runtimeID":412},{"data":4,"id":55,"name":"minecraft:redstone_wire","runtimeID":413},{"data":5,"id":55,"name":"minecraft:redstone_wire","runtimeID":414},{"data":6,"id":55,"name":"minecraft:redstone_wire","runtimeID":415},{"data":7,"id":55,"name":"minecraft:redstone_wire","runtimeID":416},{"data":8,"id":55,"name":"minecraft:redstone_wire","runtimeID":417},{"data":9,"id":55,"name":"minecraft:redstone_wire","runtimeID":418},{"data":10,"id":55,"name":"minecraft:redstone_wire","runtimeID":419},{"data":11,"id":55,"name":"minecraft:redstone_wire","runtimeID":420},{"data":12,"id":55,"name":"minecraft:redstone_wire","runtimeID":421},{"data":13,"id":55,"name":"minecraft:redstone_wire","runtimeID":422},{"data":14,"id":55,"name":"minecraft:redstone_wire","runtimeID":423},{"data":15,"id":55,"name":"minecraft:redstone_wire","runtimeID":424},{"data":0,"id":56,"name":"minecraft:diamond_ore","runtimeID":425},{"data":0,"id":57,"name":"minecraft:diamond_block","runtimeID":426},{"data":0,"id":58,"name":"minecraft:crafting_table","runtimeID":427},{"data":0,"id":59,"name":"minecraft:wheat","runtimeID":428},{"data":1,"id":59,"name":"minecraft:wheat","runtimeID":429},{"data":2,"id":59,"name":"minecraft:wheat","runtimeID":430},{"data":3,"id":59,"name":"minecraft:wheat","runtimeID":431},{"data":4,"id":59,"name":"minecraft:wheat","runtimeID":432},{"data":5,"id":59,"name":"minecraft:wheat","runtimeID":433},{"data":6,"id":59,"name":"minecraft:wheat","runtimeID":434},{"data":7,"id":59,"name":"minecraft:wheat","runtimeID":435},{"data":0,"id":60,"name":"minecraft:farmland","runtimeID":436},{"data":1,"id":60,"name":"minecraft:farmland","runtimeID":437},{"data":2,"id":60,"name":"minecraft:farmland","runtimeID":438},{"data":3,"id":60,"name":"minecraft:farmland","runtimeID":439},{"data":4,"id":60,"name":"minecraft:farmland","runtimeID":440},{"data":5,"id":60,"name":"minecraft:farmland","runtimeID":441},{"data":6,"id":60,"name":"minecraft:farmland","runtimeID":442},{"data":7,"id":60,"name":"minecraft:farmland","runtimeID":443},{"data":0,"id":61,"name":"minecraft:furnace","runtimeID":444},{"data":1,"id":61,"name":"minecraft:furnace","runtimeID":445},{"data":2,"id":61,"name":"minecraft:furnace","runtimeID":446},{"data":3,"id":61,"name":"minecraft:furnace","runtimeID":447},{"data":4,"id":61,"name":"minecraft:furnace","runtimeID":448},{"data":5,"id":61,"name":"minecraft:furnace","runtimeID":449},{"data":6,"id":61,"name":"minecraft:furnace","runtimeID":450},{"data":7,"id":61,"name":"minecraft:furnace","runtimeID":451},{"data":0,"id":62,"name":"minecraft:lit_furnace","runtimeID":452},{"data":1,"id":62,"name":"minecraft:lit_furnace","runtimeID":453},{"data":2,"id":62,"name":"minecraft:lit_furnace","runtimeID":454},{"data":3,"id":62,"name":"minecraft:lit_furnace","runtimeID":455},{"data":4,"id":62,"name":"minecraft:lit_furnace","runtimeID":456},{"data":5,"id":62,"name":"minecraft:lit_furnace","runtimeID":457},{"data":6,"id":62,"name":"minecraft:lit_furnace","runtimeID":458},{"data":7,"id":62,"name":"minecraft:lit_furnace","runtimeID":459},{"data":0,"id":63,"name":"minecraft:standing_sign","runtimeID":460},{"data":1,"id":63,"name":"minecraft:standing_sign","runtimeID":461},{"data":2,"id":63,"name":"minecraft:standing_sign","runtimeID":462},{"data":3,"id":63,"name":"minecraft:standing_sign","runtimeID":463},{"data":4,"id":63,"name":"minecraft:standing_sign","runtimeID":464},{"data":5,"id":63,"name":"minecraft:standing_sign","runtimeID":465},{"data":6,"id":63,"name":"minecraft:standing_sign","runtimeID":466},{"data":7,"id":63,"name":"minecraft:standing_sign","runtimeID":467},{"data":8,"id":63,"name":"minecraft:standing_sign","runtimeID":468},{"data":9,"id":63,"name":"minecraft:standing_sign","runtimeID":469},{"data":10,"id":63,"name":"minecraft:standing_sign","runtimeID":470},{"data":11,"id":63,"name":"minecraft:standing_sign","runtimeID":471},{"data":12,"id":63,"name":"minecraft:standing_sign","runtimeID":472},{"data":13,"id":63,"name":"minecraft:standing_sign","runtimeID":473},{"data":14,"id":63,"name":"minecraft:standing_sign","runtimeID":474},{"data":15,"id":63,"name":"minecraft:standing_sign","runtimeID":475},{"data":0,"id":64,"name":"minecraft:wooden_door","runtimeID":476},{"data":1,"id":64,"name":"minecraft:wooden_door","runtimeID":477},{"data":2,"id":64,"name":"minecraft:wooden_door","runtimeID":478},{"data":3,"id":64,"name":"minecraft:wooden_door","runtimeID":479},{"data":4,"id":64,"name":"minecraft:wooden_door","runtimeID":480},{"data":5,"id":64,"name":"minecraft:wooden_door","runtimeID":481},{"data":6,"id":64,"name":"minecraft:wooden_door","runtimeID":482},{"data":7,"id":64,"name":"minecraft:wooden_door","runtimeID":483},{"data":8,"id":64,"name":"minecraft:wooden_door","runtimeID":484},{"data":9,"id":64,"name":"minecraft:wooden_door","runtimeID":485},{"data":10,"id":64,"name":"minecraft:wooden_door","runtimeID":486},{"data":11,"id":64,"name":"minecraft:wooden_door","runtimeID":487},{"data":12,"id":64,"name":"minecraft:wooden_door","runtimeID":488},{"data":13,"id":64,"name":"minecraft:wooden_door","runtimeID":489},{"data":14,"id":64,"name":"minecraft:wooden_door","runtimeID":490},{"data":15,"id":64,"name":"minecraft:wooden_door","runtimeID":491},{"data":0,"id":65,"name":"minecraft:ladder","runtimeID":492},{"data":1,"id":65,"name":"minecraft:ladder","runtimeID":493},{"data":2,"id":65,"name":"minecraft:ladder","runtimeID":494},{"data":3,"id":65,"name":"minecraft:ladder","runtimeID":495},{"data":4,"id":65,"name":"minecraft:ladder","runtimeID":496},{"data":5,"id":65,"name":"minecraft:ladder","runtimeID":497},{"data":6,"id":65,"name":"minecraft:ladder","runtimeID":498},{"data":7,"id":65,"name":"minecraft:ladder","runtimeID":499},{"data":0,"id":66,"name":"minecraft:rail","runtimeID":500},{"data":1,"id":66,"name":"minecraft:rail","runtimeID":501},{"data":2,"id":66,"name":"minecraft:rail","runtimeID":502},{"data":3,"id":66,"name":"minecraft:rail","runtimeID":503},{"data":4,"id":66,"name":"minecraft:rail","runtimeID":504},{"data":5,"id":66,"name":"minecraft:rail","runtimeID":505},{"data":6,"id":66,"name":"minecraft:rail","runtimeID":506},{"data":7,"id":66,"name":"minecraft:rail","runtimeID":507},{"data":8,"id":66,"name":"minecraft:rail","runtimeID":508},{"data":9,"id":66,"name":"minecraft:rail","runtimeID":509},{"data":10,"id":66,"name":"minecraft:rail","runtimeID":510},{"data":11,"id":66,"name":"minecraft:rail","runtimeID":511},{"data":12,"id":66,"name":"minecraft:rail","runtimeID":512},{"data":13,"id":66,"name":"minecraft:rail","runtimeID":513},{"data":14,"id":66,"name":"minecraft:rail","runtimeID":514},{"data":15,"id":66,"name":"minecraft:rail","runtimeID":515},{"data":0,"id":67,"name":"minecraft:stone_stairs","runtimeID":516},{"data":1,"id":67,"name":"minecraft:stone_stairs","runtimeID":517},{"data":2,"id":67,"name":"minecraft:stone_stairs","runtimeID":518},{"data":3,"id":67,"name":"minecraft:stone_stairs","runtimeID":519},{"data":4,"id":67,"name":"minecraft:stone_stairs","runtimeID":520},{"data":5,"id":67,"name":"minecraft:stone_stairs","runtimeID":521},{"data":6,"id":67,"name":"minecraft:stone_stairs","runtimeID":522},{"data":7,"id":67,"name":"minecraft:stone_stairs","runtimeID":523},{"data":0,"id":68,"name":"minecraft:wall_sign","runtimeID":524},{"data":1,"id":68,"name":"minecraft:wall_sign","runtimeID":525},{"data":2,"id":68,"name":"minecraft:wall_sign","runtimeID":526},{"data":3,"id":68,"name":"minecraft:wall_sign","runtimeID":527},{"data":4,"id":68,"name":"minecraft:wall_sign","runtimeID":528},{"data":5,"id":68,"name":"minecraft:wall_sign","runtimeID":529},{"data":6,"id":68,"name":"minecraft:wall_sign","runtimeID":530},{"data":7,"id":68,"name":"minecraft:wall_sign","runtimeID":531},{"data":8,"id":68,"name":"minecraft:wall_sign","runtimeID":532},{"data":9,"id":68,"name":"minecraft:wall_sign","runtimeID":533},{"data":10,"id":68,"name":"minecraft:wall_sign","runtimeID":534},{"data":11,"id":68,"name":"minecraft:wall_sign","runtimeID":535},{"data":12,"id":68,"name":"minecraft:wall_sign","runtimeID":536},{"data":13,"id":68,"name":"minecraft:wall_sign","runtimeID":537},{"data":14,"id":68,"name":"minecraft:wall_sign","runtimeID":538},{"data":15,"id":68,"name":"minecraft:wall_sign","runtimeID":539},{"data":0,"id":69,"name":"minecraft:lever","runtimeID":540},{"data":1,"id":69,"name":"minecraft:lever","runtimeID":541},{"data":2,"id":69,"name":"minecraft:lever","runtimeID":542},{"data":3,"id":69,"name":"minecraft:lever","runtimeID":543},{"data":4,"id":69,"name":"minecraft:lever","runtimeID":544},{"data":5,"id":69,"name":"minecraft:lever","runtimeID":545},{"data":6,"id":69,"name":"minecraft:lever","runtimeID":546},{"data":7,"id":69,"name":"minecraft:lever","runtimeID":547},{"data":8,"id":69,"name":"minecraft:lever","runtimeID":548},{"data":9,"id":69,"name":"minecraft:lever","runtimeID":549},{"data":10,"id":69,"name":"minecraft:lever","runtimeID":550},{"data":11,"id":69,"name":"minecraft:lever","runtimeID":551},{"data":12,"id":69,"name":"minecraft:lever","runtimeID":552},{"data":13,"id":69,"name":"minecraft:lever","runtimeID":553},{"data":14,"id":69,"name":"minecraft:lever","runtimeID":554},{"data":15,"id":69,"name":"minecraft:lever","runtimeID":555},{"data":0,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":556},{"data":1,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":557},{"data":2,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":558},{"data":3,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":559},{"data":4,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":560},{"data":5,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":561},{"data":6,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":562},{"data":7,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":563},{"data":8,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":564},{"data":9,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":565},{"data":10,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":566},{"data":11,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":567},{"data":12,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":568},{"data":13,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":569},{"data":14,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":570},{"data":15,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":571},{"data":0,"id":71,"name":"minecraft:iron_door","runtimeID":572},{"data":1,"id":71,"name":"minecraft:iron_door","runtimeID":573},{"data":2,"id":71,"name":"minecraft:iron_door","runtimeID":574},{"data":3,"id":71,"name":"minecraft:iron_door","runtimeID":575},{"data":4,"id":71,"name":"minecraft:iron_door","runtimeID":576},{"data":5,"id":71,"name":"minecraft:iron_door","runtimeID":577},{"data":6,"id":71,"name":"minecraft:iron_door","runtimeID":578},{"data":7,"id":71,"name":"minecraft:iron_door","runtimeID":579},{"data":8,"id":71,"name":"minecraft:iron_door","runtimeID":580},{"data":9,"id":71,"name":"minecraft:iron_door","runtimeID":581},{"data":10,"id":71,"name":"minecraft:iron_door","runtimeID":582},{"data":11,"id":71,"name":"minecraft:iron_door","runtimeID":583},{"data":12,"id":71,"name":"minecraft:iron_door","runtimeID":584},{"data":13,"id":71,"name":"minecraft:iron_door","runtimeID":585},{"data":14,"id":71,"name":"minecraft:iron_door","runtimeID":586},{"data":15,"id":71,"name":"minecraft:iron_door","runtimeID":587},{"data":0,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":588},{"data":1,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":589},{"data":2,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":590},{"data":3,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":591},{"data":4,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":592},{"data":5,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":593},{"data":6,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":594},{"data":7,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":595},{"data":8,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":596},{"data":9,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":597},{"data":10,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":598},{"data":11,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":599},{"data":12,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":600},{"data":13,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":601},{"data":14,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":602},{"data":15,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":603},{"data":0,"id":73,"name":"minecraft:redstone_ore","runtimeID":604},{"data":0,"id":74,"name":"minecraft:lit_redstone_ore","runtimeID":605},{"data":0,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":606},{"data":1,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":607},{"data":2,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":608},{"data":3,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":609},{"data":4,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":610},{"data":5,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":611},{"data":6,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":612},{"data":7,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":613},{"data":0,"id":76,"name":"minecraft:redstone_torch","runtimeID":614},{"data":1,"id":76,"name":"minecraft:redstone_torch","runtimeID":615},{"data":2,"id":76,"name":"minecraft:redstone_torch","runtimeID":616},{"data":3,"id":76,"name":"minecraft:redstone_torch","runtimeID":617},{"data":4,"id":76,"name":"minecraft:redstone_torch","runtimeID":618},{"data":5,"id":76,"name":"minecraft:redstone_torch","runtimeID":619},{"data":6,"id":76,"name":"minecraft:redstone_torch","runtimeID":620},{"data":7,"id":76,"name":"minecraft:redstone_torch","runtimeID":621},{"data":0,"id":77,"name":"minecraft:stone_button","runtimeID":622},{"data":1,"id":77,"name":"minecraft:stone_button","runtimeID":623},{"data":2,"id":77,"name":"minecraft:stone_button","runtimeID":624},{"data":3,"id":77,"name":"minecraft:stone_button","runtimeID":625},{"data":4,"id":77,"name":"minecraft:stone_button","runtimeID":626},{"data":5,"id":77,"name":"minecraft:stone_button","runtimeID":627},{"data":6,"id":77,"name":"minecraft:stone_button","runtimeID":628},{"data":7,"id":77,"name":"minecraft:stone_button","runtimeID":629},{"data":8,"id":77,"name":"minecraft:stone_button","runtimeID":630},{"data":9,"id":77,"name":"minecraft:stone_button","runtimeID":631},{"data":10,"id":77,"name":"minecraft:stone_button","runtimeID":632},{"data":11,"id":77,"name":"minecraft:stone_button","runtimeID":633},{"data":12,"id":77,"name":"minecraft:stone_button","runtimeID":634},{"data":13,"id":77,"name":"minecraft:stone_button","runtimeID":635},{"data":14,"id":77,"name":"minecraft:stone_button","runtimeID":636},{"data":15,"id":77,"name":"minecraft:stone_button","runtimeID":637},{"data":0,"id":78,"name":"minecraft:snow_layer","runtimeID":638},{"data":1,"id":78,"name":"minecraft:snow_layer","runtimeID":639},{"data":2,"id":78,"name":"minecraft:snow_layer","runtimeID":640},{"data":3,"id":78,"name":"minecraft:snow_layer","runtimeID":641},{"data":4,"id":78,"name":"minecraft:snow_layer","runtimeID":642},{"data":5,"id":78,"name":"minecraft:snow_layer","runtimeID":643},{"data":6,"id":78,"name":"minecraft:snow_layer","runtimeID":644},{"data":7,"id":78,"name":"minecraft:snow_layer","runtimeID":645},{"data":8,"id":78,"name":"minecraft:snow_layer","runtimeID":646},{"data":9,"id":78,"name":"minecraft:snow_layer","runtimeID":647},{"data":10,"id":78,"name":"minecraft:snow_layer","runtimeID":648},{"data":11,"id":78,"name":"minecraft:snow_layer","runtimeID":649},{"data":12,"id":78,"name":"minecraft:snow_layer","runtimeID":650},{"data":13,"id":78,"name":"minecraft:snow_layer","runtimeID":651},{"data":14,"id":78,"name":"minecraft:snow_layer","runtimeID":652},{"data":15,"id":78,"name":"minecraft:snow_layer","runtimeID":653},{"data":0,"id":79,"name":"minecraft:ice","runtimeID":654},{"data":0,"id":80,"name":"minecraft:snow","runtimeID":655},{"data":0,"id":81,"name":"minecraft:cactus","runtimeID":656},{"data":1,"id":81,"name":"minecraft:cactus","runtimeID":657},{"data":2,"id":81,"name":"minecraft:cactus","runtimeID":658},{"data":3,"id":81,"name":"minecraft:cactus","runtimeID":659},{"data":4,"id":81,"name":"minecraft:cactus","runtimeID":660},{"data":5,"id":81,"name":"minecraft:cactus","runtimeID":661},{"data":6,"id":81,"name":"minecraft:cactus","runtimeID":662},{"data":7,"id":81,"name":"minecraft:cactus","runtimeID":663},{"data":8,"id":81,"name":"minecraft:cactus","runtimeID":664},{"data":9,"id":81,"name":"minecraft:cactus","runtimeID":665},{"data":10,"id":81,"name":"minecraft:cactus","runtimeID":666},{"data":11,"id":81,"name":"minecraft:cactus","runtimeID":667},{"data":12,"id":81,"name":"minecraft:cactus","runtimeID":668},{"data":13,"id":81,"name":"minecraft:cactus","runtimeID":669},{"data":14,"id":81,"name":"minecraft:cactus","runtimeID":670},{"data":15,"id":81,"name":"minecraft:cactus","runtimeID":671},{"data":0,"id":82,"name":"minecraft:clay","runtimeID":672},{"data":0,"id":83,"name":"minecraft:reeds","runtimeID":673},{"data":1,"id":83,"name":"minecraft:reeds","runtimeID":674},{"data":2,"id":83,"name":"minecraft:reeds","runtimeID":675},{"data":3,"id":83,"name":"minecraft:reeds","runtimeID":676},{"data":4,"id":83,"name":"minecraft:reeds","runtimeID":677},{"data":5,"id":83,"name":"minecraft:reeds","runtimeID":678},{"data":6,"id":83,"name":"minecraft:reeds","runtimeID":679},{"data":7,"id":83,"name":"minecraft:reeds","runtimeID":680},{"data":8,"id":83,"name":"minecraft:reeds","runtimeID":681},{"data":9,"id":83,"name":"minecraft:reeds","runtimeID":682},{"data":10,"id":83,"name":"minecraft:reeds","runtimeID":683},{"data":11,"id":83,"name":"minecraft:reeds","runtimeID":684},{"data":12,"id":83,"name":"minecraft:reeds","runtimeID":685},{"data":13,"id":83,"name":"minecraft:reeds","runtimeID":686},{"data":14,"id":83,"name":"minecraft:reeds","runtimeID":687},{"data":15,"id":83,"name":"minecraft:reeds","runtimeID":688},{"data":0,"id":84,"name":"minecraft:jukebox","runtimeID":689},{"data":0,"id":85,"name":"minecraft:fence","runtimeID":690},{"data":1,"id":85,"name":"minecraft:fence","runtimeID":691},{"data":2,"id":85,"name":"minecraft:fence","runtimeID":692},{"data":3,"id":85,"name":"minecraft:fence","runtimeID":693},{"data":4,"id":85,"name":"minecraft:fence","runtimeID":694},{"data":5,"id":85,"name":"minecraft:fence","runtimeID":695},{"data":6,"id":85,"name":"minecraft:fence","runtimeID":696},{"data":7,"id":85,"name":"minecraft:fence","runtimeID":697},{"data":0,"id":86,"name":"minecraft:pumpkin","runtimeID":698},{"data":1,"id":86,"name":"minecraft:pumpkin","runtimeID":699},{"data":2,"id":86,"name":"minecraft:pumpkin","runtimeID":700},{"data":3,"id":86,"name":"minecraft:pumpkin","runtimeID":701},{"data":0,"id":87,"name":"minecraft:netherrack","runtimeID":702},{"data":0,"id":88,"name":"minecraft:soul_sand","runtimeID":703},{"data":0,"id":89,"name":"minecraft:glowstone","runtimeID":704},{"data":0,"id":90,"name":"minecraft:portal","runtimeID":705},{"data":1,"id":90,"name":"minecraft:portal","runtimeID":706},{"data":2,"id":90,"name":"minecraft:portal","runtimeID":707},{"data":3,"id":90,"name":"minecraft:portal","runtimeID":708},{"data":0,"id":91,"name":"minecraft:lit_pumpkin","runtimeID":709},{"data":1,"id":91,"name":"minecraft:lit_pumpkin","runtimeID":710},{"data":2,"id":91,"name":"minecraft:lit_pumpkin","runtimeID":711},{"data":3,"id":91,"name":"minecraft:lit_pumpkin","runtimeID":712},{"data":0,"id":92,"name":"minecraft:cake","runtimeID":713},{"data":1,"id":92,"name":"minecraft:cake","runtimeID":714},{"data":2,"id":92,"name":"minecraft:cake","runtimeID":715},{"data":3,"id":92,"name":"minecraft:cake","runtimeID":716},{"data":4,"id":92,"name":"minecraft:cake","runtimeID":717},{"data":5,"id":92,"name":"minecraft:cake","runtimeID":718},{"data":6,"id":92,"name":"minecraft:cake","runtimeID":719},{"data":7,"id":92,"name":"minecraft:cake","runtimeID":720},{"data":0,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":721},{"data":1,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":722},{"data":2,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":723},{"data":3,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":724},{"data":4,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":725},{"data":5,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":726},{"data":6,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":727},{"data":7,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":728},{"data":8,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":729},{"data":9,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":730},{"data":10,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":731},{"data":11,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":732},{"data":12,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":733},{"data":13,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":734},{"data":14,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":735},{"data":15,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":736},{"data":0,"id":94,"name":"minecraft:powered_repeater","runtimeID":737},{"data":1,"id":94,"name":"minecraft:powered_repeater","runtimeID":738},{"data":2,"id":94,"name":"minecraft:powered_repeater","runtimeID":739},{"data":3,"id":94,"name":"minecraft:powered_repeater","runtimeID":740},{"data":4,"id":94,"name":"minecraft:powered_repeater","runtimeID":741},{"data":5,"id":94,"name":"minecraft:powered_repeater","runtimeID":742},{"data":6,"id":94,"name":"minecraft:powered_repeater","runtimeID":743},{"data":7,"id":94,"name":"minecraft:powered_repeater","runtimeID":744},{"data":8,"id":94,"name":"minecraft:powered_repeater","runtimeID":745},{"data":9,"id":94,"name":"minecraft:powered_repeater","runtimeID":746},{"data":10,"id":94,"name":"minecraft:powered_repeater","runtimeID":747},{"data":11,"id":94,"name":"minecraft:powered_repeater","runtimeID":748},{"data":12,"id":94,"name":"minecraft:powered_repeater","runtimeID":749},{"data":13,"id":94,"name":"minecraft:powered_repeater","runtimeID":750},{"data":14,"id":94,"name":"minecraft:powered_repeater","runtimeID":751},{"data":15,"id":94,"name":"minecraft:powered_repeater","runtimeID":752},{"data":0,"id":95,"name":"minecraft:invisibleBedrock","runtimeID":753},{"data":0,"id":96,"name":"minecraft:trapdoor","runtimeID":754},{"data":1,"id":96,"name":"minecraft:trapdoor","runtimeID":755},{"data":2,"id":96,"name":"minecraft:trapdoor","runtimeID":756},{"data":3,"id":96,"name":"minecraft:trapdoor","runtimeID":757},{"data":4,"id":96,"name":"minecraft:trapdoor","runtimeID":758},{"data":5,"id":96,"name":"minecraft:trapdoor","runtimeID":759},{"data":6,"id":96,"name":"minecraft:trapdoor","runtimeID":760},{"data":7,"id":96,"name":"minecraft:trapdoor","runtimeID":761},{"data":8,"id":96,"name":"minecraft:trapdoor","runtimeID":762},{"data":9,"id":96,"name":"minecraft:trapdoor","runtimeID":763},{"data":10,"id":96,"name":"minecraft:trapdoor","runtimeID":764},{"data":11,"id":96,"name":"minecraft:trapdoor","runtimeID":765},{"data":12,"id":96,"name":"minecraft:trapdoor","runtimeID":766},{"data":13,"id":96,"name":"minecraft:trapdoor","runtimeID":767},{"data":14,"id":96,"name":"minecraft:trapdoor","runtimeID":768},{"data":15,"id":96,"name":"minecraft:trapdoor","runtimeID":769},{"data":0,"id":97,"name":"minecraft:monster_egg","runtimeID":770},{"data":1,"id":97,"name":"minecraft:monster_egg","runtimeID":771},{"data":2,"id":97,"name":"minecraft:monster_egg","runtimeID":772},{"data":3,"id":97,"name":"minecraft:monster_egg","runtimeID":773},{"data":4,"id":97,"name":"minecraft:monster_egg","runtimeID":774},{"data":5,"id":97,"name":"minecraft:monster_egg","runtimeID":775},{"data":6,"id":97,"name":"minecraft:monster_egg","runtimeID":776},{"data":7,"id":97,"name":"minecraft:monster_egg","runtimeID":777},{"data":0,"id":98,"name":"minecraft:stonebrick","runtimeID":778},{"data":1,"id":98,"name":"minecraft:stonebrick","runtimeID":779},{"data":2,"id":98,"name":"minecraft:stonebrick","runtimeID":780},{"data":3,"id":98,"name":"minecraft:stonebrick","runtimeID":781},{"data":4,"id":98,"name":"minecraft:stonebrick","runtimeID":782},{"data":5,"id":98,"name":"minecraft:stonebrick","runtimeID":783},{"data":6,"id":98,"name":"minecraft:stonebrick","runtimeID":784},{"data":7,"id":98,"name":"minecraft:stonebrick","runtimeID":785},{"data":0,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":786},{"data":1,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":787},{"data":2,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":788},{"data":3,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":789},{"data":4,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":790},{"data":5,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":791},{"data":6,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":792},{"data":7,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":793},{"data":8,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":794},{"data":9,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":795},{"data":10,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":796},{"data":11,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":797},{"data":12,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":798},{"data":13,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":799},{"data":14,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":800},{"data":15,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":801},{"data":0,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":802},{"data":1,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":803},{"data":2,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":804},{"data":3,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":805},{"data":4,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":806},{"data":5,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":807},{"data":6,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":808},{"data":7,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":809},{"data":8,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":810},{"data":9,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":811},{"data":10,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":812},{"data":11,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":813},{"data":12,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":814},{"data":13,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":815},{"data":14,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":816},{"data":15,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":817},{"data":0,"id":101,"name":"minecraft:iron_bars","runtimeID":818},{"data":0,"id":102,"name":"minecraft:glass_pane","runtimeID":819},{"data":0,"id":103,"name":"minecraft:melon_block","runtimeID":820},{"data":0,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":821},{"data":1,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":822},{"data":2,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":823},{"data":3,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":824},{"data":4,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":825},{"data":5,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":826},{"data":6,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":827},{"data":7,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":828},{"data":0,"id":105,"name":"minecraft:melon_stem","runtimeID":829},{"data":1,"id":105,"name":"minecraft:melon_stem","runtimeID":830},{"data":2,"id":105,"name":"minecraft:melon_stem","runtimeID":831},{"data":3,"id":105,"name":"minecraft:melon_stem","runtimeID":832},{"data":4,"id":105,"name":"minecraft:melon_stem","runtimeID":833},{"data":5,"id":105,"name":"minecraft:melon_stem","runtimeID":834},{"data":6,"id":105,"name":"minecraft:melon_stem","runtimeID":835},{"data":7,"id":105,"name":"minecraft:melon_stem","runtimeID":836},{"data":0,"id":106,"name":"minecraft:vine","runtimeID":837},{"data":1,"id":106,"name":"minecraft:vine","runtimeID":838},{"data":2,"id":106,"name":"minecraft:vine","runtimeID":839},{"data":3,"id":106,"name":"minecraft:vine","runtimeID":840},{"data":4,"id":106,"name":"minecraft:vine","runtimeID":841},{"data":5,"id":106,"name":"minecraft:vine","runtimeID":842},{"data":6,"id":106,"name":"minecraft:vine","runtimeID":843},{"data":7,"id":106,"name":"minecraft:vine","runtimeID":844},{"data":8,"id":106,"name":"minecraft:vine","runtimeID":845},{"data":9,"id":106,"name":"minecraft:vine","runtimeID":846},{"data":10,"id":106,"name":"minecraft:vine","runtimeID":847},{"data":11,"id":106,"name":"minecraft:vine","runtimeID":848},{"data":12,"id":106,"name":"minecraft:vine","runtimeID":849},{"data":13,"id":106,"name":"minecraft:vine","runtimeID":850},{"data":14,"id":106,"name":"minecraft:vine","runtimeID":851},{"data":15,"id":106,"name":"minecraft:vine","runtimeID":852},{"data":0,"id":107,"name":"minecraft:fence_gate","runtimeID":853},{"data":1,"id":107,"name":"minecraft:fence_gate","runtimeID":854},{"data":2,"id":107,"name":"minecraft:fence_gate","runtimeID":855},{"data":3,"id":107,"name":"minecraft:fence_gate","runtimeID":856},{"data":4,"id":107,"name":"minecraft:fence_gate","runtimeID":857},{"data":5,"id":107,"name":"minecraft:fence_gate","runtimeID":858},{"data":6,"id":107,"name":"minecraft:fence_gate","runtimeID":859},{"data":7,"id":107,"name":"minecraft:fence_gate","runtimeID":860},{"data":8,"id":107,"name":"minecraft:fence_gate","runtimeID":861},{"data":9,"id":107,"name":"minecraft:fence_gate","runtimeID":862},{"data":10,"id":107,"name":"minecraft:fence_gate","runtimeID":863},{"data":11,"id":107,"name":"minecraft:fence_gate","runtimeID":864},{"data":12,"id":107,"name":"minecraft:fence_gate","runtimeID":865},{"data":13,"id":107,"name":"minecraft:fence_gate","runtimeID":866},{"data":14,"id":107,"name":"minecraft:fence_gate","runtimeID":867},{"data":15,"id":107,"name":"minecraft:fence_gate","runtimeID":868},{"data":0,"id":108,"name":"minecraft:brick_stairs","runtimeID":869},{"data":1,"id":108,"name":"minecraft:brick_stairs","runtimeID":870},{"data":2,"id":108,"name":"minecraft:brick_stairs","runtimeID":871},{"data":3,"id":108,"name":"minecraft:brick_stairs","runtimeID":872},{"data":4,"id":108,"name":"minecraft:brick_stairs","runtimeID":873},{"data":5,"id":108,"name":"minecraft:brick_stairs","runtimeID":874},{"data":6,"id":108,"name":"minecraft:brick_stairs","runtimeID":875},{"data":7,"id":108,"name":"minecraft:brick_stairs","runtimeID":876},{"data":0,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":877},{"data":1,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":878},{"data":2,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":879},{"data":3,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":880},{"data":4,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":881},{"data":5,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":882},{"data":6,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":883},{"data":7,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":884},{"data":0,"id":110,"name":"minecraft:mycelium","runtimeID":885},{"data":0,"id":111,"name":"minecraft:waterlily","runtimeID":886},{"data":0,"id":112,"name":"minecraft:nether_brick","runtimeID":887},{"data":0,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":888},{"data":1,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":889},{"data":2,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":890},{"data":3,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":891},{"data":4,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":892},{"data":5,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":893},{"data":6,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":894},{"data":7,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":895},{"data":0,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":896},{"data":1,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":897},{"data":2,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":898},{"data":3,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":899},{"data":4,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":900},{"data":5,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":901},{"data":6,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":902},{"data":7,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":903},{"data":0,"id":115,"name":"minecraft:nether_wart","runtimeID":904},{"data":1,"id":115,"name":"minecraft:nether_wart","runtimeID":905},{"data":2,"id":115,"name":"minecraft:nether_wart","runtimeID":906},{"data":3,"id":115,"name":"minecraft:nether_wart","runtimeID":907},{"data":0,"id":116,"name":"minecraft:enchanting_table","runtimeID":908},{"data":0,"id":117,"name":"minecraft:brewing_stand","runtimeID":909},{"data":1,"id":117,"name":"minecraft:brewing_stand","runtimeID":910},{"data":2,"id":117,"name":"minecraft:brewing_stand","runtimeID":911},{"data":3,"id":117,"name":"minecraft:brewing_stand","runtimeID":912},{"data":4,"id":117,"name":"minecraft:brewing_stand","runtimeID":913},{"data":5,"id":117,"name":"minecraft:brewing_stand","runtimeID":914},{"data":6,"id":117,"name":"minecraft:brewing_stand","runtimeID":915},{"data":7,"id":117,"name":"minecraft:brewing_stand","runtimeID":916},{"data":0,"id":118,"name":"minecraft:cauldron","runtimeID":917},{"data":1,"id":118,"name":"minecraft:cauldron","runtimeID":918},{"data":2,"id":118,"name":"minecraft:cauldron","runtimeID":919},{"data":3,"id":118,"name":"minecraft:cauldron","runtimeID":920},{"data":4,"id":118,"name":"minecraft:cauldron","runtimeID":921},{"data":5,"id":118,"name":"minecraft:cauldron","runtimeID":922},{"data":6,"id":118,"name":"minecraft:cauldron","runtimeID":923},{"data":7,"id":118,"name":"minecraft:cauldron","runtimeID":924},{"data":0,"id":119,"name":"minecraft:end_portal","runtimeID":925},{"data":0,"id":120,"name":"minecraft:end_portal_frame","runtimeID":926},{"data":1,"id":120,"name":"minecraft:end_portal_frame","runtimeID":927},{"data":2,"id":120,"name":"minecraft:end_portal_frame","runtimeID":928},{"data":3,"id":120,"name":"minecraft:end_portal_frame","runtimeID":929},{"data":4,"id":120,"name":"minecraft:end_portal_frame","runtimeID":930},{"data":5,"id":120,"name":"minecraft:end_portal_frame","runtimeID":931},{"data":6,"id":120,"name":"minecraft:end_portal_frame","runtimeID":932},{"data":7,"id":120,"name":"minecraft:end_portal_frame","runtimeID":933},{"data":0,"id":121,"name":"minecraft:end_stone","runtimeID":934},{"data":0,"id":122,"name":"minecraft:dragon_egg","runtimeID":935},{"data":0,"id":123,"name":"minecraft:redstone_lamp","runtimeID":936},{"data":0,"id":124,"name":"minecraft:lit_redstone_lamp","runtimeID":937},{"data":0,"id":125,"name":"minecraft:dropper","runtimeID":938},{"data":1,"id":125,"name":"minecraft:dropper","runtimeID":939},{"data":2,"id":125,"name":"minecraft:dropper","runtimeID":940},{"data":3,"id":125,"name":"minecraft:dropper","runtimeID":941},{"data":4,"id":125,"name":"minecraft:dropper","runtimeID":942},{"data":5,"id":125,"name":"minecraft:dropper","runtimeID":943},{"data":6,"id":125,"name":"minecraft:dropper","runtimeID":944},{"data":7,"id":125,"name":"minecraft:dropper","runtimeID":945},{"data":8,"id":125,"name":"minecraft:dropper","runtimeID":946},{"data":9,"id":125,"name":"minecraft:dropper","runtimeID":947},{"data":10,"id":125,"name":"minecraft:dropper","runtimeID":948},{"data":11,"id":125,"name":"minecraft:dropper","runtimeID":949},{"data":12,"id":125,"name":"minecraft:dropper","runtimeID":950},{"data":13,"id":125,"name":"minecraft:dropper","runtimeID":951},{"data":14,"id":125,"name":"minecraft:dropper","runtimeID":952},{"data":15,"id":125,"name":"minecraft:dropper","runtimeID":953},{"data":0,"id":126,"name":"minecraft:activator_rail","runtimeID":954},{"data":1,"id":126,"name":"minecraft:activator_rail","runtimeID":955},{"data":2,"id":126,"name":"minecraft:activator_rail","runtimeID":956},{"data":3,"id":126,"name":"minecraft:activator_rail","runtimeID":957},{"data":4,"id":126,"name":"minecraft:activator_rail","runtimeID":958},{"data":5,"id":126,"name":"minecraft:activator_rail","runtimeID":959},{"data":6,"id":126,"name":"minecraft:activator_rail","runtimeID":960},{"data":7,"id":126,"name":"minecraft:activator_rail","runtimeID":961},{"data":8,"id":126,"name":"minecraft:activator_rail","runtimeID":962},{"data":9,"id":126,"name":"minecraft:activator_rail","runtimeID":963},{"data":10,"id":126,"name":"minecraft:activator_rail","runtimeID":964},{"data":11,"id":126,"name":"minecraft:activator_rail","runtimeID":965},{"data":12,"id":126,"name":"minecraft:activator_rail","runtimeID":966},{"data":13,"id":126,"name":"minecraft:activator_rail","runtimeID":967},{"data":14,"id":126,"name":"minecraft:activator_rail","runtimeID":968},{"data":15,"id":126,"name":"minecraft:activator_rail","runtimeID":969},{"data":0,"id":127,"name":"minecraft:cocoa","runtimeID":970},{"data":1,"id":127,"name":"minecraft:cocoa","runtimeID":971},{"data":2,"id":127,"name":"minecraft:cocoa","runtimeID":972},{"data":3,"id":127,"name":"minecraft:cocoa","runtimeID":973},{"data":4,"id":127,"name":"minecraft:cocoa","runtimeID":974},{"data":5,"id":127,"name":"minecraft:cocoa","runtimeID":975},{"data":6,"id":127,"name":"minecraft:cocoa","runtimeID":976},{"data":7,"id":127,"name":"minecraft:cocoa","runtimeID":977},{"data":8,"id":127,"name":"minecraft:cocoa","runtimeID":978},{"data":9,"id":127,"name":"minecraft:cocoa","runtimeID":979},{"data":10,"id":127,"name":"minecraft:cocoa","runtimeID":980},{"data":11,"id":127,"name":"minecraft:cocoa","runtimeID":981},{"data":12,"id":127,"name":"minecraft:cocoa","runtimeID":982},{"data":13,"id":127,"name":"minecraft:cocoa","runtimeID":983},{"data":14,"id":127,"name":"minecraft:cocoa","runtimeID":984},{"data":15,"id":127,"name":"minecraft:cocoa","runtimeID":985},{"data":0,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":986},{"data":1,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":987},{"data":2,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":988},{"data":3,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":989},{"data":4,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":990},{"data":5,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":991},{"data":6,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":992},{"data":7,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":993},{"data":0,"id":129,"name":"minecraft:emerald_ore","runtimeID":994},{"data":0,"id":130,"name":"minecraft:ender_chest","runtimeID":995},{"data":1,"id":130,"name":"minecraft:ender_chest","runtimeID":996},{"data":2,"id":130,"name":"minecraft:ender_chest","runtimeID":997},{"data":3,"id":130,"name":"minecraft:ender_chest","runtimeID":998},{"data":4,"id":130,"name":"minecraft:ender_chest","runtimeID":999},{"data":5,"id":130,"name":"minecraft:ender_chest","runtimeID":1000},{"data":6,"id":130,"name":"minecraft:ender_chest","runtimeID":1001},{"data":7,"id":130,"name":"minecraft:ender_chest","runtimeID":1002},{"data":0,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1003},{"data":1,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1004},{"data":2,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1005},{"data":3,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1006},{"data":4,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1007},{"data":5,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1008},{"data":6,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1009},{"data":7,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1010},{"data":8,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1011},{"data":9,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1012},{"data":10,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1013},{"data":11,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1014},{"data":12,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1015},{"data":13,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1016},{"data":14,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1017},{"data":15,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1018},{"data":0,"id":132,"name":"minecraft:tripWire","runtimeID":1019},{"data":1,"id":132,"name":"minecraft:tripWire","runtimeID":1020},{"data":2,"id":132,"name":"minecraft:tripWire","runtimeID":1021},{"data":3,"id":132,"name":"minecraft:tripWire","runtimeID":1022},{"data":4,"id":132,"name":"minecraft:tripWire","runtimeID":1023},{"data":5,"id":132,"name":"minecraft:tripWire","runtimeID":1024},{"data":6,"id":132,"name":"minecraft:tripWire","runtimeID":1025},{"data":7,"id":132,"name":"minecraft:tripWire","runtimeID":1026},{"data":8,"id":132,"name":"minecraft:tripWire","runtimeID":1027},{"data":9,"id":132,"name":"minecraft:tripWire","runtimeID":1028},{"data":10,"id":132,"name":"minecraft:tripWire","runtimeID":1029},{"data":11,"id":132,"name":"minecraft:tripWire","runtimeID":1030},{"data":12,"id":132,"name":"minecraft:tripWire","runtimeID":1031},{"data":13,"id":132,"name":"minecraft:tripWire","runtimeID":1032},{"data":14,"id":132,"name":"minecraft:tripWire","runtimeID":1033},{"data":15,"id":132,"name":"minecraft:tripWire","runtimeID":1034},{"data":0,"id":133,"name":"minecraft:emerald_block","runtimeID":1035},{"data":0,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1036},{"data":1,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1037},{"data":2,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1038},{"data":3,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1039},{"data":4,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1040},{"data":5,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1041},{"data":6,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1042},{"data":7,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1043},{"data":0,"id":135,"name":"minecraft:birch_stairs","runtimeID":1044},{"data":1,"id":135,"name":"minecraft:birch_stairs","runtimeID":1045},{"data":2,"id":135,"name":"minecraft:birch_stairs","runtimeID":1046},{"data":3,"id":135,"name":"minecraft:birch_stairs","runtimeID":1047},{"data":4,"id":135,"name":"minecraft:birch_stairs","runtimeID":1048},{"data":5,"id":135,"name":"minecraft:birch_stairs","runtimeID":1049},{"data":6,"id":135,"name":"minecraft:birch_stairs","runtimeID":1050},{"data":7,"id":135,"name":"minecraft:birch_stairs","runtimeID":1051},{"data":0,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1052},{"data":1,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1053},{"data":2,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1054},{"data":3,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1055},{"data":4,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1056},{"data":5,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1057},{"data":6,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1058},{"data":7,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1059},{"data":0,"id":137,"name":"minecraft:command_block","runtimeID":1060},{"data":1,"id":137,"name":"minecraft:command_block","runtimeID":1061},{"data":2,"id":137,"name":"minecraft:command_block","runtimeID":1062},{"data":3,"id":137,"name":"minecraft:command_block","runtimeID":1063},{"data":4,"id":137,"name":"minecraft:command_block","runtimeID":1064},{"data":5,"id":137,"name":"minecraft:command_block","runtimeID":1065},{"data":6,"id":137,"name":"minecraft:command_block","runtimeID":1066},{"data":7,"id":137,"name":"minecraft:command_block","runtimeID":1067},{"data":8,"id":137,"name":"minecraft:command_block","runtimeID":1068},{"data":9,"id":137,"name":"minecraft:command_block","runtimeID":1069},{"data":10,"id":137,"name":"minecraft:command_block","runtimeID":1070},{"data":11,"id":137,"name":"minecraft:command_block","runtimeID":1071},{"data":12,"id":137,"name":"minecraft:command_block","runtimeID":1072},{"data":13,"id":137,"name":"minecraft:command_block","runtimeID":1073},{"data":14,"id":137,"name":"minecraft:command_block","runtimeID":1074},{"data":15,"id":137,"name":"minecraft:command_block","runtimeID":1075},{"data":0,"id":138,"name":"minecraft:beacon","runtimeID":1076},{"data":0,"id":139,"name":"minecraft:cobblestone_wall","runtimeID":1077},{"data":1,"id":139,"name":"minecraft:cobblestone_wall","runtimeID":1078},{"data":0,"id":140,"name":"minecraft:flower_pot","runtimeID":1079},{"data":1,"id":140,"name":"minecraft:flower_pot","runtimeID":1080},{"data":0,"id":141,"name":"minecraft:carrots","runtimeID":1081},{"data":1,"id":141,"name":"minecraft:carrots","runtimeID":1082},{"data":2,"id":141,"name":"minecraft:carrots","runtimeID":1083},{"data":3,"id":141,"name":"minecraft:carrots","runtimeID":1084},{"data":4,"id":141,"name":"minecraft:carrots","runtimeID":1085},{"data":5,"id":141,"name":"minecraft:carrots","runtimeID":1086},{"data":6,"id":141,"name":"minecraft:carrots","runtimeID":1087},{"data":7,"id":141,"name":"minecraft:carrots","runtimeID":1088},{"data":0,"id":142,"name":"minecraft:potatoes","runtimeID":1089},{"data":1,"id":142,"name":"minecraft:potatoes","runtimeID":1090},{"data":2,"id":142,"name":"minecraft:potatoes","runtimeID":1091},{"data":3,"id":142,"name":"minecraft:potatoes","runtimeID":1092},{"data":4,"id":142,"name":"minecraft:potatoes","runtimeID":1093},{"data":5,"id":142,"name":"minecraft:potatoes","runtimeID":1094},{"data":6,"id":142,"name":"minecraft:potatoes","runtimeID":1095},{"data":7,"id":142,"name":"minecraft:potatoes","runtimeID":1096},{"data":0,"id":143,"name":"minecraft:wooden_button","runtimeID":1097},{"data":1,"id":143,"name":"minecraft:wooden_button","runtimeID":1098},{"data":2,"id":143,"name":"minecraft:wooden_button","runtimeID":1099},{"data":3,"id":143,"name":"minecraft:wooden_button","runtimeID":1100},{"data":4,"id":143,"name":"minecraft:wooden_button","runtimeID":1101},{"data":5,"id":143,"name":"minecraft:wooden_button","runtimeID":1102},{"data":6,"id":143,"name":"minecraft:wooden_button","runtimeID":1103},{"data":7,"id":143,"name":"minecraft:wooden_button","runtimeID":1104},{"data":8,"id":143,"name":"minecraft:wooden_button","runtimeID":1105},{"data":9,"id":143,"name":"minecraft:wooden_button","runtimeID":1106},{"data":10,"id":143,"name":"minecraft:wooden_button","runtimeID":1107},{"data":11,"id":143,"name":"minecraft:wooden_button","runtimeID":1108},{"data":12,"id":143,"name":"minecraft:wooden_button","runtimeID":1109},{"data":13,"id":143,"name":"minecraft:wooden_button","runtimeID":1110},{"data":14,"id":143,"name":"minecraft:wooden_button","runtimeID":1111},{"data":15,"id":143,"name":"minecraft:wooden_button","runtimeID":1112},{"data":0,"id":144,"name":"minecraft:skull","runtimeID":1113},{"data":1,"id":144,"name":"minecraft:skull","runtimeID":1114},{"data":2,"id":144,"name":"minecraft:skull","runtimeID":1115},{"data":3,"id":144,"name":"minecraft:skull","runtimeID":1116},{"data":4,"id":144,"name":"minecraft:skull","runtimeID":1117},{"data":5,"id":144,"name":"minecraft:skull","runtimeID":1118},{"data":6,"id":144,"name":"minecraft:skull","runtimeID":1119},{"data":7,"id":144,"name":"minecraft:skull","runtimeID":1120},{"data":8,"id":144,"name":"minecraft:skull","runtimeID":1121},{"data":9,"id":144,"name":"minecraft:skull","runtimeID":1122},{"data":10,"id":144,"name":"minecraft:skull","runtimeID":1123},{"data":11,"id":144,"name":"minecraft:skull","runtimeID":1124},{"data":12,"id":144,"name":"minecraft:skull","runtimeID":1125},{"data":13,"id":144,"name":"minecraft:skull","runtimeID":1126},{"data":14,"id":144,"name":"minecraft:skull","runtimeID":1127},{"data":15,"id":144,"name":"minecraft:skull","runtimeID":1128},{"data":0,"id":145,"name":"minecraft:anvil","runtimeID":1129},{"data":1,"id":145,"name":"minecraft:anvil","runtimeID":1130},{"data":2,"id":145,"name":"minecraft:anvil","runtimeID":1131},{"data":3,"id":145,"name":"minecraft:anvil","runtimeID":1132},{"data":4,"id":145,"name":"minecraft:anvil","runtimeID":1133},{"data":5,"id":145,"name":"minecraft:anvil","runtimeID":1134},{"data":6,"id":145,"name":"minecraft:anvil","runtimeID":1135},{"data":7,"id":145,"name":"minecraft:anvil","runtimeID":1136},{"data":8,"id":145,"name":"minecraft:anvil","runtimeID":1137},{"data":9,"id":145,"name":"minecraft:anvil","runtimeID":1138},{"data":10,"id":145,"name":"minecraft:anvil","runtimeID":1139},{"data":11,"id":145,"name":"minecraft:anvil","runtimeID":1140},{"data":12,"id":145,"name":"minecraft:anvil","runtimeID":1141},{"data":13,"id":145,"name":"minecraft:anvil","runtimeID":1142},{"data":14,"id":145,"name":"minecraft:anvil","runtimeID":1143},{"data":15,"id":145,"name":"minecraft:anvil","runtimeID":1144},{"data":0,"id":146,"name":"minecraft:trapped_chest","runtimeID":1145},{"data":1,"id":146,"name":"minecraft:trapped_chest","runtimeID":1146},{"data":2,"id":146,"name":"minecraft:trapped_chest","runtimeID":1147},{"data":3,"id":146,"name":"minecraft:trapped_chest","runtimeID":1148},{"data":4,"id":146,"name":"minecraft:trapped_chest","runtimeID":1149},{"data":5,"id":146,"name":"minecraft:trapped_chest","runtimeID":1150},{"data":6,"id":146,"name":"minecraft:trapped_chest","runtimeID":1151},{"data":7,"id":146,"name":"minecraft:trapped_chest","runtimeID":1152},{"data":0,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1153},{"data":1,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1154},{"data":2,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1155},{"data":3,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1156},{"data":4,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1157},{"data":5,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1158},{"data":6,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1159},{"data":7,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1160},{"data":8,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1161},{"data":9,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1162},{"data":10,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1163},{"data":11,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1164},{"data":12,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1165},{"data":13,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1166},{"data":14,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1167},{"data":15,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1168},{"data":0,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1169},{"data":1,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1170},{"data":2,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1171},{"data":3,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1172},{"data":4,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1173},{"data":5,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1174},{"data":6,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1175},{"data":7,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1176},{"data":8,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1177},{"data":9,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1178},{"data":10,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1179},{"data":11,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1180},{"data":12,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1181},{"data":13,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1182},{"data":14,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1183},{"data":15,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1184},{"data":0,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1185},{"data":1,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1186},{"data":2,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1187},{"data":3,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1188},{"data":4,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1189},{"data":5,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1190},{"data":6,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1191},{"data":7,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1192},{"data":8,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1193},{"data":9,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1194},{"data":10,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1195},{"data":11,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1196},{"data":12,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1197},{"data":13,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1198},{"data":14,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1199},{"data":15,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1200},{"data":0,"id":150,"name":"minecraft:powered_comparator","runtimeID":1201},{"data":1,"id":150,"name":"minecraft:powered_comparator","runtimeID":1202},{"data":2,"id":150,"name":"minecraft:powered_comparator","runtimeID":1203},{"data":3,"id":150,"name":"minecraft:powered_comparator","runtimeID":1204},{"data":4,"id":150,"name":"minecraft:powered_comparator","runtimeID":1205},{"data":5,"id":150,"name":"minecraft:powered_comparator","runtimeID":1206},{"data":6,"id":150,"name":"minecraft:powered_comparator","runtimeID":1207},{"data":7,"id":150,"name":"minecraft:powered_comparator","runtimeID":1208},{"data":8,"id":150,"name":"minecraft:powered_comparator","runtimeID":1209},{"data":9,"id":150,"name":"minecraft:powered_comparator","runtimeID":1210},{"data":10,"id":150,"name":"minecraft:powered_comparator","runtimeID":1211},{"data":11,"id":150,"name":"minecraft:powered_comparator","runtimeID":1212},{"data":12,"id":150,"name":"minecraft:powered_comparator","runtimeID":1213},{"data":13,"id":150,"name":"minecraft:powered_comparator","runtimeID":1214},{"data":14,"id":150,"name":"minecraft:powered_comparator","runtimeID":1215},{"data":15,"id":150,"name":"minecraft:powered_comparator","runtimeID":1216},{"data":0,"id":151,"name":"minecraft:daylight_detector","runtimeID":1217},{"data":1,"id":151,"name":"minecraft:daylight_detector","runtimeID":1218},{"data":2,"id":151,"name":"minecraft:daylight_detector","runtimeID":1219},{"data":3,"id":151,"name":"minecraft:daylight_detector","runtimeID":1220},{"data":4,"id":151,"name":"minecraft:daylight_detector","runtimeID":1221},{"data":5,"id":151,"name":"minecraft:daylight_detector","runtimeID":1222},{"data":6,"id":151,"name":"minecraft:daylight_detector","runtimeID":1223},{"data":7,"id":151,"name":"minecraft:daylight_detector","runtimeID":1224},{"data":8,"id":151,"name":"minecraft:daylight_detector","runtimeID":1225},{"data":9,"id":151,"name":"minecraft:daylight_detector","runtimeID":1226},{"data":10,"id":151,"name":"minecraft:daylight_detector","runtimeID":1227},{"data":11,"id":151,"name":"minecraft:daylight_detector","runtimeID":1228},{"data":12,"id":151,"name":"minecraft:daylight_detector","runtimeID":1229},{"data":13,"id":151,"name":"minecraft:daylight_detector","runtimeID":1230},{"data":14,"id":151,"name":"minecraft:daylight_detector","runtimeID":1231},{"data":15,"id":151,"name":"minecraft:daylight_detector","runtimeID":1232},{"data":0,"id":152,"name":"minecraft:redstone_block","runtimeID":1233},{"data":0,"id":153,"name":"minecraft:quartz_ore","runtimeID":1234},{"data":0,"id":154,"name":"minecraft:hopper","runtimeID":1235},{"data":1,"id":154,"name":"minecraft:hopper","runtimeID":1236},{"data":2,"id":154,"name":"minecraft:hopper","runtimeID":1237},{"data":3,"id":154,"name":"minecraft:hopper","runtimeID":1238},{"data":4,"id":154,"name":"minecraft:hopper","runtimeID":1239},{"data":5,"id":154,"name":"minecraft:hopper","runtimeID":1240},{"data":6,"id":154,"name":"minecraft:hopper","runtimeID":1241},{"data":7,"id":154,"name":"minecraft:hopper","runtimeID":1242},{"data":8,"id":154,"name":"minecraft:hopper","runtimeID":1243},{"data":9,"id":154,"name":"minecraft:hopper","runtimeID":1244},{"data":10,"id":154,"name":"minecraft:hopper","runtimeID":1245},{"data":11,"id":154,"name":"minecraft:hopper","runtimeID":1246},{"data":12,"id":154,"name":"minecraft:hopper","runtimeID":1247},{"data":13,"id":154,"name":"minecraft:hopper","runtimeID":1248},{"data":14,"id":154,"name":"minecraft:hopper","runtimeID":1249},{"data":15,"id":154,"name":"minecraft:hopper","runtimeID":1250},{"data":0,"id":155,"name":"minecraft:quartz_block","runtimeID":1251},{"data":1,"id":155,"name":"minecraft:quartz_block","runtimeID":1252},{"data":2,"id":155,"name":"minecraft:quartz_block","runtimeID":1253},{"data":3,"id":155,"name":"minecraft:quartz_block","runtimeID":1254},{"data":4,"id":155,"name":"minecraft:quartz_block","runtimeID":1255},{"data":5,"id":155,"name":"minecraft:quartz_block","runtimeID":1256},{"data":6,"id":155,"name":"minecraft:quartz_block","runtimeID":1257},{"data":7,"id":155,"name":"minecraft:quartz_block","runtimeID":1258},{"data":8,"id":155,"name":"minecraft:quartz_block","runtimeID":1259},{"data":9,"id":155,"name":"minecraft:quartz_block","runtimeID":1260},{"data":10,"id":155,"name":"minecraft:quartz_block","runtimeID":1261},{"data":11,"id":155,"name":"minecraft:quartz_block","runtimeID":1262},{"data":12,"id":155,"name":"minecraft:quartz_block","runtimeID":1263},{"data":13,"id":155,"name":"minecraft:quartz_block","runtimeID":1264},{"data":14,"id":155,"name":"minecraft:quartz_block","runtimeID":1265},{"data":15,"id":155,"name":"minecraft:quartz_block","runtimeID":1266},{"data":0,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1267},{"data":1,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1268},{"data":2,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1269},{"data":3,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1270},{"data":4,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1271},{"data":5,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1272},{"data":6,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1273},{"data":7,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1274},{"data":0,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1275},{"data":1,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1276},{"data":2,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1277},{"data":3,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1278},{"data":4,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1279},{"data":5,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1280},{"data":6,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1281},{"data":7,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1282},{"data":8,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1283},{"data":9,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1284},{"data":10,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1285},{"data":11,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1286},{"data":12,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1287},{"data":13,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1288},{"data":14,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1289},{"data":15,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1290},{"data":0,"id":158,"name":"minecraft:wooden_slab","runtimeID":1291},{"data":1,"id":158,"name":"minecraft:wooden_slab","runtimeID":1292},{"data":2,"id":158,"name":"minecraft:wooden_slab","runtimeID":1293},{"data":3,"id":158,"name":"minecraft:wooden_slab","runtimeID":1294},{"data":4,"id":158,"name":"minecraft:wooden_slab","runtimeID":1295},{"data":5,"id":158,"name":"minecraft:wooden_slab","runtimeID":1296},{"data":6,"id":158,"name":"minecraft:wooden_slab","runtimeID":1297},{"data":7,"id":158,"name":"minecraft:wooden_slab","runtimeID":1298},{"data":8,"id":158,"name":"minecraft:wooden_slab","runtimeID":1299},{"data":9,"id":158,"name":"minecraft:wooden_slab","runtimeID":1300},{"data":10,"id":158,"name":"minecraft:wooden_slab","runtimeID":1301},{"data":11,"id":158,"name":"minecraft:wooden_slab","runtimeID":1302},{"data":12,"id":158,"name":"minecraft:wooden_slab","runtimeID":1303},{"data":13,"id":158,"name":"minecraft:wooden_slab","runtimeID":1304},{"data":14,"id":158,"name":"minecraft:wooden_slab","runtimeID":1305},{"data":15,"id":158,"name":"minecraft:wooden_slab","runtimeID":1306},{"data":0,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1307},{"data":1,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1308},{"data":2,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1309},{"data":3,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1310},{"data":4,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1311},{"data":5,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1312},{"data":6,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1313},{"data":7,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1314},{"data":8,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1315},{"data":9,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1316},{"data":10,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1317},{"data":11,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1318},{"data":12,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1319},{"data":13,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1320},{"data":14,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1321},{"data":15,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1322},{"data":0,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1323},{"data":1,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1324},{"data":2,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1325},{"data":3,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1326},{"data":4,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1327},{"data":5,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1328},{"data":6,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1329},{"data":7,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1330},{"data":8,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1331},{"data":9,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1332},{"data":10,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1333},{"data":11,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1334},{"data":12,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1335},{"data":13,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1336},{"data":14,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1337},{"data":15,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1338},{"data":0,"id":161,"name":"minecraft:leaves2","runtimeID":1339},{"data":1,"id":161,"name":"minecraft:leaves2","runtimeID":1340},{"data":2,"id":161,"name":"minecraft:leaves2","runtimeID":1341},{"data":3,"id":161,"name":"minecraft:leaves2","runtimeID":1342},{"data":4,"id":161,"name":"minecraft:leaves2","runtimeID":1343},{"data":5,"id":161,"name":"minecraft:leaves2","runtimeID":1344},{"data":6,"id":161,"name":"minecraft:leaves2","runtimeID":1345},{"data":7,"id":161,"name":"minecraft:leaves2","runtimeID":1346},{"data":8,"id":161,"name":"minecraft:leaves2","runtimeID":1347},{"data":9,"id":161,"name":"minecraft:leaves2","runtimeID":1348},{"data":10,"id":161,"name":"minecraft:leaves2","runtimeID":1349},{"data":11,"id":161,"name":"minecraft:leaves2","runtimeID":1350},{"data":12,"id":161,"name":"minecraft:leaves2","runtimeID":1351},{"data":13,"id":161,"name":"minecraft:leaves2","runtimeID":1352},{"data":14,"id":161,"name":"minecraft:leaves2","runtimeID":1353},{"data":15,"id":161,"name":"minecraft:leaves2","runtimeID":1354},{"data":0,"id":162,"name":"minecraft:log2","runtimeID":1355},{"data":1,"id":162,"name":"minecraft:log2","runtimeID":1356},{"data":2,"id":162,"name":"minecraft:log2","runtimeID":1357},{"data":3,"id":162,"name":"minecraft:log2","runtimeID":1358},{"data":4,"id":162,"name":"minecraft:log2","runtimeID":1359},{"data":5,"id":162,"name":"minecraft:log2","runtimeID":1360},{"data":6,"id":162,"name":"minecraft:log2","runtimeID":1361},{"data":7,"id":162,"name":"minecraft:log2","runtimeID":1362},{"data":8,"id":162,"name":"minecraft:log2","runtimeID":1363},{"data":9,"id":162,"name":"minecraft:log2","runtimeID":1364},{"data":10,"id":162,"name":"minecraft:log2","runtimeID":1365},{"data":11,"id":162,"name":"minecraft:log2","runtimeID":1366},{"data":12,"id":162,"name":"minecraft:log2","runtimeID":1367},{"data":13,"id":162,"name":"minecraft:log2","runtimeID":1368},{"data":14,"id":162,"name":"minecraft:log2","runtimeID":1369},{"data":15,"id":162,"name":"minecraft:log2","runtimeID":1370},{"data":0,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1371},{"data":1,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1372},{"data":2,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1373},{"data":3,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1374},{"data":4,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1375},{"data":5,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1376},{"data":6,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1377},{"data":7,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1378},{"data":0,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1379},{"data":1,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1380},{"data":2,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1381},{"data":3,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1382},{"data":4,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1383},{"data":5,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1384},{"data":6,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1385},{"data":7,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1386},{"data":0,"id":165,"name":"minecraft:slime","runtimeID":1387},{"data":0,"id":166,"name":"minecraft:glow_stick","runtimeID":1388},{"data":1,"id":166,"name":"minecraft:glow_stick","runtimeID":1389},{"data":2,"id":166,"name":"minecraft:glow_stick","runtimeID":1390},{"data":3,"id":166,"name":"minecraft:glow_stick","runtimeID":1391},{"data":4,"id":166,"name":"minecraft:glow_stick","runtimeID":1392},{"data":5,"id":166,"name":"minecraft:glow_stick","runtimeID":1393},{"data":6,"id":166,"name":"minecraft:glow_stick","runtimeID":1394},{"data":7,"id":166,"name":"minecraft:glow_stick","runtimeID":1395},{"data":8,"id":166,"name":"minecraft:glow_stick","runtimeID":1396},{"data":9,"id":166,"name":"minecraft:glow_stick","runtimeID":1397},{"data":10,"id":166,"name":"minecraft:glow_stick","runtimeID":1398},{"data":11,"id":166,"name":"minecraft:glow_stick","runtimeID":1399},{"data":12,"id":166,"name":"minecraft:glow_stick","runtimeID":1400},{"data":13,"id":166,"name":"minecraft:glow_stick","runtimeID":1401},{"data":14,"id":166,"name":"minecraft:glow_stick","runtimeID":1402},{"data":15,"id":166,"name":"minecraft:glow_stick","runtimeID":1403},{"data":0,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1404},{"data":1,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1405},{"data":2,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1406},{"data":3,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1407},{"data":4,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1408},{"data":5,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1409},{"data":6,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1410},{"data":7,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1411},{"data":8,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1412},{"data":9,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1413},{"data":10,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1414},{"data":11,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1415},{"data":12,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1416},{"data":13,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1417},{"data":14,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1418},{"data":15,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1419},{"data":0,"id":168,"name":"minecraft:prismarine","runtimeID":1420},{"data":1,"id":168,"name":"minecraft:prismarine","runtimeID":1421},{"data":2,"id":168,"name":"minecraft:prismarine","runtimeID":1422},{"data":3,"id":168,"name":"minecraft:prismarine","runtimeID":1423},{"data":0,"id":169,"name":"minecraft:seaLantern","runtimeID":1424},{"data":0,"id":170,"name":"minecraft:hay_block","runtimeID":1425},{"data":1,"id":170,"name":"minecraft:hay_block","runtimeID":1426},{"data":2,"id":170,"name":"minecraft:hay_block","runtimeID":1427},{"data":3,"id":170,"name":"minecraft:hay_block","runtimeID":1428},{"data":4,"id":170,"name":"minecraft:hay_block","runtimeID":1429},{"data":5,"id":170,"name":"minecraft:hay_block","runtimeID":1430},{"data":6,"id":170,"name":"minecraft:hay_block","runtimeID":1431},{"data":7,"id":170,"name":"minecraft:hay_block","runtimeID":1432},{"data":8,"id":170,"name":"minecraft:hay_block","runtimeID":1433},{"data":9,"id":170,"name":"minecraft:hay_block","runtimeID":1434},{"data":10,"id":170,"name":"minecraft:hay_block","runtimeID":1435},{"data":11,"id":170,"name":"minecraft:hay_block","runtimeID":1436},{"data":12,"id":170,"name":"minecraft:hay_block","runtimeID":1437},{"data":13,"id":170,"name":"minecraft:hay_block","runtimeID":1438},{"data":14,"id":170,"name":"minecraft:hay_block","runtimeID":1439},{"data":15,"id":170,"name":"minecraft:hay_block","runtimeID":1440},{"data":0,"id":171,"name":"minecraft:carpet","runtimeID":1441},{"data":1,"id":171,"name":"minecraft:carpet","runtimeID":1442},{"data":2,"id":171,"name":"minecraft:carpet","runtimeID":1443},{"data":3,"id":171,"name":"minecraft:carpet","runtimeID":1444},{"data":4,"id":171,"name":"minecraft:carpet","runtimeID":1445},{"data":5,"id":171,"name":"minecraft:carpet","runtimeID":1446},{"data":6,"id":171,"name":"minecraft:carpet","runtimeID":1447},{"data":7,"id":171,"name":"minecraft:carpet","runtimeID":1448},{"data":8,"id":171,"name":"minecraft:carpet","runtimeID":1449},{"data":9,"id":171,"name":"minecraft:carpet","runtimeID":1450},{"data":10,"id":171,"name":"minecraft:carpet","runtimeID":1451},{"data":11,"id":171,"name":"minecraft:carpet","runtimeID":1452},{"data":12,"id":171,"name":"minecraft:carpet","runtimeID":1453},{"data":13,"id":171,"name":"minecraft:carpet","runtimeID":1454},{"data":14,"id":171,"name":"minecraft:carpet","runtimeID":1455},{"data":15,"id":171,"name":"minecraft:carpet","runtimeID":1456},{"data":0,"id":172,"name":"minecraft:hardened_clay","runtimeID":1457},{"data":0,"id":173,"name":"minecraft:coal_block","runtimeID":1458},{"data":0,"id":174,"name":"minecraft:packed_ice","runtimeID":1459},{"data":0,"id":175,"name":"minecraft:double_plant","runtimeID":1460},{"data":1,"id":175,"name":"minecraft:double_plant","runtimeID":1461},{"data":2,"id":175,"name":"minecraft:double_plant","runtimeID":1462},{"data":3,"id":175,"name":"minecraft:double_plant","runtimeID":1463},{"data":4,"id":175,"name":"minecraft:double_plant","runtimeID":1464},{"data":5,"id":175,"name":"minecraft:double_plant","runtimeID":1465},{"data":6,"id":175,"name":"minecraft:double_plant","runtimeID":1466},{"data":7,"id":175,"name":"minecraft:double_plant","runtimeID":1467},{"data":8,"id":175,"name":"minecraft:double_plant","runtimeID":1468},{"data":9,"id":175,"name":"minecraft:double_plant","runtimeID":1469},{"data":10,"id":175,"name":"minecraft:double_plant","runtimeID":1470},{"data":11,"id":175,"name":"minecraft:double_plant","runtimeID":1471},{"data":12,"id":175,"name":"minecraft:double_plant","runtimeID":1472},{"data":13,"id":175,"name":"minecraft:double_plant","runtimeID":1473},{"data":14,"id":175,"name":"minecraft:double_plant","runtimeID":1474},{"data":15,"id":175,"name":"minecraft:double_plant","runtimeID":1475},{"data":0,"id":176,"name":"minecraft:standing_banner","runtimeID":1476},{"data":1,"id":176,"name":"minecraft:standing_banner","runtimeID":1477},{"data":2,"id":176,"name":"minecraft:standing_banner","runtimeID":1478},{"data":3,"id":176,"name":"minecraft:standing_banner","runtimeID":1479},{"data":4,"id":176,"name":"minecraft:standing_banner","runtimeID":1480},{"data":5,"id":176,"name":"minecraft:standing_banner","runtimeID":1481},{"data":6,"id":176,"name":"minecraft:standing_banner","runtimeID":1482},{"data":7,"id":176,"name":"minecraft:standing_banner","runtimeID":1483},{"data":8,"id":176,"name":"minecraft:standing_banner","runtimeID":1484},{"data":9,"id":176,"name":"minecraft:standing_banner","runtimeID":1485},{"data":10,"id":176,"name":"minecraft:standing_banner","runtimeID":1486},{"data":11,"id":176,"name":"minecraft:standing_banner","runtimeID":1487},{"data":12,"id":176,"name":"minecraft:standing_banner","runtimeID":1488},{"data":13,"id":176,"name":"minecraft:standing_banner","runtimeID":1489},{"data":14,"id":176,"name":"minecraft:standing_banner","runtimeID":1490},{"data":15,"id":176,"name":"minecraft:standing_banner","runtimeID":1491},{"data":0,"id":177,"name":"minecraft:wall_banner","runtimeID":1492},{"data":1,"id":177,"name":"minecraft:wall_banner","runtimeID":1493},{"data":2,"id":177,"name":"minecraft:wall_banner","runtimeID":1494},{"data":3,"id":177,"name":"minecraft:wall_banner","runtimeID":1495},{"data":4,"id":177,"name":"minecraft:wall_banner","runtimeID":1496},{"data":5,"id":177,"name":"minecraft:wall_banner","runtimeID":1497},{"data":6,"id":177,"name":"minecraft:wall_banner","runtimeID":1498},{"data":7,"id":177,"name":"minecraft:wall_banner","runtimeID":1499},{"data":0,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1500},{"data":1,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1501},{"data":2,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1502},{"data":3,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1503},{"data":4,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1504},{"data":5,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1505},{"data":6,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1506},{"data":7,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1507},{"data":8,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1508},{"data":9,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1509},{"data":10,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1510},{"data":11,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1511},{"data":12,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1512},{"data":13,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1513},{"data":14,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1514},{"data":15,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1515},{"data":0,"id":179,"name":"minecraft:red_sandstone","runtimeID":1516},{"data":1,"id":179,"name":"minecraft:red_sandstone","runtimeID":1517},{"data":2,"id":179,"name":"minecraft:red_sandstone","runtimeID":1518},{"data":3,"id":179,"name":"minecraft:red_sandstone","runtimeID":1519},{"data":0,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1520},{"data":1,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1521},{"data":2,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1522},{"data":3,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1523},{"data":4,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1524},{"data":5,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1525},{"data":6,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1526},{"data":7,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1527},{"data":0,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1528},{"data":1,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1529},{"data":2,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1530},{"data":3,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1531},{"data":4,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1532},{"data":5,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1533},{"data":6,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1534},{"data":7,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1535},{"data":8,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1536},{"data":9,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1537},{"data":10,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1538},{"data":11,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1539},{"data":12,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1540},{"data":13,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1541},{"data":14,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1542},{"data":15,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1543},{"data":0,"id":182,"name":"minecraft:stone_slab2","runtimeID":1544},{"data":1,"id":182,"name":"minecraft:stone_slab2","runtimeID":1545},{"data":2,"id":182,"name":"minecraft:stone_slab2","runtimeID":1546},{"data":3,"id":182,"name":"minecraft:stone_slab2","runtimeID":1547},{"data":4,"id":182,"name":"minecraft:stone_slab2","runtimeID":1548},{"data":5,"id":182,"name":"minecraft:stone_slab2","runtimeID":1549},{"data":6,"id":182,"name":"minecraft:stone_slab2","runtimeID":1550},{"data":7,"id":182,"name":"minecraft:stone_slab2","runtimeID":1551},{"data":8,"id":182,"name":"minecraft:stone_slab2","runtimeID":1552},{"data":9,"id":182,"name":"minecraft:stone_slab2","runtimeID":1553},{"data":10,"id":182,"name":"minecraft:stone_slab2","runtimeID":1554},{"data":11,"id":182,"name":"minecraft:stone_slab2","runtimeID":1555},{"data":12,"id":182,"name":"minecraft:stone_slab2","runtimeID":1556},{"data":13,"id":182,"name":"minecraft:stone_slab2","runtimeID":1557},{"data":14,"id":182,"name":"minecraft:stone_slab2","runtimeID":1558},{"data":15,"id":182,"name":"minecraft:stone_slab2","runtimeID":1559},{"data":0,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1560},{"data":1,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1561},{"data":2,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1562},{"data":3,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1563},{"data":4,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1564},{"data":5,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1565},{"data":6,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1566},{"data":7,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1567},{"data":8,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1568},{"data":9,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1569},{"data":10,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1570},{"data":11,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1571},{"data":12,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1572},{"data":13,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1573},{"data":14,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1574},{"data":15,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1575},{"data":0,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1576},{"data":1,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1577},{"data":2,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1578},{"data":3,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1579},{"data":4,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1580},{"data":5,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1581},{"data":6,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1582},{"data":7,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1583},{"data":8,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1584},{"data":9,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1585},{"data":10,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1586},{"data":11,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1587},{"data":12,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1588},{"data":13,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1589},{"data":14,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1590},{"data":15,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1591},{"data":0,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1592},{"data":1,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1593},{"data":2,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1594},{"data":3,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1595},{"data":4,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1596},{"data":5,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1597},{"data":6,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1598},{"data":7,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1599},{"data":8,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1600},{"data":9,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1601},{"data":10,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1602},{"data":11,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1603},{"data":12,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1604},{"data":13,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1605},{"data":14,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1606},{"data":15,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1607},{"data":0,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1608},{"data":1,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1609},{"data":2,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1610},{"data":3,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1611},{"data":4,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1612},{"data":5,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1613},{"data":6,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1614},{"data":7,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1615},{"data":8,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1616},{"data":9,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1617},{"data":10,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1618},{"data":11,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1619},{"data":12,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1620},{"data":13,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1621},{"data":14,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1622},{"data":15,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1623},{"data":0,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1624},{"data":1,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1625},{"data":2,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1626},{"data":3,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1627},{"data":4,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1628},{"data":5,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1629},{"data":6,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1630},{"data":7,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1631},{"data":8,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1632},{"data":9,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1633},{"data":10,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1634},{"data":11,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1635},{"data":12,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1636},{"data":13,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1637},{"data":14,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1638},{"data":15,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1639},{"data":0,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1640},{"data":1,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1641},{"data":2,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1642},{"data":3,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1643},{"data":4,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1644},{"data":5,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1645},{"data":6,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1646},{"data":7,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1647},{"data":8,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1648},{"data":9,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1649},{"data":10,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1650},{"data":11,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1651},{"data":12,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1652},{"data":13,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1653},{"data":14,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1654},{"data":15,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1655},{"data":0,"id":189,"name":"minecraft:chain_command_block","runtimeID":1656},{"data":1,"id":189,"name":"minecraft:chain_command_block","runtimeID":1657},{"data":2,"id":189,"name":"minecraft:chain_command_block","runtimeID":1658},{"data":3,"id":189,"name":"minecraft:chain_command_block","runtimeID":1659},{"data":4,"id":189,"name":"minecraft:chain_command_block","runtimeID":1660},{"data":5,"id":189,"name":"minecraft:chain_command_block","runtimeID":1661},{"data":6,"id":189,"name":"minecraft:chain_command_block","runtimeID":1662},{"data":7,"id":189,"name":"minecraft:chain_command_block","runtimeID":1663},{"data":8,"id":189,"name":"minecraft:chain_command_block","runtimeID":1664},{"data":9,"id":189,"name":"minecraft:chain_command_block","runtimeID":1665},{"data":10,"id":189,"name":"minecraft:chain_command_block","runtimeID":1666},{"data":11,"id":189,"name":"minecraft:chain_command_block","runtimeID":1667},{"data":12,"id":189,"name":"minecraft:chain_command_block","runtimeID":1668},{"data":13,"id":189,"name":"minecraft:chain_command_block","runtimeID":1669},{"data":14,"id":189,"name":"minecraft:chain_command_block","runtimeID":1670},{"data":15,"id":189,"name":"minecraft:chain_command_block","runtimeID":1671},{"data":0,"id":190,"name":"minecraft:hard_glass_pane","runtimeID":1672},{"data":0,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1673},{"data":1,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1674},{"data":2,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1675},{"data":3,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1676},{"data":4,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1677},{"data":5,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1678},{"data":6,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1679},{"data":7,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1680},{"data":8,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1681},{"data":9,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1682},{"data":10,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1683},{"data":11,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1684},{"data":12,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1685},{"data":13,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1686},{"data":14,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1687},{"data":15,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1688},{"data":0,"id":192,"name":"minecraft:chemical_heat","runtimeID":1689},{"data":0,"id":193,"name":"minecraft:spruce_door","runtimeID":1690},{"data":1,"id":193,"name":"minecraft:spruce_door","runtimeID":1691},{"data":2,"id":193,"name":"minecraft:spruce_door","runtimeID":1692},{"data":3,"id":193,"name":"minecraft:spruce_door","runtimeID":1693},{"data":4,"id":193,"name":"minecraft:spruce_door","runtimeID":1694},{"data":5,"id":193,"name":"minecraft:spruce_door","runtimeID":1695},{"data":6,"id":193,"name":"minecraft:spruce_door","runtimeID":1696},{"data":7,"id":193,"name":"minecraft:spruce_door","runtimeID":1697},{"data":8,"id":193,"name":"minecraft:spruce_door","runtimeID":1698},{"data":9,"id":193,"name":"minecraft:spruce_door","runtimeID":1699},{"data":10,"id":193,"name":"minecraft:spruce_door","runtimeID":1700},{"data":11,"id":193,"name":"minecraft:spruce_door","runtimeID":1701},{"data":12,"id":193,"name":"minecraft:spruce_door","runtimeID":1702},{"data":13,"id":193,"name":"minecraft:spruce_door","runtimeID":1703},{"data":14,"id":193,"name":"minecraft:spruce_door","runtimeID":1704},{"data":15,"id":193,"name":"minecraft:spruce_door","runtimeID":1705},{"data":0,"id":194,"name":"minecraft:birch_door","runtimeID":1706},{"data":1,"id":194,"name":"minecraft:birch_door","runtimeID":1707},{"data":2,"id":194,"name":"minecraft:birch_door","runtimeID":1708},{"data":3,"id":194,"name":"minecraft:birch_door","runtimeID":1709},{"data":4,"id":194,"name":"minecraft:birch_door","runtimeID":1710},{"data":5,"id":194,"name":"minecraft:birch_door","runtimeID":1711},{"data":6,"id":194,"name":"minecraft:birch_door","runtimeID":1712},{"data":7,"id":194,"name":"minecraft:birch_door","runtimeID":1713},{"data":8,"id":194,"name":"minecraft:birch_door","runtimeID":1714},{"data":9,"id":194,"name":"minecraft:birch_door","runtimeID":1715},{"data":10,"id":194,"name":"minecraft:birch_door","runtimeID":1716},{"data":11,"id":194,"name":"minecraft:birch_door","runtimeID":1717},{"data":12,"id":194,"name":"minecraft:birch_door","runtimeID":1718},{"data":13,"id":194,"name":"minecraft:birch_door","runtimeID":1719},{"data":14,"id":194,"name":"minecraft:birch_door","runtimeID":1720},{"data":15,"id":194,"name":"minecraft:birch_door","runtimeID":1721},{"data":0,"id":195,"name":"minecraft:jungle_door","runtimeID":1722},{"data":1,"id":195,"name":"minecraft:jungle_door","runtimeID":1723},{"data":2,"id":195,"name":"minecraft:jungle_door","runtimeID":1724},{"data":3,"id":195,"name":"minecraft:jungle_door","runtimeID":1725},{"data":4,"id":195,"name":"minecraft:jungle_door","runtimeID":1726},{"data":5,"id":195,"name":"minecraft:jungle_door","runtimeID":1727},{"data":6,"id":195,"name":"minecraft:jungle_door","runtimeID":1728},{"data":7,"id":195,"name":"minecraft:jungle_door","runtimeID":1729},{"data":8,"id":195,"name":"minecraft:jungle_door","runtimeID":1730},{"data":9,"id":195,"name":"minecraft:jungle_door","runtimeID":1731},{"data":10,"id":195,"name":"minecraft:jungle_door","runtimeID":1732},{"data":11,"id":195,"name":"minecraft:jungle_door","runtimeID":1733},{"data":12,"id":195,"name":"minecraft:jungle_door","runtimeID":1734},{"data":13,"id":195,"name":"minecraft:jungle_door","runtimeID":1735},{"data":14,"id":195,"name":"minecraft:jungle_door","runtimeID":1736},{"data":15,"id":195,"name":"minecraft:jungle_door","runtimeID":1737},{"data":0,"id":196,"name":"minecraft:acacia_door","runtimeID":1738},{"data":1,"id":196,"name":"minecraft:acacia_door","runtimeID":1739},{"data":2,"id":196,"name":"minecraft:acacia_door","runtimeID":1740},{"data":3,"id":196,"name":"minecraft:acacia_door","runtimeID":1741},{"data":4,"id":196,"name":"minecraft:acacia_door","runtimeID":1742},{"data":5,"id":196,"name":"minecraft:acacia_door","runtimeID":1743},{"data":6,"id":196,"name":"minecraft:acacia_door","runtimeID":1744},{"data":7,"id":196,"name":"minecraft:acacia_door","runtimeID":1745},{"data":8,"id":196,"name":"minecraft:acacia_door","runtimeID":1746},{"data":9,"id":196,"name":"minecraft:acacia_door","runtimeID":1747},{"data":10,"id":196,"name":"minecraft:acacia_door","runtimeID":1748},{"data":11,"id":196,"name":"minecraft:acacia_door","runtimeID":1749},{"data":12,"id":196,"name":"minecraft:acacia_door","runtimeID":1750},{"data":13,"id":196,"name":"minecraft:acacia_door","runtimeID":1751},{"data":14,"id":196,"name":"minecraft:acacia_door","runtimeID":1752},{"data":15,"id":196,"name":"minecraft:acacia_door","runtimeID":1753},{"data":0,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1754},{"data":1,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1755},{"data":2,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1756},{"data":3,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1757},{"data":4,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1758},{"data":5,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1759},{"data":6,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1760},{"data":7,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1761},{"data":8,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1762},{"data":9,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1763},{"data":10,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1764},{"data":11,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1765},{"data":12,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1766},{"data":13,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1767},{"data":14,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1768},{"data":15,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1769},{"data":0,"id":198,"name":"minecraft:grass_path","runtimeID":1770},{"data":0,"id":199,"name":"minecraft:frame","runtimeID":1771},{"data":1,"id":199,"name":"minecraft:frame","runtimeID":1772},{"data":2,"id":199,"name":"minecraft:frame","runtimeID":1773},{"data":3,"id":199,"name":"minecraft:frame","runtimeID":1774},{"data":0,"id":200,"name":"minecraft:chorus_flower","runtimeID":1775},{"data":1,"id":200,"name":"minecraft:chorus_flower","runtimeID":1776},{"data":2,"id":200,"name":"minecraft:chorus_flower","runtimeID":1777},{"data":3,"id":200,"name":"minecraft:chorus_flower","runtimeID":1778},{"data":4,"id":200,"name":"minecraft:chorus_flower","runtimeID":1779},{"data":5,"id":200,"name":"minecraft:chorus_flower","runtimeID":1780},{"data":6,"id":200,"name":"minecraft:chorus_flower","runtimeID":1781},{"data":7,"id":200,"name":"minecraft:chorus_flower","runtimeID":1782},{"data":0,"id":201,"name":"minecraft:purpur_block","runtimeID":1783},{"data":1,"id":201,"name":"minecraft:purpur_block","runtimeID":1784},{"data":2,"id":201,"name":"minecraft:purpur_block","runtimeID":1785},{"data":3,"id":201,"name":"minecraft:purpur_block","runtimeID":1786},{"data":4,"id":201,"name":"minecraft:purpur_block","runtimeID":1787},{"data":5,"id":201,"name":"minecraft:purpur_block","runtimeID":1788},{"data":6,"id":201,"name":"minecraft:purpur_block","runtimeID":1789},{"data":7,"id":201,"name":"minecraft:purpur_block","runtimeID":1790},{"data":8,"id":201,"name":"minecraft:purpur_block","runtimeID":1791},{"data":9,"id":201,"name":"minecraft:purpur_block","runtimeID":1792},{"data":10,"id":201,"name":"minecraft:purpur_block","runtimeID":1793},{"data":11,"id":201,"name":"minecraft:purpur_block","runtimeID":1794},{"data":12,"id":201,"name":"minecraft:purpur_block","runtimeID":1795},{"data":13,"id":201,"name":"minecraft:purpur_block","runtimeID":1796},{"data":14,"id":201,"name":"minecraft:purpur_block","runtimeID":1797},{"data":15,"id":201,"name":"minecraft:purpur_block","runtimeID":1798},{"data":0,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1799},{"data":1,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1800},{"data":2,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1801},{"data":3,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1802},{"data":4,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1803},{"data":5,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1804},{"data":6,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1805},{"data":7,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1806},{"data":8,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1807},{"data":9,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1808},{"data":10,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1809},{"data":11,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1810},{"data":12,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1811},{"data":13,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1812},{"data":14,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1813},{"data":15,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1814},{"data":0,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1815},{"data":1,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1816},{"data":2,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1817},{"data":3,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1818},{"data":4,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1819},{"data":5,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1820},{"data":6,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1821},{"data":7,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1822},{"data":0,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1823},{"data":1,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1824},{"data":2,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1825},{"data":3,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1826},{"data":4,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1827},{"data":5,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1828},{"data":6,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1829},{"data":7,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1830},{"data":8,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1831},{"data":9,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1832},{"data":10,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1833},{"data":11,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1834},{"data":12,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1835},{"data":13,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1836},{"data":14,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1837},{"data":15,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1838},{"data":0,"id":205,"name":"minecraft:undyed_shulker_box","runtimeID":1839},{"data":0,"id":206,"name":"minecraft:end_bricks","runtimeID":1840},{"data":0,"id":207,"name":"minecraft:frosted_ice","runtimeID":1841},{"data":1,"id":207,"name":"minecraft:frosted_ice","runtimeID":1842},{"data":2,"id":207,"name":"minecraft:frosted_ice","runtimeID":1843},{"data":3,"id":207,"name":"minecraft:frosted_ice","runtimeID":1844},{"data":0,"id":208,"name":"minecraft:end_rod","runtimeID":1845},{"data":1,"id":208,"name":"minecraft:end_rod","runtimeID":1846},{"data":2,"id":208,"name":"minecraft:end_rod","runtimeID":1847},{"data":3,"id":208,"name":"minecraft:end_rod","runtimeID":1848},{"data":4,"id":208,"name":"minecraft:end_rod","runtimeID":1849},{"data":5,"id":208,"name":"minecraft:end_rod","runtimeID":1850},{"data":6,"id":208,"name":"minecraft:end_rod","runtimeID":1851},{"data":7,"id":208,"name":"minecraft:end_rod","runtimeID":1852},{"data":0,"id":209,"name":"minecraft:end_gateway","runtimeID":1853},{"data":0,"id":213,"name":"minecraft:magma","runtimeID":1857},{"data":0,"id":214,"name":"minecraft:nether_wart_block","runtimeID":1858},{"data":0,"id":215,"name":"minecraft:red_nether_brick","runtimeID":1859},{"data":0,"id":216,"name":"minecraft:bone_block","runtimeID":1860},{"data":1,"id":216,"name":"minecraft:bone_block","runtimeID":1861},{"data":2,"id":216,"name":"minecraft:bone_block","runtimeID":1862},{"data":3,"id":216,"name":"minecraft:bone_block","runtimeID":1863},{"data":4,"id":216,"name":"minecraft:bone_block","runtimeID":1864},{"data":5,"id":216,"name":"minecraft:bone_block","runtimeID":1865},{"data":6,"id":216,"name":"minecraft:bone_block","runtimeID":1866},{"data":7,"id":216,"name":"minecraft:bone_block","runtimeID":1867},{"data":8,"id":216,"name":"minecraft:bone_block","runtimeID":1868},{"data":9,"id":216,"name":"minecraft:bone_block","runtimeID":1869},{"data":10,"id":216,"name":"minecraft:bone_block","runtimeID":1870},{"data":11,"id":216,"name":"minecraft:bone_block","runtimeID":1871},{"data":12,"id":216,"name":"minecraft:bone_block","runtimeID":1872},{"data":13,"id":216,"name":"minecraft:bone_block","runtimeID":1873},{"data":14,"id":216,"name":"minecraft:bone_block","runtimeID":1874},{"data":15,"id":216,"name":"minecraft:bone_block","runtimeID":1875},{"data":0,"id":218,"name":"minecraft:shulker_box","runtimeID":1877},{"data":1,"id":218,"name":"minecraft:shulker_box","runtimeID":1878},{"data":2,"id":218,"name":"minecraft:shulker_box","runtimeID":1879},{"data":3,"id":218,"name":"minecraft:shulker_box","runtimeID":1880},{"data":4,"id":218,"name":"minecraft:shulker_box","runtimeID":1881},{"data":5,"id":218,"name":"minecraft:shulker_box","runtimeID":1882},{"data":6,"id":218,"name":"minecraft:shulker_box","runtimeID":1883},{"data":7,"id":218,"name":"minecraft:shulker_box","runtimeID":1884},{"data":8,"id":218,"name":"minecraft:shulker_box","runtimeID":1885},{"data":9,"id":218,"name":"minecraft:shulker_box","runtimeID":1886},{"data":10,"id":218,"name":"minecraft:shulker_box","runtimeID":1887},{"data":11,"id":218,"name":"minecraft:shulker_box","runtimeID":1888},{"data":12,"id":218,"name":"minecraft:shulker_box","runtimeID":1889},{"data":13,"id":218,"name":"minecraft:shulker_box","runtimeID":1890},{"data":14,"id":218,"name":"minecraft:shulker_box","runtimeID":1891},{"data":15,"id":218,"name":"minecraft:shulker_box","runtimeID":1892},{"data":0,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1893},{"data":1,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1894},{"data":2,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1895},{"data":3,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1896},{"data":4,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1897},{"data":5,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1898},{"data":6,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1899},{"data":7,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1900},{"data":0,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1901},{"data":1,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1902},{"data":2,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1903},{"data":3,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1904},{"data":4,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1905},{"data":5,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1906},{"data":6,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1907},{"data":7,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1908},{"data":0,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1909},{"data":1,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1910},{"data":2,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1911},{"data":3,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1912},{"data":4,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1913},{"data":5,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1914},{"data":6,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1915},{"data":7,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1916},{"data":0,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1917},{"data":1,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1918},{"data":2,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1919},{"data":3,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1920},{"data":4,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1921},{"data":5,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1922},{"data":6,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1923},{"data":7,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1924},{"data":0,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1925},{"data":1,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1926},{"data":2,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1927},{"data":3,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1928},{"data":4,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1929},{"data":5,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1930},{"data":6,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1931},{"data":7,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1932},{"data":0,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1933},{"data":1,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1934},{"data":2,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1935},{"data":3,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1936},{"data":4,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1937},{"data":5,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1938},{"data":6,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1939},{"data":7,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1940},{"data":0,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1941},{"data":1,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1942},{"data":2,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1943},{"data":3,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1944},{"data":4,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1945},{"data":5,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1946},{"data":6,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1947},{"data":7,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1948},{"data":0,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1949},{"data":1,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1950},{"data":2,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1951},{"data":3,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1952},{"data":4,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1953},{"data":5,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1954},{"data":6,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1955},{"data":7,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1956},{"data":0,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1957},{"data":1,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1958},{"data":2,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1959},{"data":3,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1960},{"data":4,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1961},{"data":5,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1962},{"data":6,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1963},{"data":7,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1964},{"data":0,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1965},{"data":1,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1966},{"data":2,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1967},{"data":3,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1968},{"data":4,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1969},{"data":5,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1970},{"data":6,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1971},{"data":7,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1972},{"data":0,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1973},{"data":1,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1974},{"data":2,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1975},{"data":3,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1976},{"data":4,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1977},{"data":5,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1978},{"data":6,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1979},{"data":7,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1980},{"data":0,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1982},{"data":1,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1983},{"data":2,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1984},{"data":3,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1985},{"data":4,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1986},{"data":5,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1987},{"data":6,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1988},{"data":7,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1989},{"data":0,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1990},{"data":1,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1991},{"data":2,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1992},{"data":3,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1993},{"data":4,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1994},{"data":5,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1995},{"data":6,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1996},{"data":7,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1997},{"data":0,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":1998},{"data":1,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":1999},{"data":2,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2000},{"data":3,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2001},{"data":4,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2002},{"data":5,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2003},{"data":6,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2004},{"data":7,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2005},{"data":0,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2006},{"data":1,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2007},{"data":2,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2008},{"data":3,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2009},{"data":4,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2010},{"data":5,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2011},{"data":6,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2012},{"data":7,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2013},{"data":0,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2014},{"data":1,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2015},{"data":2,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2016},{"data":3,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2017},{"data":4,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2018},{"data":5,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2019},{"data":6,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2020},{"data":7,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2021},{"data":0,"id":236,"name":"minecraft:concrete","runtimeID":2022},{"data":1,"id":236,"name":"minecraft:concrete","runtimeID":2023},{"data":2,"id":236,"name":"minecraft:concrete","runtimeID":2024},{"data":3,"id":236,"name":"minecraft:concrete","runtimeID":2025},{"data":4,"id":236,"name":"minecraft:concrete","runtimeID":2026},{"data":5,"id":236,"name":"minecraft:concrete","runtimeID":2027},{"data":6,"id":236,"name":"minecraft:concrete","runtimeID":2028},{"data":7,"id":236,"name":"minecraft:concrete","runtimeID":2029},{"data":8,"id":236,"name":"minecraft:concrete","runtimeID":2030},{"data":9,"id":236,"name":"minecraft:concrete","runtimeID":2031},{"data":10,"id":236,"name":"minecraft:concrete","runtimeID":2032},{"data":11,"id":236,"name":"minecraft:concrete","runtimeID":2033},{"data":12,"id":236,"name":"minecraft:concrete","runtimeID":2034},{"data":13,"id":236,"name":"minecraft:concrete","runtimeID":2035},{"data":14,"id":236,"name":"minecraft:concrete","runtimeID":2036},{"data":15,"id":236,"name":"minecraft:concrete","runtimeID":2037},{"data":0,"id":237,"name":"minecraft:concretePowder","runtimeID":2038},{"data":1,"id":237,"name":"minecraft:concretePowder","runtimeID":2039},{"data":2,"id":237,"name":"minecraft:concretePowder","runtimeID":2040},{"data":3,"id":237,"name":"minecraft:concretePowder","runtimeID":2041},{"data":4,"id":237,"name":"minecraft:concretePowder","runtimeID":2042},{"data":5,"id":237,"name":"minecraft:concretePowder","runtimeID":2043},{"data":6,"id":237,"name":"minecraft:concretePowder","runtimeID":2044},{"data":7,"id":237,"name":"minecraft:concretePowder","runtimeID":2045},{"data":8,"id":237,"name":"minecraft:concretePowder","runtimeID":2046},{"data":9,"id":237,"name":"minecraft:concretePowder","runtimeID":2047},{"data":10,"id":237,"name":"minecraft:concretePowder","runtimeID":2048},{"data":11,"id":237,"name":"minecraft:concretePowder","runtimeID":2049},{"data":12,"id":237,"name":"minecraft:concretePowder","runtimeID":2050},{"data":13,"id":237,"name":"minecraft:concretePowder","runtimeID":2051},{"data":14,"id":237,"name":"minecraft:concretePowder","runtimeID":2052},{"data":15,"id":237,"name":"minecraft:concretePowder","runtimeID":2053},{"data":0,"id":238,"name":"minecraft:chemistry_table","runtimeID":2054},{"data":1,"id":238,"name":"minecraft:chemistry_table","runtimeID":2055},{"data":2,"id":238,"name":"minecraft:chemistry_table","runtimeID":2056},{"data":3,"id":238,"name":"minecraft:chemistry_table","runtimeID":2057},{"data":4,"id":238,"name":"minecraft:chemistry_table","runtimeID":2058},{"data":5,"id":238,"name":"minecraft:chemistry_table","runtimeID":2059},{"data":6,"id":238,"name":"minecraft:chemistry_table","runtimeID":2060},{"data":7,"id":238,"name":"minecraft:chemistry_table","runtimeID":2061},{"data":8,"id":238,"name":"minecraft:chemistry_table","runtimeID":2062},{"data":9,"id":238,"name":"minecraft:chemistry_table","runtimeID":2063},{"data":10,"id":238,"name":"minecraft:chemistry_table","runtimeID":2064},{"data":11,"id":238,"name":"minecraft:chemistry_table","runtimeID":2065},{"data":12,"id":238,"name":"minecraft:chemistry_table","runtimeID":2066},{"data":13,"id":238,"name":"minecraft:chemistry_table","runtimeID":2067},{"data":14,"id":238,"name":"minecraft:chemistry_table","runtimeID":2068},{"data":15,"id":238,"name":"minecraft:chemistry_table","runtimeID":2069},{"data":0,"id":239,"name":"minecraft:underwater_torch","runtimeID":2070},{"data":1,"id":239,"name":"minecraft:underwater_torch","runtimeID":2071},{"data":2,"id":239,"name":"minecraft:underwater_torch","runtimeID":2072},{"data":3,"id":239,"name":"minecraft:underwater_torch","runtimeID":2073},{"data":4,"id":239,"name":"minecraft:underwater_torch","runtimeID":2074},{"data":5,"id":239,"name":"minecraft:underwater_torch","runtimeID":2075},{"data":6,"id":239,"name":"minecraft:underwater_torch","runtimeID":2076},{"data":7,"id":239,"name":"minecraft:underwater_torch","runtimeID":2077},{"data":0,"id":240,"name":"minecraft:chorus_plant","runtimeID":2078},{"data":0,"id":241,"name":"minecraft:stained_glass","runtimeID":2079},{"data":1,"id":241,"name":"minecraft:stained_glass","runtimeID":2080},{"data":2,"id":241,"name":"minecraft:stained_glass","runtimeID":2081},{"data":3,"id":241,"name":"minecraft:stained_glass","runtimeID":2082},{"data":4,"id":241,"name":"minecraft:stained_glass","runtimeID":2083},{"data":5,"id":241,"name":"minecraft:stained_glass","runtimeID":2084},{"data":6,"id":241,"name":"minecraft:stained_glass","runtimeID":2085},{"data":7,"id":241,"name":"minecraft:stained_glass","runtimeID":2086},{"data":8,"id":241,"name":"minecraft:stained_glass","runtimeID":2087},{"data":9,"id":241,"name":"minecraft:stained_glass","runtimeID":2088},{"data":10,"id":241,"name":"minecraft:stained_glass","runtimeID":2089},{"data":11,"id":241,"name":"minecraft:stained_glass","runtimeID":2090},{"data":12,"id":241,"name":"minecraft:stained_glass","runtimeID":2091},{"data":13,"id":241,"name":"minecraft:stained_glass","runtimeID":2092},{"data":14,"id":241,"name":"minecraft:stained_glass","runtimeID":2093},{"data":15,"id":241,"name":"minecraft:stained_glass","runtimeID":2094},{"data":0,"id":243,"name":"minecraft:podzol","runtimeID":2096},{"data":0,"id":244,"name":"minecraft:beetroot","runtimeID":2097},{"data":1,"id":244,"name":"minecraft:beetroot","runtimeID":2098},{"data":2,"id":244,"name":"minecraft:beetroot","runtimeID":2099},{"data":3,"id":244,"name":"minecraft:beetroot","runtimeID":2100},{"data":4,"id":244,"name":"minecraft:beetroot","runtimeID":2101},{"data":5,"id":244,"name":"minecraft:beetroot","runtimeID":2102},{"data":6,"id":244,"name":"minecraft:beetroot","runtimeID":2103},{"data":7,"id":244,"name":"minecraft:beetroot","runtimeID":2104},{"data":0,"id":245,"name":"minecraft:stonecutter","runtimeID":2105},{"data":0,"id":246,"name":"minecraft:glowingobsidian","runtimeID":2106},{"data":0,"id":247,"name":"minecraft:netherreactor","runtimeID":2107},{"data":0,"id":248,"name":"minecraft:info_update","runtimeID":2108},{"data":0,"id":249,"name":"minecraft:info_update2","runtimeID":2109},{"data":0,"id":250,"name":"minecraft:movingBlock","runtimeID":2110},{"data":0,"id":251,"name":"minecraft:observer","runtimeID":2111},{"data":1,"id":251,"name":"minecraft:observer","runtimeID":2112},{"data":2,"id":251,"name":"minecraft:observer","runtimeID":2113},{"data":3,"id":251,"name":"minecraft:observer","runtimeID":2114},{"data":4,"id":251,"name":"minecraft:observer","runtimeID":2115},{"data":5,"id":251,"name":"minecraft:observer","runtimeID":2116},{"data":6,"id":251,"name":"minecraft:observer","runtimeID":2117},{"data":7,"id":251,"name":"minecraft:observer","runtimeID":2118},{"data":8,"id":251,"name":"minecraft:observer","runtimeID":2119},{"data":9,"id":251,"name":"minecraft:observer","runtimeID":2120},{"data":10,"id":251,"name":"minecraft:observer","runtimeID":2121},{"data":11,"id":251,"name":"minecraft:observer","runtimeID":2122},{"data":12,"id":251,"name":"minecraft:observer","runtimeID":2123},{"data":13,"id":251,"name":"minecraft:observer","runtimeID":2124},{"data":14,"id":251,"name":"minecraft:observer","runtimeID":2125},{"data":15,"id":251,"name":"minecraft:observer","runtimeID":2126},{"data":0,"id":252,"name":"minecraft:structure_block","runtimeID":2127},{"data":1,"id":252,"name":"minecraft:structure_block","runtimeID":2128},{"data":2,"id":252,"name":"minecraft:structure_block","runtimeID":2129},{"data":3,"id":252,"name":"minecraft:structure_block","runtimeID":2130},{"data":4,"id":252,"name":"minecraft:structure_block","runtimeID":2131},{"data":5,"id":252,"name":"minecraft:structure_block","runtimeID":2132},{"data":6,"id":252,"name":"minecraft:structure_block","runtimeID":2133},{"data":7,"id":252,"name":"minecraft:structure_block","runtimeID":2134},{"data":0,"id":253,"name":"minecraft:hard_glass","runtimeID":2135},{"data":0,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2136},{"data":1,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2137},{"data":2,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2138},{"data":3,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2139},{"data":4,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2140},{"data":5,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2141},{"data":6,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2142},{"data":7,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2143},{"data":8,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2144},{"data":9,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2145},{"data":10,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2146},{"data":11,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2147},{"data":12,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2148},{"data":13,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2149},{"data":14,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2150},{"data":15,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2151},{"data":0,"id":255,"name":"minecraft:reserved6","runtimeID":2152},{"data":0,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2154},{"data":1,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2155},{"data":2,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2156},{"data":3,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2157},{"data":4,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2158},{"data":5,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2159},{"data":6,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2160},{"data":7,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2161},{"data":0,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2162},{"data":1,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2163},{"data":2,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2164},{"data":3,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2165},{"data":4,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2166},{"data":5,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2167},{"data":6,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2168},{"data":7,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2169},{"data":0,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2170},{"data":1,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2171},{"data":2,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2172},{"data":3,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2173},{"data":4,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2174},{"data":5,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2175},{"data":6,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2176},{"data":7,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2177},{"data":0,"id":260,"name":"minecraft:stripped_spruce_log","runtimeID":2178},{"data":1,"id":260,"name":"minecraft:stripped_spruce_log","runtimeID":2179},{"data":2,"id":260,"name":"minecraft:stripped_spruce_log","runtimeID":2180},{"data":3,"id":260,"name":"minecraft:stripped_spruce_log","runtimeID":2181},{"data":0,"id":261,"name":"minecraft:stripped_birch_log","runtimeID":2182},{"data":1,"id":261,"name":"minecraft:stripped_birch_log","runtimeID":2183},{"data":2,"id":261,"name":"minecraft:stripped_birch_log","runtimeID":2184},{"data":3,"id":261,"name":"minecraft:stripped_birch_log","runtimeID":2185},{"data":0,"id":262,"name":"minecraft:stripped_jungle_log","runtimeID":2186},{"data":1,"id":262,"name":"minecraft:stripped_jungle_log","runtimeID":2187},{"data":2,"id":262,"name":"minecraft:stripped_jungle_log","runtimeID":2188},{"data":3,"id":262,"name":"minecraft:stripped_jungle_log","runtimeID":2189},{"data":0,"id":263,"name":"minecraft:stripped_acacia_log","runtimeID":2190},{"data":1,"id":263,"name":"minecraft:stripped_acacia_log","runtimeID":2191},{"data":2,"id":263,"name":"minecraft:stripped_acacia_log","runtimeID":2192},{"data":3,"id":263,"name":"minecraft:stripped_acacia_log","runtimeID":2193},{"data":0,"id":264,"name":"minecraft:stripped_dark_oak_log","runtimeID":2194},{"data":1,"id":264,"name":"minecraft:stripped_dark_oak_log","runtimeID":2195},{"data":2,"id":264,"name":"minecraft:stripped_dark_oak_log","runtimeID":2196},{"data":3,"id":264,"name":"minecraft:stripped_dark_oak_log","runtimeID":2197},{"data":0,"id":265,"name":"minecraft:stripped_oak_log","runtimeID":2198},{"data":1,"id":265,"name":"minecraft:stripped_oak_log","runtimeID":2199},{"data":2,"id":265,"name":"minecraft:stripped_oak_log","runtimeID":2200},{"data":3,"id":265,"name":"minecraft:stripped_oak_log","runtimeID":2201},{"data":0,"id":266,"name":"minecraft:blue_ice","runtimeID":2202},{"data":0,"id":267,"name":"minecraft:element_1","runtimeID":2203},{"data":1,"id":267,"name":"minecraft:element_1","runtimeID":2204},{"data":2,"id":267,"name":"minecraft:element_1","runtimeID":2205},{"data":3,"id":267,"name":"minecraft:element_1","runtimeID":2206},{"data":4,"id":267,"name":"minecraft:element_1","runtimeID":2207},{"data":5,"id":267,"name":"minecraft:element_1","runtimeID":2208},{"data":6,"id":267,"name":"minecraft:element_1","runtimeID":2209},{"data":7,"id":267,"name":"minecraft:element_1","runtimeID":2210},{"data":8,"id":267,"name":"minecraft:element_1","runtimeID":2211},{"data":9,"id":267,"name":"minecraft:element_1","runtimeID":2212},{"data":10,"id":267,"name":"minecraft:element_1","runtimeID":2213},{"data":11,"id":267,"name":"minecraft:element_1","runtimeID":2214},{"data":12,"id":267,"name":"minecraft:element_1","runtimeID":2215},{"data":13,"id":267,"name":"minecraft:element_1","runtimeID":2216},{"data":14,"id":267,"name":"minecraft:element_1","runtimeID":2217},{"data":15,"id":267,"name":"minecraft:element_1","runtimeID":2218},{"data":0,"id":268,"name":"minecraft:element_2","runtimeID":2219},{"data":1,"id":268,"name":"minecraft:element_2","runtimeID":2220},{"data":2,"id":268,"name":"minecraft:element_2","runtimeID":2221},{"data":3,"id":268,"name":"minecraft:element_2","runtimeID":2222},{"data":4,"id":268,"name":"minecraft:element_2","runtimeID":2223},{"data":5,"id":268,"name":"minecraft:element_2","runtimeID":2224},{"data":6,"id":268,"name":"minecraft:element_2","runtimeID":2225},{"data":7,"id":268,"name":"minecraft:element_2","runtimeID":2226},{"data":8,"id":268,"name":"minecraft:element_2","runtimeID":2227},{"data":9,"id":268,"name":"minecraft:element_2","runtimeID":2228},{"data":10,"id":268,"name":"minecraft:element_2","runtimeID":2229},{"data":11,"id":268,"name":"minecraft:element_2","runtimeID":2230},{"data":12,"id":268,"name":"minecraft:element_2","runtimeID":2231},{"data":13,"id":268,"name":"minecraft:element_2","runtimeID":2232},{"data":14,"id":268,"name":"minecraft:element_2","runtimeID":2233},{"data":15,"id":268,"name":"minecraft:element_2","runtimeID":2234},{"data":0,"id":269,"name":"minecraft:element_3","runtimeID":2235},{"data":1,"id":269,"name":"minecraft:element_3","runtimeID":2236},{"data":2,"id":269,"name":"minecraft:element_3","runtimeID":2237},{"data":3,"id":269,"name":"minecraft:element_3","runtimeID":2238},{"data":4,"id":269,"name":"minecraft:element_3","runtimeID":2239},{"data":5,"id":269,"name":"minecraft:element_3","runtimeID":2240},{"data":6,"id":269,"name":"minecraft:element_3","runtimeID":2241},{"data":7,"id":269,"name":"minecraft:element_3","runtimeID":2242},{"data":8,"id":269,"name":"minecraft:element_3","runtimeID":2243},{"data":9,"id":269,"name":"minecraft:element_3","runtimeID":2244},{"data":10,"id":269,"name":"minecraft:element_3","runtimeID":2245},{"data":11,"id":269,"name":"minecraft:element_3","runtimeID":2246},{"data":12,"id":269,"name":"minecraft:element_3","runtimeID":2247},{"data":13,"id":269,"name":"minecraft:element_3","runtimeID":2248},{"data":14,"id":269,"name":"minecraft:element_3","runtimeID":2249},{"data":15,"id":269,"name":"minecraft:element_3","runtimeID":2250},{"data":0,"id":270,"name":"minecraft:element_4","runtimeID":2251},{"data":1,"id":270,"name":"minecraft:element_4","runtimeID":2252},{"data":2,"id":270,"name":"minecraft:element_4","runtimeID":2253},{"data":3,"id":270,"name":"minecraft:element_4","runtimeID":2254},{"data":4,"id":270,"name":"minecraft:element_4","runtimeID":2255},{"data":5,"id":270,"name":"minecraft:element_4","runtimeID":2256},{"data":6,"id":270,"name":"minecraft:element_4","runtimeID":2257},{"data":7,"id":270,"name":"minecraft:element_4","runtimeID":2258},{"data":8,"id":270,"name":"minecraft:element_4","runtimeID":2259},{"data":9,"id":270,"name":"minecraft:element_4","runtimeID":2260},{"data":10,"id":270,"name":"minecraft:element_4","runtimeID":2261},{"data":11,"id":270,"name":"minecraft:element_4","runtimeID":2262},{"data":12,"id":270,"name":"minecraft:element_4","runtimeID":2263},{"data":13,"id":270,"name":"minecraft:element_4","runtimeID":2264},{"data":14,"id":270,"name":"minecraft:element_4","runtimeID":2265},{"data":15,"id":270,"name":"minecraft:element_4","runtimeID":2266},{"data":0,"id":271,"name":"minecraft:element_5","runtimeID":2267},{"data":1,"id":271,"name":"minecraft:element_5","runtimeID":2268},{"data":2,"id":271,"name":"minecraft:element_5","runtimeID":2269},{"data":3,"id":271,"name":"minecraft:element_5","runtimeID":2270},{"data":4,"id":271,"name":"minecraft:element_5","runtimeID":2271},{"data":5,"id":271,"name":"minecraft:element_5","runtimeID":2272},{"data":6,"id":271,"name":"minecraft:element_5","runtimeID":2273},{"data":7,"id":271,"name":"minecraft:element_5","runtimeID":2274},{"data":8,"id":271,"name":"minecraft:element_5","runtimeID":2275},{"data":9,"id":271,"name":"minecraft:element_5","runtimeID":2276},{"data":10,"id":271,"name":"minecraft:element_5","runtimeID":2277},{"data":11,"id":271,"name":"minecraft:element_5","runtimeID":2278},{"data":12,"id":271,"name":"minecraft:element_5","runtimeID":2279},{"data":13,"id":271,"name":"minecraft:element_5","runtimeID":2280},{"data":14,"id":271,"name":"minecraft:element_5","runtimeID":2281},{"data":15,"id":271,"name":"minecraft:element_5","runtimeID":2282},{"data":0,"id":272,"name":"minecraft:element_6","runtimeID":2283},{"data":1,"id":272,"name":"minecraft:element_6","runtimeID":2284},{"data":2,"id":272,"name":"minecraft:element_6","runtimeID":2285},{"data":3,"id":272,"name":"minecraft:element_6","runtimeID":2286},{"data":4,"id":272,"name":"minecraft:element_6","runtimeID":2287},{"data":5,"id":272,"name":"minecraft:element_6","runtimeID":2288},{"data":6,"id":272,"name":"minecraft:element_6","runtimeID":2289},{"data":7,"id":272,"name":"minecraft:element_6","runtimeID":2290},{"data":8,"id":272,"name":"minecraft:element_6","runtimeID":2291},{"data":9,"id":272,"name":"minecraft:element_6","runtimeID":2292},{"data":10,"id":272,"name":"minecraft:element_6","runtimeID":2293},{"data":11,"id":272,"name":"minecraft:element_6","runtimeID":2294},{"data":12,"id":272,"name":"minecraft:element_6","runtimeID":2295},{"data":13,"id":272,"name":"minecraft:element_6","runtimeID":2296},{"data":14,"id":272,"name":"minecraft:element_6","runtimeID":2297},{"data":15,"id":272,"name":"minecraft:element_6","runtimeID":2298},{"data":0,"id":273,"name":"minecraft:element_7","runtimeID":2299},{"data":1,"id":273,"name":"minecraft:element_7","runtimeID":2300},{"data":2,"id":273,"name":"minecraft:element_7","runtimeID":2301},{"data":3,"id":273,"name":"minecraft:element_7","runtimeID":2302},{"data":4,"id":273,"name":"minecraft:element_7","runtimeID":2303},{"data":5,"id":273,"name":"minecraft:element_7","runtimeID":2304},{"data":6,"id":273,"name":"minecraft:element_7","runtimeID":2305},{"data":7,"id":273,"name":"minecraft:element_7","runtimeID":2306},{"data":8,"id":273,"name":"minecraft:element_7","runtimeID":2307},{"data":9,"id":273,"name":"minecraft:element_7","runtimeID":2308},{"data":10,"id":273,"name":"minecraft:element_7","runtimeID":2309},{"data":11,"id":273,"name":"minecraft:element_7","runtimeID":2310},{"data":12,"id":273,"name":"minecraft:element_7","runtimeID":2311},{"data":13,"id":273,"name":"minecraft:element_7","runtimeID":2312},{"data":14,"id":273,"name":"minecraft:element_7","runtimeID":2313},{"data":15,"id":273,"name":"minecraft:element_7","runtimeID":2314},{"data":0,"id":274,"name":"minecraft:element_8","runtimeID":2315},{"data":1,"id":274,"name":"minecraft:element_8","runtimeID":2316},{"data":2,"id":274,"name":"minecraft:element_8","runtimeID":2317},{"data":3,"id":274,"name":"minecraft:element_8","runtimeID":2318},{"data":4,"id":274,"name":"minecraft:element_8","runtimeID":2319},{"data":5,"id":274,"name":"minecraft:element_8","runtimeID":2320},{"data":6,"id":274,"name":"minecraft:element_8","runtimeID":2321},{"data":7,"id":274,"name":"minecraft:element_8","runtimeID":2322},{"data":8,"id":274,"name":"minecraft:element_8","runtimeID":2323},{"data":9,"id":274,"name":"minecraft:element_8","runtimeID":2324},{"data":10,"id":274,"name":"minecraft:element_8","runtimeID":2325},{"data":11,"id":274,"name":"minecraft:element_8","runtimeID":2326},{"data":12,"id":274,"name":"minecraft:element_8","runtimeID":2327},{"data":13,"id":274,"name":"minecraft:element_8","runtimeID":2328},{"data":14,"id":274,"name":"minecraft:element_8","runtimeID":2329},{"data":15,"id":274,"name":"minecraft:element_8","runtimeID":2330},{"data":0,"id":275,"name":"minecraft:element_9","runtimeID":2331},{"data":1,"id":275,"name":"minecraft:element_9","runtimeID":2332},{"data":2,"id":275,"name":"minecraft:element_9","runtimeID":2333},{"data":3,"id":275,"name":"minecraft:element_9","runtimeID":2334},{"data":4,"id":275,"name":"minecraft:element_9","runtimeID":2335},{"data":5,"id":275,"name":"minecraft:element_9","runtimeID":2336},{"data":6,"id":275,"name":"minecraft:element_9","runtimeID":2337},{"data":7,"id":275,"name":"minecraft:element_9","runtimeID":2338},{"data":8,"id":275,"name":"minecraft:element_9","runtimeID":2339},{"data":9,"id":275,"name":"minecraft:element_9","runtimeID":2340},{"data":10,"id":275,"name":"minecraft:element_9","runtimeID":2341},{"data":11,"id":275,"name":"minecraft:element_9","runtimeID":2342},{"data":12,"id":275,"name":"minecraft:element_9","runtimeID":2343},{"data":13,"id":275,"name":"minecraft:element_9","runtimeID":2344},{"data":14,"id":275,"name":"minecraft:element_9","runtimeID":2345},{"data":15,"id":275,"name":"minecraft:element_9","runtimeID":2346},{"data":0,"id":276,"name":"minecraft:element_10","runtimeID":2347},{"data":1,"id":276,"name":"minecraft:element_10","runtimeID":2348},{"data":2,"id":276,"name":"minecraft:element_10","runtimeID":2349},{"data":3,"id":276,"name":"minecraft:element_10","runtimeID":2350},{"data":4,"id":276,"name":"minecraft:element_10","runtimeID":2351},{"data":5,"id":276,"name":"minecraft:element_10","runtimeID":2352},{"data":6,"id":276,"name":"minecraft:element_10","runtimeID":2353},{"data":7,"id":276,"name":"minecraft:element_10","runtimeID":2354},{"data":8,"id":276,"name":"minecraft:element_10","runtimeID":2355},{"data":9,"id":276,"name":"minecraft:element_10","runtimeID":2356},{"data":10,"id":276,"name":"minecraft:element_10","runtimeID":2357},{"data":11,"id":276,"name":"minecraft:element_10","runtimeID":2358},{"data":12,"id":276,"name":"minecraft:element_10","runtimeID":2359},{"data":13,"id":276,"name":"minecraft:element_10","runtimeID":2360},{"data":14,"id":276,"name":"minecraft:element_10","runtimeID":2361},{"data":15,"id":276,"name":"minecraft:element_10","runtimeID":2362},{"data":0,"id":277,"name":"minecraft:element_11","runtimeID":2363},{"data":1,"id":277,"name":"minecraft:element_11","runtimeID":2364},{"data":2,"id":277,"name":"minecraft:element_11","runtimeID":2365},{"data":3,"id":277,"name":"minecraft:element_11","runtimeID":2366},{"data":4,"id":277,"name":"minecraft:element_11","runtimeID":2367},{"data":5,"id":277,"name":"minecraft:element_11","runtimeID":2368},{"data":6,"id":277,"name":"minecraft:element_11","runtimeID":2369},{"data":7,"id":277,"name":"minecraft:element_11","runtimeID":2370},{"data":8,"id":277,"name":"minecraft:element_11","runtimeID":2371},{"data":9,"id":277,"name":"minecraft:element_11","runtimeID":2372},{"data":10,"id":277,"name":"minecraft:element_11","runtimeID":2373},{"data":11,"id":277,"name":"minecraft:element_11","runtimeID":2374},{"data":12,"id":277,"name":"minecraft:element_11","runtimeID":2375},{"data":13,"id":277,"name":"minecraft:element_11","runtimeID":2376},{"data":14,"id":277,"name":"minecraft:element_11","runtimeID":2377},{"data":15,"id":277,"name":"minecraft:element_11","runtimeID":2378},{"data":0,"id":278,"name":"minecraft:element_12","runtimeID":2379},{"data":1,"id":278,"name":"minecraft:element_12","runtimeID":2380},{"data":2,"id":278,"name":"minecraft:element_12","runtimeID":2381},{"data":3,"id":278,"name":"minecraft:element_12","runtimeID":2382},{"data":4,"id":278,"name":"minecraft:element_12","runtimeID":2383},{"data":5,"id":278,"name":"minecraft:element_12","runtimeID":2384},{"data":6,"id":278,"name":"minecraft:element_12","runtimeID":2385},{"data":7,"id":278,"name":"minecraft:element_12","runtimeID":2386},{"data":8,"id":278,"name":"minecraft:element_12","runtimeID":2387},{"data":9,"id":278,"name":"minecraft:element_12","runtimeID":2388},{"data":10,"id":278,"name":"minecraft:element_12","runtimeID":2389},{"data":11,"id":278,"name":"minecraft:element_12","runtimeID":2390},{"data":12,"id":278,"name":"minecraft:element_12","runtimeID":2391},{"data":13,"id":278,"name":"minecraft:element_12","runtimeID":2392},{"data":14,"id":278,"name":"minecraft:element_12","runtimeID":2393},{"data":15,"id":278,"name":"minecraft:element_12","runtimeID":2394},{"data":0,"id":279,"name":"minecraft:element_13","runtimeID":2395},{"data":1,"id":279,"name":"minecraft:element_13","runtimeID":2396},{"data":2,"id":279,"name":"minecraft:element_13","runtimeID":2397},{"data":3,"id":279,"name":"minecraft:element_13","runtimeID":2398},{"data":4,"id":279,"name":"minecraft:element_13","runtimeID":2399},{"data":5,"id":279,"name":"minecraft:element_13","runtimeID":2400},{"data":6,"id":279,"name":"minecraft:element_13","runtimeID":2401},{"data":7,"id":279,"name":"minecraft:element_13","runtimeID":2402},{"data":8,"id":279,"name":"minecraft:element_13","runtimeID":2403},{"data":9,"id":279,"name":"minecraft:element_13","runtimeID":2404},{"data":10,"id":279,"name":"minecraft:element_13","runtimeID":2405},{"data":11,"id":279,"name":"minecraft:element_13","runtimeID":2406},{"data":12,"id":279,"name":"minecraft:element_13","runtimeID":2407},{"data":13,"id":279,"name":"minecraft:element_13","runtimeID":2408},{"data":14,"id":279,"name":"minecraft:element_13","runtimeID":2409},{"data":15,"id":279,"name":"minecraft:element_13","runtimeID":2410},{"data":0,"id":280,"name":"minecraft:element_14","runtimeID":2411},{"data":1,"id":280,"name":"minecraft:element_14","runtimeID":2412},{"data":2,"id":280,"name":"minecraft:element_14","runtimeID":2413},{"data":3,"id":280,"name":"minecraft:element_14","runtimeID":2414},{"data":4,"id":280,"name":"minecraft:element_14","runtimeID":2415},{"data":5,"id":280,"name":"minecraft:element_14","runtimeID":2416},{"data":6,"id":280,"name":"minecraft:element_14","runtimeID":2417},{"data":7,"id":280,"name":"minecraft:element_14","runtimeID":2418},{"data":8,"id":280,"name":"minecraft:element_14","runtimeID":2419},{"data":9,"id":280,"name":"minecraft:element_14","runtimeID":2420},{"data":10,"id":280,"name":"minecraft:element_14","runtimeID":2421},{"data":11,"id":280,"name":"minecraft:element_14","runtimeID":2422},{"data":12,"id":280,"name":"minecraft:element_14","runtimeID":2423},{"data":13,"id":280,"name":"minecraft:element_14","runtimeID":2424},{"data":14,"id":280,"name":"minecraft:element_14","runtimeID":2425},{"data":15,"id":280,"name":"minecraft:element_14","runtimeID":2426},{"data":0,"id":281,"name":"minecraft:element_15","runtimeID":2427},{"data":1,"id":281,"name":"minecraft:element_15","runtimeID":2428},{"data":2,"id":281,"name":"minecraft:element_15","runtimeID":2429},{"data":3,"id":281,"name":"minecraft:element_15","runtimeID":2430},{"data":4,"id":281,"name":"minecraft:element_15","runtimeID":2431},{"data":5,"id":281,"name":"minecraft:element_15","runtimeID":2432},{"data":6,"id":281,"name":"minecraft:element_15","runtimeID":2433},{"data":7,"id":281,"name":"minecraft:element_15","runtimeID":2434},{"data":8,"id":281,"name":"minecraft:element_15","runtimeID":2435},{"data":9,"id":281,"name":"minecraft:element_15","runtimeID":2436},{"data":10,"id":281,"name":"minecraft:element_15","runtimeID":2437},{"data":11,"id":281,"name":"minecraft:element_15","runtimeID":2438},{"data":12,"id":281,"name":"minecraft:element_15","runtimeID":2439},{"data":13,"id":281,"name":"minecraft:element_15","runtimeID":2440},{"data":14,"id":281,"name":"minecraft:element_15","runtimeID":2441},{"data":15,"id":281,"name":"minecraft:element_15","runtimeID":2442},{"data":0,"id":282,"name":"minecraft:element_16","runtimeID":2443},{"data":1,"id":282,"name":"minecraft:element_16","runtimeID":2444},{"data":2,"id":282,"name":"minecraft:element_16","runtimeID":2445},{"data":3,"id":282,"name":"minecraft:element_16","runtimeID":2446},{"data":4,"id":282,"name":"minecraft:element_16","runtimeID":2447},{"data":5,"id":282,"name":"minecraft:element_16","runtimeID":2448},{"data":6,"id":282,"name":"minecraft:element_16","runtimeID":2449},{"data":7,"id":282,"name":"minecraft:element_16","runtimeID":2450},{"data":8,"id":282,"name":"minecraft:element_16","runtimeID":2451},{"data":9,"id":282,"name":"minecraft:element_16","runtimeID":2452},{"data":10,"id":282,"name":"minecraft:element_16","runtimeID":2453},{"data":11,"id":282,"name":"minecraft:element_16","runtimeID":2454},{"data":12,"id":282,"name":"minecraft:element_16","runtimeID":2455},{"data":13,"id":282,"name":"minecraft:element_16","runtimeID":2456},{"data":14,"id":282,"name":"minecraft:element_16","runtimeID":2457},{"data":15,"id":282,"name":"minecraft:element_16","runtimeID":2458},{"data":0,"id":283,"name":"minecraft:element_17","runtimeID":2459},{"data":1,"id":283,"name":"minecraft:element_17","runtimeID":2460},{"data":2,"id":283,"name":"minecraft:element_17","runtimeID":2461},{"data":3,"id":283,"name":"minecraft:element_17","runtimeID":2462},{"data":4,"id":283,"name":"minecraft:element_17","runtimeID":2463},{"data":5,"id":283,"name":"minecraft:element_17","runtimeID":2464},{"data":6,"id":283,"name":"minecraft:element_17","runtimeID":2465},{"data":7,"id":283,"name":"minecraft:element_17","runtimeID":2466},{"data":8,"id":283,"name":"minecraft:element_17","runtimeID":2467},{"data":9,"id":283,"name":"minecraft:element_17","runtimeID":2468},{"data":10,"id":283,"name":"minecraft:element_17","runtimeID":2469},{"data":11,"id":283,"name":"minecraft:element_17","runtimeID":2470},{"data":12,"id":283,"name":"minecraft:element_17","runtimeID":2471},{"data":13,"id":283,"name":"minecraft:element_17","runtimeID":2472},{"data":14,"id":283,"name":"minecraft:element_17","runtimeID":2473},{"data":15,"id":283,"name":"minecraft:element_17","runtimeID":2474},{"data":0,"id":284,"name":"minecraft:element_18","runtimeID":2475},{"data":1,"id":284,"name":"minecraft:element_18","runtimeID":2476},{"data":2,"id":284,"name":"minecraft:element_18","runtimeID":2477},{"data":3,"id":284,"name":"minecraft:element_18","runtimeID":2478},{"data":4,"id":284,"name":"minecraft:element_18","runtimeID":2479},{"data":5,"id":284,"name":"minecraft:element_18","runtimeID":2480},{"data":6,"id":284,"name":"minecraft:element_18","runtimeID":2481},{"data":7,"id":284,"name":"minecraft:element_18","runtimeID":2482},{"data":8,"id":284,"name":"minecraft:element_18","runtimeID":2483},{"data":9,"id":284,"name":"minecraft:element_18","runtimeID":2484},{"data":10,"id":284,"name":"minecraft:element_18","runtimeID":2485},{"data":11,"id":284,"name":"minecraft:element_18","runtimeID":2486},{"data":12,"id":284,"name":"minecraft:element_18","runtimeID":2487},{"data":13,"id":284,"name":"minecraft:element_18","runtimeID":2488},{"data":14,"id":284,"name":"minecraft:element_18","runtimeID":2489},{"data":15,"id":284,"name":"minecraft:element_18","runtimeID":2490},{"data":0,"id":285,"name":"minecraft:element_19","runtimeID":2491},{"data":1,"id":285,"name":"minecraft:element_19","runtimeID":2492},{"data":2,"id":285,"name":"minecraft:element_19","runtimeID":2493},{"data":3,"id":285,"name":"minecraft:element_19","runtimeID":2494},{"data":4,"id":285,"name":"minecraft:element_19","runtimeID":2495},{"data":5,"id":285,"name":"minecraft:element_19","runtimeID":2496},{"data":6,"id":285,"name":"minecraft:element_19","runtimeID":2497},{"data":7,"id":285,"name":"minecraft:element_19","runtimeID":2498},{"data":8,"id":285,"name":"minecraft:element_19","runtimeID":2499},{"data":9,"id":285,"name":"minecraft:element_19","runtimeID":2500},{"data":10,"id":285,"name":"minecraft:element_19","runtimeID":2501},{"data":11,"id":285,"name":"minecraft:element_19","runtimeID":2502},{"data":12,"id":285,"name":"minecraft:element_19","runtimeID":2503},{"data":13,"id":285,"name":"minecraft:element_19","runtimeID":2504},{"data":14,"id":285,"name":"minecraft:element_19","runtimeID":2505},{"data":15,"id":285,"name":"minecraft:element_19","runtimeID":2506},{"data":0,"id":286,"name":"minecraft:element_20","runtimeID":2507},{"data":1,"id":286,"name":"minecraft:element_20","runtimeID":2508},{"data":2,"id":286,"name":"minecraft:element_20","runtimeID":2509},{"data":3,"id":286,"name":"minecraft:element_20","runtimeID":2510},{"data":4,"id":286,"name":"minecraft:element_20","runtimeID":2511},{"data":5,"id":286,"name":"minecraft:element_20","runtimeID":2512},{"data":6,"id":286,"name":"minecraft:element_20","runtimeID":2513},{"data":7,"id":286,"name":"minecraft:element_20","runtimeID":2514},{"data":8,"id":286,"name":"minecraft:element_20","runtimeID":2515},{"data":9,"id":286,"name":"minecraft:element_20","runtimeID":2516},{"data":10,"id":286,"name":"minecraft:element_20","runtimeID":2517},{"data":11,"id":286,"name":"minecraft:element_20","runtimeID":2518},{"data":12,"id":286,"name":"minecraft:element_20","runtimeID":2519},{"data":13,"id":286,"name":"minecraft:element_20","runtimeID":2520},{"data":14,"id":286,"name":"minecraft:element_20","runtimeID":2521},{"data":15,"id":286,"name":"minecraft:element_20","runtimeID":2522},{"data":0,"id":287,"name":"minecraft:element_21","runtimeID":2523},{"data":1,"id":287,"name":"minecraft:element_21","runtimeID":2524},{"data":2,"id":287,"name":"minecraft:element_21","runtimeID":2525},{"data":3,"id":287,"name":"minecraft:element_21","runtimeID":2526},{"data":4,"id":287,"name":"minecraft:element_21","runtimeID":2527},{"data":5,"id":287,"name":"minecraft:element_21","runtimeID":2528},{"data":6,"id":287,"name":"minecraft:element_21","runtimeID":2529},{"data":7,"id":287,"name":"minecraft:element_21","runtimeID":2530},{"data":8,"id":287,"name":"minecraft:element_21","runtimeID":2531},{"data":9,"id":287,"name":"minecraft:element_21","runtimeID":2532},{"data":10,"id":287,"name":"minecraft:element_21","runtimeID":2533},{"data":11,"id":287,"name":"minecraft:element_21","runtimeID":2534},{"data":12,"id":287,"name":"minecraft:element_21","runtimeID":2535},{"data":13,"id":287,"name":"minecraft:element_21","runtimeID":2536},{"data":14,"id":287,"name":"minecraft:element_21","runtimeID":2537},{"data":15,"id":287,"name":"minecraft:element_21","runtimeID":2538},{"data":0,"id":288,"name":"minecraft:element_22","runtimeID":2539},{"data":1,"id":288,"name":"minecraft:element_22","runtimeID":2540},{"data":2,"id":288,"name":"minecraft:element_22","runtimeID":2541},{"data":3,"id":288,"name":"minecraft:element_22","runtimeID":2542},{"data":4,"id":288,"name":"minecraft:element_22","runtimeID":2543},{"data":5,"id":288,"name":"minecraft:element_22","runtimeID":2544},{"data":6,"id":288,"name":"minecraft:element_22","runtimeID":2545},{"data":7,"id":288,"name":"minecraft:element_22","runtimeID":2546},{"data":8,"id":288,"name":"minecraft:element_22","runtimeID":2547},{"data":9,"id":288,"name":"minecraft:element_22","runtimeID":2548},{"data":10,"id":288,"name":"minecraft:element_22","runtimeID":2549},{"data":11,"id":288,"name":"minecraft:element_22","runtimeID":2550},{"data":12,"id":288,"name":"minecraft:element_22","runtimeID":2551},{"data":13,"id":288,"name":"minecraft:element_22","runtimeID":2552},{"data":14,"id":288,"name":"minecraft:element_22","runtimeID":2553},{"data":15,"id":288,"name":"minecraft:element_22","runtimeID":2554},{"data":0,"id":289,"name":"minecraft:element_23","runtimeID":2555},{"data":1,"id":289,"name":"minecraft:element_23","runtimeID":2556},{"data":2,"id":289,"name":"minecraft:element_23","runtimeID":2557},{"data":3,"id":289,"name":"minecraft:element_23","runtimeID":2558},{"data":4,"id":289,"name":"minecraft:element_23","runtimeID":2559},{"data":5,"id":289,"name":"minecraft:element_23","runtimeID":2560},{"data":6,"id":289,"name":"minecraft:element_23","runtimeID":2561},{"data":7,"id":289,"name":"minecraft:element_23","runtimeID":2562},{"data":8,"id":289,"name":"minecraft:element_23","runtimeID":2563},{"data":9,"id":289,"name":"minecraft:element_23","runtimeID":2564},{"data":10,"id":289,"name":"minecraft:element_23","runtimeID":2565},{"data":11,"id":289,"name":"minecraft:element_23","runtimeID":2566},{"data":12,"id":289,"name":"minecraft:element_23","runtimeID":2567},{"data":13,"id":289,"name":"minecraft:element_23","runtimeID":2568},{"data":14,"id":289,"name":"minecraft:element_23","runtimeID":2569},{"data":15,"id":289,"name":"minecraft:element_23","runtimeID":2570},{"data":0,"id":290,"name":"minecraft:element_24","runtimeID":2571},{"data":1,"id":290,"name":"minecraft:element_24","runtimeID":2572},{"data":2,"id":290,"name":"minecraft:element_24","runtimeID":2573},{"data":3,"id":290,"name":"minecraft:element_24","runtimeID":2574},{"data":4,"id":290,"name":"minecraft:element_24","runtimeID":2575},{"data":5,"id":290,"name":"minecraft:element_24","runtimeID":2576},{"data":6,"id":290,"name":"minecraft:element_24","runtimeID":2577},{"data":7,"id":290,"name":"minecraft:element_24","runtimeID":2578},{"data":8,"id":290,"name":"minecraft:element_24","runtimeID":2579},{"data":9,"id":290,"name":"minecraft:element_24","runtimeID":2580},{"data":10,"id":290,"name":"minecraft:element_24","runtimeID":2581},{"data":11,"id":290,"name":"minecraft:element_24","runtimeID":2582},{"data":12,"id":290,"name":"minecraft:element_24","runtimeID":2583},{"data":13,"id":290,"name":"minecraft:element_24","runtimeID":2584},{"data":14,"id":290,"name":"minecraft:element_24","runtimeID":2585},{"data":15,"id":290,"name":"minecraft:element_24","runtimeID":2586},{"data":0,"id":291,"name":"minecraft:element_25","runtimeID":2587},{"data":1,"id":291,"name":"minecraft:element_25","runtimeID":2588},{"data":2,"id":291,"name":"minecraft:element_25","runtimeID":2589},{"data":3,"id":291,"name":"minecraft:element_25","runtimeID":2590},{"data":4,"id":291,"name":"minecraft:element_25","runtimeID":2591},{"data":5,"id":291,"name":"minecraft:element_25","runtimeID":2592},{"data":6,"id":291,"name":"minecraft:element_25","runtimeID":2593},{"data":7,"id":291,"name":"minecraft:element_25","runtimeID":2594},{"data":8,"id":291,"name":"minecraft:element_25","runtimeID":2595},{"data":9,"id":291,"name":"minecraft:element_25","runtimeID":2596},{"data":10,"id":291,"name":"minecraft:element_25","runtimeID":2597},{"data":11,"id":291,"name":"minecraft:element_25","runtimeID":2598},{"data":12,"id":291,"name":"minecraft:element_25","runtimeID":2599},{"data":13,"id":291,"name":"minecraft:element_25","runtimeID":2600},{"data":14,"id":291,"name":"minecraft:element_25","runtimeID":2601},{"data":15,"id":291,"name":"minecraft:element_25","runtimeID":2602},{"data":0,"id":292,"name":"minecraft:element_26","runtimeID":2603},{"data":1,"id":292,"name":"minecraft:element_26","runtimeID":2604},{"data":2,"id":292,"name":"minecraft:element_26","runtimeID":2605},{"data":3,"id":292,"name":"minecraft:element_26","runtimeID":2606},{"data":4,"id":292,"name":"minecraft:element_26","runtimeID":2607},{"data":5,"id":292,"name":"minecraft:element_26","runtimeID":2608},{"data":6,"id":292,"name":"minecraft:element_26","runtimeID":2609},{"data":7,"id":292,"name":"minecraft:element_26","runtimeID":2610},{"data":8,"id":292,"name":"minecraft:element_26","runtimeID":2611},{"data":9,"id":292,"name":"minecraft:element_26","runtimeID":2612},{"data":10,"id":292,"name":"minecraft:element_26","runtimeID":2613},{"data":11,"id":292,"name":"minecraft:element_26","runtimeID":2614},{"data":12,"id":292,"name":"minecraft:element_26","runtimeID":2615},{"data":13,"id":292,"name":"minecraft:element_26","runtimeID":2616},{"data":14,"id":292,"name":"minecraft:element_26","runtimeID":2617},{"data":15,"id":292,"name":"minecraft:element_26","runtimeID":2618},{"data":0,"id":293,"name":"minecraft:element_27","runtimeID":2619},{"data":1,"id":293,"name":"minecraft:element_27","runtimeID":2620},{"data":2,"id":293,"name":"minecraft:element_27","runtimeID":2621},{"data":3,"id":293,"name":"minecraft:element_27","runtimeID":2622},{"data":4,"id":293,"name":"minecraft:element_27","runtimeID":2623},{"data":5,"id":293,"name":"minecraft:element_27","runtimeID":2624},{"data":6,"id":293,"name":"minecraft:element_27","runtimeID":2625},{"data":7,"id":293,"name":"minecraft:element_27","runtimeID":2626},{"data":8,"id":293,"name":"minecraft:element_27","runtimeID":2627},{"data":9,"id":293,"name":"minecraft:element_27","runtimeID":2628},{"data":10,"id":293,"name":"minecraft:element_27","runtimeID":2629},{"data":11,"id":293,"name":"minecraft:element_27","runtimeID":2630},{"data":12,"id":293,"name":"minecraft:element_27","runtimeID":2631},{"data":13,"id":293,"name":"minecraft:element_27","runtimeID":2632},{"data":14,"id":293,"name":"minecraft:element_27","runtimeID":2633},{"data":15,"id":293,"name":"minecraft:element_27","runtimeID":2634},{"data":0,"id":294,"name":"minecraft:element_28","runtimeID":2635},{"data":1,"id":294,"name":"minecraft:element_28","runtimeID":2636},{"data":2,"id":294,"name":"minecraft:element_28","runtimeID":2637},{"data":3,"id":294,"name":"minecraft:element_28","runtimeID":2638},{"data":4,"id":294,"name":"minecraft:element_28","runtimeID":2639},{"data":5,"id":294,"name":"minecraft:element_28","runtimeID":2640},{"data":6,"id":294,"name":"minecraft:element_28","runtimeID":2641},{"data":7,"id":294,"name":"minecraft:element_28","runtimeID":2642},{"data":8,"id":294,"name":"minecraft:element_28","runtimeID":2643},{"data":9,"id":294,"name":"minecraft:element_28","runtimeID":2644},{"data":10,"id":294,"name":"minecraft:element_28","runtimeID":2645},{"data":11,"id":294,"name":"minecraft:element_28","runtimeID":2646},{"data":12,"id":294,"name":"minecraft:element_28","runtimeID":2647},{"data":13,"id":294,"name":"minecraft:element_28","runtimeID":2648},{"data":14,"id":294,"name":"minecraft:element_28","runtimeID":2649},{"data":15,"id":294,"name":"minecraft:element_28","runtimeID":2650},{"data":0,"id":295,"name":"minecraft:element_29","runtimeID":2651},{"data":1,"id":295,"name":"minecraft:element_29","runtimeID":2652},{"data":2,"id":295,"name":"minecraft:element_29","runtimeID":2653},{"data":3,"id":295,"name":"minecraft:element_29","runtimeID":2654},{"data":4,"id":295,"name":"minecraft:element_29","runtimeID":2655},{"data":5,"id":295,"name":"minecraft:element_29","runtimeID":2656},{"data":6,"id":295,"name":"minecraft:element_29","runtimeID":2657},{"data":7,"id":295,"name":"minecraft:element_29","runtimeID":2658},{"data":8,"id":295,"name":"minecraft:element_29","runtimeID":2659},{"data":9,"id":295,"name":"minecraft:element_29","runtimeID":2660},{"data":10,"id":295,"name":"minecraft:element_29","runtimeID":2661},{"data":11,"id":295,"name":"minecraft:element_29","runtimeID":2662},{"data":12,"id":295,"name":"minecraft:element_29","runtimeID":2663},{"data":13,"id":295,"name":"minecraft:element_29","runtimeID":2664},{"data":14,"id":295,"name":"minecraft:element_29","runtimeID":2665},{"data":15,"id":295,"name":"minecraft:element_29","runtimeID":2666},{"data":0,"id":296,"name":"minecraft:element_30","runtimeID":2667},{"data":1,"id":296,"name":"minecraft:element_30","runtimeID":2668},{"data":2,"id":296,"name":"minecraft:element_30","runtimeID":2669},{"data":3,"id":296,"name":"minecraft:element_30","runtimeID":2670},{"data":4,"id":296,"name":"minecraft:element_30","runtimeID":2671},{"data":5,"id":296,"name":"minecraft:element_30","runtimeID":2672},{"data":6,"id":296,"name":"minecraft:element_30","runtimeID":2673},{"data":7,"id":296,"name":"minecraft:element_30","runtimeID":2674},{"data":8,"id":296,"name":"minecraft:element_30","runtimeID":2675},{"data":9,"id":296,"name":"minecraft:element_30","runtimeID":2676},{"data":10,"id":296,"name":"minecraft:element_30","runtimeID":2677},{"data":11,"id":296,"name":"minecraft:element_30","runtimeID":2678},{"data":12,"id":296,"name":"minecraft:element_30","runtimeID":2679},{"data":13,"id":296,"name":"minecraft:element_30","runtimeID":2680},{"data":14,"id":296,"name":"minecraft:element_30","runtimeID":2681},{"data":15,"id":296,"name":"minecraft:element_30","runtimeID":2682},{"data":0,"id":297,"name":"minecraft:element_31","runtimeID":2683},{"data":1,"id":297,"name":"minecraft:element_31","runtimeID":2684},{"data":2,"id":297,"name":"minecraft:element_31","runtimeID":2685},{"data":3,"id":297,"name":"minecraft:element_31","runtimeID":2686},{"data":4,"id":297,"name":"minecraft:element_31","runtimeID":2687},{"data":5,"id":297,"name":"minecraft:element_31","runtimeID":2688},{"data":6,"id":297,"name":"minecraft:element_31","runtimeID":2689},{"data":7,"id":297,"name":"minecraft:element_31","runtimeID":2690},{"data":8,"id":297,"name":"minecraft:element_31","runtimeID":2691},{"data":9,"id":297,"name":"minecraft:element_31","runtimeID":2692},{"data":10,"id":297,"name":"minecraft:element_31","runtimeID":2693},{"data":11,"id":297,"name":"minecraft:element_31","runtimeID":2694},{"data":12,"id":297,"name":"minecraft:element_31","runtimeID":2695},{"data":13,"id":297,"name":"minecraft:element_31","runtimeID":2696},{"data":14,"id":297,"name":"minecraft:element_31","runtimeID":2697},{"data":15,"id":297,"name":"minecraft:element_31","runtimeID":2698},{"data":0,"id":298,"name":"minecraft:element_32","runtimeID":2699},{"data":1,"id":298,"name":"minecraft:element_32","runtimeID":2700},{"data":2,"id":298,"name":"minecraft:element_32","runtimeID":2701},{"data":3,"id":298,"name":"minecraft:element_32","runtimeID":2702},{"data":4,"id":298,"name":"minecraft:element_32","runtimeID":2703},{"data":5,"id":298,"name":"minecraft:element_32","runtimeID":2704},{"data":6,"id":298,"name":"minecraft:element_32","runtimeID":2705},{"data":7,"id":298,"name":"minecraft:element_32","runtimeID":2706},{"data":8,"id":298,"name":"minecraft:element_32","runtimeID":2707},{"data":9,"id":298,"name":"minecraft:element_32","runtimeID":2708},{"data":10,"id":298,"name":"minecraft:element_32","runtimeID":2709},{"data":11,"id":298,"name":"minecraft:element_32","runtimeID":2710},{"data":12,"id":298,"name":"minecraft:element_32","runtimeID":2711},{"data":13,"id":298,"name":"minecraft:element_32","runtimeID":2712},{"data":14,"id":298,"name":"minecraft:element_32","runtimeID":2713},{"data":15,"id":298,"name":"minecraft:element_32","runtimeID":2714},{"data":0,"id":299,"name":"minecraft:element_33","runtimeID":2715},{"data":1,"id":299,"name":"minecraft:element_33","runtimeID":2716},{"data":2,"id":299,"name":"minecraft:element_33","runtimeID":2717},{"data":3,"id":299,"name":"minecraft:element_33","runtimeID":2718},{"data":4,"id":299,"name":"minecraft:element_33","runtimeID":2719},{"data":5,"id":299,"name":"minecraft:element_33","runtimeID":2720},{"data":6,"id":299,"name":"minecraft:element_33","runtimeID":2721},{"data":7,"id":299,"name":"minecraft:element_33","runtimeID":2722},{"data":8,"id":299,"name":"minecraft:element_33","runtimeID":2723},{"data":9,"id":299,"name":"minecraft:element_33","runtimeID":2724},{"data":10,"id":299,"name":"minecraft:element_33","runtimeID":2725},{"data":11,"id":299,"name":"minecraft:element_33","runtimeID":2726},{"data":12,"id":299,"name":"minecraft:element_33","runtimeID":2727},{"data":13,"id":299,"name":"minecraft:element_33","runtimeID":2728},{"data":14,"id":299,"name":"minecraft:element_33","runtimeID":2729},{"data":15,"id":299,"name":"minecraft:element_33","runtimeID":2730},{"data":0,"id":300,"name":"minecraft:element_34","runtimeID":2731},{"data":1,"id":300,"name":"minecraft:element_34","runtimeID":2732},{"data":2,"id":300,"name":"minecraft:element_34","runtimeID":2733},{"data":3,"id":300,"name":"minecraft:element_34","runtimeID":2734},{"data":4,"id":300,"name":"minecraft:element_34","runtimeID":2735},{"data":5,"id":300,"name":"minecraft:element_34","runtimeID":2736},{"data":6,"id":300,"name":"minecraft:element_34","runtimeID":2737},{"data":7,"id":300,"name":"minecraft:element_34","runtimeID":2738},{"data":8,"id":300,"name":"minecraft:element_34","runtimeID":2739},{"data":9,"id":300,"name":"minecraft:element_34","runtimeID":2740},{"data":10,"id":300,"name":"minecraft:element_34","runtimeID":2741},{"data":11,"id":300,"name":"minecraft:element_34","runtimeID":2742},{"data":12,"id":300,"name":"minecraft:element_34","runtimeID":2743},{"data":13,"id":300,"name":"minecraft:element_34","runtimeID":2744},{"data":14,"id":300,"name":"minecraft:element_34","runtimeID":2745},{"data":15,"id":300,"name":"minecraft:element_34","runtimeID":2746},{"data":0,"id":301,"name":"minecraft:element_35","runtimeID":2747},{"data":1,"id":301,"name":"minecraft:element_35","runtimeID":2748},{"data":2,"id":301,"name":"minecraft:element_35","runtimeID":2749},{"data":3,"id":301,"name":"minecraft:element_35","runtimeID":2750},{"data":4,"id":301,"name":"minecraft:element_35","runtimeID":2751},{"data":5,"id":301,"name":"minecraft:element_35","runtimeID":2752},{"data":6,"id":301,"name":"minecraft:element_35","runtimeID":2753},{"data":7,"id":301,"name":"minecraft:element_35","runtimeID":2754},{"data":8,"id":301,"name":"minecraft:element_35","runtimeID":2755},{"data":9,"id":301,"name":"minecraft:element_35","runtimeID":2756},{"data":10,"id":301,"name":"minecraft:element_35","runtimeID":2757},{"data":11,"id":301,"name":"minecraft:element_35","runtimeID":2758},{"data":12,"id":301,"name":"minecraft:element_35","runtimeID":2759},{"data":13,"id":301,"name":"minecraft:element_35","runtimeID":2760},{"data":14,"id":301,"name":"minecraft:element_35","runtimeID":2761},{"data":15,"id":301,"name":"minecraft:element_35","runtimeID":2762},{"data":0,"id":302,"name":"minecraft:element_36","runtimeID":2763},{"data":1,"id":302,"name":"minecraft:element_36","runtimeID":2764},{"data":2,"id":302,"name":"minecraft:element_36","runtimeID":2765},{"data":3,"id":302,"name":"minecraft:element_36","runtimeID":2766},{"data":4,"id":302,"name":"minecraft:element_36","runtimeID":2767},{"data":5,"id":302,"name":"minecraft:element_36","runtimeID":2768},{"data":6,"id":302,"name":"minecraft:element_36","runtimeID":2769},{"data":7,"id":302,"name":"minecraft:element_36","runtimeID":2770},{"data":8,"id":302,"name":"minecraft:element_36","runtimeID":2771},{"data":9,"id":302,"name":"minecraft:element_36","runtimeID":2772},{"data":10,"id":302,"name":"minecraft:element_36","runtimeID":2773},{"data":11,"id":302,"name":"minecraft:element_36","runtimeID":2774},{"data":12,"id":302,"name":"minecraft:element_36","runtimeID":2775},{"data":13,"id":302,"name":"minecraft:element_36","runtimeID":2776},{"data":14,"id":302,"name":"minecraft:element_36","runtimeID":2777},{"data":15,"id":302,"name":"minecraft:element_36","runtimeID":2778},{"data":0,"id":303,"name":"minecraft:element_37","runtimeID":2779},{"data":1,"id":303,"name":"minecraft:element_37","runtimeID":2780},{"data":2,"id":303,"name":"minecraft:element_37","runtimeID":2781},{"data":3,"id":303,"name":"minecraft:element_37","runtimeID":2782},{"data":4,"id":303,"name":"minecraft:element_37","runtimeID":2783},{"data":5,"id":303,"name":"minecraft:element_37","runtimeID":2784},{"data":6,"id":303,"name":"minecraft:element_37","runtimeID":2785},{"data":7,"id":303,"name":"minecraft:element_37","runtimeID":2786},{"data":8,"id":303,"name":"minecraft:element_37","runtimeID":2787},{"data":9,"id":303,"name":"minecraft:element_37","runtimeID":2788},{"data":10,"id":303,"name":"minecraft:element_37","runtimeID":2789},{"data":11,"id":303,"name":"minecraft:element_37","runtimeID":2790},{"data":12,"id":303,"name":"minecraft:element_37","runtimeID":2791},{"data":13,"id":303,"name":"minecraft:element_37","runtimeID":2792},{"data":14,"id":303,"name":"minecraft:element_37","runtimeID":2793},{"data":15,"id":303,"name":"minecraft:element_37","runtimeID":2794},{"data":0,"id":304,"name":"minecraft:element_38","runtimeID":2795},{"data":1,"id":304,"name":"minecraft:element_38","runtimeID":2796},{"data":2,"id":304,"name":"minecraft:element_38","runtimeID":2797},{"data":3,"id":304,"name":"minecraft:element_38","runtimeID":2798},{"data":4,"id":304,"name":"minecraft:element_38","runtimeID":2799},{"data":5,"id":304,"name":"minecraft:element_38","runtimeID":2800},{"data":6,"id":304,"name":"minecraft:element_38","runtimeID":2801},{"data":7,"id":304,"name":"minecraft:element_38","runtimeID":2802},{"data":8,"id":304,"name":"minecraft:element_38","runtimeID":2803},{"data":9,"id":304,"name":"minecraft:element_38","runtimeID":2804},{"data":10,"id":304,"name":"minecraft:element_38","runtimeID":2805},{"data":11,"id":304,"name":"minecraft:element_38","runtimeID":2806},{"data":12,"id":304,"name":"minecraft:element_38","runtimeID":2807},{"data":13,"id":304,"name":"minecraft:element_38","runtimeID":2808},{"data":14,"id":304,"name":"minecraft:element_38","runtimeID":2809},{"data":15,"id":304,"name":"minecraft:element_38","runtimeID":2810},{"data":0,"id":305,"name":"minecraft:element_39","runtimeID":2811},{"data":1,"id":305,"name":"minecraft:element_39","runtimeID":2812},{"data":2,"id":305,"name":"minecraft:element_39","runtimeID":2813},{"data":3,"id":305,"name":"minecraft:element_39","runtimeID":2814},{"data":4,"id":305,"name":"minecraft:element_39","runtimeID":2815},{"data":5,"id":305,"name":"minecraft:element_39","runtimeID":2816},{"data":6,"id":305,"name":"minecraft:element_39","runtimeID":2817},{"data":7,"id":305,"name":"minecraft:element_39","runtimeID":2818},{"data":8,"id":305,"name":"minecraft:element_39","runtimeID":2819},{"data":9,"id":305,"name":"minecraft:element_39","runtimeID":2820},{"data":10,"id":305,"name":"minecraft:element_39","runtimeID":2821},{"data":11,"id":305,"name":"minecraft:element_39","runtimeID":2822},{"data":12,"id":305,"name":"minecraft:element_39","runtimeID":2823},{"data":13,"id":305,"name":"minecraft:element_39","runtimeID":2824},{"data":14,"id":305,"name":"minecraft:element_39","runtimeID":2825},{"data":15,"id":305,"name":"minecraft:element_39","runtimeID":2826},{"data":0,"id":306,"name":"minecraft:element_40","runtimeID":2827},{"data":1,"id":306,"name":"minecraft:element_40","runtimeID":2828},{"data":2,"id":306,"name":"minecraft:element_40","runtimeID":2829},{"data":3,"id":306,"name":"minecraft:element_40","runtimeID":2830},{"data":4,"id":306,"name":"minecraft:element_40","runtimeID":2831},{"data":5,"id":306,"name":"minecraft:element_40","runtimeID":2832},{"data":6,"id":306,"name":"minecraft:element_40","runtimeID":2833},{"data":7,"id":306,"name":"minecraft:element_40","runtimeID":2834},{"data":8,"id":306,"name":"minecraft:element_40","runtimeID":2835},{"data":9,"id":306,"name":"minecraft:element_40","runtimeID":2836},{"data":10,"id":306,"name":"minecraft:element_40","runtimeID":2837},{"data":11,"id":306,"name":"minecraft:element_40","runtimeID":2838},{"data":12,"id":306,"name":"minecraft:element_40","runtimeID":2839},{"data":13,"id":306,"name":"minecraft:element_40","runtimeID":2840},{"data":14,"id":306,"name":"minecraft:element_40","runtimeID":2841},{"data":15,"id":306,"name":"minecraft:element_40","runtimeID":2842},{"data":0,"id":307,"name":"minecraft:element_41","runtimeID":2843},{"data":1,"id":307,"name":"minecraft:element_41","runtimeID":2844},{"data":2,"id":307,"name":"minecraft:element_41","runtimeID":2845},{"data":3,"id":307,"name":"minecraft:element_41","runtimeID":2846},{"data":4,"id":307,"name":"minecraft:element_41","runtimeID":2847},{"data":5,"id":307,"name":"minecraft:element_41","runtimeID":2848},{"data":6,"id":307,"name":"minecraft:element_41","runtimeID":2849},{"data":7,"id":307,"name":"minecraft:element_41","runtimeID":2850},{"data":8,"id":307,"name":"minecraft:element_41","runtimeID":2851},{"data":9,"id":307,"name":"minecraft:element_41","runtimeID":2852},{"data":10,"id":307,"name":"minecraft:element_41","runtimeID":2853},{"data":11,"id":307,"name":"minecraft:element_41","runtimeID":2854},{"data":12,"id":307,"name":"minecraft:element_41","runtimeID":2855},{"data":13,"id":307,"name":"minecraft:element_41","runtimeID":2856},{"data":14,"id":307,"name":"minecraft:element_41","runtimeID":2857},{"data":15,"id":307,"name":"minecraft:element_41","runtimeID":2858},{"data":0,"id":308,"name":"minecraft:element_42","runtimeID":2859},{"data":1,"id":308,"name":"minecraft:element_42","runtimeID":2860},{"data":2,"id":308,"name":"minecraft:element_42","runtimeID":2861},{"data":3,"id":308,"name":"minecraft:element_42","runtimeID":2862},{"data":4,"id":308,"name":"minecraft:element_42","runtimeID":2863},{"data":5,"id":308,"name":"minecraft:element_42","runtimeID":2864},{"data":6,"id":308,"name":"minecraft:element_42","runtimeID":2865},{"data":7,"id":308,"name":"minecraft:element_42","runtimeID":2866},{"data":8,"id":308,"name":"minecraft:element_42","runtimeID":2867},{"data":9,"id":308,"name":"minecraft:element_42","runtimeID":2868},{"data":10,"id":308,"name":"minecraft:element_42","runtimeID":2869},{"data":11,"id":308,"name":"minecraft:element_42","runtimeID":2870},{"data":12,"id":308,"name":"minecraft:element_42","runtimeID":2871},{"data":13,"id":308,"name":"minecraft:element_42","runtimeID":2872},{"data":14,"id":308,"name":"minecraft:element_42","runtimeID":2873},{"data":15,"id":308,"name":"minecraft:element_42","runtimeID":2874},{"data":0,"id":309,"name":"minecraft:element_43","runtimeID":2875},{"data":1,"id":309,"name":"minecraft:element_43","runtimeID":2876},{"data":2,"id":309,"name":"minecraft:element_43","runtimeID":2877},{"data":3,"id":309,"name":"minecraft:element_43","runtimeID":2878},{"data":4,"id":309,"name":"minecraft:element_43","runtimeID":2879},{"data":5,"id":309,"name":"minecraft:element_43","runtimeID":2880},{"data":6,"id":309,"name":"minecraft:element_43","runtimeID":2881},{"data":7,"id":309,"name":"minecraft:element_43","runtimeID":2882},{"data":8,"id":309,"name":"minecraft:element_43","runtimeID":2883},{"data":9,"id":309,"name":"minecraft:element_43","runtimeID":2884},{"data":10,"id":309,"name":"minecraft:element_43","runtimeID":2885},{"data":11,"id":309,"name":"minecraft:element_43","runtimeID":2886},{"data":12,"id":309,"name":"minecraft:element_43","runtimeID":2887},{"data":13,"id":309,"name":"minecraft:element_43","runtimeID":2888},{"data":14,"id":309,"name":"minecraft:element_43","runtimeID":2889},{"data":15,"id":309,"name":"minecraft:element_43","runtimeID":2890},{"data":0,"id":310,"name":"minecraft:element_44","runtimeID":2891},{"data":1,"id":310,"name":"minecraft:element_44","runtimeID":2892},{"data":2,"id":310,"name":"minecraft:element_44","runtimeID":2893},{"data":3,"id":310,"name":"minecraft:element_44","runtimeID":2894},{"data":4,"id":310,"name":"minecraft:element_44","runtimeID":2895},{"data":5,"id":310,"name":"minecraft:element_44","runtimeID":2896},{"data":6,"id":310,"name":"minecraft:element_44","runtimeID":2897},{"data":7,"id":310,"name":"minecraft:element_44","runtimeID":2898},{"data":8,"id":310,"name":"minecraft:element_44","runtimeID":2899},{"data":9,"id":310,"name":"minecraft:element_44","runtimeID":2900},{"data":10,"id":310,"name":"minecraft:element_44","runtimeID":2901},{"data":11,"id":310,"name":"minecraft:element_44","runtimeID":2902},{"data":12,"id":310,"name":"minecraft:element_44","runtimeID":2903},{"data":13,"id":310,"name":"minecraft:element_44","runtimeID":2904},{"data":14,"id":310,"name":"minecraft:element_44","runtimeID":2905},{"data":15,"id":310,"name":"minecraft:element_44","runtimeID":2906},{"data":0,"id":311,"name":"minecraft:element_45","runtimeID":2907},{"data":1,"id":311,"name":"minecraft:element_45","runtimeID":2908},{"data":2,"id":311,"name":"minecraft:element_45","runtimeID":2909},{"data":3,"id":311,"name":"minecraft:element_45","runtimeID":2910},{"data":4,"id":311,"name":"minecraft:element_45","runtimeID":2911},{"data":5,"id":311,"name":"minecraft:element_45","runtimeID":2912},{"data":6,"id":311,"name":"minecraft:element_45","runtimeID":2913},{"data":7,"id":311,"name":"minecraft:element_45","runtimeID":2914},{"data":8,"id":311,"name":"minecraft:element_45","runtimeID":2915},{"data":9,"id":311,"name":"minecraft:element_45","runtimeID":2916},{"data":10,"id":311,"name":"minecraft:element_45","runtimeID":2917},{"data":11,"id":311,"name":"minecraft:element_45","runtimeID":2918},{"data":12,"id":311,"name":"minecraft:element_45","runtimeID":2919},{"data":13,"id":311,"name":"minecraft:element_45","runtimeID":2920},{"data":14,"id":311,"name":"minecraft:element_45","runtimeID":2921},{"data":15,"id":311,"name":"minecraft:element_45","runtimeID":2922},{"data":0,"id":312,"name":"minecraft:element_46","runtimeID":2923},{"data":1,"id":312,"name":"minecraft:element_46","runtimeID":2924},{"data":2,"id":312,"name":"minecraft:element_46","runtimeID":2925},{"data":3,"id":312,"name":"minecraft:element_46","runtimeID":2926},{"data":4,"id":312,"name":"minecraft:element_46","runtimeID":2927},{"data":5,"id":312,"name":"minecraft:element_46","runtimeID":2928},{"data":6,"id":312,"name":"minecraft:element_46","runtimeID":2929},{"data":7,"id":312,"name":"minecraft:element_46","runtimeID":2930},{"data":8,"id":312,"name":"minecraft:element_46","runtimeID":2931},{"data":9,"id":312,"name":"minecraft:element_46","runtimeID":2932},{"data":10,"id":312,"name":"minecraft:element_46","runtimeID":2933},{"data":11,"id":312,"name":"minecraft:element_46","runtimeID":2934},{"data":12,"id":312,"name":"minecraft:element_46","runtimeID":2935},{"data":13,"id":312,"name":"minecraft:element_46","runtimeID":2936},{"data":14,"id":312,"name":"minecraft:element_46","runtimeID":2937},{"data":15,"id":312,"name":"minecraft:element_46","runtimeID":2938},{"data":0,"id":313,"name":"minecraft:element_47","runtimeID":2939},{"data":1,"id":313,"name":"minecraft:element_47","runtimeID":2940},{"data":2,"id":313,"name":"minecraft:element_47","runtimeID":2941},{"data":3,"id":313,"name":"minecraft:element_47","runtimeID":2942},{"data":4,"id":313,"name":"minecraft:element_47","runtimeID":2943},{"data":5,"id":313,"name":"minecraft:element_47","runtimeID":2944},{"data":6,"id":313,"name":"minecraft:element_47","runtimeID":2945},{"data":7,"id":313,"name":"minecraft:element_47","runtimeID":2946},{"data":8,"id":313,"name":"minecraft:element_47","runtimeID":2947},{"data":9,"id":313,"name":"minecraft:element_47","runtimeID":2948},{"data":10,"id":313,"name":"minecraft:element_47","runtimeID":2949},{"data":11,"id":313,"name":"minecraft:element_47","runtimeID":2950},{"data":12,"id":313,"name":"minecraft:element_47","runtimeID":2951},{"data":13,"id":313,"name":"minecraft:element_47","runtimeID":2952},{"data":14,"id":313,"name":"minecraft:element_47","runtimeID":2953},{"data":15,"id":313,"name":"minecraft:element_47","runtimeID":2954},{"data":0,"id":314,"name":"minecraft:element_48","runtimeID":2955},{"data":1,"id":314,"name":"minecraft:element_48","runtimeID":2956},{"data":2,"id":314,"name":"minecraft:element_48","runtimeID":2957},{"data":3,"id":314,"name":"minecraft:element_48","runtimeID":2958},{"data":4,"id":314,"name":"minecraft:element_48","runtimeID":2959},{"data":5,"id":314,"name":"minecraft:element_48","runtimeID":2960},{"data":6,"id":314,"name":"minecraft:element_48","runtimeID":2961},{"data":7,"id":314,"name":"minecraft:element_48","runtimeID":2962},{"data":8,"id":314,"name":"minecraft:element_48","runtimeID":2963},{"data":9,"id":314,"name":"minecraft:element_48","runtimeID":2964},{"data":10,"id":314,"name":"minecraft:element_48","runtimeID":2965},{"data":11,"id":314,"name":"minecraft:element_48","runtimeID":2966},{"data":12,"id":314,"name":"minecraft:element_48","runtimeID":2967},{"data":13,"id":314,"name":"minecraft:element_48","runtimeID":2968},{"data":14,"id":314,"name":"minecraft:element_48","runtimeID":2969},{"data":15,"id":314,"name":"minecraft:element_48","runtimeID":2970},{"data":0,"id":315,"name":"minecraft:element_49","runtimeID":2971},{"data":1,"id":315,"name":"minecraft:element_49","runtimeID":2972},{"data":2,"id":315,"name":"minecraft:element_49","runtimeID":2973},{"data":3,"id":315,"name":"minecraft:element_49","runtimeID":2974},{"data":4,"id":315,"name":"minecraft:element_49","runtimeID":2975},{"data":5,"id":315,"name":"minecraft:element_49","runtimeID":2976},{"data":6,"id":315,"name":"minecraft:element_49","runtimeID":2977},{"data":7,"id":315,"name":"minecraft:element_49","runtimeID":2978},{"data":8,"id":315,"name":"minecraft:element_49","runtimeID":2979},{"data":9,"id":315,"name":"minecraft:element_49","runtimeID":2980},{"data":10,"id":315,"name":"minecraft:element_49","runtimeID":2981},{"data":11,"id":315,"name":"minecraft:element_49","runtimeID":2982},{"data":12,"id":315,"name":"minecraft:element_49","runtimeID":2983},{"data":13,"id":315,"name":"minecraft:element_49","runtimeID":2984},{"data":14,"id":315,"name":"minecraft:element_49","runtimeID":2985},{"data":15,"id":315,"name":"minecraft:element_49","runtimeID":2986},{"data":0,"id":316,"name":"minecraft:element_50","runtimeID":2987},{"data":1,"id":316,"name":"minecraft:element_50","runtimeID":2988},{"data":2,"id":316,"name":"minecraft:element_50","runtimeID":2989},{"data":3,"id":316,"name":"minecraft:element_50","runtimeID":2990},{"data":4,"id":316,"name":"minecraft:element_50","runtimeID":2991},{"data":5,"id":316,"name":"minecraft:element_50","runtimeID":2992},{"data":6,"id":316,"name":"minecraft:element_50","runtimeID":2993},{"data":7,"id":316,"name":"minecraft:element_50","runtimeID":2994},{"data":8,"id":316,"name":"minecraft:element_50","runtimeID":2995},{"data":9,"id":316,"name":"minecraft:element_50","runtimeID":2996},{"data":10,"id":316,"name":"minecraft:element_50","runtimeID":2997},{"data":11,"id":316,"name":"minecraft:element_50","runtimeID":2998},{"data":12,"id":316,"name":"minecraft:element_50","runtimeID":2999},{"data":13,"id":316,"name":"minecraft:element_50","runtimeID":3000},{"data":14,"id":316,"name":"minecraft:element_50","runtimeID":3001},{"data":15,"id":316,"name":"minecraft:element_50","runtimeID":3002},{"data":0,"id":317,"name":"minecraft:element_51","runtimeID":3003},{"data":1,"id":317,"name":"minecraft:element_51","runtimeID":3004},{"data":2,"id":317,"name":"minecraft:element_51","runtimeID":3005},{"data":3,"id":317,"name":"minecraft:element_51","runtimeID":3006},{"data":4,"id":317,"name":"minecraft:element_51","runtimeID":3007},{"data":5,"id":317,"name":"minecraft:element_51","runtimeID":3008},{"data":6,"id":317,"name":"minecraft:element_51","runtimeID":3009},{"data":7,"id":317,"name":"minecraft:element_51","runtimeID":3010},{"data":8,"id":317,"name":"minecraft:element_51","runtimeID":3011},{"data":9,"id":317,"name":"minecraft:element_51","runtimeID":3012},{"data":10,"id":317,"name":"minecraft:element_51","runtimeID":3013},{"data":11,"id":317,"name":"minecraft:element_51","runtimeID":3014},{"data":12,"id":317,"name":"minecraft:element_51","runtimeID":3015},{"data":13,"id":317,"name":"minecraft:element_51","runtimeID":3016},{"data":14,"id":317,"name":"minecraft:element_51","runtimeID":3017},{"data":15,"id":317,"name":"minecraft:element_51","runtimeID":3018},{"data":0,"id":318,"name":"minecraft:element_52","runtimeID":3019},{"data":1,"id":318,"name":"minecraft:element_52","runtimeID":3020},{"data":2,"id":318,"name":"minecraft:element_52","runtimeID":3021},{"data":3,"id":318,"name":"minecraft:element_52","runtimeID":3022},{"data":4,"id":318,"name":"minecraft:element_52","runtimeID":3023},{"data":5,"id":318,"name":"minecraft:element_52","runtimeID":3024},{"data":6,"id":318,"name":"minecraft:element_52","runtimeID":3025},{"data":7,"id":318,"name":"minecraft:element_52","runtimeID":3026},{"data":8,"id":318,"name":"minecraft:element_52","runtimeID":3027},{"data":9,"id":318,"name":"minecraft:element_52","runtimeID":3028},{"data":10,"id":318,"name":"minecraft:element_52","runtimeID":3029},{"data":11,"id":318,"name":"minecraft:element_52","runtimeID":3030},{"data":12,"id":318,"name":"minecraft:element_52","runtimeID":3031},{"data":13,"id":318,"name":"minecraft:element_52","runtimeID":3032},{"data":14,"id":318,"name":"minecraft:element_52","runtimeID":3033},{"data":15,"id":318,"name":"minecraft:element_52","runtimeID":3034},{"data":0,"id":319,"name":"minecraft:element_53","runtimeID":3035},{"data":1,"id":319,"name":"minecraft:element_53","runtimeID":3036},{"data":2,"id":319,"name":"minecraft:element_53","runtimeID":3037},{"data":3,"id":319,"name":"minecraft:element_53","runtimeID":3038},{"data":4,"id":319,"name":"minecraft:element_53","runtimeID":3039},{"data":5,"id":319,"name":"minecraft:element_53","runtimeID":3040},{"data":6,"id":319,"name":"minecraft:element_53","runtimeID":3041},{"data":7,"id":319,"name":"minecraft:element_53","runtimeID":3042},{"data":8,"id":319,"name":"minecraft:element_53","runtimeID":3043},{"data":9,"id":319,"name":"minecraft:element_53","runtimeID":3044},{"data":10,"id":319,"name":"minecraft:element_53","runtimeID":3045},{"data":11,"id":319,"name":"minecraft:element_53","runtimeID":3046},{"data":12,"id":319,"name":"minecraft:element_53","runtimeID":3047},{"data":13,"id":319,"name":"minecraft:element_53","runtimeID":3048},{"data":14,"id":319,"name":"minecraft:element_53","runtimeID":3049},{"data":15,"id":319,"name":"minecraft:element_53","runtimeID":3050},{"data":0,"id":320,"name":"minecraft:element_54","runtimeID":3051},{"data":1,"id":320,"name":"minecraft:element_54","runtimeID":3052},{"data":2,"id":320,"name":"minecraft:element_54","runtimeID":3053},{"data":3,"id":320,"name":"minecraft:element_54","runtimeID":3054},{"data":4,"id":320,"name":"minecraft:element_54","runtimeID":3055},{"data":5,"id":320,"name":"minecraft:element_54","runtimeID":3056},{"data":6,"id":320,"name":"minecraft:element_54","runtimeID":3057},{"data":7,"id":320,"name":"minecraft:element_54","runtimeID":3058},{"data":8,"id":320,"name":"minecraft:element_54","runtimeID":3059},{"data":9,"id":320,"name":"minecraft:element_54","runtimeID":3060},{"data":10,"id":320,"name":"minecraft:element_54","runtimeID":3061},{"data":11,"id":320,"name":"minecraft:element_54","runtimeID":3062},{"data":12,"id":320,"name":"minecraft:element_54","runtimeID":3063},{"data":13,"id":320,"name":"minecraft:element_54","runtimeID":3064},{"data":14,"id":320,"name":"minecraft:element_54","runtimeID":3065},{"data":15,"id":320,"name":"minecraft:element_54","runtimeID":3066},{"data":0,"id":321,"name":"minecraft:element_55","runtimeID":3067},{"data":1,"id":321,"name":"minecraft:element_55","runtimeID":3068},{"data":2,"id":321,"name":"minecraft:element_55","runtimeID":3069},{"data":3,"id":321,"name":"minecraft:element_55","runtimeID":3070},{"data":4,"id":321,"name":"minecraft:element_55","runtimeID":3071},{"data":5,"id":321,"name":"minecraft:element_55","runtimeID":3072},{"data":6,"id":321,"name":"minecraft:element_55","runtimeID":3073},{"data":7,"id":321,"name":"minecraft:element_55","runtimeID":3074},{"data":8,"id":321,"name":"minecraft:element_55","runtimeID":3075},{"data":9,"id":321,"name":"minecraft:element_55","runtimeID":3076},{"data":10,"id":321,"name":"minecraft:element_55","runtimeID":3077},{"data":11,"id":321,"name":"minecraft:element_55","runtimeID":3078},{"data":12,"id":321,"name":"minecraft:element_55","runtimeID":3079},{"data":13,"id":321,"name":"minecraft:element_55","runtimeID":3080},{"data":14,"id":321,"name":"minecraft:element_55","runtimeID":3081},{"data":15,"id":321,"name":"minecraft:element_55","runtimeID":3082},{"data":0,"id":322,"name":"minecraft:element_56","runtimeID":3083},{"data":1,"id":322,"name":"minecraft:element_56","runtimeID":3084},{"data":2,"id":322,"name":"minecraft:element_56","runtimeID":3085},{"data":3,"id":322,"name":"minecraft:element_56","runtimeID":3086},{"data":4,"id":322,"name":"minecraft:element_56","runtimeID":3087},{"data":5,"id":322,"name":"minecraft:element_56","runtimeID":3088},{"data":6,"id":322,"name":"minecraft:element_56","runtimeID":3089},{"data":7,"id":322,"name":"minecraft:element_56","runtimeID":3090},{"data":8,"id":322,"name":"minecraft:element_56","runtimeID":3091},{"data":9,"id":322,"name":"minecraft:element_56","runtimeID":3092},{"data":10,"id":322,"name":"minecraft:element_56","runtimeID":3093},{"data":11,"id":322,"name":"minecraft:element_56","runtimeID":3094},{"data":12,"id":322,"name":"minecraft:element_56","runtimeID":3095},{"data":13,"id":322,"name":"minecraft:element_56","runtimeID":3096},{"data":14,"id":322,"name":"minecraft:element_56","runtimeID":3097},{"data":15,"id":322,"name":"minecraft:element_56","runtimeID":3098},{"data":0,"id":323,"name":"minecraft:element_57","runtimeID":3099},{"data":1,"id":323,"name":"minecraft:element_57","runtimeID":3100},{"data":2,"id":323,"name":"minecraft:element_57","runtimeID":3101},{"data":3,"id":323,"name":"minecraft:element_57","runtimeID":3102},{"data":4,"id":323,"name":"minecraft:element_57","runtimeID":3103},{"data":5,"id":323,"name":"minecraft:element_57","runtimeID":3104},{"data":6,"id":323,"name":"minecraft:element_57","runtimeID":3105},{"data":7,"id":323,"name":"minecraft:element_57","runtimeID":3106},{"data":8,"id":323,"name":"minecraft:element_57","runtimeID":3107},{"data":9,"id":323,"name":"minecraft:element_57","runtimeID":3108},{"data":10,"id":323,"name":"minecraft:element_57","runtimeID":3109},{"data":11,"id":323,"name":"minecraft:element_57","runtimeID":3110},{"data":12,"id":323,"name":"minecraft:element_57","runtimeID":3111},{"data":13,"id":323,"name":"minecraft:element_57","runtimeID":3112},{"data":14,"id":323,"name":"minecraft:element_57","runtimeID":3113},{"data":15,"id":323,"name":"minecraft:element_57","runtimeID":3114},{"data":0,"id":324,"name":"minecraft:element_58","runtimeID":3115},{"data":1,"id":324,"name":"minecraft:element_58","runtimeID":3116},{"data":2,"id":324,"name":"minecraft:element_58","runtimeID":3117},{"data":3,"id":324,"name":"minecraft:element_58","runtimeID":3118},{"data":4,"id":324,"name":"minecraft:element_58","runtimeID":3119},{"data":5,"id":324,"name":"minecraft:element_58","runtimeID":3120},{"data":6,"id":324,"name":"minecraft:element_58","runtimeID":3121},{"data":7,"id":324,"name":"minecraft:element_58","runtimeID":3122},{"data":8,"id":324,"name":"minecraft:element_58","runtimeID":3123},{"data":9,"id":324,"name":"minecraft:element_58","runtimeID":3124},{"data":10,"id":324,"name":"minecraft:element_58","runtimeID":3125},{"data":11,"id":324,"name":"minecraft:element_58","runtimeID":3126},{"data":12,"id":324,"name":"minecraft:element_58","runtimeID":3127},{"data":13,"id":324,"name":"minecraft:element_58","runtimeID":3128},{"data":14,"id":324,"name":"minecraft:element_58","runtimeID":3129},{"data":15,"id":324,"name":"minecraft:element_58","runtimeID":3130},{"data":0,"id":325,"name":"minecraft:element_59","runtimeID":3131},{"data":1,"id":325,"name":"minecraft:element_59","runtimeID":3132},{"data":2,"id":325,"name":"minecraft:element_59","runtimeID":3133},{"data":3,"id":325,"name":"minecraft:element_59","runtimeID":3134},{"data":4,"id":325,"name":"minecraft:element_59","runtimeID":3135},{"data":5,"id":325,"name":"minecraft:element_59","runtimeID":3136},{"data":6,"id":325,"name":"minecraft:element_59","runtimeID":3137},{"data":7,"id":325,"name":"minecraft:element_59","runtimeID":3138},{"data":8,"id":325,"name":"minecraft:element_59","runtimeID":3139},{"data":9,"id":325,"name":"minecraft:element_59","runtimeID":3140},{"data":10,"id":325,"name":"minecraft:element_59","runtimeID":3141},{"data":11,"id":325,"name":"minecraft:element_59","runtimeID":3142},{"data":12,"id":325,"name":"minecraft:element_59","runtimeID":3143},{"data":13,"id":325,"name":"minecraft:element_59","runtimeID":3144},{"data":14,"id":325,"name":"minecraft:element_59","runtimeID":3145},{"data":15,"id":325,"name":"minecraft:element_59","runtimeID":3146},{"data":0,"id":326,"name":"minecraft:element_60","runtimeID":3147},{"data":1,"id":326,"name":"minecraft:element_60","runtimeID":3148},{"data":2,"id":326,"name":"minecraft:element_60","runtimeID":3149},{"data":3,"id":326,"name":"minecraft:element_60","runtimeID":3150},{"data":4,"id":326,"name":"minecraft:element_60","runtimeID":3151},{"data":5,"id":326,"name":"minecraft:element_60","runtimeID":3152},{"data":6,"id":326,"name":"minecraft:element_60","runtimeID":3153},{"data":7,"id":326,"name":"minecraft:element_60","runtimeID":3154},{"data":8,"id":326,"name":"minecraft:element_60","runtimeID":3155},{"data":9,"id":326,"name":"minecraft:element_60","runtimeID":3156},{"data":10,"id":326,"name":"minecraft:element_60","runtimeID":3157},{"data":11,"id":326,"name":"minecraft:element_60","runtimeID":3158},{"data":12,"id":326,"name":"minecraft:element_60","runtimeID":3159},{"data":13,"id":326,"name":"minecraft:element_60","runtimeID":3160},{"data":14,"id":326,"name":"minecraft:element_60","runtimeID":3161},{"data":15,"id":326,"name":"minecraft:element_60","runtimeID":3162},{"data":0,"id":327,"name":"minecraft:element_61","runtimeID":3163},{"data":1,"id":327,"name":"minecraft:element_61","runtimeID":3164},{"data":2,"id":327,"name":"minecraft:element_61","runtimeID":3165},{"data":3,"id":327,"name":"minecraft:element_61","runtimeID":3166},{"data":4,"id":327,"name":"minecraft:element_61","runtimeID":3167},{"data":5,"id":327,"name":"minecraft:element_61","runtimeID":3168},{"data":6,"id":327,"name":"minecraft:element_61","runtimeID":3169},{"data":7,"id":327,"name":"minecraft:element_61","runtimeID":3170},{"data":8,"id":327,"name":"minecraft:element_61","runtimeID":3171},{"data":9,"id":327,"name":"minecraft:element_61","runtimeID":3172},{"data":10,"id":327,"name":"minecraft:element_61","runtimeID":3173},{"data":11,"id":327,"name":"minecraft:element_61","runtimeID":3174},{"data":12,"id":327,"name":"minecraft:element_61","runtimeID":3175},{"data":13,"id":327,"name":"minecraft:element_61","runtimeID":3176},{"data":14,"id":327,"name":"minecraft:element_61","runtimeID":3177},{"data":15,"id":327,"name":"minecraft:element_61","runtimeID":3178},{"data":0,"id":328,"name":"minecraft:element_62","runtimeID":3179},{"data":1,"id":328,"name":"minecraft:element_62","runtimeID":3180},{"data":2,"id":328,"name":"minecraft:element_62","runtimeID":3181},{"data":3,"id":328,"name":"minecraft:element_62","runtimeID":3182},{"data":4,"id":328,"name":"minecraft:element_62","runtimeID":3183},{"data":5,"id":328,"name":"minecraft:element_62","runtimeID":3184},{"data":6,"id":328,"name":"minecraft:element_62","runtimeID":3185},{"data":7,"id":328,"name":"minecraft:element_62","runtimeID":3186},{"data":8,"id":328,"name":"minecraft:element_62","runtimeID":3187},{"data":9,"id":328,"name":"minecraft:element_62","runtimeID":3188},{"data":10,"id":328,"name":"minecraft:element_62","runtimeID":3189},{"data":11,"id":328,"name":"minecraft:element_62","runtimeID":3190},{"data":12,"id":328,"name":"minecraft:element_62","runtimeID":3191},{"data":13,"id":328,"name":"minecraft:element_62","runtimeID":3192},{"data":14,"id":328,"name":"minecraft:element_62","runtimeID":3193},{"data":15,"id":328,"name":"minecraft:element_62","runtimeID":3194},{"data":0,"id":329,"name":"minecraft:element_63","runtimeID":3195},{"data":1,"id":329,"name":"minecraft:element_63","runtimeID":3196},{"data":2,"id":329,"name":"minecraft:element_63","runtimeID":3197},{"data":3,"id":329,"name":"minecraft:element_63","runtimeID":3198},{"data":4,"id":329,"name":"minecraft:element_63","runtimeID":3199},{"data":5,"id":329,"name":"minecraft:element_63","runtimeID":3200},{"data":6,"id":329,"name":"minecraft:element_63","runtimeID":3201},{"data":7,"id":329,"name":"minecraft:element_63","runtimeID":3202},{"data":8,"id":329,"name":"minecraft:element_63","runtimeID":3203},{"data":9,"id":329,"name":"minecraft:element_63","runtimeID":3204},{"data":10,"id":329,"name":"minecraft:element_63","runtimeID":3205},{"data":11,"id":329,"name":"minecraft:element_63","runtimeID":3206},{"data":12,"id":329,"name":"minecraft:element_63","runtimeID":3207},{"data":13,"id":329,"name":"minecraft:element_63","runtimeID":3208},{"data":14,"id":329,"name":"minecraft:element_63","runtimeID":3209},{"data":15,"id":329,"name":"minecraft:element_63","runtimeID":3210},{"data":0,"id":330,"name":"minecraft:element_64","runtimeID":3211},{"data":1,"id":330,"name":"minecraft:element_64","runtimeID":3212},{"data":2,"id":330,"name":"minecraft:element_64","runtimeID":3213},{"data":3,"id":330,"name":"minecraft:element_64","runtimeID":3214},{"data":4,"id":330,"name":"minecraft:element_64","runtimeID":3215},{"data":5,"id":330,"name":"minecraft:element_64","runtimeID":3216},{"data":6,"id":330,"name":"minecraft:element_64","runtimeID":3217},{"data":7,"id":330,"name":"minecraft:element_64","runtimeID":3218},{"data":8,"id":330,"name":"minecraft:element_64","runtimeID":3219},{"data":9,"id":330,"name":"minecraft:element_64","runtimeID":3220},{"data":10,"id":330,"name":"minecraft:element_64","runtimeID":3221},{"data":11,"id":330,"name":"minecraft:element_64","runtimeID":3222},{"data":12,"id":330,"name":"minecraft:element_64","runtimeID":3223},{"data":13,"id":330,"name":"minecraft:element_64","runtimeID":3224},{"data":14,"id":330,"name":"minecraft:element_64","runtimeID":3225},{"data":15,"id":330,"name":"minecraft:element_64","runtimeID":3226},{"data":0,"id":331,"name":"minecraft:element_65","runtimeID":3227},{"data":1,"id":331,"name":"minecraft:element_65","runtimeID":3228},{"data":2,"id":331,"name":"minecraft:element_65","runtimeID":3229},{"data":3,"id":331,"name":"minecraft:element_65","runtimeID":3230},{"data":4,"id":331,"name":"minecraft:element_65","runtimeID":3231},{"data":5,"id":331,"name":"minecraft:element_65","runtimeID":3232},{"data":6,"id":331,"name":"minecraft:element_65","runtimeID":3233},{"data":7,"id":331,"name":"minecraft:element_65","runtimeID":3234},{"data":8,"id":331,"name":"minecraft:element_65","runtimeID":3235},{"data":9,"id":331,"name":"minecraft:element_65","runtimeID":3236},{"data":10,"id":331,"name":"minecraft:element_65","runtimeID":3237},{"data":11,"id":331,"name":"minecraft:element_65","runtimeID":3238},{"data":12,"id":331,"name":"minecraft:element_65","runtimeID":3239},{"data":13,"id":331,"name":"minecraft:element_65","runtimeID":3240},{"data":14,"id":331,"name":"minecraft:element_65","runtimeID":3241},{"data":15,"id":331,"name":"minecraft:element_65","runtimeID":3242},{"data":0,"id":332,"name":"minecraft:element_66","runtimeID":3243},{"data":1,"id":332,"name":"minecraft:element_66","runtimeID":3244},{"data":2,"id":332,"name":"minecraft:element_66","runtimeID":3245},{"data":3,"id":332,"name":"minecraft:element_66","runtimeID":3246},{"data":4,"id":332,"name":"minecraft:element_66","runtimeID":3247},{"data":5,"id":332,"name":"minecraft:element_66","runtimeID":3248},{"data":6,"id":332,"name":"minecraft:element_66","runtimeID":3249},{"data":7,"id":332,"name":"minecraft:element_66","runtimeID":3250},{"data":8,"id":332,"name":"minecraft:element_66","runtimeID":3251},{"data":9,"id":332,"name":"minecraft:element_66","runtimeID":3252},{"data":10,"id":332,"name":"minecraft:element_66","runtimeID":3253},{"data":11,"id":332,"name":"minecraft:element_66","runtimeID":3254},{"data":12,"id":332,"name":"minecraft:element_66","runtimeID":3255},{"data":13,"id":332,"name":"minecraft:element_66","runtimeID":3256},{"data":14,"id":332,"name":"minecraft:element_66","runtimeID":3257},{"data":15,"id":332,"name":"minecraft:element_66","runtimeID":3258},{"data":0,"id":333,"name":"minecraft:element_67","runtimeID":3259},{"data":1,"id":333,"name":"minecraft:element_67","runtimeID":3260},{"data":2,"id":333,"name":"minecraft:element_67","runtimeID":3261},{"data":3,"id":333,"name":"minecraft:element_67","runtimeID":3262},{"data":4,"id":333,"name":"minecraft:element_67","runtimeID":3263},{"data":5,"id":333,"name":"minecraft:element_67","runtimeID":3264},{"data":6,"id":333,"name":"minecraft:element_67","runtimeID":3265},{"data":7,"id":333,"name":"minecraft:element_67","runtimeID":3266},{"data":8,"id":333,"name":"minecraft:element_67","runtimeID":3267},{"data":9,"id":333,"name":"minecraft:element_67","runtimeID":3268},{"data":10,"id":333,"name":"minecraft:element_67","runtimeID":3269},{"data":11,"id":333,"name":"minecraft:element_67","runtimeID":3270},{"data":12,"id":333,"name":"minecraft:element_67","runtimeID":3271},{"data":13,"id":333,"name":"minecraft:element_67","runtimeID":3272},{"data":14,"id":333,"name":"minecraft:element_67","runtimeID":3273},{"data":15,"id":333,"name":"minecraft:element_67","runtimeID":3274},{"data":0,"id":334,"name":"minecraft:element_68","runtimeID":3275},{"data":1,"id":334,"name":"minecraft:element_68","runtimeID":3276},{"data":2,"id":334,"name":"minecraft:element_68","runtimeID":3277},{"data":3,"id":334,"name":"minecraft:element_68","runtimeID":3278},{"data":4,"id":334,"name":"minecraft:element_68","runtimeID":3279},{"data":5,"id":334,"name":"minecraft:element_68","runtimeID":3280},{"data":6,"id":334,"name":"minecraft:element_68","runtimeID":3281},{"data":7,"id":334,"name":"minecraft:element_68","runtimeID":3282},{"data":8,"id":334,"name":"minecraft:element_68","runtimeID":3283},{"data":9,"id":334,"name":"minecraft:element_68","runtimeID":3284},{"data":10,"id":334,"name":"minecraft:element_68","runtimeID":3285},{"data":11,"id":334,"name":"minecraft:element_68","runtimeID":3286},{"data":12,"id":334,"name":"minecraft:element_68","runtimeID":3287},{"data":13,"id":334,"name":"minecraft:element_68","runtimeID":3288},{"data":14,"id":334,"name":"minecraft:element_68","runtimeID":3289},{"data":15,"id":334,"name":"minecraft:element_68","runtimeID":3290},{"data":0,"id":335,"name":"minecraft:element_69","runtimeID":3291},{"data":1,"id":335,"name":"minecraft:element_69","runtimeID":3292},{"data":2,"id":335,"name":"minecraft:element_69","runtimeID":3293},{"data":3,"id":335,"name":"minecraft:element_69","runtimeID":3294},{"data":4,"id":335,"name":"minecraft:element_69","runtimeID":3295},{"data":5,"id":335,"name":"minecraft:element_69","runtimeID":3296},{"data":6,"id":335,"name":"minecraft:element_69","runtimeID":3297},{"data":7,"id":335,"name":"minecraft:element_69","runtimeID":3298},{"data":8,"id":335,"name":"minecraft:element_69","runtimeID":3299},{"data":9,"id":335,"name":"minecraft:element_69","runtimeID":3300},{"data":10,"id":335,"name":"minecraft:element_69","runtimeID":3301},{"data":11,"id":335,"name":"minecraft:element_69","runtimeID":3302},{"data":12,"id":335,"name":"minecraft:element_69","runtimeID":3303},{"data":13,"id":335,"name":"minecraft:element_69","runtimeID":3304},{"data":14,"id":335,"name":"minecraft:element_69","runtimeID":3305},{"data":15,"id":335,"name":"minecraft:element_69","runtimeID":3306},{"data":0,"id":336,"name":"minecraft:element_70","runtimeID":3307},{"data":1,"id":336,"name":"minecraft:element_70","runtimeID":3308},{"data":2,"id":336,"name":"minecraft:element_70","runtimeID":3309},{"data":3,"id":336,"name":"minecraft:element_70","runtimeID":3310},{"data":4,"id":336,"name":"minecraft:element_70","runtimeID":3311},{"data":5,"id":336,"name":"minecraft:element_70","runtimeID":3312},{"data":6,"id":336,"name":"minecraft:element_70","runtimeID":3313},{"data":7,"id":336,"name":"minecraft:element_70","runtimeID":3314},{"data":8,"id":336,"name":"minecraft:element_70","runtimeID":3315},{"data":9,"id":336,"name":"minecraft:element_70","runtimeID":3316},{"data":10,"id":336,"name":"minecraft:element_70","runtimeID":3317},{"data":11,"id":336,"name":"minecraft:element_70","runtimeID":3318},{"data":12,"id":336,"name":"minecraft:element_70","runtimeID":3319},{"data":13,"id":336,"name":"minecraft:element_70","runtimeID":3320},{"data":14,"id":336,"name":"minecraft:element_70","runtimeID":3321},{"data":15,"id":336,"name":"minecraft:element_70","runtimeID":3322},{"data":0,"id":337,"name":"minecraft:element_71","runtimeID":3323},{"data":1,"id":337,"name":"minecraft:element_71","runtimeID":3324},{"data":2,"id":337,"name":"minecraft:element_71","runtimeID":3325},{"data":3,"id":337,"name":"minecraft:element_71","runtimeID":3326},{"data":4,"id":337,"name":"minecraft:element_71","runtimeID":3327},{"data":5,"id":337,"name":"minecraft:element_71","runtimeID":3328},{"data":6,"id":337,"name":"minecraft:element_71","runtimeID":3329},{"data":7,"id":337,"name":"minecraft:element_71","runtimeID":3330},{"data":8,"id":337,"name":"minecraft:element_71","runtimeID":3331},{"data":9,"id":337,"name":"minecraft:element_71","runtimeID":3332},{"data":10,"id":337,"name":"minecraft:element_71","runtimeID":3333},{"data":11,"id":337,"name":"minecraft:element_71","runtimeID":3334},{"data":12,"id":337,"name":"minecraft:element_71","runtimeID":3335},{"data":13,"id":337,"name":"minecraft:element_71","runtimeID":3336},{"data":14,"id":337,"name":"minecraft:element_71","runtimeID":3337},{"data":15,"id":337,"name":"minecraft:element_71","runtimeID":3338},{"data":0,"id":338,"name":"minecraft:element_72","runtimeID":3339},{"data":1,"id":338,"name":"minecraft:element_72","runtimeID":3340},{"data":2,"id":338,"name":"minecraft:element_72","runtimeID":3341},{"data":3,"id":338,"name":"minecraft:element_72","runtimeID":3342},{"data":4,"id":338,"name":"minecraft:element_72","runtimeID":3343},{"data":5,"id":338,"name":"minecraft:element_72","runtimeID":3344},{"data":6,"id":338,"name":"minecraft:element_72","runtimeID":3345},{"data":7,"id":338,"name":"minecraft:element_72","runtimeID":3346},{"data":8,"id":338,"name":"minecraft:element_72","runtimeID":3347},{"data":9,"id":338,"name":"minecraft:element_72","runtimeID":3348},{"data":10,"id":338,"name":"minecraft:element_72","runtimeID":3349},{"data":11,"id":338,"name":"minecraft:element_72","runtimeID":3350},{"data":12,"id":338,"name":"minecraft:element_72","runtimeID":3351},{"data":13,"id":338,"name":"minecraft:element_72","runtimeID":3352},{"data":14,"id":338,"name":"minecraft:element_72","runtimeID":3353},{"data":15,"id":338,"name":"minecraft:element_72","runtimeID":3354},{"data":0,"id":339,"name":"minecraft:element_73","runtimeID":3355},{"data":1,"id":339,"name":"minecraft:element_73","runtimeID":3356},{"data":2,"id":339,"name":"minecraft:element_73","runtimeID":3357},{"data":3,"id":339,"name":"minecraft:element_73","runtimeID":3358},{"data":4,"id":339,"name":"minecraft:element_73","runtimeID":3359},{"data":5,"id":339,"name":"minecraft:element_73","runtimeID":3360},{"data":6,"id":339,"name":"minecraft:element_73","runtimeID":3361},{"data":7,"id":339,"name":"minecraft:element_73","runtimeID":3362},{"data":8,"id":339,"name":"minecraft:element_73","runtimeID":3363},{"data":9,"id":339,"name":"minecraft:element_73","runtimeID":3364},{"data":10,"id":339,"name":"minecraft:element_73","runtimeID":3365},{"data":11,"id":339,"name":"minecraft:element_73","runtimeID":3366},{"data":12,"id":339,"name":"minecraft:element_73","runtimeID":3367},{"data":13,"id":339,"name":"minecraft:element_73","runtimeID":3368},{"data":14,"id":339,"name":"minecraft:element_73","runtimeID":3369},{"data":15,"id":339,"name":"minecraft:element_73","runtimeID":3370},{"data":0,"id":340,"name":"minecraft:element_74","runtimeID":3371},{"data":1,"id":340,"name":"minecraft:element_74","runtimeID":3372},{"data":2,"id":340,"name":"minecraft:element_74","runtimeID":3373},{"data":3,"id":340,"name":"minecraft:element_74","runtimeID":3374},{"data":4,"id":340,"name":"minecraft:element_74","runtimeID":3375},{"data":5,"id":340,"name":"minecraft:element_74","runtimeID":3376},{"data":6,"id":340,"name":"minecraft:element_74","runtimeID":3377},{"data":7,"id":340,"name":"minecraft:element_74","runtimeID":3378},{"data":8,"id":340,"name":"minecraft:element_74","runtimeID":3379},{"data":9,"id":340,"name":"minecraft:element_74","runtimeID":3380},{"data":10,"id":340,"name":"minecraft:element_74","runtimeID":3381},{"data":11,"id":340,"name":"minecraft:element_74","runtimeID":3382},{"data":12,"id":340,"name":"minecraft:element_74","runtimeID":3383},{"data":13,"id":340,"name":"minecraft:element_74","runtimeID":3384},{"data":14,"id":340,"name":"minecraft:element_74","runtimeID":3385},{"data":15,"id":340,"name":"minecraft:element_74","runtimeID":3386},{"data":0,"id":341,"name":"minecraft:element_75","runtimeID":3387},{"data":1,"id":341,"name":"minecraft:element_75","runtimeID":3388},{"data":2,"id":341,"name":"minecraft:element_75","runtimeID":3389},{"data":3,"id":341,"name":"minecraft:element_75","runtimeID":3390},{"data":4,"id":341,"name":"minecraft:element_75","runtimeID":3391},{"data":5,"id":341,"name":"minecraft:element_75","runtimeID":3392},{"data":6,"id":341,"name":"minecraft:element_75","runtimeID":3393},{"data":7,"id":341,"name":"minecraft:element_75","runtimeID":3394},{"data":8,"id":341,"name":"minecraft:element_75","runtimeID":3395},{"data":9,"id":341,"name":"minecraft:element_75","runtimeID":3396},{"data":10,"id":341,"name":"minecraft:element_75","runtimeID":3397},{"data":11,"id":341,"name":"minecraft:element_75","runtimeID":3398},{"data":12,"id":341,"name":"minecraft:element_75","runtimeID":3399},{"data":13,"id":341,"name":"minecraft:element_75","runtimeID":3400},{"data":14,"id":341,"name":"minecraft:element_75","runtimeID":3401},{"data":15,"id":341,"name":"minecraft:element_75","runtimeID":3402},{"data":0,"id":342,"name":"minecraft:element_76","runtimeID":3403},{"data":1,"id":342,"name":"minecraft:element_76","runtimeID":3404},{"data":2,"id":342,"name":"minecraft:element_76","runtimeID":3405},{"data":3,"id":342,"name":"minecraft:element_76","runtimeID":3406},{"data":4,"id":342,"name":"minecraft:element_76","runtimeID":3407},{"data":5,"id":342,"name":"minecraft:element_76","runtimeID":3408},{"data":6,"id":342,"name":"minecraft:element_76","runtimeID":3409},{"data":7,"id":342,"name":"minecraft:element_76","runtimeID":3410},{"data":8,"id":342,"name":"minecraft:element_76","runtimeID":3411},{"data":9,"id":342,"name":"minecraft:element_76","runtimeID":3412},{"data":10,"id":342,"name":"minecraft:element_76","runtimeID":3413},{"data":11,"id":342,"name":"minecraft:element_76","runtimeID":3414},{"data":12,"id":342,"name":"minecraft:element_76","runtimeID":3415},{"data":13,"id":342,"name":"minecraft:element_76","runtimeID":3416},{"data":14,"id":342,"name":"minecraft:element_76","runtimeID":3417},{"data":15,"id":342,"name":"minecraft:element_76","runtimeID":3418},{"data":0,"id":343,"name":"minecraft:element_77","runtimeID":3419},{"data":1,"id":343,"name":"minecraft:element_77","runtimeID":3420},{"data":2,"id":343,"name":"minecraft:element_77","runtimeID":3421},{"data":3,"id":343,"name":"minecraft:element_77","runtimeID":3422},{"data":4,"id":343,"name":"minecraft:element_77","runtimeID":3423},{"data":5,"id":343,"name":"minecraft:element_77","runtimeID":3424},{"data":6,"id":343,"name":"minecraft:element_77","runtimeID":3425},{"data":7,"id":343,"name":"minecraft:element_77","runtimeID":3426},{"data":8,"id":343,"name":"minecraft:element_77","runtimeID":3427},{"data":9,"id":343,"name":"minecraft:element_77","runtimeID":3428},{"data":10,"id":343,"name":"minecraft:element_77","runtimeID":3429},{"data":11,"id":343,"name":"minecraft:element_77","runtimeID":3430},{"data":12,"id":343,"name":"minecraft:element_77","runtimeID":3431},{"data":13,"id":343,"name":"minecraft:element_77","runtimeID":3432},{"data":14,"id":343,"name":"minecraft:element_77","runtimeID":3433},{"data":15,"id":343,"name":"minecraft:element_77","runtimeID":3434},{"data":0,"id":344,"name":"minecraft:element_78","runtimeID":3435},{"data":1,"id":344,"name":"minecraft:element_78","runtimeID":3436},{"data":2,"id":344,"name":"minecraft:element_78","runtimeID":3437},{"data":3,"id":344,"name":"minecraft:element_78","runtimeID":3438},{"data":4,"id":344,"name":"minecraft:element_78","runtimeID":3439},{"data":5,"id":344,"name":"minecraft:element_78","runtimeID":3440},{"data":6,"id":344,"name":"minecraft:element_78","runtimeID":3441},{"data":7,"id":344,"name":"minecraft:element_78","runtimeID":3442},{"data":8,"id":344,"name":"minecraft:element_78","runtimeID":3443},{"data":9,"id":344,"name":"minecraft:element_78","runtimeID":3444},{"data":10,"id":344,"name":"minecraft:element_78","runtimeID":3445},{"data":11,"id":344,"name":"minecraft:element_78","runtimeID":3446},{"data":12,"id":344,"name":"minecraft:element_78","runtimeID":3447},{"data":13,"id":344,"name":"minecraft:element_78","runtimeID":3448},{"data":14,"id":344,"name":"minecraft:element_78","runtimeID":3449},{"data":15,"id":344,"name":"minecraft:element_78","runtimeID":3450},{"data":0,"id":345,"name":"minecraft:element_79","runtimeID":3451},{"data":1,"id":345,"name":"minecraft:element_79","runtimeID":3452},{"data":2,"id":345,"name":"minecraft:element_79","runtimeID":3453},{"data":3,"id":345,"name":"minecraft:element_79","runtimeID":3454},{"data":4,"id":345,"name":"minecraft:element_79","runtimeID":3455},{"data":5,"id":345,"name":"minecraft:element_79","runtimeID":3456},{"data":6,"id":345,"name":"minecraft:element_79","runtimeID":3457},{"data":7,"id":345,"name":"minecraft:element_79","runtimeID":3458},{"data":8,"id":345,"name":"minecraft:element_79","runtimeID":3459},{"data":9,"id":345,"name":"minecraft:element_79","runtimeID":3460},{"data":10,"id":345,"name":"minecraft:element_79","runtimeID":3461},{"data":11,"id":345,"name":"minecraft:element_79","runtimeID":3462},{"data":12,"id":345,"name":"minecraft:element_79","runtimeID":3463},{"data":13,"id":345,"name":"minecraft:element_79","runtimeID":3464},{"data":14,"id":345,"name":"minecraft:element_79","runtimeID":3465},{"data":15,"id":345,"name":"minecraft:element_79","runtimeID":3466},{"data":0,"id":346,"name":"minecraft:element_80","runtimeID":3467},{"data":1,"id":346,"name":"minecraft:element_80","runtimeID":3468},{"data":2,"id":346,"name":"minecraft:element_80","runtimeID":3469},{"data":3,"id":346,"name":"minecraft:element_80","runtimeID":3470},{"data":4,"id":346,"name":"minecraft:element_80","runtimeID":3471},{"data":5,"id":346,"name":"minecraft:element_80","runtimeID":3472},{"data":6,"id":346,"name":"minecraft:element_80","runtimeID":3473},{"data":7,"id":346,"name":"minecraft:element_80","runtimeID":3474},{"data":8,"id":346,"name":"minecraft:element_80","runtimeID":3475},{"data":9,"id":346,"name":"minecraft:element_80","runtimeID":3476},{"data":10,"id":346,"name":"minecraft:element_80","runtimeID":3477},{"data":11,"id":346,"name":"minecraft:element_80","runtimeID":3478},{"data":12,"id":346,"name":"minecraft:element_80","runtimeID":3479},{"data":13,"id":346,"name":"minecraft:element_80","runtimeID":3480},{"data":14,"id":346,"name":"minecraft:element_80","runtimeID":3481},{"data":15,"id":346,"name":"minecraft:element_80","runtimeID":3482},{"data":0,"id":347,"name":"minecraft:element_81","runtimeID":3483},{"data":1,"id":347,"name":"minecraft:element_81","runtimeID":3484},{"data":2,"id":347,"name":"minecraft:element_81","runtimeID":3485},{"data":3,"id":347,"name":"minecraft:element_81","runtimeID":3486},{"data":4,"id":347,"name":"minecraft:element_81","runtimeID":3487},{"data":5,"id":347,"name":"minecraft:element_81","runtimeID":3488},{"data":6,"id":347,"name":"minecraft:element_81","runtimeID":3489},{"data":7,"id":347,"name":"minecraft:element_81","runtimeID":3490},{"data":8,"id":347,"name":"minecraft:element_81","runtimeID":3491},{"data":9,"id":347,"name":"minecraft:element_81","runtimeID":3492},{"data":10,"id":347,"name":"minecraft:element_81","runtimeID":3493},{"data":11,"id":347,"name":"minecraft:element_81","runtimeID":3494},{"data":12,"id":347,"name":"minecraft:element_81","runtimeID":3495},{"data":13,"id":347,"name":"minecraft:element_81","runtimeID":3496},{"data":14,"id":347,"name":"minecraft:element_81","runtimeID":3497},{"data":15,"id":347,"name":"minecraft:element_81","runtimeID":3498},{"data":0,"id":348,"name":"minecraft:element_82","runtimeID":3499},{"data":1,"id":348,"name":"minecraft:element_82","runtimeID":3500},{"data":2,"id":348,"name":"minecraft:element_82","runtimeID":3501},{"data":3,"id":348,"name":"minecraft:element_82","runtimeID":3502},{"data":4,"id":348,"name":"minecraft:element_82","runtimeID":3503},{"data":5,"id":348,"name":"minecraft:element_82","runtimeID":3504},{"data":6,"id":348,"name":"minecraft:element_82","runtimeID":3505},{"data":7,"id":348,"name":"minecraft:element_82","runtimeID":3506},{"data":8,"id":348,"name":"minecraft:element_82","runtimeID":3507},{"data":9,"id":348,"name":"minecraft:element_82","runtimeID":3508},{"data":10,"id":348,"name":"minecraft:element_82","runtimeID":3509},{"data":11,"id":348,"name":"minecraft:element_82","runtimeID":3510},{"data":12,"id":348,"name":"minecraft:element_82","runtimeID":3511},{"data":13,"id":348,"name":"minecraft:element_82","runtimeID":3512},{"data":14,"id":348,"name":"minecraft:element_82","runtimeID":3513},{"data":15,"id":348,"name":"minecraft:element_82","runtimeID":3514},{"data":0,"id":349,"name":"minecraft:element_83","runtimeID":3515},{"data":1,"id":349,"name":"minecraft:element_83","runtimeID":3516},{"data":2,"id":349,"name":"minecraft:element_83","runtimeID":3517},{"data":3,"id":349,"name":"minecraft:element_83","runtimeID":3518},{"data":4,"id":349,"name":"minecraft:element_83","runtimeID":3519},{"data":5,"id":349,"name":"minecraft:element_83","runtimeID":3520},{"data":6,"id":349,"name":"minecraft:element_83","runtimeID":3521},{"data":7,"id":349,"name":"minecraft:element_83","runtimeID":3522},{"data":8,"id":349,"name":"minecraft:element_83","runtimeID":3523},{"data":9,"id":349,"name":"minecraft:element_83","runtimeID":3524},{"data":10,"id":349,"name":"minecraft:element_83","runtimeID":3525},{"data":11,"id":349,"name":"minecraft:element_83","runtimeID":3526},{"data":12,"id":349,"name":"minecraft:element_83","runtimeID":3527},{"data":13,"id":349,"name":"minecraft:element_83","runtimeID":3528},{"data":14,"id":349,"name":"minecraft:element_83","runtimeID":3529},{"data":15,"id":349,"name":"minecraft:element_83","runtimeID":3530},{"data":0,"id":350,"name":"minecraft:element_84","runtimeID":3531},{"data":1,"id":350,"name":"minecraft:element_84","runtimeID":3532},{"data":2,"id":350,"name":"minecraft:element_84","runtimeID":3533},{"data":3,"id":350,"name":"minecraft:element_84","runtimeID":3534},{"data":4,"id":350,"name":"minecraft:element_84","runtimeID":3535},{"data":5,"id":350,"name":"minecraft:element_84","runtimeID":3536},{"data":6,"id":350,"name":"minecraft:element_84","runtimeID":3537},{"data":7,"id":350,"name":"minecraft:element_84","runtimeID":3538},{"data":8,"id":350,"name":"minecraft:element_84","runtimeID":3539},{"data":9,"id":350,"name":"minecraft:element_84","runtimeID":3540},{"data":10,"id":350,"name":"minecraft:element_84","runtimeID":3541},{"data":11,"id":350,"name":"minecraft:element_84","runtimeID":3542},{"data":12,"id":350,"name":"minecraft:element_84","runtimeID":3543},{"data":13,"id":350,"name":"minecraft:element_84","runtimeID":3544},{"data":14,"id":350,"name":"minecraft:element_84","runtimeID":3545},{"data":15,"id":350,"name":"minecraft:element_84","runtimeID":3546},{"data":0,"id":351,"name":"minecraft:element_85","runtimeID":3547},{"data":1,"id":351,"name":"minecraft:element_85","runtimeID":3548},{"data":2,"id":351,"name":"minecraft:element_85","runtimeID":3549},{"data":3,"id":351,"name":"minecraft:element_85","runtimeID":3550},{"data":4,"id":351,"name":"minecraft:element_85","runtimeID":3551},{"data":5,"id":351,"name":"minecraft:element_85","runtimeID":3552},{"data":6,"id":351,"name":"minecraft:element_85","runtimeID":3553},{"data":7,"id":351,"name":"minecraft:element_85","runtimeID":3554},{"data":8,"id":351,"name":"minecraft:element_85","runtimeID":3555},{"data":9,"id":351,"name":"minecraft:element_85","runtimeID":3556},{"data":10,"id":351,"name":"minecraft:element_85","runtimeID":3557},{"data":11,"id":351,"name":"minecraft:element_85","runtimeID":3558},{"data":12,"id":351,"name":"minecraft:element_85","runtimeID":3559},{"data":13,"id":351,"name":"minecraft:element_85","runtimeID":3560},{"data":14,"id":351,"name":"minecraft:element_85","runtimeID":3561},{"data":15,"id":351,"name":"minecraft:element_85","runtimeID":3562},{"data":0,"id":352,"name":"minecraft:element_86","runtimeID":3563},{"data":1,"id":352,"name":"minecraft:element_86","runtimeID":3564},{"data":2,"id":352,"name":"minecraft:element_86","runtimeID":3565},{"data":3,"id":352,"name":"minecraft:element_86","runtimeID":3566},{"data":4,"id":352,"name":"minecraft:element_86","runtimeID":3567},{"data":5,"id":352,"name":"minecraft:element_86","runtimeID":3568},{"data":6,"id":352,"name":"minecraft:element_86","runtimeID":3569},{"data":7,"id":352,"name":"minecraft:element_86","runtimeID":3570},{"data":8,"id":352,"name":"minecraft:element_86","runtimeID":3571},{"data":9,"id":352,"name":"minecraft:element_86","runtimeID":3572},{"data":10,"id":352,"name":"minecraft:element_86","runtimeID":3573},{"data":11,"id":352,"name":"minecraft:element_86","runtimeID":3574},{"data":12,"id":352,"name":"minecraft:element_86","runtimeID":3575},{"data":13,"id":352,"name":"minecraft:element_86","runtimeID":3576},{"data":14,"id":352,"name":"minecraft:element_86","runtimeID":3577},{"data":15,"id":352,"name":"minecraft:element_86","runtimeID":3578},{"data":0,"id":353,"name":"minecraft:element_87","runtimeID":3579},{"data":1,"id":353,"name":"minecraft:element_87","runtimeID":3580},{"data":2,"id":353,"name":"minecraft:element_87","runtimeID":3581},{"data":3,"id":353,"name":"minecraft:element_87","runtimeID":3582},{"data":4,"id":353,"name":"minecraft:element_87","runtimeID":3583},{"data":5,"id":353,"name":"minecraft:element_87","runtimeID":3584},{"data":6,"id":353,"name":"minecraft:element_87","runtimeID":3585},{"data":7,"id":353,"name":"minecraft:element_87","runtimeID":3586},{"data":8,"id":353,"name":"minecraft:element_87","runtimeID":3587},{"data":9,"id":353,"name":"minecraft:element_87","runtimeID":3588},{"data":10,"id":353,"name":"minecraft:element_87","runtimeID":3589},{"data":11,"id":353,"name":"minecraft:element_87","runtimeID":3590},{"data":12,"id":353,"name":"minecraft:element_87","runtimeID":3591},{"data":13,"id":353,"name":"minecraft:element_87","runtimeID":3592},{"data":14,"id":353,"name":"minecraft:element_87","runtimeID":3593},{"data":15,"id":353,"name":"minecraft:element_87","runtimeID":3594},{"data":0,"id":354,"name":"minecraft:element_88","runtimeID":3595},{"data":1,"id":354,"name":"minecraft:element_88","runtimeID":3596},{"data":2,"id":354,"name":"minecraft:element_88","runtimeID":3597},{"data":3,"id":354,"name":"minecraft:element_88","runtimeID":3598},{"data":4,"id":354,"name":"minecraft:element_88","runtimeID":3599},{"data":5,"id":354,"name":"minecraft:element_88","runtimeID":3600},{"data":6,"id":354,"name":"minecraft:element_88","runtimeID":3601},{"data":7,"id":354,"name":"minecraft:element_88","runtimeID":3602},{"data":8,"id":354,"name":"minecraft:element_88","runtimeID":3603},{"data":9,"id":354,"name":"minecraft:element_88","runtimeID":3604},{"data":10,"id":354,"name":"minecraft:element_88","runtimeID":3605},{"data":11,"id":354,"name":"minecraft:element_88","runtimeID":3606},{"data":12,"id":354,"name":"minecraft:element_88","runtimeID":3607},{"data":13,"id":354,"name":"minecraft:element_88","runtimeID":3608},{"data":14,"id":354,"name":"minecraft:element_88","runtimeID":3609},{"data":15,"id":354,"name":"minecraft:element_88","runtimeID":3610},{"data":0,"id":355,"name":"minecraft:element_89","runtimeID":3611},{"data":1,"id":355,"name":"minecraft:element_89","runtimeID":3612},{"data":2,"id":355,"name":"minecraft:element_89","runtimeID":3613},{"data":3,"id":355,"name":"minecraft:element_89","runtimeID":3614},{"data":4,"id":355,"name":"minecraft:element_89","runtimeID":3615},{"data":5,"id":355,"name":"minecraft:element_89","runtimeID":3616},{"data":6,"id":355,"name":"minecraft:element_89","runtimeID":3617},{"data":7,"id":355,"name":"minecraft:element_89","runtimeID":3618},{"data":8,"id":355,"name":"minecraft:element_89","runtimeID":3619},{"data":9,"id":355,"name":"minecraft:element_89","runtimeID":3620},{"data":10,"id":355,"name":"minecraft:element_89","runtimeID":3621},{"data":11,"id":355,"name":"minecraft:element_89","runtimeID":3622},{"data":12,"id":355,"name":"minecraft:element_89","runtimeID":3623},{"data":13,"id":355,"name":"minecraft:element_89","runtimeID":3624},{"data":14,"id":355,"name":"minecraft:element_89","runtimeID":3625},{"data":15,"id":355,"name":"minecraft:element_89","runtimeID":3626},{"data":0,"id":356,"name":"minecraft:element_90","runtimeID":3627},{"data":1,"id":356,"name":"minecraft:element_90","runtimeID":3628},{"data":2,"id":356,"name":"minecraft:element_90","runtimeID":3629},{"data":3,"id":356,"name":"minecraft:element_90","runtimeID":3630},{"data":4,"id":356,"name":"minecraft:element_90","runtimeID":3631},{"data":5,"id":356,"name":"minecraft:element_90","runtimeID":3632},{"data":6,"id":356,"name":"minecraft:element_90","runtimeID":3633},{"data":7,"id":356,"name":"minecraft:element_90","runtimeID":3634},{"data":8,"id":356,"name":"minecraft:element_90","runtimeID":3635},{"data":9,"id":356,"name":"minecraft:element_90","runtimeID":3636},{"data":10,"id":356,"name":"minecraft:element_90","runtimeID":3637},{"data":11,"id":356,"name":"minecraft:element_90","runtimeID":3638},{"data":12,"id":356,"name":"minecraft:element_90","runtimeID":3639},{"data":13,"id":356,"name":"minecraft:element_90","runtimeID":3640},{"data":14,"id":356,"name":"minecraft:element_90","runtimeID":3641},{"data":15,"id":356,"name":"minecraft:element_90","runtimeID":3642},{"data":0,"id":357,"name":"minecraft:element_91","runtimeID":3643},{"data":1,"id":357,"name":"minecraft:element_91","runtimeID":3644},{"data":2,"id":357,"name":"minecraft:element_91","runtimeID":3645},{"data":3,"id":357,"name":"minecraft:element_91","runtimeID":3646},{"data":4,"id":357,"name":"minecraft:element_91","runtimeID":3647},{"data":5,"id":357,"name":"minecraft:element_91","runtimeID":3648},{"data":6,"id":357,"name":"minecraft:element_91","runtimeID":3649},{"data":7,"id":357,"name":"minecraft:element_91","runtimeID":3650},{"data":8,"id":357,"name":"minecraft:element_91","runtimeID":3651},{"data":9,"id":357,"name":"minecraft:element_91","runtimeID":3652},{"data":10,"id":357,"name":"minecraft:element_91","runtimeID":3653},{"data":11,"id":357,"name":"minecraft:element_91","runtimeID":3654},{"data":12,"id":357,"name":"minecraft:element_91","runtimeID":3655},{"data":13,"id":357,"name":"minecraft:element_91","runtimeID":3656},{"data":14,"id":357,"name":"minecraft:element_91","runtimeID":3657},{"data":15,"id":357,"name":"minecraft:element_91","runtimeID":3658},{"data":0,"id":358,"name":"minecraft:element_92","runtimeID":3659},{"data":1,"id":358,"name":"minecraft:element_92","runtimeID":3660},{"data":2,"id":358,"name":"minecraft:element_92","runtimeID":3661},{"data":3,"id":358,"name":"minecraft:element_92","runtimeID":3662},{"data":4,"id":358,"name":"minecraft:element_92","runtimeID":3663},{"data":5,"id":358,"name":"minecraft:element_92","runtimeID":3664},{"data":6,"id":358,"name":"minecraft:element_92","runtimeID":3665},{"data":7,"id":358,"name":"minecraft:element_92","runtimeID":3666},{"data":8,"id":358,"name":"minecraft:element_92","runtimeID":3667},{"data":9,"id":358,"name":"minecraft:element_92","runtimeID":3668},{"data":10,"id":358,"name":"minecraft:element_92","runtimeID":3669},{"data":11,"id":358,"name":"minecraft:element_92","runtimeID":3670},{"data":12,"id":358,"name":"minecraft:element_92","runtimeID":3671},{"data":13,"id":358,"name":"minecraft:element_92","runtimeID":3672},{"data":14,"id":358,"name":"minecraft:element_92","runtimeID":3673},{"data":15,"id":358,"name":"minecraft:element_92","runtimeID":3674},{"data":0,"id":359,"name":"minecraft:element_93","runtimeID":3675},{"data":1,"id":359,"name":"minecraft:element_93","runtimeID":3676},{"data":2,"id":359,"name":"minecraft:element_93","runtimeID":3677},{"data":3,"id":359,"name":"minecraft:element_93","runtimeID":3678},{"data":4,"id":359,"name":"minecraft:element_93","runtimeID":3679},{"data":5,"id":359,"name":"minecraft:element_93","runtimeID":3680},{"data":6,"id":359,"name":"minecraft:element_93","runtimeID":3681},{"data":7,"id":359,"name":"minecraft:element_93","runtimeID":3682},{"data":8,"id":359,"name":"minecraft:element_93","runtimeID":3683},{"data":9,"id":359,"name":"minecraft:element_93","runtimeID":3684},{"data":10,"id":359,"name":"minecraft:element_93","runtimeID":3685},{"data":11,"id":359,"name":"minecraft:element_93","runtimeID":3686},{"data":12,"id":359,"name":"minecraft:element_93","runtimeID":3687},{"data":13,"id":359,"name":"minecraft:element_93","runtimeID":3688},{"data":14,"id":359,"name":"minecraft:element_93","runtimeID":3689},{"data":15,"id":359,"name":"minecraft:element_93","runtimeID":3690},{"data":0,"id":360,"name":"minecraft:element_94","runtimeID":3691},{"data":1,"id":360,"name":"minecraft:element_94","runtimeID":3692},{"data":2,"id":360,"name":"minecraft:element_94","runtimeID":3693},{"data":3,"id":360,"name":"minecraft:element_94","runtimeID":3694},{"data":4,"id":360,"name":"minecraft:element_94","runtimeID":3695},{"data":5,"id":360,"name":"minecraft:element_94","runtimeID":3696},{"data":6,"id":360,"name":"minecraft:element_94","runtimeID":3697},{"data":7,"id":360,"name":"minecraft:element_94","runtimeID":3698},{"data":8,"id":360,"name":"minecraft:element_94","runtimeID":3699},{"data":9,"id":360,"name":"minecraft:element_94","runtimeID":3700},{"data":10,"id":360,"name":"minecraft:element_94","runtimeID":3701},{"data":11,"id":360,"name":"minecraft:element_94","runtimeID":3702},{"data":12,"id":360,"name":"minecraft:element_94","runtimeID":3703},{"data":13,"id":360,"name":"minecraft:element_94","runtimeID":3704},{"data":14,"id":360,"name":"minecraft:element_94","runtimeID":3705},{"data":15,"id":360,"name":"minecraft:element_94","runtimeID":3706},{"data":0,"id":361,"name":"minecraft:element_95","runtimeID":3707},{"data":1,"id":361,"name":"minecraft:element_95","runtimeID":3708},{"data":2,"id":361,"name":"minecraft:element_95","runtimeID":3709},{"data":3,"id":361,"name":"minecraft:element_95","runtimeID":3710},{"data":4,"id":361,"name":"minecraft:element_95","runtimeID":3711},{"data":5,"id":361,"name":"minecraft:element_95","runtimeID":3712},{"data":6,"id":361,"name":"minecraft:element_95","runtimeID":3713},{"data":7,"id":361,"name":"minecraft:element_95","runtimeID":3714},{"data":8,"id":361,"name":"minecraft:element_95","runtimeID":3715},{"data":9,"id":361,"name":"minecraft:element_95","runtimeID":3716},{"data":10,"id":361,"name":"minecraft:element_95","runtimeID":3717},{"data":11,"id":361,"name":"minecraft:element_95","runtimeID":3718},{"data":12,"id":361,"name":"minecraft:element_95","runtimeID":3719},{"data":13,"id":361,"name":"minecraft:element_95","runtimeID":3720},{"data":14,"id":361,"name":"minecraft:element_95","runtimeID":3721},{"data":15,"id":361,"name":"minecraft:element_95","runtimeID":3722},{"data":0,"id":362,"name":"minecraft:element_96","runtimeID":3723},{"data":1,"id":362,"name":"minecraft:element_96","runtimeID":3724},{"data":2,"id":362,"name":"minecraft:element_96","runtimeID":3725},{"data":3,"id":362,"name":"minecraft:element_96","runtimeID":3726},{"data":4,"id":362,"name":"minecraft:element_96","runtimeID":3727},{"data":5,"id":362,"name":"minecraft:element_96","runtimeID":3728},{"data":6,"id":362,"name":"minecraft:element_96","runtimeID":3729},{"data":7,"id":362,"name":"minecraft:element_96","runtimeID":3730},{"data":8,"id":362,"name":"minecraft:element_96","runtimeID":3731},{"data":9,"id":362,"name":"minecraft:element_96","runtimeID":3732},{"data":10,"id":362,"name":"minecraft:element_96","runtimeID":3733},{"data":11,"id":362,"name":"minecraft:element_96","runtimeID":3734},{"data":12,"id":362,"name":"minecraft:element_96","runtimeID":3735},{"data":13,"id":362,"name":"minecraft:element_96","runtimeID":3736},{"data":14,"id":362,"name":"minecraft:element_96","runtimeID":3737},{"data":15,"id":362,"name":"minecraft:element_96","runtimeID":3738},{"data":0,"id":363,"name":"minecraft:element_97","runtimeID":3739},{"data":1,"id":363,"name":"minecraft:element_97","runtimeID":3740},{"data":2,"id":363,"name":"minecraft:element_97","runtimeID":3741},{"data":3,"id":363,"name":"minecraft:element_97","runtimeID":3742},{"data":4,"id":363,"name":"minecraft:element_97","runtimeID":3743},{"data":5,"id":363,"name":"minecraft:element_97","runtimeID":3744},{"data":6,"id":363,"name":"minecraft:element_97","runtimeID":3745},{"data":7,"id":363,"name":"minecraft:element_97","runtimeID":3746},{"data":8,"id":363,"name":"minecraft:element_97","runtimeID":3747},{"data":9,"id":363,"name":"minecraft:element_97","runtimeID":3748},{"data":10,"id":363,"name":"minecraft:element_97","runtimeID":3749},{"data":11,"id":363,"name":"minecraft:element_97","runtimeID":3750},{"data":12,"id":363,"name":"minecraft:element_97","runtimeID":3751},{"data":13,"id":363,"name":"minecraft:element_97","runtimeID":3752},{"data":14,"id":363,"name":"minecraft:element_97","runtimeID":3753},{"data":15,"id":363,"name":"minecraft:element_97","runtimeID":3754},{"data":0,"id":364,"name":"minecraft:element_98","runtimeID":3755},{"data":1,"id":364,"name":"minecraft:element_98","runtimeID":3756},{"data":2,"id":364,"name":"minecraft:element_98","runtimeID":3757},{"data":3,"id":364,"name":"minecraft:element_98","runtimeID":3758},{"data":4,"id":364,"name":"minecraft:element_98","runtimeID":3759},{"data":5,"id":364,"name":"minecraft:element_98","runtimeID":3760},{"data":6,"id":364,"name":"minecraft:element_98","runtimeID":3761},{"data":7,"id":364,"name":"minecraft:element_98","runtimeID":3762},{"data":8,"id":364,"name":"minecraft:element_98","runtimeID":3763},{"data":9,"id":364,"name":"minecraft:element_98","runtimeID":3764},{"data":10,"id":364,"name":"minecraft:element_98","runtimeID":3765},{"data":11,"id":364,"name":"minecraft:element_98","runtimeID":3766},{"data":12,"id":364,"name":"minecraft:element_98","runtimeID":3767},{"data":13,"id":364,"name":"minecraft:element_98","runtimeID":3768},{"data":14,"id":364,"name":"minecraft:element_98","runtimeID":3769},{"data":15,"id":364,"name":"minecraft:element_98","runtimeID":3770},{"data":0,"id":365,"name":"minecraft:element_99","runtimeID":3771},{"data":1,"id":365,"name":"minecraft:element_99","runtimeID":3772},{"data":2,"id":365,"name":"minecraft:element_99","runtimeID":3773},{"data":3,"id":365,"name":"minecraft:element_99","runtimeID":3774},{"data":4,"id":365,"name":"minecraft:element_99","runtimeID":3775},{"data":5,"id":365,"name":"minecraft:element_99","runtimeID":3776},{"data":6,"id":365,"name":"minecraft:element_99","runtimeID":3777},{"data":7,"id":365,"name":"minecraft:element_99","runtimeID":3778},{"data":8,"id":365,"name":"minecraft:element_99","runtimeID":3779},{"data":9,"id":365,"name":"minecraft:element_99","runtimeID":3780},{"data":10,"id":365,"name":"minecraft:element_99","runtimeID":3781},{"data":11,"id":365,"name":"minecraft:element_99","runtimeID":3782},{"data":12,"id":365,"name":"minecraft:element_99","runtimeID":3783},{"data":13,"id":365,"name":"minecraft:element_99","runtimeID":3784},{"data":14,"id":365,"name":"minecraft:element_99","runtimeID":3785},{"data":15,"id":365,"name":"minecraft:element_99","runtimeID":3786},{"data":0,"id":366,"name":"minecraft:element_100","runtimeID":3787},{"data":1,"id":366,"name":"minecraft:element_100","runtimeID":3788},{"data":2,"id":366,"name":"minecraft:element_100","runtimeID":3789},{"data":3,"id":366,"name":"minecraft:element_100","runtimeID":3790},{"data":4,"id":366,"name":"minecraft:element_100","runtimeID":3791},{"data":5,"id":366,"name":"minecraft:element_100","runtimeID":3792},{"data":6,"id":366,"name":"minecraft:element_100","runtimeID":3793},{"data":7,"id":366,"name":"minecraft:element_100","runtimeID":3794},{"data":8,"id":366,"name":"minecraft:element_100","runtimeID":3795},{"data":9,"id":366,"name":"minecraft:element_100","runtimeID":3796},{"data":10,"id":366,"name":"minecraft:element_100","runtimeID":3797},{"data":11,"id":366,"name":"minecraft:element_100","runtimeID":3798},{"data":12,"id":366,"name":"minecraft:element_100","runtimeID":3799},{"data":13,"id":366,"name":"minecraft:element_100","runtimeID":3800},{"data":14,"id":366,"name":"minecraft:element_100","runtimeID":3801},{"data":15,"id":366,"name":"minecraft:element_100","runtimeID":3802},{"data":0,"id":367,"name":"minecraft:element_101","runtimeID":3803},{"data":1,"id":367,"name":"minecraft:element_101","runtimeID":3804},{"data":2,"id":367,"name":"minecraft:element_101","runtimeID":3805},{"data":3,"id":367,"name":"minecraft:element_101","runtimeID":3806},{"data":4,"id":367,"name":"minecraft:element_101","runtimeID":3807},{"data":5,"id":367,"name":"minecraft:element_101","runtimeID":3808},{"data":6,"id":367,"name":"minecraft:element_101","runtimeID":3809},{"data":7,"id":367,"name":"minecraft:element_101","runtimeID":3810},{"data":8,"id":367,"name":"minecraft:element_101","runtimeID":3811},{"data":9,"id":367,"name":"minecraft:element_101","runtimeID":3812},{"data":10,"id":367,"name":"minecraft:element_101","runtimeID":3813},{"data":11,"id":367,"name":"minecraft:element_101","runtimeID":3814},{"data":12,"id":367,"name":"minecraft:element_101","runtimeID":3815},{"data":13,"id":367,"name":"minecraft:element_101","runtimeID":3816},{"data":14,"id":367,"name":"minecraft:element_101","runtimeID":3817},{"data":15,"id":367,"name":"minecraft:element_101","runtimeID":3818},{"data":0,"id":368,"name":"minecraft:element_102","runtimeID":3819},{"data":1,"id":368,"name":"minecraft:element_102","runtimeID":3820},{"data":2,"id":368,"name":"minecraft:element_102","runtimeID":3821},{"data":3,"id":368,"name":"minecraft:element_102","runtimeID":3822},{"data":4,"id":368,"name":"minecraft:element_102","runtimeID":3823},{"data":5,"id":368,"name":"minecraft:element_102","runtimeID":3824},{"data":6,"id":368,"name":"minecraft:element_102","runtimeID":3825},{"data":7,"id":368,"name":"minecraft:element_102","runtimeID":3826},{"data":8,"id":368,"name":"minecraft:element_102","runtimeID":3827},{"data":9,"id":368,"name":"minecraft:element_102","runtimeID":3828},{"data":10,"id":368,"name":"minecraft:element_102","runtimeID":3829},{"data":11,"id":368,"name":"minecraft:element_102","runtimeID":3830},{"data":12,"id":368,"name":"minecraft:element_102","runtimeID":3831},{"data":13,"id":368,"name":"minecraft:element_102","runtimeID":3832},{"data":14,"id":368,"name":"minecraft:element_102","runtimeID":3833},{"data":15,"id":368,"name":"minecraft:element_102","runtimeID":3834},{"data":0,"id":369,"name":"minecraft:element_103","runtimeID":3835},{"data":1,"id":369,"name":"minecraft:element_103","runtimeID":3836},{"data":2,"id":369,"name":"minecraft:element_103","runtimeID":3837},{"data":3,"id":369,"name":"minecraft:element_103","runtimeID":3838},{"data":4,"id":369,"name":"minecraft:element_103","runtimeID":3839},{"data":5,"id":369,"name":"minecraft:element_103","runtimeID":3840},{"data":6,"id":369,"name":"minecraft:element_103","runtimeID":3841},{"data":7,"id":369,"name":"minecraft:element_103","runtimeID":3842},{"data":8,"id":369,"name":"minecraft:element_103","runtimeID":3843},{"data":9,"id":369,"name":"minecraft:element_103","runtimeID":3844},{"data":10,"id":369,"name":"minecraft:element_103","runtimeID":3845},{"data":11,"id":369,"name":"minecraft:element_103","runtimeID":3846},{"data":12,"id":369,"name":"minecraft:element_103","runtimeID":3847},{"data":13,"id":369,"name":"minecraft:element_103","runtimeID":3848},{"data":14,"id":369,"name":"minecraft:element_103","runtimeID":3849},{"data":15,"id":369,"name":"minecraft:element_103","runtimeID":3850},{"data":0,"id":370,"name":"minecraft:element_104","runtimeID":3851},{"data":1,"id":370,"name":"minecraft:element_104","runtimeID":3852},{"data":2,"id":370,"name":"minecraft:element_104","runtimeID":3853},{"data":3,"id":370,"name":"minecraft:element_104","runtimeID":3854},{"data":4,"id":370,"name":"minecraft:element_104","runtimeID":3855},{"data":5,"id":370,"name":"minecraft:element_104","runtimeID":3856},{"data":6,"id":370,"name":"minecraft:element_104","runtimeID":3857},{"data":7,"id":370,"name":"minecraft:element_104","runtimeID":3858},{"data":8,"id":370,"name":"minecraft:element_104","runtimeID":3859},{"data":9,"id":370,"name":"minecraft:element_104","runtimeID":3860},{"data":10,"id":370,"name":"minecraft:element_104","runtimeID":3861},{"data":11,"id":370,"name":"minecraft:element_104","runtimeID":3862},{"data":12,"id":370,"name":"minecraft:element_104","runtimeID":3863},{"data":13,"id":370,"name":"minecraft:element_104","runtimeID":3864},{"data":14,"id":370,"name":"minecraft:element_104","runtimeID":3865},{"data":15,"id":370,"name":"minecraft:element_104","runtimeID":3866},{"data":0,"id":371,"name":"minecraft:element_105","runtimeID":3867},{"data":1,"id":371,"name":"minecraft:element_105","runtimeID":3868},{"data":2,"id":371,"name":"minecraft:element_105","runtimeID":3869},{"data":3,"id":371,"name":"minecraft:element_105","runtimeID":3870},{"data":4,"id":371,"name":"minecraft:element_105","runtimeID":3871},{"data":5,"id":371,"name":"minecraft:element_105","runtimeID":3872},{"data":6,"id":371,"name":"minecraft:element_105","runtimeID":3873},{"data":7,"id":371,"name":"minecraft:element_105","runtimeID":3874},{"data":8,"id":371,"name":"minecraft:element_105","runtimeID":3875},{"data":9,"id":371,"name":"minecraft:element_105","runtimeID":3876},{"data":10,"id":371,"name":"minecraft:element_105","runtimeID":3877},{"data":11,"id":371,"name":"minecraft:element_105","runtimeID":3878},{"data":12,"id":371,"name":"minecraft:element_105","runtimeID":3879},{"data":13,"id":371,"name":"minecraft:element_105","runtimeID":3880},{"data":14,"id":371,"name":"minecraft:element_105","runtimeID":3881},{"data":15,"id":371,"name":"minecraft:element_105","runtimeID":3882},{"data":0,"id":372,"name":"minecraft:element_106","runtimeID":3883},{"data":1,"id":372,"name":"minecraft:element_106","runtimeID":3884},{"data":2,"id":372,"name":"minecraft:element_106","runtimeID":3885},{"data":3,"id":372,"name":"minecraft:element_106","runtimeID":3886},{"data":4,"id":372,"name":"minecraft:element_106","runtimeID":3887},{"data":5,"id":372,"name":"minecraft:element_106","runtimeID":3888},{"data":6,"id":372,"name":"minecraft:element_106","runtimeID":3889},{"data":7,"id":372,"name":"minecraft:element_106","runtimeID":3890},{"data":8,"id":372,"name":"minecraft:element_106","runtimeID":3891},{"data":9,"id":372,"name":"minecraft:element_106","runtimeID":3892},{"data":10,"id":372,"name":"minecraft:element_106","runtimeID":3893},{"data":11,"id":372,"name":"minecraft:element_106","runtimeID":3894},{"data":12,"id":372,"name":"minecraft:element_106","runtimeID":3895},{"data":13,"id":372,"name":"minecraft:element_106","runtimeID":3896},{"data":14,"id":372,"name":"minecraft:element_106","runtimeID":3897},{"data":15,"id":372,"name":"minecraft:element_106","runtimeID":3898},{"data":0,"id":373,"name":"minecraft:element_107","runtimeID":3899},{"data":1,"id":373,"name":"minecraft:element_107","runtimeID":3900},{"data":2,"id":373,"name":"minecraft:element_107","runtimeID":3901},{"data":3,"id":373,"name":"minecraft:element_107","runtimeID":3902},{"data":4,"id":373,"name":"minecraft:element_107","runtimeID":3903},{"data":5,"id":373,"name":"minecraft:element_107","runtimeID":3904},{"data":6,"id":373,"name":"minecraft:element_107","runtimeID":3905},{"data":7,"id":373,"name":"minecraft:element_107","runtimeID":3906},{"data":8,"id":373,"name":"minecraft:element_107","runtimeID":3907},{"data":9,"id":373,"name":"minecraft:element_107","runtimeID":3908},{"data":10,"id":373,"name":"minecraft:element_107","runtimeID":3909},{"data":11,"id":373,"name":"minecraft:element_107","runtimeID":3910},{"data":12,"id":373,"name":"minecraft:element_107","runtimeID":3911},{"data":13,"id":373,"name":"minecraft:element_107","runtimeID":3912},{"data":14,"id":373,"name":"minecraft:element_107","runtimeID":3913},{"data":15,"id":373,"name":"minecraft:element_107","runtimeID":3914},{"data":0,"id":374,"name":"minecraft:element_108","runtimeID":3915},{"data":1,"id":374,"name":"minecraft:element_108","runtimeID":3916},{"data":2,"id":374,"name":"minecraft:element_108","runtimeID":3917},{"data":3,"id":374,"name":"minecraft:element_108","runtimeID":3918},{"data":4,"id":374,"name":"minecraft:element_108","runtimeID":3919},{"data":5,"id":374,"name":"minecraft:element_108","runtimeID":3920},{"data":6,"id":374,"name":"minecraft:element_108","runtimeID":3921},{"data":7,"id":374,"name":"minecraft:element_108","runtimeID":3922},{"data":8,"id":374,"name":"minecraft:element_108","runtimeID":3923},{"data":9,"id":374,"name":"minecraft:element_108","runtimeID":3924},{"data":10,"id":374,"name":"minecraft:element_108","runtimeID":3925},{"data":11,"id":374,"name":"minecraft:element_108","runtimeID":3926},{"data":12,"id":374,"name":"minecraft:element_108","runtimeID":3927},{"data":13,"id":374,"name":"minecraft:element_108","runtimeID":3928},{"data":14,"id":374,"name":"minecraft:element_108","runtimeID":3929},{"data":15,"id":374,"name":"minecraft:element_108","runtimeID":3930},{"data":0,"id":375,"name":"minecraft:element_109","runtimeID":3931},{"data":1,"id":375,"name":"minecraft:element_109","runtimeID":3932},{"data":2,"id":375,"name":"minecraft:element_109","runtimeID":3933},{"data":3,"id":375,"name":"minecraft:element_109","runtimeID":3934},{"data":4,"id":375,"name":"minecraft:element_109","runtimeID":3935},{"data":5,"id":375,"name":"minecraft:element_109","runtimeID":3936},{"data":6,"id":375,"name":"minecraft:element_109","runtimeID":3937},{"data":7,"id":375,"name":"minecraft:element_109","runtimeID":3938},{"data":8,"id":375,"name":"minecraft:element_109","runtimeID":3939},{"data":9,"id":375,"name":"minecraft:element_109","runtimeID":3940},{"data":10,"id":375,"name":"minecraft:element_109","runtimeID":3941},{"data":11,"id":375,"name":"minecraft:element_109","runtimeID":3942},{"data":12,"id":375,"name":"minecraft:element_109","runtimeID":3943},{"data":13,"id":375,"name":"minecraft:element_109","runtimeID":3944},{"data":14,"id":375,"name":"minecraft:element_109","runtimeID":3945},{"data":15,"id":375,"name":"minecraft:element_109","runtimeID":3946},{"data":0,"id":376,"name":"minecraft:element_110","runtimeID":3947},{"data":1,"id":376,"name":"minecraft:element_110","runtimeID":3948},{"data":2,"id":376,"name":"minecraft:element_110","runtimeID":3949},{"data":3,"id":376,"name":"minecraft:element_110","runtimeID":3950},{"data":4,"id":376,"name":"minecraft:element_110","runtimeID":3951},{"data":5,"id":376,"name":"minecraft:element_110","runtimeID":3952},{"data":6,"id":376,"name":"minecraft:element_110","runtimeID":3953},{"data":7,"id":376,"name":"minecraft:element_110","runtimeID":3954},{"data":8,"id":376,"name":"minecraft:element_110","runtimeID":3955},{"data":9,"id":376,"name":"minecraft:element_110","runtimeID":3956},{"data":10,"id":376,"name":"minecraft:element_110","runtimeID":3957},{"data":11,"id":376,"name":"minecraft:element_110","runtimeID":3958},{"data":12,"id":376,"name":"minecraft:element_110","runtimeID":3959},{"data":13,"id":376,"name":"minecraft:element_110","runtimeID":3960},{"data":14,"id":376,"name":"minecraft:element_110","runtimeID":3961},{"data":15,"id":376,"name":"minecraft:element_110","runtimeID":3962},{"data":0,"id":377,"name":"minecraft:element_111","runtimeID":3963},{"data":1,"id":377,"name":"minecraft:element_111","runtimeID":3964},{"data":2,"id":377,"name":"minecraft:element_111","runtimeID":3965},{"data":3,"id":377,"name":"minecraft:element_111","runtimeID":3966},{"data":4,"id":377,"name":"minecraft:element_111","runtimeID":3967},{"data":5,"id":377,"name":"minecraft:element_111","runtimeID":3968},{"data":6,"id":377,"name":"minecraft:element_111","runtimeID":3969},{"data":7,"id":377,"name":"minecraft:element_111","runtimeID":3970},{"data":8,"id":377,"name":"minecraft:element_111","runtimeID":3971},{"data":9,"id":377,"name":"minecraft:element_111","runtimeID":3972},{"data":10,"id":377,"name":"minecraft:element_111","runtimeID":3973},{"data":11,"id":377,"name":"minecraft:element_111","runtimeID":3974},{"data":12,"id":377,"name":"minecraft:element_111","runtimeID":3975},{"data":13,"id":377,"name":"minecraft:element_111","runtimeID":3976},{"data":14,"id":377,"name":"minecraft:element_111","runtimeID":3977},{"data":15,"id":377,"name":"minecraft:element_111","runtimeID":3978},{"data":0,"id":378,"name":"minecraft:element_112","runtimeID":3979},{"data":1,"id":378,"name":"minecraft:element_112","runtimeID":3980},{"data":2,"id":378,"name":"minecraft:element_112","runtimeID":3981},{"data":3,"id":378,"name":"minecraft:element_112","runtimeID":3982},{"data":4,"id":378,"name":"minecraft:element_112","runtimeID":3983},{"data":5,"id":378,"name":"minecraft:element_112","runtimeID":3984},{"data":6,"id":378,"name":"minecraft:element_112","runtimeID":3985},{"data":7,"id":378,"name":"minecraft:element_112","runtimeID":3986},{"data":8,"id":378,"name":"minecraft:element_112","runtimeID":3987},{"data":9,"id":378,"name":"minecraft:element_112","runtimeID":3988},{"data":10,"id":378,"name":"minecraft:element_112","runtimeID":3989},{"data":11,"id":378,"name":"minecraft:element_112","runtimeID":3990},{"data":12,"id":378,"name":"minecraft:element_112","runtimeID":3991},{"data":13,"id":378,"name":"minecraft:element_112","runtimeID":3992},{"data":14,"id":378,"name":"minecraft:element_112","runtimeID":3993},{"data":15,"id":378,"name":"minecraft:element_112","runtimeID":3994},{"data":0,"id":379,"name":"minecraft:element_113","runtimeID":3995},{"data":1,"id":379,"name":"minecraft:element_113","runtimeID":3996},{"data":2,"id":379,"name":"minecraft:element_113","runtimeID":3997},{"data":3,"id":379,"name":"minecraft:element_113","runtimeID":3998},{"data":4,"id":379,"name":"minecraft:element_113","runtimeID":3999},{"data":5,"id":379,"name":"minecraft:element_113","runtimeID":4000},{"data":6,"id":379,"name":"minecraft:element_113","runtimeID":4001},{"data":7,"id":379,"name":"minecraft:element_113","runtimeID":4002},{"data":8,"id":379,"name":"minecraft:element_113","runtimeID":4003},{"data":9,"id":379,"name":"minecraft:element_113","runtimeID":4004},{"data":10,"id":379,"name":"minecraft:element_113","runtimeID":4005},{"data":11,"id":379,"name":"minecraft:element_113","runtimeID":4006},{"data":12,"id":379,"name":"minecraft:element_113","runtimeID":4007},{"data":13,"id":379,"name":"minecraft:element_113","runtimeID":4008},{"data":14,"id":379,"name":"minecraft:element_113","runtimeID":4009},{"data":15,"id":379,"name":"minecraft:element_113","runtimeID":4010},{"data":0,"id":380,"name":"minecraft:element_114","runtimeID":4011},{"data":1,"id":380,"name":"minecraft:element_114","runtimeID":4012},{"data":2,"id":380,"name":"minecraft:element_114","runtimeID":4013},{"data":3,"id":380,"name":"minecraft:element_114","runtimeID":4014},{"data":4,"id":380,"name":"minecraft:element_114","runtimeID":4015},{"data":5,"id":380,"name":"minecraft:element_114","runtimeID":4016},{"data":6,"id":380,"name":"minecraft:element_114","runtimeID":4017},{"data":7,"id":380,"name":"minecraft:element_114","runtimeID":4018},{"data":8,"id":380,"name":"minecraft:element_114","runtimeID":4019},{"data":9,"id":380,"name":"minecraft:element_114","runtimeID":4020},{"data":10,"id":380,"name":"minecraft:element_114","runtimeID":4021},{"data":11,"id":380,"name":"minecraft:element_114","runtimeID":4022},{"data":12,"id":380,"name":"minecraft:element_114","runtimeID":4023},{"data":13,"id":380,"name":"minecraft:element_114","runtimeID":4024},{"data":14,"id":380,"name":"minecraft:element_114","runtimeID":4025},{"data":15,"id":380,"name":"minecraft:element_114","runtimeID":4026},{"data":0,"id":381,"name":"minecraft:element_115","runtimeID":4027},{"data":1,"id":381,"name":"minecraft:element_115","runtimeID":4028},{"data":2,"id":381,"name":"minecraft:element_115","runtimeID":4029},{"data":3,"id":381,"name":"minecraft:element_115","runtimeID":4030},{"data":4,"id":381,"name":"minecraft:element_115","runtimeID":4031},{"data":5,"id":381,"name":"minecraft:element_115","runtimeID":4032},{"data":6,"id":381,"name":"minecraft:element_115","runtimeID":4033},{"data":7,"id":381,"name":"minecraft:element_115","runtimeID":4034},{"data":8,"id":381,"name":"minecraft:element_115","runtimeID":4035},{"data":9,"id":381,"name":"minecraft:element_115","runtimeID":4036},{"data":10,"id":381,"name":"minecraft:element_115","runtimeID":4037},{"data":11,"id":381,"name":"minecraft:element_115","runtimeID":4038},{"data":12,"id":381,"name":"minecraft:element_115","runtimeID":4039},{"data":13,"id":381,"name":"minecraft:element_115","runtimeID":4040},{"data":14,"id":381,"name":"minecraft:element_115","runtimeID":4041},{"data":15,"id":381,"name":"minecraft:element_115","runtimeID":4042},{"data":0,"id":382,"name":"minecraft:element_116","runtimeID":4043},{"data":1,"id":382,"name":"minecraft:element_116","runtimeID":4044},{"data":2,"id":382,"name":"minecraft:element_116","runtimeID":4045},{"data":3,"id":382,"name":"minecraft:element_116","runtimeID":4046},{"data":4,"id":382,"name":"minecraft:element_116","runtimeID":4047},{"data":5,"id":382,"name":"minecraft:element_116","runtimeID":4048},{"data":6,"id":382,"name":"minecraft:element_116","runtimeID":4049},{"data":7,"id":382,"name":"minecraft:element_116","runtimeID":4050},{"data":8,"id":382,"name":"minecraft:element_116","runtimeID":4051},{"data":9,"id":382,"name":"minecraft:element_116","runtimeID":4052},{"data":10,"id":382,"name":"minecraft:element_116","runtimeID":4053},{"data":11,"id":382,"name":"minecraft:element_116","runtimeID":4054},{"data":12,"id":382,"name":"minecraft:element_116","runtimeID":4055},{"data":13,"id":382,"name":"minecraft:element_116","runtimeID":4056},{"data":14,"id":382,"name":"minecraft:element_116","runtimeID":4057},{"data":15,"id":382,"name":"minecraft:element_116","runtimeID":4058},{"data":0,"id":383,"name":"minecraft:element_117","runtimeID":4059},{"data":1,"id":383,"name":"minecraft:element_117","runtimeID":4060},{"data":2,"id":383,"name":"minecraft:element_117","runtimeID":4061},{"data":3,"id":383,"name":"minecraft:element_117","runtimeID":4062},{"data":4,"id":383,"name":"minecraft:element_117","runtimeID":4063},{"data":5,"id":383,"name":"minecraft:element_117","runtimeID":4064},{"data":6,"id":383,"name":"minecraft:element_117","runtimeID":4065},{"data":7,"id":383,"name":"minecraft:element_117","runtimeID":4066},{"data":8,"id":383,"name":"minecraft:element_117","runtimeID":4067},{"data":9,"id":383,"name":"minecraft:element_117","runtimeID":4068},{"data":10,"id":383,"name":"minecraft:element_117","runtimeID":4069},{"data":11,"id":383,"name":"minecraft:element_117","runtimeID":4070},{"data":12,"id":383,"name":"minecraft:element_117","runtimeID":4071},{"data":13,"id":383,"name":"minecraft:element_117","runtimeID":4072},{"data":14,"id":383,"name":"minecraft:element_117","runtimeID":4073},{"data":15,"id":383,"name":"minecraft:element_117","runtimeID":4074},{"data":0,"id":384,"name":"minecraft:element_118","runtimeID":4075},{"data":1,"id":384,"name":"minecraft:element_118","runtimeID":4076},{"data":2,"id":384,"name":"minecraft:element_118","runtimeID":4077},{"data":3,"id":384,"name":"minecraft:element_118","runtimeID":4078},{"data":4,"id":384,"name":"minecraft:element_118","runtimeID":4079},{"data":5,"id":384,"name":"minecraft:element_118","runtimeID":4080},{"data":6,"id":384,"name":"minecraft:element_118","runtimeID":4081},{"data":7,"id":384,"name":"minecraft:element_118","runtimeID":4082},{"data":8,"id":384,"name":"minecraft:element_118","runtimeID":4083},{"data":9,"id":384,"name":"minecraft:element_118","runtimeID":4084},{"data":10,"id":384,"name":"minecraft:element_118","runtimeID":4085},{"data":11,"id":384,"name":"minecraft:element_118","runtimeID":4086},{"data":12,"id":384,"name":"minecraft:element_118","runtimeID":4087},{"data":13,"id":384,"name":"minecraft:element_118","runtimeID":4088},{"data":14,"id":384,"name":"minecraft:element_118","runtimeID":4089},{"data":15,"id":384,"name":"minecraft:element_118","runtimeID":4090},{"data":0,"id":385,"name":"minecraft:seagrass","runtimeID":4091},{"data":1,"id":385,"name":"minecraft:seagrass","runtimeID":4092},{"data":2,"id":385,"name":"minecraft:seagrass","runtimeID":4093},{"data":3,"id":385,"name":"minecraft:seagrass","runtimeID":4094},{"data":0,"id":386,"name":"minecraft:coral","runtimeID":4095},{"data":1,"id":386,"name":"minecraft:coral","runtimeID":4096},{"data":2,"id":386,"name":"minecraft:coral","runtimeID":4097},{"data":3,"id":386,"name":"minecraft:coral","runtimeID":4098},{"data":4,"id":386,"name":"minecraft:coral","runtimeID":4099},{"data":5,"id":386,"name":"minecraft:coral","runtimeID":4100},{"data":6,"id":386,"name":"minecraft:coral","runtimeID":4101},{"data":7,"id":386,"name":"minecraft:coral","runtimeID":4102},{"data":8,"id":386,"name":"minecraft:coral","runtimeID":4103},{"data":9,"id":386,"name":"minecraft:coral","runtimeID":4104},{"data":10,"id":386,"name":"minecraft:coral","runtimeID":4105},{"data":11,"id":386,"name":"minecraft:coral","runtimeID":4106},{"data":12,"id":386,"name":"minecraft:coral","runtimeID":4107},{"data":13,"id":386,"name":"minecraft:coral","runtimeID":4108},{"data":14,"id":386,"name":"minecraft:coral","runtimeID":4109},{"data":15,"id":386,"name":"minecraft:coral","runtimeID":4110},{"data":0,"id":387,"name":"minecraft:coral_block","runtimeID":4111},{"data":1,"id":387,"name":"minecraft:coral_block","runtimeID":4112},{"data":2,"id":387,"name":"minecraft:coral_block","runtimeID":4113},{"data":3,"id":387,"name":"minecraft:coral_block","runtimeID":4114},{"data":4,"id":387,"name":"minecraft:coral_block","runtimeID":4115},{"data":5,"id":387,"name":"minecraft:coral_block","runtimeID":4116},{"data":6,"id":387,"name":"minecraft:coral_block","runtimeID":4117},{"data":7,"id":387,"name":"minecraft:coral_block","runtimeID":4118},{"data":8,"id":387,"name":"minecraft:coral_block","runtimeID":4119},{"data":9,"id":387,"name":"minecraft:coral_block","runtimeID":4120},{"data":10,"id":387,"name":"minecraft:coral_block","runtimeID":4121},{"data":11,"id":387,"name":"minecraft:coral_block","runtimeID":4122},{"data":12,"id":387,"name":"minecraft:coral_block","runtimeID":4123},{"data":13,"id":387,"name":"minecraft:coral_block","runtimeID":4124},{"data":14,"id":387,"name":"minecraft:coral_block","runtimeID":4125},{"data":15,"id":387,"name":"minecraft:coral_block","runtimeID":4126},{"data":0,"id":388,"name":"minecraft:coral_fan","runtimeID":4127},{"data":1,"id":388,"name":"minecraft:coral_fan","runtimeID":4128},{"data":2,"id":388,"name":"minecraft:coral_fan","runtimeID":4129},{"data":3,"id":388,"name":"minecraft:coral_fan","runtimeID":4130},{"data":4,"id":388,"name":"minecraft:coral_fan","runtimeID":4131},{"data":5,"id":388,"name":"minecraft:coral_fan","runtimeID":4132},{"data":6,"id":388,"name":"minecraft:coral_fan","runtimeID":4133},{"data":7,"id":388,"name":"minecraft:coral_fan","runtimeID":4134},{"data":8,"id":388,"name":"minecraft:coral_fan","runtimeID":4135},{"data":9,"id":388,"name":"minecraft:coral_fan","runtimeID":4136},{"data":10,"id":388,"name":"minecraft:coral_fan","runtimeID":4137},{"data":11,"id":388,"name":"minecraft:coral_fan","runtimeID":4138},{"data":12,"id":388,"name":"minecraft:coral_fan","runtimeID":4139},{"data":13,"id":388,"name":"minecraft:coral_fan","runtimeID":4140},{"data":14,"id":388,"name":"minecraft:coral_fan","runtimeID":4141},{"data":15,"id":388,"name":"minecraft:coral_fan","runtimeID":4142},{"data":0,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4143},{"data":1,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4144},{"data":2,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4145},{"data":3,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4146},{"data":4,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4147},{"data":5,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4148},{"data":6,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4149},{"data":7,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4150},{"data":8,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4151},{"data":9,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4152},{"data":10,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4153},{"data":11,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4154},{"data":12,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4155},{"data":13,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4156},{"data":14,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4157},{"data":15,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4158},{"data":0,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4159},{"data":1,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4160},{"data":2,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4161},{"data":3,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4162},{"data":4,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4163},{"data":5,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4164},{"data":6,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4165},{"data":7,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4166},{"data":8,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4167},{"data":9,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4168},{"data":10,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4169},{"data":11,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4170},{"data":12,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4171},{"data":13,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4172},{"data":14,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4173},{"data":15,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4174},{"data":0,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4175},{"data":1,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4176},{"data":2,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4177},{"data":3,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4178},{"data":4,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4179},{"data":5,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4180},{"data":6,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4181},{"data":7,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4182},{"data":8,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4183},{"data":9,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4184},{"data":10,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4185},{"data":11,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4186},{"data":12,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4187},{"data":13,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4188},{"data":14,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4189},{"data":15,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4190},{"data":0,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4191},{"data":1,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4192},{"data":2,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4193},{"data":3,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4194},{"data":4,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4195},{"data":5,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4196},{"data":6,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4197},{"data":7,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4198},{"data":8,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4199},{"data":9,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4200},{"data":10,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4201},{"data":11,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4202},{"data":12,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4203},{"data":13,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4204},{"data":14,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4205},{"data":15,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4206},{"data":0,"id":393,"name":"minecraft:kelp","runtimeID":4207},{"data":1,"id":393,"name":"minecraft:kelp","runtimeID":4208},{"data":2,"id":393,"name":"minecraft:kelp","runtimeID":4209},{"data":3,"id":393,"name":"minecraft:kelp","runtimeID":4210},{"data":4,"id":393,"name":"minecraft:kelp","runtimeID":4211},{"data":5,"id":393,"name":"minecraft:kelp","runtimeID":4212},{"data":6,"id":393,"name":"minecraft:kelp","runtimeID":4213},{"data":7,"id":393,"name":"minecraft:kelp","runtimeID":4214},{"data":8,"id":393,"name":"minecraft:kelp","runtimeID":4215},{"data":9,"id":393,"name":"minecraft:kelp","runtimeID":4216},{"data":10,"id":393,"name":"minecraft:kelp","runtimeID":4217},{"data":11,"id":393,"name":"minecraft:kelp","runtimeID":4218},{"data":12,"id":393,"name":"minecraft:kelp","runtimeID":4219},{"data":13,"id":393,"name":"minecraft:kelp","runtimeID":4220},{"data":14,"id":393,"name":"minecraft:kelp","runtimeID":4221},{"data":15,"id":393,"name":"minecraft:kelp","runtimeID":4222},{"data":0,"id":394,"name":"minecraft:dried_kelp_block","runtimeID":4223},{"data":0,"id":395,"name":"minecraft:acacia_button","runtimeID":4224},{"data":1,"id":395,"name":"minecraft:acacia_button","runtimeID":4225},{"data":2,"id":395,"name":"minecraft:acacia_button","runtimeID":4226},{"data":3,"id":395,"name":"minecraft:acacia_button","runtimeID":4227},{"data":4,"id":395,"name":"minecraft:acacia_button","runtimeID":4228},{"data":5,"id":395,"name":"minecraft:acacia_button","runtimeID":4229},{"data":6,"id":395,"name":"minecraft:acacia_button","runtimeID":4230},{"data":7,"id":395,"name":"minecraft:acacia_button","runtimeID":4231},{"data":8,"id":395,"name":"minecraft:acacia_button","runtimeID":4232},{"data":9,"id":395,"name":"minecraft:acacia_button","runtimeID":4233},{"data":10,"id":395,"name":"minecraft:acacia_button","runtimeID":4234},{"data":11,"id":395,"name":"minecraft:acacia_button","runtimeID":4235},{"data":12,"id":395,"name":"minecraft:acacia_button","runtimeID":4236},{"data":13,"id":395,"name":"minecraft:acacia_button","runtimeID":4237},{"data":14,"id":395,"name":"minecraft:acacia_button","runtimeID":4238},{"data":15,"id":395,"name":"minecraft:acacia_button","runtimeID":4239},{"data":0,"id":396,"name":"minecraft:birch_button","runtimeID":4240},{"data":1,"id":396,"name":"minecraft:birch_button","runtimeID":4241},{"data":2,"id":396,"name":"minecraft:birch_button","runtimeID":4242},{"data":3,"id":396,"name":"minecraft:birch_button","runtimeID":4243},{"data":4,"id":396,"name":"minecraft:birch_button","runtimeID":4244},{"data":5,"id":396,"name":"minecraft:birch_button","runtimeID":4245},{"data":6,"id":396,"name":"minecraft:birch_button","runtimeID":4246},{"data":7,"id":396,"name":"minecraft:birch_button","runtimeID":4247},{"data":8,"id":396,"name":"minecraft:birch_button","runtimeID":4248},{"data":9,"id":396,"name":"minecraft:birch_button","runtimeID":4249},{"data":10,"id":396,"name":"minecraft:birch_button","runtimeID":4250},{"data":11,"id":396,"name":"minecraft:birch_button","runtimeID":4251},{"data":12,"id":396,"name":"minecraft:birch_button","runtimeID":4252},{"data":13,"id":396,"name":"minecraft:birch_button","runtimeID":4253},{"data":14,"id":396,"name":"minecraft:birch_button","runtimeID":4254},{"data":15,"id":396,"name":"minecraft:birch_button","runtimeID":4255},{"data":0,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4256},{"data":1,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4257},{"data":2,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4258},{"data":3,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4259},{"data":4,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4260},{"data":5,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4261},{"data":6,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4262},{"data":7,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4263},{"data":8,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4264},{"data":9,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4265},{"data":10,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4266},{"data":11,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4267},{"data":12,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4268},{"data":13,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4269},{"data":14,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4270},{"data":15,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4271},{"data":0,"id":398,"name":"minecraft:jungle_button","runtimeID":4272},{"data":1,"id":398,"name":"minecraft:jungle_button","runtimeID":4273},{"data":2,"id":398,"name":"minecraft:jungle_button","runtimeID":4274},{"data":3,"id":398,"name":"minecraft:jungle_button","runtimeID":4275},{"data":4,"id":398,"name":"minecraft:jungle_button","runtimeID":4276},{"data":5,"id":398,"name":"minecraft:jungle_button","runtimeID":4277},{"data":6,"id":398,"name":"minecraft:jungle_button","runtimeID":4278},{"data":7,"id":398,"name":"minecraft:jungle_button","runtimeID":4279},{"data":8,"id":398,"name":"minecraft:jungle_button","runtimeID":4280},{"data":9,"id":398,"name":"minecraft:jungle_button","runtimeID":4281},{"data":10,"id":398,"name":"minecraft:jungle_button","runtimeID":4282},{"data":11,"id":398,"name":"minecraft:jungle_button","runtimeID":4283},{"data":12,"id":398,"name":"minecraft:jungle_button","runtimeID":4284},{"data":13,"id":398,"name":"minecraft:jungle_button","runtimeID":4285},{"data":14,"id":398,"name":"minecraft:jungle_button","runtimeID":4286},{"data":15,"id":398,"name":"minecraft:jungle_button","runtimeID":4287},{"data":0,"id":399,"name":"minecraft:spruce_button","runtimeID":4288},{"data":1,"id":399,"name":"minecraft:spruce_button","runtimeID":4289},{"data":2,"id":399,"name":"minecraft:spruce_button","runtimeID":4290},{"data":3,"id":399,"name":"minecraft:spruce_button","runtimeID":4291},{"data":4,"id":399,"name":"minecraft:spruce_button","runtimeID":4292},{"data":5,"id":399,"name":"minecraft:spruce_button","runtimeID":4293},{"data":6,"id":399,"name":"minecraft:spruce_button","runtimeID":4294},{"data":7,"id":399,"name":"minecraft:spruce_button","runtimeID":4295},{"data":8,"id":399,"name":"minecraft:spruce_button","runtimeID":4296},{"data":9,"id":399,"name":"minecraft:spruce_button","runtimeID":4297},{"data":10,"id":399,"name":"minecraft:spruce_button","runtimeID":4298},{"data":11,"id":399,"name":"minecraft:spruce_button","runtimeID":4299},{"data":12,"id":399,"name":"minecraft:spruce_button","runtimeID":4300},{"data":13,"id":399,"name":"minecraft:spruce_button","runtimeID":4301},{"data":14,"id":399,"name":"minecraft:spruce_button","runtimeID":4302},{"data":15,"id":399,"name":"minecraft:spruce_button","runtimeID":4303},{"data":0,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4304},{"data":1,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4305},{"data":2,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4306},{"data":3,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4307},{"data":4,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4308},{"data":5,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4309},{"data":6,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4310},{"data":7,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4311},{"data":8,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4312},{"data":9,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4313},{"data":10,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4314},{"data":11,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4315},{"data":12,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4316},{"data":13,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4317},{"data":14,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4318},{"data":15,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4319},{"data":0,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4320},{"data":1,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4321},{"data":2,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4322},{"data":3,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4323},{"data":4,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4324},{"data":5,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4325},{"data":6,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4326},{"data":7,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4327},{"data":8,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4328},{"data":9,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4329},{"data":10,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4330},{"data":11,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4331},{"data":12,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4332},{"data":13,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4333},{"data":14,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4334},{"data":15,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4335},{"data":0,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4336},{"data":1,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4337},{"data":2,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4338},{"data":3,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4339},{"data":4,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4340},{"data":5,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4341},{"data":6,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4342},{"data":7,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4343},{"data":8,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4344},{"data":9,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4345},{"data":10,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4346},{"data":11,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4347},{"data":12,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4348},{"data":13,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4349},{"data":14,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4350},{"data":15,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4351},{"data":0,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4352},{"data":1,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4353},{"data":2,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4354},{"data":3,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4355},{"data":4,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4356},{"data":5,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4357},{"data":6,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4358},{"data":7,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4359},{"data":8,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4360},{"data":9,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4361},{"data":10,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4362},{"data":11,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4363},{"data":12,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4364},{"data":13,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4365},{"data":14,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4366},{"data":15,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4367},{"data":0,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4368},{"data":1,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4369},{"data":2,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4370},{"data":3,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4371},{"data":4,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4372},{"data":5,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4373},{"data":6,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4374},{"data":7,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4375},{"data":8,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4376},{"data":9,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4377},{"data":10,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4378},{"data":11,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4379},{"data":12,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4380},{"data":13,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4381},{"data":14,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4382},{"data":15,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4383},{"data":0,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4384},{"data":1,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4385},{"data":2,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4386},{"data":3,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4387},{"data":4,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4388},{"data":5,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4389},{"data":6,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4390},{"data":7,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4391},{"data":8,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4392},{"data":9,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4393},{"data":10,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4394},{"data":11,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4395},{"data":12,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4396},{"data":13,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4397},{"data":14,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4398},{"data":15,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4399},{"data":0,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4400},{"data":1,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4401},{"data":2,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4402},{"data":3,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4403},{"data":4,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4404},{"data":5,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4405},{"data":6,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4406},{"data":7,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4407},{"data":8,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4408},{"data":9,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4409},{"data":10,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4410},{"data":11,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4411},{"data":12,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4412},{"data":13,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4413},{"data":14,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4414},{"data":15,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4415},{"data":0,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4416},{"data":1,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4417},{"data":2,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4418},{"data":3,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4419},{"data":4,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4420},{"data":5,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4421},{"data":6,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4422},{"data":7,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4423},{"data":8,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4424},{"data":9,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4425},{"data":10,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4426},{"data":11,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4427},{"data":12,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4428},{"data":13,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4429},{"data":14,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4430},{"data":15,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4431},{"data":0,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4432},{"data":1,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4433},{"data":2,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4434},{"data":3,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4435},{"data":4,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4436},{"data":5,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4437},{"data":6,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4438},{"data":7,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4439},{"data":8,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4440},{"data":9,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4441},{"data":10,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4442},{"data":11,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4443},{"data":12,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4444},{"data":13,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4445},{"data":14,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4446},{"data":15,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4447},{"data":0,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4448},{"data":1,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4449},{"data":2,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4450},{"data":3,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4451},{"data":4,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4452},{"data":5,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4453},{"data":6,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4454},{"data":7,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4455},{"data":8,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4456},{"data":9,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4457},{"data":10,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4458},{"data":11,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4459},{"data":12,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4460},{"data":13,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4461},{"data":14,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4462},{"data":15,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4463},{"data":0,"id":410,"name":"minecraft:carved_pumpkin","runtimeID":4464},{"data":1,"id":410,"name":"minecraft:carved_pumpkin","runtimeID":4465},{"data":2,"id":410,"name":"minecraft:carved_pumpkin","runtimeID":4466},{"data":3,"id":410,"name":"minecraft:carved_pumpkin","runtimeID":4467},{"data":0,"id":411,"name":"minecraft:sea_pickle","runtimeID":4468},{"data":1,"id":411,"name":"minecraft:sea_pickle","runtimeID":4469},{"data":2,"id":411,"name":"minecraft:sea_pickle","runtimeID":4470},{"data":3,"id":411,"name":"minecraft:sea_pickle","runtimeID":4471},{"data":4,"id":411,"name":"minecraft:sea_pickle","runtimeID":4472},{"data":5,"id":411,"name":"minecraft:sea_pickle","runtimeID":4473},{"data":6,"id":411,"name":"minecraft:sea_pickle","runtimeID":4474},{"data":7,"id":411,"name":"minecraft:sea_pickle","runtimeID":4475}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_274.json b/src/main/resources/runtimeid_table_274.json deleted file mode 100644 index e4dd08de5..000000000 --- a/src/main/resources/runtimeid_table_274.json +++ /dev/null @@ -1 +0,0 @@ -[{"data":0,"id":0,"name":"minecraft:air","runtimeID":0},{"data":0,"id":1,"name":"minecraft:stone","runtimeID":1},{"data":1,"id":1,"name":"minecraft:stone","runtimeID":2},{"data":2,"id":1,"name":"minecraft:stone","runtimeID":3},{"data":3,"id":1,"name":"minecraft:stone","runtimeID":4},{"data":4,"id":1,"name":"minecraft:stone","runtimeID":5},{"data":5,"id":1,"name":"minecraft:stone","runtimeID":6},{"data":6,"id":1,"name":"minecraft:stone","runtimeID":7},{"data":7,"id":1,"name":"minecraft:stone","runtimeID":8},{"data":0,"id":2,"name":"minecraft:grass","runtimeID":9},{"data":1,"id":2,"name":"minecraft:grass","runtimeID":10},{"data":2,"id":2,"name":"minecraft:grass","runtimeID":11},{"data":3,"id":2,"name":"minecraft:grass","runtimeID":12},{"data":4,"id":2,"name":"minecraft:grass","runtimeID":13},{"data":5,"id":2,"name":"minecraft:grass","runtimeID":14},{"data":6,"id":2,"name":"minecraft:grass","runtimeID":15},{"data":7,"id":2,"name":"minecraft:grass","runtimeID":16},{"data":8,"id":2,"name":"minecraft:grass","runtimeID":17},{"data":9,"id":2,"name":"minecraft:grass","runtimeID":18},{"data":10,"id":2,"name":"minecraft:grass","runtimeID":19},{"data":11,"id":2,"name":"minecraft:grass","runtimeID":20},{"data":12,"id":2,"name":"minecraft:grass","runtimeID":21},{"data":13,"id":2,"name":"minecraft:grass","runtimeID":22},{"data":14,"id":2,"name":"minecraft:grass","runtimeID":23},{"data":15,"id":2,"name":"minecraft:grass","runtimeID":24},{"data":0,"id":3,"name":"minecraft:dirt","runtimeID":25},{"data":1,"id":3,"name":"minecraft:dirt","runtimeID":26},{"data":0,"id":4,"name":"minecraft:cobblestone","runtimeID":27},{"data":0,"id":5,"name":"minecraft:planks","runtimeID":28},{"data":1,"id":5,"name":"minecraft:planks","runtimeID":29},{"data":2,"id":5,"name":"minecraft:planks","runtimeID":30},{"data":3,"id":5,"name":"minecraft:planks","runtimeID":31},{"data":4,"id":5,"name":"minecraft:planks","runtimeID":32},{"data":5,"id":5,"name":"minecraft:planks","runtimeID":33},{"data":6,"id":5,"name":"minecraft:planks","runtimeID":34},{"data":7,"id":5,"name":"minecraft:planks","runtimeID":35},{"data":0,"id":6,"name":"minecraft:sapling","runtimeID":36},{"data":1,"id":6,"name":"minecraft:sapling","runtimeID":37},{"data":2,"id":6,"name":"minecraft:sapling","runtimeID":38},{"data":3,"id":6,"name":"minecraft:sapling","runtimeID":39},{"data":4,"id":6,"name":"minecraft:sapling","runtimeID":40},{"data":5,"id":6,"name":"minecraft:sapling","runtimeID":41},{"data":6,"id":6,"name":"minecraft:sapling","runtimeID":42},{"data":7,"id":6,"name":"minecraft:sapling","runtimeID":43},{"data":8,"id":6,"name":"minecraft:sapling","runtimeID":44},{"data":9,"id":6,"name":"minecraft:sapling","runtimeID":45},{"data":10,"id":6,"name":"minecraft:sapling","runtimeID":46},{"data":11,"id":6,"name":"minecraft:sapling","runtimeID":47},{"data":12,"id":6,"name":"minecraft:sapling","runtimeID":48},{"data":13,"id":6,"name":"minecraft:sapling","runtimeID":49},{"data":14,"id":6,"name":"minecraft:sapling","runtimeID":50},{"data":15,"id":6,"name":"minecraft:sapling","runtimeID":51},{"data":0,"id":7,"name":"minecraft:bedrock","runtimeID":52},{"data":1,"id":7,"name":"minecraft:bedrock","runtimeID":53},{"data":0,"id":8,"name":"minecraft:flowing_water","runtimeID":54},{"data":1,"id":8,"name":"minecraft:flowing_water","runtimeID":55},{"data":2,"id":8,"name":"minecraft:flowing_water","runtimeID":56},{"data":3,"id":8,"name":"minecraft:flowing_water","runtimeID":57},{"data":4,"id":8,"name":"minecraft:flowing_water","runtimeID":58},{"data":5,"id":8,"name":"minecraft:flowing_water","runtimeID":59},{"data":6,"id":8,"name":"minecraft:flowing_water","runtimeID":60},{"data":7,"id":8,"name":"minecraft:flowing_water","runtimeID":61},{"data":8,"id":8,"name":"minecraft:flowing_water","runtimeID":62},{"data":9,"id":8,"name":"minecraft:flowing_water","runtimeID":63},{"data":10,"id":8,"name":"minecraft:flowing_water","runtimeID":64},{"data":11,"id":8,"name":"minecraft:flowing_water","runtimeID":65},{"data":12,"id":8,"name":"minecraft:flowing_water","runtimeID":66},{"data":13,"id":8,"name":"minecraft:flowing_water","runtimeID":67},{"data":14,"id":8,"name":"minecraft:flowing_water","runtimeID":68},{"data":15,"id":8,"name":"minecraft:flowing_water","runtimeID":69},{"data":0,"id":9,"name":"minecraft:water","runtimeID":70},{"data":1,"id":9,"name":"minecraft:water","runtimeID":71},{"data":2,"id":9,"name":"minecraft:water","runtimeID":72},{"data":3,"id":9,"name":"minecraft:water","runtimeID":73},{"data":4,"id":9,"name":"minecraft:water","runtimeID":74},{"data":5,"id":9,"name":"minecraft:water","runtimeID":75},{"data":6,"id":9,"name":"minecraft:water","runtimeID":76},{"data":7,"id":9,"name":"minecraft:water","runtimeID":77},{"data":8,"id":9,"name":"minecraft:water","runtimeID":78},{"data":9,"id":9,"name":"minecraft:water","runtimeID":79},{"data":10,"id":9,"name":"minecraft:water","runtimeID":80},{"data":11,"id":9,"name":"minecraft:water","runtimeID":81},{"data":12,"id":9,"name":"minecraft:water","runtimeID":82},{"data":13,"id":9,"name":"minecraft:water","runtimeID":83},{"data":14,"id":9,"name":"minecraft:water","runtimeID":84},{"data":15,"id":9,"name":"minecraft:water","runtimeID":85},{"data":0,"id":10,"name":"minecraft:flowing_lava","runtimeID":86},{"data":1,"id":10,"name":"minecraft:flowing_lava","runtimeID":87},{"data":2,"id":10,"name":"minecraft:flowing_lava","runtimeID":88},{"data":3,"id":10,"name":"minecraft:flowing_lava","runtimeID":89},{"data":4,"id":10,"name":"minecraft:flowing_lava","runtimeID":90},{"data":5,"id":10,"name":"minecraft:flowing_lava","runtimeID":91},{"data":6,"id":10,"name":"minecraft:flowing_lava","runtimeID":92},{"data":7,"id":10,"name":"minecraft:flowing_lava","runtimeID":93},{"data":8,"id":10,"name":"minecraft:flowing_lava","runtimeID":94},{"data":9,"id":10,"name":"minecraft:flowing_lava","runtimeID":95},{"data":10,"id":10,"name":"minecraft:flowing_lava","runtimeID":96},{"data":11,"id":10,"name":"minecraft:flowing_lava","runtimeID":97},{"data":12,"id":10,"name":"minecraft:flowing_lava","runtimeID":98},{"data":13,"id":10,"name":"minecraft:flowing_lava","runtimeID":99},{"data":14,"id":10,"name":"minecraft:flowing_lava","runtimeID":100},{"data":15,"id":10,"name":"minecraft:flowing_lava","runtimeID":101},{"data":0,"id":11,"name":"minecraft:lava","runtimeID":102},{"data":1,"id":11,"name":"minecraft:lava","runtimeID":103},{"data":2,"id":11,"name":"minecraft:lava","runtimeID":104},{"data":3,"id":11,"name":"minecraft:lava","runtimeID":105},{"data":4,"id":11,"name":"minecraft:lava","runtimeID":106},{"data":5,"id":11,"name":"minecraft:lava","runtimeID":107},{"data":6,"id":11,"name":"minecraft:lava","runtimeID":108},{"data":7,"id":11,"name":"minecraft:lava","runtimeID":109},{"data":8,"id":11,"name":"minecraft:lava","runtimeID":110},{"data":9,"id":11,"name":"minecraft:lava","runtimeID":111},{"data":10,"id":11,"name":"minecraft:lava","runtimeID":112},{"data":11,"id":11,"name":"minecraft:lava","runtimeID":113},{"data":12,"id":11,"name":"minecraft:lava","runtimeID":114},{"data":13,"id":11,"name":"minecraft:lava","runtimeID":115},{"data":14,"id":11,"name":"minecraft:lava","runtimeID":116},{"data":15,"id":11,"name":"minecraft:lava","runtimeID":117},{"data":0,"id":12,"name":"minecraft:sand","runtimeID":118},{"data":1,"id":12,"name":"minecraft:sand","runtimeID":119},{"data":0,"id":13,"name":"minecraft:gravel","runtimeID":120},{"data":0,"id":14,"name":"minecraft:gold_ore","runtimeID":121},{"data":0,"id":15,"name":"minecraft:iron_ore","runtimeID":122},{"data":0,"id":16,"name":"minecraft:coal_ore","runtimeID":123},{"data":0,"id":17,"name":"minecraft:log","runtimeID":124},{"data":1,"id":17,"name":"minecraft:log","runtimeID":125},{"data":2,"id":17,"name":"minecraft:log","runtimeID":126},{"data":3,"id":17,"name":"minecraft:log","runtimeID":127},{"data":4,"id":17,"name":"minecraft:log","runtimeID":128},{"data":5,"id":17,"name":"minecraft:log","runtimeID":129},{"data":6,"id":17,"name":"minecraft:log","runtimeID":130},{"data":7,"id":17,"name":"minecraft:log","runtimeID":131},{"data":8,"id":17,"name":"minecraft:log","runtimeID":132},{"data":9,"id":17,"name":"minecraft:log","runtimeID":133},{"data":10,"id":17,"name":"minecraft:log","runtimeID":134},{"data":11,"id":17,"name":"minecraft:log","runtimeID":135},{"data":12,"id":17,"name":"minecraft:log","runtimeID":136},{"data":13,"id":17,"name":"minecraft:log","runtimeID":137},{"data":14,"id":17,"name":"minecraft:log","runtimeID":138},{"data":15,"id":17,"name":"minecraft:log","runtimeID":139},{"data":0,"id":18,"name":"minecraft:leaves","runtimeID":140},{"data":1,"id":18,"name":"minecraft:leaves","runtimeID":141},{"data":2,"id":18,"name":"minecraft:leaves","runtimeID":142},{"data":3,"id":18,"name":"minecraft:leaves","runtimeID":143},{"data":4,"id":18,"name":"minecraft:leaves","runtimeID":144},{"data":5,"id":18,"name":"minecraft:leaves","runtimeID":145},{"data":6,"id":18,"name":"minecraft:leaves","runtimeID":146},{"data":7,"id":18,"name":"minecraft:leaves","runtimeID":147},{"data":8,"id":18,"name":"minecraft:leaves","runtimeID":148},{"data":9,"id":18,"name":"minecraft:leaves","runtimeID":149},{"data":10,"id":18,"name":"minecraft:leaves","runtimeID":150},{"data":11,"id":18,"name":"minecraft:leaves","runtimeID":151},{"data":12,"id":18,"name":"minecraft:leaves","runtimeID":152},{"data":13,"id":18,"name":"minecraft:leaves","runtimeID":153},{"data":14,"id":18,"name":"minecraft:leaves","runtimeID":154},{"data":15,"id":18,"name":"minecraft:leaves","runtimeID":155},{"data":0,"id":19,"name":"minecraft:sponge","runtimeID":156},{"data":1,"id":19,"name":"minecraft:sponge","runtimeID":157},{"data":0,"id":20,"name":"minecraft:glass","runtimeID":158},{"data":0,"id":21,"name":"minecraft:lapis_ore","runtimeID":159},{"data":0,"id":22,"name":"minecraft:lapis_block","runtimeID":160},{"data":0,"id":23,"name":"minecraft:dispenser","runtimeID":161},{"data":1,"id":23,"name":"minecraft:dispenser","runtimeID":162},{"data":2,"id":23,"name":"minecraft:dispenser","runtimeID":163},{"data":3,"id":23,"name":"minecraft:dispenser","runtimeID":164},{"data":4,"id":23,"name":"minecraft:dispenser","runtimeID":165},{"data":5,"id":23,"name":"minecraft:dispenser","runtimeID":166},{"data":6,"id":23,"name":"minecraft:dispenser","runtimeID":167},{"data":7,"id":23,"name":"minecraft:dispenser","runtimeID":168},{"data":8,"id":23,"name":"minecraft:dispenser","runtimeID":169},{"data":9,"id":23,"name":"minecraft:dispenser","runtimeID":170},{"data":10,"id":23,"name":"minecraft:dispenser","runtimeID":171},{"data":11,"id":23,"name":"minecraft:dispenser","runtimeID":172},{"data":12,"id":23,"name":"minecraft:dispenser","runtimeID":173},{"data":13,"id":23,"name":"minecraft:dispenser","runtimeID":174},{"data":14,"id":23,"name":"minecraft:dispenser","runtimeID":175},{"data":15,"id":23,"name":"minecraft:dispenser","runtimeID":176},{"data":0,"id":24,"name":"minecraft:sandstone","runtimeID":177},{"data":1,"id":24,"name":"minecraft:sandstone","runtimeID":178},{"data":2,"id":24,"name":"minecraft:sandstone","runtimeID":179},{"data":3,"id":24,"name":"minecraft:sandstone","runtimeID":180},{"data":0,"id":25,"name":"minecraft:noteblock","runtimeID":181},{"data":0,"id":26,"name":"minecraft:bed","runtimeID":182},{"data":1,"id":26,"name":"minecraft:bed","runtimeID":183},{"data":2,"id":26,"name":"minecraft:bed","runtimeID":184},{"data":3,"id":26,"name":"minecraft:bed","runtimeID":185},{"data":4,"id":26,"name":"minecraft:bed","runtimeID":186},{"data":5,"id":26,"name":"minecraft:bed","runtimeID":187},{"data":6,"id":26,"name":"minecraft:bed","runtimeID":188},{"data":7,"id":26,"name":"minecraft:bed","runtimeID":189},{"data":8,"id":26,"name":"minecraft:bed","runtimeID":190},{"data":9,"id":26,"name":"minecraft:bed","runtimeID":191},{"data":10,"id":26,"name":"minecraft:bed","runtimeID":192},{"data":11,"id":26,"name":"minecraft:bed","runtimeID":193},{"data":12,"id":26,"name":"minecraft:bed","runtimeID":194},{"data":13,"id":26,"name":"minecraft:bed","runtimeID":195},{"data":14,"id":26,"name":"minecraft:bed","runtimeID":196},{"data":15,"id":26,"name":"minecraft:bed","runtimeID":197},{"data":0,"id":27,"name":"minecraft:golden_rail","runtimeID":198},{"data":1,"id":27,"name":"minecraft:golden_rail","runtimeID":199},{"data":2,"id":27,"name":"minecraft:golden_rail","runtimeID":200},{"data":3,"id":27,"name":"minecraft:golden_rail","runtimeID":201},{"data":4,"id":27,"name":"minecraft:golden_rail","runtimeID":202},{"data":5,"id":27,"name":"minecraft:golden_rail","runtimeID":203},{"data":6,"id":27,"name":"minecraft:golden_rail","runtimeID":204},{"data":7,"id":27,"name":"minecraft:golden_rail","runtimeID":205},{"data":8,"id":27,"name":"minecraft:golden_rail","runtimeID":206},{"data":9,"id":27,"name":"minecraft:golden_rail","runtimeID":207},{"data":10,"id":27,"name":"minecraft:golden_rail","runtimeID":208},{"data":11,"id":27,"name":"minecraft:golden_rail","runtimeID":209},{"data":12,"id":27,"name":"minecraft:golden_rail","runtimeID":210},{"data":13,"id":27,"name":"minecraft:golden_rail","runtimeID":211},{"data":14,"id":27,"name":"minecraft:golden_rail","runtimeID":212},{"data":15,"id":27,"name":"minecraft:golden_rail","runtimeID":213},{"data":0,"id":28,"name":"minecraft:detector_rail","runtimeID":214},{"data":1,"id":28,"name":"minecraft:detector_rail","runtimeID":215},{"data":2,"id":28,"name":"minecraft:detector_rail","runtimeID":216},{"data":3,"id":28,"name":"minecraft:detector_rail","runtimeID":217},{"data":4,"id":28,"name":"minecraft:detector_rail","runtimeID":218},{"data":5,"id":28,"name":"minecraft:detector_rail","runtimeID":219},{"data":6,"id":28,"name":"minecraft:detector_rail","runtimeID":220},{"data":7,"id":28,"name":"minecraft:detector_rail","runtimeID":221},{"data":8,"id":28,"name":"minecraft:detector_rail","runtimeID":222},{"data":9,"id":28,"name":"minecraft:detector_rail","runtimeID":223},{"data":10,"id":28,"name":"minecraft:detector_rail","runtimeID":224},{"data":11,"id":28,"name":"minecraft:detector_rail","runtimeID":225},{"data":12,"id":28,"name":"minecraft:detector_rail","runtimeID":226},{"data":13,"id":28,"name":"minecraft:detector_rail","runtimeID":227},{"data":14,"id":28,"name":"minecraft:detector_rail","runtimeID":228},{"data":15,"id":28,"name":"minecraft:detector_rail","runtimeID":229},{"data":0,"id":29,"name":"minecraft:sticky_piston","runtimeID":230},{"data":1,"id":29,"name":"minecraft:sticky_piston","runtimeID":231},{"data":2,"id":29,"name":"minecraft:sticky_piston","runtimeID":232},{"data":3,"id":29,"name":"minecraft:sticky_piston","runtimeID":233},{"data":4,"id":29,"name":"minecraft:sticky_piston","runtimeID":234},{"data":5,"id":29,"name":"minecraft:sticky_piston","runtimeID":235},{"data":6,"id":29,"name":"minecraft:sticky_piston","runtimeID":236},{"data":7,"id":29,"name":"minecraft:sticky_piston","runtimeID":237},{"data":0,"id":30,"name":"minecraft:web","runtimeID":238},{"data":0,"id":31,"name":"minecraft:tallgrass","runtimeID":239},{"data":1,"id":31,"name":"minecraft:tallgrass","runtimeID":240},{"data":2,"id":31,"name":"minecraft:tallgrass","runtimeID":241},{"data":3,"id":31,"name":"minecraft:tallgrass","runtimeID":242},{"data":0,"id":32,"name":"minecraft:deadbush","runtimeID":243},{"data":0,"id":33,"name":"minecraft:piston","runtimeID":244},{"data":1,"id":33,"name":"minecraft:piston","runtimeID":245},{"data":2,"id":33,"name":"minecraft:piston","runtimeID":246},{"data":3,"id":33,"name":"minecraft:piston","runtimeID":247},{"data":4,"id":33,"name":"minecraft:piston","runtimeID":248},{"data":5,"id":33,"name":"minecraft:piston","runtimeID":249},{"data":6,"id":33,"name":"minecraft:piston","runtimeID":250},{"data":7,"id":33,"name":"minecraft:piston","runtimeID":251},{"data":0,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":252},{"data":1,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":253},{"data":2,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":254},{"data":3,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":255},{"data":4,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":256},{"data":5,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":257},{"data":6,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":258},{"data":7,"id":34,"name":"minecraft:pistonArmCollision","runtimeID":259},{"data":0,"id":35,"name":"minecraft:wool","runtimeID":260},{"data":1,"id":35,"name":"minecraft:wool","runtimeID":261},{"data":2,"id":35,"name":"minecraft:wool","runtimeID":262},{"data":3,"id":35,"name":"minecraft:wool","runtimeID":263},{"data":4,"id":35,"name":"minecraft:wool","runtimeID":264},{"data":5,"id":35,"name":"minecraft:wool","runtimeID":265},{"data":6,"id":35,"name":"minecraft:wool","runtimeID":266},{"data":7,"id":35,"name":"minecraft:wool","runtimeID":267},{"data":8,"id":35,"name":"minecraft:wool","runtimeID":268},{"data":9,"id":35,"name":"minecraft:wool","runtimeID":269},{"data":10,"id":35,"name":"minecraft:wool","runtimeID":270},{"data":11,"id":35,"name":"minecraft:wool","runtimeID":271},{"data":12,"id":35,"name":"minecraft:wool","runtimeID":272},{"data":13,"id":35,"name":"minecraft:wool","runtimeID":273},{"data":14,"id":35,"name":"minecraft:wool","runtimeID":274},{"data":15,"id":35,"name":"minecraft:wool","runtimeID":275},{"data":0,"id":36,"name":"minecraft:element_0","runtimeID":276},{"data":1,"id":36,"name":"minecraft:element_0","runtimeID":277},{"data":2,"id":36,"name":"minecraft:element_0","runtimeID":278},{"data":3,"id":36,"name":"minecraft:element_0","runtimeID":279},{"data":4,"id":36,"name":"minecraft:element_0","runtimeID":280},{"data":5,"id":36,"name":"minecraft:element_0","runtimeID":281},{"data":6,"id":36,"name":"minecraft:element_0","runtimeID":282},{"data":7,"id":36,"name":"minecraft:element_0","runtimeID":283},{"data":8,"id":36,"name":"minecraft:element_0","runtimeID":284},{"data":9,"id":36,"name":"minecraft:element_0","runtimeID":285},{"data":10,"id":36,"name":"minecraft:element_0","runtimeID":286},{"data":11,"id":36,"name":"minecraft:element_0","runtimeID":287},{"data":12,"id":36,"name":"minecraft:element_0","runtimeID":288},{"data":13,"id":36,"name":"minecraft:element_0","runtimeID":289},{"data":14,"id":36,"name":"minecraft:element_0","runtimeID":290},{"data":15,"id":36,"name":"minecraft:element_0","runtimeID":291},{"data":0,"id":37,"name":"minecraft:yellow_flower","runtimeID":292},{"data":1,"id":37,"name":"minecraft:yellow_flower","runtimeID":293},{"data":2,"id":37,"name":"minecraft:yellow_flower","runtimeID":294},{"data":3,"id":37,"name":"minecraft:yellow_flower","runtimeID":295},{"data":4,"id":37,"name":"minecraft:yellow_flower","runtimeID":296},{"data":5,"id":37,"name":"minecraft:yellow_flower","runtimeID":297},{"data":6,"id":37,"name":"minecraft:yellow_flower","runtimeID":298},{"data":7,"id":37,"name":"minecraft:yellow_flower","runtimeID":299},{"data":8,"id":37,"name":"minecraft:yellow_flower","runtimeID":300},{"data":9,"id":37,"name":"minecraft:yellow_flower","runtimeID":301},{"data":10,"id":37,"name":"minecraft:yellow_flower","runtimeID":302},{"data":11,"id":37,"name":"minecraft:yellow_flower","runtimeID":303},{"data":12,"id":37,"name":"minecraft:yellow_flower","runtimeID":304},{"data":13,"id":37,"name":"minecraft:yellow_flower","runtimeID":305},{"data":14,"id":37,"name":"minecraft:yellow_flower","runtimeID":306},{"data":15,"id":37,"name":"minecraft:yellow_flower","runtimeID":307},{"data":0,"id":38,"name":"minecraft:red_flower","runtimeID":308},{"data":1,"id":38,"name":"minecraft:red_flower","runtimeID":309},{"data":2,"id":38,"name":"minecraft:red_flower","runtimeID":310},{"data":3,"id":38,"name":"minecraft:red_flower","runtimeID":311},{"data":4,"id":38,"name":"minecraft:red_flower","runtimeID":312},{"data":5,"id":38,"name":"minecraft:red_flower","runtimeID":313},{"data":6,"id":38,"name":"minecraft:red_flower","runtimeID":314},{"data":7,"id":38,"name":"minecraft:red_flower","runtimeID":315},{"data":8,"id":38,"name":"minecraft:red_flower","runtimeID":316},{"data":9,"id":38,"name":"minecraft:red_flower","runtimeID":317},{"data":10,"id":38,"name":"minecraft:red_flower","runtimeID":318},{"data":11,"id":38,"name":"minecraft:red_flower","runtimeID":319},{"data":12,"id":38,"name":"minecraft:red_flower","runtimeID":320},{"data":13,"id":38,"name":"minecraft:red_flower","runtimeID":321},{"data":14,"id":38,"name":"minecraft:red_flower","runtimeID":322},{"data":15,"id":38,"name":"minecraft:red_flower","runtimeID":323},{"data":0,"id":39,"name":"minecraft:brown_mushroom","runtimeID":324},{"data":0,"id":40,"name":"minecraft:red_mushroom","runtimeID":325},{"data":0,"id":41,"name":"minecraft:gold_block","runtimeID":326},{"data":0,"id":42,"name":"minecraft:iron_block","runtimeID":327},{"data":0,"id":43,"name":"minecraft:double_stone_slab","runtimeID":328},{"data":1,"id":43,"name":"minecraft:double_stone_slab","runtimeID":329},{"data":2,"id":43,"name":"minecraft:double_stone_slab","runtimeID":330},{"data":3,"id":43,"name":"minecraft:double_stone_slab","runtimeID":331},{"data":4,"id":43,"name":"minecraft:double_stone_slab","runtimeID":332},{"data":5,"id":43,"name":"minecraft:double_stone_slab","runtimeID":333},{"data":6,"id":43,"name":"minecraft:double_stone_slab","runtimeID":334},{"data":7,"id":43,"name":"minecraft:double_stone_slab","runtimeID":335},{"data":8,"id":43,"name":"minecraft:double_stone_slab","runtimeID":336},{"data":9,"id":43,"name":"minecraft:double_stone_slab","runtimeID":337},{"data":10,"id":43,"name":"minecraft:double_stone_slab","runtimeID":338},{"data":11,"id":43,"name":"minecraft:double_stone_slab","runtimeID":339},{"data":12,"id":43,"name":"minecraft:double_stone_slab","runtimeID":340},{"data":13,"id":43,"name":"minecraft:double_stone_slab","runtimeID":341},{"data":14,"id":43,"name":"minecraft:double_stone_slab","runtimeID":342},{"data":15,"id":43,"name":"minecraft:double_stone_slab","runtimeID":343},{"data":0,"id":44,"name":"minecraft:stone_slab","runtimeID":344},{"data":1,"id":44,"name":"minecraft:stone_slab","runtimeID":345},{"data":2,"id":44,"name":"minecraft:stone_slab","runtimeID":346},{"data":3,"id":44,"name":"minecraft:stone_slab","runtimeID":347},{"data":4,"id":44,"name":"minecraft:stone_slab","runtimeID":348},{"data":5,"id":44,"name":"minecraft:stone_slab","runtimeID":349},{"data":6,"id":44,"name":"minecraft:stone_slab","runtimeID":350},{"data":7,"id":44,"name":"minecraft:stone_slab","runtimeID":351},{"data":8,"id":44,"name":"minecraft:stone_slab","runtimeID":352},{"data":9,"id":44,"name":"minecraft:stone_slab","runtimeID":353},{"data":10,"id":44,"name":"minecraft:stone_slab","runtimeID":354},{"data":11,"id":44,"name":"minecraft:stone_slab","runtimeID":355},{"data":12,"id":44,"name":"minecraft:stone_slab","runtimeID":356},{"data":13,"id":44,"name":"minecraft:stone_slab","runtimeID":357},{"data":14,"id":44,"name":"minecraft:stone_slab","runtimeID":358},{"data":15,"id":44,"name":"minecraft:stone_slab","runtimeID":359},{"data":0,"id":45,"name":"minecraft:brick_block","runtimeID":360},{"data":0,"id":46,"name":"minecraft:tnt","runtimeID":361},{"data":1,"id":46,"name":"minecraft:tnt","runtimeID":362},{"data":2,"id":46,"name":"minecraft:tnt","runtimeID":363},{"data":3,"id":46,"name":"minecraft:tnt","runtimeID":364},{"data":0,"id":47,"name":"minecraft:bookshelf","runtimeID":365},{"data":0,"id":48,"name":"minecraft:mossy_cobblestone","runtimeID":366},{"data":0,"id":49,"name":"minecraft:obsidian","runtimeID":367},{"data":0,"id":50,"name":"minecraft:torch","runtimeID":368},{"data":1,"id":50,"name":"minecraft:torch","runtimeID":369},{"data":2,"id":50,"name":"minecraft:torch","runtimeID":370},{"data":3,"id":50,"name":"minecraft:torch","runtimeID":371},{"data":4,"id":50,"name":"minecraft:torch","runtimeID":372},{"data":5,"id":50,"name":"minecraft:torch","runtimeID":373},{"data":6,"id":50,"name":"minecraft:torch","runtimeID":374},{"data":7,"id":50,"name":"minecraft:torch","runtimeID":375},{"data":0,"id":51,"name":"minecraft:fire","runtimeID":376},{"data":1,"id":51,"name":"minecraft:fire","runtimeID":377},{"data":2,"id":51,"name":"minecraft:fire","runtimeID":378},{"data":3,"id":51,"name":"minecraft:fire","runtimeID":379},{"data":4,"id":51,"name":"minecraft:fire","runtimeID":380},{"data":5,"id":51,"name":"minecraft:fire","runtimeID":381},{"data":6,"id":51,"name":"minecraft:fire","runtimeID":382},{"data":7,"id":51,"name":"minecraft:fire","runtimeID":383},{"data":8,"id":51,"name":"minecraft:fire","runtimeID":384},{"data":9,"id":51,"name":"minecraft:fire","runtimeID":385},{"data":10,"id":51,"name":"minecraft:fire","runtimeID":386},{"data":11,"id":51,"name":"minecraft:fire","runtimeID":387},{"data":12,"id":51,"name":"minecraft:fire","runtimeID":388},{"data":13,"id":51,"name":"minecraft:fire","runtimeID":389},{"data":14,"id":51,"name":"minecraft:fire","runtimeID":390},{"data":15,"id":51,"name":"minecraft:fire","runtimeID":391},{"data":0,"id":52,"name":"minecraft:mob_spawner","runtimeID":392},{"data":0,"id":53,"name":"minecraft:oak_stairs","runtimeID":393},{"data":1,"id":53,"name":"minecraft:oak_stairs","runtimeID":394},{"data":2,"id":53,"name":"minecraft:oak_stairs","runtimeID":395},{"data":3,"id":53,"name":"minecraft:oak_stairs","runtimeID":396},{"data":4,"id":53,"name":"minecraft:oak_stairs","runtimeID":397},{"data":5,"id":53,"name":"minecraft:oak_stairs","runtimeID":398},{"data":6,"id":53,"name":"minecraft:oak_stairs","runtimeID":399},{"data":7,"id":53,"name":"minecraft:oak_stairs","runtimeID":400},{"data":0,"id":54,"name":"minecraft:chest","runtimeID":401},{"data":1,"id":54,"name":"minecraft:chest","runtimeID":402},{"data":2,"id":54,"name":"minecraft:chest","runtimeID":403},{"data":3,"id":54,"name":"minecraft:chest","runtimeID":404},{"data":4,"id":54,"name":"minecraft:chest","runtimeID":405},{"data":5,"id":54,"name":"minecraft:chest","runtimeID":406},{"data":6,"id":54,"name":"minecraft:chest","runtimeID":407},{"data":7,"id":54,"name":"minecraft:chest","runtimeID":408},{"data":0,"id":55,"name":"minecraft:redstone_wire","runtimeID":409},{"data":1,"id":55,"name":"minecraft:redstone_wire","runtimeID":410},{"data":2,"id":55,"name":"minecraft:redstone_wire","runtimeID":411},{"data":3,"id":55,"name":"minecraft:redstone_wire","runtimeID":412},{"data":4,"id":55,"name":"minecraft:redstone_wire","runtimeID":413},{"data":5,"id":55,"name":"minecraft:redstone_wire","runtimeID":414},{"data":6,"id":55,"name":"minecraft:redstone_wire","runtimeID":415},{"data":7,"id":55,"name":"minecraft:redstone_wire","runtimeID":416},{"data":8,"id":55,"name":"minecraft:redstone_wire","runtimeID":417},{"data":9,"id":55,"name":"minecraft:redstone_wire","runtimeID":418},{"data":10,"id":55,"name":"minecraft:redstone_wire","runtimeID":419},{"data":11,"id":55,"name":"minecraft:redstone_wire","runtimeID":420},{"data":12,"id":55,"name":"minecraft:redstone_wire","runtimeID":421},{"data":13,"id":55,"name":"minecraft:redstone_wire","runtimeID":422},{"data":14,"id":55,"name":"minecraft:redstone_wire","runtimeID":423},{"data":15,"id":55,"name":"minecraft:redstone_wire","runtimeID":424},{"data":0,"id":56,"name":"minecraft:diamond_ore","runtimeID":425},{"data":0,"id":57,"name":"minecraft:diamond_block","runtimeID":426},{"data":0,"id":58,"name":"minecraft:crafting_table","runtimeID":427},{"data":0,"id":59,"name":"minecraft:wheat","runtimeID":428},{"data":1,"id":59,"name":"minecraft:wheat","runtimeID":429},{"data":2,"id":59,"name":"minecraft:wheat","runtimeID":430},{"data":3,"id":59,"name":"minecraft:wheat","runtimeID":431},{"data":4,"id":59,"name":"minecraft:wheat","runtimeID":432},{"data":5,"id":59,"name":"minecraft:wheat","runtimeID":433},{"data":6,"id":59,"name":"minecraft:wheat","runtimeID":434},{"data":7,"id":59,"name":"minecraft:wheat","runtimeID":435},{"data":0,"id":60,"name":"minecraft:farmland","runtimeID":436},{"data":1,"id":60,"name":"minecraft:farmland","runtimeID":437},{"data":2,"id":60,"name":"minecraft:farmland","runtimeID":438},{"data":3,"id":60,"name":"minecraft:farmland","runtimeID":439},{"data":4,"id":60,"name":"minecraft:farmland","runtimeID":440},{"data":5,"id":60,"name":"minecraft:farmland","runtimeID":441},{"data":6,"id":60,"name":"minecraft:farmland","runtimeID":442},{"data":7,"id":60,"name":"minecraft:farmland","runtimeID":443},{"data":0,"id":61,"name":"minecraft:furnace","runtimeID":444},{"data":1,"id":61,"name":"minecraft:furnace","runtimeID":445},{"data":2,"id":61,"name":"minecraft:furnace","runtimeID":446},{"data":3,"id":61,"name":"minecraft:furnace","runtimeID":447},{"data":4,"id":61,"name":"minecraft:furnace","runtimeID":448},{"data":5,"id":61,"name":"minecraft:furnace","runtimeID":449},{"data":6,"id":61,"name":"minecraft:furnace","runtimeID":450},{"data":7,"id":61,"name":"minecraft:furnace","runtimeID":451},{"data":0,"id":62,"name":"minecraft:lit_furnace","runtimeID":452},{"data":1,"id":62,"name":"minecraft:lit_furnace","runtimeID":453},{"data":2,"id":62,"name":"minecraft:lit_furnace","runtimeID":454},{"data":3,"id":62,"name":"minecraft:lit_furnace","runtimeID":455},{"data":4,"id":62,"name":"minecraft:lit_furnace","runtimeID":456},{"data":5,"id":62,"name":"minecraft:lit_furnace","runtimeID":457},{"data":6,"id":62,"name":"minecraft:lit_furnace","runtimeID":458},{"data":7,"id":62,"name":"minecraft:lit_furnace","runtimeID":459},{"data":0,"id":63,"name":"minecraft:standing_sign","runtimeID":460},{"data":1,"id":63,"name":"minecraft:standing_sign","runtimeID":461},{"data":2,"id":63,"name":"minecraft:standing_sign","runtimeID":462},{"data":3,"id":63,"name":"minecraft:standing_sign","runtimeID":463},{"data":4,"id":63,"name":"minecraft:standing_sign","runtimeID":464},{"data":5,"id":63,"name":"minecraft:standing_sign","runtimeID":465},{"data":6,"id":63,"name":"minecraft:standing_sign","runtimeID":466},{"data":7,"id":63,"name":"minecraft:standing_sign","runtimeID":467},{"data":8,"id":63,"name":"minecraft:standing_sign","runtimeID":468},{"data":9,"id":63,"name":"minecraft:standing_sign","runtimeID":469},{"data":10,"id":63,"name":"minecraft:standing_sign","runtimeID":470},{"data":11,"id":63,"name":"minecraft:standing_sign","runtimeID":471},{"data":12,"id":63,"name":"minecraft:standing_sign","runtimeID":472},{"data":13,"id":63,"name":"minecraft:standing_sign","runtimeID":473},{"data":14,"id":63,"name":"minecraft:standing_sign","runtimeID":474},{"data":15,"id":63,"name":"minecraft:standing_sign","runtimeID":475},{"data":0,"id":64,"name":"minecraft:wooden_door","runtimeID":476},{"data":1,"id":64,"name":"minecraft:wooden_door","runtimeID":477},{"data":2,"id":64,"name":"minecraft:wooden_door","runtimeID":478},{"data":3,"id":64,"name":"minecraft:wooden_door","runtimeID":479},{"data":4,"id":64,"name":"minecraft:wooden_door","runtimeID":480},{"data":5,"id":64,"name":"minecraft:wooden_door","runtimeID":481},{"data":6,"id":64,"name":"minecraft:wooden_door","runtimeID":482},{"data":7,"id":64,"name":"minecraft:wooden_door","runtimeID":483},{"data":8,"id":64,"name":"minecraft:wooden_door","runtimeID":484},{"data":9,"id":64,"name":"minecraft:wooden_door","runtimeID":485},{"data":10,"id":64,"name":"minecraft:wooden_door","runtimeID":486},{"data":11,"id":64,"name":"minecraft:wooden_door","runtimeID":487},{"data":12,"id":64,"name":"minecraft:wooden_door","runtimeID":488},{"data":13,"id":64,"name":"minecraft:wooden_door","runtimeID":489},{"data":14,"id":64,"name":"minecraft:wooden_door","runtimeID":490},{"data":15,"id":64,"name":"minecraft:wooden_door","runtimeID":491},{"data":0,"id":65,"name":"minecraft:ladder","runtimeID":492},{"data":1,"id":65,"name":"minecraft:ladder","runtimeID":493},{"data":2,"id":65,"name":"minecraft:ladder","runtimeID":494},{"data":3,"id":65,"name":"minecraft:ladder","runtimeID":495},{"data":4,"id":65,"name":"minecraft:ladder","runtimeID":496},{"data":5,"id":65,"name":"minecraft:ladder","runtimeID":497},{"data":6,"id":65,"name":"minecraft:ladder","runtimeID":498},{"data":7,"id":65,"name":"minecraft:ladder","runtimeID":499},{"data":0,"id":66,"name":"minecraft:rail","runtimeID":500},{"data":1,"id":66,"name":"minecraft:rail","runtimeID":501},{"data":2,"id":66,"name":"minecraft:rail","runtimeID":502},{"data":3,"id":66,"name":"minecraft:rail","runtimeID":503},{"data":4,"id":66,"name":"minecraft:rail","runtimeID":504},{"data":5,"id":66,"name":"minecraft:rail","runtimeID":505},{"data":6,"id":66,"name":"minecraft:rail","runtimeID":506},{"data":7,"id":66,"name":"minecraft:rail","runtimeID":507},{"data":8,"id":66,"name":"minecraft:rail","runtimeID":508},{"data":9,"id":66,"name":"minecraft:rail","runtimeID":509},{"data":10,"id":66,"name":"minecraft:rail","runtimeID":510},{"data":11,"id":66,"name":"minecraft:rail","runtimeID":511},{"data":12,"id":66,"name":"minecraft:rail","runtimeID":512},{"data":13,"id":66,"name":"minecraft:rail","runtimeID":513},{"data":14,"id":66,"name":"minecraft:rail","runtimeID":514},{"data":15,"id":66,"name":"minecraft:rail","runtimeID":515},{"data":0,"id":67,"name":"minecraft:stone_stairs","runtimeID":516},{"data":1,"id":67,"name":"minecraft:stone_stairs","runtimeID":517},{"data":2,"id":67,"name":"minecraft:stone_stairs","runtimeID":518},{"data":3,"id":67,"name":"minecraft:stone_stairs","runtimeID":519},{"data":4,"id":67,"name":"minecraft:stone_stairs","runtimeID":520},{"data":5,"id":67,"name":"minecraft:stone_stairs","runtimeID":521},{"data":6,"id":67,"name":"minecraft:stone_stairs","runtimeID":522},{"data":7,"id":67,"name":"minecraft:stone_stairs","runtimeID":523},{"data":0,"id":68,"name":"minecraft:wall_sign","runtimeID":524},{"data":1,"id":68,"name":"minecraft:wall_sign","runtimeID":525},{"data":2,"id":68,"name":"minecraft:wall_sign","runtimeID":526},{"data":3,"id":68,"name":"minecraft:wall_sign","runtimeID":527},{"data":4,"id":68,"name":"minecraft:wall_sign","runtimeID":528},{"data":5,"id":68,"name":"minecraft:wall_sign","runtimeID":529},{"data":6,"id":68,"name":"minecraft:wall_sign","runtimeID":530},{"data":7,"id":68,"name":"minecraft:wall_sign","runtimeID":531},{"data":8,"id":68,"name":"minecraft:wall_sign","runtimeID":532},{"data":9,"id":68,"name":"minecraft:wall_sign","runtimeID":533},{"data":10,"id":68,"name":"minecraft:wall_sign","runtimeID":534},{"data":11,"id":68,"name":"minecraft:wall_sign","runtimeID":535},{"data":12,"id":68,"name":"minecraft:wall_sign","runtimeID":536},{"data":13,"id":68,"name":"minecraft:wall_sign","runtimeID":537},{"data":14,"id":68,"name":"minecraft:wall_sign","runtimeID":538},{"data":15,"id":68,"name":"minecraft:wall_sign","runtimeID":539},{"data":0,"id":69,"name":"minecraft:lever","runtimeID":540},{"data":1,"id":69,"name":"minecraft:lever","runtimeID":541},{"data":2,"id":69,"name":"minecraft:lever","runtimeID":542},{"data":3,"id":69,"name":"minecraft:lever","runtimeID":543},{"data":4,"id":69,"name":"minecraft:lever","runtimeID":544},{"data":5,"id":69,"name":"minecraft:lever","runtimeID":545},{"data":6,"id":69,"name":"minecraft:lever","runtimeID":546},{"data":7,"id":69,"name":"minecraft:lever","runtimeID":547},{"data":8,"id":69,"name":"minecraft:lever","runtimeID":548},{"data":9,"id":69,"name":"minecraft:lever","runtimeID":549},{"data":10,"id":69,"name":"minecraft:lever","runtimeID":550},{"data":11,"id":69,"name":"minecraft:lever","runtimeID":551},{"data":12,"id":69,"name":"minecraft:lever","runtimeID":552},{"data":13,"id":69,"name":"minecraft:lever","runtimeID":553},{"data":14,"id":69,"name":"minecraft:lever","runtimeID":554},{"data":15,"id":69,"name":"minecraft:lever","runtimeID":555},{"data":0,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":556},{"data":1,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":557},{"data":2,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":558},{"data":3,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":559},{"data":4,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":560},{"data":5,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":561},{"data":6,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":562},{"data":7,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":563},{"data":8,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":564},{"data":9,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":565},{"data":10,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":566},{"data":11,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":567},{"data":12,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":568},{"data":13,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":569},{"data":14,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":570},{"data":15,"id":70,"name":"minecraft:stone_pressure_plate","runtimeID":571},{"data":0,"id":71,"name":"minecraft:iron_door","runtimeID":572},{"data":1,"id":71,"name":"minecraft:iron_door","runtimeID":573},{"data":2,"id":71,"name":"minecraft:iron_door","runtimeID":574},{"data":3,"id":71,"name":"minecraft:iron_door","runtimeID":575},{"data":4,"id":71,"name":"minecraft:iron_door","runtimeID":576},{"data":5,"id":71,"name":"minecraft:iron_door","runtimeID":577},{"data":6,"id":71,"name":"minecraft:iron_door","runtimeID":578},{"data":7,"id":71,"name":"minecraft:iron_door","runtimeID":579},{"data":8,"id":71,"name":"minecraft:iron_door","runtimeID":580},{"data":9,"id":71,"name":"minecraft:iron_door","runtimeID":581},{"data":10,"id":71,"name":"minecraft:iron_door","runtimeID":582},{"data":11,"id":71,"name":"minecraft:iron_door","runtimeID":583},{"data":12,"id":71,"name":"minecraft:iron_door","runtimeID":584},{"data":13,"id":71,"name":"minecraft:iron_door","runtimeID":585},{"data":14,"id":71,"name":"minecraft:iron_door","runtimeID":586},{"data":15,"id":71,"name":"minecraft:iron_door","runtimeID":587},{"data":0,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":588},{"data":1,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":589},{"data":2,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":590},{"data":3,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":591},{"data":4,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":592},{"data":5,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":593},{"data":6,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":594},{"data":7,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":595},{"data":8,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":596},{"data":9,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":597},{"data":10,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":598},{"data":11,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":599},{"data":12,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":600},{"data":13,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":601},{"data":14,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":602},{"data":15,"id":72,"name":"minecraft:wooden_pressure_plate","runtimeID":603},{"data":0,"id":73,"name":"minecraft:redstone_ore","runtimeID":604},{"data":0,"id":74,"name":"minecraft:lit_redstone_ore","runtimeID":605},{"data":0,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":606},{"data":1,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":607},{"data":2,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":608},{"data":3,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":609},{"data":4,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":610},{"data":5,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":611},{"data":6,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":612},{"data":7,"id":75,"name":"minecraft:unlit_redstone_torch","runtimeID":613},{"data":0,"id":76,"name":"minecraft:redstone_torch","runtimeID":614},{"data":1,"id":76,"name":"minecraft:redstone_torch","runtimeID":615},{"data":2,"id":76,"name":"minecraft:redstone_torch","runtimeID":616},{"data":3,"id":76,"name":"minecraft:redstone_torch","runtimeID":617},{"data":4,"id":76,"name":"minecraft:redstone_torch","runtimeID":618},{"data":5,"id":76,"name":"minecraft:redstone_torch","runtimeID":619},{"data":6,"id":76,"name":"minecraft:redstone_torch","runtimeID":620},{"data":7,"id":76,"name":"minecraft:redstone_torch","runtimeID":621},{"data":0,"id":77,"name":"minecraft:stone_button","runtimeID":622},{"data":1,"id":77,"name":"minecraft:stone_button","runtimeID":623},{"data":2,"id":77,"name":"minecraft:stone_button","runtimeID":624},{"data":3,"id":77,"name":"minecraft:stone_button","runtimeID":625},{"data":4,"id":77,"name":"minecraft:stone_button","runtimeID":626},{"data":5,"id":77,"name":"minecraft:stone_button","runtimeID":627},{"data":6,"id":77,"name":"minecraft:stone_button","runtimeID":628},{"data":7,"id":77,"name":"minecraft:stone_button","runtimeID":629},{"data":8,"id":77,"name":"minecraft:stone_button","runtimeID":630},{"data":9,"id":77,"name":"minecraft:stone_button","runtimeID":631},{"data":10,"id":77,"name":"minecraft:stone_button","runtimeID":632},{"data":11,"id":77,"name":"minecraft:stone_button","runtimeID":633},{"data":12,"id":77,"name":"minecraft:stone_button","runtimeID":634},{"data":13,"id":77,"name":"minecraft:stone_button","runtimeID":635},{"data":14,"id":77,"name":"minecraft:stone_button","runtimeID":636},{"data":15,"id":77,"name":"minecraft:stone_button","runtimeID":637},{"data":0,"id":78,"name":"minecraft:snow_layer","runtimeID":638},{"data":1,"id":78,"name":"minecraft:snow_layer","runtimeID":639},{"data":2,"id":78,"name":"minecraft:snow_layer","runtimeID":640},{"data":3,"id":78,"name":"minecraft:snow_layer","runtimeID":641},{"data":4,"id":78,"name":"minecraft:snow_layer","runtimeID":642},{"data":5,"id":78,"name":"minecraft:snow_layer","runtimeID":643},{"data":6,"id":78,"name":"minecraft:snow_layer","runtimeID":644},{"data":7,"id":78,"name":"minecraft:snow_layer","runtimeID":645},{"data":8,"id":78,"name":"minecraft:snow_layer","runtimeID":646},{"data":9,"id":78,"name":"minecraft:snow_layer","runtimeID":647},{"data":10,"id":78,"name":"minecraft:snow_layer","runtimeID":648},{"data":11,"id":78,"name":"minecraft:snow_layer","runtimeID":649},{"data":12,"id":78,"name":"minecraft:snow_layer","runtimeID":650},{"data":13,"id":78,"name":"minecraft:snow_layer","runtimeID":651},{"data":14,"id":78,"name":"minecraft:snow_layer","runtimeID":652},{"data":15,"id":78,"name":"minecraft:snow_layer","runtimeID":653},{"data":0,"id":79,"name":"minecraft:ice","runtimeID":654},{"data":0,"id":80,"name":"minecraft:snow","runtimeID":655},{"data":0,"id":81,"name":"minecraft:cactus","runtimeID":656},{"data":1,"id":81,"name":"minecraft:cactus","runtimeID":657},{"data":2,"id":81,"name":"minecraft:cactus","runtimeID":658},{"data":3,"id":81,"name":"minecraft:cactus","runtimeID":659},{"data":4,"id":81,"name":"minecraft:cactus","runtimeID":660},{"data":5,"id":81,"name":"minecraft:cactus","runtimeID":661},{"data":6,"id":81,"name":"minecraft:cactus","runtimeID":662},{"data":7,"id":81,"name":"minecraft:cactus","runtimeID":663},{"data":8,"id":81,"name":"minecraft:cactus","runtimeID":664},{"data":9,"id":81,"name":"minecraft:cactus","runtimeID":665},{"data":10,"id":81,"name":"minecraft:cactus","runtimeID":666},{"data":11,"id":81,"name":"minecraft:cactus","runtimeID":667},{"data":12,"id":81,"name":"minecraft:cactus","runtimeID":668},{"data":13,"id":81,"name":"minecraft:cactus","runtimeID":669},{"data":14,"id":81,"name":"minecraft:cactus","runtimeID":670},{"data":15,"id":81,"name":"minecraft:cactus","runtimeID":671},{"data":0,"id":82,"name":"minecraft:clay","runtimeID":672},{"data":0,"id":83,"name":"minecraft:reeds","runtimeID":673},{"data":1,"id":83,"name":"minecraft:reeds","runtimeID":674},{"data":2,"id":83,"name":"minecraft:reeds","runtimeID":675},{"data":3,"id":83,"name":"minecraft:reeds","runtimeID":676},{"data":4,"id":83,"name":"minecraft:reeds","runtimeID":677},{"data":5,"id":83,"name":"minecraft:reeds","runtimeID":678},{"data":6,"id":83,"name":"minecraft:reeds","runtimeID":679},{"data":7,"id":83,"name":"minecraft:reeds","runtimeID":680},{"data":8,"id":83,"name":"minecraft:reeds","runtimeID":681},{"data":9,"id":83,"name":"minecraft:reeds","runtimeID":682},{"data":10,"id":83,"name":"minecraft:reeds","runtimeID":683},{"data":11,"id":83,"name":"minecraft:reeds","runtimeID":684},{"data":12,"id":83,"name":"minecraft:reeds","runtimeID":685},{"data":13,"id":83,"name":"minecraft:reeds","runtimeID":686},{"data":14,"id":83,"name":"minecraft:reeds","runtimeID":687},{"data":15,"id":83,"name":"minecraft:reeds","runtimeID":688},{"data":0,"id":84,"name":"minecraft:jukebox","runtimeID":689},{"data":0,"id":85,"name":"minecraft:fence","runtimeID":690},{"data":1,"id":85,"name":"minecraft:fence","runtimeID":691},{"data":2,"id":85,"name":"minecraft:fence","runtimeID":692},{"data":3,"id":85,"name":"minecraft:fence","runtimeID":693},{"data":4,"id":85,"name":"minecraft:fence","runtimeID":694},{"data":5,"id":85,"name":"minecraft:fence","runtimeID":695},{"data":6,"id":85,"name":"minecraft:fence","runtimeID":696},{"data":7,"id":85,"name":"minecraft:fence","runtimeID":697},{"data":0,"id":86,"name":"minecraft:pumpkin","runtimeID":698},{"data":1,"id":86,"name":"minecraft:pumpkin","runtimeID":699},{"data":2,"id":86,"name":"minecraft:pumpkin","runtimeID":700},{"data":3,"id":86,"name":"minecraft:pumpkin","runtimeID":701},{"data":0,"id":87,"name":"minecraft:netherrack","runtimeID":702},{"data":0,"id":88,"name":"minecraft:soul_sand","runtimeID":703},{"data":0,"id":89,"name":"minecraft:glowstone","runtimeID":704},{"data":0,"id":90,"name":"minecraft:portal","runtimeID":705},{"data":1,"id":90,"name":"minecraft:portal","runtimeID":706},{"data":2,"id":90,"name":"minecraft:portal","runtimeID":707},{"data":3,"id":90,"name":"minecraft:portal","runtimeID":708},{"data":0,"id":91,"name":"minecraft:lit_pumpkin","runtimeID":709},{"data":1,"id":91,"name":"minecraft:lit_pumpkin","runtimeID":710},{"data":2,"id":91,"name":"minecraft:lit_pumpkin","runtimeID":711},{"data":3,"id":91,"name":"minecraft:lit_pumpkin","runtimeID":712},{"data":0,"id":92,"name":"minecraft:cake","runtimeID":713},{"data":1,"id":92,"name":"minecraft:cake","runtimeID":714},{"data":2,"id":92,"name":"minecraft:cake","runtimeID":715},{"data":3,"id":92,"name":"minecraft:cake","runtimeID":716},{"data":4,"id":92,"name":"minecraft:cake","runtimeID":717},{"data":5,"id":92,"name":"minecraft:cake","runtimeID":718},{"data":6,"id":92,"name":"minecraft:cake","runtimeID":719},{"data":7,"id":92,"name":"minecraft:cake","runtimeID":720},{"data":0,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":721},{"data":1,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":722},{"data":2,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":723},{"data":3,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":724},{"data":4,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":725},{"data":5,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":726},{"data":6,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":727},{"data":7,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":728},{"data":8,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":729},{"data":9,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":730},{"data":10,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":731},{"data":11,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":732},{"data":12,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":733},{"data":13,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":734},{"data":14,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":735},{"data":15,"id":93,"name":"minecraft:unpowered_repeater","runtimeID":736},{"data":0,"id":94,"name":"minecraft:powered_repeater","runtimeID":737},{"data":1,"id":94,"name":"minecraft:powered_repeater","runtimeID":738},{"data":2,"id":94,"name":"minecraft:powered_repeater","runtimeID":739},{"data":3,"id":94,"name":"minecraft:powered_repeater","runtimeID":740},{"data":4,"id":94,"name":"minecraft:powered_repeater","runtimeID":741},{"data":5,"id":94,"name":"minecraft:powered_repeater","runtimeID":742},{"data":6,"id":94,"name":"minecraft:powered_repeater","runtimeID":743},{"data":7,"id":94,"name":"minecraft:powered_repeater","runtimeID":744},{"data":8,"id":94,"name":"minecraft:powered_repeater","runtimeID":745},{"data":9,"id":94,"name":"minecraft:powered_repeater","runtimeID":746},{"data":10,"id":94,"name":"minecraft:powered_repeater","runtimeID":747},{"data":11,"id":94,"name":"minecraft:powered_repeater","runtimeID":748},{"data":12,"id":94,"name":"minecraft:powered_repeater","runtimeID":749},{"data":13,"id":94,"name":"minecraft:powered_repeater","runtimeID":750},{"data":14,"id":94,"name":"minecraft:powered_repeater","runtimeID":751},{"data":15,"id":94,"name":"minecraft:powered_repeater","runtimeID":752},{"data":0,"id":95,"name":"minecraft:invisibleBedrock","runtimeID":753},{"data":0,"id":96,"name":"minecraft:trapdoor","runtimeID":754},{"data":1,"id":96,"name":"minecraft:trapdoor","runtimeID":755},{"data":2,"id":96,"name":"minecraft:trapdoor","runtimeID":756},{"data":3,"id":96,"name":"minecraft:trapdoor","runtimeID":757},{"data":4,"id":96,"name":"minecraft:trapdoor","runtimeID":758},{"data":5,"id":96,"name":"minecraft:trapdoor","runtimeID":759},{"data":6,"id":96,"name":"minecraft:trapdoor","runtimeID":760},{"data":7,"id":96,"name":"minecraft:trapdoor","runtimeID":761},{"data":8,"id":96,"name":"minecraft:trapdoor","runtimeID":762},{"data":9,"id":96,"name":"minecraft:trapdoor","runtimeID":763},{"data":10,"id":96,"name":"minecraft:trapdoor","runtimeID":764},{"data":11,"id":96,"name":"minecraft:trapdoor","runtimeID":765},{"data":12,"id":96,"name":"minecraft:trapdoor","runtimeID":766},{"data":13,"id":96,"name":"minecraft:trapdoor","runtimeID":767},{"data":14,"id":96,"name":"minecraft:trapdoor","runtimeID":768},{"data":15,"id":96,"name":"minecraft:trapdoor","runtimeID":769},{"data":0,"id":97,"name":"minecraft:monster_egg","runtimeID":770},{"data":1,"id":97,"name":"minecraft:monster_egg","runtimeID":771},{"data":2,"id":97,"name":"minecraft:monster_egg","runtimeID":772},{"data":3,"id":97,"name":"minecraft:monster_egg","runtimeID":773},{"data":4,"id":97,"name":"minecraft:monster_egg","runtimeID":774},{"data":5,"id":97,"name":"minecraft:monster_egg","runtimeID":775},{"data":6,"id":97,"name":"minecraft:monster_egg","runtimeID":776},{"data":7,"id":97,"name":"minecraft:monster_egg","runtimeID":777},{"data":0,"id":98,"name":"minecraft:stonebrick","runtimeID":778},{"data":1,"id":98,"name":"minecraft:stonebrick","runtimeID":779},{"data":2,"id":98,"name":"minecraft:stonebrick","runtimeID":780},{"data":3,"id":98,"name":"minecraft:stonebrick","runtimeID":781},{"data":4,"id":98,"name":"minecraft:stonebrick","runtimeID":782},{"data":5,"id":98,"name":"minecraft:stonebrick","runtimeID":783},{"data":6,"id":98,"name":"minecraft:stonebrick","runtimeID":784},{"data":7,"id":98,"name":"minecraft:stonebrick","runtimeID":785},{"data":0,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":786},{"data":1,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":787},{"data":2,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":788},{"data":3,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":789},{"data":4,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":790},{"data":5,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":791},{"data":6,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":792},{"data":7,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":793},{"data":8,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":794},{"data":9,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":795},{"data":10,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":796},{"data":11,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":797},{"data":12,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":798},{"data":13,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":799},{"data":14,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":800},{"data":15,"id":99,"name":"minecraft:brown_mushroom_block","runtimeID":801},{"data":0,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":802},{"data":1,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":803},{"data":2,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":804},{"data":3,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":805},{"data":4,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":806},{"data":5,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":807},{"data":6,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":808},{"data":7,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":809},{"data":8,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":810},{"data":9,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":811},{"data":10,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":812},{"data":11,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":813},{"data":12,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":814},{"data":13,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":815},{"data":14,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":816},{"data":15,"id":100,"name":"minecraft:red_mushroom_block","runtimeID":817},{"data":0,"id":101,"name":"minecraft:iron_bars","runtimeID":818},{"data":0,"id":102,"name":"minecraft:glass_pane","runtimeID":819},{"data":0,"id":103,"name":"minecraft:melon_block","runtimeID":820},{"data":0,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":821},{"data":1,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":822},{"data":2,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":823},{"data":3,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":824},{"data":4,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":825},{"data":5,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":826},{"data":6,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":827},{"data":7,"id":104,"name":"minecraft:pumpkin_stem","runtimeID":828},{"data":0,"id":105,"name":"minecraft:melon_stem","runtimeID":829},{"data":1,"id":105,"name":"minecraft:melon_stem","runtimeID":830},{"data":2,"id":105,"name":"minecraft:melon_stem","runtimeID":831},{"data":3,"id":105,"name":"minecraft:melon_stem","runtimeID":832},{"data":4,"id":105,"name":"minecraft:melon_stem","runtimeID":833},{"data":5,"id":105,"name":"minecraft:melon_stem","runtimeID":834},{"data":6,"id":105,"name":"minecraft:melon_stem","runtimeID":835},{"data":7,"id":105,"name":"minecraft:melon_stem","runtimeID":836},{"data":0,"id":106,"name":"minecraft:vine","runtimeID":837},{"data":1,"id":106,"name":"minecraft:vine","runtimeID":838},{"data":2,"id":106,"name":"minecraft:vine","runtimeID":839},{"data":3,"id":106,"name":"minecraft:vine","runtimeID":840},{"data":4,"id":106,"name":"minecraft:vine","runtimeID":841},{"data":5,"id":106,"name":"minecraft:vine","runtimeID":842},{"data":6,"id":106,"name":"minecraft:vine","runtimeID":843},{"data":7,"id":106,"name":"minecraft:vine","runtimeID":844},{"data":8,"id":106,"name":"minecraft:vine","runtimeID":845},{"data":9,"id":106,"name":"minecraft:vine","runtimeID":846},{"data":10,"id":106,"name":"minecraft:vine","runtimeID":847},{"data":11,"id":106,"name":"minecraft:vine","runtimeID":848},{"data":12,"id":106,"name":"minecraft:vine","runtimeID":849},{"data":13,"id":106,"name":"minecraft:vine","runtimeID":850},{"data":14,"id":106,"name":"minecraft:vine","runtimeID":851},{"data":15,"id":106,"name":"minecraft:vine","runtimeID":852},{"data":0,"id":107,"name":"minecraft:fence_gate","runtimeID":853},{"data":1,"id":107,"name":"minecraft:fence_gate","runtimeID":854},{"data":2,"id":107,"name":"minecraft:fence_gate","runtimeID":855},{"data":3,"id":107,"name":"minecraft:fence_gate","runtimeID":856},{"data":4,"id":107,"name":"minecraft:fence_gate","runtimeID":857},{"data":5,"id":107,"name":"minecraft:fence_gate","runtimeID":858},{"data":6,"id":107,"name":"minecraft:fence_gate","runtimeID":859},{"data":7,"id":107,"name":"minecraft:fence_gate","runtimeID":860},{"data":8,"id":107,"name":"minecraft:fence_gate","runtimeID":861},{"data":9,"id":107,"name":"minecraft:fence_gate","runtimeID":862},{"data":10,"id":107,"name":"minecraft:fence_gate","runtimeID":863},{"data":11,"id":107,"name":"minecraft:fence_gate","runtimeID":864},{"data":12,"id":107,"name":"minecraft:fence_gate","runtimeID":865},{"data":13,"id":107,"name":"minecraft:fence_gate","runtimeID":866},{"data":14,"id":107,"name":"minecraft:fence_gate","runtimeID":867},{"data":15,"id":107,"name":"minecraft:fence_gate","runtimeID":868},{"data":0,"id":108,"name":"minecraft:brick_stairs","runtimeID":869},{"data":1,"id":108,"name":"minecraft:brick_stairs","runtimeID":870},{"data":2,"id":108,"name":"minecraft:brick_stairs","runtimeID":871},{"data":3,"id":108,"name":"minecraft:brick_stairs","runtimeID":872},{"data":4,"id":108,"name":"minecraft:brick_stairs","runtimeID":873},{"data":5,"id":108,"name":"minecraft:brick_stairs","runtimeID":874},{"data":6,"id":108,"name":"minecraft:brick_stairs","runtimeID":875},{"data":7,"id":108,"name":"minecraft:brick_stairs","runtimeID":876},{"data":0,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":877},{"data":1,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":878},{"data":2,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":879},{"data":3,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":880},{"data":4,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":881},{"data":5,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":882},{"data":6,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":883},{"data":7,"id":109,"name":"minecraft:stone_brick_stairs","runtimeID":884},{"data":0,"id":110,"name":"minecraft:mycelium","runtimeID":885},{"data":0,"id":111,"name":"minecraft:waterlily","runtimeID":886},{"data":0,"id":112,"name":"minecraft:nether_brick","runtimeID":887},{"data":0,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":888},{"data":1,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":889},{"data":2,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":890},{"data":3,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":891},{"data":4,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":892},{"data":5,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":893},{"data":6,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":894},{"data":7,"id":113,"name":"minecraft:nether_brick_fence","runtimeID":895},{"data":0,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":896},{"data":1,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":897},{"data":2,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":898},{"data":3,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":899},{"data":4,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":900},{"data":5,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":901},{"data":6,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":902},{"data":7,"id":114,"name":"minecraft:nether_brick_stairs","runtimeID":903},{"data":0,"id":115,"name":"minecraft:nether_wart","runtimeID":904},{"data":1,"id":115,"name":"minecraft:nether_wart","runtimeID":905},{"data":2,"id":115,"name":"minecraft:nether_wart","runtimeID":906},{"data":3,"id":115,"name":"minecraft:nether_wart","runtimeID":907},{"data":0,"id":116,"name":"minecraft:enchanting_table","runtimeID":908},{"data":0,"id":117,"name":"minecraft:brewing_stand","runtimeID":909},{"data":1,"id":117,"name":"minecraft:brewing_stand","runtimeID":910},{"data":2,"id":117,"name":"minecraft:brewing_stand","runtimeID":911},{"data":3,"id":117,"name":"minecraft:brewing_stand","runtimeID":912},{"data":4,"id":117,"name":"minecraft:brewing_stand","runtimeID":913},{"data":5,"id":117,"name":"minecraft:brewing_stand","runtimeID":914},{"data":6,"id":117,"name":"minecraft:brewing_stand","runtimeID":915},{"data":7,"id":117,"name":"minecraft:brewing_stand","runtimeID":916},{"data":0,"id":118,"name":"minecraft:cauldron","runtimeID":917},{"data":1,"id":118,"name":"minecraft:cauldron","runtimeID":918},{"data":2,"id":118,"name":"minecraft:cauldron","runtimeID":919},{"data":3,"id":118,"name":"minecraft:cauldron","runtimeID":920},{"data":4,"id":118,"name":"minecraft:cauldron","runtimeID":921},{"data":5,"id":118,"name":"minecraft:cauldron","runtimeID":922},{"data":6,"id":118,"name":"minecraft:cauldron","runtimeID":923},{"data":7,"id":118,"name":"minecraft:cauldron","runtimeID":924},{"data":0,"id":119,"name":"minecraft:end_portal","runtimeID":925},{"data":0,"id":120,"name":"minecraft:end_portal_frame","runtimeID":926},{"data":1,"id":120,"name":"minecraft:end_portal_frame","runtimeID":927},{"data":2,"id":120,"name":"minecraft:end_portal_frame","runtimeID":928},{"data":3,"id":120,"name":"minecraft:end_portal_frame","runtimeID":929},{"data":4,"id":120,"name":"minecraft:end_portal_frame","runtimeID":930},{"data":5,"id":120,"name":"minecraft:end_portal_frame","runtimeID":931},{"data":6,"id":120,"name":"minecraft:end_portal_frame","runtimeID":932},{"data":7,"id":120,"name":"minecraft:end_portal_frame","runtimeID":933},{"data":0,"id":121,"name":"minecraft:end_stone","runtimeID":934},{"data":0,"id":122,"name":"minecraft:dragon_egg","runtimeID":935},{"data":0,"id":123,"name":"minecraft:redstone_lamp","runtimeID":936},{"data":0,"id":124,"name":"minecraft:lit_redstone_lamp","runtimeID":937},{"data":0,"id":125,"name":"minecraft:dropper","runtimeID":938},{"data":1,"id":125,"name":"minecraft:dropper","runtimeID":939},{"data":2,"id":125,"name":"minecraft:dropper","runtimeID":940},{"data":3,"id":125,"name":"minecraft:dropper","runtimeID":941},{"data":4,"id":125,"name":"minecraft:dropper","runtimeID":942},{"data":5,"id":125,"name":"minecraft:dropper","runtimeID":943},{"data":6,"id":125,"name":"minecraft:dropper","runtimeID":944},{"data":7,"id":125,"name":"minecraft:dropper","runtimeID":945},{"data":8,"id":125,"name":"minecraft:dropper","runtimeID":946},{"data":9,"id":125,"name":"minecraft:dropper","runtimeID":947},{"data":10,"id":125,"name":"minecraft:dropper","runtimeID":948},{"data":11,"id":125,"name":"minecraft:dropper","runtimeID":949},{"data":12,"id":125,"name":"minecraft:dropper","runtimeID":950},{"data":13,"id":125,"name":"minecraft:dropper","runtimeID":951},{"data":14,"id":125,"name":"minecraft:dropper","runtimeID":952},{"data":15,"id":125,"name":"minecraft:dropper","runtimeID":953},{"data":0,"id":126,"name":"minecraft:activator_rail","runtimeID":954},{"data":1,"id":126,"name":"minecraft:activator_rail","runtimeID":955},{"data":2,"id":126,"name":"minecraft:activator_rail","runtimeID":956},{"data":3,"id":126,"name":"minecraft:activator_rail","runtimeID":957},{"data":4,"id":126,"name":"minecraft:activator_rail","runtimeID":958},{"data":5,"id":126,"name":"minecraft:activator_rail","runtimeID":959},{"data":6,"id":126,"name":"minecraft:activator_rail","runtimeID":960},{"data":7,"id":126,"name":"minecraft:activator_rail","runtimeID":961},{"data":8,"id":126,"name":"minecraft:activator_rail","runtimeID":962},{"data":9,"id":126,"name":"minecraft:activator_rail","runtimeID":963},{"data":10,"id":126,"name":"minecraft:activator_rail","runtimeID":964},{"data":11,"id":126,"name":"minecraft:activator_rail","runtimeID":965},{"data":12,"id":126,"name":"minecraft:activator_rail","runtimeID":966},{"data":13,"id":126,"name":"minecraft:activator_rail","runtimeID":967},{"data":14,"id":126,"name":"minecraft:activator_rail","runtimeID":968},{"data":15,"id":126,"name":"minecraft:activator_rail","runtimeID":969},{"data":0,"id":127,"name":"minecraft:cocoa","runtimeID":970},{"data":1,"id":127,"name":"minecraft:cocoa","runtimeID":971},{"data":2,"id":127,"name":"minecraft:cocoa","runtimeID":972},{"data":3,"id":127,"name":"minecraft:cocoa","runtimeID":973},{"data":4,"id":127,"name":"minecraft:cocoa","runtimeID":974},{"data":5,"id":127,"name":"minecraft:cocoa","runtimeID":975},{"data":6,"id":127,"name":"minecraft:cocoa","runtimeID":976},{"data":7,"id":127,"name":"minecraft:cocoa","runtimeID":977},{"data":8,"id":127,"name":"minecraft:cocoa","runtimeID":978},{"data":9,"id":127,"name":"minecraft:cocoa","runtimeID":979},{"data":10,"id":127,"name":"minecraft:cocoa","runtimeID":980},{"data":11,"id":127,"name":"minecraft:cocoa","runtimeID":981},{"data":12,"id":127,"name":"minecraft:cocoa","runtimeID":982},{"data":13,"id":127,"name":"minecraft:cocoa","runtimeID":983},{"data":14,"id":127,"name":"minecraft:cocoa","runtimeID":984},{"data":15,"id":127,"name":"minecraft:cocoa","runtimeID":985},{"data":0,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":986},{"data":1,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":987},{"data":2,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":988},{"data":3,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":989},{"data":4,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":990},{"data":5,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":991},{"data":6,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":992},{"data":7,"id":128,"name":"minecraft:sandstone_stairs","runtimeID":993},{"data":0,"id":129,"name":"minecraft:emerald_ore","runtimeID":994},{"data":0,"id":130,"name":"minecraft:ender_chest","runtimeID":995},{"data":1,"id":130,"name":"minecraft:ender_chest","runtimeID":996},{"data":2,"id":130,"name":"minecraft:ender_chest","runtimeID":997},{"data":3,"id":130,"name":"minecraft:ender_chest","runtimeID":998},{"data":4,"id":130,"name":"minecraft:ender_chest","runtimeID":999},{"data":5,"id":130,"name":"minecraft:ender_chest","runtimeID":1000},{"data":6,"id":130,"name":"minecraft:ender_chest","runtimeID":1001},{"data":7,"id":130,"name":"minecraft:ender_chest","runtimeID":1002},{"data":0,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1003},{"data":1,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1004},{"data":2,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1005},{"data":3,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1006},{"data":4,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1007},{"data":5,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1008},{"data":6,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1009},{"data":7,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1010},{"data":8,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1011},{"data":9,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1012},{"data":10,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1013},{"data":11,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1014},{"data":12,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1015},{"data":13,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1016},{"data":14,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1017},{"data":15,"id":131,"name":"minecraft:tripwire_hook","runtimeID":1018},{"data":0,"id":132,"name":"minecraft:tripWire","runtimeID":1019},{"data":1,"id":132,"name":"minecraft:tripWire","runtimeID":1020},{"data":2,"id":132,"name":"minecraft:tripWire","runtimeID":1021},{"data":3,"id":132,"name":"minecraft:tripWire","runtimeID":1022},{"data":4,"id":132,"name":"minecraft:tripWire","runtimeID":1023},{"data":5,"id":132,"name":"minecraft:tripWire","runtimeID":1024},{"data":6,"id":132,"name":"minecraft:tripWire","runtimeID":1025},{"data":7,"id":132,"name":"minecraft:tripWire","runtimeID":1026},{"data":8,"id":132,"name":"minecraft:tripWire","runtimeID":1027},{"data":9,"id":132,"name":"minecraft:tripWire","runtimeID":1028},{"data":10,"id":132,"name":"minecraft:tripWire","runtimeID":1029},{"data":11,"id":132,"name":"minecraft:tripWire","runtimeID":1030},{"data":12,"id":132,"name":"minecraft:tripWire","runtimeID":1031},{"data":13,"id":132,"name":"minecraft:tripWire","runtimeID":1032},{"data":14,"id":132,"name":"minecraft:tripWire","runtimeID":1033},{"data":15,"id":132,"name":"minecraft:tripWire","runtimeID":1034},{"data":0,"id":133,"name":"minecraft:emerald_block","runtimeID":1035},{"data":0,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1036},{"data":1,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1037},{"data":2,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1038},{"data":3,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1039},{"data":4,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1040},{"data":5,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1041},{"data":6,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1042},{"data":7,"id":134,"name":"minecraft:spruce_stairs","runtimeID":1043},{"data":0,"id":135,"name":"minecraft:birch_stairs","runtimeID":1044},{"data":1,"id":135,"name":"minecraft:birch_stairs","runtimeID":1045},{"data":2,"id":135,"name":"minecraft:birch_stairs","runtimeID":1046},{"data":3,"id":135,"name":"minecraft:birch_stairs","runtimeID":1047},{"data":4,"id":135,"name":"minecraft:birch_stairs","runtimeID":1048},{"data":5,"id":135,"name":"minecraft:birch_stairs","runtimeID":1049},{"data":6,"id":135,"name":"minecraft:birch_stairs","runtimeID":1050},{"data":7,"id":135,"name":"minecraft:birch_stairs","runtimeID":1051},{"data":0,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1052},{"data":1,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1053},{"data":2,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1054},{"data":3,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1055},{"data":4,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1056},{"data":5,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1057},{"data":6,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1058},{"data":7,"id":136,"name":"minecraft:jungle_stairs","runtimeID":1059},{"data":0,"id":137,"name":"minecraft:command_block","runtimeID":1060},{"data":1,"id":137,"name":"minecraft:command_block","runtimeID":1061},{"data":2,"id":137,"name":"minecraft:command_block","runtimeID":1062},{"data":3,"id":137,"name":"minecraft:command_block","runtimeID":1063},{"data":4,"id":137,"name":"minecraft:command_block","runtimeID":1064},{"data":5,"id":137,"name":"minecraft:command_block","runtimeID":1065},{"data":6,"id":137,"name":"minecraft:command_block","runtimeID":1066},{"data":7,"id":137,"name":"minecraft:command_block","runtimeID":1067},{"data":8,"id":137,"name":"minecraft:command_block","runtimeID":1068},{"data":9,"id":137,"name":"minecraft:command_block","runtimeID":1069},{"data":10,"id":137,"name":"minecraft:command_block","runtimeID":1070},{"data":11,"id":137,"name":"minecraft:command_block","runtimeID":1071},{"data":12,"id":137,"name":"minecraft:command_block","runtimeID":1072},{"data":13,"id":137,"name":"minecraft:command_block","runtimeID":1073},{"data":14,"id":137,"name":"minecraft:command_block","runtimeID":1074},{"data":15,"id":137,"name":"minecraft:command_block","runtimeID":1075},{"data":0,"id":138,"name":"minecraft:beacon","runtimeID":1076},{"data":0,"id":139,"name":"minecraft:cobblestone_wall","runtimeID":1077},{"data":1,"id":139,"name":"minecraft:cobblestone_wall","runtimeID":1078},{"data":0,"id":140,"name":"minecraft:flower_pot","runtimeID":1079},{"data":1,"id":140,"name":"minecraft:flower_pot","runtimeID":1080},{"data":0,"id":141,"name":"minecraft:carrots","runtimeID":1081},{"data":1,"id":141,"name":"minecraft:carrots","runtimeID":1082},{"data":2,"id":141,"name":"minecraft:carrots","runtimeID":1083},{"data":3,"id":141,"name":"minecraft:carrots","runtimeID":1084},{"data":4,"id":141,"name":"minecraft:carrots","runtimeID":1085},{"data":5,"id":141,"name":"minecraft:carrots","runtimeID":1086},{"data":6,"id":141,"name":"minecraft:carrots","runtimeID":1087},{"data":7,"id":141,"name":"minecraft:carrots","runtimeID":1088},{"data":0,"id":142,"name":"minecraft:potatoes","runtimeID":1089},{"data":1,"id":142,"name":"minecraft:potatoes","runtimeID":1090},{"data":2,"id":142,"name":"minecraft:potatoes","runtimeID":1091},{"data":3,"id":142,"name":"minecraft:potatoes","runtimeID":1092},{"data":4,"id":142,"name":"minecraft:potatoes","runtimeID":1093},{"data":5,"id":142,"name":"minecraft:potatoes","runtimeID":1094},{"data":6,"id":142,"name":"minecraft:potatoes","runtimeID":1095},{"data":7,"id":142,"name":"minecraft:potatoes","runtimeID":1096},{"data":0,"id":143,"name":"minecraft:wooden_button","runtimeID":1097},{"data":1,"id":143,"name":"minecraft:wooden_button","runtimeID":1098},{"data":2,"id":143,"name":"minecraft:wooden_button","runtimeID":1099},{"data":3,"id":143,"name":"minecraft:wooden_button","runtimeID":1100},{"data":4,"id":143,"name":"minecraft:wooden_button","runtimeID":1101},{"data":5,"id":143,"name":"minecraft:wooden_button","runtimeID":1102},{"data":6,"id":143,"name":"minecraft:wooden_button","runtimeID":1103},{"data":7,"id":143,"name":"minecraft:wooden_button","runtimeID":1104},{"data":8,"id":143,"name":"minecraft:wooden_button","runtimeID":1105},{"data":9,"id":143,"name":"minecraft:wooden_button","runtimeID":1106},{"data":10,"id":143,"name":"minecraft:wooden_button","runtimeID":1107},{"data":11,"id":143,"name":"minecraft:wooden_button","runtimeID":1108},{"data":12,"id":143,"name":"minecraft:wooden_button","runtimeID":1109},{"data":13,"id":143,"name":"minecraft:wooden_button","runtimeID":1110},{"data":14,"id":143,"name":"minecraft:wooden_button","runtimeID":1111},{"data":15,"id":143,"name":"minecraft:wooden_button","runtimeID":1112},{"data":0,"id":144,"name":"minecraft:skull","runtimeID":1113},{"data":1,"id":144,"name":"minecraft:skull","runtimeID":1114},{"data":2,"id":144,"name":"minecraft:skull","runtimeID":1115},{"data":3,"id":144,"name":"minecraft:skull","runtimeID":1116},{"data":4,"id":144,"name":"minecraft:skull","runtimeID":1117},{"data":5,"id":144,"name":"minecraft:skull","runtimeID":1118},{"data":6,"id":144,"name":"minecraft:skull","runtimeID":1119},{"data":7,"id":144,"name":"minecraft:skull","runtimeID":1120},{"data":8,"id":144,"name":"minecraft:skull","runtimeID":1121},{"data":9,"id":144,"name":"minecraft:skull","runtimeID":1122},{"data":10,"id":144,"name":"minecraft:skull","runtimeID":1123},{"data":11,"id":144,"name":"minecraft:skull","runtimeID":1124},{"data":12,"id":144,"name":"minecraft:skull","runtimeID":1125},{"data":13,"id":144,"name":"minecraft:skull","runtimeID":1126},{"data":14,"id":144,"name":"minecraft:skull","runtimeID":1127},{"data":15,"id":144,"name":"minecraft:skull","runtimeID":1128},{"data":0,"id":145,"name":"minecraft:anvil","runtimeID":1129},{"data":1,"id":145,"name":"minecraft:anvil","runtimeID":1130},{"data":2,"id":145,"name":"minecraft:anvil","runtimeID":1131},{"data":3,"id":145,"name":"minecraft:anvil","runtimeID":1132},{"data":4,"id":145,"name":"minecraft:anvil","runtimeID":1133},{"data":5,"id":145,"name":"minecraft:anvil","runtimeID":1134},{"data":6,"id":145,"name":"minecraft:anvil","runtimeID":1135},{"data":7,"id":145,"name":"minecraft:anvil","runtimeID":1136},{"data":8,"id":145,"name":"minecraft:anvil","runtimeID":1137},{"data":9,"id":145,"name":"minecraft:anvil","runtimeID":1138},{"data":10,"id":145,"name":"minecraft:anvil","runtimeID":1139},{"data":11,"id":145,"name":"minecraft:anvil","runtimeID":1140},{"data":12,"id":145,"name":"minecraft:anvil","runtimeID":1141},{"data":13,"id":145,"name":"minecraft:anvil","runtimeID":1142},{"data":14,"id":145,"name":"minecraft:anvil","runtimeID":1143},{"data":15,"id":145,"name":"minecraft:anvil","runtimeID":1144},{"data":0,"id":146,"name":"minecraft:trapped_chest","runtimeID":1145},{"data":1,"id":146,"name":"minecraft:trapped_chest","runtimeID":1146},{"data":2,"id":146,"name":"minecraft:trapped_chest","runtimeID":1147},{"data":3,"id":146,"name":"minecraft:trapped_chest","runtimeID":1148},{"data":4,"id":146,"name":"minecraft:trapped_chest","runtimeID":1149},{"data":5,"id":146,"name":"minecraft:trapped_chest","runtimeID":1150},{"data":6,"id":146,"name":"minecraft:trapped_chest","runtimeID":1151},{"data":7,"id":146,"name":"minecraft:trapped_chest","runtimeID":1152},{"data":0,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1153},{"data":1,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1154},{"data":2,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1155},{"data":3,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1156},{"data":4,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1157},{"data":5,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1158},{"data":6,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1159},{"data":7,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1160},{"data":8,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1161},{"data":9,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1162},{"data":10,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1163},{"data":11,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1164},{"data":12,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1165},{"data":13,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1166},{"data":14,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1167},{"data":15,"id":147,"name":"minecraft:light_weighted_pressure_plate","runtimeID":1168},{"data":0,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1169},{"data":1,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1170},{"data":2,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1171},{"data":3,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1172},{"data":4,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1173},{"data":5,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1174},{"data":6,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1175},{"data":7,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1176},{"data":8,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1177},{"data":9,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1178},{"data":10,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1179},{"data":11,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1180},{"data":12,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1181},{"data":13,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1182},{"data":14,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1183},{"data":15,"id":148,"name":"minecraft:heavy_weighted_pressure_plate","runtimeID":1184},{"data":0,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1185},{"data":1,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1186},{"data":2,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1187},{"data":3,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1188},{"data":4,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1189},{"data":5,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1190},{"data":6,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1191},{"data":7,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1192},{"data":8,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1193},{"data":9,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1194},{"data":10,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1195},{"data":11,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1196},{"data":12,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1197},{"data":13,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1198},{"data":14,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1199},{"data":15,"id":149,"name":"minecraft:unpowered_comparator","runtimeID":1200},{"data":0,"id":150,"name":"minecraft:powered_comparator","runtimeID":1201},{"data":1,"id":150,"name":"minecraft:powered_comparator","runtimeID":1202},{"data":2,"id":150,"name":"minecraft:powered_comparator","runtimeID":1203},{"data":3,"id":150,"name":"minecraft:powered_comparator","runtimeID":1204},{"data":4,"id":150,"name":"minecraft:powered_comparator","runtimeID":1205},{"data":5,"id":150,"name":"minecraft:powered_comparator","runtimeID":1206},{"data":6,"id":150,"name":"minecraft:powered_comparator","runtimeID":1207},{"data":7,"id":150,"name":"minecraft:powered_comparator","runtimeID":1208},{"data":8,"id":150,"name":"minecraft:powered_comparator","runtimeID":1209},{"data":9,"id":150,"name":"minecraft:powered_comparator","runtimeID":1210},{"data":10,"id":150,"name":"minecraft:powered_comparator","runtimeID":1211},{"data":11,"id":150,"name":"minecraft:powered_comparator","runtimeID":1212},{"data":12,"id":150,"name":"minecraft:powered_comparator","runtimeID":1213},{"data":13,"id":150,"name":"minecraft:powered_comparator","runtimeID":1214},{"data":14,"id":150,"name":"minecraft:powered_comparator","runtimeID":1215},{"data":15,"id":150,"name":"minecraft:powered_comparator","runtimeID":1216},{"data":0,"id":151,"name":"minecraft:daylight_detector","runtimeID":1217},{"data":1,"id":151,"name":"minecraft:daylight_detector","runtimeID":1218},{"data":2,"id":151,"name":"minecraft:daylight_detector","runtimeID":1219},{"data":3,"id":151,"name":"minecraft:daylight_detector","runtimeID":1220},{"data":4,"id":151,"name":"minecraft:daylight_detector","runtimeID":1221},{"data":5,"id":151,"name":"minecraft:daylight_detector","runtimeID":1222},{"data":6,"id":151,"name":"minecraft:daylight_detector","runtimeID":1223},{"data":7,"id":151,"name":"minecraft:daylight_detector","runtimeID":1224},{"data":8,"id":151,"name":"minecraft:daylight_detector","runtimeID":1225},{"data":9,"id":151,"name":"minecraft:daylight_detector","runtimeID":1226},{"data":10,"id":151,"name":"minecraft:daylight_detector","runtimeID":1227},{"data":11,"id":151,"name":"minecraft:daylight_detector","runtimeID":1228},{"data":12,"id":151,"name":"minecraft:daylight_detector","runtimeID":1229},{"data":13,"id":151,"name":"minecraft:daylight_detector","runtimeID":1230},{"data":14,"id":151,"name":"minecraft:daylight_detector","runtimeID":1231},{"data":15,"id":151,"name":"minecraft:daylight_detector","runtimeID":1232},{"data":0,"id":152,"name":"minecraft:redstone_block","runtimeID":1233},{"data":0,"id":153,"name":"minecraft:quartz_ore","runtimeID":1234},{"data":0,"id":154,"name":"minecraft:hopper","runtimeID":1235},{"data":1,"id":154,"name":"minecraft:hopper","runtimeID":1236},{"data":2,"id":154,"name":"minecraft:hopper","runtimeID":1237},{"data":3,"id":154,"name":"minecraft:hopper","runtimeID":1238},{"data":4,"id":154,"name":"minecraft:hopper","runtimeID":1239},{"data":5,"id":154,"name":"minecraft:hopper","runtimeID":1240},{"data":6,"id":154,"name":"minecraft:hopper","runtimeID":1241},{"data":7,"id":154,"name":"minecraft:hopper","runtimeID":1242},{"data":8,"id":154,"name":"minecraft:hopper","runtimeID":1243},{"data":9,"id":154,"name":"minecraft:hopper","runtimeID":1244},{"data":10,"id":154,"name":"minecraft:hopper","runtimeID":1245},{"data":11,"id":154,"name":"minecraft:hopper","runtimeID":1246},{"data":12,"id":154,"name":"minecraft:hopper","runtimeID":1247},{"data":13,"id":154,"name":"minecraft:hopper","runtimeID":1248},{"data":14,"id":154,"name":"minecraft:hopper","runtimeID":1249},{"data":15,"id":154,"name":"minecraft:hopper","runtimeID":1250},{"data":0,"id":155,"name":"minecraft:quartz_block","runtimeID":1251},{"data":1,"id":155,"name":"minecraft:quartz_block","runtimeID":1252},{"data":2,"id":155,"name":"minecraft:quartz_block","runtimeID":1253},{"data":3,"id":155,"name":"minecraft:quartz_block","runtimeID":1254},{"data":4,"id":155,"name":"minecraft:quartz_block","runtimeID":1255},{"data":5,"id":155,"name":"minecraft:quartz_block","runtimeID":1256},{"data":6,"id":155,"name":"minecraft:quartz_block","runtimeID":1257},{"data":7,"id":155,"name":"minecraft:quartz_block","runtimeID":1258},{"data":8,"id":155,"name":"minecraft:quartz_block","runtimeID":1259},{"data":9,"id":155,"name":"minecraft:quartz_block","runtimeID":1260},{"data":10,"id":155,"name":"minecraft:quartz_block","runtimeID":1261},{"data":11,"id":155,"name":"minecraft:quartz_block","runtimeID":1262},{"data":12,"id":155,"name":"minecraft:quartz_block","runtimeID":1263},{"data":13,"id":155,"name":"minecraft:quartz_block","runtimeID":1264},{"data":14,"id":155,"name":"minecraft:quartz_block","runtimeID":1265},{"data":15,"id":155,"name":"minecraft:quartz_block","runtimeID":1266},{"data":0,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1267},{"data":1,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1268},{"data":2,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1269},{"data":3,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1270},{"data":4,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1271},{"data":5,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1272},{"data":6,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1273},{"data":7,"id":156,"name":"minecraft:quartz_stairs","runtimeID":1274},{"data":0,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1275},{"data":1,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1276},{"data":2,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1277},{"data":3,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1278},{"data":4,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1279},{"data":5,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1280},{"data":6,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1281},{"data":7,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1282},{"data":8,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1283},{"data":9,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1284},{"data":10,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1285},{"data":11,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1286},{"data":12,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1287},{"data":13,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1288},{"data":14,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1289},{"data":15,"id":157,"name":"minecraft:double_wooden_slab","runtimeID":1290},{"data":0,"id":158,"name":"minecraft:wooden_slab","runtimeID":1291},{"data":1,"id":158,"name":"minecraft:wooden_slab","runtimeID":1292},{"data":2,"id":158,"name":"minecraft:wooden_slab","runtimeID":1293},{"data":3,"id":158,"name":"minecraft:wooden_slab","runtimeID":1294},{"data":4,"id":158,"name":"minecraft:wooden_slab","runtimeID":1295},{"data":5,"id":158,"name":"minecraft:wooden_slab","runtimeID":1296},{"data":6,"id":158,"name":"minecraft:wooden_slab","runtimeID":1297},{"data":7,"id":158,"name":"minecraft:wooden_slab","runtimeID":1298},{"data":8,"id":158,"name":"minecraft:wooden_slab","runtimeID":1299},{"data":9,"id":158,"name":"minecraft:wooden_slab","runtimeID":1300},{"data":10,"id":158,"name":"minecraft:wooden_slab","runtimeID":1301},{"data":11,"id":158,"name":"minecraft:wooden_slab","runtimeID":1302},{"data":12,"id":158,"name":"minecraft:wooden_slab","runtimeID":1303},{"data":13,"id":158,"name":"minecraft:wooden_slab","runtimeID":1304},{"data":14,"id":158,"name":"minecraft:wooden_slab","runtimeID":1305},{"data":15,"id":158,"name":"minecraft:wooden_slab","runtimeID":1306},{"data":0,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1307},{"data":1,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1308},{"data":2,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1309},{"data":3,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1310},{"data":4,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1311},{"data":5,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1312},{"data":6,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1313},{"data":7,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1314},{"data":8,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1315},{"data":9,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1316},{"data":10,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1317},{"data":11,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1318},{"data":12,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1319},{"data":13,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1320},{"data":14,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1321},{"data":15,"id":159,"name":"minecraft:stained_hardened_clay","runtimeID":1322},{"data":0,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1323},{"data":1,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1324},{"data":2,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1325},{"data":3,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1326},{"data":4,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1327},{"data":5,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1328},{"data":6,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1329},{"data":7,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1330},{"data":8,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1331},{"data":9,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1332},{"data":10,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1333},{"data":11,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1334},{"data":12,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1335},{"data":13,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1336},{"data":14,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1337},{"data":15,"id":160,"name":"minecraft:stained_glass_pane","runtimeID":1338},{"data":0,"id":161,"name":"minecraft:leaves2","runtimeID":1339},{"data":1,"id":161,"name":"minecraft:leaves2","runtimeID":1340},{"data":2,"id":161,"name":"minecraft:leaves2","runtimeID":1341},{"data":3,"id":161,"name":"minecraft:leaves2","runtimeID":1342},{"data":4,"id":161,"name":"minecraft:leaves2","runtimeID":1343},{"data":5,"id":161,"name":"minecraft:leaves2","runtimeID":1344},{"data":6,"id":161,"name":"minecraft:leaves2","runtimeID":1345},{"data":7,"id":161,"name":"minecraft:leaves2","runtimeID":1346},{"data":8,"id":161,"name":"minecraft:leaves2","runtimeID":1347},{"data":9,"id":161,"name":"minecraft:leaves2","runtimeID":1348},{"data":10,"id":161,"name":"minecraft:leaves2","runtimeID":1349},{"data":11,"id":161,"name":"minecraft:leaves2","runtimeID":1350},{"data":12,"id":161,"name":"minecraft:leaves2","runtimeID":1351},{"data":13,"id":161,"name":"minecraft:leaves2","runtimeID":1352},{"data":14,"id":161,"name":"minecraft:leaves2","runtimeID":1353},{"data":15,"id":161,"name":"minecraft:leaves2","runtimeID":1354},{"data":0,"id":162,"name":"minecraft:log2","runtimeID":1355},{"data":1,"id":162,"name":"minecraft:log2","runtimeID":1356},{"data":2,"id":162,"name":"minecraft:log2","runtimeID":1357},{"data":3,"id":162,"name":"minecraft:log2","runtimeID":1358},{"data":4,"id":162,"name":"minecraft:log2","runtimeID":1359},{"data":5,"id":162,"name":"minecraft:log2","runtimeID":1360},{"data":6,"id":162,"name":"minecraft:log2","runtimeID":1361},{"data":7,"id":162,"name":"minecraft:log2","runtimeID":1362},{"data":8,"id":162,"name":"minecraft:log2","runtimeID":1363},{"data":9,"id":162,"name":"minecraft:log2","runtimeID":1364},{"data":10,"id":162,"name":"minecraft:log2","runtimeID":1365},{"data":11,"id":162,"name":"minecraft:log2","runtimeID":1366},{"data":12,"id":162,"name":"minecraft:log2","runtimeID":1367},{"data":13,"id":162,"name":"minecraft:log2","runtimeID":1368},{"data":14,"id":162,"name":"minecraft:log2","runtimeID":1369},{"data":15,"id":162,"name":"minecraft:log2","runtimeID":1370},{"data":0,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1371},{"data":1,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1372},{"data":2,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1373},{"data":3,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1374},{"data":4,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1375},{"data":5,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1376},{"data":6,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1377},{"data":7,"id":163,"name":"minecraft:acacia_stairs","runtimeID":1378},{"data":0,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1379},{"data":1,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1380},{"data":2,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1381},{"data":3,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1382},{"data":4,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1383},{"data":5,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1384},{"data":6,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1385},{"data":7,"id":164,"name":"minecraft:dark_oak_stairs","runtimeID":1386},{"data":0,"id":165,"name":"minecraft:slime","runtimeID":1387},{"data":0,"id":166,"name":"minecraft:glow_stick","runtimeID":1388},{"data":1,"id":166,"name":"minecraft:glow_stick","runtimeID":1389},{"data":2,"id":166,"name":"minecraft:glow_stick","runtimeID":1390},{"data":3,"id":166,"name":"minecraft:glow_stick","runtimeID":1391},{"data":4,"id":166,"name":"minecraft:glow_stick","runtimeID":1392},{"data":5,"id":166,"name":"minecraft:glow_stick","runtimeID":1393},{"data":6,"id":166,"name":"minecraft:glow_stick","runtimeID":1394},{"data":7,"id":166,"name":"minecraft:glow_stick","runtimeID":1395},{"data":8,"id":166,"name":"minecraft:glow_stick","runtimeID":1396},{"data":9,"id":166,"name":"minecraft:glow_stick","runtimeID":1397},{"data":10,"id":166,"name":"minecraft:glow_stick","runtimeID":1398},{"data":11,"id":166,"name":"minecraft:glow_stick","runtimeID":1399},{"data":12,"id":166,"name":"minecraft:glow_stick","runtimeID":1400},{"data":13,"id":166,"name":"minecraft:glow_stick","runtimeID":1401},{"data":14,"id":166,"name":"minecraft:glow_stick","runtimeID":1402},{"data":15,"id":166,"name":"minecraft:glow_stick","runtimeID":1403},{"data":0,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1404},{"data":1,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1405},{"data":2,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1406},{"data":3,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1407},{"data":4,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1408},{"data":5,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1409},{"data":6,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1410},{"data":7,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1411},{"data":8,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1412},{"data":9,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1413},{"data":10,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1414},{"data":11,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1415},{"data":12,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1416},{"data":13,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1417},{"data":14,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1418},{"data":15,"id":167,"name":"minecraft:iron_trapdoor","runtimeID":1419},{"data":0,"id":168,"name":"minecraft:prismarine","runtimeID":1420},{"data":1,"id":168,"name":"minecraft:prismarine","runtimeID":1421},{"data":2,"id":168,"name":"minecraft:prismarine","runtimeID":1422},{"data":3,"id":168,"name":"minecraft:prismarine","runtimeID":1423},{"data":0,"id":169,"name":"minecraft:seaLantern","runtimeID":1424},{"data":0,"id":170,"name":"minecraft:hay_block","runtimeID":1425},{"data":1,"id":170,"name":"minecraft:hay_block","runtimeID":1426},{"data":2,"id":170,"name":"minecraft:hay_block","runtimeID":1427},{"data":3,"id":170,"name":"minecraft:hay_block","runtimeID":1428},{"data":4,"id":170,"name":"minecraft:hay_block","runtimeID":1429},{"data":5,"id":170,"name":"minecraft:hay_block","runtimeID":1430},{"data":6,"id":170,"name":"minecraft:hay_block","runtimeID":1431},{"data":7,"id":170,"name":"minecraft:hay_block","runtimeID":1432},{"data":8,"id":170,"name":"minecraft:hay_block","runtimeID":1433},{"data":9,"id":170,"name":"minecraft:hay_block","runtimeID":1434},{"data":10,"id":170,"name":"minecraft:hay_block","runtimeID":1435},{"data":11,"id":170,"name":"minecraft:hay_block","runtimeID":1436},{"data":12,"id":170,"name":"minecraft:hay_block","runtimeID":1437},{"data":13,"id":170,"name":"minecraft:hay_block","runtimeID":1438},{"data":14,"id":170,"name":"minecraft:hay_block","runtimeID":1439},{"data":15,"id":170,"name":"minecraft:hay_block","runtimeID":1440},{"data":0,"id":171,"name":"minecraft:carpet","runtimeID":1441},{"data":1,"id":171,"name":"minecraft:carpet","runtimeID":1442},{"data":2,"id":171,"name":"minecraft:carpet","runtimeID":1443},{"data":3,"id":171,"name":"minecraft:carpet","runtimeID":1444},{"data":4,"id":171,"name":"minecraft:carpet","runtimeID":1445},{"data":5,"id":171,"name":"minecraft:carpet","runtimeID":1446},{"data":6,"id":171,"name":"minecraft:carpet","runtimeID":1447},{"data":7,"id":171,"name":"minecraft:carpet","runtimeID":1448},{"data":8,"id":171,"name":"minecraft:carpet","runtimeID":1449},{"data":9,"id":171,"name":"minecraft:carpet","runtimeID":1450},{"data":10,"id":171,"name":"minecraft:carpet","runtimeID":1451},{"data":11,"id":171,"name":"minecraft:carpet","runtimeID":1452},{"data":12,"id":171,"name":"minecraft:carpet","runtimeID":1453},{"data":13,"id":171,"name":"minecraft:carpet","runtimeID":1454},{"data":14,"id":171,"name":"minecraft:carpet","runtimeID":1455},{"data":15,"id":171,"name":"minecraft:carpet","runtimeID":1456},{"data":0,"id":172,"name":"minecraft:hardened_clay","runtimeID":1457},{"data":0,"id":173,"name":"minecraft:coal_block","runtimeID":1458},{"data":0,"id":174,"name":"minecraft:packed_ice","runtimeID":1459},{"data":0,"id":175,"name":"minecraft:double_plant","runtimeID":1460},{"data":1,"id":175,"name":"minecraft:double_plant","runtimeID":1461},{"data":2,"id":175,"name":"minecraft:double_plant","runtimeID":1462},{"data":3,"id":175,"name":"minecraft:double_plant","runtimeID":1463},{"data":4,"id":175,"name":"minecraft:double_plant","runtimeID":1464},{"data":5,"id":175,"name":"minecraft:double_plant","runtimeID":1465},{"data":6,"id":175,"name":"minecraft:double_plant","runtimeID":1466},{"data":7,"id":175,"name":"minecraft:double_plant","runtimeID":1467},{"data":8,"id":175,"name":"minecraft:double_plant","runtimeID":1468},{"data":9,"id":175,"name":"minecraft:double_plant","runtimeID":1469},{"data":10,"id":175,"name":"minecraft:double_plant","runtimeID":1470},{"data":11,"id":175,"name":"minecraft:double_plant","runtimeID":1471},{"data":12,"id":175,"name":"minecraft:double_plant","runtimeID":1472},{"data":13,"id":175,"name":"minecraft:double_plant","runtimeID":1473},{"data":14,"id":175,"name":"minecraft:double_plant","runtimeID":1474},{"data":15,"id":175,"name":"minecraft:double_plant","runtimeID":1475},{"data":0,"id":176,"name":"minecraft:standing_banner","runtimeID":1476},{"data":1,"id":176,"name":"minecraft:standing_banner","runtimeID":1477},{"data":2,"id":176,"name":"minecraft:standing_banner","runtimeID":1478},{"data":3,"id":176,"name":"minecraft:standing_banner","runtimeID":1479},{"data":4,"id":176,"name":"minecraft:standing_banner","runtimeID":1480},{"data":5,"id":176,"name":"minecraft:standing_banner","runtimeID":1481},{"data":6,"id":176,"name":"minecraft:standing_banner","runtimeID":1482},{"data":7,"id":176,"name":"minecraft:standing_banner","runtimeID":1483},{"data":8,"id":176,"name":"minecraft:standing_banner","runtimeID":1484},{"data":9,"id":176,"name":"minecraft:standing_banner","runtimeID":1485},{"data":10,"id":176,"name":"minecraft:standing_banner","runtimeID":1486},{"data":11,"id":176,"name":"minecraft:standing_banner","runtimeID":1487},{"data":12,"id":176,"name":"minecraft:standing_banner","runtimeID":1488},{"data":13,"id":176,"name":"minecraft:standing_banner","runtimeID":1489},{"data":14,"id":176,"name":"minecraft:standing_banner","runtimeID":1490},{"data":15,"id":176,"name":"minecraft:standing_banner","runtimeID":1491},{"data":0,"id":177,"name":"minecraft:wall_banner","runtimeID":1492},{"data":1,"id":177,"name":"minecraft:wall_banner","runtimeID":1493},{"data":2,"id":177,"name":"minecraft:wall_banner","runtimeID":1494},{"data":3,"id":177,"name":"minecraft:wall_banner","runtimeID":1495},{"data":4,"id":177,"name":"minecraft:wall_banner","runtimeID":1496},{"data":5,"id":177,"name":"minecraft:wall_banner","runtimeID":1497},{"data":6,"id":177,"name":"minecraft:wall_banner","runtimeID":1498},{"data":7,"id":177,"name":"minecraft:wall_banner","runtimeID":1499},{"data":0,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1500},{"data":1,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1501},{"data":2,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1502},{"data":3,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1503},{"data":4,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1504},{"data":5,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1505},{"data":6,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1506},{"data":7,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1507},{"data":8,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1508},{"data":9,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1509},{"data":10,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1510},{"data":11,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1511},{"data":12,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1512},{"data":13,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1513},{"data":14,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1514},{"data":15,"id":178,"name":"minecraft:daylight_detector_inverted","runtimeID":1515},{"data":0,"id":179,"name":"minecraft:red_sandstone","runtimeID":1516},{"data":1,"id":179,"name":"minecraft:red_sandstone","runtimeID":1517},{"data":2,"id":179,"name":"minecraft:red_sandstone","runtimeID":1518},{"data":3,"id":179,"name":"minecraft:red_sandstone","runtimeID":1519},{"data":0,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1520},{"data":1,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1521},{"data":2,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1522},{"data":3,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1523},{"data":4,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1524},{"data":5,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1525},{"data":6,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1526},{"data":7,"id":180,"name":"minecraft:red_sandstone_stairs","runtimeID":1527},{"data":0,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1528},{"data":1,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1529},{"data":2,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1530},{"data":3,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1531},{"data":4,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1532},{"data":5,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1533},{"data":6,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1534},{"data":7,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1535},{"data":8,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1536},{"data":9,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1537},{"data":10,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1538},{"data":11,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1539},{"data":12,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1540},{"data":13,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1541},{"data":14,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1542},{"data":15,"id":181,"name":"minecraft:double_stone_slab2","runtimeID":1543},{"data":0,"id":182,"name":"minecraft:stone_slab2","runtimeID":1544},{"data":1,"id":182,"name":"minecraft:stone_slab2","runtimeID":1545},{"data":2,"id":182,"name":"minecraft:stone_slab2","runtimeID":1546},{"data":3,"id":182,"name":"minecraft:stone_slab2","runtimeID":1547},{"data":4,"id":182,"name":"minecraft:stone_slab2","runtimeID":1548},{"data":5,"id":182,"name":"minecraft:stone_slab2","runtimeID":1549},{"data":6,"id":182,"name":"minecraft:stone_slab2","runtimeID":1550},{"data":7,"id":182,"name":"minecraft:stone_slab2","runtimeID":1551},{"data":8,"id":182,"name":"minecraft:stone_slab2","runtimeID":1552},{"data":9,"id":182,"name":"minecraft:stone_slab2","runtimeID":1553},{"data":10,"id":182,"name":"minecraft:stone_slab2","runtimeID":1554},{"data":11,"id":182,"name":"minecraft:stone_slab2","runtimeID":1555},{"data":12,"id":182,"name":"minecraft:stone_slab2","runtimeID":1556},{"data":13,"id":182,"name":"minecraft:stone_slab2","runtimeID":1557},{"data":14,"id":182,"name":"minecraft:stone_slab2","runtimeID":1558},{"data":15,"id":182,"name":"minecraft:stone_slab2","runtimeID":1559},{"data":0,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1560},{"data":1,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1561},{"data":2,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1562},{"data":3,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1563},{"data":4,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1564},{"data":5,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1565},{"data":6,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1566},{"data":7,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1567},{"data":8,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1568},{"data":9,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1569},{"data":10,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1570},{"data":11,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1571},{"data":12,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1572},{"data":13,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1573},{"data":14,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1574},{"data":15,"id":183,"name":"minecraft:spruce_fence_gate","runtimeID":1575},{"data":0,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1576},{"data":1,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1577},{"data":2,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1578},{"data":3,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1579},{"data":4,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1580},{"data":5,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1581},{"data":6,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1582},{"data":7,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1583},{"data":8,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1584},{"data":9,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1585},{"data":10,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1586},{"data":11,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1587},{"data":12,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1588},{"data":13,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1589},{"data":14,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1590},{"data":15,"id":184,"name":"minecraft:birch_fence_gate","runtimeID":1591},{"data":0,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1592},{"data":1,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1593},{"data":2,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1594},{"data":3,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1595},{"data":4,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1596},{"data":5,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1597},{"data":6,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1598},{"data":7,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1599},{"data":8,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1600},{"data":9,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1601},{"data":10,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1602},{"data":11,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1603},{"data":12,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1604},{"data":13,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1605},{"data":14,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1606},{"data":15,"id":185,"name":"minecraft:jungle_fence_gate","runtimeID":1607},{"data":0,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1608},{"data":1,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1609},{"data":2,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1610},{"data":3,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1611},{"data":4,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1612},{"data":5,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1613},{"data":6,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1614},{"data":7,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1615},{"data":8,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1616},{"data":9,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1617},{"data":10,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1618},{"data":11,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1619},{"data":12,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1620},{"data":13,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1621},{"data":14,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1622},{"data":15,"id":186,"name":"minecraft:dark_oak_fence_gate","runtimeID":1623},{"data":0,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1624},{"data":1,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1625},{"data":2,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1626},{"data":3,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1627},{"data":4,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1628},{"data":5,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1629},{"data":6,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1630},{"data":7,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1631},{"data":8,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1632},{"data":9,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1633},{"data":10,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1634},{"data":11,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1635},{"data":12,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1636},{"data":13,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1637},{"data":14,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1638},{"data":15,"id":187,"name":"minecraft:acacia_fence_gate","runtimeID":1639},{"data":0,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1640},{"data":1,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1641},{"data":2,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1642},{"data":3,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1643},{"data":4,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1644},{"data":5,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1645},{"data":6,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1646},{"data":7,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1647},{"data":8,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1648},{"data":9,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1649},{"data":10,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1650},{"data":11,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1651},{"data":12,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1652},{"data":13,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1653},{"data":14,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1654},{"data":15,"id":188,"name":"minecraft:repeating_command_block","runtimeID":1655},{"data":0,"id":189,"name":"minecraft:chain_command_block","runtimeID":1656},{"data":1,"id":189,"name":"minecraft:chain_command_block","runtimeID":1657},{"data":2,"id":189,"name":"minecraft:chain_command_block","runtimeID":1658},{"data":3,"id":189,"name":"minecraft:chain_command_block","runtimeID":1659},{"data":4,"id":189,"name":"minecraft:chain_command_block","runtimeID":1660},{"data":5,"id":189,"name":"minecraft:chain_command_block","runtimeID":1661},{"data":6,"id":189,"name":"minecraft:chain_command_block","runtimeID":1662},{"data":7,"id":189,"name":"minecraft:chain_command_block","runtimeID":1663},{"data":8,"id":189,"name":"minecraft:chain_command_block","runtimeID":1664},{"data":9,"id":189,"name":"minecraft:chain_command_block","runtimeID":1665},{"data":10,"id":189,"name":"minecraft:chain_command_block","runtimeID":1666},{"data":11,"id":189,"name":"minecraft:chain_command_block","runtimeID":1667},{"data":12,"id":189,"name":"minecraft:chain_command_block","runtimeID":1668},{"data":13,"id":189,"name":"minecraft:chain_command_block","runtimeID":1669},{"data":14,"id":189,"name":"minecraft:chain_command_block","runtimeID":1670},{"data":15,"id":189,"name":"minecraft:chain_command_block","runtimeID":1671},{"data":0,"id":190,"name":"minecraft:hard_glass_pane","runtimeID":1672},{"data":0,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1673},{"data":1,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1674},{"data":2,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1675},{"data":3,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1676},{"data":4,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1677},{"data":5,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1678},{"data":6,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1679},{"data":7,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1680},{"data":8,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1681},{"data":9,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1682},{"data":10,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1683},{"data":11,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1684},{"data":12,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1685},{"data":13,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1686},{"data":14,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1687},{"data":15,"id":191,"name":"minecraft:hard_stained_glass_pane","runtimeID":1688},{"data":0,"id":192,"name":"minecraft:chemical_heat","runtimeID":1689},{"data":0,"id":193,"name":"minecraft:spruce_door","runtimeID":1690},{"data":1,"id":193,"name":"minecraft:spruce_door","runtimeID":1691},{"data":2,"id":193,"name":"minecraft:spruce_door","runtimeID":1692},{"data":3,"id":193,"name":"minecraft:spruce_door","runtimeID":1693},{"data":4,"id":193,"name":"minecraft:spruce_door","runtimeID":1694},{"data":5,"id":193,"name":"minecraft:spruce_door","runtimeID":1695},{"data":6,"id":193,"name":"minecraft:spruce_door","runtimeID":1696},{"data":7,"id":193,"name":"minecraft:spruce_door","runtimeID":1697},{"data":8,"id":193,"name":"minecraft:spruce_door","runtimeID":1698},{"data":9,"id":193,"name":"minecraft:spruce_door","runtimeID":1699},{"data":10,"id":193,"name":"minecraft:spruce_door","runtimeID":1700},{"data":11,"id":193,"name":"minecraft:spruce_door","runtimeID":1701},{"data":12,"id":193,"name":"minecraft:spruce_door","runtimeID":1702},{"data":13,"id":193,"name":"minecraft:spruce_door","runtimeID":1703},{"data":14,"id":193,"name":"minecraft:spruce_door","runtimeID":1704},{"data":15,"id":193,"name":"minecraft:spruce_door","runtimeID":1705},{"data":0,"id":194,"name":"minecraft:birch_door","runtimeID":1706},{"data":1,"id":194,"name":"minecraft:birch_door","runtimeID":1707},{"data":2,"id":194,"name":"minecraft:birch_door","runtimeID":1708},{"data":3,"id":194,"name":"minecraft:birch_door","runtimeID":1709},{"data":4,"id":194,"name":"minecraft:birch_door","runtimeID":1710},{"data":5,"id":194,"name":"minecraft:birch_door","runtimeID":1711},{"data":6,"id":194,"name":"minecraft:birch_door","runtimeID":1712},{"data":7,"id":194,"name":"minecraft:birch_door","runtimeID":1713},{"data":8,"id":194,"name":"minecraft:birch_door","runtimeID":1714},{"data":9,"id":194,"name":"minecraft:birch_door","runtimeID":1715},{"data":10,"id":194,"name":"minecraft:birch_door","runtimeID":1716},{"data":11,"id":194,"name":"minecraft:birch_door","runtimeID":1717},{"data":12,"id":194,"name":"minecraft:birch_door","runtimeID":1718},{"data":13,"id":194,"name":"minecraft:birch_door","runtimeID":1719},{"data":14,"id":194,"name":"minecraft:birch_door","runtimeID":1720},{"data":15,"id":194,"name":"minecraft:birch_door","runtimeID":1721},{"data":0,"id":195,"name":"minecraft:jungle_door","runtimeID":1722},{"data":1,"id":195,"name":"minecraft:jungle_door","runtimeID":1723},{"data":2,"id":195,"name":"minecraft:jungle_door","runtimeID":1724},{"data":3,"id":195,"name":"minecraft:jungle_door","runtimeID":1725},{"data":4,"id":195,"name":"minecraft:jungle_door","runtimeID":1726},{"data":5,"id":195,"name":"minecraft:jungle_door","runtimeID":1727},{"data":6,"id":195,"name":"minecraft:jungle_door","runtimeID":1728},{"data":7,"id":195,"name":"minecraft:jungle_door","runtimeID":1729},{"data":8,"id":195,"name":"minecraft:jungle_door","runtimeID":1730},{"data":9,"id":195,"name":"minecraft:jungle_door","runtimeID":1731},{"data":10,"id":195,"name":"minecraft:jungle_door","runtimeID":1732},{"data":11,"id":195,"name":"minecraft:jungle_door","runtimeID":1733},{"data":12,"id":195,"name":"minecraft:jungle_door","runtimeID":1734},{"data":13,"id":195,"name":"minecraft:jungle_door","runtimeID":1735},{"data":14,"id":195,"name":"minecraft:jungle_door","runtimeID":1736},{"data":15,"id":195,"name":"minecraft:jungle_door","runtimeID":1737},{"data":0,"id":196,"name":"minecraft:acacia_door","runtimeID":1738},{"data":1,"id":196,"name":"minecraft:acacia_door","runtimeID":1739},{"data":2,"id":196,"name":"minecraft:acacia_door","runtimeID":1740},{"data":3,"id":196,"name":"minecraft:acacia_door","runtimeID":1741},{"data":4,"id":196,"name":"minecraft:acacia_door","runtimeID":1742},{"data":5,"id":196,"name":"minecraft:acacia_door","runtimeID":1743},{"data":6,"id":196,"name":"minecraft:acacia_door","runtimeID":1744},{"data":7,"id":196,"name":"minecraft:acacia_door","runtimeID":1745},{"data":8,"id":196,"name":"minecraft:acacia_door","runtimeID":1746},{"data":9,"id":196,"name":"minecraft:acacia_door","runtimeID":1747},{"data":10,"id":196,"name":"minecraft:acacia_door","runtimeID":1748},{"data":11,"id":196,"name":"minecraft:acacia_door","runtimeID":1749},{"data":12,"id":196,"name":"minecraft:acacia_door","runtimeID":1750},{"data":13,"id":196,"name":"minecraft:acacia_door","runtimeID":1751},{"data":14,"id":196,"name":"minecraft:acacia_door","runtimeID":1752},{"data":15,"id":196,"name":"minecraft:acacia_door","runtimeID":1753},{"data":0,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1754},{"data":1,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1755},{"data":2,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1756},{"data":3,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1757},{"data":4,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1758},{"data":5,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1759},{"data":6,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1760},{"data":7,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1761},{"data":8,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1762},{"data":9,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1763},{"data":10,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1764},{"data":11,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1765},{"data":12,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1766},{"data":13,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1767},{"data":14,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1768},{"data":15,"id":197,"name":"minecraft:dark_oak_door","runtimeID":1769},{"data":0,"id":198,"name":"minecraft:grass_path","runtimeID":1770},{"data":0,"id":199,"name":"minecraft:frame","runtimeID":1771},{"data":1,"id":199,"name":"minecraft:frame","runtimeID":1772},{"data":2,"id":199,"name":"minecraft:frame","runtimeID":1773},{"data":3,"id":199,"name":"minecraft:frame","runtimeID":1774},{"data":4,"id":199,"name":"minecraft:frame","runtimeID":1775},{"data":5,"id":199,"name":"minecraft:frame","runtimeID":1776},{"data":6,"id":199,"name":"minecraft:frame","runtimeID":1777},{"data":7,"id":199,"name":"minecraft:frame","runtimeID":1778},{"data":0,"id":200,"name":"minecraft:chorus_flower","runtimeID":1779},{"data":1,"id":200,"name":"minecraft:chorus_flower","runtimeID":1780},{"data":2,"id":200,"name":"minecraft:chorus_flower","runtimeID":1781},{"data":3,"id":200,"name":"minecraft:chorus_flower","runtimeID":1782},{"data":4,"id":200,"name":"minecraft:chorus_flower","runtimeID":1783},{"data":5,"id":200,"name":"minecraft:chorus_flower","runtimeID":1784},{"data":6,"id":200,"name":"minecraft:chorus_flower","runtimeID":1785},{"data":7,"id":200,"name":"minecraft:chorus_flower","runtimeID":1786},{"data":0,"id":201,"name":"minecraft:purpur_block","runtimeID":1787},{"data":1,"id":201,"name":"minecraft:purpur_block","runtimeID":1788},{"data":2,"id":201,"name":"minecraft:purpur_block","runtimeID":1789},{"data":3,"id":201,"name":"minecraft:purpur_block","runtimeID":1790},{"data":4,"id":201,"name":"minecraft:purpur_block","runtimeID":1791},{"data":5,"id":201,"name":"minecraft:purpur_block","runtimeID":1792},{"data":6,"id":201,"name":"minecraft:purpur_block","runtimeID":1793},{"data":7,"id":201,"name":"minecraft:purpur_block","runtimeID":1794},{"data":8,"id":201,"name":"minecraft:purpur_block","runtimeID":1795},{"data":9,"id":201,"name":"minecraft:purpur_block","runtimeID":1796},{"data":10,"id":201,"name":"minecraft:purpur_block","runtimeID":1797},{"data":11,"id":201,"name":"minecraft:purpur_block","runtimeID":1798},{"data":12,"id":201,"name":"minecraft:purpur_block","runtimeID":1799},{"data":13,"id":201,"name":"minecraft:purpur_block","runtimeID":1800},{"data":14,"id":201,"name":"minecraft:purpur_block","runtimeID":1801},{"data":15,"id":201,"name":"minecraft:purpur_block","runtimeID":1802},{"data":0,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1803},{"data":1,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1804},{"data":2,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1805},{"data":3,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1806},{"data":4,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1807},{"data":5,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1808},{"data":6,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1809},{"data":7,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1810},{"data":8,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1811},{"data":9,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1812},{"data":10,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1813},{"data":11,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1814},{"data":12,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1815},{"data":13,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1816},{"data":14,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1817},{"data":15,"id":202,"name":"minecraft:colored_torch_rg","runtimeID":1818},{"data":0,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1819},{"data":1,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1820},{"data":2,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1821},{"data":3,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1822},{"data":4,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1823},{"data":5,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1824},{"data":6,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1825},{"data":7,"id":203,"name":"minecraft:purpur_stairs","runtimeID":1826},{"data":0,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1827},{"data":1,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1828},{"data":2,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1829},{"data":3,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1830},{"data":4,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1831},{"data":5,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1832},{"data":6,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1833},{"data":7,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1834},{"data":8,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1835},{"data":9,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1836},{"data":10,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1837},{"data":11,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1838},{"data":12,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1839},{"data":13,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1840},{"data":14,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1841},{"data":15,"id":204,"name":"minecraft:colored_torch_bp","runtimeID":1842},{"data":0,"id":205,"name":"minecraft:undyed_shulker_box","runtimeID":1843},{"data":0,"id":206,"name":"minecraft:end_bricks","runtimeID":1844},{"data":0,"id":207,"name":"minecraft:frosted_ice","runtimeID":1845},{"data":1,"id":207,"name":"minecraft:frosted_ice","runtimeID":1846},{"data":2,"id":207,"name":"minecraft:frosted_ice","runtimeID":1847},{"data":3,"id":207,"name":"minecraft:frosted_ice","runtimeID":1848},{"data":0,"id":208,"name":"minecraft:end_rod","runtimeID":1849},{"data":1,"id":208,"name":"minecraft:end_rod","runtimeID":1850},{"data":2,"id":208,"name":"minecraft:end_rod","runtimeID":1851},{"data":3,"id":208,"name":"minecraft:end_rod","runtimeID":1852},{"data":4,"id":208,"name":"minecraft:end_rod","runtimeID":1853},{"data":5,"id":208,"name":"minecraft:end_rod","runtimeID":1854},{"data":6,"id":208,"name":"minecraft:end_rod","runtimeID":1855},{"data":7,"id":208,"name":"minecraft:end_rod","runtimeID":1856},{"data":0,"id":209,"name":"minecraft:end_gateway","runtimeID":1857},{"data":0,"id":213,"name":"minecraft:magma","runtimeID":1861},{"data":0,"id":214,"name":"minecraft:nether_wart_block","runtimeID":1862},{"data":0,"id":215,"name":"minecraft:red_nether_brick","runtimeID":1863},{"data":0,"id":216,"name":"minecraft:bone_block","runtimeID":1864},{"data":1,"id":216,"name":"minecraft:bone_block","runtimeID":1865},{"data":2,"id":216,"name":"minecraft:bone_block","runtimeID":1866},{"data":3,"id":216,"name":"minecraft:bone_block","runtimeID":1867},{"data":4,"id":216,"name":"minecraft:bone_block","runtimeID":1868},{"data":5,"id":216,"name":"minecraft:bone_block","runtimeID":1869},{"data":6,"id":216,"name":"minecraft:bone_block","runtimeID":1870},{"data":7,"id":216,"name":"minecraft:bone_block","runtimeID":1871},{"data":8,"id":216,"name":"minecraft:bone_block","runtimeID":1872},{"data":9,"id":216,"name":"minecraft:bone_block","runtimeID":1873},{"data":10,"id":216,"name":"minecraft:bone_block","runtimeID":1874},{"data":11,"id":216,"name":"minecraft:bone_block","runtimeID":1875},{"data":12,"id":216,"name":"minecraft:bone_block","runtimeID":1876},{"data":13,"id":216,"name":"minecraft:bone_block","runtimeID":1877},{"data":14,"id":216,"name":"minecraft:bone_block","runtimeID":1878},{"data":15,"id":216,"name":"minecraft:bone_block","runtimeID":1879},{"data":0,"id":218,"name":"minecraft:shulker_box","runtimeID":1881},{"data":1,"id":218,"name":"minecraft:shulker_box","runtimeID":1882},{"data":2,"id":218,"name":"minecraft:shulker_box","runtimeID":1883},{"data":3,"id":218,"name":"minecraft:shulker_box","runtimeID":1884},{"data":4,"id":218,"name":"minecraft:shulker_box","runtimeID":1885},{"data":5,"id":218,"name":"minecraft:shulker_box","runtimeID":1886},{"data":6,"id":218,"name":"minecraft:shulker_box","runtimeID":1887},{"data":7,"id":218,"name":"minecraft:shulker_box","runtimeID":1888},{"data":8,"id":218,"name":"minecraft:shulker_box","runtimeID":1889},{"data":9,"id":218,"name":"minecraft:shulker_box","runtimeID":1890},{"data":10,"id":218,"name":"minecraft:shulker_box","runtimeID":1891},{"data":11,"id":218,"name":"minecraft:shulker_box","runtimeID":1892},{"data":12,"id":218,"name":"minecraft:shulker_box","runtimeID":1893},{"data":13,"id":218,"name":"minecraft:shulker_box","runtimeID":1894},{"data":14,"id":218,"name":"minecraft:shulker_box","runtimeID":1895},{"data":15,"id":218,"name":"minecraft:shulker_box","runtimeID":1896},{"data":0,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1897},{"data":1,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1898},{"data":2,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1899},{"data":3,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1900},{"data":4,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1901},{"data":5,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1902},{"data":6,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1903},{"data":7,"id":219,"name":"minecraft:purple_glazed_terracotta","runtimeID":1904},{"data":0,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1905},{"data":1,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1906},{"data":2,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1907},{"data":3,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1908},{"data":4,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1909},{"data":5,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1910},{"data":6,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1911},{"data":7,"id":220,"name":"minecraft:white_glazed_terracotta","runtimeID":1912},{"data":0,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1913},{"data":1,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1914},{"data":2,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1915},{"data":3,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1916},{"data":4,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1917},{"data":5,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1918},{"data":6,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1919},{"data":7,"id":221,"name":"minecraft:orange_glazed_terracotta","runtimeID":1920},{"data":0,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1921},{"data":1,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1922},{"data":2,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1923},{"data":3,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1924},{"data":4,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1925},{"data":5,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1926},{"data":6,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1927},{"data":7,"id":222,"name":"minecraft:magenta_glazed_terracotta","runtimeID":1928},{"data":0,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1929},{"data":1,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1930},{"data":2,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1931},{"data":3,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1932},{"data":4,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1933},{"data":5,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1934},{"data":6,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1935},{"data":7,"id":223,"name":"minecraft:light_blue_glazed_terracotta","runtimeID":1936},{"data":0,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1937},{"data":1,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1938},{"data":2,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1939},{"data":3,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1940},{"data":4,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1941},{"data":5,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1942},{"data":6,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1943},{"data":7,"id":224,"name":"minecraft:yellow_glazed_terracotta","runtimeID":1944},{"data":0,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1945},{"data":1,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1946},{"data":2,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1947},{"data":3,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1948},{"data":4,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1949},{"data":5,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1950},{"data":6,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1951},{"data":7,"id":225,"name":"minecraft:lime_glazed_terracotta","runtimeID":1952},{"data":0,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1953},{"data":1,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1954},{"data":2,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1955},{"data":3,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1956},{"data":4,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1957},{"data":5,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1958},{"data":6,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1959},{"data":7,"id":226,"name":"minecraft:pink_glazed_terracotta","runtimeID":1960},{"data":0,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1961},{"data":1,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1962},{"data":2,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1963},{"data":3,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1964},{"data":4,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1965},{"data":5,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1966},{"data":6,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1967},{"data":7,"id":227,"name":"minecraft:gray_glazed_terracotta","runtimeID":1968},{"data":0,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1969},{"data":1,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1970},{"data":2,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1971},{"data":3,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1972},{"data":4,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1973},{"data":5,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1974},{"data":6,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1975},{"data":7,"id":228,"name":"minecraft:silver_glazed_terracotta","runtimeID":1976},{"data":0,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1977},{"data":1,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1978},{"data":2,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1979},{"data":3,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1980},{"data":4,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1981},{"data":5,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1982},{"data":6,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1983},{"data":7,"id":229,"name":"minecraft:cyan_glazed_terracotta","runtimeID":1984},{"data":0,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1986},{"data":1,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1987},{"data":2,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1988},{"data":3,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1989},{"data":4,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1990},{"data":5,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1991},{"data":6,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1992},{"data":7,"id":231,"name":"minecraft:blue_glazed_terracotta","runtimeID":1993},{"data":0,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1994},{"data":1,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1995},{"data":2,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1996},{"data":3,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1997},{"data":4,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1998},{"data":5,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":1999},{"data":6,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":2000},{"data":7,"id":232,"name":"minecraft:brown_glazed_terracotta","runtimeID":2001},{"data":0,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2002},{"data":1,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2003},{"data":2,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2004},{"data":3,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2005},{"data":4,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2006},{"data":5,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2007},{"data":6,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2008},{"data":7,"id":233,"name":"minecraft:green_glazed_terracotta","runtimeID":2009},{"data":0,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2010},{"data":1,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2011},{"data":2,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2012},{"data":3,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2013},{"data":4,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2014},{"data":5,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2015},{"data":6,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2016},{"data":7,"id":234,"name":"minecraft:red_glazed_terracotta","runtimeID":2017},{"data":0,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2018},{"data":1,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2019},{"data":2,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2020},{"data":3,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2021},{"data":4,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2022},{"data":5,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2023},{"data":6,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2024},{"data":7,"id":235,"name":"minecraft:black_glazed_terracotta","runtimeID":2025},{"data":0,"id":236,"name":"minecraft:concrete","runtimeID":2026},{"data":1,"id":236,"name":"minecraft:concrete","runtimeID":2027},{"data":2,"id":236,"name":"minecraft:concrete","runtimeID":2028},{"data":3,"id":236,"name":"minecraft:concrete","runtimeID":2029},{"data":4,"id":236,"name":"minecraft:concrete","runtimeID":2030},{"data":5,"id":236,"name":"minecraft:concrete","runtimeID":2031},{"data":6,"id":236,"name":"minecraft:concrete","runtimeID":2032},{"data":7,"id":236,"name":"minecraft:concrete","runtimeID":2033},{"data":8,"id":236,"name":"minecraft:concrete","runtimeID":2034},{"data":9,"id":236,"name":"minecraft:concrete","runtimeID":2035},{"data":10,"id":236,"name":"minecraft:concrete","runtimeID":2036},{"data":11,"id":236,"name":"minecraft:concrete","runtimeID":2037},{"data":12,"id":236,"name":"minecraft:concrete","runtimeID":2038},{"data":13,"id":236,"name":"minecraft:concrete","runtimeID":2039},{"data":14,"id":236,"name":"minecraft:concrete","runtimeID":2040},{"data":15,"id":236,"name":"minecraft:concrete","runtimeID":2041},{"data":0,"id":237,"name":"minecraft:concretePowder","runtimeID":2042},{"data":1,"id":237,"name":"minecraft:concretePowder","runtimeID":2043},{"data":2,"id":237,"name":"minecraft:concretePowder","runtimeID":2044},{"data":3,"id":237,"name":"minecraft:concretePowder","runtimeID":2045},{"data":4,"id":237,"name":"minecraft:concretePowder","runtimeID":2046},{"data":5,"id":237,"name":"minecraft:concretePowder","runtimeID":2047},{"data":6,"id":237,"name":"minecraft:concretePowder","runtimeID":2048},{"data":7,"id":237,"name":"minecraft:concretePowder","runtimeID":2049},{"data":8,"id":237,"name":"minecraft:concretePowder","runtimeID":2050},{"data":9,"id":237,"name":"minecraft:concretePowder","runtimeID":2051},{"data":10,"id":237,"name":"minecraft:concretePowder","runtimeID":2052},{"data":11,"id":237,"name":"minecraft:concretePowder","runtimeID":2053},{"data":12,"id":237,"name":"minecraft:concretePowder","runtimeID":2054},{"data":13,"id":237,"name":"minecraft:concretePowder","runtimeID":2055},{"data":14,"id":237,"name":"minecraft:concretePowder","runtimeID":2056},{"data":15,"id":237,"name":"minecraft:concretePowder","runtimeID":2057},{"data":0,"id":238,"name":"minecraft:chemistry_table","runtimeID":2058},{"data":1,"id":238,"name":"minecraft:chemistry_table","runtimeID":2059},{"data":2,"id":238,"name":"minecraft:chemistry_table","runtimeID":2060},{"data":3,"id":238,"name":"minecraft:chemistry_table","runtimeID":2061},{"data":4,"id":238,"name":"minecraft:chemistry_table","runtimeID":2062},{"data":5,"id":238,"name":"minecraft:chemistry_table","runtimeID":2063},{"data":6,"id":238,"name":"minecraft:chemistry_table","runtimeID":2064},{"data":7,"id":238,"name":"minecraft:chemistry_table","runtimeID":2065},{"data":8,"id":238,"name":"minecraft:chemistry_table","runtimeID":2066},{"data":9,"id":238,"name":"minecraft:chemistry_table","runtimeID":2067},{"data":10,"id":238,"name":"minecraft:chemistry_table","runtimeID":2068},{"data":11,"id":238,"name":"minecraft:chemistry_table","runtimeID":2069},{"data":12,"id":238,"name":"minecraft:chemistry_table","runtimeID":2070},{"data":13,"id":238,"name":"minecraft:chemistry_table","runtimeID":2071},{"data":14,"id":238,"name":"minecraft:chemistry_table","runtimeID":2072},{"data":15,"id":238,"name":"minecraft:chemistry_table","runtimeID":2073},{"data":0,"id":239,"name":"minecraft:underwater_torch","runtimeID":2074},{"data":1,"id":239,"name":"minecraft:underwater_torch","runtimeID":2075},{"data":2,"id":239,"name":"minecraft:underwater_torch","runtimeID":2076},{"data":3,"id":239,"name":"minecraft:underwater_torch","runtimeID":2077},{"data":4,"id":239,"name":"minecraft:underwater_torch","runtimeID":2078},{"data":5,"id":239,"name":"minecraft:underwater_torch","runtimeID":2079},{"data":6,"id":239,"name":"minecraft:underwater_torch","runtimeID":2080},{"data":7,"id":239,"name":"minecraft:underwater_torch","runtimeID":2081},{"data":0,"id":240,"name":"minecraft:chorus_plant","runtimeID":2082},{"data":0,"id":241,"name":"minecraft:stained_glass","runtimeID":2083},{"data":1,"id":241,"name":"minecraft:stained_glass","runtimeID":2084},{"data":2,"id":241,"name":"minecraft:stained_glass","runtimeID":2085},{"data":3,"id":241,"name":"minecraft:stained_glass","runtimeID":2086},{"data":4,"id":241,"name":"minecraft:stained_glass","runtimeID":2087},{"data":5,"id":241,"name":"minecraft:stained_glass","runtimeID":2088},{"data":6,"id":241,"name":"minecraft:stained_glass","runtimeID":2089},{"data":7,"id":241,"name":"minecraft:stained_glass","runtimeID":2090},{"data":8,"id":241,"name":"minecraft:stained_glass","runtimeID":2091},{"data":9,"id":241,"name":"minecraft:stained_glass","runtimeID":2092},{"data":10,"id":241,"name":"minecraft:stained_glass","runtimeID":2093},{"data":11,"id":241,"name":"minecraft:stained_glass","runtimeID":2094},{"data":12,"id":241,"name":"minecraft:stained_glass","runtimeID":2095},{"data":13,"id":241,"name":"minecraft:stained_glass","runtimeID":2096},{"data":14,"id":241,"name":"minecraft:stained_glass","runtimeID":2097},{"data":15,"id":241,"name":"minecraft:stained_glass","runtimeID":2098},{"data":0,"id":243,"name":"minecraft:podzol","runtimeID":2100},{"data":0,"id":244,"name":"minecraft:beetroot","runtimeID":2101},{"data":1,"id":244,"name":"minecraft:beetroot","runtimeID":2102},{"data":2,"id":244,"name":"minecraft:beetroot","runtimeID":2103},{"data":3,"id":244,"name":"minecraft:beetroot","runtimeID":2104},{"data":4,"id":244,"name":"minecraft:beetroot","runtimeID":2105},{"data":5,"id":244,"name":"minecraft:beetroot","runtimeID":2106},{"data":6,"id":244,"name":"minecraft:beetroot","runtimeID":2107},{"data":7,"id":244,"name":"minecraft:beetroot","runtimeID":2108},{"data":0,"id":245,"name":"minecraft:stonecutter","runtimeID":2109},{"data":0,"id":246,"name":"minecraft:glowingobsidian","runtimeID":2110},{"data":0,"id":247,"name":"minecraft:netherreactor","runtimeID":2111},{"data":0,"id":248,"name":"minecraft:info_update","runtimeID":2112},{"data":0,"id":249,"name":"minecraft:info_update2","runtimeID":2113},{"data":0,"id":250,"name":"minecraft:movingBlock","runtimeID":2114},{"data":0,"id":251,"name":"minecraft:observer","runtimeID":2115},{"data":1,"id":251,"name":"minecraft:observer","runtimeID":2116},{"data":2,"id":251,"name":"minecraft:observer","runtimeID":2117},{"data":3,"id":251,"name":"minecraft:observer","runtimeID":2118},{"data":4,"id":251,"name":"minecraft:observer","runtimeID":2119},{"data":5,"id":251,"name":"minecraft:observer","runtimeID":2120},{"data":6,"id":251,"name":"minecraft:observer","runtimeID":2121},{"data":7,"id":251,"name":"minecraft:observer","runtimeID":2122},{"data":8,"id":251,"name":"minecraft:observer","runtimeID":2123},{"data":9,"id":251,"name":"minecraft:observer","runtimeID":2124},{"data":10,"id":251,"name":"minecraft:observer","runtimeID":2125},{"data":11,"id":251,"name":"minecraft:observer","runtimeID":2126},{"data":12,"id":251,"name":"minecraft:observer","runtimeID":2127},{"data":13,"id":251,"name":"minecraft:observer","runtimeID":2128},{"data":14,"id":251,"name":"minecraft:observer","runtimeID":2129},{"data":15,"id":251,"name":"minecraft:observer","runtimeID":2130},{"data":0,"id":252,"name":"minecraft:structure_block","runtimeID":2131},{"data":1,"id":252,"name":"minecraft:structure_block","runtimeID":2132},{"data":2,"id":252,"name":"minecraft:structure_block","runtimeID":2133},{"data":3,"id":252,"name":"minecraft:structure_block","runtimeID":2134},{"data":4,"id":252,"name":"minecraft:structure_block","runtimeID":2135},{"data":5,"id":252,"name":"minecraft:structure_block","runtimeID":2136},{"data":6,"id":252,"name":"minecraft:structure_block","runtimeID":2137},{"data":7,"id":252,"name":"minecraft:structure_block","runtimeID":2138},{"data":0,"id":253,"name":"minecraft:hard_glass","runtimeID":2139},{"data":0,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2140},{"data":1,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2141},{"data":2,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2142},{"data":3,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2143},{"data":4,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2144},{"data":5,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2145},{"data":6,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2146},{"data":7,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2147},{"data":8,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2148},{"data":9,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2149},{"data":10,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2150},{"data":11,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2151},{"data":12,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2152},{"data":13,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2153},{"data":14,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2154},{"data":15,"id":254,"name":"minecraft:hard_stained_glass","runtimeID":2155},{"data":0,"id":255,"name":"minecraft:reserved6","runtimeID":2156},{"data":0,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2158},{"data":1,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2159},{"data":2,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2160},{"data":3,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2161},{"data":4,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2162},{"data":5,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2163},{"data":6,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2164},{"data":7,"id":257,"name":"minecraft:prismarine_stairs","runtimeID":2165},{"data":0,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2166},{"data":1,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2167},{"data":2,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2168},{"data":3,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2169},{"data":4,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2170},{"data":5,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2171},{"data":6,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2172},{"data":7,"id":258,"name":"minecraft:dark_prismarine_stairs","runtimeID":2173},{"data":0,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2174},{"data":1,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2175},{"data":2,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2176},{"data":3,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2177},{"data":4,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2178},{"data":5,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2179},{"data":6,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2180},{"data":7,"id":259,"name":"minecraft:prismarine_bricks_stairs","runtimeID":2181},{"data":0,"id":260,"name":"minecraft:stripped_spruce_log","runtimeID":2182},{"data":1,"id":260,"name":"minecraft:stripped_spruce_log","runtimeID":2183},{"data":2,"id":260,"name":"minecraft:stripped_spruce_log","runtimeID":2184},{"data":3,"id":260,"name":"minecraft:stripped_spruce_log","runtimeID":2185},{"data":0,"id":261,"name":"minecraft:stripped_birch_log","runtimeID":2186},{"data":1,"id":261,"name":"minecraft:stripped_birch_log","runtimeID":2187},{"data":2,"id":261,"name":"minecraft:stripped_birch_log","runtimeID":2188},{"data":3,"id":261,"name":"minecraft:stripped_birch_log","runtimeID":2189},{"data":0,"id":262,"name":"minecraft:stripped_jungle_log","runtimeID":2190},{"data":1,"id":262,"name":"minecraft:stripped_jungle_log","runtimeID":2191},{"data":2,"id":262,"name":"minecraft:stripped_jungle_log","runtimeID":2192},{"data":3,"id":262,"name":"minecraft:stripped_jungle_log","runtimeID":2193},{"data":0,"id":263,"name":"minecraft:stripped_acacia_log","runtimeID":2194},{"data":1,"id":263,"name":"minecraft:stripped_acacia_log","runtimeID":2195},{"data":2,"id":263,"name":"minecraft:stripped_acacia_log","runtimeID":2196},{"data":3,"id":263,"name":"minecraft:stripped_acacia_log","runtimeID":2197},{"data":0,"id":264,"name":"minecraft:stripped_dark_oak_log","runtimeID":2198},{"data":1,"id":264,"name":"minecraft:stripped_dark_oak_log","runtimeID":2199},{"data":2,"id":264,"name":"minecraft:stripped_dark_oak_log","runtimeID":2200},{"data":3,"id":264,"name":"minecraft:stripped_dark_oak_log","runtimeID":2201},{"data":0,"id":265,"name":"minecraft:stripped_oak_log","runtimeID":2202},{"data":1,"id":265,"name":"minecraft:stripped_oak_log","runtimeID":2203},{"data":2,"id":265,"name":"minecraft:stripped_oak_log","runtimeID":2204},{"data":3,"id":265,"name":"minecraft:stripped_oak_log","runtimeID":2205},{"data":0,"id":266,"name":"minecraft:blue_ice","runtimeID":2206},{"data":0,"id":267,"name":"minecraft:element_1","runtimeID":2207},{"data":1,"id":267,"name":"minecraft:element_1","runtimeID":2208},{"data":2,"id":267,"name":"minecraft:element_1","runtimeID":2209},{"data":3,"id":267,"name":"minecraft:element_1","runtimeID":2210},{"data":4,"id":267,"name":"minecraft:element_1","runtimeID":2211},{"data":5,"id":267,"name":"minecraft:element_1","runtimeID":2212},{"data":6,"id":267,"name":"minecraft:element_1","runtimeID":2213},{"data":7,"id":267,"name":"minecraft:element_1","runtimeID":2214},{"data":8,"id":267,"name":"minecraft:element_1","runtimeID":2215},{"data":9,"id":267,"name":"minecraft:element_1","runtimeID":2216},{"data":10,"id":267,"name":"minecraft:element_1","runtimeID":2217},{"data":11,"id":267,"name":"minecraft:element_1","runtimeID":2218},{"data":12,"id":267,"name":"minecraft:element_1","runtimeID":2219},{"data":13,"id":267,"name":"minecraft:element_1","runtimeID":2220},{"data":14,"id":267,"name":"minecraft:element_1","runtimeID":2221},{"data":15,"id":267,"name":"minecraft:element_1","runtimeID":2222},{"data":0,"id":268,"name":"minecraft:element_2","runtimeID":2223},{"data":1,"id":268,"name":"minecraft:element_2","runtimeID":2224},{"data":2,"id":268,"name":"minecraft:element_2","runtimeID":2225},{"data":3,"id":268,"name":"minecraft:element_2","runtimeID":2226},{"data":4,"id":268,"name":"minecraft:element_2","runtimeID":2227},{"data":5,"id":268,"name":"minecraft:element_2","runtimeID":2228},{"data":6,"id":268,"name":"minecraft:element_2","runtimeID":2229},{"data":7,"id":268,"name":"minecraft:element_2","runtimeID":2230},{"data":8,"id":268,"name":"minecraft:element_2","runtimeID":2231},{"data":9,"id":268,"name":"minecraft:element_2","runtimeID":2232},{"data":10,"id":268,"name":"minecraft:element_2","runtimeID":2233},{"data":11,"id":268,"name":"minecraft:element_2","runtimeID":2234},{"data":12,"id":268,"name":"minecraft:element_2","runtimeID":2235},{"data":13,"id":268,"name":"minecraft:element_2","runtimeID":2236},{"data":14,"id":268,"name":"minecraft:element_2","runtimeID":2237},{"data":15,"id":268,"name":"minecraft:element_2","runtimeID":2238},{"data":0,"id":269,"name":"minecraft:element_3","runtimeID":2239},{"data":1,"id":269,"name":"minecraft:element_3","runtimeID":2240},{"data":2,"id":269,"name":"minecraft:element_3","runtimeID":2241},{"data":3,"id":269,"name":"minecraft:element_3","runtimeID":2242},{"data":4,"id":269,"name":"minecraft:element_3","runtimeID":2243},{"data":5,"id":269,"name":"minecraft:element_3","runtimeID":2244},{"data":6,"id":269,"name":"minecraft:element_3","runtimeID":2245},{"data":7,"id":269,"name":"minecraft:element_3","runtimeID":2246},{"data":8,"id":269,"name":"minecraft:element_3","runtimeID":2247},{"data":9,"id":269,"name":"minecraft:element_3","runtimeID":2248},{"data":10,"id":269,"name":"minecraft:element_3","runtimeID":2249},{"data":11,"id":269,"name":"minecraft:element_3","runtimeID":2250},{"data":12,"id":269,"name":"minecraft:element_3","runtimeID":2251},{"data":13,"id":269,"name":"minecraft:element_3","runtimeID":2252},{"data":14,"id":269,"name":"minecraft:element_3","runtimeID":2253},{"data":15,"id":269,"name":"minecraft:element_3","runtimeID":2254},{"data":0,"id":270,"name":"minecraft:element_4","runtimeID":2255},{"data":1,"id":270,"name":"minecraft:element_4","runtimeID":2256},{"data":2,"id":270,"name":"minecraft:element_4","runtimeID":2257},{"data":3,"id":270,"name":"minecraft:element_4","runtimeID":2258},{"data":4,"id":270,"name":"minecraft:element_4","runtimeID":2259},{"data":5,"id":270,"name":"minecraft:element_4","runtimeID":2260},{"data":6,"id":270,"name":"minecraft:element_4","runtimeID":2261},{"data":7,"id":270,"name":"minecraft:element_4","runtimeID":2262},{"data":8,"id":270,"name":"minecraft:element_4","runtimeID":2263},{"data":9,"id":270,"name":"minecraft:element_4","runtimeID":2264},{"data":10,"id":270,"name":"minecraft:element_4","runtimeID":2265},{"data":11,"id":270,"name":"minecraft:element_4","runtimeID":2266},{"data":12,"id":270,"name":"minecraft:element_4","runtimeID":2267},{"data":13,"id":270,"name":"minecraft:element_4","runtimeID":2268},{"data":14,"id":270,"name":"minecraft:element_4","runtimeID":2269},{"data":15,"id":270,"name":"minecraft:element_4","runtimeID":2270},{"data":0,"id":271,"name":"minecraft:element_5","runtimeID":2271},{"data":1,"id":271,"name":"minecraft:element_5","runtimeID":2272},{"data":2,"id":271,"name":"minecraft:element_5","runtimeID":2273},{"data":3,"id":271,"name":"minecraft:element_5","runtimeID":2274},{"data":4,"id":271,"name":"minecraft:element_5","runtimeID":2275},{"data":5,"id":271,"name":"minecraft:element_5","runtimeID":2276},{"data":6,"id":271,"name":"minecraft:element_5","runtimeID":2277},{"data":7,"id":271,"name":"minecraft:element_5","runtimeID":2278},{"data":8,"id":271,"name":"minecraft:element_5","runtimeID":2279},{"data":9,"id":271,"name":"minecraft:element_5","runtimeID":2280},{"data":10,"id":271,"name":"minecraft:element_5","runtimeID":2281},{"data":11,"id":271,"name":"minecraft:element_5","runtimeID":2282},{"data":12,"id":271,"name":"minecraft:element_5","runtimeID":2283},{"data":13,"id":271,"name":"minecraft:element_5","runtimeID":2284},{"data":14,"id":271,"name":"minecraft:element_5","runtimeID":2285},{"data":15,"id":271,"name":"minecraft:element_5","runtimeID":2286},{"data":0,"id":272,"name":"minecraft:element_6","runtimeID":2287},{"data":1,"id":272,"name":"minecraft:element_6","runtimeID":2288},{"data":2,"id":272,"name":"minecraft:element_6","runtimeID":2289},{"data":3,"id":272,"name":"minecraft:element_6","runtimeID":2290},{"data":4,"id":272,"name":"minecraft:element_6","runtimeID":2291},{"data":5,"id":272,"name":"minecraft:element_6","runtimeID":2292},{"data":6,"id":272,"name":"minecraft:element_6","runtimeID":2293},{"data":7,"id":272,"name":"minecraft:element_6","runtimeID":2294},{"data":8,"id":272,"name":"minecraft:element_6","runtimeID":2295},{"data":9,"id":272,"name":"minecraft:element_6","runtimeID":2296},{"data":10,"id":272,"name":"minecraft:element_6","runtimeID":2297},{"data":11,"id":272,"name":"minecraft:element_6","runtimeID":2298},{"data":12,"id":272,"name":"minecraft:element_6","runtimeID":2299},{"data":13,"id":272,"name":"minecraft:element_6","runtimeID":2300},{"data":14,"id":272,"name":"minecraft:element_6","runtimeID":2301},{"data":15,"id":272,"name":"minecraft:element_6","runtimeID":2302},{"data":0,"id":273,"name":"minecraft:element_7","runtimeID":2303},{"data":1,"id":273,"name":"minecraft:element_7","runtimeID":2304},{"data":2,"id":273,"name":"minecraft:element_7","runtimeID":2305},{"data":3,"id":273,"name":"minecraft:element_7","runtimeID":2306},{"data":4,"id":273,"name":"minecraft:element_7","runtimeID":2307},{"data":5,"id":273,"name":"minecraft:element_7","runtimeID":2308},{"data":6,"id":273,"name":"minecraft:element_7","runtimeID":2309},{"data":7,"id":273,"name":"minecraft:element_7","runtimeID":2310},{"data":8,"id":273,"name":"minecraft:element_7","runtimeID":2311},{"data":9,"id":273,"name":"minecraft:element_7","runtimeID":2312},{"data":10,"id":273,"name":"minecraft:element_7","runtimeID":2313},{"data":11,"id":273,"name":"minecraft:element_7","runtimeID":2314},{"data":12,"id":273,"name":"minecraft:element_7","runtimeID":2315},{"data":13,"id":273,"name":"minecraft:element_7","runtimeID":2316},{"data":14,"id":273,"name":"minecraft:element_7","runtimeID":2317},{"data":15,"id":273,"name":"minecraft:element_7","runtimeID":2318},{"data":0,"id":274,"name":"minecraft:element_8","runtimeID":2319},{"data":1,"id":274,"name":"minecraft:element_8","runtimeID":2320},{"data":2,"id":274,"name":"minecraft:element_8","runtimeID":2321},{"data":3,"id":274,"name":"minecraft:element_8","runtimeID":2322},{"data":4,"id":274,"name":"minecraft:element_8","runtimeID":2323},{"data":5,"id":274,"name":"minecraft:element_8","runtimeID":2324},{"data":6,"id":274,"name":"minecraft:element_8","runtimeID":2325},{"data":7,"id":274,"name":"minecraft:element_8","runtimeID":2326},{"data":8,"id":274,"name":"minecraft:element_8","runtimeID":2327},{"data":9,"id":274,"name":"minecraft:element_8","runtimeID":2328},{"data":10,"id":274,"name":"minecraft:element_8","runtimeID":2329},{"data":11,"id":274,"name":"minecraft:element_8","runtimeID":2330},{"data":12,"id":274,"name":"minecraft:element_8","runtimeID":2331},{"data":13,"id":274,"name":"minecraft:element_8","runtimeID":2332},{"data":14,"id":274,"name":"minecraft:element_8","runtimeID":2333},{"data":15,"id":274,"name":"minecraft:element_8","runtimeID":2334},{"data":0,"id":275,"name":"minecraft:element_9","runtimeID":2335},{"data":1,"id":275,"name":"minecraft:element_9","runtimeID":2336},{"data":2,"id":275,"name":"minecraft:element_9","runtimeID":2337},{"data":3,"id":275,"name":"minecraft:element_9","runtimeID":2338},{"data":4,"id":275,"name":"minecraft:element_9","runtimeID":2339},{"data":5,"id":275,"name":"minecraft:element_9","runtimeID":2340},{"data":6,"id":275,"name":"minecraft:element_9","runtimeID":2341},{"data":7,"id":275,"name":"minecraft:element_9","runtimeID":2342},{"data":8,"id":275,"name":"minecraft:element_9","runtimeID":2343},{"data":9,"id":275,"name":"minecraft:element_9","runtimeID":2344},{"data":10,"id":275,"name":"minecraft:element_9","runtimeID":2345},{"data":11,"id":275,"name":"minecraft:element_9","runtimeID":2346},{"data":12,"id":275,"name":"minecraft:element_9","runtimeID":2347},{"data":13,"id":275,"name":"minecraft:element_9","runtimeID":2348},{"data":14,"id":275,"name":"minecraft:element_9","runtimeID":2349},{"data":15,"id":275,"name":"minecraft:element_9","runtimeID":2350},{"data":0,"id":276,"name":"minecraft:element_10","runtimeID":2351},{"data":1,"id":276,"name":"minecraft:element_10","runtimeID":2352},{"data":2,"id":276,"name":"minecraft:element_10","runtimeID":2353},{"data":3,"id":276,"name":"minecraft:element_10","runtimeID":2354},{"data":4,"id":276,"name":"minecraft:element_10","runtimeID":2355},{"data":5,"id":276,"name":"minecraft:element_10","runtimeID":2356},{"data":6,"id":276,"name":"minecraft:element_10","runtimeID":2357},{"data":7,"id":276,"name":"minecraft:element_10","runtimeID":2358},{"data":8,"id":276,"name":"minecraft:element_10","runtimeID":2359},{"data":9,"id":276,"name":"minecraft:element_10","runtimeID":2360},{"data":10,"id":276,"name":"minecraft:element_10","runtimeID":2361},{"data":11,"id":276,"name":"minecraft:element_10","runtimeID":2362},{"data":12,"id":276,"name":"minecraft:element_10","runtimeID":2363},{"data":13,"id":276,"name":"minecraft:element_10","runtimeID":2364},{"data":14,"id":276,"name":"minecraft:element_10","runtimeID":2365},{"data":15,"id":276,"name":"minecraft:element_10","runtimeID":2366},{"data":0,"id":277,"name":"minecraft:element_11","runtimeID":2367},{"data":1,"id":277,"name":"minecraft:element_11","runtimeID":2368},{"data":2,"id":277,"name":"minecraft:element_11","runtimeID":2369},{"data":3,"id":277,"name":"minecraft:element_11","runtimeID":2370},{"data":4,"id":277,"name":"minecraft:element_11","runtimeID":2371},{"data":5,"id":277,"name":"minecraft:element_11","runtimeID":2372},{"data":6,"id":277,"name":"minecraft:element_11","runtimeID":2373},{"data":7,"id":277,"name":"minecraft:element_11","runtimeID":2374},{"data":8,"id":277,"name":"minecraft:element_11","runtimeID":2375},{"data":9,"id":277,"name":"minecraft:element_11","runtimeID":2376},{"data":10,"id":277,"name":"minecraft:element_11","runtimeID":2377},{"data":11,"id":277,"name":"minecraft:element_11","runtimeID":2378},{"data":12,"id":277,"name":"minecraft:element_11","runtimeID":2379},{"data":13,"id":277,"name":"minecraft:element_11","runtimeID":2380},{"data":14,"id":277,"name":"minecraft:element_11","runtimeID":2381},{"data":15,"id":277,"name":"minecraft:element_11","runtimeID":2382},{"data":0,"id":278,"name":"minecraft:element_12","runtimeID":2383},{"data":1,"id":278,"name":"minecraft:element_12","runtimeID":2384},{"data":2,"id":278,"name":"minecraft:element_12","runtimeID":2385},{"data":3,"id":278,"name":"minecraft:element_12","runtimeID":2386},{"data":4,"id":278,"name":"minecraft:element_12","runtimeID":2387},{"data":5,"id":278,"name":"minecraft:element_12","runtimeID":2388},{"data":6,"id":278,"name":"minecraft:element_12","runtimeID":2389},{"data":7,"id":278,"name":"minecraft:element_12","runtimeID":2390},{"data":8,"id":278,"name":"minecraft:element_12","runtimeID":2391},{"data":9,"id":278,"name":"minecraft:element_12","runtimeID":2392},{"data":10,"id":278,"name":"minecraft:element_12","runtimeID":2393},{"data":11,"id":278,"name":"minecraft:element_12","runtimeID":2394},{"data":12,"id":278,"name":"minecraft:element_12","runtimeID":2395},{"data":13,"id":278,"name":"minecraft:element_12","runtimeID":2396},{"data":14,"id":278,"name":"minecraft:element_12","runtimeID":2397},{"data":15,"id":278,"name":"minecraft:element_12","runtimeID":2398},{"data":0,"id":279,"name":"minecraft:element_13","runtimeID":2399},{"data":1,"id":279,"name":"minecraft:element_13","runtimeID":2400},{"data":2,"id":279,"name":"minecraft:element_13","runtimeID":2401},{"data":3,"id":279,"name":"minecraft:element_13","runtimeID":2402},{"data":4,"id":279,"name":"minecraft:element_13","runtimeID":2403},{"data":5,"id":279,"name":"minecraft:element_13","runtimeID":2404},{"data":6,"id":279,"name":"minecraft:element_13","runtimeID":2405},{"data":7,"id":279,"name":"minecraft:element_13","runtimeID":2406},{"data":8,"id":279,"name":"minecraft:element_13","runtimeID":2407},{"data":9,"id":279,"name":"minecraft:element_13","runtimeID":2408},{"data":10,"id":279,"name":"minecraft:element_13","runtimeID":2409},{"data":11,"id":279,"name":"minecraft:element_13","runtimeID":2410},{"data":12,"id":279,"name":"minecraft:element_13","runtimeID":2411},{"data":13,"id":279,"name":"minecraft:element_13","runtimeID":2412},{"data":14,"id":279,"name":"minecraft:element_13","runtimeID":2413},{"data":15,"id":279,"name":"minecraft:element_13","runtimeID":2414},{"data":0,"id":280,"name":"minecraft:element_14","runtimeID":2415},{"data":1,"id":280,"name":"minecraft:element_14","runtimeID":2416},{"data":2,"id":280,"name":"minecraft:element_14","runtimeID":2417},{"data":3,"id":280,"name":"minecraft:element_14","runtimeID":2418},{"data":4,"id":280,"name":"minecraft:element_14","runtimeID":2419},{"data":5,"id":280,"name":"minecraft:element_14","runtimeID":2420},{"data":6,"id":280,"name":"minecraft:element_14","runtimeID":2421},{"data":7,"id":280,"name":"minecraft:element_14","runtimeID":2422},{"data":8,"id":280,"name":"minecraft:element_14","runtimeID":2423},{"data":9,"id":280,"name":"minecraft:element_14","runtimeID":2424},{"data":10,"id":280,"name":"minecraft:element_14","runtimeID":2425},{"data":11,"id":280,"name":"minecraft:element_14","runtimeID":2426},{"data":12,"id":280,"name":"minecraft:element_14","runtimeID":2427},{"data":13,"id":280,"name":"minecraft:element_14","runtimeID":2428},{"data":14,"id":280,"name":"minecraft:element_14","runtimeID":2429},{"data":15,"id":280,"name":"minecraft:element_14","runtimeID":2430},{"data":0,"id":281,"name":"minecraft:element_15","runtimeID":2431},{"data":1,"id":281,"name":"minecraft:element_15","runtimeID":2432},{"data":2,"id":281,"name":"minecraft:element_15","runtimeID":2433},{"data":3,"id":281,"name":"minecraft:element_15","runtimeID":2434},{"data":4,"id":281,"name":"minecraft:element_15","runtimeID":2435},{"data":5,"id":281,"name":"minecraft:element_15","runtimeID":2436},{"data":6,"id":281,"name":"minecraft:element_15","runtimeID":2437},{"data":7,"id":281,"name":"minecraft:element_15","runtimeID":2438},{"data":8,"id":281,"name":"minecraft:element_15","runtimeID":2439},{"data":9,"id":281,"name":"minecraft:element_15","runtimeID":2440},{"data":10,"id":281,"name":"minecraft:element_15","runtimeID":2441},{"data":11,"id":281,"name":"minecraft:element_15","runtimeID":2442},{"data":12,"id":281,"name":"minecraft:element_15","runtimeID":2443},{"data":13,"id":281,"name":"minecraft:element_15","runtimeID":2444},{"data":14,"id":281,"name":"minecraft:element_15","runtimeID":2445},{"data":15,"id":281,"name":"minecraft:element_15","runtimeID":2446},{"data":0,"id":282,"name":"minecraft:element_16","runtimeID":2447},{"data":1,"id":282,"name":"minecraft:element_16","runtimeID":2448},{"data":2,"id":282,"name":"minecraft:element_16","runtimeID":2449},{"data":3,"id":282,"name":"minecraft:element_16","runtimeID":2450},{"data":4,"id":282,"name":"minecraft:element_16","runtimeID":2451},{"data":5,"id":282,"name":"minecraft:element_16","runtimeID":2452},{"data":6,"id":282,"name":"minecraft:element_16","runtimeID":2453},{"data":7,"id":282,"name":"minecraft:element_16","runtimeID":2454},{"data":8,"id":282,"name":"minecraft:element_16","runtimeID":2455},{"data":9,"id":282,"name":"minecraft:element_16","runtimeID":2456},{"data":10,"id":282,"name":"minecraft:element_16","runtimeID":2457},{"data":11,"id":282,"name":"minecraft:element_16","runtimeID":2458},{"data":12,"id":282,"name":"minecraft:element_16","runtimeID":2459},{"data":13,"id":282,"name":"minecraft:element_16","runtimeID":2460},{"data":14,"id":282,"name":"minecraft:element_16","runtimeID":2461},{"data":15,"id":282,"name":"minecraft:element_16","runtimeID":2462},{"data":0,"id":283,"name":"minecraft:element_17","runtimeID":2463},{"data":1,"id":283,"name":"minecraft:element_17","runtimeID":2464},{"data":2,"id":283,"name":"minecraft:element_17","runtimeID":2465},{"data":3,"id":283,"name":"minecraft:element_17","runtimeID":2466},{"data":4,"id":283,"name":"minecraft:element_17","runtimeID":2467},{"data":5,"id":283,"name":"minecraft:element_17","runtimeID":2468},{"data":6,"id":283,"name":"minecraft:element_17","runtimeID":2469},{"data":7,"id":283,"name":"minecraft:element_17","runtimeID":2470},{"data":8,"id":283,"name":"minecraft:element_17","runtimeID":2471},{"data":9,"id":283,"name":"minecraft:element_17","runtimeID":2472},{"data":10,"id":283,"name":"minecraft:element_17","runtimeID":2473},{"data":11,"id":283,"name":"minecraft:element_17","runtimeID":2474},{"data":12,"id":283,"name":"minecraft:element_17","runtimeID":2475},{"data":13,"id":283,"name":"minecraft:element_17","runtimeID":2476},{"data":14,"id":283,"name":"minecraft:element_17","runtimeID":2477},{"data":15,"id":283,"name":"minecraft:element_17","runtimeID":2478},{"data":0,"id":284,"name":"minecraft:element_18","runtimeID":2479},{"data":1,"id":284,"name":"minecraft:element_18","runtimeID":2480},{"data":2,"id":284,"name":"minecraft:element_18","runtimeID":2481},{"data":3,"id":284,"name":"minecraft:element_18","runtimeID":2482},{"data":4,"id":284,"name":"minecraft:element_18","runtimeID":2483},{"data":5,"id":284,"name":"minecraft:element_18","runtimeID":2484},{"data":6,"id":284,"name":"minecraft:element_18","runtimeID":2485},{"data":7,"id":284,"name":"minecraft:element_18","runtimeID":2486},{"data":8,"id":284,"name":"minecraft:element_18","runtimeID":2487},{"data":9,"id":284,"name":"minecraft:element_18","runtimeID":2488},{"data":10,"id":284,"name":"minecraft:element_18","runtimeID":2489},{"data":11,"id":284,"name":"minecraft:element_18","runtimeID":2490},{"data":12,"id":284,"name":"minecraft:element_18","runtimeID":2491},{"data":13,"id":284,"name":"minecraft:element_18","runtimeID":2492},{"data":14,"id":284,"name":"minecraft:element_18","runtimeID":2493},{"data":15,"id":284,"name":"minecraft:element_18","runtimeID":2494},{"data":0,"id":285,"name":"minecraft:element_19","runtimeID":2495},{"data":1,"id":285,"name":"minecraft:element_19","runtimeID":2496},{"data":2,"id":285,"name":"minecraft:element_19","runtimeID":2497},{"data":3,"id":285,"name":"minecraft:element_19","runtimeID":2498},{"data":4,"id":285,"name":"minecraft:element_19","runtimeID":2499},{"data":5,"id":285,"name":"minecraft:element_19","runtimeID":2500},{"data":6,"id":285,"name":"minecraft:element_19","runtimeID":2501},{"data":7,"id":285,"name":"minecraft:element_19","runtimeID":2502},{"data":8,"id":285,"name":"minecraft:element_19","runtimeID":2503},{"data":9,"id":285,"name":"minecraft:element_19","runtimeID":2504},{"data":10,"id":285,"name":"minecraft:element_19","runtimeID":2505},{"data":11,"id":285,"name":"minecraft:element_19","runtimeID":2506},{"data":12,"id":285,"name":"minecraft:element_19","runtimeID":2507},{"data":13,"id":285,"name":"minecraft:element_19","runtimeID":2508},{"data":14,"id":285,"name":"minecraft:element_19","runtimeID":2509},{"data":15,"id":285,"name":"minecraft:element_19","runtimeID":2510},{"data":0,"id":286,"name":"minecraft:element_20","runtimeID":2511},{"data":1,"id":286,"name":"minecraft:element_20","runtimeID":2512},{"data":2,"id":286,"name":"minecraft:element_20","runtimeID":2513},{"data":3,"id":286,"name":"minecraft:element_20","runtimeID":2514},{"data":4,"id":286,"name":"minecraft:element_20","runtimeID":2515},{"data":5,"id":286,"name":"minecraft:element_20","runtimeID":2516},{"data":6,"id":286,"name":"minecraft:element_20","runtimeID":2517},{"data":7,"id":286,"name":"minecraft:element_20","runtimeID":2518},{"data":8,"id":286,"name":"minecraft:element_20","runtimeID":2519},{"data":9,"id":286,"name":"minecraft:element_20","runtimeID":2520},{"data":10,"id":286,"name":"minecraft:element_20","runtimeID":2521},{"data":11,"id":286,"name":"minecraft:element_20","runtimeID":2522},{"data":12,"id":286,"name":"minecraft:element_20","runtimeID":2523},{"data":13,"id":286,"name":"minecraft:element_20","runtimeID":2524},{"data":14,"id":286,"name":"minecraft:element_20","runtimeID":2525},{"data":15,"id":286,"name":"minecraft:element_20","runtimeID":2526},{"data":0,"id":287,"name":"minecraft:element_21","runtimeID":2527},{"data":1,"id":287,"name":"minecraft:element_21","runtimeID":2528},{"data":2,"id":287,"name":"minecraft:element_21","runtimeID":2529},{"data":3,"id":287,"name":"minecraft:element_21","runtimeID":2530},{"data":4,"id":287,"name":"minecraft:element_21","runtimeID":2531},{"data":5,"id":287,"name":"minecraft:element_21","runtimeID":2532},{"data":6,"id":287,"name":"minecraft:element_21","runtimeID":2533},{"data":7,"id":287,"name":"minecraft:element_21","runtimeID":2534},{"data":8,"id":287,"name":"minecraft:element_21","runtimeID":2535},{"data":9,"id":287,"name":"minecraft:element_21","runtimeID":2536},{"data":10,"id":287,"name":"minecraft:element_21","runtimeID":2537},{"data":11,"id":287,"name":"minecraft:element_21","runtimeID":2538},{"data":12,"id":287,"name":"minecraft:element_21","runtimeID":2539},{"data":13,"id":287,"name":"minecraft:element_21","runtimeID":2540},{"data":14,"id":287,"name":"minecraft:element_21","runtimeID":2541},{"data":15,"id":287,"name":"minecraft:element_21","runtimeID":2542},{"data":0,"id":288,"name":"minecraft:element_22","runtimeID":2543},{"data":1,"id":288,"name":"minecraft:element_22","runtimeID":2544},{"data":2,"id":288,"name":"minecraft:element_22","runtimeID":2545},{"data":3,"id":288,"name":"minecraft:element_22","runtimeID":2546},{"data":4,"id":288,"name":"minecraft:element_22","runtimeID":2547},{"data":5,"id":288,"name":"minecraft:element_22","runtimeID":2548},{"data":6,"id":288,"name":"minecraft:element_22","runtimeID":2549},{"data":7,"id":288,"name":"minecraft:element_22","runtimeID":2550},{"data":8,"id":288,"name":"minecraft:element_22","runtimeID":2551},{"data":9,"id":288,"name":"minecraft:element_22","runtimeID":2552},{"data":10,"id":288,"name":"minecraft:element_22","runtimeID":2553},{"data":11,"id":288,"name":"minecraft:element_22","runtimeID":2554},{"data":12,"id":288,"name":"minecraft:element_22","runtimeID":2555},{"data":13,"id":288,"name":"minecraft:element_22","runtimeID":2556},{"data":14,"id":288,"name":"minecraft:element_22","runtimeID":2557},{"data":15,"id":288,"name":"minecraft:element_22","runtimeID":2558},{"data":0,"id":289,"name":"minecraft:element_23","runtimeID":2559},{"data":1,"id":289,"name":"minecraft:element_23","runtimeID":2560},{"data":2,"id":289,"name":"minecraft:element_23","runtimeID":2561},{"data":3,"id":289,"name":"minecraft:element_23","runtimeID":2562},{"data":4,"id":289,"name":"minecraft:element_23","runtimeID":2563},{"data":5,"id":289,"name":"minecraft:element_23","runtimeID":2564},{"data":6,"id":289,"name":"minecraft:element_23","runtimeID":2565},{"data":7,"id":289,"name":"minecraft:element_23","runtimeID":2566},{"data":8,"id":289,"name":"minecraft:element_23","runtimeID":2567},{"data":9,"id":289,"name":"minecraft:element_23","runtimeID":2568},{"data":10,"id":289,"name":"minecraft:element_23","runtimeID":2569},{"data":11,"id":289,"name":"minecraft:element_23","runtimeID":2570},{"data":12,"id":289,"name":"minecraft:element_23","runtimeID":2571},{"data":13,"id":289,"name":"minecraft:element_23","runtimeID":2572},{"data":14,"id":289,"name":"minecraft:element_23","runtimeID":2573},{"data":15,"id":289,"name":"minecraft:element_23","runtimeID":2574},{"data":0,"id":290,"name":"minecraft:element_24","runtimeID":2575},{"data":1,"id":290,"name":"minecraft:element_24","runtimeID":2576},{"data":2,"id":290,"name":"minecraft:element_24","runtimeID":2577},{"data":3,"id":290,"name":"minecraft:element_24","runtimeID":2578},{"data":4,"id":290,"name":"minecraft:element_24","runtimeID":2579},{"data":5,"id":290,"name":"minecraft:element_24","runtimeID":2580},{"data":6,"id":290,"name":"minecraft:element_24","runtimeID":2581},{"data":7,"id":290,"name":"minecraft:element_24","runtimeID":2582},{"data":8,"id":290,"name":"minecraft:element_24","runtimeID":2583},{"data":9,"id":290,"name":"minecraft:element_24","runtimeID":2584},{"data":10,"id":290,"name":"minecraft:element_24","runtimeID":2585},{"data":11,"id":290,"name":"minecraft:element_24","runtimeID":2586},{"data":12,"id":290,"name":"minecraft:element_24","runtimeID":2587},{"data":13,"id":290,"name":"minecraft:element_24","runtimeID":2588},{"data":14,"id":290,"name":"minecraft:element_24","runtimeID":2589},{"data":15,"id":290,"name":"minecraft:element_24","runtimeID":2590},{"data":0,"id":291,"name":"minecraft:element_25","runtimeID":2591},{"data":1,"id":291,"name":"minecraft:element_25","runtimeID":2592},{"data":2,"id":291,"name":"minecraft:element_25","runtimeID":2593},{"data":3,"id":291,"name":"minecraft:element_25","runtimeID":2594},{"data":4,"id":291,"name":"minecraft:element_25","runtimeID":2595},{"data":5,"id":291,"name":"minecraft:element_25","runtimeID":2596},{"data":6,"id":291,"name":"minecraft:element_25","runtimeID":2597},{"data":7,"id":291,"name":"minecraft:element_25","runtimeID":2598},{"data":8,"id":291,"name":"minecraft:element_25","runtimeID":2599},{"data":9,"id":291,"name":"minecraft:element_25","runtimeID":2600},{"data":10,"id":291,"name":"minecraft:element_25","runtimeID":2601},{"data":11,"id":291,"name":"minecraft:element_25","runtimeID":2602},{"data":12,"id":291,"name":"minecraft:element_25","runtimeID":2603},{"data":13,"id":291,"name":"minecraft:element_25","runtimeID":2604},{"data":14,"id":291,"name":"minecraft:element_25","runtimeID":2605},{"data":15,"id":291,"name":"minecraft:element_25","runtimeID":2606},{"data":0,"id":292,"name":"minecraft:element_26","runtimeID":2607},{"data":1,"id":292,"name":"minecraft:element_26","runtimeID":2608},{"data":2,"id":292,"name":"minecraft:element_26","runtimeID":2609},{"data":3,"id":292,"name":"minecraft:element_26","runtimeID":2610},{"data":4,"id":292,"name":"minecraft:element_26","runtimeID":2611},{"data":5,"id":292,"name":"minecraft:element_26","runtimeID":2612},{"data":6,"id":292,"name":"minecraft:element_26","runtimeID":2613},{"data":7,"id":292,"name":"minecraft:element_26","runtimeID":2614},{"data":8,"id":292,"name":"minecraft:element_26","runtimeID":2615},{"data":9,"id":292,"name":"minecraft:element_26","runtimeID":2616},{"data":10,"id":292,"name":"minecraft:element_26","runtimeID":2617},{"data":11,"id":292,"name":"minecraft:element_26","runtimeID":2618},{"data":12,"id":292,"name":"minecraft:element_26","runtimeID":2619},{"data":13,"id":292,"name":"minecraft:element_26","runtimeID":2620},{"data":14,"id":292,"name":"minecraft:element_26","runtimeID":2621},{"data":15,"id":292,"name":"minecraft:element_26","runtimeID":2622},{"data":0,"id":293,"name":"minecraft:element_27","runtimeID":2623},{"data":1,"id":293,"name":"minecraft:element_27","runtimeID":2624},{"data":2,"id":293,"name":"minecraft:element_27","runtimeID":2625},{"data":3,"id":293,"name":"minecraft:element_27","runtimeID":2626},{"data":4,"id":293,"name":"minecraft:element_27","runtimeID":2627},{"data":5,"id":293,"name":"minecraft:element_27","runtimeID":2628},{"data":6,"id":293,"name":"minecraft:element_27","runtimeID":2629},{"data":7,"id":293,"name":"minecraft:element_27","runtimeID":2630},{"data":8,"id":293,"name":"minecraft:element_27","runtimeID":2631},{"data":9,"id":293,"name":"minecraft:element_27","runtimeID":2632},{"data":10,"id":293,"name":"minecraft:element_27","runtimeID":2633},{"data":11,"id":293,"name":"minecraft:element_27","runtimeID":2634},{"data":12,"id":293,"name":"minecraft:element_27","runtimeID":2635},{"data":13,"id":293,"name":"minecraft:element_27","runtimeID":2636},{"data":14,"id":293,"name":"minecraft:element_27","runtimeID":2637},{"data":15,"id":293,"name":"minecraft:element_27","runtimeID":2638},{"data":0,"id":294,"name":"minecraft:element_28","runtimeID":2639},{"data":1,"id":294,"name":"minecraft:element_28","runtimeID":2640},{"data":2,"id":294,"name":"minecraft:element_28","runtimeID":2641},{"data":3,"id":294,"name":"minecraft:element_28","runtimeID":2642},{"data":4,"id":294,"name":"minecraft:element_28","runtimeID":2643},{"data":5,"id":294,"name":"minecraft:element_28","runtimeID":2644},{"data":6,"id":294,"name":"minecraft:element_28","runtimeID":2645},{"data":7,"id":294,"name":"minecraft:element_28","runtimeID":2646},{"data":8,"id":294,"name":"minecraft:element_28","runtimeID":2647},{"data":9,"id":294,"name":"minecraft:element_28","runtimeID":2648},{"data":10,"id":294,"name":"minecraft:element_28","runtimeID":2649},{"data":11,"id":294,"name":"minecraft:element_28","runtimeID":2650},{"data":12,"id":294,"name":"minecraft:element_28","runtimeID":2651},{"data":13,"id":294,"name":"minecraft:element_28","runtimeID":2652},{"data":14,"id":294,"name":"minecraft:element_28","runtimeID":2653},{"data":15,"id":294,"name":"minecraft:element_28","runtimeID":2654},{"data":0,"id":295,"name":"minecraft:element_29","runtimeID":2655},{"data":1,"id":295,"name":"minecraft:element_29","runtimeID":2656},{"data":2,"id":295,"name":"minecraft:element_29","runtimeID":2657},{"data":3,"id":295,"name":"minecraft:element_29","runtimeID":2658},{"data":4,"id":295,"name":"minecraft:element_29","runtimeID":2659},{"data":5,"id":295,"name":"minecraft:element_29","runtimeID":2660},{"data":6,"id":295,"name":"minecraft:element_29","runtimeID":2661},{"data":7,"id":295,"name":"minecraft:element_29","runtimeID":2662},{"data":8,"id":295,"name":"minecraft:element_29","runtimeID":2663},{"data":9,"id":295,"name":"minecraft:element_29","runtimeID":2664},{"data":10,"id":295,"name":"minecraft:element_29","runtimeID":2665},{"data":11,"id":295,"name":"minecraft:element_29","runtimeID":2666},{"data":12,"id":295,"name":"minecraft:element_29","runtimeID":2667},{"data":13,"id":295,"name":"minecraft:element_29","runtimeID":2668},{"data":14,"id":295,"name":"minecraft:element_29","runtimeID":2669},{"data":15,"id":295,"name":"minecraft:element_29","runtimeID":2670},{"data":0,"id":296,"name":"minecraft:element_30","runtimeID":2671},{"data":1,"id":296,"name":"minecraft:element_30","runtimeID":2672},{"data":2,"id":296,"name":"minecraft:element_30","runtimeID":2673},{"data":3,"id":296,"name":"minecraft:element_30","runtimeID":2674},{"data":4,"id":296,"name":"minecraft:element_30","runtimeID":2675},{"data":5,"id":296,"name":"minecraft:element_30","runtimeID":2676},{"data":6,"id":296,"name":"minecraft:element_30","runtimeID":2677},{"data":7,"id":296,"name":"minecraft:element_30","runtimeID":2678},{"data":8,"id":296,"name":"minecraft:element_30","runtimeID":2679},{"data":9,"id":296,"name":"minecraft:element_30","runtimeID":2680},{"data":10,"id":296,"name":"minecraft:element_30","runtimeID":2681},{"data":11,"id":296,"name":"minecraft:element_30","runtimeID":2682},{"data":12,"id":296,"name":"minecraft:element_30","runtimeID":2683},{"data":13,"id":296,"name":"minecraft:element_30","runtimeID":2684},{"data":14,"id":296,"name":"minecraft:element_30","runtimeID":2685},{"data":15,"id":296,"name":"minecraft:element_30","runtimeID":2686},{"data":0,"id":297,"name":"minecraft:element_31","runtimeID":2687},{"data":1,"id":297,"name":"minecraft:element_31","runtimeID":2688},{"data":2,"id":297,"name":"minecraft:element_31","runtimeID":2689},{"data":3,"id":297,"name":"minecraft:element_31","runtimeID":2690},{"data":4,"id":297,"name":"minecraft:element_31","runtimeID":2691},{"data":5,"id":297,"name":"minecraft:element_31","runtimeID":2692},{"data":6,"id":297,"name":"minecraft:element_31","runtimeID":2693},{"data":7,"id":297,"name":"minecraft:element_31","runtimeID":2694},{"data":8,"id":297,"name":"minecraft:element_31","runtimeID":2695},{"data":9,"id":297,"name":"minecraft:element_31","runtimeID":2696},{"data":10,"id":297,"name":"minecraft:element_31","runtimeID":2697},{"data":11,"id":297,"name":"minecraft:element_31","runtimeID":2698},{"data":12,"id":297,"name":"minecraft:element_31","runtimeID":2699},{"data":13,"id":297,"name":"minecraft:element_31","runtimeID":2700},{"data":14,"id":297,"name":"minecraft:element_31","runtimeID":2701},{"data":15,"id":297,"name":"minecraft:element_31","runtimeID":2702},{"data":0,"id":298,"name":"minecraft:element_32","runtimeID":2703},{"data":1,"id":298,"name":"minecraft:element_32","runtimeID":2704},{"data":2,"id":298,"name":"minecraft:element_32","runtimeID":2705},{"data":3,"id":298,"name":"minecraft:element_32","runtimeID":2706},{"data":4,"id":298,"name":"minecraft:element_32","runtimeID":2707},{"data":5,"id":298,"name":"minecraft:element_32","runtimeID":2708},{"data":6,"id":298,"name":"minecraft:element_32","runtimeID":2709},{"data":7,"id":298,"name":"minecraft:element_32","runtimeID":2710},{"data":8,"id":298,"name":"minecraft:element_32","runtimeID":2711},{"data":9,"id":298,"name":"minecraft:element_32","runtimeID":2712},{"data":10,"id":298,"name":"minecraft:element_32","runtimeID":2713},{"data":11,"id":298,"name":"minecraft:element_32","runtimeID":2714},{"data":12,"id":298,"name":"minecraft:element_32","runtimeID":2715},{"data":13,"id":298,"name":"minecraft:element_32","runtimeID":2716},{"data":14,"id":298,"name":"minecraft:element_32","runtimeID":2717},{"data":15,"id":298,"name":"minecraft:element_32","runtimeID":2718},{"data":0,"id":299,"name":"minecraft:element_33","runtimeID":2719},{"data":1,"id":299,"name":"minecraft:element_33","runtimeID":2720},{"data":2,"id":299,"name":"minecraft:element_33","runtimeID":2721},{"data":3,"id":299,"name":"minecraft:element_33","runtimeID":2722},{"data":4,"id":299,"name":"minecraft:element_33","runtimeID":2723},{"data":5,"id":299,"name":"minecraft:element_33","runtimeID":2724},{"data":6,"id":299,"name":"minecraft:element_33","runtimeID":2725},{"data":7,"id":299,"name":"minecraft:element_33","runtimeID":2726},{"data":8,"id":299,"name":"minecraft:element_33","runtimeID":2727},{"data":9,"id":299,"name":"minecraft:element_33","runtimeID":2728},{"data":10,"id":299,"name":"minecraft:element_33","runtimeID":2729},{"data":11,"id":299,"name":"minecraft:element_33","runtimeID":2730},{"data":12,"id":299,"name":"minecraft:element_33","runtimeID":2731},{"data":13,"id":299,"name":"minecraft:element_33","runtimeID":2732},{"data":14,"id":299,"name":"minecraft:element_33","runtimeID":2733},{"data":15,"id":299,"name":"minecraft:element_33","runtimeID":2734},{"data":0,"id":300,"name":"minecraft:element_34","runtimeID":2735},{"data":1,"id":300,"name":"minecraft:element_34","runtimeID":2736},{"data":2,"id":300,"name":"minecraft:element_34","runtimeID":2737},{"data":3,"id":300,"name":"minecraft:element_34","runtimeID":2738},{"data":4,"id":300,"name":"minecraft:element_34","runtimeID":2739},{"data":5,"id":300,"name":"minecraft:element_34","runtimeID":2740},{"data":6,"id":300,"name":"minecraft:element_34","runtimeID":2741},{"data":7,"id":300,"name":"minecraft:element_34","runtimeID":2742},{"data":8,"id":300,"name":"minecraft:element_34","runtimeID":2743},{"data":9,"id":300,"name":"minecraft:element_34","runtimeID":2744},{"data":10,"id":300,"name":"minecraft:element_34","runtimeID":2745},{"data":11,"id":300,"name":"minecraft:element_34","runtimeID":2746},{"data":12,"id":300,"name":"minecraft:element_34","runtimeID":2747},{"data":13,"id":300,"name":"minecraft:element_34","runtimeID":2748},{"data":14,"id":300,"name":"minecraft:element_34","runtimeID":2749},{"data":15,"id":300,"name":"minecraft:element_34","runtimeID":2750},{"data":0,"id":301,"name":"minecraft:element_35","runtimeID":2751},{"data":1,"id":301,"name":"minecraft:element_35","runtimeID":2752},{"data":2,"id":301,"name":"minecraft:element_35","runtimeID":2753},{"data":3,"id":301,"name":"minecraft:element_35","runtimeID":2754},{"data":4,"id":301,"name":"minecraft:element_35","runtimeID":2755},{"data":5,"id":301,"name":"minecraft:element_35","runtimeID":2756},{"data":6,"id":301,"name":"minecraft:element_35","runtimeID":2757},{"data":7,"id":301,"name":"minecraft:element_35","runtimeID":2758},{"data":8,"id":301,"name":"minecraft:element_35","runtimeID":2759},{"data":9,"id":301,"name":"minecraft:element_35","runtimeID":2760},{"data":10,"id":301,"name":"minecraft:element_35","runtimeID":2761},{"data":11,"id":301,"name":"minecraft:element_35","runtimeID":2762},{"data":12,"id":301,"name":"minecraft:element_35","runtimeID":2763},{"data":13,"id":301,"name":"minecraft:element_35","runtimeID":2764},{"data":14,"id":301,"name":"minecraft:element_35","runtimeID":2765},{"data":15,"id":301,"name":"minecraft:element_35","runtimeID":2766},{"data":0,"id":302,"name":"minecraft:element_36","runtimeID":2767},{"data":1,"id":302,"name":"minecraft:element_36","runtimeID":2768},{"data":2,"id":302,"name":"minecraft:element_36","runtimeID":2769},{"data":3,"id":302,"name":"minecraft:element_36","runtimeID":2770},{"data":4,"id":302,"name":"minecraft:element_36","runtimeID":2771},{"data":5,"id":302,"name":"minecraft:element_36","runtimeID":2772},{"data":6,"id":302,"name":"minecraft:element_36","runtimeID":2773},{"data":7,"id":302,"name":"minecraft:element_36","runtimeID":2774},{"data":8,"id":302,"name":"minecraft:element_36","runtimeID":2775},{"data":9,"id":302,"name":"minecraft:element_36","runtimeID":2776},{"data":10,"id":302,"name":"minecraft:element_36","runtimeID":2777},{"data":11,"id":302,"name":"minecraft:element_36","runtimeID":2778},{"data":12,"id":302,"name":"minecraft:element_36","runtimeID":2779},{"data":13,"id":302,"name":"minecraft:element_36","runtimeID":2780},{"data":14,"id":302,"name":"minecraft:element_36","runtimeID":2781},{"data":15,"id":302,"name":"minecraft:element_36","runtimeID":2782},{"data":0,"id":303,"name":"minecraft:element_37","runtimeID":2783},{"data":1,"id":303,"name":"minecraft:element_37","runtimeID":2784},{"data":2,"id":303,"name":"minecraft:element_37","runtimeID":2785},{"data":3,"id":303,"name":"minecraft:element_37","runtimeID":2786},{"data":4,"id":303,"name":"minecraft:element_37","runtimeID":2787},{"data":5,"id":303,"name":"minecraft:element_37","runtimeID":2788},{"data":6,"id":303,"name":"minecraft:element_37","runtimeID":2789},{"data":7,"id":303,"name":"minecraft:element_37","runtimeID":2790},{"data":8,"id":303,"name":"minecraft:element_37","runtimeID":2791},{"data":9,"id":303,"name":"minecraft:element_37","runtimeID":2792},{"data":10,"id":303,"name":"minecraft:element_37","runtimeID":2793},{"data":11,"id":303,"name":"minecraft:element_37","runtimeID":2794},{"data":12,"id":303,"name":"minecraft:element_37","runtimeID":2795},{"data":13,"id":303,"name":"minecraft:element_37","runtimeID":2796},{"data":14,"id":303,"name":"minecraft:element_37","runtimeID":2797},{"data":15,"id":303,"name":"minecraft:element_37","runtimeID":2798},{"data":0,"id":304,"name":"minecraft:element_38","runtimeID":2799},{"data":1,"id":304,"name":"minecraft:element_38","runtimeID":2800},{"data":2,"id":304,"name":"minecraft:element_38","runtimeID":2801},{"data":3,"id":304,"name":"minecraft:element_38","runtimeID":2802},{"data":4,"id":304,"name":"minecraft:element_38","runtimeID":2803},{"data":5,"id":304,"name":"minecraft:element_38","runtimeID":2804},{"data":6,"id":304,"name":"minecraft:element_38","runtimeID":2805},{"data":7,"id":304,"name":"minecraft:element_38","runtimeID":2806},{"data":8,"id":304,"name":"minecraft:element_38","runtimeID":2807},{"data":9,"id":304,"name":"minecraft:element_38","runtimeID":2808},{"data":10,"id":304,"name":"minecraft:element_38","runtimeID":2809},{"data":11,"id":304,"name":"minecraft:element_38","runtimeID":2810},{"data":12,"id":304,"name":"minecraft:element_38","runtimeID":2811},{"data":13,"id":304,"name":"minecraft:element_38","runtimeID":2812},{"data":14,"id":304,"name":"minecraft:element_38","runtimeID":2813},{"data":15,"id":304,"name":"minecraft:element_38","runtimeID":2814},{"data":0,"id":305,"name":"minecraft:element_39","runtimeID":2815},{"data":1,"id":305,"name":"minecraft:element_39","runtimeID":2816},{"data":2,"id":305,"name":"minecraft:element_39","runtimeID":2817},{"data":3,"id":305,"name":"minecraft:element_39","runtimeID":2818},{"data":4,"id":305,"name":"minecraft:element_39","runtimeID":2819},{"data":5,"id":305,"name":"minecraft:element_39","runtimeID":2820},{"data":6,"id":305,"name":"minecraft:element_39","runtimeID":2821},{"data":7,"id":305,"name":"minecraft:element_39","runtimeID":2822},{"data":8,"id":305,"name":"minecraft:element_39","runtimeID":2823},{"data":9,"id":305,"name":"minecraft:element_39","runtimeID":2824},{"data":10,"id":305,"name":"minecraft:element_39","runtimeID":2825},{"data":11,"id":305,"name":"minecraft:element_39","runtimeID":2826},{"data":12,"id":305,"name":"minecraft:element_39","runtimeID":2827},{"data":13,"id":305,"name":"minecraft:element_39","runtimeID":2828},{"data":14,"id":305,"name":"minecraft:element_39","runtimeID":2829},{"data":15,"id":305,"name":"minecraft:element_39","runtimeID":2830},{"data":0,"id":306,"name":"minecraft:element_40","runtimeID":2831},{"data":1,"id":306,"name":"minecraft:element_40","runtimeID":2832},{"data":2,"id":306,"name":"minecraft:element_40","runtimeID":2833},{"data":3,"id":306,"name":"minecraft:element_40","runtimeID":2834},{"data":4,"id":306,"name":"minecraft:element_40","runtimeID":2835},{"data":5,"id":306,"name":"minecraft:element_40","runtimeID":2836},{"data":6,"id":306,"name":"minecraft:element_40","runtimeID":2837},{"data":7,"id":306,"name":"minecraft:element_40","runtimeID":2838},{"data":8,"id":306,"name":"minecraft:element_40","runtimeID":2839},{"data":9,"id":306,"name":"minecraft:element_40","runtimeID":2840},{"data":10,"id":306,"name":"minecraft:element_40","runtimeID":2841},{"data":11,"id":306,"name":"minecraft:element_40","runtimeID":2842},{"data":12,"id":306,"name":"minecraft:element_40","runtimeID":2843},{"data":13,"id":306,"name":"minecraft:element_40","runtimeID":2844},{"data":14,"id":306,"name":"minecraft:element_40","runtimeID":2845},{"data":15,"id":306,"name":"minecraft:element_40","runtimeID":2846},{"data":0,"id":307,"name":"minecraft:element_41","runtimeID":2847},{"data":1,"id":307,"name":"minecraft:element_41","runtimeID":2848},{"data":2,"id":307,"name":"minecraft:element_41","runtimeID":2849},{"data":3,"id":307,"name":"minecraft:element_41","runtimeID":2850},{"data":4,"id":307,"name":"minecraft:element_41","runtimeID":2851},{"data":5,"id":307,"name":"minecraft:element_41","runtimeID":2852},{"data":6,"id":307,"name":"minecraft:element_41","runtimeID":2853},{"data":7,"id":307,"name":"minecraft:element_41","runtimeID":2854},{"data":8,"id":307,"name":"minecraft:element_41","runtimeID":2855},{"data":9,"id":307,"name":"minecraft:element_41","runtimeID":2856},{"data":10,"id":307,"name":"minecraft:element_41","runtimeID":2857},{"data":11,"id":307,"name":"minecraft:element_41","runtimeID":2858},{"data":12,"id":307,"name":"minecraft:element_41","runtimeID":2859},{"data":13,"id":307,"name":"minecraft:element_41","runtimeID":2860},{"data":14,"id":307,"name":"minecraft:element_41","runtimeID":2861},{"data":15,"id":307,"name":"minecraft:element_41","runtimeID":2862},{"data":0,"id":308,"name":"minecraft:element_42","runtimeID":2863},{"data":1,"id":308,"name":"minecraft:element_42","runtimeID":2864},{"data":2,"id":308,"name":"minecraft:element_42","runtimeID":2865},{"data":3,"id":308,"name":"minecraft:element_42","runtimeID":2866},{"data":4,"id":308,"name":"minecraft:element_42","runtimeID":2867},{"data":5,"id":308,"name":"minecraft:element_42","runtimeID":2868},{"data":6,"id":308,"name":"minecraft:element_42","runtimeID":2869},{"data":7,"id":308,"name":"minecraft:element_42","runtimeID":2870},{"data":8,"id":308,"name":"minecraft:element_42","runtimeID":2871},{"data":9,"id":308,"name":"minecraft:element_42","runtimeID":2872},{"data":10,"id":308,"name":"minecraft:element_42","runtimeID":2873},{"data":11,"id":308,"name":"minecraft:element_42","runtimeID":2874},{"data":12,"id":308,"name":"minecraft:element_42","runtimeID":2875},{"data":13,"id":308,"name":"minecraft:element_42","runtimeID":2876},{"data":14,"id":308,"name":"minecraft:element_42","runtimeID":2877},{"data":15,"id":308,"name":"minecraft:element_42","runtimeID":2878},{"data":0,"id":309,"name":"minecraft:element_43","runtimeID":2879},{"data":1,"id":309,"name":"minecraft:element_43","runtimeID":2880},{"data":2,"id":309,"name":"minecraft:element_43","runtimeID":2881},{"data":3,"id":309,"name":"minecraft:element_43","runtimeID":2882},{"data":4,"id":309,"name":"minecraft:element_43","runtimeID":2883},{"data":5,"id":309,"name":"minecraft:element_43","runtimeID":2884},{"data":6,"id":309,"name":"minecraft:element_43","runtimeID":2885},{"data":7,"id":309,"name":"minecraft:element_43","runtimeID":2886},{"data":8,"id":309,"name":"minecraft:element_43","runtimeID":2887},{"data":9,"id":309,"name":"minecraft:element_43","runtimeID":2888},{"data":10,"id":309,"name":"minecraft:element_43","runtimeID":2889},{"data":11,"id":309,"name":"minecraft:element_43","runtimeID":2890},{"data":12,"id":309,"name":"minecraft:element_43","runtimeID":2891},{"data":13,"id":309,"name":"minecraft:element_43","runtimeID":2892},{"data":14,"id":309,"name":"minecraft:element_43","runtimeID":2893},{"data":15,"id":309,"name":"minecraft:element_43","runtimeID":2894},{"data":0,"id":310,"name":"minecraft:element_44","runtimeID":2895},{"data":1,"id":310,"name":"minecraft:element_44","runtimeID":2896},{"data":2,"id":310,"name":"minecraft:element_44","runtimeID":2897},{"data":3,"id":310,"name":"minecraft:element_44","runtimeID":2898},{"data":4,"id":310,"name":"minecraft:element_44","runtimeID":2899},{"data":5,"id":310,"name":"minecraft:element_44","runtimeID":2900},{"data":6,"id":310,"name":"minecraft:element_44","runtimeID":2901},{"data":7,"id":310,"name":"minecraft:element_44","runtimeID":2902},{"data":8,"id":310,"name":"minecraft:element_44","runtimeID":2903},{"data":9,"id":310,"name":"minecraft:element_44","runtimeID":2904},{"data":10,"id":310,"name":"minecraft:element_44","runtimeID":2905},{"data":11,"id":310,"name":"minecraft:element_44","runtimeID":2906},{"data":12,"id":310,"name":"minecraft:element_44","runtimeID":2907},{"data":13,"id":310,"name":"minecraft:element_44","runtimeID":2908},{"data":14,"id":310,"name":"minecraft:element_44","runtimeID":2909},{"data":15,"id":310,"name":"minecraft:element_44","runtimeID":2910},{"data":0,"id":311,"name":"minecraft:element_45","runtimeID":2911},{"data":1,"id":311,"name":"minecraft:element_45","runtimeID":2912},{"data":2,"id":311,"name":"minecraft:element_45","runtimeID":2913},{"data":3,"id":311,"name":"minecraft:element_45","runtimeID":2914},{"data":4,"id":311,"name":"minecraft:element_45","runtimeID":2915},{"data":5,"id":311,"name":"minecraft:element_45","runtimeID":2916},{"data":6,"id":311,"name":"minecraft:element_45","runtimeID":2917},{"data":7,"id":311,"name":"minecraft:element_45","runtimeID":2918},{"data":8,"id":311,"name":"minecraft:element_45","runtimeID":2919},{"data":9,"id":311,"name":"minecraft:element_45","runtimeID":2920},{"data":10,"id":311,"name":"minecraft:element_45","runtimeID":2921},{"data":11,"id":311,"name":"minecraft:element_45","runtimeID":2922},{"data":12,"id":311,"name":"minecraft:element_45","runtimeID":2923},{"data":13,"id":311,"name":"minecraft:element_45","runtimeID":2924},{"data":14,"id":311,"name":"minecraft:element_45","runtimeID":2925},{"data":15,"id":311,"name":"minecraft:element_45","runtimeID":2926},{"data":0,"id":312,"name":"minecraft:element_46","runtimeID":2927},{"data":1,"id":312,"name":"minecraft:element_46","runtimeID":2928},{"data":2,"id":312,"name":"minecraft:element_46","runtimeID":2929},{"data":3,"id":312,"name":"minecraft:element_46","runtimeID":2930},{"data":4,"id":312,"name":"minecraft:element_46","runtimeID":2931},{"data":5,"id":312,"name":"minecraft:element_46","runtimeID":2932},{"data":6,"id":312,"name":"minecraft:element_46","runtimeID":2933},{"data":7,"id":312,"name":"minecraft:element_46","runtimeID":2934},{"data":8,"id":312,"name":"minecraft:element_46","runtimeID":2935},{"data":9,"id":312,"name":"minecraft:element_46","runtimeID":2936},{"data":10,"id":312,"name":"minecraft:element_46","runtimeID":2937},{"data":11,"id":312,"name":"minecraft:element_46","runtimeID":2938},{"data":12,"id":312,"name":"minecraft:element_46","runtimeID":2939},{"data":13,"id":312,"name":"minecraft:element_46","runtimeID":2940},{"data":14,"id":312,"name":"minecraft:element_46","runtimeID":2941},{"data":15,"id":312,"name":"minecraft:element_46","runtimeID":2942},{"data":0,"id":313,"name":"minecraft:element_47","runtimeID":2943},{"data":1,"id":313,"name":"minecraft:element_47","runtimeID":2944},{"data":2,"id":313,"name":"minecraft:element_47","runtimeID":2945},{"data":3,"id":313,"name":"minecraft:element_47","runtimeID":2946},{"data":4,"id":313,"name":"minecraft:element_47","runtimeID":2947},{"data":5,"id":313,"name":"minecraft:element_47","runtimeID":2948},{"data":6,"id":313,"name":"minecraft:element_47","runtimeID":2949},{"data":7,"id":313,"name":"minecraft:element_47","runtimeID":2950},{"data":8,"id":313,"name":"minecraft:element_47","runtimeID":2951},{"data":9,"id":313,"name":"minecraft:element_47","runtimeID":2952},{"data":10,"id":313,"name":"minecraft:element_47","runtimeID":2953},{"data":11,"id":313,"name":"minecraft:element_47","runtimeID":2954},{"data":12,"id":313,"name":"minecraft:element_47","runtimeID":2955},{"data":13,"id":313,"name":"minecraft:element_47","runtimeID":2956},{"data":14,"id":313,"name":"minecraft:element_47","runtimeID":2957},{"data":15,"id":313,"name":"minecraft:element_47","runtimeID":2958},{"data":0,"id":314,"name":"minecraft:element_48","runtimeID":2959},{"data":1,"id":314,"name":"minecraft:element_48","runtimeID":2960},{"data":2,"id":314,"name":"minecraft:element_48","runtimeID":2961},{"data":3,"id":314,"name":"minecraft:element_48","runtimeID":2962},{"data":4,"id":314,"name":"minecraft:element_48","runtimeID":2963},{"data":5,"id":314,"name":"minecraft:element_48","runtimeID":2964},{"data":6,"id":314,"name":"minecraft:element_48","runtimeID":2965},{"data":7,"id":314,"name":"minecraft:element_48","runtimeID":2966},{"data":8,"id":314,"name":"minecraft:element_48","runtimeID":2967},{"data":9,"id":314,"name":"minecraft:element_48","runtimeID":2968},{"data":10,"id":314,"name":"minecraft:element_48","runtimeID":2969},{"data":11,"id":314,"name":"minecraft:element_48","runtimeID":2970},{"data":12,"id":314,"name":"minecraft:element_48","runtimeID":2971},{"data":13,"id":314,"name":"minecraft:element_48","runtimeID":2972},{"data":14,"id":314,"name":"minecraft:element_48","runtimeID":2973},{"data":15,"id":314,"name":"minecraft:element_48","runtimeID":2974},{"data":0,"id":315,"name":"minecraft:element_49","runtimeID":2975},{"data":1,"id":315,"name":"minecraft:element_49","runtimeID":2976},{"data":2,"id":315,"name":"minecraft:element_49","runtimeID":2977},{"data":3,"id":315,"name":"minecraft:element_49","runtimeID":2978},{"data":4,"id":315,"name":"minecraft:element_49","runtimeID":2979},{"data":5,"id":315,"name":"minecraft:element_49","runtimeID":2980},{"data":6,"id":315,"name":"minecraft:element_49","runtimeID":2981},{"data":7,"id":315,"name":"minecraft:element_49","runtimeID":2982},{"data":8,"id":315,"name":"minecraft:element_49","runtimeID":2983},{"data":9,"id":315,"name":"minecraft:element_49","runtimeID":2984},{"data":10,"id":315,"name":"minecraft:element_49","runtimeID":2985},{"data":11,"id":315,"name":"minecraft:element_49","runtimeID":2986},{"data":12,"id":315,"name":"minecraft:element_49","runtimeID":2987},{"data":13,"id":315,"name":"minecraft:element_49","runtimeID":2988},{"data":14,"id":315,"name":"minecraft:element_49","runtimeID":2989},{"data":15,"id":315,"name":"minecraft:element_49","runtimeID":2990},{"data":0,"id":316,"name":"minecraft:element_50","runtimeID":2991},{"data":1,"id":316,"name":"minecraft:element_50","runtimeID":2992},{"data":2,"id":316,"name":"minecraft:element_50","runtimeID":2993},{"data":3,"id":316,"name":"minecraft:element_50","runtimeID":2994},{"data":4,"id":316,"name":"minecraft:element_50","runtimeID":2995},{"data":5,"id":316,"name":"minecraft:element_50","runtimeID":2996},{"data":6,"id":316,"name":"minecraft:element_50","runtimeID":2997},{"data":7,"id":316,"name":"minecraft:element_50","runtimeID":2998},{"data":8,"id":316,"name":"minecraft:element_50","runtimeID":2999},{"data":9,"id":316,"name":"minecraft:element_50","runtimeID":3000},{"data":10,"id":316,"name":"minecraft:element_50","runtimeID":3001},{"data":11,"id":316,"name":"minecraft:element_50","runtimeID":3002},{"data":12,"id":316,"name":"minecraft:element_50","runtimeID":3003},{"data":13,"id":316,"name":"minecraft:element_50","runtimeID":3004},{"data":14,"id":316,"name":"minecraft:element_50","runtimeID":3005},{"data":15,"id":316,"name":"minecraft:element_50","runtimeID":3006},{"data":0,"id":317,"name":"minecraft:element_51","runtimeID":3007},{"data":1,"id":317,"name":"minecraft:element_51","runtimeID":3008},{"data":2,"id":317,"name":"minecraft:element_51","runtimeID":3009},{"data":3,"id":317,"name":"minecraft:element_51","runtimeID":3010},{"data":4,"id":317,"name":"minecraft:element_51","runtimeID":3011},{"data":5,"id":317,"name":"minecraft:element_51","runtimeID":3012},{"data":6,"id":317,"name":"minecraft:element_51","runtimeID":3013},{"data":7,"id":317,"name":"minecraft:element_51","runtimeID":3014},{"data":8,"id":317,"name":"minecraft:element_51","runtimeID":3015},{"data":9,"id":317,"name":"minecraft:element_51","runtimeID":3016},{"data":10,"id":317,"name":"minecraft:element_51","runtimeID":3017},{"data":11,"id":317,"name":"minecraft:element_51","runtimeID":3018},{"data":12,"id":317,"name":"minecraft:element_51","runtimeID":3019},{"data":13,"id":317,"name":"minecraft:element_51","runtimeID":3020},{"data":14,"id":317,"name":"minecraft:element_51","runtimeID":3021},{"data":15,"id":317,"name":"minecraft:element_51","runtimeID":3022},{"data":0,"id":318,"name":"minecraft:element_52","runtimeID":3023},{"data":1,"id":318,"name":"minecraft:element_52","runtimeID":3024},{"data":2,"id":318,"name":"minecraft:element_52","runtimeID":3025},{"data":3,"id":318,"name":"minecraft:element_52","runtimeID":3026},{"data":4,"id":318,"name":"minecraft:element_52","runtimeID":3027},{"data":5,"id":318,"name":"minecraft:element_52","runtimeID":3028},{"data":6,"id":318,"name":"minecraft:element_52","runtimeID":3029},{"data":7,"id":318,"name":"minecraft:element_52","runtimeID":3030},{"data":8,"id":318,"name":"minecraft:element_52","runtimeID":3031},{"data":9,"id":318,"name":"minecraft:element_52","runtimeID":3032},{"data":10,"id":318,"name":"minecraft:element_52","runtimeID":3033},{"data":11,"id":318,"name":"minecraft:element_52","runtimeID":3034},{"data":12,"id":318,"name":"minecraft:element_52","runtimeID":3035},{"data":13,"id":318,"name":"minecraft:element_52","runtimeID":3036},{"data":14,"id":318,"name":"minecraft:element_52","runtimeID":3037},{"data":15,"id":318,"name":"minecraft:element_52","runtimeID":3038},{"data":0,"id":319,"name":"minecraft:element_53","runtimeID":3039},{"data":1,"id":319,"name":"minecraft:element_53","runtimeID":3040},{"data":2,"id":319,"name":"minecraft:element_53","runtimeID":3041},{"data":3,"id":319,"name":"minecraft:element_53","runtimeID":3042},{"data":4,"id":319,"name":"minecraft:element_53","runtimeID":3043},{"data":5,"id":319,"name":"minecraft:element_53","runtimeID":3044},{"data":6,"id":319,"name":"minecraft:element_53","runtimeID":3045},{"data":7,"id":319,"name":"minecraft:element_53","runtimeID":3046},{"data":8,"id":319,"name":"minecraft:element_53","runtimeID":3047},{"data":9,"id":319,"name":"minecraft:element_53","runtimeID":3048},{"data":10,"id":319,"name":"minecraft:element_53","runtimeID":3049},{"data":11,"id":319,"name":"minecraft:element_53","runtimeID":3050},{"data":12,"id":319,"name":"minecraft:element_53","runtimeID":3051},{"data":13,"id":319,"name":"minecraft:element_53","runtimeID":3052},{"data":14,"id":319,"name":"minecraft:element_53","runtimeID":3053},{"data":15,"id":319,"name":"minecraft:element_53","runtimeID":3054},{"data":0,"id":320,"name":"minecraft:element_54","runtimeID":3055},{"data":1,"id":320,"name":"minecraft:element_54","runtimeID":3056},{"data":2,"id":320,"name":"minecraft:element_54","runtimeID":3057},{"data":3,"id":320,"name":"minecraft:element_54","runtimeID":3058},{"data":4,"id":320,"name":"minecraft:element_54","runtimeID":3059},{"data":5,"id":320,"name":"minecraft:element_54","runtimeID":3060},{"data":6,"id":320,"name":"minecraft:element_54","runtimeID":3061},{"data":7,"id":320,"name":"minecraft:element_54","runtimeID":3062},{"data":8,"id":320,"name":"minecraft:element_54","runtimeID":3063},{"data":9,"id":320,"name":"minecraft:element_54","runtimeID":3064},{"data":10,"id":320,"name":"minecraft:element_54","runtimeID":3065},{"data":11,"id":320,"name":"minecraft:element_54","runtimeID":3066},{"data":12,"id":320,"name":"minecraft:element_54","runtimeID":3067},{"data":13,"id":320,"name":"minecraft:element_54","runtimeID":3068},{"data":14,"id":320,"name":"minecraft:element_54","runtimeID":3069},{"data":15,"id":320,"name":"minecraft:element_54","runtimeID":3070},{"data":0,"id":321,"name":"minecraft:element_55","runtimeID":3071},{"data":1,"id":321,"name":"minecraft:element_55","runtimeID":3072},{"data":2,"id":321,"name":"minecraft:element_55","runtimeID":3073},{"data":3,"id":321,"name":"minecraft:element_55","runtimeID":3074},{"data":4,"id":321,"name":"minecraft:element_55","runtimeID":3075},{"data":5,"id":321,"name":"minecraft:element_55","runtimeID":3076},{"data":6,"id":321,"name":"minecraft:element_55","runtimeID":3077},{"data":7,"id":321,"name":"minecraft:element_55","runtimeID":3078},{"data":8,"id":321,"name":"minecraft:element_55","runtimeID":3079},{"data":9,"id":321,"name":"minecraft:element_55","runtimeID":3080},{"data":10,"id":321,"name":"minecraft:element_55","runtimeID":3081},{"data":11,"id":321,"name":"minecraft:element_55","runtimeID":3082},{"data":12,"id":321,"name":"minecraft:element_55","runtimeID":3083},{"data":13,"id":321,"name":"minecraft:element_55","runtimeID":3084},{"data":14,"id":321,"name":"minecraft:element_55","runtimeID":3085},{"data":15,"id":321,"name":"minecraft:element_55","runtimeID":3086},{"data":0,"id":322,"name":"minecraft:element_56","runtimeID":3087},{"data":1,"id":322,"name":"minecraft:element_56","runtimeID":3088},{"data":2,"id":322,"name":"minecraft:element_56","runtimeID":3089},{"data":3,"id":322,"name":"minecraft:element_56","runtimeID":3090},{"data":4,"id":322,"name":"minecraft:element_56","runtimeID":3091},{"data":5,"id":322,"name":"minecraft:element_56","runtimeID":3092},{"data":6,"id":322,"name":"minecraft:element_56","runtimeID":3093},{"data":7,"id":322,"name":"minecraft:element_56","runtimeID":3094},{"data":8,"id":322,"name":"minecraft:element_56","runtimeID":3095},{"data":9,"id":322,"name":"minecraft:element_56","runtimeID":3096},{"data":10,"id":322,"name":"minecraft:element_56","runtimeID":3097},{"data":11,"id":322,"name":"minecraft:element_56","runtimeID":3098},{"data":12,"id":322,"name":"minecraft:element_56","runtimeID":3099},{"data":13,"id":322,"name":"minecraft:element_56","runtimeID":3100},{"data":14,"id":322,"name":"minecraft:element_56","runtimeID":3101},{"data":15,"id":322,"name":"minecraft:element_56","runtimeID":3102},{"data":0,"id":323,"name":"minecraft:element_57","runtimeID":3103},{"data":1,"id":323,"name":"minecraft:element_57","runtimeID":3104},{"data":2,"id":323,"name":"minecraft:element_57","runtimeID":3105},{"data":3,"id":323,"name":"minecraft:element_57","runtimeID":3106},{"data":4,"id":323,"name":"minecraft:element_57","runtimeID":3107},{"data":5,"id":323,"name":"minecraft:element_57","runtimeID":3108},{"data":6,"id":323,"name":"minecraft:element_57","runtimeID":3109},{"data":7,"id":323,"name":"minecraft:element_57","runtimeID":3110},{"data":8,"id":323,"name":"minecraft:element_57","runtimeID":3111},{"data":9,"id":323,"name":"minecraft:element_57","runtimeID":3112},{"data":10,"id":323,"name":"minecraft:element_57","runtimeID":3113},{"data":11,"id":323,"name":"minecraft:element_57","runtimeID":3114},{"data":12,"id":323,"name":"minecraft:element_57","runtimeID":3115},{"data":13,"id":323,"name":"minecraft:element_57","runtimeID":3116},{"data":14,"id":323,"name":"minecraft:element_57","runtimeID":3117},{"data":15,"id":323,"name":"minecraft:element_57","runtimeID":3118},{"data":0,"id":324,"name":"minecraft:element_58","runtimeID":3119},{"data":1,"id":324,"name":"minecraft:element_58","runtimeID":3120},{"data":2,"id":324,"name":"minecraft:element_58","runtimeID":3121},{"data":3,"id":324,"name":"minecraft:element_58","runtimeID":3122},{"data":4,"id":324,"name":"minecraft:element_58","runtimeID":3123},{"data":5,"id":324,"name":"minecraft:element_58","runtimeID":3124},{"data":6,"id":324,"name":"minecraft:element_58","runtimeID":3125},{"data":7,"id":324,"name":"minecraft:element_58","runtimeID":3126},{"data":8,"id":324,"name":"minecraft:element_58","runtimeID":3127},{"data":9,"id":324,"name":"minecraft:element_58","runtimeID":3128},{"data":10,"id":324,"name":"minecraft:element_58","runtimeID":3129},{"data":11,"id":324,"name":"minecraft:element_58","runtimeID":3130},{"data":12,"id":324,"name":"minecraft:element_58","runtimeID":3131},{"data":13,"id":324,"name":"minecraft:element_58","runtimeID":3132},{"data":14,"id":324,"name":"minecraft:element_58","runtimeID":3133},{"data":15,"id":324,"name":"minecraft:element_58","runtimeID":3134},{"data":0,"id":325,"name":"minecraft:element_59","runtimeID":3135},{"data":1,"id":325,"name":"minecraft:element_59","runtimeID":3136},{"data":2,"id":325,"name":"minecraft:element_59","runtimeID":3137},{"data":3,"id":325,"name":"minecraft:element_59","runtimeID":3138},{"data":4,"id":325,"name":"minecraft:element_59","runtimeID":3139},{"data":5,"id":325,"name":"minecraft:element_59","runtimeID":3140},{"data":6,"id":325,"name":"minecraft:element_59","runtimeID":3141},{"data":7,"id":325,"name":"minecraft:element_59","runtimeID":3142},{"data":8,"id":325,"name":"minecraft:element_59","runtimeID":3143},{"data":9,"id":325,"name":"minecraft:element_59","runtimeID":3144},{"data":10,"id":325,"name":"minecraft:element_59","runtimeID":3145},{"data":11,"id":325,"name":"minecraft:element_59","runtimeID":3146},{"data":12,"id":325,"name":"minecraft:element_59","runtimeID":3147},{"data":13,"id":325,"name":"minecraft:element_59","runtimeID":3148},{"data":14,"id":325,"name":"minecraft:element_59","runtimeID":3149},{"data":15,"id":325,"name":"minecraft:element_59","runtimeID":3150},{"data":0,"id":326,"name":"minecraft:element_60","runtimeID":3151},{"data":1,"id":326,"name":"minecraft:element_60","runtimeID":3152},{"data":2,"id":326,"name":"minecraft:element_60","runtimeID":3153},{"data":3,"id":326,"name":"minecraft:element_60","runtimeID":3154},{"data":4,"id":326,"name":"minecraft:element_60","runtimeID":3155},{"data":5,"id":326,"name":"minecraft:element_60","runtimeID":3156},{"data":6,"id":326,"name":"minecraft:element_60","runtimeID":3157},{"data":7,"id":326,"name":"minecraft:element_60","runtimeID":3158},{"data":8,"id":326,"name":"minecraft:element_60","runtimeID":3159},{"data":9,"id":326,"name":"minecraft:element_60","runtimeID":3160},{"data":10,"id":326,"name":"minecraft:element_60","runtimeID":3161},{"data":11,"id":326,"name":"minecraft:element_60","runtimeID":3162},{"data":12,"id":326,"name":"minecraft:element_60","runtimeID":3163},{"data":13,"id":326,"name":"minecraft:element_60","runtimeID":3164},{"data":14,"id":326,"name":"minecraft:element_60","runtimeID":3165},{"data":15,"id":326,"name":"minecraft:element_60","runtimeID":3166},{"data":0,"id":327,"name":"minecraft:element_61","runtimeID":3167},{"data":1,"id":327,"name":"minecraft:element_61","runtimeID":3168},{"data":2,"id":327,"name":"minecraft:element_61","runtimeID":3169},{"data":3,"id":327,"name":"minecraft:element_61","runtimeID":3170},{"data":4,"id":327,"name":"minecraft:element_61","runtimeID":3171},{"data":5,"id":327,"name":"minecraft:element_61","runtimeID":3172},{"data":6,"id":327,"name":"minecraft:element_61","runtimeID":3173},{"data":7,"id":327,"name":"minecraft:element_61","runtimeID":3174},{"data":8,"id":327,"name":"minecraft:element_61","runtimeID":3175},{"data":9,"id":327,"name":"minecraft:element_61","runtimeID":3176},{"data":10,"id":327,"name":"minecraft:element_61","runtimeID":3177},{"data":11,"id":327,"name":"minecraft:element_61","runtimeID":3178},{"data":12,"id":327,"name":"minecraft:element_61","runtimeID":3179},{"data":13,"id":327,"name":"minecraft:element_61","runtimeID":3180},{"data":14,"id":327,"name":"minecraft:element_61","runtimeID":3181},{"data":15,"id":327,"name":"minecraft:element_61","runtimeID":3182},{"data":0,"id":328,"name":"minecraft:element_62","runtimeID":3183},{"data":1,"id":328,"name":"minecraft:element_62","runtimeID":3184},{"data":2,"id":328,"name":"minecraft:element_62","runtimeID":3185},{"data":3,"id":328,"name":"minecraft:element_62","runtimeID":3186},{"data":4,"id":328,"name":"minecraft:element_62","runtimeID":3187},{"data":5,"id":328,"name":"minecraft:element_62","runtimeID":3188},{"data":6,"id":328,"name":"minecraft:element_62","runtimeID":3189},{"data":7,"id":328,"name":"minecraft:element_62","runtimeID":3190},{"data":8,"id":328,"name":"minecraft:element_62","runtimeID":3191},{"data":9,"id":328,"name":"minecraft:element_62","runtimeID":3192},{"data":10,"id":328,"name":"minecraft:element_62","runtimeID":3193},{"data":11,"id":328,"name":"minecraft:element_62","runtimeID":3194},{"data":12,"id":328,"name":"minecraft:element_62","runtimeID":3195},{"data":13,"id":328,"name":"minecraft:element_62","runtimeID":3196},{"data":14,"id":328,"name":"minecraft:element_62","runtimeID":3197},{"data":15,"id":328,"name":"minecraft:element_62","runtimeID":3198},{"data":0,"id":329,"name":"minecraft:element_63","runtimeID":3199},{"data":1,"id":329,"name":"minecraft:element_63","runtimeID":3200},{"data":2,"id":329,"name":"minecraft:element_63","runtimeID":3201},{"data":3,"id":329,"name":"minecraft:element_63","runtimeID":3202},{"data":4,"id":329,"name":"minecraft:element_63","runtimeID":3203},{"data":5,"id":329,"name":"minecraft:element_63","runtimeID":3204},{"data":6,"id":329,"name":"minecraft:element_63","runtimeID":3205},{"data":7,"id":329,"name":"minecraft:element_63","runtimeID":3206},{"data":8,"id":329,"name":"minecraft:element_63","runtimeID":3207},{"data":9,"id":329,"name":"minecraft:element_63","runtimeID":3208},{"data":10,"id":329,"name":"minecraft:element_63","runtimeID":3209},{"data":11,"id":329,"name":"minecraft:element_63","runtimeID":3210},{"data":12,"id":329,"name":"minecraft:element_63","runtimeID":3211},{"data":13,"id":329,"name":"minecraft:element_63","runtimeID":3212},{"data":14,"id":329,"name":"minecraft:element_63","runtimeID":3213},{"data":15,"id":329,"name":"minecraft:element_63","runtimeID":3214},{"data":0,"id":330,"name":"minecraft:element_64","runtimeID":3215},{"data":1,"id":330,"name":"minecraft:element_64","runtimeID":3216},{"data":2,"id":330,"name":"minecraft:element_64","runtimeID":3217},{"data":3,"id":330,"name":"minecraft:element_64","runtimeID":3218},{"data":4,"id":330,"name":"minecraft:element_64","runtimeID":3219},{"data":5,"id":330,"name":"minecraft:element_64","runtimeID":3220},{"data":6,"id":330,"name":"minecraft:element_64","runtimeID":3221},{"data":7,"id":330,"name":"minecraft:element_64","runtimeID":3222},{"data":8,"id":330,"name":"minecraft:element_64","runtimeID":3223},{"data":9,"id":330,"name":"minecraft:element_64","runtimeID":3224},{"data":10,"id":330,"name":"minecraft:element_64","runtimeID":3225},{"data":11,"id":330,"name":"minecraft:element_64","runtimeID":3226},{"data":12,"id":330,"name":"minecraft:element_64","runtimeID":3227},{"data":13,"id":330,"name":"minecraft:element_64","runtimeID":3228},{"data":14,"id":330,"name":"minecraft:element_64","runtimeID":3229},{"data":15,"id":330,"name":"minecraft:element_64","runtimeID":3230},{"data":0,"id":331,"name":"minecraft:element_65","runtimeID":3231},{"data":1,"id":331,"name":"minecraft:element_65","runtimeID":3232},{"data":2,"id":331,"name":"minecraft:element_65","runtimeID":3233},{"data":3,"id":331,"name":"minecraft:element_65","runtimeID":3234},{"data":4,"id":331,"name":"minecraft:element_65","runtimeID":3235},{"data":5,"id":331,"name":"minecraft:element_65","runtimeID":3236},{"data":6,"id":331,"name":"minecraft:element_65","runtimeID":3237},{"data":7,"id":331,"name":"minecraft:element_65","runtimeID":3238},{"data":8,"id":331,"name":"minecraft:element_65","runtimeID":3239},{"data":9,"id":331,"name":"minecraft:element_65","runtimeID":3240},{"data":10,"id":331,"name":"minecraft:element_65","runtimeID":3241},{"data":11,"id":331,"name":"minecraft:element_65","runtimeID":3242},{"data":12,"id":331,"name":"minecraft:element_65","runtimeID":3243},{"data":13,"id":331,"name":"minecraft:element_65","runtimeID":3244},{"data":14,"id":331,"name":"minecraft:element_65","runtimeID":3245},{"data":15,"id":331,"name":"minecraft:element_65","runtimeID":3246},{"data":0,"id":332,"name":"minecraft:element_66","runtimeID":3247},{"data":1,"id":332,"name":"minecraft:element_66","runtimeID":3248},{"data":2,"id":332,"name":"minecraft:element_66","runtimeID":3249},{"data":3,"id":332,"name":"minecraft:element_66","runtimeID":3250},{"data":4,"id":332,"name":"minecraft:element_66","runtimeID":3251},{"data":5,"id":332,"name":"minecraft:element_66","runtimeID":3252},{"data":6,"id":332,"name":"minecraft:element_66","runtimeID":3253},{"data":7,"id":332,"name":"minecraft:element_66","runtimeID":3254},{"data":8,"id":332,"name":"minecraft:element_66","runtimeID":3255},{"data":9,"id":332,"name":"minecraft:element_66","runtimeID":3256},{"data":10,"id":332,"name":"minecraft:element_66","runtimeID":3257},{"data":11,"id":332,"name":"minecraft:element_66","runtimeID":3258},{"data":12,"id":332,"name":"minecraft:element_66","runtimeID":3259},{"data":13,"id":332,"name":"minecraft:element_66","runtimeID":3260},{"data":14,"id":332,"name":"minecraft:element_66","runtimeID":3261},{"data":15,"id":332,"name":"minecraft:element_66","runtimeID":3262},{"data":0,"id":333,"name":"minecraft:element_67","runtimeID":3263},{"data":1,"id":333,"name":"minecraft:element_67","runtimeID":3264},{"data":2,"id":333,"name":"minecraft:element_67","runtimeID":3265},{"data":3,"id":333,"name":"minecraft:element_67","runtimeID":3266},{"data":4,"id":333,"name":"minecraft:element_67","runtimeID":3267},{"data":5,"id":333,"name":"minecraft:element_67","runtimeID":3268},{"data":6,"id":333,"name":"minecraft:element_67","runtimeID":3269},{"data":7,"id":333,"name":"minecraft:element_67","runtimeID":3270},{"data":8,"id":333,"name":"minecraft:element_67","runtimeID":3271},{"data":9,"id":333,"name":"minecraft:element_67","runtimeID":3272},{"data":10,"id":333,"name":"minecraft:element_67","runtimeID":3273},{"data":11,"id":333,"name":"minecraft:element_67","runtimeID":3274},{"data":12,"id":333,"name":"minecraft:element_67","runtimeID":3275},{"data":13,"id":333,"name":"minecraft:element_67","runtimeID":3276},{"data":14,"id":333,"name":"minecraft:element_67","runtimeID":3277},{"data":15,"id":333,"name":"minecraft:element_67","runtimeID":3278},{"data":0,"id":334,"name":"minecraft:element_68","runtimeID":3279},{"data":1,"id":334,"name":"minecraft:element_68","runtimeID":3280},{"data":2,"id":334,"name":"minecraft:element_68","runtimeID":3281},{"data":3,"id":334,"name":"minecraft:element_68","runtimeID":3282},{"data":4,"id":334,"name":"minecraft:element_68","runtimeID":3283},{"data":5,"id":334,"name":"minecraft:element_68","runtimeID":3284},{"data":6,"id":334,"name":"minecraft:element_68","runtimeID":3285},{"data":7,"id":334,"name":"minecraft:element_68","runtimeID":3286},{"data":8,"id":334,"name":"minecraft:element_68","runtimeID":3287},{"data":9,"id":334,"name":"minecraft:element_68","runtimeID":3288},{"data":10,"id":334,"name":"minecraft:element_68","runtimeID":3289},{"data":11,"id":334,"name":"minecraft:element_68","runtimeID":3290},{"data":12,"id":334,"name":"minecraft:element_68","runtimeID":3291},{"data":13,"id":334,"name":"minecraft:element_68","runtimeID":3292},{"data":14,"id":334,"name":"minecraft:element_68","runtimeID":3293},{"data":15,"id":334,"name":"minecraft:element_68","runtimeID":3294},{"data":0,"id":335,"name":"minecraft:element_69","runtimeID":3295},{"data":1,"id":335,"name":"minecraft:element_69","runtimeID":3296},{"data":2,"id":335,"name":"minecraft:element_69","runtimeID":3297},{"data":3,"id":335,"name":"minecraft:element_69","runtimeID":3298},{"data":4,"id":335,"name":"minecraft:element_69","runtimeID":3299},{"data":5,"id":335,"name":"minecraft:element_69","runtimeID":3300},{"data":6,"id":335,"name":"minecraft:element_69","runtimeID":3301},{"data":7,"id":335,"name":"minecraft:element_69","runtimeID":3302},{"data":8,"id":335,"name":"minecraft:element_69","runtimeID":3303},{"data":9,"id":335,"name":"minecraft:element_69","runtimeID":3304},{"data":10,"id":335,"name":"minecraft:element_69","runtimeID":3305},{"data":11,"id":335,"name":"minecraft:element_69","runtimeID":3306},{"data":12,"id":335,"name":"minecraft:element_69","runtimeID":3307},{"data":13,"id":335,"name":"minecraft:element_69","runtimeID":3308},{"data":14,"id":335,"name":"minecraft:element_69","runtimeID":3309},{"data":15,"id":335,"name":"minecraft:element_69","runtimeID":3310},{"data":0,"id":336,"name":"minecraft:element_70","runtimeID":3311},{"data":1,"id":336,"name":"minecraft:element_70","runtimeID":3312},{"data":2,"id":336,"name":"minecraft:element_70","runtimeID":3313},{"data":3,"id":336,"name":"minecraft:element_70","runtimeID":3314},{"data":4,"id":336,"name":"minecraft:element_70","runtimeID":3315},{"data":5,"id":336,"name":"minecraft:element_70","runtimeID":3316},{"data":6,"id":336,"name":"minecraft:element_70","runtimeID":3317},{"data":7,"id":336,"name":"minecraft:element_70","runtimeID":3318},{"data":8,"id":336,"name":"minecraft:element_70","runtimeID":3319},{"data":9,"id":336,"name":"minecraft:element_70","runtimeID":3320},{"data":10,"id":336,"name":"minecraft:element_70","runtimeID":3321},{"data":11,"id":336,"name":"minecraft:element_70","runtimeID":3322},{"data":12,"id":336,"name":"minecraft:element_70","runtimeID":3323},{"data":13,"id":336,"name":"minecraft:element_70","runtimeID":3324},{"data":14,"id":336,"name":"minecraft:element_70","runtimeID":3325},{"data":15,"id":336,"name":"minecraft:element_70","runtimeID":3326},{"data":0,"id":337,"name":"minecraft:element_71","runtimeID":3327},{"data":1,"id":337,"name":"minecraft:element_71","runtimeID":3328},{"data":2,"id":337,"name":"minecraft:element_71","runtimeID":3329},{"data":3,"id":337,"name":"minecraft:element_71","runtimeID":3330},{"data":4,"id":337,"name":"minecraft:element_71","runtimeID":3331},{"data":5,"id":337,"name":"minecraft:element_71","runtimeID":3332},{"data":6,"id":337,"name":"minecraft:element_71","runtimeID":3333},{"data":7,"id":337,"name":"minecraft:element_71","runtimeID":3334},{"data":8,"id":337,"name":"minecraft:element_71","runtimeID":3335},{"data":9,"id":337,"name":"minecraft:element_71","runtimeID":3336},{"data":10,"id":337,"name":"minecraft:element_71","runtimeID":3337},{"data":11,"id":337,"name":"minecraft:element_71","runtimeID":3338},{"data":12,"id":337,"name":"minecraft:element_71","runtimeID":3339},{"data":13,"id":337,"name":"minecraft:element_71","runtimeID":3340},{"data":14,"id":337,"name":"minecraft:element_71","runtimeID":3341},{"data":15,"id":337,"name":"minecraft:element_71","runtimeID":3342},{"data":0,"id":338,"name":"minecraft:element_72","runtimeID":3343},{"data":1,"id":338,"name":"minecraft:element_72","runtimeID":3344},{"data":2,"id":338,"name":"minecraft:element_72","runtimeID":3345},{"data":3,"id":338,"name":"minecraft:element_72","runtimeID":3346},{"data":4,"id":338,"name":"minecraft:element_72","runtimeID":3347},{"data":5,"id":338,"name":"minecraft:element_72","runtimeID":3348},{"data":6,"id":338,"name":"minecraft:element_72","runtimeID":3349},{"data":7,"id":338,"name":"minecraft:element_72","runtimeID":3350},{"data":8,"id":338,"name":"minecraft:element_72","runtimeID":3351},{"data":9,"id":338,"name":"minecraft:element_72","runtimeID":3352},{"data":10,"id":338,"name":"minecraft:element_72","runtimeID":3353},{"data":11,"id":338,"name":"minecraft:element_72","runtimeID":3354},{"data":12,"id":338,"name":"minecraft:element_72","runtimeID":3355},{"data":13,"id":338,"name":"minecraft:element_72","runtimeID":3356},{"data":14,"id":338,"name":"minecraft:element_72","runtimeID":3357},{"data":15,"id":338,"name":"minecraft:element_72","runtimeID":3358},{"data":0,"id":339,"name":"minecraft:element_73","runtimeID":3359},{"data":1,"id":339,"name":"minecraft:element_73","runtimeID":3360},{"data":2,"id":339,"name":"minecraft:element_73","runtimeID":3361},{"data":3,"id":339,"name":"minecraft:element_73","runtimeID":3362},{"data":4,"id":339,"name":"minecraft:element_73","runtimeID":3363},{"data":5,"id":339,"name":"minecraft:element_73","runtimeID":3364},{"data":6,"id":339,"name":"minecraft:element_73","runtimeID":3365},{"data":7,"id":339,"name":"minecraft:element_73","runtimeID":3366},{"data":8,"id":339,"name":"minecraft:element_73","runtimeID":3367},{"data":9,"id":339,"name":"minecraft:element_73","runtimeID":3368},{"data":10,"id":339,"name":"minecraft:element_73","runtimeID":3369},{"data":11,"id":339,"name":"minecraft:element_73","runtimeID":3370},{"data":12,"id":339,"name":"minecraft:element_73","runtimeID":3371},{"data":13,"id":339,"name":"minecraft:element_73","runtimeID":3372},{"data":14,"id":339,"name":"minecraft:element_73","runtimeID":3373},{"data":15,"id":339,"name":"minecraft:element_73","runtimeID":3374},{"data":0,"id":340,"name":"minecraft:element_74","runtimeID":3375},{"data":1,"id":340,"name":"minecraft:element_74","runtimeID":3376},{"data":2,"id":340,"name":"minecraft:element_74","runtimeID":3377},{"data":3,"id":340,"name":"minecraft:element_74","runtimeID":3378},{"data":4,"id":340,"name":"minecraft:element_74","runtimeID":3379},{"data":5,"id":340,"name":"minecraft:element_74","runtimeID":3380},{"data":6,"id":340,"name":"minecraft:element_74","runtimeID":3381},{"data":7,"id":340,"name":"minecraft:element_74","runtimeID":3382},{"data":8,"id":340,"name":"minecraft:element_74","runtimeID":3383},{"data":9,"id":340,"name":"minecraft:element_74","runtimeID":3384},{"data":10,"id":340,"name":"minecraft:element_74","runtimeID":3385},{"data":11,"id":340,"name":"minecraft:element_74","runtimeID":3386},{"data":12,"id":340,"name":"minecraft:element_74","runtimeID":3387},{"data":13,"id":340,"name":"minecraft:element_74","runtimeID":3388},{"data":14,"id":340,"name":"minecraft:element_74","runtimeID":3389},{"data":15,"id":340,"name":"minecraft:element_74","runtimeID":3390},{"data":0,"id":341,"name":"minecraft:element_75","runtimeID":3391},{"data":1,"id":341,"name":"minecraft:element_75","runtimeID":3392},{"data":2,"id":341,"name":"minecraft:element_75","runtimeID":3393},{"data":3,"id":341,"name":"minecraft:element_75","runtimeID":3394},{"data":4,"id":341,"name":"minecraft:element_75","runtimeID":3395},{"data":5,"id":341,"name":"minecraft:element_75","runtimeID":3396},{"data":6,"id":341,"name":"minecraft:element_75","runtimeID":3397},{"data":7,"id":341,"name":"minecraft:element_75","runtimeID":3398},{"data":8,"id":341,"name":"minecraft:element_75","runtimeID":3399},{"data":9,"id":341,"name":"minecraft:element_75","runtimeID":3400},{"data":10,"id":341,"name":"minecraft:element_75","runtimeID":3401},{"data":11,"id":341,"name":"minecraft:element_75","runtimeID":3402},{"data":12,"id":341,"name":"minecraft:element_75","runtimeID":3403},{"data":13,"id":341,"name":"minecraft:element_75","runtimeID":3404},{"data":14,"id":341,"name":"minecraft:element_75","runtimeID":3405},{"data":15,"id":341,"name":"minecraft:element_75","runtimeID":3406},{"data":0,"id":342,"name":"minecraft:element_76","runtimeID":3407},{"data":1,"id":342,"name":"minecraft:element_76","runtimeID":3408},{"data":2,"id":342,"name":"minecraft:element_76","runtimeID":3409},{"data":3,"id":342,"name":"minecraft:element_76","runtimeID":3410},{"data":4,"id":342,"name":"minecraft:element_76","runtimeID":3411},{"data":5,"id":342,"name":"minecraft:element_76","runtimeID":3412},{"data":6,"id":342,"name":"minecraft:element_76","runtimeID":3413},{"data":7,"id":342,"name":"minecraft:element_76","runtimeID":3414},{"data":8,"id":342,"name":"minecraft:element_76","runtimeID":3415},{"data":9,"id":342,"name":"minecraft:element_76","runtimeID":3416},{"data":10,"id":342,"name":"minecraft:element_76","runtimeID":3417},{"data":11,"id":342,"name":"minecraft:element_76","runtimeID":3418},{"data":12,"id":342,"name":"minecraft:element_76","runtimeID":3419},{"data":13,"id":342,"name":"minecraft:element_76","runtimeID":3420},{"data":14,"id":342,"name":"minecraft:element_76","runtimeID":3421},{"data":15,"id":342,"name":"minecraft:element_76","runtimeID":3422},{"data":0,"id":343,"name":"minecraft:element_77","runtimeID":3423},{"data":1,"id":343,"name":"minecraft:element_77","runtimeID":3424},{"data":2,"id":343,"name":"minecraft:element_77","runtimeID":3425},{"data":3,"id":343,"name":"minecraft:element_77","runtimeID":3426},{"data":4,"id":343,"name":"minecraft:element_77","runtimeID":3427},{"data":5,"id":343,"name":"minecraft:element_77","runtimeID":3428},{"data":6,"id":343,"name":"minecraft:element_77","runtimeID":3429},{"data":7,"id":343,"name":"minecraft:element_77","runtimeID":3430},{"data":8,"id":343,"name":"minecraft:element_77","runtimeID":3431},{"data":9,"id":343,"name":"minecraft:element_77","runtimeID":3432},{"data":10,"id":343,"name":"minecraft:element_77","runtimeID":3433},{"data":11,"id":343,"name":"minecraft:element_77","runtimeID":3434},{"data":12,"id":343,"name":"minecraft:element_77","runtimeID":3435},{"data":13,"id":343,"name":"minecraft:element_77","runtimeID":3436},{"data":14,"id":343,"name":"minecraft:element_77","runtimeID":3437},{"data":15,"id":343,"name":"minecraft:element_77","runtimeID":3438},{"data":0,"id":344,"name":"minecraft:element_78","runtimeID":3439},{"data":1,"id":344,"name":"minecraft:element_78","runtimeID":3440},{"data":2,"id":344,"name":"minecraft:element_78","runtimeID":3441},{"data":3,"id":344,"name":"minecraft:element_78","runtimeID":3442},{"data":4,"id":344,"name":"minecraft:element_78","runtimeID":3443},{"data":5,"id":344,"name":"minecraft:element_78","runtimeID":3444},{"data":6,"id":344,"name":"minecraft:element_78","runtimeID":3445},{"data":7,"id":344,"name":"minecraft:element_78","runtimeID":3446},{"data":8,"id":344,"name":"minecraft:element_78","runtimeID":3447},{"data":9,"id":344,"name":"minecraft:element_78","runtimeID":3448},{"data":10,"id":344,"name":"minecraft:element_78","runtimeID":3449},{"data":11,"id":344,"name":"minecraft:element_78","runtimeID":3450},{"data":12,"id":344,"name":"minecraft:element_78","runtimeID":3451},{"data":13,"id":344,"name":"minecraft:element_78","runtimeID":3452},{"data":14,"id":344,"name":"minecraft:element_78","runtimeID":3453},{"data":15,"id":344,"name":"minecraft:element_78","runtimeID":3454},{"data":0,"id":345,"name":"minecraft:element_79","runtimeID":3455},{"data":1,"id":345,"name":"minecraft:element_79","runtimeID":3456},{"data":2,"id":345,"name":"minecraft:element_79","runtimeID":3457},{"data":3,"id":345,"name":"minecraft:element_79","runtimeID":3458},{"data":4,"id":345,"name":"minecraft:element_79","runtimeID":3459},{"data":5,"id":345,"name":"minecraft:element_79","runtimeID":3460},{"data":6,"id":345,"name":"minecraft:element_79","runtimeID":3461},{"data":7,"id":345,"name":"minecraft:element_79","runtimeID":3462},{"data":8,"id":345,"name":"minecraft:element_79","runtimeID":3463},{"data":9,"id":345,"name":"minecraft:element_79","runtimeID":3464},{"data":10,"id":345,"name":"minecraft:element_79","runtimeID":3465},{"data":11,"id":345,"name":"minecraft:element_79","runtimeID":3466},{"data":12,"id":345,"name":"minecraft:element_79","runtimeID":3467},{"data":13,"id":345,"name":"minecraft:element_79","runtimeID":3468},{"data":14,"id":345,"name":"minecraft:element_79","runtimeID":3469},{"data":15,"id":345,"name":"minecraft:element_79","runtimeID":3470},{"data":0,"id":346,"name":"minecraft:element_80","runtimeID":3471},{"data":1,"id":346,"name":"minecraft:element_80","runtimeID":3472},{"data":2,"id":346,"name":"minecraft:element_80","runtimeID":3473},{"data":3,"id":346,"name":"minecraft:element_80","runtimeID":3474},{"data":4,"id":346,"name":"minecraft:element_80","runtimeID":3475},{"data":5,"id":346,"name":"minecraft:element_80","runtimeID":3476},{"data":6,"id":346,"name":"minecraft:element_80","runtimeID":3477},{"data":7,"id":346,"name":"minecraft:element_80","runtimeID":3478},{"data":8,"id":346,"name":"minecraft:element_80","runtimeID":3479},{"data":9,"id":346,"name":"minecraft:element_80","runtimeID":3480},{"data":10,"id":346,"name":"minecraft:element_80","runtimeID":3481},{"data":11,"id":346,"name":"minecraft:element_80","runtimeID":3482},{"data":12,"id":346,"name":"minecraft:element_80","runtimeID":3483},{"data":13,"id":346,"name":"minecraft:element_80","runtimeID":3484},{"data":14,"id":346,"name":"minecraft:element_80","runtimeID":3485},{"data":15,"id":346,"name":"minecraft:element_80","runtimeID":3486},{"data":0,"id":347,"name":"minecraft:element_81","runtimeID":3487},{"data":1,"id":347,"name":"minecraft:element_81","runtimeID":3488},{"data":2,"id":347,"name":"minecraft:element_81","runtimeID":3489},{"data":3,"id":347,"name":"minecraft:element_81","runtimeID":3490},{"data":4,"id":347,"name":"minecraft:element_81","runtimeID":3491},{"data":5,"id":347,"name":"minecraft:element_81","runtimeID":3492},{"data":6,"id":347,"name":"minecraft:element_81","runtimeID":3493},{"data":7,"id":347,"name":"minecraft:element_81","runtimeID":3494},{"data":8,"id":347,"name":"minecraft:element_81","runtimeID":3495},{"data":9,"id":347,"name":"minecraft:element_81","runtimeID":3496},{"data":10,"id":347,"name":"minecraft:element_81","runtimeID":3497},{"data":11,"id":347,"name":"minecraft:element_81","runtimeID":3498},{"data":12,"id":347,"name":"minecraft:element_81","runtimeID":3499},{"data":13,"id":347,"name":"minecraft:element_81","runtimeID":3500},{"data":14,"id":347,"name":"minecraft:element_81","runtimeID":3501},{"data":15,"id":347,"name":"minecraft:element_81","runtimeID":3502},{"data":0,"id":348,"name":"minecraft:element_82","runtimeID":3503},{"data":1,"id":348,"name":"minecraft:element_82","runtimeID":3504},{"data":2,"id":348,"name":"minecraft:element_82","runtimeID":3505},{"data":3,"id":348,"name":"minecraft:element_82","runtimeID":3506},{"data":4,"id":348,"name":"minecraft:element_82","runtimeID":3507},{"data":5,"id":348,"name":"minecraft:element_82","runtimeID":3508},{"data":6,"id":348,"name":"minecraft:element_82","runtimeID":3509},{"data":7,"id":348,"name":"minecraft:element_82","runtimeID":3510},{"data":8,"id":348,"name":"minecraft:element_82","runtimeID":3511},{"data":9,"id":348,"name":"minecraft:element_82","runtimeID":3512},{"data":10,"id":348,"name":"minecraft:element_82","runtimeID":3513},{"data":11,"id":348,"name":"minecraft:element_82","runtimeID":3514},{"data":12,"id":348,"name":"minecraft:element_82","runtimeID":3515},{"data":13,"id":348,"name":"minecraft:element_82","runtimeID":3516},{"data":14,"id":348,"name":"minecraft:element_82","runtimeID":3517},{"data":15,"id":348,"name":"minecraft:element_82","runtimeID":3518},{"data":0,"id":349,"name":"minecraft:element_83","runtimeID":3519},{"data":1,"id":349,"name":"minecraft:element_83","runtimeID":3520},{"data":2,"id":349,"name":"minecraft:element_83","runtimeID":3521},{"data":3,"id":349,"name":"minecraft:element_83","runtimeID":3522},{"data":4,"id":349,"name":"minecraft:element_83","runtimeID":3523},{"data":5,"id":349,"name":"minecraft:element_83","runtimeID":3524},{"data":6,"id":349,"name":"minecraft:element_83","runtimeID":3525},{"data":7,"id":349,"name":"minecraft:element_83","runtimeID":3526},{"data":8,"id":349,"name":"minecraft:element_83","runtimeID":3527},{"data":9,"id":349,"name":"minecraft:element_83","runtimeID":3528},{"data":10,"id":349,"name":"minecraft:element_83","runtimeID":3529},{"data":11,"id":349,"name":"minecraft:element_83","runtimeID":3530},{"data":12,"id":349,"name":"minecraft:element_83","runtimeID":3531},{"data":13,"id":349,"name":"minecraft:element_83","runtimeID":3532},{"data":14,"id":349,"name":"minecraft:element_83","runtimeID":3533},{"data":15,"id":349,"name":"minecraft:element_83","runtimeID":3534},{"data":0,"id":350,"name":"minecraft:element_84","runtimeID":3535},{"data":1,"id":350,"name":"minecraft:element_84","runtimeID":3536},{"data":2,"id":350,"name":"minecraft:element_84","runtimeID":3537},{"data":3,"id":350,"name":"minecraft:element_84","runtimeID":3538},{"data":4,"id":350,"name":"minecraft:element_84","runtimeID":3539},{"data":5,"id":350,"name":"minecraft:element_84","runtimeID":3540},{"data":6,"id":350,"name":"minecraft:element_84","runtimeID":3541},{"data":7,"id":350,"name":"minecraft:element_84","runtimeID":3542},{"data":8,"id":350,"name":"minecraft:element_84","runtimeID":3543},{"data":9,"id":350,"name":"minecraft:element_84","runtimeID":3544},{"data":10,"id":350,"name":"minecraft:element_84","runtimeID":3545},{"data":11,"id":350,"name":"minecraft:element_84","runtimeID":3546},{"data":12,"id":350,"name":"minecraft:element_84","runtimeID":3547},{"data":13,"id":350,"name":"minecraft:element_84","runtimeID":3548},{"data":14,"id":350,"name":"minecraft:element_84","runtimeID":3549},{"data":15,"id":350,"name":"minecraft:element_84","runtimeID":3550},{"data":0,"id":351,"name":"minecraft:element_85","runtimeID":3551},{"data":1,"id":351,"name":"minecraft:element_85","runtimeID":3552},{"data":2,"id":351,"name":"minecraft:element_85","runtimeID":3553},{"data":3,"id":351,"name":"minecraft:element_85","runtimeID":3554},{"data":4,"id":351,"name":"minecraft:element_85","runtimeID":3555},{"data":5,"id":351,"name":"minecraft:element_85","runtimeID":3556},{"data":6,"id":351,"name":"minecraft:element_85","runtimeID":3557},{"data":7,"id":351,"name":"minecraft:element_85","runtimeID":3558},{"data":8,"id":351,"name":"minecraft:element_85","runtimeID":3559},{"data":9,"id":351,"name":"minecraft:element_85","runtimeID":3560},{"data":10,"id":351,"name":"minecraft:element_85","runtimeID":3561},{"data":11,"id":351,"name":"minecraft:element_85","runtimeID":3562},{"data":12,"id":351,"name":"minecraft:element_85","runtimeID":3563},{"data":13,"id":351,"name":"minecraft:element_85","runtimeID":3564},{"data":14,"id":351,"name":"minecraft:element_85","runtimeID":3565},{"data":15,"id":351,"name":"minecraft:element_85","runtimeID":3566},{"data":0,"id":352,"name":"minecraft:element_86","runtimeID":3567},{"data":1,"id":352,"name":"minecraft:element_86","runtimeID":3568},{"data":2,"id":352,"name":"minecraft:element_86","runtimeID":3569},{"data":3,"id":352,"name":"minecraft:element_86","runtimeID":3570},{"data":4,"id":352,"name":"minecraft:element_86","runtimeID":3571},{"data":5,"id":352,"name":"minecraft:element_86","runtimeID":3572},{"data":6,"id":352,"name":"minecraft:element_86","runtimeID":3573},{"data":7,"id":352,"name":"minecraft:element_86","runtimeID":3574},{"data":8,"id":352,"name":"minecraft:element_86","runtimeID":3575},{"data":9,"id":352,"name":"minecraft:element_86","runtimeID":3576},{"data":10,"id":352,"name":"minecraft:element_86","runtimeID":3577},{"data":11,"id":352,"name":"minecraft:element_86","runtimeID":3578},{"data":12,"id":352,"name":"minecraft:element_86","runtimeID":3579},{"data":13,"id":352,"name":"minecraft:element_86","runtimeID":3580},{"data":14,"id":352,"name":"minecraft:element_86","runtimeID":3581},{"data":15,"id":352,"name":"minecraft:element_86","runtimeID":3582},{"data":0,"id":353,"name":"minecraft:element_87","runtimeID":3583},{"data":1,"id":353,"name":"minecraft:element_87","runtimeID":3584},{"data":2,"id":353,"name":"minecraft:element_87","runtimeID":3585},{"data":3,"id":353,"name":"minecraft:element_87","runtimeID":3586},{"data":4,"id":353,"name":"minecraft:element_87","runtimeID":3587},{"data":5,"id":353,"name":"minecraft:element_87","runtimeID":3588},{"data":6,"id":353,"name":"minecraft:element_87","runtimeID":3589},{"data":7,"id":353,"name":"minecraft:element_87","runtimeID":3590},{"data":8,"id":353,"name":"minecraft:element_87","runtimeID":3591},{"data":9,"id":353,"name":"minecraft:element_87","runtimeID":3592},{"data":10,"id":353,"name":"minecraft:element_87","runtimeID":3593},{"data":11,"id":353,"name":"minecraft:element_87","runtimeID":3594},{"data":12,"id":353,"name":"minecraft:element_87","runtimeID":3595},{"data":13,"id":353,"name":"minecraft:element_87","runtimeID":3596},{"data":14,"id":353,"name":"minecraft:element_87","runtimeID":3597},{"data":15,"id":353,"name":"minecraft:element_87","runtimeID":3598},{"data":0,"id":354,"name":"minecraft:element_88","runtimeID":3599},{"data":1,"id":354,"name":"minecraft:element_88","runtimeID":3600},{"data":2,"id":354,"name":"minecraft:element_88","runtimeID":3601},{"data":3,"id":354,"name":"minecraft:element_88","runtimeID":3602},{"data":4,"id":354,"name":"minecraft:element_88","runtimeID":3603},{"data":5,"id":354,"name":"minecraft:element_88","runtimeID":3604},{"data":6,"id":354,"name":"minecraft:element_88","runtimeID":3605},{"data":7,"id":354,"name":"minecraft:element_88","runtimeID":3606},{"data":8,"id":354,"name":"minecraft:element_88","runtimeID":3607},{"data":9,"id":354,"name":"minecraft:element_88","runtimeID":3608},{"data":10,"id":354,"name":"minecraft:element_88","runtimeID":3609},{"data":11,"id":354,"name":"minecraft:element_88","runtimeID":3610},{"data":12,"id":354,"name":"minecraft:element_88","runtimeID":3611},{"data":13,"id":354,"name":"minecraft:element_88","runtimeID":3612},{"data":14,"id":354,"name":"minecraft:element_88","runtimeID":3613},{"data":15,"id":354,"name":"minecraft:element_88","runtimeID":3614},{"data":0,"id":355,"name":"minecraft:element_89","runtimeID":3615},{"data":1,"id":355,"name":"minecraft:element_89","runtimeID":3616},{"data":2,"id":355,"name":"minecraft:element_89","runtimeID":3617},{"data":3,"id":355,"name":"minecraft:element_89","runtimeID":3618},{"data":4,"id":355,"name":"minecraft:element_89","runtimeID":3619},{"data":5,"id":355,"name":"minecraft:element_89","runtimeID":3620},{"data":6,"id":355,"name":"minecraft:element_89","runtimeID":3621},{"data":7,"id":355,"name":"minecraft:element_89","runtimeID":3622},{"data":8,"id":355,"name":"minecraft:element_89","runtimeID":3623},{"data":9,"id":355,"name":"minecraft:element_89","runtimeID":3624},{"data":10,"id":355,"name":"minecraft:element_89","runtimeID":3625},{"data":11,"id":355,"name":"minecraft:element_89","runtimeID":3626},{"data":12,"id":355,"name":"minecraft:element_89","runtimeID":3627},{"data":13,"id":355,"name":"minecraft:element_89","runtimeID":3628},{"data":14,"id":355,"name":"minecraft:element_89","runtimeID":3629},{"data":15,"id":355,"name":"minecraft:element_89","runtimeID":3630},{"data":0,"id":356,"name":"minecraft:element_90","runtimeID":3631},{"data":1,"id":356,"name":"minecraft:element_90","runtimeID":3632},{"data":2,"id":356,"name":"minecraft:element_90","runtimeID":3633},{"data":3,"id":356,"name":"minecraft:element_90","runtimeID":3634},{"data":4,"id":356,"name":"minecraft:element_90","runtimeID":3635},{"data":5,"id":356,"name":"minecraft:element_90","runtimeID":3636},{"data":6,"id":356,"name":"minecraft:element_90","runtimeID":3637},{"data":7,"id":356,"name":"minecraft:element_90","runtimeID":3638},{"data":8,"id":356,"name":"minecraft:element_90","runtimeID":3639},{"data":9,"id":356,"name":"minecraft:element_90","runtimeID":3640},{"data":10,"id":356,"name":"minecraft:element_90","runtimeID":3641},{"data":11,"id":356,"name":"minecraft:element_90","runtimeID":3642},{"data":12,"id":356,"name":"minecraft:element_90","runtimeID":3643},{"data":13,"id":356,"name":"minecraft:element_90","runtimeID":3644},{"data":14,"id":356,"name":"minecraft:element_90","runtimeID":3645},{"data":15,"id":356,"name":"minecraft:element_90","runtimeID":3646},{"data":0,"id":357,"name":"minecraft:element_91","runtimeID":3647},{"data":1,"id":357,"name":"minecraft:element_91","runtimeID":3648},{"data":2,"id":357,"name":"minecraft:element_91","runtimeID":3649},{"data":3,"id":357,"name":"minecraft:element_91","runtimeID":3650},{"data":4,"id":357,"name":"minecraft:element_91","runtimeID":3651},{"data":5,"id":357,"name":"minecraft:element_91","runtimeID":3652},{"data":6,"id":357,"name":"minecraft:element_91","runtimeID":3653},{"data":7,"id":357,"name":"minecraft:element_91","runtimeID":3654},{"data":8,"id":357,"name":"minecraft:element_91","runtimeID":3655},{"data":9,"id":357,"name":"minecraft:element_91","runtimeID":3656},{"data":10,"id":357,"name":"minecraft:element_91","runtimeID":3657},{"data":11,"id":357,"name":"minecraft:element_91","runtimeID":3658},{"data":12,"id":357,"name":"minecraft:element_91","runtimeID":3659},{"data":13,"id":357,"name":"minecraft:element_91","runtimeID":3660},{"data":14,"id":357,"name":"minecraft:element_91","runtimeID":3661},{"data":15,"id":357,"name":"minecraft:element_91","runtimeID":3662},{"data":0,"id":358,"name":"minecraft:element_92","runtimeID":3663},{"data":1,"id":358,"name":"minecraft:element_92","runtimeID":3664},{"data":2,"id":358,"name":"minecraft:element_92","runtimeID":3665},{"data":3,"id":358,"name":"minecraft:element_92","runtimeID":3666},{"data":4,"id":358,"name":"minecraft:element_92","runtimeID":3667},{"data":5,"id":358,"name":"minecraft:element_92","runtimeID":3668},{"data":6,"id":358,"name":"minecraft:element_92","runtimeID":3669},{"data":7,"id":358,"name":"minecraft:element_92","runtimeID":3670},{"data":8,"id":358,"name":"minecraft:element_92","runtimeID":3671},{"data":9,"id":358,"name":"minecraft:element_92","runtimeID":3672},{"data":10,"id":358,"name":"minecraft:element_92","runtimeID":3673},{"data":11,"id":358,"name":"minecraft:element_92","runtimeID":3674},{"data":12,"id":358,"name":"minecraft:element_92","runtimeID":3675},{"data":13,"id":358,"name":"minecraft:element_92","runtimeID":3676},{"data":14,"id":358,"name":"minecraft:element_92","runtimeID":3677},{"data":15,"id":358,"name":"minecraft:element_92","runtimeID":3678},{"data":0,"id":359,"name":"minecraft:element_93","runtimeID":3679},{"data":1,"id":359,"name":"minecraft:element_93","runtimeID":3680},{"data":2,"id":359,"name":"minecraft:element_93","runtimeID":3681},{"data":3,"id":359,"name":"minecraft:element_93","runtimeID":3682},{"data":4,"id":359,"name":"minecraft:element_93","runtimeID":3683},{"data":5,"id":359,"name":"minecraft:element_93","runtimeID":3684},{"data":6,"id":359,"name":"minecraft:element_93","runtimeID":3685},{"data":7,"id":359,"name":"minecraft:element_93","runtimeID":3686},{"data":8,"id":359,"name":"minecraft:element_93","runtimeID":3687},{"data":9,"id":359,"name":"minecraft:element_93","runtimeID":3688},{"data":10,"id":359,"name":"minecraft:element_93","runtimeID":3689},{"data":11,"id":359,"name":"minecraft:element_93","runtimeID":3690},{"data":12,"id":359,"name":"minecraft:element_93","runtimeID":3691},{"data":13,"id":359,"name":"minecraft:element_93","runtimeID":3692},{"data":14,"id":359,"name":"minecraft:element_93","runtimeID":3693},{"data":15,"id":359,"name":"minecraft:element_93","runtimeID":3694},{"data":0,"id":360,"name":"minecraft:element_94","runtimeID":3695},{"data":1,"id":360,"name":"minecraft:element_94","runtimeID":3696},{"data":2,"id":360,"name":"minecraft:element_94","runtimeID":3697},{"data":3,"id":360,"name":"minecraft:element_94","runtimeID":3698},{"data":4,"id":360,"name":"minecraft:element_94","runtimeID":3699},{"data":5,"id":360,"name":"minecraft:element_94","runtimeID":3700},{"data":6,"id":360,"name":"minecraft:element_94","runtimeID":3701},{"data":7,"id":360,"name":"minecraft:element_94","runtimeID":3702},{"data":8,"id":360,"name":"minecraft:element_94","runtimeID":3703},{"data":9,"id":360,"name":"minecraft:element_94","runtimeID":3704},{"data":10,"id":360,"name":"minecraft:element_94","runtimeID":3705},{"data":11,"id":360,"name":"minecraft:element_94","runtimeID":3706},{"data":12,"id":360,"name":"minecraft:element_94","runtimeID":3707},{"data":13,"id":360,"name":"minecraft:element_94","runtimeID":3708},{"data":14,"id":360,"name":"minecraft:element_94","runtimeID":3709},{"data":15,"id":360,"name":"minecraft:element_94","runtimeID":3710},{"data":0,"id":361,"name":"minecraft:element_95","runtimeID":3711},{"data":1,"id":361,"name":"minecraft:element_95","runtimeID":3712},{"data":2,"id":361,"name":"minecraft:element_95","runtimeID":3713},{"data":3,"id":361,"name":"minecraft:element_95","runtimeID":3714},{"data":4,"id":361,"name":"minecraft:element_95","runtimeID":3715},{"data":5,"id":361,"name":"minecraft:element_95","runtimeID":3716},{"data":6,"id":361,"name":"minecraft:element_95","runtimeID":3717},{"data":7,"id":361,"name":"minecraft:element_95","runtimeID":3718},{"data":8,"id":361,"name":"minecraft:element_95","runtimeID":3719},{"data":9,"id":361,"name":"minecraft:element_95","runtimeID":3720},{"data":10,"id":361,"name":"minecraft:element_95","runtimeID":3721},{"data":11,"id":361,"name":"minecraft:element_95","runtimeID":3722},{"data":12,"id":361,"name":"minecraft:element_95","runtimeID":3723},{"data":13,"id":361,"name":"minecraft:element_95","runtimeID":3724},{"data":14,"id":361,"name":"minecraft:element_95","runtimeID":3725},{"data":15,"id":361,"name":"minecraft:element_95","runtimeID":3726},{"data":0,"id":362,"name":"minecraft:element_96","runtimeID":3727},{"data":1,"id":362,"name":"minecraft:element_96","runtimeID":3728},{"data":2,"id":362,"name":"minecraft:element_96","runtimeID":3729},{"data":3,"id":362,"name":"minecraft:element_96","runtimeID":3730},{"data":4,"id":362,"name":"minecraft:element_96","runtimeID":3731},{"data":5,"id":362,"name":"minecraft:element_96","runtimeID":3732},{"data":6,"id":362,"name":"minecraft:element_96","runtimeID":3733},{"data":7,"id":362,"name":"minecraft:element_96","runtimeID":3734},{"data":8,"id":362,"name":"minecraft:element_96","runtimeID":3735},{"data":9,"id":362,"name":"minecraft:element_96","runtimeID":3736},{"data":10,"id":362,"name":"minecraft:element_96","runtimeID":3737},{"data":11,"id":362,"name":"minecraft:element_96","runtimeID":3738},{"data":12,"id":362,"name":"minecraft:element_96","runtimeID":3739},{"data":13,"id":362,"name":"minecraft:element_96","runtimeID":3740},{"data":14,"id":362,"name":"minecraft:element_96","runtimeID":3741},{"data":15,"id":362,"name":"minecraft:element_96","runtimeID":3742},{"data":0,"id":363,"name":"minecraft:element_97","runtimeID":3743},{"data":1,"id":363,"name":"minecraft:element_97","runtimeID":3744},{"data":2,"id":363,"name":"minecraft:element_97","runtimeID":3745},{"data":3,"id":363,"name":"minecraft:element_97","runtimeID":3746},{"data":4,"id":363,"name":"minecraft:element_97","runtimeID":3747},{"data":5,"id":363,"name":"minecraft:element_97","runtimeID":3748},{"data":6,"id":363,"name":"minecraft:element_97","runtimeID":3749},{"data":7,"id":363,"name":"minecraft:element_97","runtimeID":3750},{"data":8,"id":363,"name":"minecraft:element_97","runtimeID":3751},{"data":9,"id":363,"name":"minecraft:element_97","runtimeID":3752},{"data":10,"id":363,"name":"minecraft:element_97","runtimeID":3753},{"data":11,"id":363,"name":"minecraft:element_97","runtimeID":3754},{"data":12,"id":363,"name":"minecraft:element_97","runtimeID":3755},{"data":13,"id":363,"name":"minecraft:element_97","runtimeID":3756},{"data":14,"id":363,"name":"minecraft:element_97","runtimeID":3757},{"data":15,"id":363,"name":"minecraft:element_97","runtimeID":3758},{"data":0,"id":364,"name":"minecraft:element_98","runtimeID":3759},{"data":1,"id":364,"name":"minecraft:element_98","runtimeID":3760},{"data":2,"id":364,"name":"minecraft:element_98","runtimeID":3761},{"data":3,"id":364,"name":"minecraft:element_98","runtimeID":3762},{"data":4,"id":364,"name":"minecraft:element_98","runtimeID":3763},{"data":5,"id":364,"name":"minecraft:element_98","runtimeID":3764},{"data":6,"id":364,"name":"minecraft:element_98","runtimeID":3765},{"data":7,"id":364,"name":"minecraft:element_98","runtimeID":3766},{"data":8,"id":364,"name":"minecraft:element_98","runtimeID":3767},{"data":9,"id":364,"name":"minecraft:element_98","runtimeID":3768},{"data":10,"id":364,"name":"minecraft:element_98","runtimeID":3769},{"data":11,"id":364,"name":"minecraft:element_98","runtimeID":3770},{"data":12,"id":364,"name":"minecraft:element_98","runtimeID":3771},{"data":13,"id":364,"name":"minecraft:element_98","runtimeID":3772},{"data":14,"id":364,"name":"minecraft:element_98","runtimeID":3773},{"data":15,"id":364,"name":"minecraft:element_98","runtimeID":3774},{"data":0,"id":365,"name":"minecraft:element_99","runtimeID":3775},{"data":1,"id":365,"name":"minecraft:element_99","runtimeID":3776},{"data":2,"id":365,"name":"minecraft:element_99","runtimeID":3777},{"data":3,"id":365,"name":"minecraft:element_99","runtimeID":3778},{"data":4,"id":365,"name":"minecraft:element_99","runtimeID":3779},{"data":5,"id":365,"name":"minecraft:element_99","runtimeID":3780},{"data":6,"id":365,"name":"minecraft:element_99","runtimeID":3781},{"data":7,"id":365,"name":"minecraft:element_99","runtimeID":3782},{"data":8,"id":365,"name":"minecraft:element_99","runtimeID":3783},{"data":9,"id":365,"name":"minecraft:element_99","runtimeID":3784},{"data":10,"id":365,"name":"minecraft:element_99","runtimeID":3785},{"data":11,"id":365,"name":"minecraft:element_99","runtimeID":3786},{"data":12,"id":365,"name":"minecraft:element_99","runtimeID":3787},{"data":13,"id":365,"name":"minecraft:element_99","runtimeID":3788},{"data":14,"id":365,"name":"minecraft:element_99","runtimeID":3789},{"data":15,"id":365,"name":"minecraft:element_99","runtimeID":3790},{"data":0,"id":366,"name":"minecraft:element_100","runtimeID":3791},{"data":1,"id":366,"name":"minecraft:element_100","runtimeID":3792},{"data":2,"id":366,"name":"minecraft:element_100","runtimeID":3793},{"data":3,"id":366,"name":"minecraft:element_100","runtimeID":3794},{"data":4,"id":366,"name":"minecraft:element_100","runtimeID":3795},{"data":5,"id":366,"name":"minecraft:element_100","runtimeID":3796},{"data":6,"id":366,"name":"minecraft:element_100","runtimeID":3797},{"data":7,"id":366,"name":"minecraft:element_100","runtimeID":3798},{"data":8,"id":366,"name":"minecraft:element_100","runtimeID":3799},{"data":9,"id":366,"name":"minecraft:element_100","runtimeID":3800},{"data":10,"id":366,"name":"minecraft:element_100","runtimeID":3801},{"data":11,"id":366,"name":"minecraft:element_100","runtimeID":3802},{"data":12,"id":366,"name":"minecraft:element_100","runtimeID":3803},{"data":13,"id":366,"name":"minecraft:element_100","runtimeID":3804},{"data":14,"id":366,"name":"minecraft:element_100","runtimeID":3805},{"data":15,"id":366,"name":"minecraft:element_100","runtimeID":3806},{"data":0,"id":367,"name":"minecraft:element_101","runtimeID":3807},{"data":1,"id":367,"name":"minecraft:element_101","runtimeID":3808},{"data":2,"id":367,"name":"minecraft:element_101","runtimeID":3809},{"data":3,"id":367,"name":"minecraft:element_101","runtimeID":3810},{"data":4,"id":367,"name":"minecraft:element_101","runtimeID":3811},{"data":5,"id":367,"name":"minecraft:element_101","runtimeID":3812},{"data":6,"id":367,"name":"minecraft:element_101","runtimeID":3813},{"data":7,"id":367,"name":"minecraft:element_101","runtimeID":3814},{"data":8,"id":367,"name":"minecraft:element_101","runtimeID":3815},{"data":9,"id":367,"name":"minecraft:element_101","runtimeID":3816},{"data":10,"id":367,"name":"minecraft:element_101","runtimeID":3817},{"data":11,"id":367,"name":"minecraft:element_101","runtimeID":3818},{"data":12,"id":367,"name":"minecraft:element_101","runtimeID":3819},{"data":13,"id":367,"name":"minecraft:element_101","runtimeID":3820},{"data":14,"id":367,"name":"minecraft:element_101","runtimeID":3821},{"data":15,"id":367,"name":"minecraft:element_101","runtimeID":3822},{"data":0,"id":368,"name":"minecraft:element_102","runtimeID":3823},{"data":1,"id":368,"name":"minecraft:element_102","runtimeID":3824},{"data":2,"id":368,"name":"minecraft:element_102","runtimeID":3825},{"data":3,"id":368,"name":"minecraft:element_102","runtimeID":3826},{"data":4,"id":368,"name":"minecraft:element_102","runtimeID":3827},{"data":5,"id":368,"name":"minecraft:element_102","runtimeID":3828},{"data":6,"id":368,"name":"minecraft:element_102","runtimeID":3829},{"data":7,"id":368,"name":"minecraft:element_102","runtimeID":3830},{"data":8,"id":368,"name":"minecraft:element_102","runtimeID":3831},{"data":9,"id":368,"name":"minecraft:element_102","runtimeID":3832},{"data":10,"id":368,"name":"minecraft:element_102","runtimeID":3833},{"data":11,"id":368,"name":"minecraft:element_102","runtimeID":3834},{"data":12,"id":368,"name":"minecraft:element_102","runtimeID":3835},{"data":13,"id":368,"name":"minecraft:element_102","runtimeID":3836},{"data":14,"id":368,"name":"minecraft:element_102","runtimeID":3837},{"data":15,"id":368,"name":"minecraft:element_102","runtimeID":3838},{"data":0,"id":369,"name":"minecraft:element_103","runtimeID":3839},{"data":1,"id":369,"name":"minecraft:element_103","runtimeID":3840},{"data":2,"id":369,"name":"minecraft:element_103","runtimeID":3841},{"data":3,"id":369,"name":"minecraft:element_103","runtimeID":3842},{"data":4,"id":369,"name":"minecraft:element_103","runtimeID":3843},{"data":5,"id":369,"name":"minecraft:element_103","runtimeID":3844},{"data":6,"id":369,"name":"minecraft:element_103","runtimeID":3845},{"data":7,"id":369,"name":"minecraft:element_103","runtimeID":3846},{"data":8,"id":369,"name":"minecraft:element_103","runtimeID":3847},{"data":9,"id":369,"name":"minecraft:element_103","runtimeID":3848},{"data":10,"id":369,"name":"minecraft:element_103","runtimeID":3849},{"data":11,"id":369,"name":"minecraft:element_103","runtimeID":3850},{"data":12,"id":369,"name":"minecraft:element_103","runtimeID":3851},{"data":13,"id":369,"name":"minecraft:element_103","runtimeID":3852},{"data":14,"id":369,"name":"minecraft:element_103","runtimeID":3853},{"data":15,"id":369,"name":"minecraft:element_103","runtimeID":3854},{"data":0,"id":370,"name":"minecraft:element_104","runtimeID":3855},{"data":1,"id":370,"name":"minecraft:element_104","runtimeID":3856},{"data":2,"id":370,"name":"minecraft:element_104","runtimeID":3857},{"data":3,"id":370,"name":"minecraft:element_104","runtimeID":3858},{"data":4,"id":370,"name":"minecraft:element_104","runtimeID":3859},{"data":5,"id":370,"name":"minecraft:element_104","runtimeID":3860},{"data":6,"id":370,"name":"minecraft:element_104","runtimeID":3861},{"data":7,"id":370,"name":"minecraft:element_104","runtimeID":3862},{"data":8,"id":370,"name":"minecraft:element_104","runtimeID":3863},{"data":9,"id":370,"name":"minecraft:element_104","runtimeID":3864},{"data":10,"id":370,"name":"minecraft:element_104","runtimeID":3865},{"data":11,"id":370,"name":"minecraft:element_104","runtimeID":3866},{"data":12,"id":370,"name":"minecraft:element_104","runtimeID":3867},{"data":13,"id":370,"name":"minecraft:element_104","runtimeID":3868},{"data":14,"id":370,"name":"minecraft:element_104","runtimeID":3869},{"data":15,"id":370,"name":"minecraft:element_104","runtimeID":3870},{"data":0,"id":371,"name":"minecraft:element_105","runtimeID":3871},{"data":1,"id":371,"name":"minecraft:element_105","runtimeID":3872},{"data":2,"id":371,"name":"minecraft:element_105","runtimeID":3873},{"data":3,"id":371,"name":"minecraft:element_105","runtimeID":3874},{"data":4,"id":371,"name":"minecraft:element_105","runtimeID":3875},{"data":5,"id":371,"name":"minecraft:element_105","runtimeID":3876},{"data":6,"id":371,"name":"minecraft:element_105","runtimeID":3877},{"data":7,"id":371,"name":"minecraft:element_105","runtimeID":3878},{"data":8,"id":371,"name":"minecraft:element_105","runtimeID":3879},{"data":9,"id":371,"name":"minecraft:element_105","runtimeID":3880},{"data":10,"id":371,"name":"minecraft:element_105","runtimeID":3881},{"data":11,"id":371,"name":"minecraft:element_105","runtimeID":3882},{"data":12,"id":371,"name":"minecraft:element_105","runtimeID":3883},{"data":13,"id":371,"name":"minecraft:element_105","runtimeID":3884},{"data":14,"id":371,"name":"minecraft:element_105","runtimeID":3885},{"data":15,"id":371,"name":"minecraft:element_105","runtimeID":3886},{"data":0,"id":372,"name":"minecraft:element_106","runtimeID":3887},{"data":1,"id":372,"name":"minecraft:element_106","runtimeID":3888},{"data":2,"id":372,"name":"minecraft:element_106","runtimeID":3889},{"data":3,"id":372,"name":"minecraft:element_106","runtimeID":3890},{"data":4,"id":372,"name":"minecraft:element_106","runtimeID":3891},{"data":5,"id":372,"name":"minecraft:element_106","runtimeID":3892},{"data":6,"id":372,"name":"minecraft:element_106","runtimeID":3893},{"data":7,"id":372,"name":"minecraft:element_106","runtimeID":3894},{"data":8,"id":372,"name":"minecraft:element_106","runtimeID":3895},{"data":9,"id":372,"name":"minecraft:element_106","runtimeID":3896},{"data":10,"id":372,"name":"minecraft:element_106","runtimeID":3897},{"data":11,"id":372,"name":"minecraft:element_106","runtimeID":3898},{"data":12,"id":372,"name":"minecraft:element_106","runtimeID":3899},{"data":13,"id":372,"name":"minecraft:element_106","runtimeID":3900},{"data":14,"id":372,"name":"minecraft:element_106","runtimeID":3901},{"data":15,"id":372,"name":"minecraft:element_106","runtimeID":3902},{"data":0,"id":373,"name":"minecraft:element_107","runtimeID":3903},{"data":1,"id":373,"name":"minecraft:element_107","runtimeID":3904},{"data":2,"id":373,"name":"minecraft:element_107","runtimeID":3905},{"data":3,"id":373,"name":"minecraft:element_107","runtimeID":3906},{"data":4,"id":373,"name":"minecraft:element_107","runtimeID":3907},{"data":5,"id":373,"name":"minecraft:element_107","runtimeID":3908},{"data":6,"id":373,"name":"minecraft:element_107","runtimeID":3909},{"data":7,"id":373,"name":"minecraft:element_107","runtimeID":3910},{"data":8,"id":373,"name":"minecraft:element_107","runtimeID":3911},{"data":9,"id":373,"name":"minecraft:element_107","runtimeID":3912},{"data":10,"id":373,"name":"minecraft:element_107","runtimeID":3913},{"data":11,"id":373,"name":"minecraft:element_107","runtimeID":3914},{"data":12,"id":373,"name":"minecraft:element_107","runtimeID":3915},{"data":13,"id":373,"name":"minecraft:element_107","runtimeID":3916},{"data":14,"id":373,"name":"minecraft:element_107","runtimeID":3917},{"data":15,"id":373,"name":"minecraft:element_107","runtimeID":3918},{"data":0,"id":374,"name":"minecraft:element_108","runtimeID":3919},{"data":1,"id":374,"name":"minecraft:element_108","runtimeID":3920},{"data":2,"id":374,"name":"minecraft:element_108","runtimeID":3921},{"data":3,"id":374,"name":"minecraft:element_108","runtimeID":3922},{"data":4,"id":374,"name":"minecraft:element_108","runtimeID":3923},{"data":5,"id":374,"name":"minecraft:element_108","runtimeID":3924},{"data":6,"id":374,"name":"minecraft:element_108","runtimeID":3925},{"data":7,"id":374,"name":"minecraft:element_108","runtimeID":3926},{"data":8,"id":374,"name":"minecraft:element_108","runtimeID":3927},{"data":9,"id":374,"name":"minecraft:element_108","runtimeID":3928},{"data":10,"id":374,"name":"minecraft:element_108","runtimeID":3929},{"data":11,"id":374,"name":"minecraft:element_108","runtimeID":3930},{"data":12,"id":374,"name":"minecraft:element_108","runtimeID":3931},{"data":13,"id":374,"name":"minecraft:element_108","runtimeID":3932},{"data":14,"id":374,"name":"minecraft:element_108","runtimeID":3933},{"data":15,"id":374,"name":"minecraft:element_108","runtimeID":3934},{"data":0,"id":375,"name":"minecraft:element_109","runtimeID":3935},{"data":1,"id":375,"name":"minecraft:element_109","runtimeID":3936},{"data":2,"id":375,"name":"minecraft:element_109","runtimeID":3937},{"data":3,"id":375,"name":"minecraft:element_109","runtimeID":3938},{"data":4,"id":375,"name":"minecraft:element_109","runtimeID":3939},{"data":5,"id":375,"name":"minecraft:element_109","runtimeID":3940},{"data":6,"id":375,"name":"minecraft:element_109","runtimeID":3941},{"data":7,"id":375,"name":"minecraft:element_109","runtimeID":3942},{"data":8,"id":375,"name":"minecraft:element_109","runtimeID":3943},{"data":9,"id":375,"name":"minecraft:element_109","runtimeID":3944},{"data":10,"id":375,"name":"minecraft:element_109","runtimeID":3945},{"data":11,"id":375,"name":"minecraft:element_109","runtimeID":3946},{"data":12,"id":375,"name":"minecraft:element_109","runtimeID":3947},{"data":13,"id":375,"name":"minecraft:element_109","runtimeID":3948},{"data":14,"id":375,"name":"minecraft:element_109","runtimeID":3949},{"data":15,"id":375,"name":"minecraft:element_109","runtimeID":3950},{"data":0,"id":376,"name":"minecraft:element_110","runtimeID":3951},{"data":1,"id":376,"name":"minecraft:element_110","runtimeID":3952},{"data":2,"id":376,"name":"minecraft:element_110","runtimeID":3953},{"data":3,"id":376,"name":"minecraft:element_110","runtimeID":3954},{"data":4,"id":376,"name":"minecraft:element_110","runtimeID":3955},{"data":5,"id":376,"name":"minecraft:element_110","runtimeID":3956},{"data":6,"id":376,"name":"minecraft:element_110","runtimeID":3957},{"data":7,"id":376,"name":"minecraft:element_110","runtimeID":3958},{"data":8,"id":376,"name":"minecraft:element_110","runtimeID":3959},{"data":9,"id":376,"name":"minecraft:element_110","runtimeID":3960},{"data":10,"id":376,"name":"minecraft:element_110","runtimeID":3961},{"data":11,"id":376,"name":"minecraft:element_110","runtimeID":3962},{"data":12,"id":376,"name":"minecraft:element_110","runtimeID":3963},{"data":13,"id":376,"name":"minecraft:element_110","runtimeID":3964},{"data":14,"id":376,"name":"minecraft:element_110","runtimeID":3965},{"data":15,"id":376,"name":"minecraft:element_110","runtimeID":3966},{"data":0,"id":377,"name":"minecraft:element_111","runtimeID":3967},{"data":1,"id":377,"name":"minecraft:element_111","runtimeID":3968},{"data":2,"id":377,"name":"minecraft:element_111","runtimeID":3969},{"data":3,"id":377,"name":"minecraft:element_111","runtimeID":3970},{"data":4,"id":377,"name":"minecraft:element_111","runtimeID":3971},{"data":5,"id":377,"name":"minecraft:element_111","runtimeID":3972},{"data":6,"id":377,"name":"minecraft:element_111","runtimeID":3973},{"data":7,"id":377,"name":"minecraft:element_111","runtimeID":3974},{"data":8,"id":377,"name":"minecraft:element_111","runtimeID":3975},{"data":9,"id":377,"name":"minecraft:element_111","runtimeID":3976},{"data":10,"id":377,"name":"minecraft:element_111","runtimeID":3977},{"data":11,"id":377,"name":"minecraft:element_111","runtimeID":3978},{"data":12,"id":377,"name":"minecraft:element_111","runtimeID":3979},{"data":13,"id":377,"name":"minecraft:element_111","runtimeID":3980},{"data":14,"id":377,"name":"minecraft:element_111","runtimeID":3981},{"data":15,"id":377,"name":"minecraft:element_111","runtimeID":3982},{"data":0,"id":378,"name":"minecraft:element_112","runtimeID":3983},{"data":1,"id":378,"name":"minecraft:element_112","runtimeID":3984},{"data":2,"id":378,"name":"minecraft:element_112","runtimeID":3985},{"data":3,"id":378,"name":"minecraft:element_112","runtimeID":3986},{"data":4,"id":378,"name":"minecraft:element_112","runtimeID":3987},{"data":5,"id":378,"name":"minecraft:element_112","runtimeID":3988},{"data":6,"id":378,"name":"minecraft:element_112","runtimeID":3989},{"data":7,"id":378,"name":"minecraft:element_112","runtimeID":3990},{"data":8,"id":378,"name":"minecraft:element_112","runtimeID":3991},{"data":9,"id":378,"name":"minecraft:element_112","runtimeID":3992},{"data":10,"id":378,"name":"minecraft:element_112","runtimeID":3993},{"data":11,"id":378,"name":"minecraft:element_112","runtimeID":3994},{"data":12,"id":378,"name":"minecraft:element_112","runtimeID":3995},{"data":13,"id":378,"name":"minecraft:element_112","runtimeID":3996},{"data":14,"id":378,"name":"minecraft:element_112","runtimeID":3997},{"data":15,"id":378,"name":"minecraft:element_112","runtimeID":3998},{"data":0,"id":379,"name":"minecraft:element_113","runtimeID":3999},{"data":1,"id":379,"name":"minecraft:element_113","runtimeID":4000},{"data":2,"id":379,"name":"minecraft:element_113","runtimeID":4001},{"data":3,"id":379,"name":"minecraft:element_113","runtimeID":4002},{"data":4,"id":379,"name":"minecraft:element_113","runtimeID":4003},{"data":5,"id":379,"name":"minecraft:element_113","runtimeID":4004},{"data":6,"id":379,"name":"minecraft:element_113","runtimeID":4005},{"data":7,"id":379,"name":"minecraft:element_113","runtimeID":4006},{"data":8,"id":379,"name":"minecraft:element_113","runtimeID":4007},{"data":9,"id":379,"name":"minecraft:element_113","runtimeID":4008},{"data":10,"id":379,"name":"minecraft:element_113","runtimeID":4009},{"data":11,"id":379,"name":"minecraft:element_113","runtimeID":4010},{"data":12,"id":379,"name":"minecraft:element_113","runtimeID":4011},{"data":13,"id":379,"name":"minecraft:element_113","runtimeID":4012},{"data":14,"id":379,"name":"minecraft:element_113","runtimeID":4013},{"data":15,"id":379,"name":"minecraft:element_113","runtimeID":4014},{"data":0,"id":380,"name":"minecraft:element_114","runtimeID":4015},{"data":1,"id":380,"name":"minecraft:element_114","runtimeID":4016},{"data":2,"id":380,"name":"minecraft:element_114","runtimeID":4017},{"data":3,"id":380,"name":"minecraft:element_114","runtimeID":4018},{"data":4,"id":380,"name":"minecraft:element_114","runtimeID":4019},{"data":5,"id":380,"name":"minecraft:element_114","runtimeID":4020},{"data":6,"id":380,"name":"minecraft:element_114","runtimeID":4021},{"data":7,"id":380,"name":"minecraft:element_114","runtimeID":4022},{"data":8,"id":380,"name":"minecraft:element_114","runtimeID":4023},{"data":9,"id":380,"name":"minecraft:element_114","runtimeID":4024},{"data":10,"id":380,"name":"minecraft:element_114","runtimeID":4025},{"data":11,"id":380,"name":"minecraft:element_114","runtimeID":4026},{"data":12,"id":380,"name":"minecraft:element_114","runtimeID":4027},{"data":13,"id":380,"name":"minecraft:element_114","runtimeID":4028},{"data":14,"id":380,"name":"minecraft:element_114","runtimeID":4029},{"data":15,"id":380,"name":"minecraft:element_114","runtimeID":4030},{"data":0,"id":381,"name":"minecraft:element_115","runtimeID":4031},{"data":1,"id":381,"name":"minecraft:element_115","runtimeID":4032},{"data":2,"id":381,"name":"minecraft:element_115","runtimeID":4033},{"data":3,"id":381,"name":"minecraft:element_115","runtimeID":4034},{"data":4,"id":381,"name":"minecraft:element_115","runtimeID":4035},{"data":5,"id":381,"name":"minecraft:element_115","runtimeID":4036},{"data":6,"id":381,"name":"minecraft:element_115","runtimeID":4037},{"data":7,"id":381,"name":"minecraft:element_115","runtimeID":4038},{"data":8,"id":381,"name":"minecraft:element_115","runtimeID":4039},{"data":9,"id":381,"name":"minecraft:element_115","runtimeID":4040},{"data":10,"id":381,"name":"minecraft:element_115","runtimeID":4041},{"data":11,"id":381,"name":"minecraft:element_115","runtimeID":4042},{"data":12,"id":381,"name":"minecraft:element_115","runtimeID":4043},{"data":13,"id":381,"name":"minecraft:element_115","runtimeID":4044},{"data":14,"id":381,"name":"minecraft:element_115","runtimeID":4045},{"data":15,"id":381,"name":"minecraft:element_115","runtimeID":4046},{"data":0,"id":382,"name":"minecraft:element_116","runtimeID":4047},{"data":1,"id":382,"name":"minecraft:element_116","runtimeID":4048},{"data":2,"id":382,"name":"minecraft:element_116","runtimeID":4049},{"data":3,"id":382,"name":"minecraft:element_116","runtimeID":4050},{"data":4,"id":382,"name":"minecraft:element_116","runtimeID":4051},{"data":5,"id":382,"name":"minecraft:element_116","runtimeID":4052},{"data":6,"id":382,"name":"minecraft:element_116","runtimeID":4053},{"data":7,"id":382,"name":"minecraft:element_116","runtimeID":4054},{"data":8,"id":382,"name":"minecraft:element_116","runtimeID":4055},{"data":9,"id":382,"name":"minecraft:element_116","runtimeID":4056},{"data":10,"id":382,"name":"minecraft:element_116","runtimeID":4057},{"data":11,"id":382,"name":"minecraft:element_116","runtimeID":4058},{"data":12,"id":382,"name":"minecraft:element_116","runtimeID":4059},{"data":13,"id":382,"name":"minecraft:element_116","runtimeID":4060},{"data":14,"id":382,"name":"minecraft:element_116","runtimeID":4061},{"data":15,"id":382,"name":"minecraft:element_116","runtimeID":4062},{"data":0,"id":383,"name":"minecraft:element_117","runtimeID":4063},{"data":1,"id":383,"name":"minecraft:element_117","runtimeID":4064},{"data":2,"id":383,"name":"minecraft:element_117","runtimeID":4065},{"data":3,"id":383,"name":"minecraft:element_117","runtimeID":4066},{"data":4,"id":383,"name":"minecraft:element_117","runtimeID":4067},{"data":5,"id":383,"name":"minecraft:element_117","runtimeID":4068},{"data":6,"id":383,"name":"minecraft:element_117","runtimeID":4069},{"data":7,"id":383,"name":"minecraft:element_117","runtimeID":4070},{"data":8,"id":383,"name":"minecraft:element_117","runtimeID":4071},{"data":9,"id":383,"name":"minecraft:element_117","runtimeID":4072},{"data":10,"id":383,"name":"minecraft:element_117","runtimeID":4073},{"data":11,"id":383,"name":"minecraft:element_117","runtimeID":4074},{"data":12,"id":383,"name":"minecraft:element_117","runtimeID":4075},{"data":13,"id":383,"name":"minecraft:element_117","runtimeID":4076},{"data":14,"id":383,"name":"minecraft:element_117","runtimeID":4077},{"data":15,"id":383,"name":"minecraft:element_117","runtimeID":4078},{"data":0,"id":384,"name":"minecraft:element_118","runtimeID":4079},{"data":1,"id":384,"name":"minecraft:element_118","runtimeID":4080},{"data":2,"id":384,"name":"minecraft:element_118","runtimeID":4081},{"data":3,"id":384,"name":"minecraft:element_118","runtimeID":4082},{"data":4,"id":384,"name":"minecraft:element_118","runtimeID":4083},{"data":5,"id":384,"name":"minecraft:element_118","runtimeID":4084},{"data":6,"id":384,"name":"minecraft:element_118","runtimeID":4085},{"data":7,"id":384,"name":"minecraft:element_118","runtimeID":4086},{"data":8,"id":384,"name":"minecraft:element_118","runtimeID":4087},{"data":9,"id":384,"name":"minecraft:element_118","runtimeID":4088},{"data":10,"id":384,"name":"minecraft:element_118","runtimeID":4089},{"data":11,"id":384,"name":"minecraft:element_118","runtimeID":4090},{"data":12,"id":384,"name":"minecraft:element_118","runtimeID":4091},{"data":13,"id":384,"name":"minecraft:element_118","runtimeID":4092},{"data":14,"id":384,"name":"minecraft:element_118","runtimeID":4093},{"data":15,"id":384,"name":"minecraft:element_118","runtimeID":4094},{"data":0,"id":385,"name":"minecraft:seagrass","runtimeID":4095},{"data":1,"id":385,"name":"minecraft:seagrass","runtimeID":4096},{"data":2,"id":385,"name":"minecraft:seagrass","runtimeID":4097},{"data":3,"id":385,"name":"minecraft:seagrass","runtimeID":4098},{"data":0,"id":386,"name":"minecraft:coral","runtimeID":4099},{"data":1,"id":386,"name":"minecraft:coral","runtimeID":4100},{"data":2,"id":386,"name":"minecraft:coral","runtimeID":4101},{"data":3,"id":386,"name":"minecraft:coral","runtimeID":4102},{"data":4,"id":386,"name":"minecraft:coral","runtimeID":4103},{"data":5,"id":386,"name":"minecraft:coral","runtimeID":4104},{"data":6,"id":386,"name":"minecraft:coral","runtimeID":4105},{"data":7,"id":386,"name":"minecraft:coral","runtimeID":4106},{"data":8,"id":386,"name":"minecraft:coral","runtimeID":4107},{"data":9,"id":386,"name":"minecraft:coral","runtimeID":4108},{"data":10,"id":386,"name":"minecraft:coral","runtimeID":4109},{"data":11,"id":386,"name":"minecraft:coral","runtimeID":4110},{"data":12,"id":386,"name":"minecraft:coral","runtimeID":4111},{"data":13,"id":386,"name":"minecraft:coral","runtimeID":4112},{"data":14,"id":386,"name":"minecraft:coral","runtimeID":4113},{"data":15,"id":386,"name":"minecraft:coral","runtimeID":4114},{"data":0,"id":387,"name":"minecraft:coral_block","runtimeID":4115},{"data":1,"id":387,"name":"minecraft:coral_block","runtimeID":4116},{"data":2,"id":387,"name":"minecraft:coral_block","runtimeID":4117},{"data":3,"id":387,"name":"minecraft:coral_block","runtimeID":4118},{"data":4,"id":387,"name":"minecraft:coral_block","runtimeID":4119},{"data":5,"id":387,"name":"minecraft:coral_block","runtimeID":4120},{"data":6,"id":387,"name":"minecraft:coral_block","runtimeID":4121},{"data":7,"id":387,"name":"minecraft:coral_block","runtimeID":4122},{"data":8,"id":387,"name":"minecraft:coral_block","runtimeID":4123},{"data":9,"id":387,"name":"minecraft:coral_block","runtimeID":4124},{"data":10,"id":387,"name":"minecraft:coral_block","runtimeID":4125},{"data":11,"id":387,"name":"minecraft:coral_block","runtimeID":4126},{"data":12,"id":387,"name":"minecraft:coral_block","runtimeID":4127},{"data":13,"id":387,"name":"minecraft:coral_block","runtimeID":4128},{"data":14,"id":387,"name":"minecraft:coral_block","runtimeID":4129},{"data":15,"id":387,"name":"minecraft:coral_block","runtimeID":4130},{"data":0,"id":388,"name":"minecraft:coral_fan","runtimeID":4131},{"data":1,"id":388,"name":"minecraft:coral_fan","runtimeID":4132},{"data":2,"id":388,"name":"minecraft:coral_fan","runtimeID":4133},{"data":3,"id":388,"name":"minecraft:coral_fan","runtimeID":4134},{"data":4,"id":388,"name":"minecraft:coral_fan","runtimeID":4135},{"data":5,"id":388,"name":"minecraft:coral_fan","runtimeID":4136},{"data":6,"id":388,"name":"minecraft:coral_fan","runtimeID":4137},{"data":7,"id":388,"name":"minecraft:coral_fan","runtimeID":4138},{"data":8,"id":388,"name":"minecraft:coral_fan","runtimeID":4139},{"data":9,"id":388,"name":"minecraft:coral_fan","runtimeID":4140},{"data":10,"id":388,"name":"minecraft:coral_fan","runtimeID":4141},{"data":11,"id":388,"name":"minecraft:coral_fan","runtimeID":4142},{"data":12,"id":388,"name":"minecraft:coral_fan","runtimeID":4143},{"data":13,"id":388,"name":"minecraft:coral_fan","runtimeID":4144},{"data":14,"id":388,"name":"minecraft:coral_fan","runtimeID":4145},{"data":15,"id":388,"name":"minecraft:coral_fan","runtimeID":4146},{"data":0,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4147},{"data":1,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4148},{"data":2,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4149},{"data":3,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4150},{"data":4,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4151},{"data":5,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4152},{"data":6,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4153},{"data":7,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4154},{"data":8,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4155},{"data":9,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4156},{"data":10,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4157},{"data":11,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4158},{"data":12,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4159},{"data":13,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4160},{"data":14,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4161},{"data":15,"id":389,"name":"minecraft:coral_fan_dead","runtimeID":4162},{"data":0,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4163},{"data":1,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4164},{"data":2,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4165},{"data":3,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4166},{"data":4,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4167},{"data":5,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4168},{"data":6,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4169},{"data":7,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4170},{"data":8,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4171},{"data":9,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4172},{"data":10,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4173},{"data":11,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4174},{"data":12,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4175},{"data":13,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4176},{"data":14,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4177},{"data":15,"id":390,"name":"minecraft:coral_fan_hang","runtimeID":4178},{"data":0,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4179},{"data":1,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4180},{"data":2,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4181},{"data":3,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4182},{"data":4,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4183},{"data":5,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4184},{"data":6,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4185},{"data":7,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4186},{"data":8,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4187},{"data":9,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4188},{"data":10,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4189},{"data":11,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4190},{"data":12,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4191},{"data":13,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4192},{"data":14,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4193},{"data":15,"id":391,"name":"minecraft:coral_fan_hang2","runtimeID":4194},{"data":0,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4195},{"data":1,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4196},{"data":2,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4197},{"data":3,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4198},{"data":4,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4199},{"data":5,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4200},{"data":6,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4201},{"data":7,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4202},{"data":8,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4203},{"data":9,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4204},{"data":10,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4205},{"data":11,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4206},{"data":12,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4207},{"data":13,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4208},{"data":14,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4209},{"data":15,"id":392,"name":"minecraft:coral_fan_hang3","runtimeID":4210},{"data":0,"id":393,"name":"minecraft:kelp","runtimeID":4211},{"data":1,"id":393,"name":"minecraft:kelp","runtimeID":4212},{"data":2,"id":393,"name":"minecraft:kelp","runtimeID":4213},{"data":3,"id":393,"name":"minecraft:kelp","runtimeID":4214},{"data":4,"id":393,"name":"minecraft:kelp","runtimeID":4215},{"data":5,"id":393,"name":"minecraft:kelp","runtimeID":4216},{"data":6,"id":393,"name":"minecraft:kelp","runtimeID":4217},{"data":7,"id":393,"name":"minecraft:kelp","runtimeID":4218},{"data":8,"id":393,"name":"minecraft:kelp","runtimeID":4219},{"data":9,"id":393,"name":"minecraft:kelp","runtimeID":4220},{"data":10,"id":393,"name":"minecraft:kelp","runtimeID":4221},{"data":11,"id":393,"name":"minecraft:kelp","runtimeID":4222},{"data":12,"id":393,"name":"minecraft:kelp","runtimeID":4223},{"data":13,"id":393,"name":"minecraft:kelp","runtimeID":4224},{"data":14,"id":393,"name":"minecraft:kelp","runtimeID":4225},{"data":15,"id":393,"name":"minecraft:kelp","runtimeID":4226},{"data":0,"id":394,"name":"minecraft:dried_kelp_block","runtimeID":4227},{"data":0,"id":395,"name":"minecraft:acacia_button","runtimeID":4228},{"data":1,"id":395,"name":"minecraft:acacia_button","runtimeID":4229},{"data":2,"id":395,"name":"minecraft:acacia_button","runtimeID":4230},{"data":3,"id":395,"name":"minecraft:acacia_button","runtimeID":4231},{"data":4,"id":395,"name":"minecraft:acacia_button","runtimeID":4232},{"data":5,"id":395,"name":"minecraft:acacia_button","runtimeID":4233},{"data":6,"id":395,"name":"minecraft:acacia_button","runtimeID":4234},{"data":7,"id":395,"name":"minecraft:acacia_button","runtimeID":4235},{"data":8,"id":395,"name":"minecraft:acacia_button","runtimeID":4236},{"data":9,"id":395,"name":"minecraft:acacia_button","runtimeID":4237},{"data":10,"id":395,"name":"minecraft:acacia_button","runtimeID":4238},{"data":11,"id":395,"name":"minecraft:acacia_button","runtimeID":4239},{"data":12,"id":395,"name":"minecraft:acacia_button","runtimeID":4240},{"data":13,"id":395,"name":"minecraft:acacia_button","runtimeID":4241},{"data":14,"id":395,"name":"minecraft:acacia_button","runtimeID":4242},{"data":15,"id":395,"name":"minecraft:acacia_button","runtimeID":4243},{"data":0,"id":396,"name":"minecraft:birch_button","runtimeID":4244},{"data":1,"id":396,"name":"minecraft:birch_button","runtimeID":4245},{"data":2,"id":396,"name":"minecraft:birch_button","runtimeID":4246},{"data":3,"id":396,"name":"minecraft:birch_button","runtimeID":4247},{"data":4,"id":396,"name":"minecraft:birch_button","runtimeID":4248},{"data":5,"id":396,"name":"minecraft:birch_button","runtimeID":4249},{"data":6,"id":396,"name":"minecraft:birch_button","runtimeID":4250},{"data":7,"id":396,"name":"minecraft:birch_button","runtimeID":4251},{"data":8,"id":396,"name":"minecraft:birch_button","runtimeID":4252},{"data":9,"id":396,"name":"minecraft:birch_button","runtimeID":4253},{"data":10,"id":396,"name":"minecraft:birch_button","runtimeID":4254},{"data":11,"id":396,"name":"minecraft:birch_button","runtimeID":4255},{"data":12,"id":396,"name":"minecraft:birch_button","runtimeID":4256},{"data":13,"id":396,"name":"minecraft:birch_button","runtimeID":4257},{"data":14,"id":396,"name":"minecraft:birch_button","runtimeID":4258},{"data":15,"id":396,"name":"minecraft:birch_button","runtimeID":4259},{"data":0,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4260},{"data":1,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4261},{"data":2,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4262},{"data":3,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4263},{"data":4,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4264},{"data":5,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4265},{"data":6,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4266},{"data":7,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4267},{"data":8,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4268},{"data":9,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4269},{"data":10,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4270},{"data":11,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4271},{"data":12,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4272},{"data":13,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4273},{"data":14,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4274},{"data":15,"id":397,"name":"minecraft:dark_oak_button","runtimeID":4275},{"data":0,"id":398,"name":"minecraft:jungle_button","runtimeID":4276},{"data":1,"id":398,"name":"minecraft:jungle_button","runtimeID":4277},{"data":2,"id":398,"name":"minecraft:jungle_button","runtimeID":4278},{"data":3,"id":398,"name":"minecraft:jungle_button","runtimeID":4279},{"data":4,"id":398,"name":"minecraft:jungle_button","runtimeID":4280},{"data":5,"id":398,"name":"minecraft:jungle_button","runtimeID":4281},{"data":6,"id":398,"name":"minecraft:jungle_button","runtimeID":4282},{"data":7,"id":398,"name":"minecraft:jungle_button","runtimeID":4283},{"data":8,"id":398,"name":"minecraft:jungle_button","runtimeID":4284},{"data":9,"id":398,"name":"minecraft:jungle_button","runtimeID":4285},{"data":10,"id":398,"name":"minecraft:jungle_button","runtimeID":4286},{"data":11,"id":398,"name":"minecraft:jungle_button","runtimeID":4287},{"data":12,"id":398,"name":"minecraft:jungle_button","runtimeID":4288},{"data":13,"id":398,"name":"minecraft:jungle_button","runtimeID":4289},{"data":14,"id":398,"name":"minecraft:jungle_button","runtimeID":4290},{"data":15,"id":398,"name":"minecraft:jungle_button","runtimeID":4291},{"data":0,"id":399,"name":"minecraft:spruce_button","runtimeID":4292},{"data":1,"id":399,"name":"minecraft:spruce_button","runtimeID":4293},{"data":2,"id":399,"name":"minecraft:spruce_button","runtimeID":4294},{"data":3,"id":399,"name":"minecraft:spruce_button","runtimeID":4295},{"data":4,"id":399,"name":"minecraft:spruce_button","runtimeID":4296},{"data":5,"id":399,"name":"minecraft:spruce_button","runtimeID":4297},{"data":6,"id":399,"name":"minecraft:spruce_button","runtimeID":4298},{"data":7,"id":399,"name":"minecraft:spruce_button","runtimeID":4299},{"data":8,"id":399,"name":"minecraft:spruce_button","runtimeID":4300},{"data":9,"id":399,"name":"minecraft:spruce_button","runtimeID":4301},{"data":10,"id":399,"name":"minecraft:spruce_button","runtimeID":4302},{"data":11,"id":399,"name":"minecraft:spruce_button","runtimeID":4303},{"data":12,"id":399,"name":"minecraft:spruce_button","runtimeID":4304},{"data":13,"id":399,"name":"minecraft:spruce_button","runtimeID":4305},{"data":14,"id":399,"name":"minecraft:spruce_button","runtimeID":4306},{"data":15,"id":399,"name":"minecraft:spruce_button","runtimeID":4307},{"data":0,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4308},{"data":1,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4309},{"data":2,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4310},{"data":3,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4311},{"data":4,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4312},{"data":5,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4313},{"data":6,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4314},{"data":7,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4315},{"data":8,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4316},{"data":9,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4317},{"data":10,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4318},{"data":11,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4319},{"data":12,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4320},{"data":13,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4321},{"data":14,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4322},{"data":15,"id":400,"name":"minecraft:acacia_trapdoor","runtimeID":4323},{"data":0,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4324},{"data":1,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4325},{"data":2,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4326},{"data":3,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4327},{"data":4,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4328},{"data":5,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4329},{"data":6,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4330},{"data":7,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4331},{"data":8,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4332},{"data":9,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4333},{"data":10,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4334},{"data":11,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4335},{"data":12,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4336},{"data":13,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4337},{"data":14,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4338},{"data":15,"id":401,"name":"minecraft:birch_trapdoor","runtimeID":4339},{"data":0,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4340},{"data":1,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4341},{"data":2,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4342},{"data":3,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4343},{"data":4,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4344},{"data":5,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4345},{"data":6,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4346},{"data":7,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4347},{"data":8,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4348},{"data":9,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4349},{"data":10,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4350},{"data":11,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4351},{"data":12,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4352},{"data":13,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4353},{"data":14,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4354},{"data":15,"id":402,"name":"minecraft:dark_oak_trapdoor","runtimeID":4355},{"data":0,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4356},{"data":1,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4357},{"data":2,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4358},{"data":3,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4359},{"data":4,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4360},{"data":5,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4361},{"data":6,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4362},{"data":7,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4363},{"data":8,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4364},{"data":9,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4365},{"data":10,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4366},{"data":11,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4367},{"data":12,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4368},{"data":13,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4369},{"data":14,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4370},{"data":15,"id":403,"name":"minecraft:jungle_trapdoor","runtimeID":4371},{"data":0,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4372},{"data":1,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4373},{"data":2,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4374},{"data":3,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4375},{"data":4,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4376},{"data":5,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4377},{"data":6,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4378},{"data":7,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4379},{"data":8,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4380},{"data":9,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4381},{"data":10,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4382},{"data":11,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4383},{"data":12,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4384},{"data":13,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4385},{"data":14,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4386},{"data":15,"id":404,"name":"minecraft:spruce_trapdoor","runtimeID":4387},{"data":0,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4388},{"data":1,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4389},{"data":2,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4390},{"data":3,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4391},{"data":4,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4392},{"data":5,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4393},{"data":6,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4394},{"data":7,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4395},{"data":8,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4396},{"data":9,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4397},{"data":10,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4398},{"data":11,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4399},{"data":12,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4400},{"data":13,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4401},{"data":14,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4402},{"data":15,"id":405,"name":"minecraft:acacia_pressure_plate","runtimeID":4403},{"data":0,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4404},{"data":1,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4405},{"data":2,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4406},{"data":3,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4407},{"data":4,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4408},{"data":5,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4409},{"data":6,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4410},{"data":7,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4411},{"data":8,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4412},{"data":9,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4413},{"data":10,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4414},{"data":11,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4415},{"data":12,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4416},{"data":13,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4417},{"data":14,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4418},{"data":15,"id":406,"name":"minecraft:birch_pressure_plate","runtimeID":4419},{"data":0,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4420},{"data":1,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4421},{"data":2,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4422},{"data":3,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4423},{"data":4,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4424},{"data":5,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4425},{"data":6,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4426},{"data":7,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4427},{"data":8,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4428},{"data":9,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4429},{"data":10,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4430},{"data":11,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4431},{"data":12,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4432},{"data":13,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4433},{"data":14,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4434},{"data":15,"id":407,"name":"minecraft:dark_oak_pressure_plate","runtimeID":4435},{"data":0,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4436},{"data":1,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4437},{"data":2,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4438},{"data":3,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4439},{"data":4,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4440},{"data":5,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4441},{"data":6,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4442},{"data":7,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4443},{"data":8,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4444},{"data":9,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4445},{"data":10,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4446},{"data":11,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4447},{"data":12,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4448},{"data":13,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4449},{"data":14,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4450},{"data":15,"id":408,"name":"minecraft:jungle_pressure_plate","runtimeID":4451},{"data":0,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4452},{"data":1,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4453},{"data":2,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4454},{"data":3,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4455},{"data":4,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4456},{"data":5,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4457},{"data":6,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4458},{"data":7,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4459},{"data":8,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4460},{"data":9,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4461},{"data":10,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4462},{"data":11,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4463},{"data":12,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4464},{"data":13,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4465},{"data":14,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4466},{"data":15,"id":409,"name":"minecraft:spruce_pressure_plate","runtimeID":4467},{"data":0,"id":410,"name":"minecraft:carved_pumpkin","runtimeID":4468},{"data":1,"id":410,"name":"minecraft:carved_pumpkin","runtimeID":4469},{"data":2,"id":410,"name":"minecraft:carved_pumpkin","runtimeID":4470},{"data":3,"id":410,"name":"minecraft:carved_pumpkin","runtimeID":4471},{"data":0,"id":411,"name":"minecraft:sea_pickle","runtimeID":4472},{"data":1,"id":411,"name":"minecraft:sea_pickle","runtimeID":4473},{"data":2,"id":411,"name":"minecraft:sea_pickle","runtimeID":4474},{"data":3,"id":411,"name":"minecraft:sea_pickle","runtimeID":4475},{"data":4,"id":411,"name":"minecraft:sea_pickle","runtimeID":4476},{"data":5,"id":411,"name":"minecraft:sea_pickle","runtimeID":4477},{"data":6,"id":411,"name":"minecraft:sea_pickle","runtimeID":4478},{"data":7,"id":411,"name":"minecraft:sea_pickle","runtimeID":4479},{"data":0,"id":412,"name":"minecraft:conduit","runtimeID":4480},{"data":0,"id":414,"name":"minecraft:turtle_egg","runtimeID":4482},{"data":1,"id":414,"name":"minecraft:turtle_egg","runtimeID":4483},{"data":2,"id":414,"name":"minecraft:turtle_egg","runtimeID":4484},{"data":3,"id":414,"name":"minecraft:turtle_egg","runtimeID":4485},{"data":4,"id":414,"name":"minecraft:turtle_egg","runtimeID":4486},{"data":5,"id":414,"name":"minecraft:turtle_egg","runtimeID":4487},{"data":6,"id":414,"name":"minecraft:turtle_egg","runtimeID":4488},{"data":7,"id":414,"name":"minecraft:turtle_egg","runtimeID":4489},{"data":8,"id":414,"name":"minecraft:turtle_egg","runtimeID":4490},{"data":9,"id":414,"name":"minecraft:turtle_egg","runtimeID":4491},{"data":10,"id":414,"name":"minecraft:turtle_egg","runtimeID":4492},{"data":11,"id":414,"name":"minecraft:turtle_egg","runtimeID":4493},{"data":12,"id":414,"name":"minecraft:turtle_egg","runtimeID":4494},{"data":13,"id":414,"name":"minecraft:turtle_egg","runtimeID":4495},{"data":14,"id":414,"name":"minecraft:turtle_egg","runtimeID":4496},{"data":15,"id":414,"name":"minecraft:turtle_egg","runtimeID":4497},{"data":0,"id":415,"name":"minecraft:bubble_column","runtimeID":4498},{"data":1,"id":415,"name":"minecraft:bubble_column","runtimeID":4499}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_282.json b/src/main/resources/runtimeid_table_282.json deleted file mode 100644 index 2d5c2e902..000000000 --- a/src/main/resources/runtimeid_table_282.json +++ /dev/null @@ -1 +0,0 @@ -[{"data":0,"id":0,"name":"minecraft:air"},{"data":0,"id":1,"name":"minecraft:stone"},{"data":1,"id":1,"name":"minecraft:stone"},{"data":2,"id":1,"name":"minecraft:stone"},{"data":3,"id":1,"name":"minecraft:stone"},{"data":4,"id":1,"name":"minecraft:stone"},{"data":5,"id":1,"name":"minecraft:stone"},{"data":6,"id":1,"name":"minecraft:stone"},{"data":7,"id":1,"name":"minecraft:stone"},{"data":0,"id":2,"name":"minecraft:grass"},{"data":1,"id":2,"name":"minecraft:grass"},{"data":2,"id":2,"name":"minecraft:grass"},{"data":3,"id":2,"name":"minecraft:grass"},{"data":4,"id":2,"name":"minecraft:grass"},{"data":5,"id":2,"name":"minecraft:grass"},{"data":6,"id":2,"name":"minecraft:grass"},{"data":7,"id":2,"name":"minecraft:grass"},{"data":8,"id":2,"name":"minecraft:grass"},{"data":9,"id":2,"name":"minecraft:grass"},{"data":10,"id":2,"name":"minecraft:grass"},{"data":11,"id":2,"name":"minecraft:grass"},{"data":12,"id":2,"name":"minecraft:grass"},{"data":13,"id":2,"name":"minecraft:grass"},{"data":14,"id":2,"name":"minecraft:grass"},{"data":15,"id":2,"name":"minecraft:grass"},{"data":0,"id":3,"name":"minecraft:dirt"},{"data":1,"id":3,"name":"minecraft:dirt"},{"data":0,"id":4,"name":"minecraft:cobblestone"},{"data":0,"id":5,"name":"minecraft:planks"},{"data":1,"id":5,"name":"minecraft:planks"},{"data":2,"id":5,"name":"minecraft:planks"},{"data":3,"id":5,"name":"minecraft:planks"},{"data":4,"id":5,"name":"minecraft:planks"},{"data":5,"id":5,"name":"minecraft:planks"},{"data":6,"id":5,"name":"minecraft:planks"},{"data":7,"id":5,"name":"minecraft:planks"},{"data":0,"id":6,"name":"minecraft:sapling"},{"data":1,"id":6,"name":"minecraft:sapling"},{"data":2,"id":6,"name":"minecraft:sapling"},{"data":3,"id":6,"name":"minecraft:sapling"},{"data":4,"id":6,"name":"minecraft:sapling"},{"data":5,"id":6,"name":"minecraft:sapling"},{"data":6,"id":6,"name":"minecraft:sapling"},{"data":7,"id":6,"name":"minecraft:sapling"},{"data":8,"id":6,"name":"minecraft:sapling"},{"data":9,"id":6,"name":"minecraft:sapling"},{"data":10,"id":6,"name":"minecraft:sapling"},{"data":11,"id":6,"name":"minecraft:sapling"},{"data":12,"id":6,"name":"minecraft:sapling"},{"data":13,"id":6,"name":"minecraft:sapling"},{"data":14,"id":6,"name":"minecraft:sapling"},{"data":15,"id":6,"name":"minecraft:sapling"},{"data":0,"id":7,"name":"minecraft:bedrock"},{"data":1,"id":7,"name":"minecraft:bedrock"},{"data":0,"id":8,"name":"minecraft:flowing_water"},{"data":1,"id":8,"name":"minecraft:flowing_water"},{"data":2,"id":8,"name":"minecraft:flowing_water"},{"data":3,"id":8,"name":"minecraft:flowing_water"},{"data":4,"id":8,"name":"minecraft:flowing_water"},{"data":5,"id":8,"name":"minecraft:flowing_water"},{"data":6,"id":8,"name":"minecraft:flowing_water"},{"data":7,"id":8,"name":"minecraft:flowing_water"},{"data":8,"id":8,"name":"minecraft:flowing_water"},{"data":9,"id":8,"name":"minecraft:flowing_water"},{"data":10,"id":8,"name":"minecraft:flowing_water"},{"data":11,"id":8,"name":"minecraft:flowing_water"},{"data":12,"id":8,"name":"minecraft:flowing_water"},{"data":13,"id":8,"name":"minecraft:flowing_water"},{"data":14,"id":8,"name":"minecraft:flowing_water"},{"data":15,"id":8,"name":"minecraft:flowing_water"},{"data":0,"id":9,"name":"minecraft:water"},{"data":1,"id":9,"name":"minecraft:water"},{"data":2,"id":9,"name":"minecraft:water"},{"data":3,"id":9,"name":"minecraft:water"},{"data":4,"id":9,"name":"minecraft:water"},{"data":5,"id":9,"name":"minecraft:water"},{"data":6,"id":9,"name":"minecraft:water"},{"data":7,"id":9,"name":"minecraft:water"},{"data":8,"id":9,"name":"minecraft:water"},{"data":9,"id":9,"name":"minecraft:water"},{"data":10,"id":9,"name":"minecraft:water"},{"data":11,"id":9,"name":"minecraft:water"},{"data":12,"id":9,"name":"minecraft:water"},{"data":13,"id":9,"name":"minecraft:water"},{"data":14,"id":9,"name":"minecraft:water"},{"data":15,"id":9,"name":"minecraft:water"},{"data":0,"id":10,"name":"minecraft:flowing_lava"},{"data":1,"id":10,"name":"minecraft:flowing_lava"},{"data":2,"id":10,"name":"minecraft:flowing_lava"},{"data":3,"id":10,"name":"minecraft:flowing_lava"},{"data":4,"id":10,"name":"minecraft:flowing_lava"},{"data":5,"id":10,"name":"minecraft:flowing_lava"},{"data":6,"id":10,"name":"minecraft:flowing_lava"},{"data":7,"id":10,"name":"minecraft:flowing_lava"},{"data":8,"id":10,"name":"minecraft:flowing_lava"},{"data":9,"id":10,"name":"minecraft:flowing_lava"},{"data":10,"id":10,"name":"minecraft:flowing_lava"},{"data":11,"id":10,"name":"minecraft:flowing_lava"},{"data":12,"id":10,"name":"minecraft:flowing_lava"},{"data":13,"id":10,"name":"minecraft:flowing_lava"},{"data":14,"id":10,"name":"minecraft:flowing_lava"},{"data":15,"id":10,"name":"minecraft:flowing_lava"},{"data":0,"id":11,"name":"minecraft:lava"},{"data":1,"id":11,"name":"minecraft:lava"},{"data":2,"id":11,"name":"minecraft:lava"},{"data":3,"id":11,"name":"minecraft:lava"},{"data":4,"id":11,"name":"minecraft:lava"},{"data":5,"id":11,"name":"minecraft:lava"},{"data":6,"id":11,"name":"minecraft:lava"},{"data":7,"id":11,"name":"minecraft:lava"},{"data":8,"id":11,"name":"minecraft:lava"},{"data":9,"id":11,"name":"minecraft:lava"},{"data":10,"id":11,"name":"minecraft:lava"},{"data":11,"id":11,"name":"minecraft:lava"},{"data":12,"id":11,"name":"minecraft:lava"},{"data":13,"id":11,"name":"minecraft:lava"},{"data":14,"id":11,"name":"minecraft:lava"},{"data":15,"id":11,"name":"minecraft:lava"},{"data":0,"id":12,"name":"minecraft:sand"},{"data":1,"id":12,"name":"minecraft:sand"},{"data":0,"id":13,"name":"minecraft:gravel"},{"data":0,"id":14,"name":"minecraft:gold_ore"},{"data":0,"id":15,"name":"minecraft:iron_ore"},{"data":0,"id":16,"name":"minecraft:coal_ore"},{"data":0,"id":17,"name":"minecraft:log"},{"data":1,"id":17,"name":"minecraft:log"},{"data":2,"id":17,"name":"minecraft:log"},{"data":3,"id":17,"name":"minecraft:log"},{"data":4,"id":17,"name":"minecraft:log"},{"data":5,"id":17,"name":"minecraft:log"},{"data":6,"id":17,"name":"minecraft:log"},{"data":7,"id":17,"name":"minecraft:log"},{"data":8,"id":17,"name":"minecraft:log"},{"data":9,"id":17,"name":"minecraft:log"},{"data":10,"id":17,"name":"minecraft:log"},{"data":11,"id":17,"name":"minecraft:log"},{"data":12,"id":17,"name":"minecraft:log"},{"data":13,"id":17,"name":"minecraft:log"},{"data":14,"id":17,"name":"minecraft:log"},{"data":15,"id":17,"name":"minecraft:log"},{"data":0,"id":18,"name":"minecraft:leaves"},{"data":1,"id":18,"name":"minecraft:leaves"},{"data":2,"id":18,"name":"minecraft:leaves"},{"data":3,"id":18,"name":"minecraft:leaves"},{"data":4,"id":18,"name":"minecraft:leaves"},{"data":5,"id":18,"name":"minecraft:leaves"},{"data":6,"id":18,"name":"minecraft:leaves"},{"data":7,"id":18,"name":"minecraft:leaves"},{"data":8,"id":18,"name":"minecraft:leaves"},{"data":9,"id":18,"name":"minecraft:leaves"},{"data":10,"id":18,"name":"minecraft:leaves"},{"data":11,"id":18,"name":"minecraft:leaves"},{"data":12,"id":18,"name":"minecraft:leaves"},{"data":13,"id":18,"name":"minecraft:leaves"},{"data":14,"id":18,"name":"minecraft:leaves"},{"data":15,"id":18,"name":"minecraft:leaves"},{"data":0,"id":19,"name":"minecraft:sponge"},{"data":1,"id":19,"name":"minecraft:sponge"},{"data":0,"id":20,"name":"minecraft:glass"},{"data":0,"id":21,"name":"minecraft:lapis_ore"},{"data":0,"id":22,"name":"minecraft:lapis_block"},{"data":0,"id":23,"name":"minecraft:dispenser"},{"data":1,"id":23,"name":"minecraft:dispenser"},{"data":2,"id":23,"name":"minecraft:dispenser"},{"data":3,"id":23,"name":"minecraft:dispenser"},{"data":4,"id":23,"name":"minecraft:dispenser"},{"data":5,"id":23,"name":"minecraft:dispenser"},{"data":6,"id":23,"name":"minecraft:dispenser"},{"data":7,"id":23,"name":"minecraft:dispenser"},{"data":8,"id":23,"name":"minecraft:dispenser"},{"data":9,"id":23,"name":"minecraft:dispenser"},{"data":10,"id":23,"name":"minecraft:dispenser"},{"data":11,"id":23,"name":"minecraft:dispenser"},{"data":12,"id":23,"name":"minecraft:dispenser"},{"data":13,"id":23,"name":"minecraft:dispenser"},{"data":14,"id":23,"name":"minecraft:dispenser"},{"data":15,"id":23,"name":"minecraft:dispenser"},{"data":0,"id":24,"name":"minecraft:sandstone"},{"data":1,"id":24,"name":"minecraft:sandstone"},{"data":2,"id":24,"name":"minecraft:sandstone"},{"data":3,"id":24,"name":"minecraft:sandstone"},{"data":0,"id":25,"name":"minecraft:noteblock"},{"data":0,"id":26,"name":"minecraft:bed"},{"data":1,"id":26,"name":"minecraft:bed"},{"data":2,"id":26,"name":"minecraft:bed"},{"data":3,"id":26,"name":"minecraft:bed"},{"data":4,"id":26,"name":"minecraft:bed"},{"data":5,"id":26,"name":"minecraft:bed"},{"data":6,"id":26,"name":"minecraft:bed"},{"data":7,"id":26,"name":"minecraft:bed"},{"data":8,"id":26,"name":"minecraft:bed"},{"data":9,"id":26,"name":"minecraft:bed"},{"data":10,"id":26,"name":"minecraft:bed"},{"data":11,"id":26,"name":"minecraft:bed"},{"data":12,"id":26,"name":"minecraft:bed"},{"data":13,"id":26,"name":"minecraft:bed"},{"data":14,"id":26,"name":"minecraft:bed"},{"data":15,"id":26,"name":"minecraft:bed"},{"data":0,"id":27,"name":"minecraft:golden_rail"},{"data":1,"id":27,"name":"minecraft:golden_rail"},{"data":2,"id":27,"name":"minecraft:golden_rail"},{"data":3,"id":27,"name":"minecraft:golden_rail"},{"data":4,"id":27,"name":"minecraft:golden_rail"},{"data":5,"id":27,"name":"minecraft:golden_rail"},{"data":6,"id":27,"name":"minecraft:golden_rail"},{"data":7,"id":27,"name":"minecraft:golden_rail"},{"data":8,"id":27,"name":"minecraft:golden_rail"},{"data":9,"id":27,"name":"minecraft:golden_rail"},{"data":10,"id":27,"name":"minecraft:golden_rail"},{"data":11,"id":27,"name":"minecraft:golden_rail"},{"data":12,"id":27,"name":"minecraft:golden_rail"},{"data":13,"id":27,"name":"minecraft:golden_rail"},{"data":14,"id":27,"name":"minecraft:golden_rail"},{"data":15,"id":27,"name":"minecraft:golden_rail"},{"data":0,"id":28,"name":"minecraft:detector_rail"},{"data":1,"id":28,"name":"minecraft:detector_rail"},{"data":2,"id":28,"name":"minecraft:detector_rail"},{"data":3,"id":28,"name":"minecraft:detector_rail"},{"data":4,"id":28,"name":"minecraft:detector_rail"},{"data":5,"id":28,"name":"minecraft:detector_rail"},{"data":6,"id":28,"name":"minecraft:detector_rail"},{"data":7,"id":28,"name":"minecraft:detector_rail"},{"data":8,"id":28,"name":"minecraft:detector_rail"},{"data":9,"id":28,"name":"minecraft:detector_rail"},{"data":10,"id":28,"name":"minecraft:detector_rail"},{"data":11,"id":28,"name":"minecraft:detector_rail"},{"data":12,"id":28,"name":"minecraft:detector_rail"},{"data":13,"id":28,"name":"minecraft:detector_rail"},{"data":14,"id":28,"name":"minecraft:detector_rail"},{"data":15,"id":28,"name":"minecraft:detector_rail"},{"data":0,"id":29,"name":"minecraft:sticky_piston"},{"data":1,"id":29,"name":"minecraft:sticky_piston"},{"data":2,"id":29,"name":"minecraft:sticky_piston"},{"data":3,"id":29,"name":"minecraft:sticky_piston"},{"data":4,"id":29,"name":"minecraft:sticky_piston"},{"data":5,"id":29,"name":"minecraft:sticky_piston"},{"data":6,"id":29,"name":"minecraft:sticky_piston"},{"data":7,"id":29,"name":"minecraft:sticky_piston"},{"data":0,"id":30,"name":"minecraft:web"},{"data":0,"id":31,"name":"minecraft:tallgrass"},{"data":1,"id":31,"name":"minecraft:tallgrass"},{"data":2,"id":31,"name":"minecraft:tallgrass"},{"data":3,"id":31,"name":"minecraft:tallgrass"},{"data":0,"id":32,"name":"minecraft:deadbush"},{"data":0,"id":33,"name":"minecraft:piston"},{"data":1,"id":33,"name":"minecraft:piston"},{"data":2,"id":33,"name":"minecraft:piston"},{"data":3,"id":33,"name":"minecraft:piston"},{"data":4,"id":33,"name":"minecraft:piston"},{"data":5,"id":33,"name":"minecraft:piston"},{"data":6,"id":33,"name":"minecraft:piston"},{"data":7,"id":33,"name":"minecraft:piston"},{"data":0,"id":34,"name":"minecraft:pistonArmCollision"},{"data":1,"id":34,"name":"minecraft:pistonArmCollision"},{"data":2,"id":34,"name":"minecraft:pistonArmCollision"},{"data":3,"id":34,"name":"minecraft:pistonArmCollision"},{"data":4,"id":34,"name":"minecraft:pistonArmCollision"},{"data":5,"id":34,"name":"minecraft:pistonArmCollision"},{"data":6,"id":34,"name":"minecraft:pistonArmCollision"},{"data":7,"id":34,"name":"minecraft:pistonArmCollision"},{"data":0,"id":35,"name":"minecraft:wool"},{"data":1,"id":35,"name":"minecraft:wool"},{"data":2,"id":35,"name":"minecraft:wool"},{"data":3,"id":35,"name":"minecraft:wool"},{"data":4,"id":35,"name":"minecraft:wool"},{"data":5,"id":35,"name":"minecraft:wool"},{"data":6,"id":35,"name":"minecraft:wool"},{"data":7,"id":35,"name":"minecraft:wool"},{"data":8,"id":35,"name":"minecraft:wool"},{"data":9,"id":35,"name":"minecraft:wool"},{"data":10,"id":35,"name":"minecraft:wool"},{"data":11,"id":35,"name":"minecraft:wool"},{"data":12,"id":35,"name":"minecraft:wool"},{"data":13,"id":35,"name":"minecraft:wool"},{"data":14,"id":35,"name":"minecraft:wool"},{"data":15,"id":35,"name":"minecraft:wool"},{"data":0,"id":36,"name":"minecraft:element_0"},{"data":1,"id":36,"name":"minecraft:element_0"},{"data":2,"id":36,"name":"minecraft:element_0"},{"data":3,"id":36,"name":"minecraft:element_0"},{"data":4,"id":36,"name":"minecraft:element_0"},{"data":5,"id":36,"name":"minecraft:element_0"},{"data":6,"id":36,"name":"minecraft:element_0"},{"data":7,"id":36,"name":"minecraft:element_0"},{"data":8,"id":36,"name":"minecraft:element_0"},{"data":9,"id":36,"name":"minecraft:element_0"},{"data":10,"id":36,"name":"minecraft:element_0"},{"data":11,"id":36,"name":"minecraft:element_0"},{"data":12,"id":36,"name":"minecraft:element_0"},{"data":13,"id":36,"name":"minecraft:element_0"},{"data":14,"id":36,"name":"minecraft:element_0"},{"data":15,"id":36,"name":"minecraft:element_0"},{"data":0,"id":37,"name":"minecraft:yellow_flower"},{"data":1,"id":37,"name":"minecraft:yellow_flower"},{"data":2,"id":37,"name":"minecraft:yellow_flower"},{"data":3,"id":37,"name":"minecraft:yellow_flower"},{"data":4,"id":37,"name":"minecraft:yellow_flower"},{"data":5,"id":37,"name":"minecraft:yellow_flower"},{"data":6,"id":37,"name":"minecraft:yellow_flower"},{"data":7,"id":37,"name":"minecraft:yellow_flower"},{"data":8,"id":37,"name":"minecraft:yellow_flower"},{"data":9,"id":37,"name":"minecraft:yellow_flower"},{"data":10,"id":37,"name":"minecraft:yellow_flower"},{"data":11,"id":37,"name":"minecraft:yellow_flower"},{"data":12,"id":37,"name":"minecraft:yellow_flower"},{"data":13,"id":37,"name":"minecraft:yellow_flower"},{"data":14,"id":37,"name":"minecraft:yellow_flower"},{"data":15,"id":37,"name":"minecraft:yellow_flower"},{"data":0,"id":38,"name":"minecraft:red_flower"},{"data":1,"id":38,"name":"minecraft:red_flower"},{"data":2,"id":38,"name":"minecraft:red_flower"},{"data":3,"id":38,"name":"minecraft:red_flower"},{"data":4,"id":38,"name":"minecraft:red_flower"},{"data":5,"id":38,"name":"minecraft:red_flower"},{"data":6,"id":38,"name":"minecraft:red_flower"},{"data":7,"id":38,"name":"minecraft:red_flower"},{"data":8,"id":38,"name":"minecraft:red_flower"},{"data":9,"id":38,"name":"minecraft:red_flower"},{"data":10,"id":38,"name":"minecraft:red_flower"},{"data":11,"id":38,"name":"minecraft:red_flower"},{"data":12,"id":38,"name":"minecraft:red_flower"},{"data":13,"id":38,"name":"minecraft:red_flower"},{"data":14,"id":38,"name":"minecraft:red_flower"},{"data":15,"id":38,"name":"minecraft:red_flower"},{"data":0,"id":39,"name":"minecraft:brown_mushroom"},{"data":0,"id":40,"name":"minecraft:red_mushroom"},{"data":0,"id":41,"name":"minecraft:gold_block"},{"data":0,"id":42,"name":"minecraft:iron_block"},{"data":0,"id":43,"name":"minecraft:double_stone_slab"},{"data":1,"id":43,"name":"minecraft:double_stone_slab"},{"data":2,"id":43,"name":"minecraft:double_stone_slab"},{"data":3,"id":43,"name":"minecraft:double_stone_slab"},{"data":4,"id":43,"name":"minecraft:double_stone_slab"},{"data":5,"id":43,"name":"minecraft:double_stone_slab"},{"data":6,"id":43,"name":"minecraft:double_stone_slab"},{"data":7,"id":43,"name":"minecraft:double_stone_slab"},{"data":8,"id":43,"name":"minecraft:double_stone_slab"},{"data":9,"id":43,"name":"minecraft:double_stone_slab"},{"data":10,"id":43,"name":"minecraft:double_stone_slab"},{"data":11,"id":43,"name":"minecraft:double_stone_slab"},{"data":12,"id":43,"name":"minecraft:double_stone_slab"},{"data":13,"id":43,"name":"minecraft:double_stone_slab"},{"data":14,"id":43,"name":"minecraft:double_stone_slab"},{"data":15,"id":43,"name":"minecraft:double_stone_slab"},{"data":0,"id":44,"name":"minecraft:stone_slab"},{"data":1,"id":44,"name":"minecraft:stone_slab"},{"data":2,"id":44,"name":"minecraft:stone_slab"},{"data":3,"id":44,"name":"minecraft:stone_slab"},{"data":4,"id":44,"name":"minecraft:stone_slab"},{"data":5,"id":44,"name":"minecraft:stone_slab"},{"data":6,"id":44,"name":"minecraft:stone_slab"},{"data":7,"id":44,"name":"minecraft:stone_slab"},{"data":8,"id":44,"name":"minecraft:stone_slab"},{"data":9,"id":44,"name":"minecraft:stone_slab"},{"data":10,"id":44,"name":"minecraft:stone_slab"},{"data":11,"id":44,"name":"minecraft:stone_slab"},{"data":12,"id":44,"name":"minecraft:stone_slab"},{"data":13,"id":44,"name":"minecraft:stone_slab"},{"data":14,"id":44,"name":"minecraft:stone_slab"},{"data":15,"id":44,"name":"minecraft:stone_slab"},{"data":0,"id":45,"name":"minecraft:brick_block"},{"data":0,"id":46,"name":"minecraft:tnt"},{"data":1,"id":46,"name":"minecraft:tnt"},{"data":2,"id":46,"name":"minecraft:tnt"},{"data":3,"id":46,"name":"minecraft:tnt"},{"data":0,"id":47,"name":"minecraft:bookshelf"},{"data":0,"id":48,"name":"minecraft:mossy_cobblestone"},{"data":0,"id":49,"name":"minecraft:obsidian"},{"data":0,"id":50,"name":"minecraft:torch"},{"data":1,"id":50,"name":"minecraft:torch"},{"data":2,"id":50,"name":"minecraft:torch"},{"data":3,"id":50,"name":"minecraft:torch"},{"data":4,"id":50,"name":"minecraft:torch"},{"data":5,"id":50,"name":"minecraft:torch"},{"data":6,"id":50,"name":"minecraft:torch"},{"data":7,"id":50,"name":"minecraft:torch"},{"data":0,"id":51,"name":"minecraft:fire"},{"data":1,"id":51,"name":"minecraft:fire"},{"data":2,"id":51,"name":"minecraft:fire"},{"data":3,"id":51,"name":"minecraft:fire"},{"data":4,"id":51,"name":"minecraft:fire"},{"data":5,"id":51,"name":"minecraft:fire"},{"data":6,"id":51,"name":"minecraft:fire"},{"data":7,"id":51,"name":"minecraft:fire"},{"data":8,"id":51,"name":"minecraft:fire"},{"data":9,"id":51,"name":"minecraft:fire"},{"data":10,"id":51,"name":"minecraft:fire"},{"data":11,"id":51,"name":"minecraft:fire"},{"data":12,"id":51,"name":"minecraft:fire"},{"data":13,"id":51,"name":"minecraft:fire"},{"data":14,"id":51,"name":"minecraft:fire"},{"data":15,"id":51,"name":"minecraft:fire"},{"data":0,"id":52,"name":"minecraft:mob_spawner"},{"data":0,"id":53,"name":"minecraft:oak_stairs"},{"data":1,"id":53,"name":"minecraft:oak_stairs"},{"data":2,"id":53,"name":"minecraft:oak_stairs"},{"data":3,"id":53,"name":"minecraft:oak_stairs"},{"data":4,"id":53,"name":"minecraft:oak_stairs"},{"data":5,"id":53,"name":"minecraft:oak_stairs"},{"data":6,"id":53,"name":"minecraft:oak_stairs"},{"data":7,"id":53,"name":"minecraft:oak_stairs"},{"data":0,"id":54,"name":"minecraft:chest"},{"data":1,"id":54,"name":"minecraft:chest"},{"data":2,"id":54,"name":"minecraft:chest"},{"data":3,"id":54,"name":"minecraft:chest"},{"data":4,"id":54,"name":"minecraft:chest"},{"data":5,"id":54,"name":"minecraft:chest"},{"data":6,"id":54,"name":"minecraft:chest"},{"data":7,"id":54,"name":"minecraft:chest"},{"data":0,"id":55,"name":"minecraft:redstone_wire"},{"data":1,"id":55,"name":"minecraft:redstone_wire"},{"data":2,"id":55,"name":"minecraft:redstone_wire"},{"data":3,"id":55,"name":"minecraft:redstone_wire"},{"data":4,"id":55,"name":"minecraft:redstone_wire"},{"data":5,"id":55,"name":"minecraft:redstone_wire"},{"data":6,"id":55,"name":"minecraft:redstone_wire"},{"data":7,"id":55,"name":"minecraft:redstone_wire"},{"data":8,"id":55,"name":"minecraft:redstone_wire"},{"data":9,"id":55,"name":"minecraft:redstone_wire"},{"data":10,"id":55,"name":"minecraft:redstone_wire"},{"data":11,"id":55,"name":"minecraft:redstone_wire"},{"data":12,"id":55,"name":"minecraft:redstone_wire"},{"data":13,"id":55,"name":"minecraft:redstone_wire"},{"data":14,"id":55,"name":"minecraft:redstone_wire"},{"data":15,"id":55,"name":"minecraft:redstone_wire"},{"data":0,"id":56,"name":"minecraft:diamond_ore"},{"data":0,"id":57,"name":"minecraft:diamond_block"},{"data":0,"id":58,"name":"minecraft:crafting_table"},{"data":0,"id":59,"name":"minecraft:wheat"},{"data":1,"id":59,"name":"minecraft:wheat"},{"data":2,"id":59,"name":"minecraft:wheat"},{"data":3,"id":59,"name":"minecraft:wheat"},{"data":4,"id":59,"name":"minecraft:wheat"},{"data":5,"id":59,"name":"minecraft:wheat"},{"data":6,"id":59,"name":"minecraft:wheat"},{"data":7,"id":59,"name":"minecraft:wheat"},{"data":0,"id":60,"name":"minecraft:farmland"},{"data":1,"id":60,"name":"minecraft:farmland"},{"data":2,"id":60,"name":"minecraft:farmland"},{"data":3,"id":60,"name":"minecraft:farmland"},{"data":4,"id":60,"name":"minecraft:farmland"},{"data":5,"id":60,"name":"minecraft:farmland"},{"data":6,"id":60,"name":"minecraft:farmland"},{"data":7,"id":60,"name":"minecraft:farmland"},{"data":0,"id":61,"name":"minecraft:furnace"},{"data":1,"id":61,"name":"minecraft:furnace"},{"data":2,"id":61,"name":"minecraft:furnace"},{"data":3,"id":61,"name":"minecraft:furnace"},{"data":4,"id":61,"name":"minecraft:furnace"},{"data":5,"id":61,"name":"minecraft:furnace"},{"data":6,"id":61,"name":"minecraft:furnace"},{"data":7,"id":61,"name":"minecraft:furnace"},{"data":0,"id":62,"name":"minecraft:lit_furnace"},{"data":1,"id":62,"name":"minecraft:lit_furnace"},{"data":2,"id":62,"name":"minecraft:lit_furnace"},{"data":3,"id":62,"name":"minecraft:lit_furnace"},{"data":4,"id":62,"name":"minecraft:lit_furnace"},{"data":5,"id":62,"name":"minecraft:lit_furnace"},{"data":6,"id":62,"name":"minecraft:lit_furnace"},{"data":7,"id":62,"name":"minecraft:lit_furnace"},{"data":0,"id":63,"name":"minecraft:standing_sign"},{"data":1,"id":63,"name":"minecraft:standing_sign"},{"data":2,"id":63,"name":"minecraft:standing_sign"},{"data":3,"id":63,"name":"minecraft:standing_sign"},{"data":4,"id":63,"name":"minecraft:standing_sign"},{"data":5,"id":63,"name":"minecraft:standing_sign"},{"data":6,"id":63,"name":"minecraft:standing_sign"},{"data":7,"id":63,"name":"minecraft:standing_sign"},{"data":8,"id":63,"name":"minecraft:standing_sign"},{"data":9,"id":63,"name":"minecraft:standing_sign"},{"data":10,"id":63,"name":"minecraft:standing_sign"},{"data":11,"id":63,"name":"minecraft:standing_sign"},{"data":12,"id":63,"name":"minecraft:standing_sign"},{"data":13,"id":63,"name":"minecraft:standing_sign"},{"data":14,"id":63,"name":"minecraft:standing_sign"},{"data":15,"id":63,"name":"minecraft:standing_sign"},{"data":0,"id":64,"name":"minecraft:wooden_door"},{"data":1,"id":64,"name":"minecraft:wooden_door"},{"data":2,"id":64,"name":"minecraft:wooden_door"},{"data":3,"id":64,"name":"minecraft:wooden_door"},{"data":4,"id":64,"name":"minecraft:wooden_door"},{"data":5,"id":64,"name":"minecraft:wooden_door"},{"data":6,"id":64,"name":"minecraft:wooden_door"},{"data":7,"id":64,"name":"minecraft:wooden_door"},{"data":8,"id":64,"name":"minecraft:wooden_door"},{"data":9,"id":64,"name":"minecraft:wooden_door"},{"data":10,"id":64,"name":"minecraft:wooden_door"},{"data":11,"id":64,"name":"minecraft:wooden_door"},{"data":12,"id":64,"name":"minecraft:wooden_door"},{"data":13,"id":64,"name":"minecraft:wooden_door"},{"data":14,"id":64,"name":"minecraft:wooden_door"},{"data":15,"id":64,"name":"minecraft:wooden_door"},{"data":0,"id":65,"name":"minecraft:ladder"},{"data":1,"id":65,"name":"minecraft:ladder"},{"data":2,"id":65,"name":"minecraft:ladder"},{"data":3,"id":65,"name":"minecraft:ladder"},{"data":4,"id":65,"name":"minecraft:ladder"},{"data":5,"id":65,"name":"minecraft:ladder"},{"data":6,"id":65,"name":"minecraft:ladder"},{"data":7,"id":65,"name":"minecraft:ladder"},{"data":0,"id":66,"name":"minecraft:rail"},{"data":1,"id":66,"name":"minecraft:rail"},{"data":2,"id":66,"name":"minecraft:rail"},{"data":3,"id":66,"name":"minecraft:rail"},{"data":4,"id":66,"name":"minecraft:rail"},{"data":5,"id":66,"name":"minecraft:rail"},{"data":6,"id":66,"name":"minecraft:rail"},{"data":7,"id":66,"name":"minecraft:rail"},{"data":8,"id":66,"name":"minecraft:rail"},{"data":9,"id":66,"name":"minecraft:rail"},{"data":10,"id":66,"name":"minecraft:rail"},{"data":11,"id":66,"name":"minecraft:rail"},{"data":12,"id":66,"name":"minecraft:rail"},{"data":13,"id":66,"name":"minecraft:rail"},{"data":14,"id":66,"name":"minecraft:rail"},{"data":15,"id":66,"name":"minecraft:rail"},{"data":0,"id":67,"name":"minecraft:stone_stairs"},{"data":1,"id":67,"name":"minecraft:stone_stairs"},{"data":2,"id":67,"name":"minecraft:stone_stairs"},{"data":3,"id":67,"name":"minecraft:stone_stairs"},{"data":4,"id":67,"name":"minecraft:stone_stairs"},{"data":5,"id":67,"name":"minecraft:stone_stairs"},{"data":6,"id":67,"name":"minecraft:stone_stairs"},{"data":7,"id":67,"name":"minecraft:stone_stairs"},{"data":0,"id":68,"name":"minecraft:wall_sign"},{"data":1,"id":68,"name":"minecraft:wall_sign"},{"data":2,"id":68,"name":"minecraft:wall_sign"},{"data":3,"id":68,"name":"minecraft:wall_sign"},{"data":4,"id":68,"name":"minecraft:wall_sign"},{"data":5,"id":68,"name":"minecraft:wall_sign"},{"data":6,"id":68,"name":"minecraft:wall_sign"},{"data":7,"id":68,"name":"minecraft:wall_sign"},{"data":8,"id":68,"name":"minecraft:wall_sign"},{"data":9,"id":68,"name":"minecraft:wall_sign"},{"data":10,"id":68,"name":"minecraft:wall_sign"},{"data":11,"id":68,"name":"minecraft:wall_sign"},{"data":12,"id":68,"name":"minecraft:wall_sign"},{"data":13,"id":68,"name":"minecraft:wall_sign"},{"data":14,"id":68,"name":"minecraft:wall_sign"},{"data":15,"id":68,"name":"minecraft:wall_sign"},{"data":0,"id":69,"name":"minecraft:lever"},{"data":1,"id":69,"name":"minecraft:lever"},{"data":2,"id":69,"name":"minecraft:lever"},{"data":3,"id":69,"name":"minecraft:lever"},{"data":4,"id":69,"name":"minecraft:lever"},{"data":5,"id":69,"name":"minecraft:lever"},{"data":6,"id":69,"name":"minecraft:lever"},{"data":7,"id":69,"name":"minecraft:lever"},{"data":8,"id":69,"name":"minecraft:lever"},{"data":9,"id":69,"name":"minecraft:lever"},{"data":10,"id":69,"name":"minecraft:lever"},{"data":11,"id":69,"name":"minecraft:lever"},{"data":12,"id":69,"name":"minecraft:lever"},{"data":13,"id":69,"name":"minecraft:lever"},{"data":14,"id":69,"name":"minecraft:lever"},{"data":15,"id":69,"name":"minecraft:lever"},{"data":0,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":1,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":2,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":3,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":4,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":5,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":6,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":7,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":8,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":9,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":10,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":11,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":12,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":13,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":14,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":15,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":0,"id":71,"name":"minecraft:iron_door"},{"data":1,"id":71,"name":"minecraft:iron_door"},{"data":2,"id":71,"name":"minecraft:iron_door"},{"data":3,"id":71,"name":"minecraft:iron_door"},{"data":4,"id":71,"name":"minecraft:iron_door"},{"data":5,"id":71,"name":"minecraft:iron_door"},{"data":6,"id":71,"name":"minecraft:iron_door"},{"data":7,"id":71,"name":"minecraft:iron_door"},{"data":8,"id":71,"name":"minecraft:iron_door"},{"data":9,"id":71,"name":"minecraft:iron_door"},{"data":10,"id":71,"name":"minecraft:iron_door"},{"data":11,"id":71,"name":"minecraft:iron_door"},{"data":12,"id":71,"name":"minecraft:iron_door"},{"data":13,"id":71,"name":"minecraft:iron_door"},{"data":14,"id":71,"name":"minecraft:iron_door"},{"data":15,"id":71,"name":"minecraft:iron_door"},{"data":0,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":1,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":2,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":3,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":4,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":5,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":6,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":7,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":8,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":9,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":10,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":11,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":12,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":13,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":14,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":15,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":0,"id":73,"name":"minecraft:redstone_ore"},{"data":0,"id":74,"name":"minecraft:lit_redstone_ore"},{"data":0,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":1,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":2,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":3,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":4,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":5,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":6,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":7,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":0,"id":76,"name":"minecraft:redstone_torch"},{"data":1,"id":76,"name":"minecraft:redstone_torch"},{"data":2,"id":76,"name":"minecraft:redstone_torch"},{"data":3,"id":76,"name":"minecraft:redstone_torch"},{"data":4,"id":76,"name":"minecraft:redstone_torch"},{"data":5,"id":76,"name":"minecraft:redstone_torch"},{"data":6,"id":76,"name":"minecraft:redstone_torch"},{"data":7,"id":76,"name":"minecraft:redstone_torch"},{"data":0,"id":77,"name":"minecraft:stone_button"},{"data":1,"id":77,"name":"minecraft:stone_button"},{"data":2,"id":77,"name":"minecraft:stone_button"},{"data":3,"id":77,"name":"minecraft:stone_button"},{"data":4,"id":77,"name":"minecraft:stone_button"},{"data":5,"id":77,"name":"minecraft:stone_button"},{"data":6,"id":77,"name":"minecraft:stone_button"},{"data":7,"id":77,"name":"minecraft:stone_button"},{"data":8,"id":77,"name":"minecraft:stone_button"},{"data":9,"id":77,"name":"minecraft:stone_button"},{"data":10,"id":77,"name":"minecraft:stone_button"},{"data":11,"id":77,"name":"minecraft:stone_button"},{"data":12,"id":77,"name":"minecraft:stone_button"},{"data":13,"id":77,"name":"minecraft:stone_button"},{"data":14,"id":77,"name":"minecraft:stone_button"},{"data":15,"id":77,"name":"minecraft:stone_button"},{"data":0,"id":78,"name":"minecraft:snow_layer"},{"data":1,"id":78,"name":"minecraft:snow_layer"},{"data":2,"id":78,"name":"minecraft:snow_layer"},{"data":3,"id":78,"name":"minecraft:snow_layer"},{"data":4,"id":78,"name":"minecraft:snow_layer"},{"data":5,"id":78,"name":"minecraft:snow_layer"},{"data":6,"id":78,"name":"minecraft:snow_layer"},{"data":7,"id":78,"name":"minecraft:snow_layer"},{"data":8,"id":78,"name":"minecraft:snow_layer"},{"data":9,"id":78,"name":"minecraft:snow_layer"},{"data":10,"id":78,"name":"minecraft:snow_layer"},{"data":11,"id":78,"name":"minecraft:snow_layer"},{"data":12,"id":78,"name":"minecraft:snow_layer"},{"data":13,"id":78,"name":"minecraft:snow_layer"},{"data":14,"id":78,"name":"minecraft:snow_layer"},{"data":15,"id":78,"name":"minecraft:snow_layer"},{"data":0,"id":79,"name":"minecraft:ice"},{"data":0,"id":80,"name":"minecraft:snow"},{"data":0,"id":81,"name":"minecraft:cactus"},{"data":1,"id":81,"name":"minecraft:cactus"},{"data":2,"id":81,"name":"minecraft:cactus"},{"data":3,"id":81,"name":"minecraft:cactus"},{"data":4,"id":81,"name":"minecraft:cactus"},{"data":5,"id":81,"name":"minecraft:cactus"},{"data":6,"id":81,"name":"minecraft:cactus"},{"data":7,"id":81,"name":"minecraft:cactus"},{"data":8,"id":81,"name":"minecraft:cactus"},{"data":9,"id":81,"name":"minecraft:cactus"},{"data":10,"id":81,"name":"minecraft:cactus"},{"data":11,"id":81,"name":"minecraft:cactus"},{"data":12,"id":81,"name":"minecraft:cactus"},{"data":13,"id":81,"name":"minecraft:cactus"},{"data":14,"id":81,"name":"minecraft:cactus"},{"data":15,"id":81,"name":"minecraft:cactus"},{"data":0,"id":82,"name":"minecraft:clay"},{"data":0,"id":83,"name":"minecraft:reeds"},{"data":1,"id":83,"name":"minecraft:reeds"},{"data":2,"id":83,"name":"minecraft:reeds"},{"data":3,"id":83,"name":"minecraft:reeds"},{"data":4,"id":83,"name":"minecraft:reeds"},{"data":5,"id":83,"name":"minecraft:reeds"},{"data":6,"id":83,"name":"minecraft:reeds"},{"data":7,"id":83,"name":"minecraft:reeds"},{"data":8,"id":83,"name":"minecraft:reeds"},{"data":9,"id":83,"name":"minecraft:reeds"},{"data":10,"id":83,"name":"minecraft:reeds"},{"data":11,"id":83,"name":"minecraft:reeds"},{"data":12,"id":83,"name":"minecraft:reeds"},{"data":13,"id":83,"name":"minecraft:reeds"},{"data":14,"id":83,"name":"minecraft:reeds"},{"data":15,"id":83,"name":"minecraft:reeds"},{"data":0,"id":84,"name":"minecraft:jukebox"},{"data":0,"id":85,"name":"minecraft:fence"},{"data":1,"id":85,"name":"minecraft:fence"},{"data":2,"id":85,"name":"minecraft:fence"},{"data":3,"id":85,"name":"minecraft:fence"},{"data":4,"id":85,"name":"minecraft:fence"},{"data":5,"id":85,"name":"minecraft:fence"},{"data":6,"id":85,"name":"minecraft:fence"},{"data":7,"id":85,"name":"minecraft:fence"},{"data":0,"id":86,"name":"minecraft:pumpkin"},{"data":1,"id":86,"name":"minecraft:pumpkin"},{"data":2,"id":86,"name":"minecraft:pumpkin"},{"data":3,"id":86,"name":"minecraft:pumpkin"},{"data":0,"id":87,"name":"minecraft:netherrack"},{"data":0,"id":88,"name":"minecraft:soul_sand"},{"data":0,"id":89,"name":"minecraft:glowstone"},{"data":0,"id":90,"name":"minecraft:portal"},{"data":1,"id":90,"name":"minecraft:portal"},{"data":2,"id":90,"name":"minecraft:portal"},{"data":3,"id":90,"name":"minecraft:portal"},{"data":0,"id":91,"name":"minecraft:lit_pumpkin"},{"data":1,"id":91,"name":"minecraft:lit_pumpkin"},{"data":2,"id":91,"name":"minecraft:lit_pumpkin"},{"data":3,"id":91,"name":"minecraft:lit_pumpkin"},{"data":0,"id":92,"name":"minecraft:cake"},{"data":1,"id":92,"name":"minecraft:cake"},{"data":2,"id":92,"name":"minecraft:cake"},{"data":3,"id":92,"name":"minecraft:cake"},{"data":4,"id":92,"name":"minecraft:cake"},{"data":5,"id":92,"name":"minecraft:cake"},{"data":6,"id":92,"name":"minecraft:cake"},{"data":7,"id":92,"name":"minecraft:cake"},{"data":0,"id":93,"name":"minecraft:unpowered_repeater"},{"data":1,"id":93,"name":"minecraft:unpowered_repeater"},{"data":2,"id":93,"name":"minecraft:unpowered_repeater"},{"data":3,"id":93,"name":"minecraft:unpowered_repeater"},{"data":4,"id":93,"name":"minecraft:unpowered_repeater"},{"data":5,"id":93,"name":"minecraft:unpowered_repeater"},{"data":6,"id":93,"name":"minecraft:unpowered_repeater"},{"data":7,"id":93,"name":"minecraft:unpowered_repeater"},{"data":8,"id":93,"name":"minecraft:unpowered_repeater"},{"data":9,"id":93,"name":"minecraft:unpowered_repeater"},{"data":10,"id":93,"name":"minecraft:unpowered_repeater"},{"data":11,"id":93,"name":"minecraft:unpowered_repeater"},{"data":12,"id":93,"name":"minecraft:unpowered_repeater"},{"data":13,"id":93,"name":"minecraft:unpowered_repeater"},{"data":14,"id":93,"name":"minecraft:unpowered_repeater"},{"data":15,"id":93,"name":"minecraft:unpowered_repeater"},{"data":0,"id":94,"name":"minecraft:powered_repeater"},{"data":1,"id":94,"name":"minecraft:powered_repeater"},{"data":2,"id":94,"name":"minecraft:powered_repeater"},{"data":3,"id":94,"name":"minecraft:powered_repeater"},{"data":4,"id":94,"name":"minecraft:powered_repeater"},{"data":5,"id":94,"name":"minecraft:powered_repeater"},{"data":6,"id":94,"name":"minecraft:powered_repeater"},{"data":7,"id":94,"name":"minecraft:powered_repeater"},{"data":8,"id":94,"name":"minecraft:powered_repeater"},{"data":9,"id":94,"name":"minecraft:powered_repeater"},{"data":10,"id":94,"name":"minecraft:powered_repeater"},{"data":11,"id":94,"name":"minecraft:powered_repeater"},{"data":12,"id":94,"name":"minecraft:powered_repeater"},{"data":13,"id":94,"name":"minecraft:powered_repeater"},{"data":14,"id":94,"name":"minecraft:powered_repeater"},{"data":15,"id":94,"name":"minecraft:powered_repeater"},{"data":0,"id":95,"name":"minecraft:invisibleBedrock"},{"data":0,"id":96,"name":"minecraft:trapdoor"},{"data":1,"id":96,"name":"minecraft:trapdoor"},{"data":2,"id":96,"name":"minecraft:trapdoor"},{"data":3,"id":96,"name":"minecraft:trapdoor"},{"data":4,"id":96,"name":"minecraft:trapdoor"},{"data":5,"id":96,"name":"minecraft:trapdoor"},{"data":6,"id":96,"name":"minecraft:trapdoor"},{"data":7,"id":96,"name":"minecraft:trapdoor"},{"data":8,"id":96,"name":"minecraft:trapdoor"},{"data":9,"id":96,"name":"minecraft:trapdoor"},{"data":10,"id":96,"name":"minecraft:trapdoor"},{"data":11,"id":96,"name":"minecraft:trapdoor"},{"data":12,"id":96,"name":"minecraft:trapdoor"},{"data":13,"id":96,"name":"minecraft:trapdoor"},{"data":14,"id":96,"name":"minecraft:trapdoor"},{"data":15,"id":96,"name":"minecraft:trapdoor"},{"data":0,"id":97,"name":"minecraft:monster_egg"},{"data":1,"id":97,"name":"minecraft:monster_egg"},{"data":2,"id":97,"name":"minecraft:monster_egg"},{"data":3,"id":97,"name":"minecraft:monster_egg"},{"data":4,"id":97,"name":"minecraft:monster_egg"},{"data":5,"id":97,"name":"minecraft:monster_egg"},{"data":6,"id":97,"name":"minecraft:monster_egg"},{"data":7,"id":97,"name":"minecraft:monster_egg"},{"data":0,"id":98,"name":"minecraft:stonebrick"},{"data":1,"id":98,"name":"minecraft:stonebrick"},{"data":2,"id":98,"name":"minecraft:stonebrick"},{"data":3,"id":98,"name":"minecraft:stonebrick"},{"data":4,"id":98,"name":"minecraft:stonebrick"},{"data":5,"id":98,"name":"minecraft:stonebrick"},{"data":6,"id":98,"name":"minecraft:stonebrick"},{"data":7,"id":98,"name":"minecraft:stonebrick"},{"data":0,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":1,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":2,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":3,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":4,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":5,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":6,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":7,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":8,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":9,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":10,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":11,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":12,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":13,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":14,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":15,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":0,"id":100,"name":"minecraft:red_mushroom_block"},{"data":1,"id":100,"name":"minecraft:red_mushroom_block"},{"data":2,"id":100,"name":"minecraft:red_mushroom_block"},{"data":3,"id":100,"name":"minecraft:red_mushroom_block"},{"data":4,"id":100,"name":"minecraft:red_mushroom_block"},{"data":5,"id":100,"name":"minecraft:red_mushroom_block"},{"data":6,"id":100,"name":"minecraft:red_mushroom_block"},{"data":7,"id":100,"name":"minecraft:red_mushroom_block"},{"data":8,"id":100,"name":"minecraft:red_mushroom_block"},{"data":9,"id":100,"name":"minecraft:red_mushroom_block"},{"data":10,"id":100,"name":"minecraft:red_mushroom_block"},{"data":11,"id":100,"name":"minecraft:red_mushroom_block"},{"data":12,"id":100,"name":"minecraft:red_mushroom_block"},{"data":13,"id":100,"name":"minecraft:red_mushroom_block"},{"data":14,"id":100,"name":"minecraft:red_mushroom_block"},{"data":15,"id":100,"name":"minecraft:red_mushroom_block"},{"data":0,"id":101,"name":"minecraft:iron_bars"},{"data":0,"id":102,"name":"minecraft:glass_pane"},{"data":0,"id":103,"name":"minecraft:melon_block"},{"data":0,"id":104,"name":"minecraft:pumpkin_stem"},{"data":1,"id":104,"name":"minecraft:pumpkin_stem"},{"data":2,"id":104,"name":"minecraft:pumpkin_stem"},{"data":3,"id":104,"name":"minecraft:pumpkin_stem"},{"data":4,"id":104,"name":"minecraft:pumpkin_stem"},{"data":5,"id":104,"name":"minecraft:pumpkin_stem"},{"data":6,"id":104,"name":"minecraft:pumpkin_stem"},{"data":7,"id":104,"name":"minecraft:pumpkin_stem"},{"data":0,"id":105,"name":"minecraft:melon_stem"},{"data":1,"id":105,"name":"minecraft:melon_stem"},{"data":2,"id":105,"name":"minecraft:melon_stem"},{"data":3,"id":105,"name":"minecraft:melon_stem"},{"data":4,"id":105,"name":"minecraft:melon_stem"},{"data":5,"id":105,"name":"minecraft:melon_stem"},{"data":6,"id":105,"name":"minecraft:melon_stem"},{"data":7,"id":105,"name":"minecraft:melon_stem"},{"data":0,"id":106,"name":"minecraft:vine"},{"data":1,"id":106,"name":"minecraft:vine"},{"data":2,"id":106,"name":"minecraft:vine"},{"data":3,"id":106,"name":"minecraft:vine"},{"data":4,"id":106,"name":"minecraft:vine"},{"data":5,"id":106,"name":"minecraft:vine"},{"data":6,"id":106,"name":"minecraft:vine"},{"data":7,"id":106,"name":"minecraft:vine"},{"data":8,"id":106,"name":"minecraft:vine"},{"data":9,"id":106,"name":"minecraft:vine"},{"data":10,"id":106,"name":"minecraft:vine"},{"data":11,"id":106,"name":"minecraft:vine"},{"data":12,"id":106,"name":"minecraft:vine"},{"data":13,"id":106,"name":"minecraft:vine"},{"data":14,"id":106,"name":"minecraft:vine"},{"data":15,"id":106,"name":"minecraft:vine"},{"data":0,"id":107,"name":"minecraft:fence_gate"},{"data":1,"id":107,"name":"minecraft:fence_gate"},{"data":2,"id":107,"name":"minecraft:fence_gate"},{"data":3,"id":107,"name":"minecraft:fence_gate"},{"data":4,"id":107,"name":"minecraft:fence_gate"},{"data":5,"id":107,"name":"minecraft:fence_gate"},{"data":6,"id":107,"name":"minecraft:fence_gate"},{"data":7,"id":107,"name":"minecraft:fence_gate"},{"data":8,"id":107,"name":"minecraft:fence_gate"},{"data":9,"id":107,"name":"minecraft:fence_gate"},{"data":10,"id":107,"name":"minecraft:fence_gate"},{"data":11,"id":107,"name":"minecraft:fence_gate"},{"data":12,"id":107,"name":"minecraft:fence_gate"},{"data":13,"id":107,"name":"minecraft:fence_gate"},{"data":14,"id":107,"name":"minecraft:fence_gate"},{"data":15,"id":107,"name":"minecraft:fence_gate"},{"data":0,"id":108,"name":"minecraft:brick_stairs"},{"data":1,"id":108,"name":"minecraft:brick_stairs"},{"data":2,"id":108,"name":"minecraft:brick_stairs"},{"data":3,"id":108,"name":"minecraft:brick_stairs"},{"data":4,"id":108,"name":"minecraft:brick_stairs"},{"data":5,"id":108,"name":"minecraft:brick_stairs"},{"data":6,"id":108,"name":"minecraft:brick_stairs"},{"data":7,"id":108,"name":"minecraft:brick_stairs"},{"data":0,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":1,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":2,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":3,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":4,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":5,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":6,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":7,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":0,"id":110,"name":"minecraft:mycelium"},{"data":0,"id":111,"name":"minecraft:waterlily"},{"data":0,"id":112,"name":"minecraft:nether_brick"},{"data":0,"id":113,"name":"minecraft:nether_brick_fence"},{"data":1,"id":113,"name":"minecraft:nether_brick_fence"},{"data":2,"id":113,"name":"minecraft:nether_brick_fence"},{"data":3,"id":113,"name":"minecraft:nether_brick_fence"},{"data":4,"id":113,"name":"minecraft:nether_brick_fence"},{"data":5,"id":113,"name":"minecraft:nether_brick_fence"},{"data":6,"id":113,"name":"minecraft:nether_brick_fence"},{"data":7,"id":113,"name":"minecraft:nether_brick_fence"},{"data":0,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":1,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":2,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":3,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":4,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":5,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":6,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":7,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":0,"id":115,"name":"minecraft:nether_wart"},{"data":1,"id":115,"name":"minecraft:nether_wart"},{"data":2,"id":115,"name":"minecraft:nether_wart"},{"data":3,"id":115,"name":"minecraft:nether_wart"},{"data":0,"id":116,"name":"minecraft:enchanting_table"},{"data":0,"id":117,"name":"minecraft:brewing_stand"},{"data":1,"id":117,"name":"minecraft:brewing_stand"},{"data":2,"id":117,"name":"minecraft:brewing_stand"},{"data":3,"id":117,"name":"minecraft:brewing_stand"},{"data":4,"id":117,"name":"minecraft:brewing_stand"},{"data":5,"id":117,"name":"minecraft:brewing_stand"},{"data":6,"id":117,"name":"minecraft:brewing_stand"},{"data":7,"id":117,"name":"minecraft:brewing_stand"},{"data":0,"id":118,"name":"minecraft:cauldron"},{"data":1,"id":118,"name":"minecraft:cauldron"},{"data":2,"id":118,"name":"minecraft:cauldron"},{"data":3,"id":118,"name":"minecraft:cauldron"},{"data":4,"id":118,"name":"minecraft:cauldron"},{"data":5,"id":118,"name":"minecraft:cauldron"},{"data":6,"id":118,"name":"minecraft:cauldron"},{"data":7,"id":118,"name":"minecraft:cauldron"},{"data":0,"id":119,"name":"minecraft:end_portal"},{"data":0,"id":120,"name":"minecraft:end_portal_frame"},{"data":1,"id":120,"name":"minecraft:end_portal_frame"},{"data":2,"id":120,"name":"minecraft:end_portal_frame"},{"data":3,"id":120,"name":"minecraft:end_portal_frame"},{"data":4,"id":120,"name":"minecraft:end_portal_frame"},{"data":5,"id":120,"name":"minecraft:end_portal_frame"},{"data":6,"id":120,"name":"minecraft:end_portal_frame"},{"data":7,"id":120,"name":"minecraft:end_portal_frame"},{"data":0,"id":121,"name":"minecraft:end_stone"},{"data":0,"id":122,"name":"minecraft:dragon_egg"},{"data":0,"id":123,"name":"minecraft:redstone_lamp"},{"data":0,"id":124,"name":"minecraft:lit_redstone_lamp"},{"data":0,"id":125,"name":"minecraft:dropper"},{"data":1,"id":125,"name":"minecraft:dropper"},{"data":2,"id":125,"name":"minecraft:dropper"},{"data":3,"id":125,"name":"minecraft:dropper"},{"data":4,"id":125,"name":"minecraft:dropper"},{"data":5,"id":125,"name":"minecraft:dropper"},{"data":6,"id":125,"name":"minecraft:dropper"},{"data":7,"id":125,"name":"minecraft:dropper"},{"data":8,"id":125,"name":"minecraft:dropper"},{"data":9,"id":125,"name":"minecraft:dropper"},{"data":10,"id":125,"name":"minecraft:dropper"},{"data":11,"id":125,"name":"minecraft:dropper"},{"data":12,"id":125,"name":"minecraft:dropper"},{"data":13,"id":125,"name":"minecraft:dropper"},{"data":14,"id":125,"name":"minecraft:dropper"},{"data":15,"id":125,"name":"minecraft:dropper"},{"data":0,"id":126,"name":"minecraft:activator_rail"},{"data":1,"id":126,"name":"minecraft:activator_rail"},{"data":2,"id":126,"name":"minecraft:activator_rail"},{"data":3,"id":126,"name":"minecraft:activator_rail"},{"data":4,"id":126,"name":"minecraft:activator_rail"},{"data":5,"id":126,"name":"minecraft:activator_rail"},{"data":6,"id":126,"name":"minecraft:activator_rail"},{"data":7,"id":126,"name":"minecraft:activator_rail"},{"data":8,"id":126,"name":"minecraft:activator_rail"},{"data":9,"id":126,"name":"minecraft:activator_rail"},{"data":10,"id":126,"name":"minecraft:activator_rail"},{"data":11,"id":126,"name":"minecraft:activator_rail"},{"data":12,"id":126,"name":"minecraft:activator_rail"},{"data":13,"id":126,"name":"minecraft:activator_rail"},{"data":14,"id":126,"name":"minecraft:activator_rail"},{"data":15,"id":126,"name":"minecraft:activator_rail"},{"data":0,"id":127,"name":"minecraft:cocoa"},{"data":1,"id":127,"name":"minecraft:cocoa"},{"data":2,"id":127,"name":"minecraft:cocoa"},{"data":3,"id":127,"name":"minecraft:cocoa"},{"data":4,"id":127,"name":"minecraft:cocoa"},{"data":5,"id":127,"name":"minecraft:cocoa"},{"data":6,"id":127,"name":"minecraft:cocoa"},{"data":7,"id":127,"name":"minecraft:cocoa"},{"data":8,"id":127,"name":"minecraft:cocoa"},{"data":9,"id":127,"name":"minecraft:cocoa"},{"data":10,"id":127,"name":"minecraft:cocoa"},{"data":11,"id":127,"name":"minecraft:cocoa"},{"data":12,"id":127,"name":"minecraft:cocoa"},{"data":13,"id":127,"name":"minecraft:cocoa"},{"data":14,"id":127,"name":"minecraft:cocoa"},{"data":15,"id":127,"name":"minecraft:cocoa"},{"data":0,"id":128,"name":"minecraft:sandstone_stairs"},{"data":1,"id":128,"name":"minecraft:sandstone_stairs"},{"data":2,"id":128,"name":"minecraft:sandstone_stairs"},{"data":3,"id":128,"name":"minecraft:sandstone_stairs"},{"data":4,"id":128,"name":"minecraft:sandstone_stairs"},{"data":5,"id":128,"name":"minecraft:sandstone_stairs"},{"data":6,"id":128,"name":"minecraft:sandstone_stairs"},{"data":7,"id":128,"name":"minecraft:sandstone_stairs"},{"data":0,"id":129,"name":"minecraft:emerald_ore"},{"data":0,"id":130,"name":"minecraft:ender_chest"},{"data":1,"id":130,"name":"minecraft:ender_chest"},{"data":2,"id":130,"name":"minecraft:ender_chest"},{"data":3,"id":130,"name":"minecraft:ender_chest"},{"data":4,"id":130,"name":"minecraft:ender_chest"},{"data":5,"id":130,"name":"minecraft:ender_chest"},{"data":6,"id":130,"name":"minecraft:ender_chest"},{"data":7,"id":130,"name":"minecraft:ender_chest"},{"data":0,"id":131,"name":"minecraft:tripwire_hook"},{"data":1,"id":131,"name":"minecraft:tripwire_hook"},{"data":2,"id":131,"name":"minecraft:tripwire_hook"},{"data":3,"id":131,"name":"minecraft:tripwire_hook"},{"data":4,"id":131,"name":"minecraft:tripwire_hook"},{"data":5,"id":131,"name":"minecraft:tripwire_hook"},{"data":6,"id":131,"name":"minecraft:tripwire_hook"},{"data":7,"id":131,"name":"minecraft:tripwire_hook"},{"data":8,"id":131,"name":"minecraft:tripwire_hook"},{"data":9,"id":131,"name":"minecraft:tripwire_hook"},{"data":10,"id":131,"name":"minecraft:tripwire_hook"},{"data":11,"id":131,"name":"minecraft:tripwire_hook"},{"data":12,"id":131,"name":"minecraft:tripwire_hook"},{"data":13,"id":131,"name":"minecraft:tripwire_hook"},{"data":14,"id":131,"name":"minecraft:tripwire_hook"},{"data":15,"id":131,"name":"minecraft:tripwire_hook"},{"data":0,"id":132,"name":"minecraft:tripWire"},{"data":1,"id":132,"name":"minecraft:tripWire"},{"data":2,"id":132,"name":"minecraft:tripWire"},{"data":3,"id":132,"name":"minecraft:tripWire"},{"data":4,"id":132,"name":"minecraft:tripWire"},{"data":5,"id":132,"name":"minecraft:tripWire"},{"data":6,"id":132,"name":"minecraft:tripWire"},{"data":7,"id":132,"name":"minecraft:tripWire"},{"data":8,"id":132,"name":"minecraft:tripWire"},{"data":9,"id":132,"name":"minecraft:tripWire"},{"data":10,"id":132,"name":"minecraft:tripWire"},{"data":11,"id":132,"name":"minecraft:tripWire"},{"data":12,"id":132,"name":"minecraft:tripWire"},{"data":13,"id":132,"name":"minecraft:tripWire"},{"data":14,"id":132,"name":"minecraft:tripWire"},{"data":15,"id":132,"name":"minecraft:tripWire"},{"data":0,"id":133,"name":"minecraft:emerald_block"},{"data":0,"id":134,"name":"minecraft:spruce_stairs"},{"data":1,"id":134,"name":"minecraft:spruce_stairs"},{"data":2,"id":134,"name":"minecraft:spruce_stairs"},{"data":3,"id":134,"name":"minecraft:spruce_stairs"},{"data":4,"id":134,"name":"minecraft:spruce_stairs"},{"data":5,"id":134,"name":"minecraft:spruce_stairs"},{"data":6,"id":134,"name":"minecraft:spruce_stairs"},{"data":7,"id":134,"name":"minecraft:spruce_stairs"},{"data":0,"id":135,"name":"minecraft:birch_stairs"},{"data":1,"id":135,"name":"minecraft:birch_stairs"},{"data":2,"id":135,"name":"minecraft:birch_stairs"},{"data":3,"id":135,"name":"minecraft:birch_stairs"},{"data":4,"id":135,"name":"minecraft:birch_stairs"},{"data":5,"id":135,"name":"minecraft:birch_stairs"},{"data":6,"id":135,"name":"minecraft:birch_stairs"},{"data":7,"id":135,"name":"minecraft:birch_stairs"},{"data":0,"id":136,"name":"minecraft:jungle_stairs"},{"data":1,"id":136,"name":"minecraft:jungle_stairs"},{"data":2,"id":136,"name":"minecraft:jungle_stairs"},{"data":3,"id":136,"name":"minecraft:jungle_stairs"},{"data":4,"id":136,"name":"minecraft:jungle_stairs"},{"data":5,"id":136,"name":"minecraft:jungle_stairs"},{"data":6,"id":136,"name":"minecraft:jungle_stairs"},{"data":7,"id":136,"name":"minecraft:jungle_stairs"},{"data":0,"id":137,"name":"minecraft:command_block"},{"data":1,"id":137,"name":"minecraft:command_block"},{"data":2,"id":137,"name":"minecraft:command_block"},{"data":3,"id":137,"name":"minecraft:command_block"},{"data":4,"id":137,"name":"minecraft:command_block"},{"data":5,"id":137,"name":"minecraft:command_block"},{"data":6,"id":137,"name":"minecraft:command_block"},{"data":7,"id":137,"name":"minecraft:command_block"},{"data":8,"id":137,"name":"minecraft:command_block"},{"data":9,"id":137,"name":"minecraft:command_block"},{"data":10,"id":137,"name":"minecraft:command_block"},{"data":11,"id":137,"name":"minecraft:command_block"},{"data":12,"id":137,"name":"minecraft:command_block"},{"data":13,"id":137,"name":"minecraft:command_block"},{"data":14,"id":137,"name":"minecraft:command_block"},{"data":15,"id":137,"name":"minecraft:command_block"},{"data":0,"id":138,"name":"minecraft:beacon"},{"data":0,"id":139,"name":"minecraft:cobblestone_wall"},{"data":1,"id":139,"name":"minecraft:cobblestone_wall"},{"data":0,"id":140,"name":"minecraft:flower_pot"},{"data":1,"id":140,"name":"minecraft:flower_pot"},{"data":0,"id":141,"name":"minecraft:carrots"},{"data":1,"id":141,"name":"minecraft:carrots"},{"data":2,"id":141,"name":"minecraft:carrots"},{"data":3,"id":141,"name":"minecraft:carrots"},{"data":4,"id":141,"name":"minecraft:carrots"},{"data":5,"id":141,"name":"minecraft:carrots"},{"data":6,"id":141,"name":"minecraft:carrots"},{"data":7,"id":141,"name":"minecraft:carrots"},{"data":0,"id":142,"name":"minecraft:potatoes"},{"data":1,"id":142,"name":"minecraft:potatoes"},{"data":2,"id":142,"name":"minecraft:potatoes"},{"data":3,"id":142,"name":"minecraft:potatoes"},{"data":4,"id":142,"name":"minecraft:potatoes"},{"data":5,"id":142,"name":"minecraft:potatoes"},{"data":6,"id":142,"name":"minecraft:potatoes"},{"data":7,"id":142,"name":"minecraft:potatoes"},{"data":0,"id":143,"name":"minecraft:wooden_button"},{"data":1,"id":143,"name":"minecraft:wooden_button"},{"data":2,"id":143,"name":"minecraft:wooden_button"},{"data":3,"id":143,"name":"minecraft:wooden_button"},{"data":4,"id":143,"name":"minecraft:wooden_button"},{"data":5,"id":143,"name":"minecraft:wooden_button"},{"data":6,"id":143,"name":"minecraft:wooden_button"},{"data":7,"id":143,"name":"minecraft:wooden_button"},{"data":8,"id":143,"name":"minecraft:wooden_button"},{"data":9,"id":143,"name":"minecraft:wooden_button"},{"data":10,"id":143,"name":"minecraft:wooden_button"},{"data":11,"id":143,"name":"minecraft:wooden_button"},{"data":12,"id":143,"name":"minecraft:wooden_button"},{"data":13,"id":143,"name":"minecraft:wooden_button"},{"data":14,"id":143,"name":"minecraft:wooden_button"},{"data":15,"id":143,"name":"minecraft:wooden_button"},{"data":0,"id":144,"name":"minecraft:skull"},{"data":1,"id":144,"name":"minecraft:skull"},{"data":2,"id":144,"name":"minecraft:skull"},{"data":3,"id":144,"name":"minecraft:skull"},{"data":4,"id":144,"name":"minecraft:skull"},{"data":5,"id":144,"name":"minecraft:skull"},{"data":6,"id":144,"name":"minecraft:skull"},{"data":7,"id":144,"name":"minecraft:skull"},{"data":8,"id":144,"name":"minecraft:skull"},{"data":9,"id":144,"name":"minecraft:skull"},{"data":10,"id":144,"name":"minecraft:skull"},{"data":11,"id":144,"name":"minecraft:skull"},{"data":12,"id":144,"name":"minecraft:skull"},{"data":13,"id":144,"name":"minecraft:skull"},{"data":14,"id":144,"name":"minecraft:skull"},{"data":15,"id":144,"name":"minecraft:skull"},{"data":0,"id":145,"name":"minecraft:anvil"},{"data":1,"id":145,"name":"minecraft:anvil"},{"data":2,"id":145,"name":"minecraft:anvil"},{"data":3,"id":145,"name":"minecraft:anvil"},{"data":4,"id":145,"name":"minecraft:anvil"},{"data":5,"id":145,"name":"minecraft:anvil"},{"data":6,"id":145,"name":"minecraft:anvil"},{"data":7,"id":145,"name":"minecraft:anvil"},{"data":8,"id":145,"name":"minecraft:anvil"},{"data":9,"id":145,"name":"minecraft:anvil"},{"data":10,"id":145,"name":"minecraft:anvil"},{"data":11,"id":145,"name":"minecraft:anvil"},{"data":12,"id":145,"name":"minecraft:anvil"},{"data":13,"id":145,"name":"minecraft:anvil"},{"data":14,"id":145,"name":"minecraft:anvil"},{"data":15,"id":145,"name":"minecraft:anvil"},{"data":0,"id":146,"name":"minecraft:trapped_chest"},{"data":1,"id":146,"name":"minecraft:trapped_chest"},{"data":2,"id":146,"name":"minecraft:trapped_chest"},{"data":3,"id":146,"name":"minecraft:trapped_chest"},{"data":4,"id":146,"name":"minecraft:trapped_chest"},{"data":5,"id":146,"name":"minecraft:trapped_chest"},{"data":6,"id":146,"name":"minecraft:trapped_chest"},{"data":7,"id":146,"name":"minecraft:trapped_chest"},{"data":0,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":1,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":2,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":3,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":4,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":5,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":6,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":7,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":8,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":9,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":10,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":11,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":12,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":13,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":14,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":15,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":0,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":1,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":2,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":3,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":4,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":5,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":6,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":7,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":8,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":9,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":10,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":11,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":12,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":13,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":14,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":15,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":0,"id":149,"name":"minecraft:unpowered_comparator"},{"data":1,"id":149,"name":"minecraft:unpowered_comparator"},{"data":2,"id":149,"name":"minecraft:unpowered_comparator"},{"data":3,"id":149,"name":"minecraft:unpowered_comparator"},{"data":4,"id":149,"name":"minecraft:unpowered_comparator"},{"data":5,"id":149,"name":"minecraft:unpowered_comparator"},{"data":6,"id":149,"name":"minecraft:unpowered_comparator"},{"data":7,"id":149,"name":"minecraft:unpowered_comparator"},{"data":8,"id":149,"name":"minecraft:unpowered_comparator"},{"data":9,"id":149,"name":"minecraft:unpowered_comparator"},{"data":10,"id":149,"name":"minecraft:unpowered_comparator"},{"data":11,"id":149,"name":"minecraft:unpowered_comparator"},{"data":12,"id":149,"name":"minecraft:unpowered_comparator"},{"data":13,"id":149,"name":"minecraft:unpowered_comparator"},{"data":14,"id":149,"name":"minecraft:unpowered_comparator"},{"data":15,"id":149,"name":"minecraft:unpowered_comparator"},{"data":0,"id":150,"name":"minecraft:powered_comparator"},{"data":1,"id":150,"name":"minecraft:powered_comparator"},{"data":2,"id":150,"name":"minecraft:powered_comparator"},{"data":3,"id":150,"name":"minecraft:powered_comparator"},{"data":4,"id":150,"name":"minecraft:powered_comparator"},{"data":5,"id":150,"name":"minecraft:powered_comparator"},{"data":6,"id":150,"name":"minecraft:powered_comparator"},{"data":7,"id":150,"name":"minecraft:powered_comparator"},{"data":8,"id":150,"name":"minecraft:powered_comparator"},{"data":9,"id":150,"name":"minecraft:powered_comparator"},{"data":10,"id":150,"name":"minecraft:powered_comparator"},{"data":11,"id":150,"name":"minecraft:powered_comparator"},{"data":12,"id":150,"name":"minecraft:powered_comparator"},{"data":13,"id":150,"name":"minecraft:powered_comparator"},{"data":14,"id":150,"name":"minecraft:powered_comparator"},{"data":15,"id":150,"name":"minecraft:powered_comparator"},{"data":0,"id":151,"name":"minecraft:daylight_detector"},{"data":1,"id":151,"name":"minecraft:daylight_detector"},{"data":2,"id":151,"name":"minecraft:daylight_detector"},{"data":3,"id":151,"name":"minecraft:daylight_detector"},{"data":4,"id":151,"name":"minecraft:daylight_detector"},{"data":5,"id":151,"name":"minecraft:daylight_detector"},{"data":6,"id":151,"name":"minecraft:daylight_detector"},{"data":7,"id":151,"name":"minecraft:daylight_detector"},{"data":8,"id":151,"name":"minecraft:daylight_detector"},{"data":9,"id":151,"name":"minecraft:daylight_detector"},{"data":10,"id":151,"name":"minecraft:daylight_detector"},{"data":11,"id":151,"name":"minecraft:daylight_detector"},{"data":12,"id":151,"name":"minecraft:daylight_detector"},{"data":13,"id":151,"name":"minecraft:daylight_detector"},{"data":14,"id":151,"name":"minecraft:daylight_detector"},{"data":15,"id":151,"name":"minecraft:daylight_detector"},{"data":0,"id":152,"name":"minecraft:redstone_block"},{"data":0,"id":153,"name":"minecraft:quartz_ore"},{"data":0,"id":154,"name":"minecraft:hopper"},{"data":1,"id":154,"name":"minecraft:hopper"},{"data":2,"id":154,"name":"minecraft:hopper"},{"data":3,"id":154,"name":"minecraft:hopper"},{"data":4,"id":154,"name":"minecraft:hopper"},{"data":5,"id":154,"name":"minecraft:hopper"},{"data":6,"id":154,"name":"minecraft:hopper"},{"data":7,"id":154,"name":"minecraft:hopper"},{"data":8,"id":154,"name":"minecraft:hopper"},{"data":9,"id":154,"name":"minecraft:hopper"},{"data":10,"id":154,"name":"minecraft:hopper"},{"data":11,"id":154,"name":"minecraft:hopper"},{"data":12,"id":154,"name":"minecraft:hopper"},{"data":13,"id":154,"name":"minecraft:hopper"},{"data":14,"id":154,"name":"minecraft:hopper"},{"data":15,"id":154,"name":"minecraft:hopper"},{"data":0,"id":155,"name":"minecraft:quartz_block"},{"data":1,"id":155,"name":"minecraft:quartz_block"},{"data":2,"id":155,"name":"minecraft:quartz_block"},{"data":3,"id":155,"name":"minecraft:quartz_block"},{"data":4,"id":155,"name":"minecraft:quartz_block"},{"data":5,"id":155,"name":"minecraft:quartz_block"},{"data":6,"id":155,"name":"minecraft:quartz_block"},{"data":7,"id":155,"name":"minecraft:quartz_block"},{"data":8,"id":155,"name":"minecraft:quartz_block"},{"data":9,"id":155,"name":"minecraft:quartz_block"},{"data":10,"id":155,"name":"minecraft:quartz_block"},{"data":11,"id":155,"name":"minecraft:quartz_block"},{"data":12,"id":155,"name":"minecraft:quartz_block"},{"data":13,"id":155,"name":"minecraft:quartz_block"},{"data":14,"id":155,"name":"minecraft:quartz_block"},{"data":15,"id":155,"name":"minecraft:quartz_block"},{"data":0,"id":156,"name":"minecraft:quartz_stairs"},{"data":1,"id":156,"name":"minecraft:quartz_stairs"},{"data":2,"id":156,"name":"minecraft:quartz_stairs"},{"data":3,"id":156,"name":"minecraft:quartz_stairs"},{"data":4,"id":156,"name":"minecraft:quartz_stairs"},{"data":5,"id":156,"name":"minecraft:quartz_stairs"},{"data":6,"id":156,"name":"minecraft:quartz_stairs"},{"data":7,"id":156,"name":"minecraft:quartz_stairs"},{"data":0,"id":157,"name":"minecraft:double_wooden_slab"},{"data":1,"id":157,"name":"minecraft:double_wooden_slab"},{"data":2,"id":157,"name":"minecraft:double_wooden_slab"},{"data":3,"id":157,"name":"minecraft:double_wooden_slab"},{"data":4,"id":157,"name":"minecraft:double_wooden_slab"},{"data":5,"id":157,"name":"minecraft:double_wooden_slab"},{"data":6,"id":157,"name":"minecraft:double_wooden_slab"},{"data":7,"id":157,"name":"minecraft:double_wooden_slab"},{"data":8,"id":157,"name":"minecraft:double_wooden_slab"},{"data":9,"id":157,"name":"minecraft:double_wooden_slab"},{"data":10,"id":157,"name":"minecraft:double_wooden_slab"},{"data":11,"id":157,"name":"minecraft:double_wooden_slab"},{"data":12,"id":157,"name":"minecraft:double_wooden_slab"},{"data":13,"id":157,"name":"minecraft:double_wooden_slab"},{"data":14,"id":157,"name":"minecraft:double_wooden_slab"},{"data":15,"id":157,"name":"minecraft:double_wooden_slab"},{"data":0,"id":158,"name":"minecraft:wooden_slab"},{"data":1,"id":158,"name":"minecraft:wooden_slab"},{"data":2,"id":158,"name":"minecraft:wooden_slab"},{"data":3,"id":158,"name":"minecraft:wooden_slab"},{"data":4,"id":158,"name":"minecraft:wooden_slab"},{"data":5,"id":158,"name":"minecraft:wooden_slab"},{"data":6,"id":158,"name":"minecraft:wooden_slab"},{"data":7,"id":158,"name":"minecraft:wooden_slab"},{"data":8,"id":158,"name":"minecraft:wooden_slab"},{"data":9,"id":158,"name":"minecraft:wooden_slab"},{"data":10,"id":158,"name":"minecraft:wooden_slab"},{"data":11,"id":158,"name":"minecraft:wooden_slab"},{"data":12,"id":158,"name":"minecraft:wooden_slab"},{"data":13,"id":158,"name":"minecraft:wooden_slab"},{"data":14,"id":158,"name":"minecraft:wooden_slab"},{"data":15,"id":158,"name":"minecraft:wooden_slab"},{"data":0,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":1,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":2,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":3,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":4,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":5,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":6,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":7,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":8,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":9,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":10,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":11,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":12,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":13,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":14,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":15,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":0,"id":160,"name":"minecraft:stained_glass_pane"},{"data":1,"id":160,"name":"minecraft:stained_glass_pane"},{"data":2,"id":160,"name":"minecraft:stained_glass_pane"},{"data":3,"id":160,"name":"minecraft:stained_glass_pane"},{"data":4,"id":160,"name":"minecraft:stained_glass_pane"},{"data":5,"id":160,"name":"minecraft:stained_glass_pane"},{"data":6,"id":160,"name":"minecraft:stained_glass_pane"},{"data":7,"id":160,"name":"minecraft:stained_glass_pane"},{"data":8,"id":160,"name":"minecraft:stained_glass_pane"},{"data":9,"id":160,"name":"minecraft:stained_glass_pane"},{"data":10,"id":160,"name":"minecraft:stained_glass_pane"},{"data":11,"id":160,"name":"minecraft:stained_glass_pane"},{"data":12,"id":160,"name":"minecraft:stained_glass_pane"},{"data":13,"id":160,"name":"minecraft:stained_glass_pane"},{"data":14,"id":160,"name":"minecraft:stained_glass_pane"},{"data":15,"id":160,"name":"minecraft:stained_glass_pane"},{"data":0,"id":161,"name":"minecraft:leaves2"},{"data":1,"id":161,"name":"minecraft:leaves2"},{"data":2,"id":161,"name":"minecraft:leaves2"},{"data":3,"id":161,"name":"minecraft:leaves2"},{"data":4,"id":161,"name":"minecraft:leaves2"},{"data":5,"id":161,"name":"minecraft:leaves2"},{"data":6,"id":161,"name":"minecraft:leaves2"},{"data":7,"id":161,"name":"minecraft:leaves2"},{"data":8,"id":161,"name":"minecraft:leaves2"},{"data":9,"id":161,"name":"minecraft:leaves2"},{"data":10,"id":161,"name":"minecraft:leaves2"},{"data":11,"id":161,"name":"minecraft:leaves2"},{"data":12,"id":161,"name":"minecraft:leaves2"},{"data":13,"id":161,"name":"minecraft:leaves2"},{"data":14,"id":161,"name":"minecraft:leaves2"},{"data":15,"id":161,"name":"minecraft:leaves2"},{"data":0,"id":162,"name":"minecraft:log2"},{"data":1,"id":162,"name":"minecraft:log2"},{"data":2,"id":162,"name":"minecraft:log2"},{"data":3,"id":162,"name":"minecraft:log2"},{"data":4,"id":162,"name":"minecraft:log2"},{"data":5,"id":162,"name":"minecraft:log2"},{"data":6,"id":162,"name":"minecraft:log2"},{"data":7,"id":162,"name":"minecraft:log2"},{"data":8,"id":162,"name":"minecraft:log2"},{"data":9,"id":162,"name":"minecraft:log2"},{"data":10,"id":162,"name":"minecraft:log2"},{"data":11,"id":162,"name":"minecraft:log2"},{"data":12,"id":162,"name":"minecraft:log2"},{"data":13,"id":162,"name":"minecraft:log2"},{"data":14,"id":162,"name":"minecraft:log2"},{"data":15,"id":162,"name":"minecraft:log2"},{"data":0,"id":163,"name":"minecraft:acacia_stairs"},{"data":1,"id":163,"name":"minecraft:acacia_stairs"},{"data":2,"id":163,"name":"minecraft:acacia_stairs"},{"data":3,"id":163,"name":"minecraft:acacia_stairs"},{"data":4,"id":163,"name":"minecraft:acacia_stairs"},{"data":5,"id":163,"name":"minecraft:acacia_stairs"},{"data":6,"id":163,"name":"minecraft:acacia_stairs"},{"data":7,"id":163,"name":"minecraft:acacia_stairs"},{"data":0,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":1,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":2,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":3,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":4,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":5,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":6,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":7,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":0,"id":165,"name":"minecraft:slime"},{"data":0,"id":166,"name":"minecraft:glow_stick"},{"data":1,"id":166,"name":"minecraft:glow_stick"},{"data":2,"id":166,"name":"minecraft:glow_stick"},{"data":3,"id":166,"name":"minecraft:glow_stick"},{"data":4,"id":166,"name":"minecraft:glow_stick"},{"data":5,"id":166,"name":"minecraft:glow_stick"},{"data":6,"id":166,"name":"minecraft:glow_stick"},{"data":7,"id":166,"name":"minecraft:glow_stick"},{"data":8,"id":166,"name":"minecraft:glow_stick"},{"data":9,"id":166,"name":"minecraft:glow_stick"},{"data":10,"id":166,"name":"minecraft:glow_stick"},{"data":11,"id":166,"name":"minecraft:glow_stick"},{"data":12,"id":166,"name":"minecraft:glow_stick"},{"data":13,"id":166,"name":"minecraft:glow_stick"},{"data":14,"id":166,"name":"minecraft:glow_stick"},{"data":15,"id":166,"name":"minecraft:glow_stick"},{"data":0,"id":167,"name":"minecraft:iron_trapdoor"},{"data":1,"id":167,"name":"minecraft:iron_trapdoor"},{"data":2,"id":167,"name":"minecraft:iron_trapdoor"},{"data":3,"id":167,"name":"minecraft:iron_trapdoor"},{"data":4,"id":167,"name":"minecraft:iron_trapdoor"},{"data":5,"id":167,"name":"minecraft:iron_trapdoor"},{"data":6,"id":167,"name":"minecraft:iron_trapdoor"},{"data":7,"id":167,"name":"minecraft:iron_trapdoor"},{"data":8,"id":167,"name":"minecraft:iron_trapdoor"},{"data":9,"id":167,"name":"minecraft:iron_trapdoor"},{"data":10,"id":167,"name":"minecraft:iron_trapdoor"},{"data":11,"id":167,"name":"minecraft:iron_trapdoor"},{"data":12,"id":167,"name":"minecraft:iron_trapdoor"},{"data":13,"id":167,"name":"minecraft:iron_trapdoor"},{"data":14,"id":167,"name":"minecraft:iron_trapdoor"},{"data":15,"id":167,"name":"minecraft:iron_trapdoor"},{"data":0,"id":168,"name":"minecraft:prismarine"},{"data":1,"id":168,"name":"minecraft:prismarine"},{"data":2,"id":168,"name":"minecraft:prismarine"},{"data":3,"id":168,"name":"minecraft:prismarine"},{"data":0,"id":169,"name":"minecraft:seaLantern"},{"data":0,"id":170,"name":"minecraft:hay_block"},{"data":1,"id":170,"name":"minecraft:hay_block"},{"data":2,"id":170,"name":"minecraft:hay_block"},{"data":3,"id":170,"name":"minecraft:hay_block"},{"data":4,"id":170,"name":"minecraft:hay_block"},{"data":5,"id":170,"name":"minecraft:hay_block"},{"data":6,"id":170,"name":"minecraft:hay_block"},{"data":7,"id":170,"name":"minecraft:hay_block"},{"data":8,"id":170,"name":"minecraft:hay_block"},{"data":9,"id":170,"name":"minecraft:hay_block"},{"data":10,"id":170,"name":"minecraft:hay_block"},{"data":11,"id":170,"name":"minecraft:hay_block"},{"data":12,"id":170,"name":"minecraft:hay_block"},{"data":13,"id":170,"name":"minecraft:hay_block"},{"data":14,"id":170,"name":"minecraft:hay_block"},{"data":15,"id":170,"name":"minecraft:hay_block"},{"data":0,"id":171,"name":"minecraft:carpet"},{"data":1,"id":171,"name":"minecraft:carpet"},{"data":2,"id":171,"name":"minecraft:carpet"},{"data":3,"id":171,"name":"minecraft:carpet"},{"data":4,"id":171,"name":"minecraft:carpet"},{"data":5,"id":171,"name":"minecraft:carpet"},{"data":6,"id":171,"name":"minecraft:carpet"},{"data":7,"id":171,"name":"minecraft:carpet"},{"data":8,"id":171,"name":"minecraft:carpet"},{"data":9,"id":171,"name":"minecraft:carpet"},{"data":10,"id":171,"name":"minecraft:carpet"},{"data":11,"id":171,"name":"minecraft:carpet"},{"data":12,"id":171,"name":"minecraft:carpet"},{"data":13,"id":171,"name":"minecraft:carpet"},{"data":14,"id":171,"name":"minecraft:carpet"},{"data":15,"id":171,"name":"minecraft:carpet"},{"data":0,"id":172,"name":"minecraft:hardened_clay"},{"data":0,"id":173,"name":"minecraft:coal_block"},{"data":0,"id":174,"name":"minecraft:packed_ice"},{"data":0,"id":175,"name":"minecraft:double_plant"},{"data":1,"id":175,"name":"minecraft:double_plant"},{"data":2,"id":175,"name":"minecraft:double_plant"},{"data":3,"id":175,"name":"minecraft:double_plant"},{"data":4,"id":175,"name":"minecraft:double_plant"},{"data":5,"id":175,"name":"minecraft:double_plant"},{"data":6,"id":175,"name":"minecraft:double_plant"},{"data":7,"id":175,"name":"minecraft:double_plant"},{"data":8,"id":175,"name":"minecraft:double_plant"},{"data":9,"id":175,"name":"minecraft:double_plant"},{"data":10,"id":175,"name":"minecraft:double_plant"},{"data":11,"id":175,"name":"minecraft:double_plant"},{"data":12,"id":175,"name":"minecraft:double_plant"},{"data":13,"id":175,"name":"minecraft:double_plant"},{"data":14,"id":175,"name":"minecraft:double_plant"},{"data":15,"id":175,"name":"minecraft:double_plant"},{"data":0,"id":176,"name":"minecraft:standing_banner"},{"data":1,"id":176,"name":"minecraft:standing_banner"},{"data":2,"id":176,"name":"minecraft:standing_banner"},{"data":3,"id":176,"name":"minecraft:standing_banner"},{"data":4,"id":176,"name":"minecraft:standing_banner"},{"data":5,"id":176,"name":"minecraft:standing_banner"},{"data":6,"id":176,"name":"minecraft:standing_banner"},{"data":7,"id":176,"name":"minecraft:standing_banner"},{"data":8,"id":176,"name":"minecraft:standing_banner"},{"data":9,"id":176,"name":"minecraft:standing_banner"},{"data":10,"id":176,"name":"minecraft:standing_banner"},{"data":11,"id":176,"name":"minecraft:standing_banner"},{"data":12,"id":176,"name":"minecraft:standing_banner"},{"data":13,"id":176,"name":"minecraft:standing_banner"},{"data":14,"id":176,"name":"minecraft:standing_banner"},{"data":15,"id":176,"name":"minecraft:standing_banner"},{"data":0,"id":177,"name":"minecraft:wall_banner"},{"data":1,"id":177,"name":"minecraft:wall_banner"},{"data":2,"id":177,"name":"minecraft:wall_banner"},{"data":3,"id":177,"name":"minecraft:wall_banner"},{"data":4,"id":177,"name":"minecraft:wall_banner"},{"data":5,"id":177,"name":"minecraft:wall_banner"},{"data":6,"id":177,"name":"minecraft:wall_banner"},{"data":7,"id":177,"name":"minecraft:wall_banner"},{"data":0,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":1,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":2,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":3,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":4,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":5,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":6,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":7,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":8,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":9,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":10,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":11,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":12,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":13,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":14,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":15,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":0,"id":179,"name":"minecraft:red_sandstone"},{"data":1,"id":179,"name":"minecraft:red_sandstone"},{"data":2,"id":179,"name":"minecraft:red_sandstone"},{"data":3,"id":179,"name":"minecraft:red_sandstone"},{"data":0,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":1,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":2,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":3,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":4,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":5,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":6,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":7,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":0,"id":181,"name":"minecraft:double_stone_slab2"},{"data":1,"id":181,"name":"minecraft:double_stone_slab2"},{"data":2,"id":181,"name":"minecraft:double_stone_slab2"},{"data":3,"id":181,"name":"minecraft:double_stone_slab2"},{"data":4,"id":181,"name":"minecraft:double_stone_slab2"},{"data":5,"id":181,"name":"minecraft:double_stone_slab2"},{"data":6,"id":181,"name":"minecraft:double_stone_slab2"},{"data":7,"id":181,"name":"minecraft:double_stone_slab2"},{"data":8,"id":181,"name":"minecraft:double_stone_slab2"},{"data":9,"id":181,"name":"minecraft:double_stone_slab2"},{"data":10,"id":181,"name":"minecraft:double_stone_slab2"},{"data":11,"id":181,"name":"minecraft:double_stone_slab2"},{"data":12,"id":181,"name":"minecraft:double_stone_slab2"},{"data":13,"id":181,"name":"minecraft:double_stone_slab2"},{"data":14,"id":181,"name":"minecraft:double_stone_slab2"},{"data":15,"id":181,"name":"minecraft:double_stone_slab2"},{"data":0,"id":182,"name":"minecraft:stone_slab2"},{"data":1,"id":182,"name":"minecraft:stone_slab2"},{"data":2,"id":182,"name":"minecraft:stone_slab2"},{"data":3,"id":182,"name":"minecraft:stone_slab2"},{"data":4,"id":182,"name":"minecraft:stone_slab2"},{"data":5,"id":182,"name":"minecraft:stone_slab2"},{"data":6,"id":182,"name":"minecraft:stone_slab2"},{"data":7,"id":182,"name":"minecraft:stone_slab2"},{"data":8,"id":182,"name":"minecraft:stone_slab2"},{"data":9,"id":182,"name":"minecraft:stone_slab2"},{"data":10,"id":182,"name":"minecraft:stone_slab2"},{"data":11,"id":182,"name":"minecraft:stone_slab2"},{"data":12,"id":182,"name":"minecraft:stone_slab2"},{"data":13,"id":182,"name":"minecraft:stone_slab2"},{"data":14,"id":182,"name":"minecraft:stone_slab2"},{"data":15,"id":182,"name":"minecraft:stone_slab2"},{"data":0,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":1,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":2,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":3,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":4,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":5,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":6,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":7,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":8,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":9,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":10,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":11,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":12,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":13,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":14,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":15,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":0,"id":184,"name":"minecraft:birch_fence_gate"},{"data":1,"id":184,"name":"minecraft:birch_fence_gate"},{"data":2,"id":184,"name":"minecraft:birch_fence_gate"},{"data":3,"id":184,"name":"minecraft:birch_fence_gate"},{"data":4,"id":184,"name":"minecraft:birch_fence_gate"},{"data":5,"id":184,"name":"minecraft:birch_fence_gate"},{"data":6,"id":184,"name":"minecraft:birch_fence_gate"},{"data":7,"id":184,"name":"minecraft:birch_fence_gate"},{"data":8,"id":184,"name":"minecraft:birch_fence_gate"},{"data":9,"id":184,"name":"minecraft:birch_fence_gate"},{"data":10,"id":184,"name":"minecraft:birch_fence_gate"},{"data":11,"id":184,"name":"minecraft:birch_fence_gate"},{"data":12,"id":184,"name":"minecraft:birch_fence_gate"},{"data":13,"id":184,"name":"minecraft:birch_fence_gate"},{"data":14,"id":184,"name":"minecraft:birch_fence_gate"},{"data":15,"id":184,"name":"minecraft:birch_fence_gate"},{"data":0,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":1,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":2,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":3,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":4,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":5,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":6,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":7,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":8,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":9,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":10,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":11,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":12,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":13,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":14,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":15,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":0,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":1,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":2,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":3,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":4,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":5,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":6,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":7,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":8,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":9,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":10,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":11,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":12,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":13,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":14,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":15,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":0,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":1,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":2,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":3,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":4,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":5,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":6,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":7,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":8,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":9,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":10,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":11,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":12,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":13,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":14,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":15,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":0,"id":188,"name":"minecraft:repeating_command_block"},{"data":1,"id":188,"name":"minecraft:repeating_command_block"},{"data":2,"id":188,"name":"minecraft:repeating_command_block"},{"data":3,"id":188,"name":"minecraft:repeating_command_block"},{"data":4,"id":188,"name":"minecraft:repeating_command_block"},{"data":5,"id":188,"name":"minecraft:repeating_command_block"},{"data":6,"id":188,"name":"minecraft:repeating_command_block"},{"data":7,"id":188,"name":"minecraft:repeating_command_block"},{"data":8,"id":188,"name":"minecraft:repeating_command_block"},{"data":9,"id":188,"name":"minecraft:repeating_command_block"},{"data":10,"id":188,"name":"minecraft:repeating_command_block"},{"data":11,"id":188,"name":"minecraft:repeating_command_block"},{"data":12,"id":188,"name":"minecraft:repeating_command_block"},{"data":13,"id":188,"name":"minecraft:repeating_command_block"},{"data":14,"id":188,"name":"minecraft:repeating_command_block"},{"data":15,"id":188,"name":"minecraft:repeating_command_block"},{"data":0,"id":189,"name":"minecraft:chain_command_block"},{"data":1,"id":189,"name":"minecraft:chain_command_block"},{"data":2,"id":189,"name":"minecraft:chain_command_block"},{"data":3,"id":189,"name":"minecraft:chain_command_block"},{"data":4,"id":189,"name":"minecraft:chain_command_block"},{"data":5,"id":189,"name":"minecraft:chain_command_block"},{"data":6,"id":189,"name":"minecraft:chain_command_block"},{"data":7,"id":189,"name":"minecraft:chain_command_block"},{"data":8,"id":189,"name":"minecraft:chain_command_block"},{"data":9,"id":189,"name":"minecraft:chain_command_block"},{"data":10,"id":189,"name":"minecraft:chain_command_block"},{"data":11,"id":189,"name":"minecraft:chain_command_block"},{"data":12,"id":189,"name":"minecraft:chain_command_block"},{"data":13,"id":189,"name":"minecraft:chain_command_block"},{"data":14,"id":189,"name":"minecraft:chain_command_block"},{"data":15,"id":189,"name":"minecraft:chain_command_block"},{"data":0,"id":190,"name":"minecraft:hard_glass_pane"},{"data":0,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":1,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":2,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":3,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":4,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":5,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":6,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":7,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":8,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":9,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":10,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":11,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":12,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":13,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":14,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":15,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":0,"id":192,"name":"minecraft:chemical_heat"},{"data":0,"id":193,"name":"minecraft:spruce_door"},{"data":1,"id":193,"name":"minecraft:spruce_door"},{"data":2,"id":193,"name":"minecraft:spruce_door"},{"data":3,"id":193,"name":"minecraft:spruce_door"},{"data":4,"id":193,"name":"minecraft:spruce_door"},{"data":5,"id":193,"name":"minecraft:spruce_door"},{"data":6,"id":193,"name":"minecraft:spruce_door"},{"data":7,"id":193,"name":"minecraft:spruce_door"},{"data":8,"id":193,"name":"minecraft:spruce_door"},{"data":9,"id":193,"name":"minecraft:spruce_door"},{"data":10,"id":193,"name":"minecraft:spruce_door"},{"data":11,"id":193,"name":"minecraft:spruce_door"},{"data":12,"id":193,"name":"minecraft:spruce_door"},{"data":13,"id":193,"name":"minecraft:spruce_door"},{"data":14,"id":193,"name":"minecraft:spruce_door"},{"data":15,"id":193,"name":"minecraft:spruce_door"},{"data":0,"id":194,"name":"minecraft:birch_door"},{"data":1,"id":194,"name":"minecraft:birch_door"},{"data":2,"id":194,"name":"minecraft:birch_door"},{"data":3,"id":194,"name":"minecraft:birch_door"},{"data":4,"id":194,"name":"minecraft:birch_door"},{"data":5,"id":194,"name":"minecraft:birch_door"},{"data":6,"id":194,"name":"minecraft:birch_door"},{"data":7,"id":194,"name":"minecraft:birch_door"},{"data":8,"id":194,"name":"minecraft:birch_door"},{"data":9,"id":194,"name":"minecraft:birch_door"},{"data":10,"id":194,"name":"minecraft:birch_door"},{"data":11,"id":194,"name":"minecraft:birch_door"},{"data":12,"id":194,"name":"minecraft:birch_door"},{"data":13,"id":194,"name":"minecraft:birch_door"},{"data":14,"id":194,"name":"minecraft:birch_door"},{"data":15,"id":194,"name":"minecraft:birch_door"},{"data":0,"id":195,"name":"minecraft:jungle_door"},{"data":1,"id":195,"name":"minecraft:jungle_door"},{"data":2,"id":195,"name":"minecraft:jungle_door"},{"data":3,"id":195,"name":"minecraft:jungle_door"},{"data":4,"id":195,"name":"minecraft:jungle_door"},{"data":5,"id":195,"name":"minecraft:jungle_door"},{"data":6,"id":195,"name":"minecraft:jungle_door"},{"data":7,"id":195,"name":"minecraft:jungle_door"},{"data":8,"id":195,"name":"minecraft:jungle_door"},{"data":9,"id":195,"name":"minecraft:jungle_door"},{"data":10,"id":195,"name":"minecraft:jungle_door"},{"data":11,"id":195,"name":"minecraft:jungle_door"},{"data":12,"id":195,"name":"minecraft:jungle_door"},{"data":13,"id":195,"name":"minecraft:jungle_door"},{"data":14,"id":195,"name":"minecraft:jungle_door"},{"data":15,"id":195,"name":"minecraft:jungle_door"},{"data":0,"id":196,"name":"minecraft:acacia_door"},{"data":1,"id":196,"name":"minecraft:acacia_door"},{"data":2,"id":196,"name":"minecraft:acacia_door"},{"data":3,"id":196,"name":"minecraft:acacia_door"},{"data":4,"id":196,"name":"minecraft:acacia_door"},{"data":5,"id":196,"name":"minecraft:acacia_door"},{"data":6,"id":196,"name":"minecraft:acacia_door"},{"data":7,"id":196,"name":"minecraft:acacia_door"},{"data":8,"id":196,"name":"minecraft:acacia_door"},{"data":9,"id":196,"name":"minecraft:acacia_door"},{"data":10,"id":196,"name":"minecraft:acacia_door"},{"data":11,"id":196,"name":"minecraft:acacia_door"},{"data":12,"id":196,"name":"minecraft:acacia_door"},{"data":13,"id":196,"name":"minecraft:acacia_door"},{"data":14,"id":196,"name":"minecraft:acacia_door"},{"data":15,"id":196,"name":"minecraft:acacia_door"},{"data":0,"id":197,"name":"minecraft:dark_oak_door"},{"data":1,"id":197,"name":"minecraft:dark_oak_door"},{"data":2,"id":197,"name":"minecraft:dark_oak_door"},{"data":3,"id":197,"name":"minecraft:dark_oak_door"},{"data":4,"id":197,"name":"minecraft:dark_oak_door"},{"data":5,"id":197,"name":"minecraft:dark_oak_door"},{"data":6,"id":197,"name":"minecraft:dark_oak_door"},{"data":7,"id":197,"name":"minecraft:dark_oak_door"},{"data":8,"id":197,"name":"minecraft:dark_oak_door"},{"data":9,"id":197,"name":"minecraft:dark_oak_door"},{"data":10,"id":197,"name":"minecraft:dark_oak_door"},{"data":11,"id":197,"name":"minecraft:dark_oak_door"},{"data":12,"id":197,"name":"minecraft:dark_oak_door"},{"data":13,"id":197,"name":"minecraft:dark_oak_door"},{"data":14,"id":197,"name":"minecraft:dark_oak_door"},{"data":15,"id":197,"name":"minecraft:dark_oak_door"},{"data":0,"id":198,"name":"minecraft:grass_path"},{"data":0,"id":199,"name":"minecraft:frame"},{"data":1,"id":199,"name":"minecraft:frame"},{"data":2,"id":199,"name":"minecraft:frame"},{"data":3,"id":199,"name":"minecraft:frame"},{"data":4,"id":199,"name":"minecraft:frame"},{"data":5,"id":199,"name":"minecraft:frame"},{"data":6,"id":199,"name":"minecraft:frame"},{"data":7,"id":199,"name":"minecraft:frame"},{"data":0,"id":200,"name":"minecraft:chorus_flower"},{"data":1,"id":200,"name":"minecraft:chorus_flower"},{"data":2,"id":200,"name":"minecraft:chorus_flower"},{"data":3,"id":200,"name":"minecraft:chorus_flower"},{"data":4,"id":200,"name":"minecraft:chorus_flower"},{"data":5,"id":200,"name":"minecraft:chorus_flower"},{"data":6,"id":200,"name":"minecraft:chorus_flower"},{"data":7,"id":200,"name":"minecraft:chorus_flower"},{"data":0,"id":201,"name":"minecraft:purpur_block"},{"data":1,"id":201,"name":"minecraft:purpur_block"},{"data":2,"id":201,"name":"minecraft:purpur_block"},{"data":3,"id":201,"name":"minecraft:purpur_block"},{"data":4,"id":201,"name":"minecraft:purpur_block"},{"data":5,"id":201,"name":"minecraft:purpur_block"},{"data":6,"id":201,"name":"minecraft:purpur_block"},{"data":7,"id":201,"name":"minecraft:purpur_block"},{"data":8,"id":201,"name":"minecraft:purpur_block"},{"data":9,"id":201,"name":"minecraft:purpur_block"},{"data":10,"id":201,"name":"minecraft:purpur_block"},{"data":11,"id":201,"name":"minecraft:purpur_block"},{"data":12,"id":201,"name":"minecraft:purpur_block"},{"data":13,"id":201,"name":"minecraft:purpur_block"},{"data":14,"id":201,"name":"minecraft:purpur_block"},{"data":15,"id":201,"name":"minecraft:purpur_block"},{"data":0,"id":202,"name":"minecraft:colored_torch_rg"},{"data":1,"id":202,"name":"minecraft:colored_torch_rg"},{"data":2,"id":202,"name":"minecraft:colored_torch_rg"},{"data":3,"id":202,"name":"minecraft:colored_torch_rg"},{"data":4,"id":202,"name":"minecraft:colored_torch_rg"},{"data":5,"id":202,"name":"minecraft:colored_torch_rg"},{"data":6,"id":202,"name":"minecraft:colored_torch_rg"},{"data":7,"id":202,"name":"minecraft:colored_torch_rg"},{"data":8,"id":202,"name":"minecraft:colored_torch_rg"},{"data":9,"id":202,"name":"minecraft:colored_torch_rg"},{"data":10,"id":202,"name":"minecraft:colored_torch_rg"},{"data":11,"id":202,"name":"minecraft:colored_torch_rg"},{"data":12,"id":202,"name":"minecraft:colored_torch_rg"},{"data":13,"id":202,"name":"minecraft:colored_torch_rg"},{"data":14,"id":202,"name":"minecraft:colored_torch_rg"},{"data":15,"id":202,"name":"minecraft:colored_torch_rg"},{"data":0,"id":203,"name":"minecraft:purpur_stairs"},{"data":1,"id":203,"name":"minecraft:purpur_stairs"},{"data":2,"id":203,"name":"minecraft:purpur_stairs"},{"data":3,"id":203,"name":"minecraft:purpur_stairs"},{"data":4,"id":203,"name":"minecraft:purpur_stairs"},{"data":5,"id":203,"name":"minecraft:purpur_stairs"},{"data":6,"id":203,"name":"minecraft:purpur_stairs"},{"data":7,"id":203,"name":"minecraft:purpur_stairs"},{"data":0,"id":204,"name":"minecraft:colored_torch_bp"},{"data":1,"id":204,"name":"minecraft:colored_torch_bp"},{"data":2,"id":204,"name":"minecraft:colored_torch_bp"},{"data":3,"id":204,"name":"minecraft:colored_torch_bp"},{"data":4,"id":204,"name":"minecraft:colored_torch_bp"},{"data":5,"id":204,"name":"minecraft:colored_torch_bp"},{"data":6,"id":204,"name":"minecraft:colored_torch_bp"},{"data":7,"id":204,"name":"minecraft:colored_torch_bp"},{"data":8,"id":204,"name":"minecraft:colored_torch_bp"},{"data":9,"id":204,"name":"minecraft:colored_torch_bp"},{"data":10,"id":204,"name":"minecraft:colored_torch_bp"},{"data":11,"id":204,"name":"minecraft:colored_torch_bp"},{"data":12,"id":204,"name":"minecraft:colored_torch_bp"},{"data":13,"id":204,"name":"minecraft:colored_torch_bp"},{"data":14,"id":204,"name":"minecraft:colored_torch_bp"},{"data":15,"id":204,"name":"minecraft:colored_torch_bp"},{"data":0,"id":205,"name":"minecraft:undyed_shulker_box"},{"data":0,"id":206,"name":"minecraft:end_bricks"},{"data":0,"id":207,"name":"minecraft:frosted_ice"},{"data":1,"id":207,"name":"minecraft:frosted_ice"},{"data":2,"id":207,"name":"minecraft:frosted_ice"},{"data":3,"id":207,"name":"minecraft:frosted_ice"},{"data":0,"id":208,"name":"minecraft:end_rod"},{"data":1,"id":208,"name":"minecraft:end_rod"},{"data":2,"id":208,"name":"minecraft:end_rod"},{"data":3,"id":208,"name":"minecraft:end_rod"},{"data":4,"id":208,"name":"minecraft:end_rod"},{"data":5,"id":208,"name":"minecraft:end_rod"},{"data":6,"id":208,"name":"minecraft:end_rod"},{"data":7,"id":208,"name":"minecraft:end_rod"},{"data":0,"id":209,"name":"minecraft:end_gateway"},{"data":0,"id":213,"name":"minecraft:magma"},{"data":0,"id":214,"name":"minecraft:nether_wart_block"},{"data":0,"id":215,"name":"minecraft:red_nether_brick"},{"data":0,"id":216,"name":"minecraft:bone_block"},{"data":1,"id":216,"name":"minecraft:bone_block"},{"data":2,"id":216,"name":"minecraft:bone_block"},{"data":3,"id":216,"name":"minecraft:bone_block"},{"data":4,"id":216,"name":"minecraft:bone_block"},{"data":5,"id":216,"name":"minecraft:bone_block"},{"data":6,"id":216,"name":"minecraft:bone_block"},{"data":7,"id":216,"name":"minecraft:bone_block"},{"data":8,"id":216,"name":"minecraft:bone_block"},{"data":9,"id":216,"name":"minecraft:bone_block"},{"data":10,"id":216,"name":"minecraft:bone_block"},{"data":11,"id":216,"name":"minecraft:bone_block"},{"data":12,"id":216,"name":"minecraft:bone_block"},{"data":13,"id":216,"name":"minecraft:bone_block"},{"data":14,"id":216,"name":"minecraft:bone_block"},{"data":15,"id":216,"name":"minecraft:bone_block"},{"data":0,"id":218,"name":"minecraft:shulker_box"},{"data":1,"id":218,"name":"minecraft:shulker_box"},{"data":2,"id":218,"name":"minecraft:shulker_box"},{"data":3,"id":218,"name":"minecraft:shulker_box"},{"data":4,"id":218,"name":"minecraft:shulker_box"},{"data":5,"id":218,"name":"minecraft:shulker_box"},{"data":6,"id":218,"name":"minecraft:shulker_box"},{"data":7,"id":218,"name":"minecraft:shulker_box"},{"data":8,"id":218,"name":"minecraft:shulker_box"},{"data":9,"id":218,"name":"minecraft:shulker_box"},{"data":10,"id":218,"name":"minecraft:shulker_box"},{"data":11,"id":218,"name":"minecraft:shulker_box"},{"data":12,"id":218,"name":"minecraft:shulker_box"},{"data":13,"id":218,"name":"minecraft:shulker_box"},{"data":14,"id":218,"name":"minecraft:shulker_box"},{"data":15,"id":218,"name":"minecraft:shulker_box"},{"data":0,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":1,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":2,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":3,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":4,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":5,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":6,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":7,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":0,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":1,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":2,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":3,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":4,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":5,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":6,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":7,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":0,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":1,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":2,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":3,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":4,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":5,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":6,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":7,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":0,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":1,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":2,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":3,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":4,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":5,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":6,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":7,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":0,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":1,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":2,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":3,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":4,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":5,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":6,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":7,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":0,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":1,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":2,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":3,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":4,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":5,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":6,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":7,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":0,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":1,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":2,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":3,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":4,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":5,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":6,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":7,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":0,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":1,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":2,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":3,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":4,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":5,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":6,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":7,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":0,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":1,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":2,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":3,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":4,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":5,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":6,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":7,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":0,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":1,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":2,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":3,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":4,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":5,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":6,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":7,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":0,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":1,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":2,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":3,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":4,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":5,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":6,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":7,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":0,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":1,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":2,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":3,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":4,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":5,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":6,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":7,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":0,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":1,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":2,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":3,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":4,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":5,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":6,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":7,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":0,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":1,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":2,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":3,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":4,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":5,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":6,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":7,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":0,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":1,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":2,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":3,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":4,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":5,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":6,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":7,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":0,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":1,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":2,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":3,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":4,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":5,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":6,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":7,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":0,"id":236,"name":"minecraft:concrete"},{"data":1,"id":236,"name":"minecraft:concrete"},{"data":2,"id":236,"name":"minecraft:concrete"},{"data":3,"id":236,"name":"minecraft:concrete"},{"data":4,"id":236,"name":"minecraft:concrete"},{"data":5,"id":236,"name":"minecraft:concrete"},{"data":6,"id":236,"name":"minecraft:concrete"},{"data":7,"id":236,"name":"minecraft:concrete"},{"data":8,"id":236,"name":"minecraft:concrete"},{"data":9,"id":236,"name":"minecraft:concrete"},{"data":10,"id":236,"name":"minecraft:concrete"},{"data":11,"id":236,"name":"minecraft:concrete"},{"data":12,"id":236,"name":"minecraft:concrete"},{"data":13,"id":236,"name":"minecraft:concrete"},{"data":14,"id":236,"name":"minecraft:concrete"},{"data":15,"id":236,"name":"minecraft:concrete"},{"data":0,"id":237,"name":"minecraft:concretePowder"},{"data":1,"id":237,"name":"minecraft:concretePowder"},{"data":2,"id":237,"name":"minecraft:concretePowder"},{"data":3,"id":237,"name":"minecraft:concretePowder"},{"data":4,"id":237,"name":"minecraft:concretePowder"},{"data":5,"id":237,"name":"minecraft:concretePowder"},{"data":6,"id":237,"name":"minecraft:concretePowder"},{"data":7,"id":237,"name":"minecraft:concretePowder"},{"data":8,"id":237,"name":"minecraft:concretePowder"},{"data":9,"id":237,"name":"minecraft:concretePowder"},{"data":10,"id":237,"name":"minecraft:concretePowder"},{"data":11,"id":237,"name":"minecraft:concretePowder"},{"data":12,"id":237,"name":"minecraft:concretePowder"},{"data":13,"id":237,"name":"minecraft:concretePowder"},{"data":14,"id":237,"name":"minecraft:concretePowder"},{"data":15,"id":237,"name":"minecraft:concretePowder"},{"data":0,"id":238,"name":"minecraft:chemistry_table"},{"data":1,"id":238,"name":"minecraft:chemistry_table"},{"data":2,"id":238,"name":"minecraft:chemistry_table"},{"data":3,"id":238,"name":"minecraft:chemistry_table"},{"data":4,"id":238,"name":"minecraft:chemistry_table"},{"data":5,"id":238,"name":"minecraft:chemistry_table"},{"data":6,"id":238,"name":"minecraft:chemistry_table"},{"data":7,"id":238,"name":"minecraft:chemistry_table"},{"data":8,"id":238,"name":"minecraft:chemistry_table"},{"data":9,"id":238,"name":"minecraft:chemistry_table"},{"data":10,"id":238,"name":"minecraft:chemistry_table"},{"data":11,"id":238,"name":"minecraft:chemistry_table"},{"data":12,"id":238,"name":"minecraft:chemistry_table"},{"data":13,"id":238,"name":"minecraft:chemistry_table"},{"data":14,"id":238,"name":"minecraft:chemistry_table"},{"data":15,"id":238,"name":"minecraft:chemistry_table"},{"data":0,"id":239,"name":"minecraft:underwater_torch"},{"data":1,"id":239,"name":"minecraft:underwater_torch"},{"data":2,"id":239,"name":"minecraft:underwater_torch"},{"data":3,"id":239,"name":"minecraft:underwater_torch"},{"data":4,"id":239,"name":"minecraft:underwater_torch"},{"data":5,"id":239,"name":"minecraft:underwater_torch"},{"data":6,"id":239,"name":"minecraft:underwater_torch"},{"data":7,"id":239,"name":"minecraft:underwater_torch"},{"data":0,"id":240,"name":"minecraft:chorus_plant"},{"data":0,"id":241,"name":"minecraft:stained_glass"},{"data":1,"id":241,"name":"minecraft:stained_glass"},{"data":2,"id":241,"name":"minecraft:stained_glass"},{"data":3,"id":241,"name":"minecraft:stained_glass"},{"data":4,"id":241,"name":"minecraft:stained_glass"},{"data":5,"id":241,"name":"minecraft:stained_glass"},{"data":6,"id":241,"name":"minecraft:stained_glass"},{"data":7,"id":241,"name":"minecraft:stained_glass"},{"data":8,"id":241,"name":"minecraft:stained_glass"},{"data":9,"id":241,"name":"minecraft:stained_glass"},{"data":10,"id":241,"name":"minecraft:stained_glass"},{"data":11,"id":241,"name":"minecraft:stained_glass"},{"data":12,"id":241,"name":"minecraft:stained_glass"},{"data":13,"id":241,"name":"minecraft:stained_glass"},{"data":14,"id":241,"name":"minecraft:stained_glass"},{"data":15,"id":241,"name":"minecraft:stained_glass"},{"data":0,"id":243,"name":"minecraft:podzol"},{"data":0,"id":244,"name":"minecraft:beetroot"},{"data":1,"id":244,"name":"minecraft:beetroot"},{"data":2,"id":244,"name":"minecraft:beetroot"},{"data":3,"id":244,"name":"minecraft:beetroot"},{"data":4,"id":244,"name":"minecraft:beetroot"},{"data":5,"id":244,"name":"minecraft:beetroot"},{"data":6,"id":244,"name":"minecraft:beetroot"},{"data":7,"id":244,"name":"minecraft:beetroot"},{"data":0,"id":245,"name":"minecraft:stonecutter"},{"data":0,"id":246,"name":"minecraft:glowingobsidian"},{"data":0,"id":247,"name":"minecraft:netherreactor"},{"data":0,"id":248,"name":"minecraft:info_update"},{"data":0,"id":249,"name":"minecraft:info_update2"},{"data":0,"id":250,"name":"minecraft:movingBlock"},{"data":0,"id":251,"name":"minecraft:observer"},{"data":1,"id":251,"name":"minecraft:observer"},{"data":2,"id":251,"name":"minecraft:observer"},{"data":3,"id":251,"name":"minecraft:observer"},{"data":4,"id":251,"name":"minecraft:observer"},{"data":5,"id":251,"name":"minecraft:observer"},{"data":6,"id":251,"name":"minecraft:observer"},{"data":7,"id":251,"name":"minecraft:observer"},{"data":8,"id":251,"name":"minecraft:observer"},{"data":9,"id":251,"name":"minecraft:observer"},{"data":10,"id":251,"name":"minecraft:observer"},{"data":11,"id":251,"name":"minecraft:observer"},{"data":12,"id":251,"name":"minecraft:observer"},{"data":13,"id":251,"name":"minecraft:observer"},{"data":14,"id":251,"name":"minecraft:observer"},{"data":15,"id":251,"name":"minecraft:observer"},{"data":0,"id":252,"name":"minecraft:structure_block"},{"data":1,"id":252,"name":"minecraft:structure_block"},{"data":2,"id":252,"name":"minecraft:structure_block"},{"data":3,"id":252,"name":"minecraft:structure_block"},{"data":4,"id":252,"name":"minecraft:structure_block"},{"data":5,"id":252,"name":"minecraft:structure_block"},{"data":6,"id":252,"name":"minecraft:structure_block"},{"data":7,"id":252,"name":"minecraft:structure_block"},{"data":0,"id":253,"name":"minecraft:hard_glass"},{"data":0,"id":254,"name":"minecraft:hard_stained_glass"},{"data":1,"id":254,"name":"minecraft:hard_stained_glass"},{"data":2,"id":254,"name":"minecraft:hard_stained_glass"},{"data":3,"id":254,"name":"minecraft:hard_stained_glass"},{"data":4,"id":254,"name":"minecraft:hard_stained_glass"},{"data":5,"id":254,"name":"minecraft:hard_stained_glass"},{"data":6,"id":254,"name":"minecraft:hard_stained_glass"},{"data":7,"id":254,"name":"minecraft:hard_stained_glass"},{"data":8,"id":254,"name":"minecraft:hard_stained_glass"},{"data":9,"id":254,"name":"minecraft:hard_stained_glass"},{"data":10,"id":254,"name":"minecraft:hard_stained_glass"},{"data":11,"id":254,"name":"minecraft:hard_stained_glass"},{"data":12,"id":254,"name":"minecraft:hard_stained_glass"},{"data":13,"id":254,"name":"minecraft:hard_stained_glass"},{"data":14,"id":254,"name":"minecraft:hard_stained_glass"},{"data":15,"id":254,"name":"minecraft:hard_stained_glass"},{"data":0,"id":255,"name":"minecraft:reserved6"},{"data":0,"id":257,"name":"minecraft:prismarine_stairs"},{"data":1,"id":257,"name":"minecraft:prismarine_stairs"},{"data":2,"id":257,"name":"minecraft:prismarine_stairs"},{"data":3,"id":257,"name":"minecraft:prismarine_stairs"},{"data":4,"id":257,"name":"minecraft:prismarine_stairs"},{"data":5,"id":257,"name":"minecraft:prismarine_stairs"},{"data":6,"id":257,"name":"minecraft:prismarine_stairs"},{"data":7,"id":257,"name":"minecraft:prismarine_stairs"},{"data":0,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":1,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":2,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":3,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":4,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":5,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":6,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":7,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":0,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":1,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":2,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":3,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":4,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":5,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":6,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":7,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":0,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":1,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":2,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":3,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":0,"id":261,"name":"minecraft:stripped_birch_log"},{"data":1,"id":261,"name":"minecraft:stripped_birch_log"},{"data":2,"id":261,"name":"minecraft:stripped_birch_log"},{"data":3,"id":261,"name":"minecraft:stripped_birch_log"},{"data":0,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":1,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":2,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":3,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":0,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":1,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":2,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":3,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":0,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":1,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":2,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":3,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":0,"id":265,"name":"minecraft:stripped_oak_log"},{"data":1,"id":265,"name":"minecraft:stripped_oak_log"},{"data":2,"id":265,"name":"minecraft:stripped_oak_log"},{"data":3,"id":265,"name":"minecraft:stripped_oak_log"},{"data":0,"id":266,"name":"minecraft:blue_ice"},{"data":0,"id":267,"name":"minecraft:element_1"},{"data":1,"id":267,"name":"minecraft:element_1"},{"data":2,"id":267,"name":"minecraft:element_1"},{"data":3,"id":267,"name":"minecraft:element_1"},{"data":4,"id":267,"name":"minecraft:element_1"},{"data":5,"id":267,"name":"minecraft:element_1"},{"data":6,"id":267,"name":"minecraft:element_1"},{"data":7,"id":267,"name":"minecraft:element_1"},{"data":8,"id":267,"name":"minecraft:element_1"},{"data":9,"id":267,"name":"minecraft:element_1"},{"data":10,"id":267,"name":"minecraft:element_1"},{"data":11,"id":267,"name":"minecraft:element_1"},{"data":12,"id":267,"name":"minecraft:element_1"},{"data":13,"id":267,"name":"minecraft:element_1"},{"data":14,"id":267,"name":"minecraft:element_1"},{"data":15,"id":267,"name":"minecraft:element_1"},{"data":0,"id":268,"name":"minecraft:element_2"},{"data":1,"id":268,"name":"minecraft:element_2"},{"data":2,"id":268,"name":"minecraft:element_2"},{"data":3,"id":268,"name":"minecraft:element_2"},{"data":4,"id":268,"name":"minecraft:element_2"},{"data":5,"id":268,"name":"minecraft:element_2"},{"data":6,"id":268,"name":"minecraft:element_2"},{"data":7,"id":268,"name":"minecraft:element_2"},{"data":8,"id":268,"name":"minecraft:element_2"},{"data":9,"id":268,"name":"minecraft:element_2"},{"data":10,"id":268,"name":"minecraft:element_2"},{"data":11,"id":268,"name":"minecraft:element_2"},{"data":12,"id":268,"name":"minecraft:element_2"},{"data":13,"id":268,"name":"minecraft:element_2"},{"data":14,"id":268,"name":"minecraft:element_2"},{"data":15,"id":268,"name":"minecraft:element_2"},{"data":0,"id":269,"name":"minecraft:element_3"},{"data":1,"id":269,"name":"minecraft:element_3"},{"data":2,"id":269,"name":"minecraft:element_3"},{"data":3,"id":269,"name":"minecraft:element_3"},{"data":4,"id":269,"name":"minecraft:element_3"},{"data":5,"id":269,"name":"minecraft:element_3"},{"data":6,"id":269,"name":"minecraft:element_3"},{"data":7,"id":269,"name":"minecraft:element_3"},{"data":8,"id":269,"name":"minecraft:element_3"},{"data":9,"id":269,"name":"minecraft:element_3"},{"data":10,"id":269,"name":"minecraft:element_3"},{"data":11,"id":269,"name":"minecraft:element_3"},{"data":12,"id":269,"name":"minecraft:element_3"},{"data":13,"id":269,"name":"minecraft:element_3"},{"data":14,"id":269,"name":"minecraft:element_3"},{"data":15,"id":269,"name":"minecraft:element_3"},{"data":0,"id":270,"name":"minecraft:element_4"},{"data":1,"id":270,"name":"minecraft:element_4"},{"data":2,"id":270,"name":"minecraft:element_4"},{"data":3,"id":270,"name":"minecraft:element_4"},{"data":4,"id":270,"name":"minecraft:element_4"},{"data":5,"id":270,"name":"minecraft:element_4"},{"data":6,"id":270,"name":"minecraft:element_4"},{"data":7,"id":270,"name":"minecraft:element_4"},{"data":8,"id":270,"name":"minecraft:element_4"},{"data":9,"id":270,"name":"minecraft:element_4"},{"data":10,"id":270,"name":"minecraft:element_4"},{"data":11,"id":270,"name":"minecraft:element_4"},{"data":12,"id":270,"name":"minecraft:element_4"},{"data":13,"id":270,"name":"minecraft:element_4"},{"data":14,"id":270,"name":"minecraft:element_4"},{"data":15,"id":270,"name":"minecraft:element_4"},{"data":0,"id":271,"name":"minecraft:element_5"},{"data":1,"id":271,"name":"minecraft:element_5"},{"data":2,"id":271,"name":"minecraft:element_5"},{"data":3,"id":271,"name":"minecraft:element_5"},{"data":4,"id":271,"name":"minecraft:element_5"},{"data":5,"id":271,"name":"minecraft:element_5"},{"data":6,"id":271,"name":"minecraft:element_5"},{"data":7,"id":271,"name":"minecraft:element_5"},{"data":8,"id":271,"name":"minecraft:element_5"},{"data":9,"id":271,"name":"minecraft:element_5"},{"data":10,"id":271,"name":"minecraft:element_5"},{"data":11,"id":271,"name":"minecraft:element_5"},{"data":12,"id":271,"name":"minecraft:element_5"},{"data":13,"id":271,"name":"minecraft:element_5"},{"data":14,"id":271,"name":"minecraft:element_5"},{"data":15,"id":271,"name":"minecraft:element_5"},{"data":0,"id":272,"name":"minecraft:element_6"},{"data":1,"id":272,"name":"minecraft:element_6"},{"data":2,"id":272,"name":"minecraft:element_6"},{"data":3,"id":272,"name":"minecraft:element_6"},{"data":4,"id":272,"name":"minecraft:element_6"},{"data":5,"id":272,"name":"minecraft:element_6"},{"data":6,"id":272,"name":"minecraft:element_6"},{"data":7,"id":272,"name":"minecraft:element_6"},{"data":8,"id":272,"name":"minecraft:element_6"},{"data":9,"id":272,"name":"minecraft:element_6"},{"data":10,"id":272,"name":"minecraft:element_6"},{"data":11,"id":272,"name":"minecraft:element_6"},{"data":12,"id":272,"name":"minecraft:element_6"},{"data":13,"id":272,"name":"minecraft:element_6"},{"data":14,"id":272,"name":"minecraft:element_6"},{"data":15,"id":272,"name":"minecraft:element_6"},{"data":0,"id":273,"name":"minecraft:element_7"},{"data":1,"id":273,"name":"minecraft:element_7"},{"data":2,"id":273,"name":"minecraft:element_7"},{"data":3,"id":273,"name":"minecraft:element_7"},{"data":4,"id":273,"name":"minecraft:element_7"},{"data":5,"id":273,"name":"minecraft:element_7"},{"data":6,"id":273,"name":"minecraft:element_7"},{"data":7,"id":273,"name":"minecraft:element_7"},{"data":8,"id":273,"name":"minecraft:element_7"},{"data":9,"id":273,"name":"minecraft:element_7"},{"data":10,"id":273,"name":"minecraft:element_7"},{"data":11,"id":273,"name":"minecraft:element_7"},{"data":12,"id":273,"name":"minecraft:element_7"},{"data":13,"id":273,"name":"minecraft:element_7"},{"data":14,"id":273,"name":"minecraft:element_7"},{"data":15,"id":273,"name":"minecraft:element_7"},{"data":0,"id":274,"name":"minecraft:element_8"},{"data":1,"id":274,"name":"minecraft:element_8"},{"data":2,"id":274,"name":"minecraft:element_8"},{"data":3,"id":274,"name":"minecraft:element_8"},{"data":4,"id":274,"name":"minecraft:element_8"},{"data":5,"id":274,"name":"minecraft:element_8"},{"data":6,"id":274,"name":"minecraft:element_8"},{"data":7,"id":274,"name":"minecraft:element_8"},{"data":8,"id":274,"name":"minecraft:element_8"},{"data":9,"id":274,"name":"minecraft:element_8"},{"data":10,"id":274,"name":"minecraft:element_8"},{"data":11,"id":274,"name":"minecraft:element_8"},{"data":12,"id":274,"name":"minecraft:element_8"},{"data":13,"id":274,"name":"minecraft:element_8"},{"data":14,"id":274,"name":"minecraft:element_8"},{"data":15,"id":274,"name":"minecraft:element_8"},{"data":0,"id":275,"name":"minecraft:element_9"},{"data":1,"id":275,"name":"minecraft:element_9"},{"data":2,"id":275,"name":"minecraft:element_9"},{"data":3,"id":275,"name":"minecraft:element_9"},{"data":4,"id":275,"name":"minecraft:element_9"},{"data":5,"id":275,"name":"minecraft:element_9"},{"data":6,"id":275,"name":"minecraft:element_9"},{"data":7,"id":275,"name":"minecraft:element_9"},{"data":8,"id":275,"name":"minecraft:element_9"},{"data":9,"id":275,"name":"minecraft:element_9"},{"data":10,"id":275,"name":"minecraft:element_9"},{"data":11,"id":275,"name":"minecraft:element_9"},{"data":12,"id":275,"name":"minecraft:element_9"},{"data":13,"id":275,"name":"minecraft:element_9"},{"data":14,"id":275,"name":"minecraft:element_9"},{"data":15,"id":275,"name":"minecraft:element_9"},{"data":0,"id":276,"name":"minecraft:element_10"},{"data":1,"id":276,"name":"minecraft:element_10"},{"data":2,"id":276,"name":"minecraft:element_10"},{"data":3,"id":276,"name":"minecraft:element_10"},{"data":4,"id":276,"name":"minecraft:element_10"},{"data":5,"id":276,"name":"minecraft:element_10"},{"data":6,"id":276,"name":"minecraft:element_10"},{"data":7,"id":276,"name":"minecraft:element_10"},{"data":8,"id":276,"name":"minecraft:element_10"},{"data":9,"id":276,"name":"minecraft:element_10"},{"data":10,"id":276,"name":"minecraft:element_10"},{"data":11,"id":276,"name":"minecraft:element_10"},{"data":12,"id":276,"name":"minecraft:element_10"},{"data":13,"id":276,"name":"minecraft:element_10"},{"data":14,"id":276,"name":"minecraft:element_10"},{"data":15,"id":276,"name":"minecraft:element_10"},{"data":0,"id":277,"name":"minecraft:element_11"},{"data":1,"id":277,"name":"minecraft:element_11"},{"data":2,"id":277,"name":"minecraft:element_11"},{"data":3,"id":277,"name":"minecraft:element_11"},{"data":4,"id":277,"name":"minecraft:element_11"},{"data":5,"id":277,"name":"minecraft:element_11"},{"data":6,"id":277,"name":"minecraft:element_11"},{"data":7,"id":277,"name":"minecraft:element_11"},{"data":8,"id":277,"name":"minecraft:element_11"},{"data":9,"id":277,"name":"minecraft:element_11"},{"data":10,"id":277,"name":"minecraft:element_11"},{"data":11,"id":277,"name":"minecraft:element_11"},{"data":12,"id":277,"name":"minecraft:element_11"},{"data":13,"id":277,"name":"minecraft:element_11"},{"data":14,"id":277,"name":"minecraft:element_11"},{"data":15,"id":277,"name":"minecraft:element_11"},{"data":0,"id":278,"name":"minecraft:element_12"},{"data":1,"id":278,"name":"minecraft:element_12"},{"data":2,"id":278,"name":"minecraft:element_12"},{"data":3,"id":278,"name":"minecraft:element_12"},{"data":4,"id":278,"name":"minecraft:element_12"},{"data":5,"id":278,"name":"minecraft:element_12"},{"data":6,"id":278,"name":"minecraft:element_12"},{"data":7,"id":278,"name":"minecraft:element_12"},{"data":8,"id":278,"name":"minecraft:element_12"},{"data":9,"id":278,"name":"minecraft:element_12"},{"data":10,"id":278,"name":"minecraft:element_12"},{"data":11,"id":278,"name":"minecraft:element_12"},{"data":12,"id":278,"name":"minecraft:element_12"},{"data":13,"id":278,"name":"minecraft:element_12"},{"data":14,"id":278,"name":"minecraft:element_12"},{"data":15,"id":278,"name":"minecraft:element_12"},{"data":0,"id":279,"name":"minecraft:element_13"},{"data":1,"id":279,"name":"minecraft:element_13"},{"data":2,"id":279,"name":"minecraft:element_13"},{"data":3,"id":279,"name":"minecraft:element_13"},{"data":4,"id":279,"name":"minecraft:element_13"},{"data":5,"id":279,"name":"minecraft:element_13"},{"data":6,"id":279,"name":"minecraft:element_13"},{"data":7,"id":279,"name":"minecraft:element_13"},{"data":8,"id":279,"name":"minecraft:element_13"},{"data":9,"id":279,"name":"minecraft:element_13"},{"data":10,"id":279,"name":"minecraft:element_13"},{"data":11,"id":279,"name":"minecraft:element_13"},{"data":12,"id":279,"name":"minecraft:element_13"},{"data":13,"id":279,"name":"minecraft:element_13"},{"data":14,"id":279,"name":"minecraft:element_13"},{"data":15,"id":279,"name":"minecraft:element_13"},{"data":0,"id":280,"name":"minecraft:element_14"},{"data":1,"id":280,"name":"minecraft:element_14"},{"data":2,"id":280,"name":"minecraft:element_14"},{"data":3,"id":280,"name":"minecraft:element_14"},{"data":4,"id":280,"name":"minecraft:element_14"},{"data":5,"id":280,"name":"minecraft:element_14"},{"data":6,"id":280,"name":"minecraft:element_14"},{"data":7,"id":280,"name":"minecraft:element_14"},{"data":8,"id":280,"name":"minecraft:element_14"},{"data":9,"id":280,"name":"minecraft:element_14"},{"data":10,"id":280,"name":"minecraft:element_14"},{"data":11,"id":280,"name":"minecraft:element_14"},{"data":12,"id":280,"name":"minecraft:element_14"},{"data":13,"id":280,"name":"minecraft:element_14"},{"data":14,"id":280,"name":"minecraft:element_14"},{"data":15,"id":280,"name":"minecraft:element_14"},{"data":0,"id":281,"name":"minecraft:element_15"},{"data":1,"id":281,"name":"minecraft:element_15"},{"data":2,"id":281,"name":"minecraft:element_15"},{"data":3,"id":281,"name":"minecraft:element_15"},{"data":4,"id":281,"name":"minecraft:element_15"},{"data":5,"id":281,"name":"minecraft:element_15"},{"data":6,"id":281,"name":"minecraft:element_15"},{"data":7,"id":281,"name":"minecraft:element_15"},{"data":8,"id":281,"name":"minecraft:element_15"},{"data":9,"id":281,"name":"minecraft:element_15"},{"data":10,"id":281,"name":"minecraft:element_15"},{"data":11,"id":281,"name":"minecraft:element_15"},{"data":12,"id":281,"name":"minecraft:element_15"},{"data":13,"id":281,"name":"minecraft:element_15"},{"data":14,"id":281,"name":"minecraft:element_15"},{"data":15,"id":281,"name":"minecraft:element_15"},{"data":0,"id":282,"name":"minecraft:element_16"},{"data":1,"id":282,"name":"minecraft:element_16"},{"data":2,"id":282,"name":"minecraft:element_16"},{"data":3,"id":282,"name":"minecraft:element_16"},{"data":4,"id":282,"name":"minecraft:element_16"},{"data":5,"id":282,"name":"minecraft:element_16"},{"data":6,"id":282,"name":"minecraft:element_16"},{"data":7,"id":282,"name":"minecraft:element_16"},{"data":8,"id":282,"name":"minecraft:element_16"},{"data":9,"id":282,"name":"minecraft:element_16"},{"data":10,"id":282,"name":"minecraft:element_16"},{"data":11,"id":282,"name":"minecraft:element_16"},{"data":12,"id":282,"name":"minecraft:element_16"},{"data":13,"id":282,"name":"minecraft:element_16"},{"data":14,"id":282,"name":"minecraft:element_16"},{"data":15,"id":282,"name":"minecraft:element_16"},{"data":0,"id":283,"name":"minecraft:element_17"},{"data":1,"id":283,"name":"minecraft:element_17"},{"data":2,"id":283,"name":"minecraft:element_17"},{"data":3,"id":283,"name":"minecraft:element_17"},{"data":4,"id":283,"name":"minecraft:element_17"},{"data":5,"id":283,"name":"minecraft:element_17"},{"data":6,"id":283,"name":"minecraft:element_17"},{"data":7,"id":283,"name":"minecraft:element_17"},{"data":8,"id":283,"name":"minecraft:element_17"},{"data":9,"id":283,"name":"minecraft:element_17"},{"data":10,"id":283,"name":"minecraft:element_17"},{"data":11,"id":283,"name":"minecraft:element_17"},{"data":12,"id":283,"name":"minecraft:element_17"},{"data":13,"id":283,"name":"minecraft:element_17"},{"data":14,"id":283,"name":"minecraft:element_17"},{"data":15,"id":283,"name":"minecraft:element_17"},{"data":0,"id":284,"name":"minecraft:element_18"},{"data":1,"id":284,"name":"minecraft:element_18"},{"data":2,"id":284,"name":"minecraft:element_18"},{"data":3,"id":284,"name":"minecraft:element_18"},{"data":4,"id":284,"name":"minecraft:element_18"},{"data":5,"id":284,"name":"minecraft:element_18"},{"data":6,"id":284,"name":"minecraft:element_18"},{"data":7,"id":284,"name":"minecraft:element_18"},{"data":8,"id":284,"name":"minecraft:element_18"},{"data":9,"id":284,"name":"minecraft:element_18"},{"data":10,"id":284,"name":"minecraft:element_18"},{"data":11,"id":284,"name":"minecraft:element_18"},{"data":12,"id":284,"name":"minecraft:element_18"},{"data":13,"id":284,"name":"minecraft:element_18"},{"data":14,"id":284,"name":"minecraft:element_18"},{"data":15,"id":284,"name":"minecraft:element_18"},{"data":0,"id":285,"name":"minecraft:element_19"},{"data":1,"id":285,"name":"minecraft:element_19"},{"data":2,"id":285,"name":"minecraft:element_19"},{"data":3,"id":285,"name":"minecraft:element_19"},{"data":4,"id":285,"name":"minecraft:element_19"},{"data":5,"id":285,"name":"minecraft:element_19"},{"data":6,"id":285,"name":"minecraft:element_19"},{"data":7,"id":285,"name":"minecraft:element_19"},{"data":8,"id":285,"name":"minecraft:element_19"},{"data":9,"id":285,"name":"minecraft:element_19"},{"data":10,"id":285,"name":"minecraft:element_19"},{"data":11,"id":285,"name":"minecraft:element_19"},{"data":12,"id":285,"name":"minecraft:element_19"},{"data":13,"id":285,"name":"minecraft:element_19"},{"data":14,"id":285,"name":"minecraft:element_19"},{"data":15,"id":285,"name":"minecraft:element_19"},{"data":0,"id":286,"name":"minecraft:element_20"},{"data":1,"id":286,"name":"minecraft:element_20"},{"data":2,"id":286,"name":"minecraft:element_20"},{"data":3,"id":286,"name":"minecraft:element_20"},{"data":4,"id":286,"name":"minecraft:element_20"},{"data":5,"id":286,"name":"minecraft:element_20"},{"data":6,"id":286,"name":"minecraft:element_20"},{"data":7,"id":286,"name":"minecraft:element_20"},{"data":8,"id":286,"name":"minecraft:element_20"},{"data":9,"id":286,"name":"minecraft:element_20"},{"data":10,"id":286,"name":"minecraft:element_20"},{"data":11,"id":286,"name":"minecraft:element_20"},{"data":12,"id":286,"name":"minecraft:element_20"},{"data":13,"id":286,"name":"minecraft:element_20"},{"data":14,"id":286,"name":"minecraft:element_20"},{"data":15,"id":286,"name":"minecraft:element_20"},{"data":0,"id":287,"name":"minecraft:element_21"},{"data":1,"id":287,"name":"minecraft:element_21"},{"data":2,"id":287,"name":"minecraft:element_21"},{"data":3,"id":287,"name":"minecraft:element_21"},{"data":4,"id":287,"name":"minecraft:element_21"},{"data":5,"id":287,"name":"minecraft:element_21"},{"data":6,"id":287,"name":"minecraft:element_21"},{"data":7,"id":287,"name":"minecraft:element_21"},{"data":8,"id":287,"name":"minecraft:element_21"},{"data":9,"id":287,"name":"minecraft:element_21"},{"data":10,"id":287,"name":"minecraft:element_21"},{"data":11,"id":287,"name":"minecraft:element_21"},{"data":12,"id":287,"name":"minecraft:element_21"},{"data":13,"id":287,"name":"minecraft:element_21"},{"data":14,"id":287,"name":"minecraft:element_21"},{"data":15,"id":287,"name":"minecraft:element_21"},{"data":0,"id":288,"name":"minecraft:element_22"},{"data":1,"id":288,"name":"minecraft:element_22"},{"data":2,"id":288,"name":"minecraft:element_22"},{"data":3,"id":288,"name":"minecraft:element_22"},{"data":4,"id":288,"name":"minecraft:element_22"},{"data":5,"id":288,"name":"minecraft:element_22"},{"data":6,"id":288,"name":"minecraft:element_22"},{"data":7,"id":288,"name":"minecraft:element_22"},{"data":8,"id":288,"name":"minecraft:element_22"},{"data":9,"id":288,"name":"minecraft:element_22"},{"data":10,"id":288,"name":"minecraft:element_22"},{"data":11,"id":288,"name":"minecraft:element_22"},{"data":12,"id":288,"name":"minecraft:element_22"},{"data":13,"id":288,"name":"minecraft:element_22"},{"data":14,"id":288,"name":"minecraft:element_22"},{"data":15,"id":288,"name":"minecraft:element_22"},{"data":0,"id":289,"name":"minecraft:element_23"},{"data":1,"id":289,"name":"minecraft:element_23"},{"data":2,"id":289,"name":"minecraft:element_23"},{"data":3,"id":289,"name":"minecraft:element_23"},{"data":4,"id":289,"name":"minecraft:element_23"},{"data":5,"id":289,"name":"minecraft:element_23"},{"data":6,"id":289,"name":"minecraft:element_23"},{"data":7,"id":289,"name":"minecraft:element_23"},{"data":8,"id":289,"name":"minecraft:element_23"},{"data":9,"id":289,"name":"minecraft:element_23"},{"data":10,"id":289,"name":"minecraft:element_23"},{"data":11,"id":289,"name":"minecraft:element_23"},{"data":12,"id":289,"name":"minecraft:element_23"},{"data":13,"id":289,"name":"minecraft:element_23"},{"data":14,"id":289,"name":"minecraft:element_23"},{"data":15,"id":289,"name":"minecraft:element_23"},{"data":0,"id":290,"name":"minecraft:element_24"},{"data":1,"id":290,"name":"minecraft:element_24"},{"data":2,"id":290,"name":"minecraft:element_24"},{"data":3,"id":290,"name":"minecraft:element_24"},{"data":4,"id":290,"name":"minecraft:element_24"},{"data":5,"id":290,"name":"minecraft:element_24"},{"data":6,"id":290,"name":"minecraft:element_24"},{"data":7,"id":290,"name":"minecraft:element_24"},{"data":8,"id":290,"name":"minecraft:element_24"},{"data":9,"id":290,"name":"minecraft:element_24"},{"data":10,"id":290,"name":"minecraft:element_24"},{"data":11,"id":290,"name":"minecraft:element_24"},{"data":12,"id":290,"name":"minecraft:element_24"},{"data":13,"id":290,"name":"minecraft:element_24"},{"data":14,"id":290,"name":"minecraft:element_24"},{"data":15,"id":290,"name":"minecraft:element_24"},{"data":0,"id":291,"name":"minecraft:element_25"},{"data":1,"id":291,"name":"minecraft:element_25"},{"data":2,"id":291,"name":"minecraft:element_25"},{"data":3,"id":291,"name":"minecraft:element_25"},{"data":4,"id":291,"name":"minecraft:element_25"},{"data":5,"id":291,"name":"minecraft:element_25"},{"data":6,"id":291,"name":"minecraft:element_25"},{"data":7,"id":291,"name":"minecraft:element_25"},{"data":8,"id":291,"name":"minecraft:element_25"},{"data":9,"id":291,"name":"minecraft:element_25"},{"data":10,"id":291,"name":"minecraft:element_25"},{"data":11,"id":291,"name":"minecraft:element_25"},{"data":12,"id":291,"name":"minecraft:element_25"},{"data":13,"id":291,"name":"minecraft:element_25"},{"data":14,"id":291,"name":"minecraft:element_25"},{"data":15,"id":291,"name":"minecraft:element_25"},{"data":0,"id":292,"name":"minecraft:element_26"},{"data":1,"id":292,"name":"minecraft:element_26"},{"data":2,"id":292,"name":"minecraft:element_26"},{"data":3,"id":292,"name":"minecraft:element_26"},{"data":4,"id":292,"name":"minecraft:element_26"},{"data":5,"id":292,"name":"minecraft:element_26"},{"data":6,"id":292,"name":"minecraft:element_26"},{"data":7,"id":292,"name":"minecraft:element_26"},{"data":8,"id":292,"name":"minecraft:element_26"},{"data":9,"id":292,"name":"minecraft:element_26"},{"data":10,"id":292,"name":"minecraft:element_26"},{"data":11,"id":292,"name":"minecraft:element_26"},{"data":12,"id":292,"name":"minecraft:element_26"},{"data":13,"id":292,"name":"minecraft:element_26"},{"data":14,"id":292,"name":"minecraft:element_26"},{"data":15,"id":292,"name":"minecraft:element_26"},{"data":0,"id":293,"name":"minecraft:element_27"},{"data":1,"id":293,"name":"minecraft:element_27"},{"data":2,"id":293,"name":"minecraft:element_27"},{"data":3,"id":293,"name":"minecraft:element_27"},{"data":4,"id":293,"name":"minecraft:element_27"},{"data":5,"id":293,"name":"minecraft:element_27"},{"data":6,"id":293,"name":"minecraft:element_27"},{"data":7,"id":293,"name":"minecraft:element_27"},{"data":8,"id":293,"name":"minecraft:element_27"},{"data":9,"id":293,"name":"minecraft:element_27"},{"data":10,"id":293,"name":"minecraft:element_27"},{"data":11,"id":293,"name":"minecraft:element_27"},{"data":12,"id":293,"name":"minecraft:element_27"},{"data":13,"id":293,"name":"minecraft:element_27"},{"data":14,"id":293,"name":"minecraft:element_27"},{"data":15,"id":293,"name":"minecraft:element_27"},{"data":0,"id":294,"name":"minecraft:element_28"},{"data":1,"id":294,"name":"minecraft:element_28"},{"data":2,"id":294,"name":"minecraft:element_28"},{"data":3,"id":294,"name":"minecraft:element_28"},{"data":4,"id":294,"name":"minecraft:element_28"},{"data":5,"id":294,"name":"minecraft:element_28"},{"data":6,"id":294,"name":"minecraft:element_28"},{"data":7,"id":294,"name":"minecraft:element_28"},{"data":8,"id":294,"name":"minecraft:element_28"},{"data":9,"id":294,"name":"minecraft:element_28"},{"data":10,"id":294,"name":"minecraft:element_28"},{"data":11,"id":294,"name":"minecraft:element_28"},{"data":12,"id":294,"name":"minecraft:element_28"},{"data":13,"id":294,"name":"minecraft:element_28"},{"data":14,"id":294,"name":"minecraft:element_28"},{"data":15,"id":294,"name":"minecraft:element_28"},{"data":0,"id":295,"name":"minecraft:element_29"},{"data":1,"id":295,"name":"minecraft:element_29"},{"data":2,"id":295,"name":"minecraft:element_29"},{"data":3,"id":295,"name":"minecraft:element_29"},{"data":4,"id":295,"name":"minecraft:element_29"},{"data":5,"id":295,"name":"minecraft:element_29"},{"data":6,"id":295,"name":"minecraft:element_29"},{"data":7,"id":295,"name":"minecraft:element_29"},{"data":8,"id":295,"name":"minecraft:element_29"},{"data":9,"id":295,"name":"minecraft:element_29"},{"data":10,"id":295,"name":"minecraft:element_29"},{"data":11,"id":295,"name":"minecraft:element_29"},{"data":12,"id":295,"name":"minecraft:element_29"},{"data":13,"id":295,"name":"minecraft:element_29"},{"data":14,"id":295,"name":"minecraft:element_29"},{"data":15,"id":295,"name":"minecraft:element_29"},{"data":0,"id":296,"name":"minecraft:element_30"},{"data":1,"id":296,"name":"minecraft:element_30"},{"data":2,"id":296,"name":"minecraft:element_30"},{"data":3,"id":296,"name":"minecraft:element_30"},{"data":4,"id":296,"name":"minecraft:element_30"},{"data":5,"id":296,"name":"minecraft:element_30"},{"data":6,"id":296,"name":"minecraft:element_30"},{"data":7,"id":296,"name":"minecraft:element_30"},{"data":8,"id":296,"name":"minecraft:element_30"},{"data":9,"id":296,"name":"minecraft:element_30"},{"data":10,"id":296,"name":"minecraft:element_30"},{"data":11,"id":296,"name":"minecraft:element_30"},{"data":12,"id":296,"name":"minecraft:element_30"},{"data":13,"id":296,"name":"minecraft:element_30"},{"data":14,"id":296,"name":"minecraft:element_30"},{"data":15,"id":296,"name":"minecraft:element_30"},{"data":0,"id":297,"name":"minecraft:element_31"},{"data":1,"id":297,"name":"minecraft:element_31"},{"data":2,"id":297,"name":"minecraft:element_31"},{"data":3,"id":297,"name":"minecraft:element_31"},{"data":4,"id":297,"name":"minecraft:element_31"},{"data":5,"id":297,"name":"minecraft:element_31"},{"data":6,"id":297,"name":"minecraft:element_31"},{"data":7,"id":297,"name":"minecraft:element_31"},{"data":8,"id":297,"name":"minecraft:element_31"},{"data":9,"id":297,"name":"minecraft:element_31"},{"data":10,"id":297,"name":"minecraft:element_31"},{"data":11,"id":297,"name":"minecraft:element_31"},{"data":12,"id":297,"name":"minecraft:element_31"},{"data":13,"id":297,"name":"minecraft:element_31"},{"data":14,"id":297,"name":"minecraft:element_31"},{"data":15,"id":297,"name":"minecraft:element_31"},{"data":0,"id":298,"name":"minecraft:element_32"},{"data":1,"id":298,"name":"minecraft:element_32"},{"data":2,"id":298,"name":"minecraft:element_32"},{"data":3,"id":298,"name":"minecraft:element_32"},{"data":4,"id":298,"name":"minecraft:element_32"},{"data":5,"id":298,"name":"minecraft:element_32"},{"data":6,"id":298,"name":"minecraft:element_32"},{"data":7,"id":298,"name":"minecraft:element_32"},{"data":8,"id":298,"name":"minecraft:element_32"},{"data":9,"id":298,"name":"minecraft:element_32"},{"data":10,"id":298,"name":"minecraft:element_32"},{"data":11,"id":298,"name":"minecraft:element_32"},{"data":12,"id":298,"name":"minecraft:element_32"},{"data":13,"id":298,"name":"minecraft:element_32"},{"data":14,"id":298,"name":"minecraft:element_32"},{"data":15,"id":298,"name":"minecraft:element_32"},{"data":0,"id":299,"name":"minecraft:element_33"},{"data":1,"id":299,"name":"minecraft:element_33"},{"data":2,"id":299,"name":"minecraft:element_33"},{"data":3,"id":299,"name":"minecraft:element_33"},{"data":4,"id":299,"name":"minecraft:element_33"},{"data":5,"id":299,"name":"minecraft:element_33"},{"data":6,"id":299,"name":"minecraft:element_33"},{"data":7,"id":299,"name":"minecraft:element_33"},{"data":8,"id":299,"name":"minecraft:element_33"},{"data":9,"id":299,"name":"minecraft:element_33"},{"data":10,"id":299,"name":"minecraft:element_33"},{"data":11,"id":299,"name":"minecraft:element_33"},{"data":12,"id":299,"name":"minecraft:element_33"},{"data":13,"id":299,"name":"minecraft:element_33"},{"data":14,"id":299,"name":"minecraft:element_33"},{"data":15,"id":299,"name":"minecraft:element_33"},{"data":0,"id":300,"name":"minecraft:element_34"},{"data":1,"id":300,"name":"minecraft:element_34"},{"data":2,"id":300,"name":"minecraft:element_34"},{"data":3,"id":300,"name":"minecraft:element_34"},{"data":4,"id":300,"name":"minecraft:element_34"},{"data":5,"id":300,"name":"minecraft:element_34"},{"data":6,"id":300,"name":"minecraft:element_34"},{"data":7,"id":300,"name":"minecraft:element_34"},{"data":8,"id":300,"name":"minecraft:element_34"},{"data":9,"id":300,"name":"minecraft:element_34"},{"data":10,"id":300,"name":"minecraft:element_34"},{"data":11,"id":300,"name":"minecraft:element_34"},{"data":12,"id":300,"name":"minecraft:element_34"},{"data":13,"id":300,"name":"minecraft:element_34"},{"data":14,"id":300,"name":"minecraft:element_34"},{"data":15,"id":300,"name":"minecraft:element_34"},{"data":0,"id":301,"name":"minecraft:element_35"},{"data":1,"id":301,"name":"minecraft:element_35"},{"data":2,"id":301,"name":"minecraft:element_35"},{"data":3,"id":301,"name":"minecraft:element_35"},{"data":4,"id":301,"name":"minecraft:element_35"},{"data":5,"id":301,"name":"minecraft:element_35"},{"data":6,"id":301,"name":"minecraft:element_35"},{"data":7,"id":301,"name":"minecraft:element_35"},{"data":8,"id":301,"name":"minecraft:element_35"},{"data":9,"id":301,"name":"minecraft:element_35"},{"data":10,"id":301,"name":"minecraft:element_35"},{"data":11,"id":301,"name":"minecraft:element_35"},{"data":12,"id":301,"name":"minecraft:element_35"},{"data":13,"id":301,"name":"minecraft:element_35"},{"data":14,"id":301,"name":"minecraft:element_35"},{"data":15,"id":301,"name":"minecraft:element_35"},{"data":0,"id":302,"name":"minecraft:element_36"},{"data":1,"id":302,"name":"minecraft:element_36"},{"data":2,"id":302,"name":"minecraft:element_36"},{"data":3,"id":302,"name":"minecraft:element_36"},{"data":4,"id":302,"name":"minecraft:element_36"},{"data":5,"id":302,"name":"minecraft:element_36"},{"data":6,"id":302,"name":"minecraft:element_36"},{"data":7,"id":302,"name":"minecraft:element_36"},{"data":8,"id":302,"name":"minecraft:element_36"},{"data":9,"id":302,"name":"minecraft:element_36"},{"data":10,"id":302,"name":"minecraft:element_36"},{"data":11,"id":302,"name":"minecraft:element_36"},{"data":12,"id":302,"name":"minecraft:element_36"},{"data":13,"id":302,"name":"minecraft:element_36"},{"data":14,"id":302,"name":"minecraft:element_36"},{"data":15,"id":302,"name":"minecraft:element_36"},{"data":0,"id":303,"name":"minecraft:element_37"},{"data":1,"id":303,"name":"minecraft:element_37"},{"data":2,"id":303,"name":"minecraft:element_37"},{"data":3,"id":303,"name":"minecraft:element_37"},{"data":4,"id":303,"name":"minecraft:element_37"},{"data":5,"id":303,"name":"minecraft:element_37"},{"data":6,"id":303,"name":"minecraft:element_37"},{"data":7,"id":303,"name":"minecraft:element_37"},{"data":8,"id":303,"name":"minecraft:element_37"},{"data":9,"id":303,"name":"minecraft:element_37"},{"data":10,"id":303,"name":"minecraft:element_37"},{"data":11,"id":303,"name":"minecraft:element_37"},{"data":12,"id":303,"name":"minecraft:element_37"},{"data":13,"id":303,"name":"minecraft:element_37"},{"data":14,"id":303,"name":"minecraft:element_37"},{"data":15,"id":303,"name":"minecraft:element_37"},{"data":0,"id":304,"name":"minecraft:element_38"},{"data":1,"id":304,"name":"minecraft:element_38"},{"data":2,"id":304,"name":"minecraft:element_38"},{"data":3,"id":304,"name":"minecraft:element_38"},{"data":4,"id":304,"name":"minecraft:element_38"},{"data":5,"id":304,"name":"minecraft:element_38"},{"data":6,"id":304,"name":"minecraft:element_38"},{"data":7,"id":304,"name":"minecraft:element_38"},{"data":8,"id":304,"name":"minecraft:element_38"},{"data":9,"id":304,"name":"minecraft:element_38"},{"data":10,"id":304,"name":"minecraft:element_38"},{"data":11,"id":304,"name":"minecraft:element_38"},{"data":12,"id":304,"name":"minecraft:element_38"},{"data":13,"id":304,"name":"minecraft:element_38"},{"data":14,"id":304,"name":"minecraft:element_38"},{"data":15,"id":304,"name":"minecraft:element_38"},{"data":0,"id":305,"name":"minecraft:element_39"},{"data":1,"id":305,"name":"minecraft:element_39"},{"data":2,"id":305,"name":"minecraft:element_39"},{"data":3,"id":305,"name":"minecraft:element_39"},{"data":4,"id":305,"name":"minecraft:element_39"},{"data":5,"id":305,"name":"minecraft:element_39"},{"data":6,"id":305,"name":"minecraft:element_39"},{"data":7,"id":305,"name":"minecraft:element_39"},{"data":8,"id":305,"name":"minecraft:element_39"},{"data":9,"id":305,"name":"minecraft:element_39"},{"data":10,"id":305,"name":"minecraft:element_39"},{"data":11,"id":305,"name":"minecraft:element_39"},{"data":12,"id":305,"name":"minecraft:element_39"},{"data":13,"id":305,"name":"minecraft:element_39"},{"data":14,"id":305,"name":"minecraft:element_39"},{"data":15,"id":305,"name":"minecraft:element_39"},{"data":0,"id":306,"name":"minecraft:element_40"},{"data":1,"id":306,"name":"minecraft:element_40"},{"data":2,"id":306,"name":"minecraft:element_40"},{"data":3,"id":306,"name":"minecraft:element_40"},{"data":4,"id":306,"name":"minecraft:element_40"},{"data":5,"id":306,"name":"minecraft:element_40"},{"data":6,"id":306,"name":"minecraft:element_40"},{"data":7,"id":306,"name":"minecraft:element_40"},{"data":8,"id":306,"name":"minecraft:element_40"},{"data":9,"id":306,"name":"minecraft:element_40"},{"data":10,"id":306,"name":"minecraft:element_40"},{"data":11,"id":306,"name":"minecraft:element_40"},{"data":12,"id":306,"name":"minecraft:element_40"},{"data":13,"id":306,"name":"minecraft:element_40"},{"data":14,"id":306,"name":"minecraft:element_40"},{"data":15,"id":306,"name":"minecraft:element_40"},{"data":0,"id":307,"name":"minecraft:element_41"},{"data":1,"id":307,"name":"minecraft:element_41"},{"data":2,"id":307,"name":"minecraft:element_41"},{"data":3,"id":307,"name":"minecraft:element_41"},{"data":4,"id":307,"name":"minecraft:element_41"},{"data":5,"id":307,"name":"minecraft:element_41"},{"data":6,"id":307,"name":"minecraft:element_41"},{"data":7,"id":307,"name":"minecraft:element_41"},{"data":8,"id":307,"name":"minecraft:element_41"},{"data":9,"id":307,"name":"minecraft:element_41"},{"data":10,"id":307,"name":"minecraft:element_41"},{"data":11,"id":307,"name":"minecraft:element_41"},{"data":12,"id":307,"name":"minecraft:element_41"},{"data":13,"id":307,"name":"minecraft:element_41"},{"data":14,"id":307,"name":"minecraft:element_41"},{"data":15,"id":307,"name":"minecraft:element_41"},{"data":0,"id":308,"name":"minecraft:element_42"},{"data":1,"id":308,"name":"minecraft:element_42"},{"data":2,"id":308,"name":"minecraft:element_42"},{"data":3,"id":308,"name":"minecraft:element_42"},{"data":4,"id":308,"name":"minecraft:element_42"},{"data":5,"id":308,"name":"minecraft:element_42"},{"data":6,"id":308,"name":"minecraft:element_42"},{"data":7,"id":308,"name":"minecraft:element_42"},{"data":8,"id":308,"name":"minecraft:element_42"},{"data":9,"id":308,"name":"minecraft:element_42"},{"data":10,"id":308,"name":"minecraft:element_42"},{"data":11,"id":308,"name":"minecraft:element_42"},{"data":12,"id":308,"name":"minecraft:element_42"},{"data":13,"id":308,"name":"minecraft:element_42"},{"data":14,"id":308,"name":"minecraft:element_42"},{"data":15,"id":308,"name":"minecraft:element_42"},{"data":0,"id":309,"name":"minecraft:element_43"},{"data":1,"id":309,"name":"minecraft:element_43"},{"data":2,"id":309,"name":"minecraft:element_43"},{"data":3,"id":309,"name":"minecraft:element_43"},{"data":4,"id":309,"name":"minecraft:element_43"},{"data":5,"id":309,"name":"minecraft:element_43"},{"data":6,"id":309,"name":"minecraft:element_43"},{"data":7,"id":309,"name":"minecraft:element_43"},{"data":8,"id":309,"name":"minecraft:element_43"},{"data":9,"id":309,"name":"minecraft:element_43"},{"data":10,"id":309,"name":"minecraft:element_43"},{"data":11,"id":309,"name":"minecraft:element_43"},{"data":12,"id":309,"name":"minecraft:element_43"},{"data":13,"id":309,"name":"minecraft:element_43"},{"data":14,"id":309,"name":"minecraft:element_43"},{"data":15,"id":309,"name":"minecraft:element_43"},{"data":0,"id":310,"name":"minecraft:element_44"},{"data":1,"id":310,"name":"minecraft:element_44"},{"data":2,"id":310,"name":"minecraft:element_44"},{"data":3,"id":310,"name":"minecraft:element_44"},{"data":4,"id":310,"name":"minecraft:element_44"},{"data":5,"id":310,"name":"minecraft:element_44"},{"data":6,"id":310,"name":"minecraft:element_44"},{"data":7,"id":310,"name":"minecraft:element_44"},{"data":8,"id":310,"name":"minecraft:element_44"},{"data":9,"id":310,"name":"minecraft:element_44"},{"data":10,"id":310,"name":"minecraft:element_44"},{"data":11,"id":310,"name":"minecraft:element_44"},{"data":12,"id":310,"name":"minecraft:element_44"},{"data":13,"id":310,"name":"minecraft:element_44"},{"data":14,"id":310,"name":"minecraft:element_44"},{"data":15,"id":310,"name":"minecraft:element_44"},{"data":0,"id":311,"name":"minecraft:element_45"},{"data":1,"id":311,"name":"minecraft:element_45"},{"data":2,"id":311,"name":"minecraft:element_45"},{"data":3,"id":311,"name":"minecraft:element_45"},{"data":4,"id":311,"name":"minecraft:element_45"},{"data":5,"id":311,"name":"minecraft:element_45"},{"data":6,"id":311,"name":"minecraft:element_45"},{"data":7,"id":311,"name":"minecraft:element_45"},{"data":8,"id":311,"name":"minecraft:element_45"},{"data":9,"id":311,"name":"minecraft:element_45"},{"data":10,"id":311,"name":"minecraft:element_45"},{"data":11,"id":311,"name":"minecraft:element_45"},{"data":12,"id":311,"name":"minecraft:element_45"},{"data":13,"id":311,"name":"minecraft:element_45"},{"data":14,"id":311,"name":"minecraft:element_45"},{"data":15,"id":311,"name":"minecraft:element_45"},{"data":0,"id":312,"name":"minecraft:element_46"},{"data":1,"id":312,"name":"minecraft:element_46"},{"data":2,"id":312,"name":"minecraft:element_46"},{"data":3,"id":312,"name":"minecraft:element_46"},{"data":4,"id":312,"name":"minecraft:element_46"},{"data":5,"id":312,"name":"minecraft:element_46"},{"data":6,"id":312,"name":"minecraft:element_46"},{"data":7,"id":312,"name":"minecraft:element_46"},{"data":8,"id":312,"name":"minecraft:element_46"},{"data":9,"id":312,"name":"minecraft:element_46"},{"data":10,"id":312,"name":"minecraft:element_46"},{"data":11,"id":312,"name":"minecraft:element_46"},{"data":12,"id":312,"name":"minecraft:element_46"},{"data":13,"id":312,"name":"minecraft:element_46"},{"data":14,"id":312,"name":"minecraft:element_46"},{"data":15,"id":312,"name":"minecraft:element_46"},{"data":0,"id":313,"name":"minecraft:element_47"},{"data":1,"id":313,"name":"minecraft:element_47"},{"data":2,"id":313,"name":"minecraft:element_47"},{"data":3,"id":313,"name":"minecraft:element_47"},{"data":4,"id":313,"name":"minecraft:element_47"},{"data":5,"id":313,"name":"minecraft:element_47"},{"data":6,"id":313,"name":"minecraft:element_47"},{"data":7,"id":313,"name":"minecraft:element_47"},{"data":8,"id":313,"name":"minecraft:element_47"},{"data":9,"id":313,"name":"minecraft:element_47"},{"data":10,"id":313,"name":"minecraft:element_47"},{"data":11,"id":313,"name":"minecraft:element_47"},{"data":12,"id":313,"name":"minecraft:element_47"},{"data":13,"id":313,"name":"minecraft:element_47"},{"data":14,"id":313,"name":"minecraft:element_47"},{"data":15,"id":313,"name":"minecraft:element_47"},{"data":0,"id":314,"name":"minecraft:element_48"},{"data":1,"id":314,"name":"minecraft:element_48"},{"data":2,"id":314,"name":"minecraft:element_48"},{"data":3,"id":314,"name":"minecraft:element_48"},{"data":4,"id":314,"name":"minecraft:element_48"},{"data":5,"id":314,"name":"minecraft:element_48"},{"data":6,"id":314,"name":"minecraft:element_48"},{"data":7,"id":314,"name":"minecraft:element_48"},{"data":8,"id":314,"name":"minecraft:element_48"},{"data":9,"id":314,"name":"minecraft:element_48"},{"data":10,"id":314,"name":"minecraft:element_48"},{"data":11,"id":314,"name":"minecraft:element_48"},{"data":12,"id":314,"name":"minecraft:element_48"},{"data":13,"id":314,"name":"minecraft:element_48"},{"data":14,"id":314,"name":"minecraft:element_48"},{"data":15,"id":314,"name":"minecraft:element_48"},{"data":0,"id":315,"name":"minecraft:element_49"},{"data":1,"id":315,"name":"minecraft:element_49"},{"data":2,"id":315,"name":"minecraft:element_49"},{"data":3,"id":315,"name":"minecraft:element_49"},{"data":4,"id":315,"name":"minecraft:element_49"},{"data":5,"id":315,"name":"minecraft:element_49"},{"data":6,"id":315,"name":"minecraft:element_49"},{"data":7,"id":315,"name":"minecraft:element_49"},{"data":8,"id":315,"name":"minecraft:element_49"},{"data":9,"id":315,"name":"minecraft:element_49"},{"data":10,"id":315,"name":"minecraft:element_49"},{"data":11,"id":315,"name":"minecraft:element_49"},{"data":12,"id":315,"name":"minecraft:element_49"},{"data":13,"id":315,"name":"minecraft:element_49"},{"data":14,"id":315,"name":"minecraft:element_49"},{"data":15,"id":315,"name":"minecraft:element_49"},{"data":0,"id":316,"name":"minecraft:element_50"},{"data":1,"id":316,"name":"minecraft:element_50"},{"data":2,"id":316,"name":"minecraft:element_50"},{"data":3,"id":316,"name":"minecraft:element_50"},{"data":4,"id":316,"name":"minecraft:element_50"},{"data":5,"id":316,"name":"minecraft:element_50"},{"data":6,"id":316,"name":"minecraft:element_50"},{"data":7,"id":316,"name":"minecraft:element_50"},{"data":8,"id":316,"name":"minecraft:element_50"},{"data":9,"id":316,"name":"minecraft:element_50"},{"data":10,"id":316,"name":"minecraft:element_50"},{"data":11,"id":316,"name":"minecraft:element_50"},{"data":12,"id":316,"name":"minecraft:element_50"},{"data":13,"id":316,"name":"minecraft:element_50"},{"data":14,"id":316,"name":"minecraft:element_50"},{"data":15,"id":316,"name":"minecraft:element_50"},{"data":0,"id":317,"name":"minecraft:element_51"},{"data":1,"id":317,"name":"minecraft:element_51"},{"data":2,"id":317,"name":"minecraft:element_51"},{"data":3,"id":317,"name":"minecraft:element_51"},{"data":4,"id":317,"name":"minecraft:element_51"},{"data":5,"id":317,"name":"minecraft:element_51"},{"data":6,"id":317,"name":"minecraft:element_51"},{"data":7,"id":317,"name":"minecraft:element_51"},{"data":8,"id":317,"name":"minecraft:element_51"},{"data":9,"id":317,"name":"minecraft:element_51"},{"data":10,"id":317,"name":"minecraft:element_51"},{"data":11,"id":317,"name":"minecraft:element_51"},{"data":12,"id":317,"name":"minecraft:element_51"},{"data":13,"id":317,"name":"minecraft:element_51"},{"data":14,"id":317,"name":"minecraft:element_51"},{"data":15,"id":317,"name":"minecraft:element_51"},{"data":0,"id":318,"name":"minecraft:element_52"},{"data":1,"id":318,"name":"minecraft:element_52"},{"data":2,"id":318,"name":"minecraft:element_52"},{"data":3,"id":318,"name":"minecraft:element_52"},{"data":4,"id":318,"name":"minecraft:element_52"},{"data":5,"id":318,"name":"minecraft:element_52"},{"data":6,"id":318,"name":"minecraft:element_52"},{"data":7,"id":318,"name":"minecraft:element_52"},{"data":8,"id":318,"name":"minecraft:element_52"},{"data":9,"id":318,"name":"minecraft:element_52"},{"data":10,"id":318,"name":"minecraft:element_52"},{"data":11,"id":318,"name":"minecraft:element_52"},{"data":12,"id":318,"name":"minecraft:element_52"},{"data":13,"id":318,"name":"minecraft:element_52"},{"data":14,"id":318,"name":"minecraft:element_52"},{"data":15,"id":318,"name":"minecraft:element_52"},{"data":0,"id":319,"name":"minecraft:element_53"},{"data":1,"id":319,"name":"minecraft:element_53"},{"data":2,"id":319,"name":"minecraft:element_53"},{"data":3,"id":319,"name":"minecraft:element_53"},{"data":4,"id":319,"name":"minecraft:element_53"},{"data":5,"id":319,"name":"minecraft:element_53"},{"data":6,"id":319,"name":"minecraft:element_53"},{"data":7,"id":319,"name":"minecraft:element_53"},{"data":8,"id":319,"name":"minecraft:element_53"},{"data":9,"id":319,"name":"minecraft:element_53"},{"data":10,"id":319,"name":"minecraft:element_53"},{"data":11,"id":319,"name":"minecraft:element_53"},{"data":12,"id":319,"name":"minecraft:element_53"},{"data":13,"id":319,"name":"minecraft:element_53"},{"data":14,"id":319,"name":"minecraft:element_53"},{"data":15,"id":319,"name":"minecraft:element_53"},{"data":0,"id":320,"name":"minecraft:element_54"},{"data":1,"id":320,"name":"minecraft:element_54"},{"data":2,"id":320,"name":"minecraft:element_54"},{"data":3,"id":320,"name":"minecraft:element_54"},{"data":4,"id":320,"name":"minecraft:element_54"},{"data":5,"id":320,"name":"minecraft:element_54"},{"data":6,"id":320,"name":"minecraft:element_54"},{"data":7,"id":320,"name":"minecraft:element_54"},{"data":8,"id":320,"name":"minecraft:element_54"},{"data":9,"id":320,"name":"minecraft:element_54"},{"data":10,"id":320,"name":"minecraft:element_54"},{"data":11,"id":320,"name":"minecraft:element_54"},{"data":12,"id":320,"name":"minecraft:element_54"},{"data":13,"id":320,"name":"minecraft:element_54"},{"data":14,"id":320,"name":"minecraft:element_54"},{"data":15,"id":320,"name":"minecraft:element_54"},{"data":0,"id":321,"name":"minecraft:element_55"},{"data":1,"id":321,"name":"minecraft:element_55"},{"data":2,"id":321,"name":"minecraft:element_55"},{"data":3,"id":321,"name":"minecraft:element_55"},{"data":4,"id":321,"name":"minecraft:element_55"},{"data":5,"id":321,"name":"minecraft:element_55"},{"data":6,"id":321,"name":"minecraft:element_55"},{"data":7,"id":321,"name":"minecraft:element_55"},{"data":8,"id":321,"name":"minecraft:element_55"},{"data":9,"id":321,"name":"minecraft:element_55"},{"data":10,"id":321,"name":"minecraft:element_55"},{"data":11,"id":321,"name":"minecraft:element_55"},{"data":12,"id":321,"name":"minecraft:element_55"},{"data":13,"id":321,"name":"minecraft:element_55"},{"data":14,"id":321,"name":"minecraft:element_55"},{"data":15,"id":321,"name":"minecraft:element_55"},{"data":0,"id":322,"name":"minecraft:element_56"},{"data":1,"id":322,"name":"minecraft:element_56"},{"data":2,"id":322,"name":"minecraft:element_56"},{"data":3,"id":322,"name":"minecraft:element_56"},{"data":4,"id":322,"name":"minecraft:element_56"},{"data":5,"id":322,"name":"minecraft:element_56"},{"data":6,"id":322,"name":"minecraft:element_56"},{"data":7,"id":322,"name":"minecraft:element_56"},{"data":8,"id":322,"name":"minecraft:element_56"},{"data":9,"id":322,"name":"minecraft:element_56"},{"data":10,"id":322,"name":"minecraft:element_56"},{"data":11,"id":322,"name":"minecraft:element_56"},{"data":12,"id":322,"name":"minecraft:element_56"},{"data":13,"id":322,"name":"minecraft:element_56"},{"data":14,"id":322,"name":"minecraft:element_56"},{"data":15,"id":322,"name":"minecraft:element_56"},{"data":0,"id":323,"name":"minecraft:element_57"},{"data":1,"id":323,"name":"minecraft:element_57"},{"data":2,"id":323,"name":"minecraft:element_57"},{"data":3,"id":323,"name":"minecraft:element_57"},{"data":4,"id":323,"name":"minecraft:element_57"},{"data":5,"id":323,"name":"minecraft:element_57"},{"data":6,"id":323,"name":"minecraft:element_57"},{"data":7,"id":323,"name":"minecraft:element_57"},{"data":8,"id":323,"name":"minecraft:element_57"},{"data":9,"id":323,"name":"minecraft:element_57"},{"data":10,"id":323,"name":"minecraft:element_57"},{"data":11,"id":323,"name":"minecraft:element_57"},{"data":12,"id":323,"name":"minecraft:element_57"},{"data":13,"id":323,"name":"minecraft:element_57"},{"data":14,"id":323,"name":"minecraft:element_57"},{"data":15,"id":323,"name":"minecraft:element_57"},{"data":0,"id":324,"name":"minecraft:element_58"},{"data":1,"id":324,"name":"minecraft:element_58"},{"data":2,"id":324,"name":"minecraft:element_58"},{"data":3,"id":324,"name":"minecraft:element_58"},{"data":4,"id":324,"name":"minecraft:element_58"},{"data":5,"id":324,"name":"minecraft:element_58"},{"data":6,"id":324,"name":"minecraft:element_58"},{"data":7,"id":324,"name":"minecraft:element_58"},{"data":8,"id":324,"name":"minecraft:element_58"},{"data":9,"id":324,"name":"minecraft:element_58"},{"data":10,"id":324,"name":"minecraft:element_58"},{"data":11,"id":324,"name":"minecraft:element_58"},{"data":12,"id":324,"name":"minecraft:element_58"},{"data":13,"id":324,"name":"minecraft:element_58"},{"data":14,"id":324,"name":"minecraft:element_58"},{"data":15,"id":324,"name":"minecraft:element_58"},{"data":0,"id":325,"name":"minecraft:element_59"},{"data":1,"id":325,"name":"minecraft:element_59"},{"data":2,"id":325,"name":"minecraft:element_59"},{"data":3,"id":325,"name":"minecraft:element_59"},{"data":4,"id":325,"name":"minecraft:element_59"},{"data":5,"id":325,"name":"minecraft:element_59"},{"data":6,"id":325,"name":"minecraft:element_59"},{"data":7,"id":325,"name":"minecraft:element_59"},{"data":8,"id":325,"name":"minecraft:element_59"},{"data":9,"id":325,"name":"minecraft:element_59"},{"data":10,"id":325,"name":"minecraft:element_59"},{"data":11,"id":325,"name":"minecraft:element_59"},{"data":12,"id":325,"name":"minecraft:element_59"},{"data":13,"id":325,"name":"minecraft:element_59"},{"data":14,"id":325,"name":"minecraft:element_59"},{"data":15,"id":325,"name":"minecraft:element_59"},{"data":0,"id":326,"name":"minecraft:element_60"},{"data":1,"id":326,"name":"minecraft:element_60"},{"data":2,"id":326,"name":"minecraft:element_60"},{"data":3,"id":326,"name":"minecraft:element_60"},{"data":4,"id":326,"name":"minecraft:element_60"},{"data":5,"id":326,"name":"minecraft:element_60"},{"data":6,"id":326,"name":"minecraft:element_60"},{"data":7,"id":326,"name":"minecraft:element_60"},{"data":8,"id":326,"name":"minecraft:element_60"},{"data":9,"id":326,"name":"minecraft:element_60"},{"data":10,"id":326,"name":"minecraft:element_60"},{"data":11,"id":326,"name":"minecraft:element_60"},{"data":12,"id":326,"name":"minecraft:element_60"},{"data":13,"id":326,"name":"minecraft:element_60"},{"data":14,"id":326,"name":"minecraft:element_60"},{"data":15,"id":326,"name":"minecraft:element_60"},{"data":0,"id":327,"name":"minecraft:element_61"},{"data":1,"id":327,"name":"minecraft:element_61"},{"data":2,"id":327,"name":"minecraft:element_61"},{"data":3,"id":327,"name":"minecraft:element_61"},{"data":4,"id":327,"name":"minecraft:element_61"},{"data":5,"id":327,"name":"minecraft:element_61"},{"data":6,"id":327,"name":"minecraft:element_61"},{"data":7,"id":327,"name":"minecraft:element_61"},{"data":8,"id":327,"name":"minecraft:element_61"},{"data":9,"id":327,"name":"minecraft:element_61"},{"data":10,"id":327,"name":"minecraft:element_61"},{"data":11,"id":327,"name":"minecraft:element_61"},{"data":12,"id":327,"name":"minecraft:element_61"},{"data":13,"id":327,"name":"minecraft:element_61"},{"data":14,"id":327,"name":"minecraft:element_61"},{"data":15,"id":327,"name":"minecraft:element_61"},{"data":0,"id":328,"name":"minecraft:element_62"},{"data":1,"id":328,"name":"minecraft:element_62"},{"data":2,"id":328,"name":"minecraft:element_62"},{"data":3,"id":328,"name":"minecraft:element_62"},{"data":4,"id":328,"name":"minecraft:element_62"},{"data":5,"id":328,"name":"minecraft:element_62"},{"data":6,"id":328,"name":"minecraft:element_62"},{"data":7,"id":328,"name":"minecraft:element_62"},{"data":8,"id":328,"name":"minecraft:element_62"},{"data":9,"id":328,"name":"minecraft:element_62"},{"data":10,"id":328,"name":"minecraft:element_62"},{"data":11,"id":328,"name":"minecraft:element_62"},{"data":12,"id":328,"name":"minecraft:element_62"},{"data":13,"id":328,"name":"minecraft:element_62"},{"data":14,"id":328,"name":"minecraft:element_62"},{"data":15,"id":328,"name":"minecraft:element_62"},{"data":0,"id":329,"name":"minecraft:element_63"},{"data":1,"id":329,"name":"minecraft:element_63"},{"data":2,"id":329,"name":"minecraft:element_63"},{"data":3,"id":329,"name":"minecraft:element_63"},{"data":4,"id":329,"name":"minecraft:element_63"},{"data":5,"id":329,"name":"minecraft:element_63"},{"data":6,"id":329,"name":"minecraft:element_63"},{"data":7,"id":329,"name":"minecraft:element_63"},{"data":8,"id":329,"name":"minecraft:element_63"},{"data":9,"id":329,"name":"minecraft:element_63"},{"data":10,"id":329,"name":"minecraft:element_63"},{"data":11,"id":329,"name":"minecraft:element_63"},{"data":12,"id":329,"name":"minecraft:element_63"},{"data":13,"id":329,"name":"minecraft:element_63"},{"data":14,"id":329,"name":"minecraft:element_63"},{"data":15,"id":329,"name":"minecraft:element_63"},{"data":0,"id":330,"name":"minecraft:element_64"},{"data":1,"id":330,"name":"minecraft:element_64"},{"data":2,"id":330,"name":"minecraft:element_64"},{"data":3,"id":330,"name":"minecraft:element_64"},{"data":4,"id":330,"name":"minecraft:element_64"},{"data":5,"id":330,"name":"minecraft:element_64"},{"data":6,"id":330,"name":"minecraft:element_64"},{"data":7,"id":330,"name":"minecraft:element_64"},{"data":8,"id":330,"name":"minecraft:element_64"},{"data":9,"id":330,"name":"minecraft:element_64"},{"data":10,"id":330,"name":"minecraft:element_64"},{"data":11,"id":330,"name":"minecraft:element_64"},{"data":12,"id":330,"name":"minecraft:element_64"},{"data":13,"id":330,"name":"minecraft:element_64"},{"data":14,"id":330,"name":"minecraft:element_64"},{"data":15,"id":330,"name":"minecraft:element_64"},{"data":0,"id":331,"name":"minecraft:element_65"},{"data":1,"id":331,"name":"minecraft:element_65"},{"data":2,"id":331,"name":"minecraft:element_65"},{"data":3,"id":331,"name":"minecraft:element_65"},{"data":4,"id":331,"name":"minecraft:element_65"},{"data":5,"id":331,"name":"minecraft:element_65"},{"data":6,"id":331,"name":"minecraft:element_65"},{"data":7,"id":331,"name":"minecraft:element_65"},{"data":8,"id":331,"name":"minecraft:element_65"},{"data":9,"id":331,"name":"minecraft:element_65"},{"data":10,"id":331,"name":"minecraft:element_65"},{"data":11,"id":331,"name":"minecraft:element_65"},{"data":12,"id":331,"name":"minecraft:element_65"},{"data":13,"id":331,"name":"minecraft:element_65"},{"data":14,"id":331,"name":"minecraft:element_65"},{"data":15,"id":331,"name":"minecraft:element_65"},{"data":0,"id":332,"name":"minecraft:element_66"},{"data":1,"id":332,"name":"minecraft:element_66"},{"data":2,"id":332,"name":"minecraft:element_66"},{"data":3,"id":332,"name":"minecraft:element_66"},{"data":4,"id":332,"name":"minecraft:element_66"},{"data":5,"id":332,"name":"minecraft:element_66"},{"data":6,"id":332,"name":"minecraft:element_66"},{"data":7,"id":332,"name":"minecraft:element_66"},{"data":8,"id":332,"name":"minecraft:element_66"},{"data":9,"id":332,"name":"minecraft:element_66"},{"data":10,"id":332,"name":"minecraft:element_66"},{"data":11,"id":332,"name":"minecraft:element_66"},{"data":12,"id":332,"name":"minecraft:element_66"},{"data":13,"id":332,"name":"minecraft:element_66"},{"data":14,"id":332,"name":"minecraft:element_66"},{"data":15,"id":332,"name":"minecraft:element_66"},{"data":0,"id":333,"name":"minecraft:element_67"},{"data":1,"id":333,"name":"minecraft:element_67"},{"data":2,"id":333,"name":"minecraft:element_67"},{"data":3,"id":333,"name":"minecraft:element_67"},{"data":4,"id":333,"name":"minecraft:element_67"},{"data":5,"id":333,"name":"minecraft:element_67"},{"data":6,"id":333,"name":"minecraft:element_67"},{"data":7,"id":333,"name":"minecraft:element_67"},{"data":8,"id":333,"name":"minecraft:element_67"},{"data":9,"id":333,"name":"minecraft:element_67"},{"data":10,"id":333,"name":"minecraft:element_67"},{"data":11,"id":333,"name":"minecraft:element_67"},{"data":12,"id":333,"name":"minecraft:element_67"},{"data":13,"id":333,"name":"minecraft:element_67"},{"data":14,"id":333,"name":"minecraft:element_67"},{"data":15,"id":333,"name":"minecraft:element_67"},{"data":0,"id":334,"name":"minecraft:element_68"},{"data":1,"id":334,"name":"minecraft:element_68"},{"data":2,"id":334,"name":"minecraft:element_68"},{"data":3,"id":334,"name":"minecraft:element_68"},{"data":4,"id":334,"name":"minecraft:element_68"},{"data":5,"id":334,"name":"minecraft:element_68"},{"data":6,"id":334,"name":"minecraft:element_68"},{"data":7,"id":334,"name":"minecraft:element_68"},{"data":8,"id":334,"name":"minecraft:element_68"},{"data":9,"id":334,"name":"minecraft:element_68"},{"data":10,"id":334,"name":"minecraft:element_68"},{"data":11,"id":334,"name":"minecraft:element_68"},{"data":12,"id":334,"name":"minecraft:element_68"},{"data":13,"id":334,"name":"minecraft:element_68"},{"data":14,"id":334,"name":"minecraft:element_68"},{"data":15,"id":334,"name":"minecraft:element_68"},{"data":0,"id":335,"name":"minecraft:element_69"},{"data":1,"id":335,"name":"minecraft:element_69"},{"data":2,"id":335,"name":"minecraft:element_69"},{"data":3,"id":335,"name":"minecraft:element_69"},{"data":4,"id":335,"name":"minecraft:element_69"},{"data":5,"id":335,"name":"minecraft:element_69"},{"data":6,"id":335,"name":"minecraft:element_69"},{"data":7,"id":335,"name":"minecraft:element_69"},{"data":8,"id":335,"name":"minecraft:element_69"},{"data":9,"id":335,"name":"minecraft:element_69"},{"data":10,"id":335,"name":"minecraft:element_69"},{"data":11,"id":335,"name":"minecraft:element_69"},{"data":12,"id":335,"name":"minecraft:element_69"},{"data":13,"id":335,"name":"minecraft:element_69"},{"data":14,"id":335,"name":"minecraft:element_69"},{"data":15,"id":335,"name":"minecraft:element_69"},{"data":0,"id":336,"name":"minecraft:element_70"},{"data":1,"id":336,"name":"minecraft:element_70"},{"data":2,"id":336,"name":"minecraft:element_70"},{"data":3,"id":336,"name":"minecraft:element_70"},{"data":4,"id":336,"name":"minecraft:element_70"},{"data":5,"id":336,"name":"minecraft:element_70"},{"data":6,"id":336,"name":"minecraft:element_70"},{"data":7,"id":336,"name":"minecraft:element_70"},{"data":8,"id":336,"name":"minecraft:element_70"},{"data":9,"id":336,"name":"minecraft:element_70"},{"data":10,"id":336,"name":"minecraft:element_70"},{"data":11,"id":336,"name":"minecraft:element_70"},{"data":12,"id":336,"name":"minecraft:element_70"},{"data":13,"id":336,"name":"minecraft:element_70"},{"data":14,"id":336,"name":"minecraft:element_70"},{"data":15,"id":336,"name":"minecraft:element_70"},{"data":0,"id":337,"name":"minecraft:element_71"},{"data":1,"id":337,"name":"minecraft:element_71"},{"data":2,"id":337,"name":"minecraft:element_71"},{"data":3,"id":337,"name":"minecraft:element_71"},{"data":4,"id":337,"name":"minecraft:element_71"},{"data":5,"id":337,"name":"minecraft:element_71"},{"data":6,"id":337,"name":"minecraft:element_71"},{"data":7,"id":337,"name":"minecraft:element_71"},{"data":8,"id":337,"name":"minecraft:element_71"},{"data":9,"id":337,"name":"minecraft:element_71"},{"data":10,"id":337,"name":"minecraft:element_71"},{"data":11,"id":337,"name":"minecraft:element_71"},{"data":12,"id":337,"name":"minecraft:element_71"},{"data":13,"id":337,"name":"minecraft:element_71"},{"data":14,"id":337,"name":"minecraft:element_71"},{"data":15,"id":337,"name":"minecraft:element_71"},{"data":0,"id":338,"name":"minecraft:element_72"},{"data":1,"id":338,"name":"minecraft:element_72"},{"data":2,"id":338,"name":"minecraft:element_72"},{"data":3,"id":338,"name":"minecraft:element_72"},{"data":4,"id":338,"name":"minecraft:element_72"},{"data":5,"id":338,"name":"minecraft:element_72"},{"data":6,"id":338,"name":"minecraft:element_72"},{"data":7,"id":338,"name":"minecraft:element_72"},{"data":8,"id":338,"name":"minecraft:element_72"},{"data":9,"id":338,"name":"minecraft:element_72"},{"data":10,"id":338,"name":"minecraft:element_72"},{"data":11,"id":338,"name":"minecraft:element_72"},{"data":12,"id":338,"name":"minecraft:element_72"},{"data":13,"id":338,"name":"minecraft:element_72"},{"data":14,"id":338,"name":"minecraft:element_72"},{"data":15,"id":338,"name":"minecraft:element_72"},{"data":0,"id":339,"name":"minecraft:element_73"},{"data":1,"id":339,"name":"minecraft:element_73"},{"data":2,"id":339,"name":"minecraft:element_73"},{"data":3,"id":339,"name":"minecraft:element_73"},{"data":4,"id":339,"name":"minecraft:element_73"},{"data":5,"id":339,"name":"minecraft:element_73"},{"data":6,"id":339,"name":"minecraft:element_73"},{"data":7,"id":339,"name":"minecraft:element_73"},{"data":8,"id":339,"name":"minecraft:element_73"},{"data":9,"id":339,"name":"minecraft:element_73"},{"data":10,"id":339,"name":"minecraft:element_73"},{"data":11,"id":339,"name":"minecraft:element_73"},{"data":12,"id":339,"name":"minecraft:element_73"},{"data":13,"id":339,"name":"minecraft:element_73"},{"data":14,"id":339,"name":"minecraft:element_73"},{"data":15,"id":339,"name":"minecraft:element_73"},{"data":0,"id":340,"name":"minecraft:element_74"},{"data":1,"id":340,"name":"minecraft:element_74"},{"data":2,"id":340,"name":"minecraft:element_74"},{"data":3,"id":340,"name":"minecraft:element_74"},{"data":4,"id":340,"name":"minecraft:element_74"},{"data":5,"id":340,"name":"minecraft:element_74"},{"data":6,"id":340,"name":"minecraft:element_74"},{"data":7,"id":340,"name":"minecraft:element_74"},{"data":8,"id":340,"name":"minecraft:element_74"},{"data":9,"id":340,"name":"minecraft:element_74"},{"data":10,"id":340,"name":"minecraft:element_74"},{"data":11,"id":340,"name":"minecraft:element_74"},{"data":12,"id":340,"name":"minecraft:element_74"},{"data":13,"id":340,"name":"minecraft:element_74"},{"data":14,"id":340,"name":"minecraft:element_74"},{"data":15,"id":340,"name":"minecraft:element_74"},{"data":0,"id":341,"name":"minecraft:element_75"},{"data":1,"id":341,"name":"minecraft:element_75"},{"data":2,"id":341,"name":"minecraft:element_75"},{"data":3,"id":341,"name":"minecraft:element_75"},{"data":4,"id":341,"name":"minecraft:element_75"},{"data":5,"id":341,"name":"minecraft:element_75"},{"data":6,"id":341,"name":"minecraft:element_75"},{"data":7,"id":341,"name":"minecraft:element_75"},{"data":8,"id":341,"name":"minecraft:element_75"},{"data":9,"id":341,"name":"minecraft:element_75"},{"data":10,"id":341,"name":"minecraft:element_75"},{"data":11,"id":341,"name":"minecraft:element_75"},{"data":12,"id":341,"name":"minecraft:element_75"},{"data":13,"id":341,"name":"minecraft:element_75"},{"data":14,"id":341,"name":"minecraft:element_75"},{"data":15,"id":341,"name":"minecraft:element_75"},{"data":0,"id":342,"name":"minecraft:element_76"},{"data":1,"id":342,"name":"minecraft:element_76"},{"data":2,"id":342,"name":"minecraft:element_76"},{"data":3,"id":342,"name":"minecraft:element_76"},{"data":4,"id":342,"name":"minecraft:element_76"},{"data":5,"id":342,"name":"minecraft:element_76"},{"data":6,"id":342,"name":"minecraft:element_76"},{"data":7,"id":342,"name":"minecraft:element_76"},{"data":8,"id":342,"name":"minecraft:element_76"},{"data":9,"id":342,"name":"minecraft:element_76"},{"data":10,"id":342,"name":"minecraft:element_76"},{"data":11,"id":342,"name":"minecraft:element_76"},{"data":12,"id":342,"name":"minecraft:element_76"},{"data":13,"id":342,"name":"minecraft:element_76"},{"data":14,"id":342,"name":"minecraft:element_76"},{"data":15,"id":342,"name":"minecraft:element_76"},{"data":0,"id":343,"name":"minecraft:element_77"},{"data":1,"id":343,"name":"minecraft:element_77"},{"data":2,"id":343,"name":"minecraft:element_77"},{"data":3,"id":343,"name":"minecraft:element_77"},{"data":4,"id":343,"name":"minecraft:element_77"},{"data":5,"id":343,"name":"minecraft:element_77"},{"data":6,"id":343,"name":"minecraft:element_77"},{"data":7,"id":343,"name":"minecraft:element_77"},{"data":8,"id":343,"name":"minecraft:element_77"},{"data":9,"id":343,"name":"minecraft:element_77"},{"data":10,"id":343,"name":"minecraft:element_77"},{"data":11,"id":343,"name":"minecraft:element_77"},{"data":12,"id":343,"name":"minecraft:element_77"},{"data":13,"id":343,"name":"minecraft:element_77"},{"data":14,"id":343,"name":"minecraft:element_77"},{"data":15,"id":343,"name":"minecraft:element_77"},{"data":0,"id":344,"name":"minecraft:element_78"},{"data":1,"id":344,"name":"minecraft:element_78"},{"data":2,"id":344,"name":"minecraft:element_78"},{"data":3,"id":344,"name":"minecraft:element_78"},{"data":4,"id":344,"name":"minecraft:element_78"},{"data":5,"id":344,"name":"minecraft:element_78"},{"data":6,"id":344,"name":"minecraft:element_78"},{"data":7,"id":344,"name":"minecraft:element_78"},{"data":8,"id":344,"name":"minecraft:element_78"},{"data":9,"id":344,"name":"minecraft:element_78"},{"data":10,"id":344,"name":"minecraft:element_78"},{"data":11,"id":344,"name":"minecraft:element_78"},{"data":12,"id":344,"name":"minecraft:element_78"},{"data":13,"id":344,"name":"minecraft:element_78"},{"data":14,"id":344,"name":"minecraft:element_78"},{"data":15,"id":344,"name":"minecraft:element_78"},{"data":0,"id":345,"name":"minecraft:element_79"},{"data":1,"id":345,"name":"minecraft:element_79"},{"data":2,"id":345,"name":"minecraft:element_79"},{"data":3,"id":345,"name":"minecraft:element_79"},{"data":4,"id":345,"name":"minecraft:element_79"},{"data":5,"id":345,"name":"minecraft:element_79"},{"data":6,"id":345,"name":"minecraft:element_79"},{"data":7,"id":345,"name":"minecraft:element_79"},{"data":8,"id":345,"name":"minecraft:element_79"},{"data":9,"id":345,"name":"minecraft:element_79"},{"data":10,"id":345,"name":"minecraft:element_79"},{"data":11,"id":345,"name":"minecraft:element_79"},{"data":12,"id":345,"name":"minecraft:element_79"},{"data":13,"id":345,"name":"minecraft:element_79"},{"data":14,"id":345,"name":"minecraft:element_79"},{"data":15,"id":345,"name":"minecraft:element_79"},{"data":0,"id":346,"name":"minecraft:element_80"},{"data":1,"id":346,"name":"minecraft:element_80"},{"data":2,"id":346,"name":"minecraft:element_80"},{"data":3,"id":346,"name":"minecraft:element_80"},{"data":4,"id":346,"name":"minecraft:element_80"},{"data":5,"id":346,"name":"minecraft:element_80"},{"data":6,"id":346,"name":"minecraft:element_80"},{"data":7,"id":346,"name":"minecraft:element_80"},{"data":8,"id":346,"name":"minecraft:element_80"},{"data":9,"id":346,"name":"minecraft:element_80"},{"data":10,"id":346,"name":"minecraft:element_80"},{"data":11,"id":346,"name":"minecraft:element_80"},{"data":12,"id":346,"name":"minecraft:element_80"},{"data":13,"id":346,"name":"minecraft:element_80"},{"data":14,"id":346,"name":"minecraft:element_80"},{"data":15,"id":346,"name":"minecraft:element_80"},{"data":0,"id":347,"name":"minecraft:element_81"},{"data":1,"id":347,"name":"minecraft:element_81"},{"data":2,"id":347,"name":"minecraft:element_81"},{"data":3,"id":347,"name":"minecraft:element_81"},{"data":4,"id":347,"name":"minecraft:element_81"},{"data":5,"id":347,"name":"minecraft:element_81"},{"data":6,"id":347,"name":"minecraft:element_81"},{"data":7,"id":347,"name":"minecraft:element_81"},{"data":8,"id":347,"name":"minecraft:element_81"},{"data":9,"id":347,"name":"minecraft:element_81"},{"data":10,"id":347,"name":"minecraft:element_81"},{"data":11,"id":347,"name":"minecraft:element_81"},{"data":12,"id":347,"name":"minecraft:element_81"},{"data":13,"id":347,"name":"minecraft:element_81"},{"data":14,"id":347,"name":"minecraft:element_81"},{"data":15,"id":347,"name":"minecraft:element_81"},{"data":0,"id":348,"name":"minecraft:element_82"},{"data":1,"id":348,"name":"minecraft:element_82"},{"data":2,"id":348,"name":"minecraft:element_82"},{"data":3,"id":348,"name":"minecraft:element_82"},{"data":4,"id":348,"name":"minecraft:element_82"},{"data":5,"id":348,"name":"minecraft:element_82"},{"data":6,"id":348,"name":"minecraft:element_82"},{"data":7,"id":348,"name":"minecraft:element_82"},{"data":8,"id":348,"name":"minecraft:element_82"},{"data":9,"id":348,"name":"minecraft:element_82"},{"data":10,"id":348,"name":"minecraft:element_82"},{"data":11,"id":348,"name":"minecraft:element_82"},{"data":12,"id":348,"name":"minecraft:element_82"},{"data":13,"id":348,"name":"minecraft:element_82"},{"data":14,"id":348,"name":"minecraft:element_82"},{"data":15,"id":348,"name":"minecraft:element_82"},{"data":0,"id":349,"name":"minecraft:element_83"},{"data":1,"id":349,"name":"minecraft:element_83"},{"data":2,"id":349,"name":"minecraft:element_83"},{"data":3,"id":349,"name":"minecraft:element_83"},{"data":4,"id":349,"name":"minecraft:element_83"},{"data":5,"id":349,"name":"minecraft:element_83"},{"data":6,"id":349,"name":"minecraft:element_83"},{"data":7,"id":349,"name":"minecraft:element_83"},{"data":8,"id":349,"name":"minecraft:element_83"},{"data":9,"id":349,"name":"minecraft:element_83"},{"data":10,"id":349,"name":"minecraft:element_83"},{"data":11,"id":349,"name":"minecraft:element_83"},{"data":12,"id":349,"name":"minecraft:element_83"},{"data":13,"id":349,"name":"minecraft:element_83"},{"data":14,"id":349,"name":"minecraft:element_83"},{"data":15,"id":349,"name":"minecraft:element_83"},{"data":0,"id":350,"name":"minecraft:element_84"},{"data":1,"id":350,"name":"minecraft:element_84"},{"data":2,"id":350,"name":"minecraft:element_84"},{"data":3,"id":350,"name":"minecraft:element_84"},{"data":4,"id":350,"name":"minecraft:element_84"},{"data":5,"id":350,"name":"minecraft:element_84"},{"data":6,"id":350,"name":"minecraft:element_84"},{"data":7,"id":350,"name":"minecraft:element_84"},{"data":8,"id":350,"name":"minecraft:element_84"},{"data":9,"id":350,"name":"minecraft:element_84"},{"data":10,"id":350,"name":"minecraft:element_84"},{"data":11,"id":350,"name":"minecraft:element_84"},{"data":12,"id":350,"name":"minecraft:element_84"},{"data":13,"id":350,"name":"minecraft:element_84"},{"data":14,"id":350,"name":"minecraft:element_84"},{"data":15,"id":350,"name":"minecraft:element_84"},{"data":0,"id":351,"name":"minecraft:element_85"},{"data":1,"id":351,"name":"minecraft:element_85"},{"data":2,"id":351,"name":"minecraft:element_85"},{"data":3,"id":351,"name":"minecraft:element_85"},{"data":4,"id":351,"name":"minecraft:element_85"},{"data":5,"id":351,"name":"minecraft:element_85"},{"data":6,"id":351,"name":"minecraft:element_85"},{"data":7,"id":351,"name":"minecraft:element_85"},{"data":8,"id":351,"name":"minecraft:element_85"},{"data":9,"id":351,"name":"minecraft:element_85"},{"data":10,"id":351,"name":"minecraft:element_85"},{"data":11,"id":351,"name":"minecraft:element_85"},{"data":12,"id":351,"name":"minecraft:element_85"},{"data":13,"id":351,"name":"minecraft:element_85"},{"data":14,"id":351,"name":"minecraft:element_85"},{"data":15,"id":351,"name":"minecraft:element_85"},{"data":0,"id":352,"name":"minecraft:element_86"},{"data":1,"id":352,"name":"minecraft:element_86"},{"data":2,"id":352,"name":"minecraft:element_86"},{"data":3,"id":352,"name":"minecraft:element_86"},{"data":4,"id":352,"name":"minecraft:element_86"},{"data":5,"id":352,"name":"minecraft:element_86"},{"data":6,"id":352,"name":"minecraft:element_86"},{"data":7,"id":352,"name":"minecraft:element_86"},{"data":8,"id":352,"name":"minecraft:element_86"},{"data":9,"id":352,"name":"minecraft:element_86"},{"data":10,"id":352,"name":"minecraft:element_86"},{"data":11,"id":352,"name":"minecraft:element_86"},{"data":12,"id":352,"name":"minecraft:element_86"},{"data":13,"id":352,"name":"minecraft:element_86"},{"data":14,"id":352,"name":"minecraft:element_86"},{"data":15,"id":352,"name":"minecraft:element_86"},{"data":0,"id":353,"name":"minecraft:element_87"},{"data":1,"id":353,"name":"minecraft:element_87"},{"data":2,"id":353,"name":"minecraft:element_87"},{"data":3,"id":353,"name":"minecraft:element_87"},{"data":4,"id":353,"name":"minecraft:element_87"},{"data":5,"id":353,"name":"minecraft:element_87"},{"data":6,"id":353,"name":"minecraft:element_87"},{"data":7,"id":353,"name":"minecraft:element_87"},{"data":8,"id":353,"name":"minecraft:element_87"},{"data":9,"id":353,"name":"minecraft:element_87"},{"data":10,"id":353,"name":"minecraft:element_87"},{"data":11,"id":353,"name":"minecraft:element_87"},{"data":12,"id":353,"name":"minecraft:element_87"},{"data":13,"id":353,"name":"minecraft:element_87"},{"data":14,"id":353,"name":"minecraft:element_87"},{"data":15,"id":353,"name":"minecraft:element_87"},{"data":0,"id":354,"name":"minecraft:element_88"},{"data":1,"id":354,"name":"minecraft:element_88"},{"data":2,"id":354,"name":"minecraft:element_88"},{"data":3,"id":354,"name":"minecraft:element_88"},{"data":4,"id":354,"name":"minecraft:element_88"},{"data":5,"id":354,"name":"minecraft:element_88"},{"data":6,"id":354,"name":"minecraft:element_88"},{"data":7,"id":354,"name":"minecraft:element_88"},{"data":8,"id":354,"name":"minecraft:element_88"},{"data":9,"id":354,"name":"minecraft:element_88"},{"data":10,"id":354,"name":"minecraft:element_88"},{"data":11,"id":354,"name":"minecraft:element_88"},{"data":12,"id":354,"name":"minecraft:element_88"},{"data":13,"id":354,"name":"minecraft:element_88"},{"data":14,"id":354,"name":"minecraft:element_88"},{"data":15,"id":354,"name":"minecraft:element_88"},{"data":0,"id":355,"name":"minecraft:element_89"},{"data":1,"id":355,"name":"minecraft:element_89"},{"data":2,"id":355,"name":"minecraft:element_89"},{"data":3,"id":355,"name":"minecraft:element_89"},{"data":4,"id":355,"name":"minecraft:element_89"},{"data":5,"id":355,"name":"minecraft:element_89"},{"data":6,"id":355,"name":"minecraft:element_89"},{"data":7,"id":355,"name":"minecraft:element_89"},{"data":8,"id":355,"name":"minecraft:element_89"},{"data":9,"id":355,"name":"minecraft:element_89"},{"data":10,"id":355,"name":"minecraft:element_89"},{"data":11,"id":355,"name":"minecraft:element_89"},{"data":12,"id":355,"name":"minecraft:element_89"},{"data":13,"id":355,"name":"minecraft:element_89"},{"data":14,"id":355,"name":"minecraft:element_89"},{"data":15,"id":355,"name":"minecraft:element_89"},{"data":0,"id":356,"name":"minecraft:element_90"},{"data":1,"id":356,"name":"minecraft:element_90"},{"data":2,"id":356,"name":"minecraft:element_90"},{"data":3,"id":356,"name":"minecraft:element_90"},{"data":4,"id":356,"name":"minecraft:element_90"},{"data":5,"id":356,"name":"minecraft:element_90"},{"data":6,"id":356,"name":"minecraft:element_90"},{"data":7,"id":356,"name":"minecraft:element_90"},{"data":8,"id":356,"name":"minecraft:element_90"},{"data":9,"id":356,"name":"minecraft:element_90"},{"data":10,"id":356,"name":"minecraft:element_90"},{"data":11,"id":356,"name":"minecraft:element_90"},{"data":12,"id":356,"name":"minecraft:element_90"},{"data":13,"id":356,"name":"minecraft:element_90"},{"data":14,"id":356,"name":"minecraft:element_90"},{"data":15,"id":356,"name":"minecraft:element_90"},{"data":0,"id":357,"name":"minecraft:element_91"},{"data":1,"id":357,"name":"minecraft:element_91"},{"data":2,"id":357,"name":"minecraft:element_91"},{"data":3,"id":357,"name":"minecraft:element_91"},{"data":4,"id":357,"name":"minecraft:element_91"},{"data":5,"id":357,"name":"minecraft:element_91"},{"data":6,"id":357,"name":"minecraft:element_91"},{"data":7,"id":357,"name":"minecraft:element_91"},{"data":8,"id":357,"name":"minecraft:element_91"},{"data":9,"id":357,"name":"minecraft:element_91"},{"data":10,"id":357,"name":"minecraft:element_91"},{"data":11,"id":357,"name":"minecraft:element_91"},{"data":12,"id":357,"name":"minecraft:element_91"},{"data":13,"id":357,"name":"minecraft:element_91"},{"data":14,"id":357,"name":"minecraft:element_91"},{"data":15,"id":357,"name":"minecraft:element_91"},{"data":0,"id":358,"name":"minecraft:element_92"},{"data":1,"id":358,"name":"minecraft:element_92"},{"data":2,"id":358,"name":"minecraft:element_92"},{"data":3,"id":358,"name":"minecraft:element_92"},{"data":4,"id":358,"name":"minecraft:element_92"},{"data":5,"id":358,"name":"minecraft:element_92"},{"data":6,"id":358,"name":"minecraft:element_92"},{"data":7,"id":358,"name":"minecraft:element_92"},{"data":8,"id":358,"name":"minecraft:element_92"},{"data":9,"id":358,"name":"minecraft:element_92"},{"data":10,"id":358,"name":"minecraft:element_92"},{"data":11,"id":358,"name":"minecraft:element_92"},{"data":12,"id":358,"name":"minecraft:element_92"},{"data":13,"id":358,"name":"minecraft:element_92"},{"data":14,"id":358,"name":"minecraft:element_92"},{"data":15,"id":358,"name":"minecraft:element_92"},{"data":0,"id":359,"name":"minecraft:element_93"},{"data":1,"id":359,"name":"minecraft:element_93"},{"data":2,"id":359,"name":"minecraft:element_93"},{"data":3,"id":359,"name":"minecraft:element_93"},{"data":4,"id":359,"name":"minecraft:element_93"},{"data":5,"id":359,"name":"minecraft:element_93"},{"data":6,"id":359,"name":"minecraft:element_93"},{"data":7,"id":359,"name":"minecraft:element_93"},{"data":8,"id":359,"name":"minecraft:element_93"},{"data":9,"id":359,"name":"minecraft:element_93"},{"data":10,"id":359,"name":"minecraft:element_93"},{"data":11,"id":359,"name":"minecraft:element_93"},{"data":12,"id":359,"name":"minecraft:element_93"},{"data":13,"id":359,"name":"minecraft:element_93"},{"data":14,"id":359,"name":"minecraft:element_93"},{"data":15,"id":359,"name":"minecraft:element_93"},{"data":0,"id":360,"name":"minecraft:element_94"},{"data":1,"id":360,"name":"minecraft:element_94"},{"data":2,"id":360,"name":"minecraft:element_94"},{"data":3,"id":360,"name":"minecraft:element_94"},{"data":4,"id":360,"name":"minecraft:element_94"},{"data":5,"id":360,"name":"minecraft:element_94"},{"data":6,"id":360,"name":"minecraft:element_94"},{"data":7,"id":360,"name":"minecraft:element_94"},{"data":8,"id":360,"name":"minecraft:element_94"},{"data":9,"id":360,"name":"minecraft:element_94"},{"data":10,"id":360,"name":"minecraft:element_94"},{"data":11,"id":360,"name":"minecraft:element_94"},{"data":12,"id":360,"name":"minecraft:element_94"},{"data":13,"id":360,"name":"minecraft:element_94"},{"data":14,"id":360,"name":"minecraft:element_94"},{"data":15,"id":360,"name":"minecraft:element_94"},{"data":0,"id":361,"name":"minecraft:element_95"},{"data":1,"id":361,"name":"minecraft:element_95"},{"data":2,"id":361,"name":"minecraft:element_95"},{"data":3,"id":361,"name":"minecraft:element_95"},{"data":4,"id":361,"name":"minecraft:element_95"},{"data":5,"id":361,"name":"minecraft:element_95"},{"data":6,"id":361,"name":"minecraft:element_95"},{"data":7,"id":361,"name":"minecraft:element_95"},{"data":8,"id":361,"name":"minecraft:element_95"},{"data":9,"id":361,"name":"minecraft:element_95"},{"data":10,"id":361,"name":"minecraft:element_95"},{"data":11,"id":361,"name":"minecraft:element_95"},{"data":12,"id":361,"name":"minecraft:element_95"},{"data":13,"id":361,"name":"minecraft:element_95"},{"data":14,"id":361,"name":"minecraft:element_95"},{"data":15,"id":361,"name":"minecraft:element_95"},{"data":0,"id":362,"name":"minecraft:element_96"},{"data":1,"id":362,"name":"minecraft:element_96"},{"data":2,"id":362,"name":"minecraft:element_96"},{"data":3,"id":362,"name":"minecraft:element_96"},{"data":4,"id":362,"name":"minecraft:element_96"},{"data":5,"id":362,"name":"minecraft:element_96"},{"data":6,"id":362,"name":"minecraft:element_96"},{"data":7,"id":362,"name":"minecraft:element_96"},{"data":8,"id":362,"name":"minecraft:element_96"},{"data":9,"id":362,"name":"minecraft:element_96"},{"data":10,"id":362,"name":"minecraft:element_96"},{"data":11,"id":362,"name":"minecraft:element_96"},{"data":12,"id":362,"name":"minecraft:element_96"},{"data":13,"id":362,"name":"minecraft:element_96"},{"data":14,"id":362,"name":"minecraft:element_96"},{"data":15,"id":362,"name":"minecraft:element_96"},{"data":0,"id":363,"name":"minecraft:element_97"},{"data":1,"id":363,"name":"minecraft:element_97"},{"data":2,"id":363,"name":"minecraft:element_97"},{"data":3,"id":363,"name":"minecraft:element_97"},{"data":4,"id":363,"name":"minecraft:element_97"},{"data":5,"id":363,"name":"minecraft:element_97"},{"data":6,"id":363,"name":"minecraft:element_97"},{"data":7,"id":363,"name":"minecraft:element_97"},{"data":8,"id":363,"name":"minecraft:element_97"},{"data":9,"id":363,"name":"minecraft:element_97"},{"data":10,"id":363,"name":"minecraft:element_97"},{"data":11,"id":363,"name":"minecraft:element_97"},{"data":12,"id":363,"name":"minecraft:element_97"},{"data":13,"id":363,"name":"minecraft:element_97"},{"data":14,"id":363,"name":"minecraft:element_97"},{"data":15,"id":363,"name":"minecraft:element_97"},{"data":0,"id":364,"name":"minecraft:element_98"},{"data":1,"id":364,"name":"minecraft:element_98"},{"data":2,"id":364,"name":"minecraft:element_98"},{"data":3,"id":364,"name":"minecraft:element_98"},{"data":4,"id":364,"name":"minecraft:element_98"},{"data":5,"id":364,"name":"minecraft:element_98"},{"data":6,"id":364,"name":"minecraft:element_98"},{"data":7,"id":364,"name":"minecraft:element_98"},{"data":8,"id":364,"name":"minecraft:element_98"},{"data":9,"id":364,"name":"minecraft:element_98"},{"data":10,"id":364,"name":"minecraft:element_98"},{"data":11,"id":364,"name":"minecraft:element_98"},{"data":12,"id":364,"name":"minecraft:element_98"},{"data":13,"id":364,"name":"minecraft:element_98"},{"data":14,"id":364,"name":"minecraft:element_98"},{"data":15,"id":364,"name":"minecraft:element_98"},{"data":0,"id":365,"name":"minecraft:element_99"},{"data":1,"id":365,"name":"minecraft:element_99"},{"data":2,"id":365,"name":"minecraft:element_99"},{"data":3,"id":365,"name":"minecraft:element_99"},{"data":4,"id":365,"name":"minecraft:element_99"},{"data":5,"id":365,"name":"minecraft:element_99"},{"data":6,"id":365,"name":"minecraft:element_99"},{"data":7,"id":365,"name":"minecraft:element_99"},{"data":8,"id":365,"name":"minecraft:element_99"},{"data":9,"id":365,"name":"minecraft:element_99"},{"data":10,"id":365,"name":"minecraft:element_99"},{"data":11,"id":365,"name":"minecraft:element_99"},{"data":12,"id":365,"name":"minecraft:element_99"},{"data":13,"id":365,"name":"minecraft:element_99"},{"data":14,"id":365,"name":"minecraft:element_99"},{"data":15,"id":365,"name":"minecraft:element_99"},{"data":0,"id":366,"name":"minecraft:element_100"},{"data":1,"id":366,"name":"minecraft:element_100"},{"data":2,"id":366,"name":"minecraft:element_100"},{"data":3,"id":366,"name":"minecraft:element_100"},{"data":4,"id":366,"name":"minecraft:element_100"},{"data":5,"id":366,"name":"minecraft:element_100"},{"data":6,"id":366,"name":"minecraft:element_100"},{"data":7,"id":366,"name":"minecraft:element_100"},{"data":8,"id":366,"name":"minecraft:element_100"},{"data":9,"id":366,"name":"minecraft:element_100"},{"data":10,"id":366,"name":"minecraft:element_100"},{"data":11,"id":366,"name":"minecraft:element_100"},{"data":12,"id":366,"name":"minecraft:element_100"},{"data":13,"id":366,"name":"minecraft:element_100"},{"data":14,"id":366,"name":"minecraft:element_100"},{"data":15,"id":366,"name":"minecraft:element_100"},{"data":0,"id":367,"name":"minecraft:element_101"},{"data":1,"id":367,"name":"minecraft:element_101"},{"data":2,"id":367,"name":"minecraft:element_101"},{"data":3,"id":367,"name":"minecraft:element_101"},{"data":4,"id":367,"name":"minecraft:element_101"},{"data":5,"id":367,"name":"minecraft:element_101"},{"data":6,"id":367,"name":"minecraft:element_101"},{"data":7,"id":367,"name":"minecraft:element_101"},{"data":8,"id":367,"name":"minecraft:element_101"},{"data":9,"id":367,"name":"minecraft:element_101"},{"data":10,"id":367,"name":"minecraft:element_101"},{"data":11,"id":367,"name":"minecraft:element_101"},{"data":12,"id":367,"name":"minecraft:element_101"},{"data":13,"id":367,"name":"minecraft:element_101"},{"data":14,"id":367,"name":"minecraft:element_101"},{"data":15,"id":367,"name":"minecraft:element_101"},{"data":0,"id":368,"name":"minecraft:element_102"},{"data":1,"id":368,"name":"minecraft:element_102"},{"data":2,"id":368,"name":"minecraft:element_102"},{"data":3,"id":368,"name":"minecraft:element_102"},{"data":4,"id":368,"name":"minecraft:element_102"},{"data":5,"id":368,"name":"minecraft:element_102"},{"data":6,"id":368,"name":"minecraft:element_102"},{"data":7,"id":368,"name":"minecraft:element_102"},{"data":8,"id":368,"name":"minecraft:element_102"},{"data":9,"id":368,"name":"minecraft:element_102"},{"data":10,"id":368,"name":"minecraft:element_102"},{"data":11,"id":368,"name":"minecraft:element_102"},{"data":12,"id":368,"name":"minecraft:element_102"},{"data":13,"id":368,"name":"minecraft:element_102"},{"data":14,"id":368,"name":"minecraft:element_102"},{"data":15,"id":368,"name":"minecraft:element_102"},{"data":0,"id":369,"name":"minecraft:element_103"},{"data":1,"id":369,"name":"minecraft:element_103"},{"data":2,"id":369,"name":"minecraft:element_103"},{"data":3,"id":369,"name":"minecraft:element_103"},{"data":4,"id":369,"name":"minecraft:element_103"},{"data":5,"id":369,"name":"minecraft:element_103"},{"data":6,"id":369,"name":"minecraft:element_103"},{"data":7,"id":369,"name":"minecraft:element_103"},{"data":8,"id":369,"name":"minecraft:element_103"},{"data":9,"id":369,"name":"minecraft:element_103"},{"data":10,"id":369,"name":"minecraft:element_103"},{"data":11,"id":369,"name":"minecraft:element_103"},{"data":12,"id":369,"name":"minecraft:element_103"},{"data":13,"id":369,"name":"minecraft:element_103"},{"data":14,"id":369,"name":"minecraft:element_103"},{"data":15,"id":369,"name":"minecraft:element_103"},{"data":0,"id":370,"name":"minecraft:element_104"},{"data":1,"id":370,"name":"minecraft:element_104"},{"data":2,"id":370,"name":"minecraft:element_104"},{"data":3,"id":370,"name":"minecraft:element_104"},{"data":4,"id":370,"name":"minecraft:element_104"},{"data":5,"id":370,"name":"minecraft:element_104"},{"data":6,"id":370,"name":"minecraft:element_104"},{"data":7,"id":370,"name":"minecraft:element_104"},{"data":8,"id":370,"name":"minecraft:element_104"},{"data":9,"id":370,"name":"minecraft:element_104"},{"data":10,"id":370,"name":"minecraft:element_104"},{"data":11,"id":370,"name":"minecraft:element_104"},{"data":12,"id":370,"name":"minecraft:element_104"},{"data":13,"id":370,"name":"minecraft:element_104"},{"data":14,"id":370,"name":"minecraft:element_104"},{"data":15,"id":370,"name":"minecraft:element_104"},{"data":0,"id":371,"name":"minecraft:element_105"},{"data":1,"id":371,"name":"minecraft:element_105"},{"data":2,"id":371,"name":"minecraft:element_105"},{"data":3,"id":371,"name":"minecraft:element_105"},{"data":4,"id":371,"name":"minecraft:element_105"},{"data":5,"id":371,"name":"minecraft:element_105"},{"data":6,"id":371,"name":"minecraft:element_105"},{"data":7,"id":371,"name":"minecraft:element_105"},{"data":8,"id":371,"name":"minecraft:element_105"},{"data":9,"id":371,"name":"minecraft:element_105"},{"data":10,"id":371,"name":"minecraft:element_105"},{"data":11,"id":371,"name":"minecraft:element_105"},{"data":12,"id":371,"name":"minecraft:element_105"},{"data":13,"id":371,"name":"minecraft:element_105"},{"data":14,"id":371,"name":"minecraft:element_105"},{"data":15,"id":371,"name":"minecraft:element_105"},{"data":0,"id":372,"name":"minecraft:element_106"},{"data":1,"id":372,"name":"minecraft:element_106"},{"data":2,"id":372,"name":"minecraft:element_106"},{"data":3,"id":372,"name":"minecraft:element_106"},{"data":4,"id":372,"name":"minecraft:element_106"},{"data":5,"id":372,"name":"minecraft:element_106"},{"data":6,"id":372,"name":"minecraft:element_106"},{"data":7,"id":372,"name":"minecraft:element_106"},{"data":8,"id":372,"name":"minecraft:element_106"},{"data":9,"id":372,"name":"minecraft:element_106"},{"data":10,"id":372,"name":"minecraft:element_106"},{"data":11,"id":372,"name":"minecraft:element_106"},{"data":12,"id":372,"name":"minecraft:element_106"},{"data":13,"id":372,"name":"minecraft:element_106"},{"data":14,"id":372,"name":"minecraft:element_106"},{"data":15,"id":372,"name":"minecraft:element_106"},{"data":0,"id":373,"name":"minecraft:element_107"},{"data":1,"id":373,"name":"minecraft:element_107"},{"data":2,"id":373,"name":"minecraft:element_107"},{"data":3,"id":373,"name":"minecraft:element_107"},{"data":4,"id":373,"name":"minecraft:element_107"},{"data":5,"id":373,"name":"minecraft:element_107"},{"data":6,"id":373,"name":"minecraft:element_107"},{"data":7,"id":373,"name":"minecraft:element_107"},{"data":8,"id":373,"name":"minecraft:element_107"},{"data":9,"id":373,"name":"minecraft:element_107"},{"data":10,"id":373,"name":"minecraft:element_107"},{"data":11,"id":373,"name":"minecraft:element_107"},{"data":12,"id":373,"name":"minecraft:element_107"},{"data":13,"id":373,"name":"minecraft:element_107"},{"data":14,"id":373,"name":"minecraft:element_107"},{"data":15,"id":373,"name":"minecraft:element_107"},{"data":0,"id":374,"name":"minecraft:element_108"},{"data":1,"id":374,"name":"minecraft:element_108"},{"data":2,"id":374,"name":"minecraft:element_108"},{"data":3,"id":374,"name":"minecraft:element_108"},{"data":4,"id":374,"name":"minecraft:element_108"},{"data":5,"id":374,"name":"minecraft:element_108"},{"data":6,"id":374,"name":"minecraft:element_108"},{"data":7,"id":374,"name":"minecraft:element_108"},{"data":8,"id":374,"name":"minecraft:element_108"},{"data":9,"id":374,"name":"minecraft:element_108"},{"data":10,"id":374,"name":"minecraft:element_108"},{"data":11,"id":374,"name":"minecraft:element_108"},{"data":12,"id":374,"name":"minecraft:element_108"},{"data":13,"id":374,"name":"minecraft:element_108"},{"data":14,"id":374,"name":"minecraft:element_108"},{"data":15,"id":374,"name":"minecraft:element_108"},{"data":0,"id":375,"name":"minecraft:element_109"},{"data":1,"id":375,"name":"minecraft:element_109"},{"data":2,"id":375,"name":"minecraft:element_109"},{"data":3,"id":375,"name":"minecraft:element_109"},{"data":4,"id":375,"name":"minecraft:element_109"},{"data":5,"id":375,"name":"minecraft:element_109"},{"data":6,"id":375,"name":"minecraft:element_109"},{"data":7,"id":375,"name":"minecraft:element_109"},{"data":8,"id":375,"name":"minecraft:element_109"},{"data":9,"id":375,"name":"minecraft:element_109"},{"data":10,"id":375,"name":"minecraft:element_109"},{"data":11,"id":375,"name":"minecraft:element_109"},{"data":12,"id":375,"name":"minecraft:element_109"},{"data":13,"id":375,"name":"minecraft:element_109"},{"data":14,"id":375,"name":"minecraft:element_109"},{"data":15,"id":375,"name":"minecraft:element_109"},{"data":0,"id":376,"name":"minecraft:element_110"},{"data":1,"id":376,"name":"minecraft:element_110"},{"data":2,"id":376,"name":"minecraft:element_110"},{"data":3,"id":376,"name":"minecraft:element_110"},{"data":4,"id":376,"name":"minecraft:element_110"},{"data":5,"id":376,"name":"minecraft:element_110"},{"data":6,"id":376,"name":"minecraft:element_110"},{"data":7,"id":376,"name":"minecraft:element_110"},{"data":8,"id":376,"name":"minecraft:element_110"},{"data":9,"id":376,"name":"minecraft:element_110"},{"data":10,"id":376,"name":"minecraft:element_110"},{"data":11,"id":376,"name":"minecraft:element_110"},{"data":12,"id":376,"name":"minecraft:element_110"},{"data":13,"id":376,"name":"minecraft:element_110"},{"data":14,"id":376,"name":"minecraft:element_110"},{"data":15,"id":376,"name":"minecraft:element_110"},{"data":0,"id":377,"name":"minecraft:element_111"},{"data":1,"id":377,"name":"minecraft:element_111"},{"data":2,"id":377,"name":"minecraft:element_111"},{"data":3,"id":377,"name":"minecraft:element_111"},{"data":4,"id":377,"name":"minecraft:element_111"},{"data":5,"id":377,"name":"minecraft:element_111"},{"data":6,"id":377,"name":"minecraft:element_111"},{"data":7,"id":377,"name":"minecraft:element_111"},{"data":8,"id":377,"name":"minecraft:element_111"},{"data":9,"id":377,"name":"minecraft:element_111"},{"data":10,"id":377,"name":"minecraft:element_111"},{"data":11,"id":377,"name":"minecraft:element_111"},{"data":12,"id":377,"name":"minecraft:element_111"},{"data":13,"id":377,"name":"minecraft:element_111"},{"data":14,"id":377,"name":"minecraft:element_111"},{"data":15,"id":377,"name":"minecraft:element_111"},{"data":0,"id":378,"name":"minecraft:element_112"},{"data":1,"id":378,"name":"minecraft:element_112"},{"data":2,"id":378,"name":"minecraft:element_112"},{"data":3,"id":378,"name":"minecraft:element_112"},{"data":4,"id":378,"name":"minecraft:element_112"},{"data":5,"id":378,"name":"minecraft:element_112"},{"data":6,"id":378,"name":"minecraft:element_112"},{"data":7,"id":378,"name":"minecraft:element_112"},{"data":8,"id":378,"name":"minecraft:element_112"},{"data":9,"id":378,"name":"minecraft:element_112"},{"data":10,"id":378,"name":"minecraft:element_112"},{"data":11,"id":378,"name":"minecraft:element_112"},{"data":12,"id":378,"name":"minecraft:element_112"},{"data":13,"id":378,"name":"minecraft:element_112"},{"data":14,"id":378,"name":"minecraft:element_112"},{"data":15,"id":378,"name":"minecraft:element_112"},{"data":0,"id":379,"name":"minecraft:element_113"},{"data":1,"id":379,"name":"minecraft:element_113"},{"data":2,"id":379,"name":"minecraft:element_113"},{"data":3,"id":379,"name":"minecraft:element_113"},{"data":4,"id":379,"name":"minecraft:element_113"},{"data":5,"id":379,"name":"minecraft:element_113"},{"data":6,"id":379,"name":"minecraft:element_113"},{"data":7,"id":379,"name":"minecraft:element_113"},{"data":8,"id":379,"name":"minecraft:element_113"},{"data":9,"id":379,"name":"minecraft:element_113"},{"data":10,"id":379,"name":"minecraft:element_113"},{"data":11,"id":379,"name":"minecraft:element_113"},{"data":12,"id":379,"name":"minecraft:element_113"},{"data":13,"id":379,"name":"minecraft:element_113"},{"data":14,"id":379,"name":"minecraft:element_113"},{"data":15,"id":379,"name":"minecraft:element_113"},{"data":0,"id":380,"name":"minecraft:element_114"},{"data":1,"id":380,"name":"minecraft:element_114"},{"data":2,"id":380,"name":"minecraft:element_114"},{"data":3,"id":380,"name":"minecraft:element_114"},{"data":4,"id":380,"name":"minecraft:element_114"},{"data":5,"id":380,"name":"minecraft:element_114"},{"data":6,"id":380,"name":"minecraft:element_114"},{"data":7,"id":380,"name":"minecraft:element_114"},{"data":8,"id":380,"name":"minecraft:element_114"},{"data":9,"id":380,"name":"minecraft:element_114"},{"data":10,"id":380,"name":"minecraft:element_114"},{"data":11,"id":380,"name":"minecraft:element_114"},{"data":12,"id":380,"name":"minecraft:element_114"},{"data":13,"id":380,"name":"minecraft:element_114"},{"data":14,"id":380,"name":"minecraft:element_114"},{"data":15,"id":380,"name":"minecraft:element_114"},{"data":0,"id":381,"name":"minecraft:element_115"},{"data":1,"id":381,"name":"minecraft:element_115"},{"data":2,"id":381,"name":"minecraft:element_115"},{"data":3,"id":381,"name":"minecraft:element_115"},{"data":4,"id":381,"name":"minecraft:element_115"},{"data":5,"id":381,"name":"minecraft:element_115"},{"data":6,"id":381,"name":"minecraft:element_115"},{"data":7,"id":381,"name":"minecraft:element_115"},{"data":8,"id":381,"name":"minecraft:element_115"},{"data":9,"id":381,"name":"minecraft:element_115"},{"data":10,"id":381,"name":"minecraft:element_115"},{"data":11,"id":381,"name":"minecraft:element_115"},{"data":12,"id":381,"name":"minecraft:element_115"},{"data":13,"id":381,"name":"minecraft:element_115"},{"data":14,"id":381,"name":"minecraft:element_115"},{"data":15,"id":381,"name":"minecraft:element_115"},{"data":0,"id":382,"name":"minecraft:element_116"},{"data":1,"id":382,"name":"minecraft:element_116"},{"data":2,"id":382,"name":"minecraft:element_116"},{"data":3,"id":382,"name":"minecraft:element_116"},{"data":4,"id":382,"name":"minecraft:element_116"},{"data":5,"id":382,"name":"minecraft:element_116"},{"data":6,"id":382,"name":"minecraft:element_116"},{"data":7,"id":382,"name":"minecraft:element_116"},{"data":8,"id":382,"name":"minecraft:element_116"},{"data":9,"id":382,"name":"minecraft:element_116"},{"data":10,"id":382,"name":"minecraft:element_116"},{"data":11,"id":382,"name":"minecraft:element_116"},{"data":12,"id":382,"name":"minecraft:element_116"},{"data":13,"id":382,"name":"minecraft:element_116"},{"data":14,"id":382,"name":"minecraft:element_116"},{"data":15,"id":382,"name":"minecraft:element_116"},{"data":0,"id":383,"name":"minecraft:element_117"},{"data":1,"id":383,"name":"minecraft:element_117"},{"data":2,"id":383,"name":"minecraft:element_117"},{"data":3,"id":383,"name":"minecraft:element_117"},{"data":4,"id":383,"name":"minecraft:element_117"},{"data":5,"id":383,"name":"minecraft:element_117"},{"data":6,"id":383,"name":"minecraft:element_117"},{"data":7,"id":383,"name":"minecraft:element_117"},{"data":8,"id":383,"name":"minecraft:element_117"},{"data":9,"id":383,"name":"minecraft:element_117"},{"data":10,"id":383,"name":"minecraft:element_117"},{"data":11,"id":383,"name":"minecraft:element_117"},{"data":12,"id":383,"name":"minecraft:element_117"},{"data":13,"id":383,"name":"minecraft:element_117"},{"data":14,"id":383,"name":"minecraft:element_117"},{"data":15,"id":383,"name":"minecraft:element_117"},{"data":0,"id":384,"name":"minecraft:element_118"},{"data":1,"id":384,"name":"minecraft:element_118"},{"data":2,"id":384,"name":"minecraft:element_118"},{"data":3,"id":384,"name":"minecraft:element_118"},{"data":4,"id":384,"name":"minecraft:element_118"},{"data":5,"id":384,"name":"minecraft:element_118"},{"data":6,"id":384,"name":"minecraft:element_118"},{"data":7,"id":384,"name":"minecraft:element_118"},{"data":8,"id":384,"name":"minecraft:element_118"},{"data":9,"id":384,"name":"minecraft:element_118"},{"data":10,"id":384,"name":"minecraft:element_118"},{"data":11,"id":384,"name":"minecraft:element_118"},{"data":12,"id":384,"name":"minecraft:element_118"},{"data":13,"id":384,"name":"minecraft:element_118"},{"data":14,"id":384,"name":"minecraft:element_118"},{"data":15,"id":384,"name":"minecraft:element_118"},{"data":0,"id":385,"name":"minecraft:seagrass"},{"data":1,"id":385,"name":"minecraft:seagrass"},{"data":2,"id":385,"name":"minecraft:seagrass"},{"data":3,"id":385,"name":"minecraft:seagrass"},{"data":0,"id":386,"name":"minecraft:coral"},{"data":1,"id":386,"name":"minecraft:coral"},{"data":2,"id":386,"name":"minecraft:coral"},{"data":3,"id":386,"name":"minecraft:coral"},{"data":4,"id":386,"name":"minecraft:coral"},{"data":5,"id":386,"name":"minecraft:coral"},{"data":6,"id":386,"name":"minecraft:coral"},{"data":7,"id":386,"name":"minecraft:coral"},{"data":8,"id":386,"name":"minecraft:coral"},{"data":9,"id":386,"name":"minecraft:coral"},{"data":10,"id":386,"name":"minecraft:coral"},{"data":11,"id":386,"name":"minecraft:coral"},{"data":12,"id":386,"name":"minecraft:coral"},{"data":13,"id":386,"name":"minecraft:coral"},{"data":14,"id":386,"name":"minecraft:coral"},{"data":15,"id":386,"name":"minecraft:coral"},{"data":0,"id":387,"name":"minecraft:coral_block"},{"data":1,"id":387,"name":"minecraft:coral_block"},{"data":2,"id":387,"name":"minecraft:coral_block"},{"data":3,"id":387,"name":"minecraft:coral_block"},{"data":4,"id":387,"name":"minecraft:coral_block"},{"data":5,"id":387,"name":"minecraft:coral_block"},{"data":6,"id":387,"name":"minecraft:coral_block"},{"data":7,"id":387,"name":"minecraft:coral_block"},{"data":8,"id":387,"name":"minecraft:coral_block"},{"data":9,"id":387,"name":"minecraft:coral_block"},{"data":10,"id":387,"name":"minecraft:coral_block"},{"data":11,"id":387,"name":"minecraft:coral_block"},{"data":12,"id":387,"name":"minecraft:coral_block"},{"data":13,"id":387,"name":"minecraft:coral_block"},{"data":14,"id":387,"name":"minecraft:coral_block"},{"data":15,"id":387,"name":"minecraft:coral_block"},{"data":0,"id":388,"name":"minecraft:coral_fan"},{"data":1,"id":388,"name":"minecraft:coral_fan"},{"data":2,"id":388,"name":"minecraft:coral_fan"},{"data":3,"id":388,"name":"minecraft:coral_fan"},{"data":4,"id":388,"name":"minecraft:coral_fan"},{"data":5,"id":388,"name":"minecraft:coral_fan"},{"data":6,"id":388,"name":"minecraft:coral_fan"},{"data":7,"id":388,"name":"minecraft:coral_fan"},{"data":8,"id":388,"name":"minecraft:coral_fan"},{"data":9,"id":388,"name":"minecraft:coral_fan"},{"data":10,"id":388,"name":"minecraft:coral_fan"},{"data":11,"id":388,"name":"minecraft:coral_fan"},{"data":12,"id":388,"name":"minecraft:coral_fan"},{"data":13,"id":388,"name":"minecraft:coral_fan"},{"data":14,"id":388,"name":"minecraft:coral_fan"},{"data":15,"id":388,"name":"minecraft:coral_fan"},{"data":0,"id":389,"name":"minecraft:coral_fan_dead"},{"data":1,"id":389,"name":"minecraft:coral_fan_dead"},{"data":2,"id":389,"name":"minecraft:coral_fan_dead"},{"data":3,"id":389,"name":"minecraft:coral_fan_dead"},{"data":4,"id":389,"name":"minecraft:coral_fan_dead"},{"data":5,"id":389,"name":"minecraft:coral_fan_dead"},{"data":6,"id":389,"name":"minecraft:coral_fan_dead"},{"data":7,"id":389,"name":"minecraft:coral_fan_dead"},{"data":8,"id":389,"name":"minecraft:coral_fan_dead"},{"data":9,"id":389,"name":"minecraft:coral_fan_dead"},{"data":10,"id":389,"name":"minecraft:coral_fan_dead"},{"data":11,"id":389,"name":"minecraft:coral_fan_dead"},{"data":12,"id":389,"name":"minecraft:coral_fan_dead"},{"data":13,"id":389,"name":"minecraft:coral_fan_dead"},{"data":14,"id":389,"name":"minecraft:coral_fan_dead"},{"data":15,"id":389,"name":"minecraft:coral_fan_dead"},{"data":0,"id":390,"name":"minecraft:coral_fan_hang"},{"data":1,"id":390,"name":"minecraft:coral_fan_hang"},{"data":2,"id":390,"name":"minecraft:coral_fan_hang"},{"data":3,"id":390,"name":"minecraft:coral_fan_hang"},{"data":4,"id":390,"name":"minecraft:coral_fan_hang"},{"data":5,"id":390,"name":"minecraft:coral_fan_hang"},{"data":6,"id":390,"name":"minecraft:coral_fan_hang"},{"data":7,"id":390,"name":"minecraft:coral_fan_hang"},{"data":8,"id":390,"name":"minecraft:coral_fan_hang"},{"data":9,"id":390,"name":"minecraft:coral_fan_hang"},{"data":10,"id":390,"name":"minecraft:coral_fan_hang"},{"data":11,"id":390,"name":"minecraft:coral_fan_hang"},{"data":12,"id":390,"name":"minecraft:coral_fan_hang"},{"data":13,"id":390,"name":"minecraft:coral_fan_hang"},{"data":14,"id":390,"name":"minecraft:coral_fan_hang"},{"data":15,"id":390,"name":"minecraft:coral_fan_hang"},{"data":0,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":1,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":2,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":3,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":4,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":5,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":6,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":7,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":8,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":9,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":10,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":11,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":12,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":13,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":14,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":15,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":0,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":1,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":2,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":3,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":4,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":5,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":6,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":7,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":8,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":9,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":10,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":11,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":12,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":13,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":14,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":15,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":0,"id":393,"name":"minecraft:kelp"},{"data":1,"id":393,"name":"minecraft:kelp"},{"data":2,"id":393,"name":"minecraft:kelp"},{"data":3,"id":393,"name":"minecraft:kelp"},{"data":4,"id":393,"name":"minecraft:kelp"},{"data":5,"id":393,"name":"minecraft:kelp"},{"data":6,"id":393,"name":"minecraft:kelp"},{"data":7,"id":393,"name":"minecraft:kelp"},{"data":8,"id":393,"name":"minecraft:kelp"},{"data":9,"id":393,"name":"minecraft:kelp"},{"data":10,"id":393,"name":"minecraft:kelp"},{"data":11,"id":393,"name":"minecraft:kelp"},{"data":12,"id":393,"name":"minecraft:kelp"},{"data":13,"id":393,"name":"minecraft:kelp"},{"data":14,"id":393,"name":"minecraft:kelp"},{"data":15,"id":393,"name":"minecraft:kelp"},{"data":0,"id":394,"name":"minecraft:dried_kelp_block"},{"data":0,"id":395,"name":"minecraft:acacia_button"},{"data":1,"id":395,"name":"minecraft:acacia_button"},{"data":2,"id":395,"name":"minecraft:acacia_button"},{"data":3,"id":395,"name":"minecraft:acacia_button"},{"data":4,"id":395,"name":"minecraft:acacia_button"},{"data":5,"id":395,"name":"minecraft:acacia_button"},{"data":6,"id":395,"name":"minecraft:acacia_button"},{"data":7,"id":395,"name":"minecraft:acacia_button"},{"data":8,"id":395,"name":"minecraft:acacia_button"},{"data":9,"id":395,"name":"minecraft:acacia_button"},{"data":10,"id":395,"name":"minecraft:acacia_button"},{"data":11,"id":395,"name":"minecraft:acacia_button"},{"data":12,"id":395,"name":"minecraft:acacia_button"},{"data":13,"id":395,"name":"minecraft:acacia_button"},{"data":14,"id":395,"name":"minecraft:acacia_button"},{"data":15,"id":395,"name":"minecraft:acacia_button"},{"data":0,"id":396,"name":"minecraft:birch_button"},{"data":1,"id":396,"name":"minecraft:birch_button"},{"data":2,"id":396,"name":"minecraft:birch_button"},{"data":3,"id":396,"name":"minecraft:birch_button"},{"data":4,"id":396,"name":"minecraft:birch_button"},{"data":5,"id":396,"name":"minecraft:birch_button"},{"data":6,"id":396,"name":"minecraft:birch_button"},{"data":7,"id":396,"name":"minecraft:birch_button"},{"data":8,"id":396,"name":"minecraft:birch_button"},{"data":9,"id":396,"name":"minecraft:birch_button"},{"data":10,"id":396,"name":"minecraft:birch_button"},{"data":11,"id":396,"name":"minecraft:birch_button"},{"data":12,"id":396,"name":"minecraft:birch_button"},{"data":13,"id":396,"name":"minecraft:birch_button"},{"data":14,"id":396,"name":"minecraft:birch_button"},{"data":15,"id":396,"name":"minecraft:birch_button"},{"data":0,"id":397,"name":"minecraft:dark_oak_button"},{"data":1,"id":397,"name":"minecraft:dark_oak_button"},{"data":2,"id":397,"name":"minecraft:dark_oak_button"},{"data":3,"id":397,"name":"minecraft:dark_oak_button"},{"data":4,"id":397,"name":"minecraft:dark_oak_button"},{"data":5,"id":397,"name":"minecraft:dark_oak_button"},{"data":6,"id":397,"name":"minecraft:dark_oak_button"},{"data":7,"id":397,"name":"minecraft:dark_oak_button"},{"data":8,"id":397,"name":"minecraft:dark_oak_button"},{"data":9,"id":397,"name":"minecraft:dark_oak_button"},{"data":10,"id":397,"name":"minecraft:dark_oak_button"},{"data":11,"id":397,"name":"minecraft:dark_oak_button"},{"data":12,"id":397,"name":"minecraft:dark_oak_button"},{"data":13,"id":397,"name":"minecraft:dark_oak_button"},{"data":14,"id":397,"name":"minecraft:dark_oak_button"},{"data":15,"id":397,"name":"minecraft:dark_oak_button"},{"data":0,"id":398,"name":"minecraft:jungle_button"},{"data":1,"id":398,"name":"minecraft:jungle_button"},{"data":2,"id":398,"name":"minecraft:jungle_button"},{"data":3,"id":398,"name":"minecraft:jungle_button"},{"data":4,"id":398,"name":"minecraft:jungle_button"},{"data":5,"id":398,"name":"minecraft:jungle_button"},{"data":6,"id":398,"name":"minecraft:jungle_button"},{"data":7,"id":398,"name":"minecraft:jungle_button"},{"data":8,"id":398,"name":"minecraft:jungle_button"},{"data":9,"id":398,"name":"minecraft:jungle_button"},{"data":10,"id":398,"name":"minecraft:jungle_button"},{"data":11,"id":398,"name":"minecraft:jungle_button"},{"data":12,"id":398,"name":"minecraft:jungle_button"},{"data":13,"id":398,"name":"minecraft:jungle_button"},{"data":14,"id":398,"name":"minecraft:jungle_button"},{"data":15,"id":398,"name":"minecraft:jungle_button"},{"data":0,"id":399,"name":"minecraft:spruce_button"},{"data":1,"id":399,"name":"minecraft:spruce_button"},{"data":2,"id":399,"name":"minecraft:spruce_button"},{"data":3,"id":399,"name":"minecraft:spruce_button"},{"data":4,"id":399,"name":"minecraft:spruce_button"},{"data":5,"id":399,"name":"minecraft:spruce_button"},{"data":6,"id":399,"name":"minecraft:spruce_button"},{"data":7,"id":399,"name":"minecraft:spruce_button"},{"data":8,"id":399,"name":"minecraft:spruce_button"},{"data":9,"id":399,"name":"minecraft:spruce_button"},{"data":10,"id":399,"name":"minecraft:spruce_button"},{"data":11,"id":399,"name":"minecraft:spruce_button"},{"data":12,"id":399,"name":"minecraft:spruce_button"},{"data":13,"id":399,"name":"minecraft:spruce_button"},{"data":14,"id":399,"name":"minecraft:spruce_button"},{"data":15,"id":399,"name":"minecraft:spruce_button"},{"data":0,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":1,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":2,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":3,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":4,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":5,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":6,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":7,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":8,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":9,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":10,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":11,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":12,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":13,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":14,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":15,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":0,"id":401,"name":"minecraft:birch_trapdoor"},{"data":1,"id":401,"name":"minecraft:birch_trapdoor"},{"data":2,"id":401,"name":"minecraft:birch_trapdoor"},{"data":3,"id":401,"name":"minecraft:birch_trapdoor"},{"data":4,"id":401,"name":"minecraft:birch_trapdoor"},{"data":5,"id":401,"name":"minecraft:birch_trapdoor"},{"data":6,"id":401,"name":"minecraft:birch_trapdoor"},{"data":7,"id":401,"name":"minecraft:birch_trapdoor"},{"data":8,"id":401,"name":"minecraft:birch_trapdoor"},{"data":9,"id":401,"name":"minecraft:birch_trapdoor"},{"data":10,"id":401,"name":"minecraft:birch_trapdoor"},{"data":11,"id":401,"name":"minecraft:birch_trapdoor"},{"data":12,"id":401,"name":"minecraft:birch_trapdoor"},{"data":13,"id":401,"name":"minecraft:birch_trapdoor"},{"data":14,"id":401,"name":"minecraft:birch_trapdoor"},{"data":15,"id":401,"name":"minecraft:birch_trapdoor"},{"data":0,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":1,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":2,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":3,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":4,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":5,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":6,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":7,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":8,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":9,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":10,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":11,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":12,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":13,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":14,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":15,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":0,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":1,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":2,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":3,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":4,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":5,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":6,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":7,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":8,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":9,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":10,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":11,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":12,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":13,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":14,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":15,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":0,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":1,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":2,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":3,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":4,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":5,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":6,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":7,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":8,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":9,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":10,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":11,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":12,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":13,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":14,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":15,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":0,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":1,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":2,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":3,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":4,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":5,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":6,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":7,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":8,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":9,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":10,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":11,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":12,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":13,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":14,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":15,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":0,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":1,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":2,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":3,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":4,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":5,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":6,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":7,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":8,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":9,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":10,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":11,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":12,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":13,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":14,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":15,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":0,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":1,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":2,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":3,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":4,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":5,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":6,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":7,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":8,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":9,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":10,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":11,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":12,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":13,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":14,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":15,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":0,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":1,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":2,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":3,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":4,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":5,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":6,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":7,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":8,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":9,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":10,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":11,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":12,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":13,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":14,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":15,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":0,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":1,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":2,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":3,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":4,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":5,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":6,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":7,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":8,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":9,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":10,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":11,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":12,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":13,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":14,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":15,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":0,"id":410,"name":"minecraft:carved_pumpkin"},{"data":1,"id":410,"name":"minecraft:carved_pumpkin"},{"data":2,"id":410,"name":"minecraft:carved_pumpkin"},{"data":3,"id":410,"name":"minecraft:carved_pumpkin"},{"data":0,"id":411,"name":"minecraft:sea_pickle"},{"data":1,"id":411,"name":"minecraft:sea_pickle"},{"data":2,"id":411,"name":"minecraft:sea_pickle"},{"data":3,"id":411,"name":"minecraft:sea_pickle"},{"data":4,"id":411,"name":"minecraft:sea_pickle"},{"data":5,"id":411,"name":"minecraft:sea_pickle"},{"data":6,"id":411,"name":"minecraft:sea_pickle"},{"data":7,"id":411,"name":"minecraft:sea_pickle"},{"data":0,"id":412,"name":"minecraft:conduit"},{"data":0,"id":414,"name":"minecraft:turtle_egg"},{"data":1,"id":414,"name":"minecraft:turtle_egg"},{"data":2,"id":414,"name":"minecraft:turtle_egg"},{"data":3,"id":414,"name":"minecraft:turtle_egg"},{"data":4,"id":414,"name":"minecraft:turtle_egg"},{"data":5,"id":414,"name":"minecraft:turtle_egg"},{"data":6,"id":414,"name":"minecraft:turtle_egg"},{"data":7,"id":414,"name":"minecraft:turtle_egg"},{"data":8,"id":414,"name":"minecraft:turtle_egg"},{"data":9,"id":414,"name":"minecraft:turtle_egg"},{"data":10,"id":414,"name":"minecraft:turtle_egg"},{"data":11,"id":414,"name":"minecraft:turtle_egg"},{"data":12,"id":414,"name":"minecraft:turtle_egg"},{"data":13,"id":414,"name":"minecraft:turtle_egg"},{"data":14,"id":414,"name":"minecraft:turtle_egg"},{"data":15,"id":414,"name":"minecraft:turtle_egg"},{"data":0,"id":415,"name":"minecraft:bubble_column"},{"data":1,"id":415,"name":"minecraft:bubble_column"}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_291.json b/src/main/resources/runtimeid_table_291.json deleted file mode 100644 index 536a095f7..000000000 --- a/src/main/resources/runtimeid_table_291.json +++ /dev/null @@ -1 +0,0 @@ -[{"data":0,"id":0,"name":"minecraft:air"},{"data":0,"id":1,"name":"minecraft:stone"},{"data":1,"id":1,"name":"minecraft:stone"},{"data":2,"id":1,"name":"minecraft:stone"},{"data":3,"id":1,"name":"minecraft:stone"},{"data":4,"id":1,"name":"minecraft:stone"},{"data":5,"id":1,"name":"minecraft:stone"},{"data":6,"id":1,"name":"minecraft:stone"},{"data":7,"id":1,"name":"minecraft:stone"},{"data":0,"id":2,"name":"minecraft:grass"},{"data":1,"id":2,"name":"minecraft:grass"},{"data":2,"id":2,"name":"minecraft:grass"},{"data":3,"id":2,"name":"minecraft:grass"},{"data":4,"id":2,"name":"minecraft:grass"},{"data":5,"id":2,"name":"minecraft:grass"},{"data":6,"id":2,"name":"minecraft:grass"},{"data":7,"id":2,"name":"minecraft:grass"},{"data":8,"id":2,"name":"minecraft:grass"},{"data":9,"id":2,"name":"minecraft:grass"},{"data":10,"id":2,"name":"minecraft:grass"},{"data":11,"id":2,"name":"minecraft:grass"},{"data":12,"id":2,"name":"minecraft:grass"},{"data":13,"id":2,"name":"minecraft:grass"},{"data":14,"id":2,"name":"minecraft:grass"},{"data":15,"id":2,"name":"minecraft:grass"},{"data":0,"id":3,"name":"minecraft:dirt"},{"data":1,"id":3,"name":"minecraft:dirt"},{"data":0,"id":4,"name":"minecraft:cobblestone"},{"data":0,"id":5,"name":"minecraft:planks"},{"data":1,"id":5,"name":"minecraft:planks"},{"data":2,"id":5,"name":"minecraft:planks"},{"data":3,"id":5,"name":"minecraft:planks"},{"data":4,"id":5,"name":"minecraft:planks"},{"data":5,"id":5,"name":"minecraft:planks"},{"data":6,"id":5,"name":"minecraft:planks"},{"data":7,"id":5,"name":"minecraft:planks"},{"data":0,"id":6,"name":"minecraft:sapling"},{"data":1,"id":6,"name":"minecraft:sapling"},{"data":2,"id":6,"name":"minecraft:sapling"},{"data":3,"id":6,"name":"minecraft:sapling"},{"data":4,"id":6,"name":"minecraft:sapling"},{"data":5,"id":6,"name":"minecraft:sapling"},{"data":6,"id":6,"name":"minecraft:sapling"},{"data":7,"id":6,"name":"minecraft:sapling"},{"data":8,"id":6,"name":"minecraft:sapling"},{"data":9,"id":6,"name":"minecraft:sapling"},{"data":10,"id":6,"name":"minecraft:sapling"},{"data":11,"id":6,"name":"minecraft:sapling"},{"data":12,"id":6,"name":"minecraft:sapling"},{"data":13,"id":6,"name":"minecraft:sapling"},{"data":14,"id":6,"name":"minecraft:sapling"},{"data":15,"id":6,"name":"minecraft:sapling"},{"data":0,"id":7,"name":"minecraft:bedrock"},{"data":1,"id":7,"name":"minecraft:bedrock"},{"data":0,"id":8,"name":"minecraft:flowing_water"},{"data":1,"id":8,"name":"minecraft:flowing_water"},{"data":2,"id":8,"name":"minecraft:flowing_water"},{"data":3,"id":8,"name":"minecraft:flowing_water"},{"data":4,"id":8,"name":"minecraft:flowing_water"},{"data":5,"id":8,"name":"minecraft:flowing_water"},{"data":6,"id":8,"name":"minecraft:flowing_water"},{"data":7,"id":8,"name":"minecraft:flowing_water"},{"data":8,"id":8,"name":"minecraft:flowing_water"},{"data":9,"id":8,"name":"minecraft:flowing_water"},{"data":10,"id":8,"name":"minecraft:flowing_water"},{"data":11,"id":8,"name":"minecraft:flowing_water"},{"data":12,"id":8,"name":"minecraft:flowing_water"},{"data":13,"id":8,"name":"minecraft:flowing_water"},{"data":14,"id":8,"name":"minecraft:flowing_water"},{"data":15,"id":8,"name":"minecraft:flowing_water"},{"data":0,"id":9,"name":"minecraft:water"},{"data":1,"id":9,"name":"minecraft:water"},{"data":2,"id":9,"name":"minecraft:water"},{"data":3,"id":9,"name":"minecraft:water"},{"data":4,"id":9,"name":"minecraft:water"},{"data":5,"id":9,"name":"minecraft:water"},{"data":6,"id":9,"name":"minecraft:water"},{"data":7,"id":9,"name":"minecraft:water"},{"data":8,"id":9,"name":"minecraft:water"},{"data":9,"id":9,"name":"minecraft:water"},{"data":10,"id":9,"name":"minecraft:water"},{"data":11,"id":9,"name":"minecraft:water"},{"data":12,"id":9,"name":"minecraft:water"},{"data":13,"id":9,"name":"minecraft:water"},{"data":14,"id":9,"name":"minecraft:water"},{"data":15,"id":9,"name":"minecraft:water"},{"data":0,"id":10,"name":"minecraft:flowing_lava"},{"data":1,"id":10,"name":"minecraft:flowing_lava"},{"data":2,"id":10,"name":"minecraft:flowing_lava"},{"data":3,"id":10,"name":"minecraft:flowing_lava"},{"data":4,"id":10,"name":"minecraft:flowing_lava"},{"data":5,"id":10,"name":"minecraft:flowing_lava"},{"data":6,"id":10,"name":"minecraft:flowing_lava"},{"data":7,"id":10,"name":"minecraft:flowing_lava"},{"data":8,"id":10,"name":"minecraft:flowing_lava"},{"data":9,"id":10,"name":"minecraft:flowing_lava"},{"data":10,"id":10,"name":"minecraft:flowing_lava"},{"data":11,"id":10,"name":"minecraft:flowing_lava"},{"data":12,"id":10,"name":"minecraft:flowing_lava"},{"data":13,"id":10,"name":"minecraft:flowing_lava"},{"data":14,"id":10,"name":"minecraft:flowing_lava"},{"data":15,"id":10,"name":"minecraft:flowing_lava"},{"data":0,"id":11,"name":"minecraft:lava"},{"data":1,"id":11,"name":"minecraft:lava"},{"data":2,"id":11,"name":"minecraft:lava"},{"data":3,"id":11,"name":"minecraft:lava"},{"data":4,"id":11,"name":"minecraft:lava"},{"data":5,"id":11,"name":"minecraft:lava"},{"data":6,"id":11,"name":"minecraft:lava"},{"data":7,"id":11,"name":"minecraft:lava"},{"data":8,"id":11,"name":"minecraft:lava"},{"data":9,"id":11,"name":"minecraft:lava"},{"data":10,"id":11,"name":"minecraft:lava"},{"data":11,"id":11,"name":"minecraft:lava"},{"data":12,"id":11,"name":"minecraft:lava"},{"data":13,"id":11,"name":"minecraft:lava"},{"data":14,"id":11,"name":"minecraft:lava"},{"data":15,"id":11,"name":"minecraft:lava"},{"data":0,"id":12,"name":"minecraft:sand"},{"data":1,"id":12,"name":"minecraft:sand"},{"data":0,"id":13,"name":"minecraft:gravel"},{"data":0,"id":14,"name":"minecraft:gold_ore"},{"data":0,"id":15,"name":"minecraft:iron_ore"},{"data":0,"id":16,"name":"minecraft:coal_ore"},{"data":0,"id":17,"name":"minecraft:log"},{"data":1,"id":17,"name":"minecraft:log"},{"data":2,"id":17,"name":"minecraft:log"},{"data":3,"id":17,"name":"minecraft:log"},{"data":4,"id":17,"name":"minecraft:log"},{"data":5,"id":17,"name":"minecraft:log"},{"data":6,"id":17,"name":"minecraft:log"},{"data":7,"id":17,"name":"minecraft:log"},{"data":8,"id":17,"name":"minecraft:log"},{"data":9,"id":17,"name":"minecraft:log"},{"data":10,"id":17,"name":"minecraft:log"},{"data":11,"id":17,"name":"minecraft:log"},{"data":12,"id":17,"name":"minecraft:log"},{"data":13,"id":17,"name":"minecraft:log"},{"data":14,"id":17,"name":"minecraft:log"},{"data":15,"id":17,"name":"minecraft:log"},{"data":0,"id":18,"name":"minecraft:leaves"},{"data":1,"id":18,"name":"minecraft:leaves"},{"data":2,"id":18,"name":"minecraft:leaves"},{"data":3,"id":18,"name":"minecraft:leaves"},{"data":4,"id":18,"name":"minecraft:leaves"},{"data":5,"id":18,"name":"minecraft:leaves"},{"data":6,"id":18,"name":"minecraft:leaves"},{"data":7,"id":18,"name":"minecraft:leaves"},{"data":8,"id":18,"name":"minecraft:leaves"},{"data":9,"id":18,"name":"minecraft:leaves"},{"data":10,"id":18,"name":"minecraft:leaves"},{"data":11,"id":18,"name":"minecraft:leaves"},{"data":12,"id":18,"name":"minecraft:leaves"},{"data":13,"id":18,"name":"minecraft:leaves"},{"data":14,"id":18,"name":"minecraft:leaves"},{"data":15,"id":18,"name":"minecraft:leaves"},{"data":0,"id":19,"name":"minecraft:sponge"},{"data":1,"id":19,"name":"minecraft:sponge"},{"data":0,"id":20,"name":"minecraft:glass"},{"data":0,"id":21,"name":"minecraft:lapis_ore"},{"data":0,"id":22,"name":"minecraft:lapis_block"},{"data":0,"id":23,"name":"minecraft:dispenser"},{"data":1,"id":23,"name":"minecraft:dispenser"},{"data":2,"id":23,"name":"minecraft:dispenser"},{"data":3,"id":23,"name":"minecraft:dispenser"},{"data":4,"id":23,"name":"minecraft:dispenser"},{"data":5,"id":23,"name":"minecraft:dispenser"},{"data":6,"id":23,"name":"minecraft:dispenser"},{"data":7,"id":23,"name":"minecraft:dispenser"},{"data":8,"id":23,"name":"minecraft:dispenser"},{"data":9,"id":23,"name":"minecraft:dispenser"},{"data":10,"id":23,"name":"minecraft:dispenser"},{"data":11,"id":23,"name":"minecraft:dispenser"},{"data":12,"id":23,"name":"minecraft:dispenser"},{"data":13,"id":23,"name":"minecraft:dispenser"},{"data":14,"id":23,"name":"minecraft:dispenser"},{"data":15,"id":23,"name":"minecraft:dispenser"},{"data":0,"id":24,"name":"minecraft:sandstone"},{"data":1,"id":24,"name":"minecraft:sandstone"},{"data":2,"id":24,"name":"minecraft:sandstone"},{"data":3,"id":24,"name":"minecraft:sandstone"},{"data":0,"id":25,"name":"minecraft:noteblock"},{"data":0,"id":26,"name":"minecraft:bed"},{"data":1,"id":26,"name":"minecraft:bed"},{"data":2,"id":26,"name":"minecraft:bed"},{"data":3,"id":26,"name":"minecraft:bed"},{"data":4,"id":26,"name":"minecraft:bed"},{"data":5,"id":26,"name":"minecraft:bed"},{"data":6,"id":26,"name":"minecraft:bed"},{"data":7,"id":26,"name":"minecraft:bed"},{"data":8,"id":26,"name":"minecraft:bed"},{"data":9,"id":26,"name":"minecraft:bed"},{"data":10,"id":26,"name":"minecraft:bed"},{"data":11,"id":26,"name":"minecraft:bed"},{"data":12,"id":26,"name":"minecraft:bed"},{"data":13,"id":26,"name":"minecraft:bed"},{"data":14,"id":26,"name":"minecraft:bed"},{"data":15,"id":26,"name":"minecraft:bed"},{"data":0,"id":27,"name":"minecraft:golden_rail"},{"data":1,"id":27,"name":"minecraft:golden_rail"},{"data":2,"id":27,"name":"minecraft:golden_rail"},{"data":3,"id":27,"name":"minecraft:golden_rail"},{"data":4,"id":27,"name":"minecraft:golden_rail"},{"data":5,"id":27,"name":"minecraft:golden_rail"},{"data":6,"id":27,"name":"minecraft:golden_rail"},{"data":7,"id":27,"name":"minecraft:golden_rail"},{"data":8,"id":27,"name":"minecraft:golden_rail"},{"data":9,"id":27,"name":"minecraft:golden_rail"},{"data":10,"id":27,"name":"minecraft:golden_rail"},{"data":11,"id":27,"name":"minecraft:golden_rail"},{"data":12,"id":27,"name":"minecraft:golden_rail"},{"data":13,"id":27,"name":"minecraft:golden_rail"},{"data":14,"id":27,"name":"minecraft:golden_rail"},{"data":15,"id":27,"name":"minecraft:golden_rail"},{"data":0,"id":28,"name":"minecraft:detector_rail"},{"data":1,"id":28,"name":"minecraft:detector_rail"},{"data":2,"id":28,"name":"minecraft:detector_rail"},{"data":3,"id":28,"name":"minecraft:detector_rail"},{"data":4,"id":28,"name":"minecraft:detector_rail"},{"data":5,"id":28,"name":"minecraft:detector_rail"},{"data":6,"id":28,"name":"minecraft:detector_rail"},{"data":7,"id":28,"name":"minecraft:detector_rail"},{"data":8,"id":28,"name":"minecraft:detector_rail"},{"data":9,"id":28,"name":"minecraft:detector_rail"},{"data":10,"id":28,"name":"minecraft:detector_rail"},{"data":11,"id":28,"name":"minecraft:detector_rail"},{"data":12,"id":28,"name":"minecraft:detector_rail"},{"data":13,"id":28,"name":"minecraft:detector_rail"},{"data":14,"id":28,"name":"minecraft:detector_rail"},{"data":15,"id":28,"name":"minecraft:detector_rail"},{"data":0,"id":29,"name":"minecraft:sticky_piston"},{"data":1,"id":29,"name":"minecraft:sticky_piston"},{"data":2,"id":29,"name":"minecraft:sticky_piston"},{"data":3,"id":29,"name":"minecraft:sticky_piston"},{"data":4,"id":29,"name":"minecraft:sticky_piston"},{"data":5,"id":29,"name":"minecraft:sticky_piston"},{"data":6,"id":29,"name":"minecraft:sticky_piston"},{"data":7,"id":29,"name":"minecraft:sticky_piston"},{"data":0,"id":30,"name":"minecraft:web"},{"data":0,"id":31,"name":"minecraft:tallgrass"},{"data":1,"id":31,"name":"minecraft:tallgrass"},{"data":2,"id":31,"name":"minecraft:tallgrass"},{"data":3,"id":31,"name":"minecraft:tallgrass"},{"data":0,"id":32,"name":"minecraft:deadbush"},{"data":0,"id":33,"name":"minecraft:piston"},{"data":1,"id":33,"name":"minecraft:piston"},{"data":2,"id":33,"name":"minecraft:piston"},{"data":3,"id":33,"name":"minecraft:piston"},{"data":4,"id":33,"name":"minecraft:piston"},{"data":5,"id":33,"name":"minecraft:piston"},{"data":6,"id":33,"name":"minecraft:piston"},{"data":7,"id":33,"name":"minecraft:piston"},{"data":0,"id":34,"name":"minecraft:pistonArmCollision"},{"data":1,"id":34,"name":"minecraft:pistonArmCollision"},{"data":2,"id":34,"name":"minecraft:pistonArmCollision"},{"data":3,"id":34,"name":"minecraft:pistonArmCollision"},{"data":4,"id":34,"name":"minecraft:pistonArmCollision"},{"data":5,"id":34,"name":"minecraft:pistonArmCollision"},{"data":6,"id":34,"name":"minecraft:pistonArmCollision"},{"data":7,"id":34,"name":"minecraft:pistonArmCollision"},{"data":0,"id":35,"name":"minecraft:wool"},{"data":1,"id":35,"name":"minecraft:wool"},{"data":2,"id":35,"name":"minecraft:wool"},{"data":3,"id":35,"name":"minecraft:wool"},{"data":4,"id":35,"name":"minecraft:wool"},{"data":5,"id":35,"name":"minecraft:wool"},{"data":6,"id":35,"name":"minecraft:wool"},{"data":7,"id":35,"name":"minecraft:wool"},{"data":8,"id":35,"name":"minecraft:wool"},{"data":9,"id":35,"name":"minecraft:wool"},{"data":10,"id":35,"name":"minecraft:wool"},{"data":11,"id":35,"name":"minecraft:wool"},{"data":12,"id":35,"name":"minecraft:wool"},{"data":13,"id":35,"name":"minecraft:wool"},{"data":14,"id":35,"name":"minecraft:wool"},{"data":15,"id":35,"name":"minecraft:wool"},{"data":0,"id":36,"name":"minecraft:element_0"},{"data":1,"id":36,"name":"minecraft:element_0"},{"data":2,"id":36,"name":"minecraft:element_0"},{"data":3,"id":36,"name":"minecraft:element_0"},{"data":4,"id":36,"name":"minecraft:element_0"},{"data":5,"id":36,"name":"minecraft:element_0"},{"data":6,"id":36,"name":"minecraft:element_0"},{"data":7,"id":36,"name":"minecraft:element_0"},{"data":8,"id":36,"name":"minecraft:element_0"},{"data":9,"id":36,"name":"minecraft:element_0"},{"data":10,"id":36,"name":"minecraft:element_0"},{"data":11,"id":36,"name":"minecraft:element_0"},{"data":12,"id":36,"name":"minecraft:element_0"},{"data":13,"id":36,"name":"minecraft:element_0"},{"data":14,"id":36,"name":"minecraft:element_0"},{"data":15,"id":36,"name":"minecraft:element_0"},{"data":0,"id":37,"name":"minecraft:yellow_flower"},{"data":1,"id":37,"name":"minecraft:yellow_flower"},{"data":2,"id":37,"name":"minecraft:yellow_flower"},{"data":3,"id":37,"name":"minecraft:yellow_flower"},{"data":4,"id":37,"name":"minecraft:yellow_flower"},{"data":5,"id":37,"name":"minecraft:yellow_flower"},{"data":6,"id":37,"name":"minecraft:yellow_flower"},{"data":7,"id":37,"name":"minecraft:yellow_flower"},{"data":8,"id":37,"name":"minecraft:yellow_flower"},{"data":9,"id":37,"name":"minecraft:yellow_flower"},{"data":10,"id":37,"name":"minecraft:yellow_flower"},{"data":11,"id":37,"name":"minecraft:yellow_flower"},{"data":12,"id":37,"name":"minecraft:yellow_flower"},{"data":13,"id":37,"name":"minecraft:yellow_flower"},{"data":14,"id":37,"name":"minecraft:yellow_flower"},{"data":15,"id":37,"name":"minecraft:yellow_flower"},{"data":0,"id":38,"name":"minecraft:red_flower"},{"data":1,"id":38,"name":"minecraft:red_flower"},{"data":2,"id":38,"name":"minecraft:red_flower"},{"data":3,"id":38,"name":"minecraft:red_flower"},{"data":4,"id":38,"name":"minecraft:red_flower"},{"data":5,"id":38,"name":"minecraft:red_flower"},{"data":6,"id":38,"name":"minecraft:red_flower"},{"data":7,"id":38,"name":"minecraft:red_flower"},{"data":8,"id":38,"name":"minecraft:red_flower"},{"data":9,"id":38,"name":"minecraft:red_flower"},{"data":10,"id":38,"name":"minecraft:red_flower"},{"data":11,"id":38,"name":"minecraft:red_flower"},{"data":12,"id":38,"name":"minecraft:red_flower"},{"data":13,"id":38,"name":"minecraft:red_flower"},{"data":14,"id":38,"name":"minecraft:red_flower"},{"data":15,"id":38,"name":"minecraft:red_flower"},{"data":0,"id":39,"name":"minecraft:brown_mushroom"},{"data":0,"id":40,"name":"minecraft:red_mushroom"},{"data":0,"id":41,"name":"minecraft:gold_block"},{"data":0,"id":42,"name":"minecraft:iron_block"},{"data":0,"id":43,"name":"minecraft:double_stone_slab"},{"data":1,"id":43,"name":"minecraft:double_stone_slab"},{"data":2,"id":43,"name":"minecraft:double_stone_slab"},{"data":3,"id":43,"name":"minecraft:double_stone_slab"},{"data":4,"id":43,"name":"minecraft:double_stone_slab"},{"data":5,"id":43,"name":"minecraft:double_stone_slab"},{"data":6,"id":43,"name":"minecraft:double_stone_slab"},{"data":7,"id":43,"name":"minecraft:double_stone_slab"},{"data":8,"id":43,"name":"minecraft:double_stone_slab"},{"data":9,"id":43,"name":"minecraft:double_stone_slab"},{"data":10,"id":43,"name":"minecraft:double_stone_slab"},{"data":11,"id":43,"name":"minecraft:double_stone_slab"},{"data":12,"id":43,"name":"minecraft:double_stone_slab"},{"data":13,"id":43,"name":"minecraft:double_stone_slab"},{"data":14,"id":43,"name":"minecraft:double_stone_slab"},{"data":15,"id":43,"name":"minecraft:double_stone_slab"},{"data":0,"id":44,"name":"minecraft:stone_slab"},{"data":1,"id":44,"name":"minecraft:stone_slab"},{"data":2,"id":44,"name":"minecraft:stone_slab"},{"data":3,"id":44,"name":"minecraft:stone_slab"},{"data":4,"id":44,"name":"minecraft:stone_slab"},{"data":5,"id":44,"name":"minecraft:stone_slab"},{"data":6,"id":44,"name":"minecraft:stone_slab"},{"data":7,"id":44,"name":"minecraft:stone_slab"},{"data":8,"id":44,"name":"minecraft:stone_slab"},{"data":9,"id":44,"name":"minecraft:stone_slab"},{"data":10,"id":44,"name":"minecraft:stone_slab"},{"data":11,"id":44,"name":"minecraft:stone_slab"},{"data":12,"id":44,"name":"minecraft:stone_slab"},{"data":13,"id":44,"name":"minecraft:stone_slab"},{"data":14,"id":44,"name":"minecraft:stone_slab"},{"data":15,"id":44,"name":"minecraft:stone_slab"},{"data":0,"id":45,"name":"minecraft:brick_block"},{"data":0,"id":46,"name":"minecraft:tnt"},{"data":1,"id":46,"name":"minecraft:tnt"},{"data":2,"id":46,"name":"minecraft:tnt"},{"data":3,"id":46,"name":"minecraft:tnt"},{"data":0,"id":47,"name":"minecraft:bookshelf"},{"data":0,"id":48,"name":"minecraft:mossy_cobblestone"},{"data":0,"id":49,"name":"minecraft:obsidian"},{"data":0,"id":50,"name":"minecraft:torch"},{"data":1,"id":50,"name":"minecraft:torch"},{"data":2,"id":50,"name":"minecraft:torch"},{"data":3,"id":50,"name":"minecraft:torch"},{"data":4,"id":50,"name":"minecraft:torch"},{"data":5,"id":50,"name":"minecraft:torch"},{"data":6,"id":50,"name":"minecraft:torch"},{"data":7,"id":50,"name":"minecraft:torch"},{"data":0,"id":51,"name":"minecraft:fire"},{"data":1,"id":51,"name":"minecraft:fire"},{"data":2,"id":51,"name":"minecraft:fire"},{"data":3,"id":51,"name":"minecraft:fire"},{"data":4,"id":51,"name":"minecraft:fire"},{"data":5,"id":51,"name":"minecraft:fire"},{"data":6,"id":51,"name":"minecraft:fire"},{"data":7,"id":51,"name":"minecraft:fire"},{"data":8,"id":51,"name":"minecraft:fire"},{"data":9,"id":51,"name":"minecraft:fire"},{"data":10,"id":51,"name":"minecraft:fire"},{"data":11,"id":51,"name":"minecraft:fire"},{"data":12,"id":51,"name":"minecraft:fire"},{"data":13,"id":51,"name":"minecraft:fire"},{"data":14,"id":51,"name":"minecraft:fire"},{"data":15,"id":51,"name":"minecraft:fire"},{"data":0,"id":52,"name":"minecraft:mob_spawner"},{"data":0,"id":53,"name":"minecraft:oak_stairs"},{"data":1,"id":53,"name":"minecraft:oak_stairs"},{"data":2,"id":53,"name":"minecraft:oak_stairs"},{"data":3,"id":53,"name":"minecraft:oak_stairs"},{"data":4,"id":53,"name":"minecraft:oak_stairs"},{"data":5,"id":53,"name":"minecraft:oak_stairs"},{"data":6,"id":53,"name":"minecraft:oak_stairs"},{"data":7,"id":53,"name":"minecraft:oak_stairs"},{"data":0,"id":54,"name":"minecraft:chest"},{"data":1,"id":54,"name":"minecraft:chest"},{"data":2,"id":54,"name":"minecraft:chest"},{"data":3,"id":54,"name":"minecraft:chest"},{"data":4,"id":54,"name":"minecraft:chest"},{"data":5,"id":54,"name":"minecraft:chest"},{"data":6,"id":54,"name":"minecraft:chest"},{"data":7,"id":54,"name":"minecraft:chest"},{"data":0,"id":55,"name":"minecraft:redstone_wire"},{"data":1,"id":55,"name":"minecraft:redstone_wire"},{"data":2,"id":55,"name":"minecraft:redstone_wire"},{"data":3,"id":55,"name":"minecraft:redstone_wire"},{"data":4,"id":55,"name":"minecraft:redstone_wire"},{"data":5,"id":55,"name":"minecraft:redstone_wire"},{"data":6,"id":55,"name":"minecraft:redstone_wire"},{"data":7,"id":55,"name":"minecraft:redstone_wire"},{"data":8,"id":55,"name":"minecraft:redstone_wire"},{"data":9,"id":55,"name":"minecraft:redstone_wire"},{"data":10,"id":55,"name":"minecraft:redstone_wire"},{"data":11,"id":55,"name":"minecraft:redstone_wire"},{"data":12,"id":55,"name":"minecraft:redstone_wire"},{"data":13,"id":55,"name":"minecraft:redstone_wire"},{"data":14,"id":55,"name":"minecraft:redstone_wire"},{"data":15,"id":55,"name":"minecraft:redstone_wire"},{"data":0,"id":56,"name":"minecraft:diamond_ore"},{"data":0,"id":57,"name":"minecraft:diamond_block"},{"data":0,"id":58,"name":"minecraft:crafting_table"},{"data":0,"id":59,"name":"minecraft:wheat"},{"data":1,"id":59,"name":"minecraft:wheat"},{"data":2,"id":59,"name":"minecraft:wheat"},{"data":3,"id":59,"name":"minecraft:wheat"},{"data":4,"id":59,"name":"minecraft:wheat"},{"data":5,"id":59,"name":"minecraft:wheat"},{"data":6,"id":59,"name":"minecraft:wheat"},{"data":7,"id":59,"name":"minecraft:wheat"},{"data":0,"id":60,"name":"minecraft:farmland"},{"data":1,"id":60,"name":"minecraft:farmland"},{"data":2,"id":60,"name":"minecraft:farmland"},{"data":3,"id":60,"name":"minecraft:farmland"},{"data":4,"id":60,"name":"minecraft:farmland"},{"data":5,"id":60,"name":"minecraft:farmland"},{"data":6,"id":60,"name":"minecraft:farmland"},{"data":7,"id":60,"name":"minecraft:farmland"},{"data":0,"id":61,"name":"minecraft:furnace"},{"data":1,"id":61,"name":"minecraft:furnace"},{"data":2,"id":61,"name":"minecraft:furnace"},{"data":3,"id":61,"name":"minecraft:furnace"},{"data":4,"id":61,"name":"minecraft:furnace"},{"data":5,"id":61,"name":"minecraft:furnace"},{"data":6,"id":61,"name":"minecraft:furnace"},{"data":7,"id":61,"name":"minecraft:furnace"},{"data":0,"id":62,"name":"minecraft:lit_furnace"},{"data":1,"id":62,"name":"minecraft:lit_furnace"},{"data":2,"id":62,"name":"minecraft:lit_furnace"},{"data":3,"id":62,"name":"minecraft:lit_furnace"},{"data":4,"id":62,"name":"minecraft:lit_furnace"},{"data":5,"id":62,"name":"minecraft:lit_furnace"},{"data":6,"id":62,"name":"minecraft:lit_furnace"},{"data":7,"id":62,"name":"minecraft:lit_furnace"},{"data":0,"id":63,"name":"minecraft:standing_sign"},{"data":1,"id":63,"name":"minecraft:standing_sign"},{"data":2,"id":63,"name":"minecraft:standing_sign"},{"data":3,"id":63,"name":"minecraft:standing_sign"},{"data":4,"id":63,"name":"minecraft:standing_sign"},{"data":5,"id":63,"name":"minecraft:standing_sign"},{"data":6,"id":63,"name":"minecraft:standing_sign"},{"data":7,"id":63,"name":"minecraft:standing_sign"},{"data":8,"id":63,"name":"minecraft:standing_sign"},{"data":9,"id":63,"name":"minecraft:standing_sign"},{"data":10,"id":63,"name":"minecraft:standing_sign"},{"data":11,"id":63,"name":"minecraft:standing_sign"},{"data":12,"id":63,"name":"minecraft:standing_sign"},{"data":13,"id":63,"name":"minecraft:standing_sign"},{"data":14,"id":63,"name":"minecraft:standing_sign"},{"data":15,"id":63,"name":"minecraft:standing_sign"},{"data":0,"id":64,"name":"minecraft:wooden_door"},{"data":1,"id":64,"name":"minecraft:wooden_door"},{"data":2,"id":64,"name":"minecraft:wooden_door"},{"data":3,"id":64,"name":"minecraft:wooden_door"},{"data":4,"id":64,"name":"minecraft:wooden_door"},{"data":5,"id":64,"name":"minecraft:wooden_door"},{"data":6,"id":64,"name":"minecraft:wooden_door"},{"data":7,"id":64,"name":"minecraft:wooden_door"},{"data":8,"id":64,"name":"minecraft:wooden_door"},{"data":9,"id":64,"name":"minecraft:wooden_door"},{"data":10,"id":64,"name":"minecraft:wooden_door"},{"data":11,"id":64,"name":"minecraft:wooden_door"},{"data":12,"id":64,"name":"minecraft:wooden_door"},{"data":13,"id":64,"name":"minecraft:wooden_door"},{"data":14,"id":64,"name":"minecraft:wooden_door"},{"data":15,"id":64,"name":"minecraft:wooden_door"},{"data":0,"id":65,"name":"minecraft:ladder"},{"data":1,"id":65,"name":"minecraft:ladder"},{"data":2,"id":65,"name":"minecraft:ladder"},{"data":3,"id":65,"name":"minecraft:ladder"},{"data":4,"id":65,"name":"minecraft:ladder"},{"data":5,"id":65,"name":"minecraft:ladder"},{"data":6,"id":65,"name":"minecraft:ladder"},{"data":7,"id":65,"name":"minecraft:ladder"},{"data":0,"id":66,"name":"minecraft:rail"},{"data":1,"id":66,"name":"minecraft:rail"},{"data":2,"id":66,"name":"minecraft:rail"},{"data":3,"id":66,"name":"minecraft:rail"},{"data":4,"id":66,"name":"minecraft:rail"},{"data":5,"id":66,"name":"minecraft:rail"},{"data":6,"id":66,"name":"minecraft:rail"},{"data":7,"id":66,"name":"minecraft:rail"},{"data":8,"id":66,"name":"minecraft:rail"},{"data":9,"id":66,"name":"minecraft:rail"},{"data":10,"id":66,"name":"minecraft:rail"},{"data":11,"id":66,"name":"minecraft:rail"},{"data":12,"id":66,"name":"minecraft:rail"},{"data":13,"id":66,"name":"minecraft:rail"},{"data":14,"id":66,"name":"minecraft:rail"},{"data":15,"id":66,"name":"minecraft:rail"},{"data":0,"id":67,"name":"minecraft:stone_stairs"},{"data":1,"id":67,"name":"minecraft:stone_stairs"},{"data":2,"id":67,"name":"minecraft:stone_stairs"},{"data":3,"id":67,"name":"minecraft:stone_stairs"},{"data":4,"id":67,"name":"minecraft:stone_stairs"},{"data":5,"id":67,"name":"minecraft:stone_stairs"},{"data":6,"id":67,"name":"minecraft:stone_stairs"},{"data":7,"id":67,"name":"minecraft:stone_stairs"},{"data":0,"id":68,"name":"minecraft:wall_sign"},{"data":1,"id":68,"name":"minecraft:wall_sign"},{"data":2,"id":68,"name":"minecraft:wall_sign"},{"data":3,"id":68,"name":"minecraft:wall_sign"},{"data":4,"id":68,"name":"minecraft:wall_sign"},{"data":5,"id":68,"name":"minecraft:wall_sign"},{"data":6,"id":68,"name":"minecraft:wall_sign"},{"data":7,"id":68,"name":"minecraft:wall_sign"},{"data":8,"id":68,"name":"minecraft:wall_sign"},{"data":9,"id":68,"name":"minecraft:wall_sign"},{"data":10,"id":68,"name":"minecraft:wall_sign"},{"data":11,"id":68,"name":"minecraft:wall_sign"},{"data":12,"id":68,"name":"minecraft:wall_sign"},{"data":13,"id":68,"name":"minecraft:wall_sign"},{"data":14,"id":68,"name":"minecraft:wall_sign"},{"data":15,"id":68,"name":"minecraft:wall_sign"},{"data":0,"id":69,"name":"minecraft:lever"},{"data":1,"id":69,"name":"minecraft:lever"},{"data":2,"id":69,"name":"minecraft:lever"},{"data":3,"id":69,"name":"minecraft:lever"},{"data":4,"id":69,"name":"minecraft:lever"},{"data":5,"id":69,"name":"minecraft:lever"},{"data":6,"id":69,"name":"minecraft:lever"},{"data":7,"id":69,"name":"minecraft:lever"},{"data":8,"id":69,"name":"minecraft:lever"},{"data":9,"id":69,"name":"minecraft:lever"},{"data":10,"id":69,"name":"minecraft:lever"},{"data":11,"id":69,"name":"minecraft:lever"},{"data":12,"id":69,"name":"minecraft:lever"},{"data":13,"id":69,"name":"minecraft:lever"},{"data":14,"id":69,"name":"minecraft:lever"},{"data":15,"id":69,"name":"minecraft:lever"},{"data":0,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":1,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":2,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":3,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":4,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":5,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":6,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":7,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":8,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":9,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":10,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":11,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":12,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":13,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":14,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":15,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":0,"id":71,"name":"minecraft:iron_door"},{"data":1,"id":71,"name":"minecraft:iron_door"},{"data":2,"id":71,"name":"minecraft:iron_door"},{"data":3,"id":71,"name":"minecraft:iron_door"},{"data":4,"id":71,"name":"minecraft:iron_door"},{"data":5,"id":71,"name":"minecraft:iron_door"},{"data":6,"id":71,"name":"minecraft:iron_door"},{"data":7,"id":71,"name":"minecraft:iron_door"},{"data":8,"id":71,"name":"minecraft:iron_door"},{"data":9,"id":71,"name":"minecraft:iron_door"},{"data":10,"id":71,"name":"minecraft:iron_door"},{"data":11,"id":71,"name":"minecraft:iron_door"},{"data":12,"id":71,"name":"minecraft:iron_door"},{"data":13,"id":71,"name":"minecraft:iron_door"},{"data":14,"id":71,"name":"minecraft:iron_door"},{"data":15,"id":71,"name":"minecraft:iron_door"},{"data":0,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":1,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":2,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":3,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":4,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":5,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":6,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":7,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":8,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":9,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":10,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":11,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":12,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":13,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":14,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":15,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":0,"id":73,"name":"minecraft:redstone_ore"},{"data":0,"id":74,"name":"minecraft:lit_redstone_ore"},{"data":0,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":1,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":2,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":3,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":4,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":5,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":6,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":7,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":0,"id":76,"name":"minecraft:redstone_torch"},{"data":1,"id":76,"name":"minecraft:redstone_torch"},{"data":2,"id":76,"name":"minecraft:redstone_torch"},{"data":3,"id":76,"name":"minecraft:redstone_torch"},{"data":4,"id":76,"name":"minecraft:redstone_torch"},{"data":5,"id":76,"name":"minecraft:redstone_torch"},{"data":6,"id":76,"name":"minecraft:redstone_torch"},{"data":7,"id":76,"name":"minecraft:redstone_torch"},{"data":0,"id":77,"name":"minecraft:stone_button"},{"data":1,"id":77,"name":"minecraft:stone_button"},{"data":2,"id":77,"name":"minecraft:stone_button"},{"data":3,"id":77,"name":"minecraft:stone_button"},{"data":4,"id":77,"name":"minecraft:stone_button"},{"data":5,"id":77,"name":"minecraft:stone_button"},{"data":6,"id":77,"name":"minecraft:stone_button"},{"data":7,"id":77,"name":"minecraft:stone_button"},{"data":8,"id":77,"name":"minecraft:stone_button"},{"data":9,"id":77,"name":"minecraft:stone_button"},{"data":10,"id":77,"name":"minecraft:stone_button"},{"data":11,"id":77,"name":"minecraft:stone_button"},{"data":12,"id":77,"name":"minecraft:stone_button"},{"data":13,"id":77,"name":"minecraft:stone_button"},{"data":14,"id":77,"name":"minecraft:stone_button"},{"data":15,"id":77,"name":"minecraft:stone_button"},{"data":0,"id":78,"name":"minecraft:snow_layer"},{"data":1,"id":78,"name":"minecraft:snow_layer"},{"data":2,"id":78,"name":"minecraft:snow_layer"},{"data":3,"id":78,"name":"minecraft:snow_layer"},{"data":4,"id":78,"name":"minecraft:snow_layer"},{"data":5,"id":78,"name":"minecraft:snow_layer"},{"data":6,"id":78,"name":"minecraft:snow_layer"},{"data":7,"id":78,"name":"minecraft:snow_layer"},{"data":8,"id":78,"name":"minecraft:snow_layer"},{"data":9,"id":78,"name":"minecraft:snow_layer"},{"data":10,"id":78,"name":"minecraft:snow_layer"},{"data":11,"id":78,"name":"minecraft:snow_layer"},{"data":12,"id":78,"name":"minecraft:snow_layer"},{"data":13,"id":78,"name":"minecraft:snow_layer"},{"data":14,"id":78,"name":"minecraft:snow_layer"},{"data":15,"id":78,"name":"minecraft:snow_layer"},{"data":0,"id":79,"name":"minecraft:ice"},{"data":0,"id":80,"name":"minecraft:snow"},{"data":0,"id":81,"name":"minecraft:cactus"},{"data":1,"id":81,"name":"minecraft:cactus"},{"data":2,"id":81,"name":"minecraft:cactus"},{"data":3,"id":81,"name":"minecraft:cactus"},{"data":4,"id":81,"name":"minecraft:cactus"},{"data":5,"id":81,"name":"minecraft:cactus"},{"data":6,"id":81,"name":"minecraft:cactus"},{"data":7,"id":81,"name":"minecraft:cactus"},{"data":8,"id":81,"name":"minecraft:cactus"},{"data":9,"id":81,"name":"minecraft:cactus"},{"data":10,"id":81,"name":"minecraft:cactus"},{"data":11,"id":81,"name":"minecraft:cactus"},{"data":12,"id":81,"name":"minecraft:cactus"},{"data":13,"id":81,"name":"minecraft:cactus"},{"data":14,"id":81,"name":"minecraft:cactus"},{"data":15,"id":81,"name":"minecraft:cactus"},{"data":0,"id":82,"name":"minecraft:clay"},{"data":0,"id":83,"name":"minecraft:reeds"},{"data":1,"id":83,"name":"minecraft:reeds"},{"data":2,"id":83,"name":"minecraft:reeds"},{"data":3,"id":83,"name":"minecraft:reeds"},{"data":4,"id":83,"name":"minecraft:reeds"},{"data":5,"id":83,"name":"minecraft:reeds"},{"data":6,"id":83,"name":"minecraft:reeds"},{"data":7,"id":83,"name":"minecraft:reeds"},{"data":8,"id":83,"name":"minecraft:reeds"},{"data":9,"id":83,"name":"minecraft:reeds"},{"data":10,"id":83,"name":"minecraft:reeds"},{"data":11,"id":83,"name":"minecraft:reeds"},{"data":12,"id":83,"name":"minecraft:reeds"},{"data":13,"id":83,"name":"minecraft:reeds"},{"data":14,"id":83,"name":"minecraft:reeds"},{"data":15,"id":83,"name":"minecraft:reeds"},{"data":0,"id":84,"name":"minecraft:jukebox"},{"data":0,"id":85,"name":"minecraft:fence"},{"data":1,"id":85,"name":"minecraft:fence"},{"data":2,"id":85,"name":"minecraft:fence"},{"data":3,"id":85,"name":"minecraft:fence"},{"data":4,"id":85,"name":"minecraft:fence"},{"data":5,"id":85,"name":"minecraft:fence"},{"data":6,"id":85,"name":"minecraft:fence"},{"data":7,"id":85,"name":"minecraft:fence"},{"data":0,"id":86,"name":"minecraft:pumpkin"},{"data":1,"id":86,"name":"minecraft:pumpkin"},{"data":2,"id":86,"name":"minecraft:pumpkin"},{"data":3,"id":86,"name":"minecraft:pumpkin"},{"data":0,"id":87,"name":"minecraft:netherrack"},{"data":0,"id":88,"name":"minecraft:soul_sand"},{"data":0,"id":89,"name":"minecraft:glowstone"},{"data":0,"id":90,"name":"minecraft:portal"},{"data":1,"id":90,"name":"minecraft:portal"},{"data":2,"id":90,"name":"minecraft:portal"},{"data":3,"id":90,"name":"minecraft:portal"},{"data":0,"id":91,"name":"minecraft:lit_pumpkin"},{"data":1,"id":91,"name":"minecraft:lit_pumpkin"},{"data":2,"id":91,"name":"minecraft:lit_pumpkin"},{"data":3,"id":91,"name":"minecraft:lit_pumpkin"},{"data":0,"id":92,"name":"minecraft:cake"},{"data":1,"id":92,"name":"minecraft:cake"},{"data":2,"id":92,"name":"minecraft:cake"},{"data":3,"id":92,"name":"minecraft:cake"},{"data":4,"id":92,"name":"minecraft:cake"},{"data":5,"id":92,"name":"minecraft:cake"},{"data":6,"id":92,"name":"minecraft:cake"},{"data":7,"id":92,"name":"minecraft:cake"},{"data":0,"id":93,"name":"minecraft:unpowered_repeater"},{"data":1,"id":93,"name":"minecraft:unpowered_repeater"},{"data":2,"id":93,"name":"minecraft:unpowered_repeater"},{"data":3,"id":93,"name":"minecraft:unpowered_repeater"},{"data":4,"id":93,"name":"minecraft:unpowered_repeater"},{"data":5,"id":93,"name":"minecraft:unpowered_repeater"},{"data":6,"id":93,"name":"minecraft:unpowered_repeater"},{"data":7,"id":93,"name":"minecraft:unpowered_repeater"},{"data":8,"id":93,"name":"minecraft:unpowered_repeater"},{"data":9,"id":93,"name":"minecraft:unpowered_repeater"},{"data":10,"id":93,"name":"minecraft:unpowered_repeater"},{"data":11,"id":93,"name":"minecraft:unpowered_repeater"},{"data":12,"id":93,"name":"minecraft:unpowered_repeater"},{"data":13,"id":93,"name":"minecraft:unpowered_repeater"},{"data":14,"id":93,"name":"minecraft:unpowered_repeater"},{"data":15,"id":93,"name":"minecraft:unpowered_repeater"},{"data":0,"id":94,"name":"minecraft:powered_repeater"},{"data":1,"id":94,"name":"minecraft:powered_repeater"},{"data":2,"id":94,"name":"minecraft:powered_repeater"},{"data":3,"id":94,"name":"minecraft:powered_repeater"},{"data":4,"id":94,"name":"minecraft:powered_repeater"},{"data":5,"id":94,"name":"minecraft:powered_repeater"},{"data":6,"id":94,"name":"minecraft:powered_repeater"},{"data":7,"id":94,"name":"minecraft:powered_repeater"},{"data":8,"id":94,"name":"minecraft:powered_repeater"},{"data":9,"id":94,"name":"minecraft:powered_repeater"},{"data":10,"id":94,"name":"minecraft:powered_repeater"},{"data":11,"id":94,"name":"minecraft:powered_repeater"},{"data":12,"id":94,"name":"minecraft:powered_repeater"},{"data":13,"id":94,"name":"minecraft:powered_repeater"},{"data":14,"id":94,"name":"minecraft:powered_repeater"},{"data":15,"id":94,"name":"minecraft:powered_repeater"},{"data":0,"id":95,"name":"minecraft:invisibleBedrock"},{"data":0,"id":96,"name":"minecraft:trapdoor"},{"data":1,"id":96,"name":"minecraft:trapdoor"},{"data":2,"id":96,"name":"minecraft:trapdoor"},{"data":3,"id":96,"name":"minecraft:trapdoor"},{"data":4,"id":96,"name":"minecraft:trapdoor"},{"data":5,"id":96,"name":"minecraft:trapdoor"},{"data":6,"id":96,"name":"minecraft:trapdoor"},{"data":7,"id":96,"name":"minecraft:trapdoor"},{"data":8,"id":96,"name":"minecraft:trapdoor"},{"data":9,"id":96,"name":"minecraft:trapdoor"},{"data":10,"id":96,"name":"minecraft:trapdoor"},{"data":11,"id":96,"name":"minecraft:trapdoor"},{"data":12,"id":96,"name":"minecraft:trapdoor"},{"data":13,"id":96,"name":"minecraft:trapdoor"},{"data":14,"id":96,"name":"minecraft:trapdoor"},{"data":15,"id":96,"name":"minecraft:trapdoor"},{"data":0,"id":97,"name":"minecraft:monster_egg"},{"data":1,"id":97,"name":"minecraft:monster_egg"},{"data":2,"id":97,"name":"minecraft:monster_egg"},{"data":3,"id":97,"name":"minecraft:monster_egg"},{"data":4,"id":97,"name":"minecraft:monster_egg"},{"data":5,"id":97,"name":"minecraft:monster_egg"},{"data":6,"id":97,"name":"minecraft:monster_egg"},{"data":7,"id":97,"name":"minecraft:monster_egg"},{"data":0,"id":98,"name":"minecraft:stonebrick"},{"data":1,"id":98,"name":"minecraft:stonebrick"},{"data":2,"id":98,"name":"minecraft:stonebrick"},{"data":3,"id":98,"name":"minecraft:stonebrick"},{"data":4,"id":98,"name":"minecraft:stonebrick"},{"data":5,"id":98,"name":"minecraft:stonebrick"},{"data":6,"id":98,"name":"minecraft:stonebrick"},{"data":7,"id":98,"name":"minecraft:stonebrick"},{"data":0,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":1,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":2,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":3,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":4,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":5,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":6,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":7,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":8,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":9,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":10,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":11,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":12,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":13,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":14,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":15,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":0,"id":100,"name":"minecraft:red_mushroom_block"},{"data":1,"id":100,"name":"minecraft:red_mushroom_block"},{"data":2,"id":100,"name":"minecraft:red_mushroom_block"},{"data":3,"id":100,"name":"minecraft:red_mushroom_block"},{"data":4,"id":100,"name":"minecraft:red_mushroom_block"},{"data":5,"id":100,"name":"minecraft:red_mushroom_block"},{"data":6,"id":100,"name":"minecraft:red_mushroom_block"},{"data":7,"id":100,"name":"minecraft:red_mushroom_block"},{"data":8,"id":100,"name":"minecraft:red_mushroom_block"},{"data":9,"id":100,"name":"minecraft:red_mushroom_block"},{"data":10,"id":100,"name":"minecraft:red_mushroom_block"},{"data":11,"id":100,"name":"minecraft:red_mushroom_block"},{"data":12,"id":100,"name":"minecraft:red_mushroom_block"},{"data":13,"id":100,"name":"minecraft:red_mushroom_block"},{"data":14,"id":100,"name":"minecraft:red_mushroom_block"},{"data":15,"id":100,"name":"minecraft:red_mushroom_block"},{"data":0,"id":101,"name":"minecraft:iron_bars"},{"data":0,"id":102,"name":"minecraft:glass_pane"},{"data":0,"id":103,"name":"minecraft:melon_block"},{"data":0,"id":104,"name":"minecraft:pumpkin_stem"},{"data":1,"id":104,"name":"minecraft:pumpkin_stem"},{"data":2,"id":104,"name":"minecraft:pumpkin_stem"},{"data":3,"id":104,"name":"minecraft:pumpkin_stem"},{"data":4,"id":104,"name":"minecraft:pumpkin_stem"},{"data":5,"id":104,"name":"minecraft:pumpkin_stem"},{"data":6,"id":104,"name":"minecraft:pumpkin_stem"},{"data":7,"id":104,"name":"minecraft:pumpkin_stem"},{"data":0,"id":105,"name":"minecraft:melon_stem"},{"data":1,"id":105,"name":"minecraft:melon_stem"},{"data":2,"id":105,"name":"minecraft:melon_stem"},{"data":3,"id":105,"name":"minecraft:melon_stem"},{"data":4,"id":105,"name":"minecraft:melon_stem"},{"data":5,"id":105,"name":"minecraft:melon_stem"},{"data":6,"id":105,"name":"minecraft:melon_stem"},{"data":7,"id":105,"name":"minecraft:melon_stem"},{"data":0,"id":106,"name":"minecraft:vine"},{"data":1,"id":106,"name":"minecraft:vine"},{"data":2,"id":106,"name":"minecraft:vine"},{"data":3,"id":106,"name":"minecraft:vine"},{"data":4,"id":106,"name":"minecraft:vine"},{"data":5,"id":106,"name":"minecraft:vine"},{"data":6,"id":106,"name":"minecraft:vine"},{"data":7,"id":106,"name":"minecraft:vine"},{"data":8,"id":106,"name":"minecraft:vine"},{"data":9,"id":106,"name":"minecraft:vine"},{"data":10,"id":106,"name":"minecraft:vine"},{"data":11,"id":106,"name":"minecraft:vine"},{"data":12,"id":106,"name":"minecraft:vine"},{"data":13,"id":106,"name":"minecraft:vine"},{"data":14,"id":106,"name":"minecraft:vine"},{"data":15,"id":106,"name":"minecraft:vine"},{"data":0,"id":107,"name":"minecraft:fence_gate"},{"data":1,"id":107,"name":"minecraft:fence_gate"},{"data":2,"id":107,"name":"minecraft:fence_gate"},{"data":3,"id":107,"name":"minecraft:fence_gate"},{"data":4,"id":107,"name":"minecraft:fence_gate"},{"data":5,"id":107,"name":"minecraft:fence_gate"},{"data":6,"id":107,"name":"minecraft:fence_gate"},{"data":7,"id":107,"name":"minecraft:fence_gate"},{"data":8,"id":107,"name":"minecraft:fence_gate"},{"data":9,"id":107,"name":"minecraft:fence_gate"},{"data":10,"id":107,"name":"minecraft:fence_gate"},{"data":11,"id":107,"name":"minecraft:fence_gate"},{"data":12,"id":107,"name":"minecraft:fence_gate"},{"data":13,"id":107,"name":"minecraft:fence_gate"},{"data":14,"id":107,"name":"minecraft:fence_gate"},{"data":15,"id":107,"name":"minecraft:fence_gate"},{"data":0,"id":108,"name":"minecraft:brick_stairs"},{"data":1,"id":108,"name":"minecraft:brick_stairs"},{"data":2,"id":108,"name":"minecraft:brick_stairs"},{"data":3,"id":108,"name":"minecraft:brick_stairs"},{"data":4,"id":108,"name":"minecraft:brick_stairs"},{"data":5,"id":108,"name":"minecraft:brick_stairs"},{"data":6,"id":108,"name":"minecraft:brick_stairs"},{"data":7,"id":108,"name":"minecraft:brick_stairs"},{"data":0,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":1,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":2,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":3,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":4,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":5,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":6,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":7,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":0,"id":110,"name":"minecraft:mycelium"},{"data":0,"id":111,"name":"minecraft:waterlily"},{"data":0,"id":112,"name":"minecraft:nether_brick"},{"data":0,"id":113,"name":"minecraft:nether_brick_fence"},{"data":1,"id":113,"name":"minecraft:nether_brick_fence"},{"data":2,"id":113,"name":"minecraft:nether_brick_fence"},{"data":3,"id":113,"name":"minecraft:nether_brick_fence"},{"data":4,"id":113,"name":"minecraft:nether_brick_fence"},{"data":5,"id":113,"name":"minecraft:nether_brick_fence"},{"data":6,"id":113,"name":"minecraft:nether_brick_fence"},{"data":7,"id":113,"name":"minecraft:nether_brick_fence"},{"data":0,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":1,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":2,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":3,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":4,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":5,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":6,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":7,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":0,"id":115,"name":"minecraft:nether_wart"},{"data":1,"id":115,"name":"minecraft:nether_wart"},{"data":2,"id":115,"name":"minecraft:nether_wart"},{"data":3,"id":115,"name":"minecraft:nether_wart"},{"data":0,"id":116,"name":"minecraft:enchanting_table"},{"data":0,"id":117,"name":"minecraft:brewing_stand"},{"data":1,"id":117,"name":"minecraft:brewing_stand"},{"data":2,"id":117,"name":"minecraft:brewing_stand"},{"data":3,"id":117,"name":"minecraft:brewing_stand"},{"data":4,"id":117,"name":"minecraft:brewing_stand"},{"data":5,"id":117,"name":"minecraft:brewing_stand"},{"data":6,"id":117,"name":"minecraft:brewing_stand"},{"data":7,"id":117,"name":"minecraft:brewing_stand"},{"data":0,"id":118,"name":"minecraft:cauldron"},{"data":1,"id":118,"name":"minecraft:cauldron"},{"data":2,"id":118,"name":"minecraft:cauldron"},{"data":3,"id":118,"name":"minecraft:cauldron"},{"data":4,"id":118,"name":"minecraft:cauldron"},{"data":5,"id":118,"name":"minecraft:cauldron"},{"data":6,"id":118,"name":"minecraft:cauldron"},{"data":7,"id":118,"name":"minecraft:cauldron"},{"data":0,"id":119,"name":"minecraft:end_portal"},{"data":0,"id":120,"name":"minecraft:end_portal_frame"},{"data":1,"id":120,"name":"minecraft:end_portal_frame"},{"data":2,"id":120,"name":"minecraft:end_portal_frame"},{"data":3,"id":120,"name":"minecraft:end_portal_frame"},{"data":4,"id":120,"name":"minecraft:end_portal_frame"},{"data":5,"id":120,"name":"minecraft:end_portal_frame"},{"data":6,"id":120,"name":"minecraft:end_portal_frame"},{"data":7,"id":120,"name":"minecraft:end_portal_frame"},{"data":0,"id":121,"name":"minecraft:end_stone"},{"data":0,"id":122,"name":"minecraft:dragon_egg"},{"data":0,"id":123,"name":"minecraft:redstone_lamp"},{"data":0,"id":124,"name":"minecraft:lit_redstone_lamp"},{"data":0,"id":125,"name":"minecraft:dropper"},{"data":1,"id":125,"name":"minecraft:dropper"},{"data":2,"id":125,"name":"minecraft:dropper"},{"data":3,"id":125,"name":"minecraft:dropper"},{"data":4,"id":125,"name":"minecraft:dropper"},{"data":5,"id":125,"name":"minecraft:dropper"},{"data":6,"id":125,"name":"minecraft:dropper"},{"data":7,"id":125,"name":"minecraft:dropper"},{"data":8,"id":125,"name":"minecraft:dropper"},{"data":9,"id":125,"name":"minecraft:dropper"},{"data":10,"id":125,"name":"minecraft:dropper"},{"data":11,"id":125,"name":"minecraft:dropper"},{"data":12,"id":125,"name":"minecraft:dropper"},{"data":13,"id":125,"name":"minecraft:dropper"},{"data":14,"id":125,"name":"minecraft:dropper"},{"data":15,"id":125,"name":"minecraft:dropper"},{"data":0,"id":126,"name":"minecraft:activator_rail"},{"data":1,"id":126,"name":"minecraft:activator_rail"},{"data":2,"id":126,"name":"minecraft:activator_rail"},{"data":3,"id":126,"name":"minecraft:activator_rail"},{"data":4,"id":126,"name":"minecraft:activator_rail"},{"data":5,"id":126,"name":"minecraft:activator_rail"},{"data":6,"id":126,"name":"minecraft:activator_rail"},{"data":7,"id":126,"name":"minecraft:activator_rail"},{"data":8,"id":126,"name":"minecraft:activator_rail"},{"data":9,"id":126,"name":"minecraft:activator_rail"},{"data":10,"id":126,"name":"minecraft:activator_rail"},{"data":11,"id":126,"name":"minecraft:activator_rail"},{"data":12,"id":126,"name":"minecraft:activator_rail"},{"data":13,"id":126,"name":"minecraft:activator_rail"},{"data":14,"id":126,"name":"minecraft:activator_rail"},{"data":15,"id":126,"name":"minecraft:activator_rail"},{"data":0,"id":127,"name":"minecraft:cocoa"},{"data":1,"id":127,"name":"minecraft:cocoa"},{"data":2,"id":127,"name":"minecraft:cocoa"},{"data":3,"id":127,"name":"minecraft:cocoa"},{"data":4,"id":127,"name":"minecraft:cocoa"},{"data":5,"id":127,"name":"minecraft:cocoa"},{"data":6,"id":127,"name":"minecraft:cocoa"},{"data":7,"id":127,"name":"minecraft:cocoa"},{"data":8,"id":127,"name":"minecraft:cocoa"},{"data":9,"id":127,"name":"minecraft:cocoa"},{"data":10,"id":127,"name":"minecraft:cocoa"},{"data":11,"id":127,"name":"minecraft:cocoa"},{"data":12,"id":127,"name":"minecraft:cocoa"},{"data":13,"id":127,"name":"minecraft:cocoa"},{"data":14,"id":127,"name":"minecraft:cocoa"},{"data":15,"id":127,"name":"minecraft:cocoa"},{"data":0,"id":128,"name":"minecraft:sandstone_stairs"},{"data":1,"id":128,"name":"minecraft:sandstone_stairs"},{"data":2,"id":128,"name":"minecraft:sandstone_stairs"},{"data":3,"id":128,"name":"minecraft:sandstone_stairs"},{"data":4,"id":128,"name":"minecraft:sandstone_stairs"},{"data":5,"id":128,"name":"minecraft:sandstone_stairs"},{"data":6,"id":128,"name":"minecraft:sandstone_stairs"},{"data":7,"id":128,"name":"minecraft:sandstone_stairs"},{"data":0,"id":129,"name":"minecraft:emerald_ore"},{"data":0,"id":130,"name":"minecraft:ender_chest"},{"data":1,"id":130,"name":"minecraft:ender_chest"},{"data":2,"id":130,"name":"minecraft:ender_chest"},{"data":3,"id":130,"name":"minecraft:ender_chest"},{"data":4,"id":130,"name":"minecraft:ender_chest"},{"data":5,"id":130,"name":"minecraft:ender_chest"},{"data":6,"id":130,"name":"minecraft:ender_chest"},{"data":7,"id":130,"name":"minecraft:ender_chest"},{"data":0,"id":131,"name":"minecraft:tripwire_hook"},{"data":1,"id":131,"name":"minecraft:tripwire_hook"},{"data":2,"id":131,"name":"minecraft:tripwire_hook"},{"data":3,"id":131,"name":"minecraft:tripwire_hook"},{"data":4,"id":131,"name":"minecraft:tripwire_hook"},{"data":5,"id":131,"name":"minecraft:tripwire_hook"},{"data":6,"id":131,"name":"minecraft:tripwire_hook"},{"data":7,"id":131,"name":"minecraft:tripwire_hook"},{"data":8,"id":131,"name":"minecraft:tripwire_hook"},{"data":9,"id":131,"name":"minecraft:tripwire_hook"},{"data":10,"id":131,"name":"minecraft:tripwire_hook"},{"data":11,"id":131,"name":"minecraft:tripwire_hook"},{"data":12,"id":131,"name":"minecraft:tripwire_hook"},{"data":13,"id":131,"name":"minecraft:tripwire_hook"},{"data":14,"id":131,"name":"minecraft:tripwire_hook"},{"data":15,"id":131,"name":"minecraft:tripwire_hook"},{"data":0,"id":132,"name":"minecraft:tripWire"},{"data":1,"id":132,"name":"minecraft:tripWire"},{"data":2,"id":132,"name":"minecraft:tripWire"},{"data":3,"id":132,"name":"minecraft:tripWire"},{"data":4,"id":132,"name":"minecraft:tripWire"},{"data":5,"id":132,"name":"minecraft:tripWire"},{"data":6,"id":132,"name":"minecraft:tripWire"},{"data":7,"id":132,"name":"minecraft:tripWire"},{"data":8,"id":132,"name":"minecraft:tripWire"},{"data":9,"id":132,"name":"minecraft:tripWire"},{"data":10,"id":132,"name":"minecraft:tripWire"},{"data":11,"id":132,"name":"minecraft:tripWire"},{"data":12,"id":132,"name":"minecraft:tripWire"},{"data":13,"id":132,"name":"minecraft:tripWire"},{"data":14,"id":132,"name":"minecraft:tripWire"},{"data":15,"id":132,"name":"minecraft:tripWire"},{"data":0,"id":133,"name":"minecraft:emerald_block"},{"data":0,"id":134,"name":"minecraft:spruce_stairs"},{"data":1,"id":134,"name":"minecraft:spruce_stairs"},{"data":2,"id":134,"name":"minecraft:spruce_stairs"},{"data":3,"id":134,"name":"minecraft:spruce_stairs"},{"data":4,"id":134,"name":"minecraft:spruce_stairs"},{"data":5,"id":134,"name":"minecraft:spruce_stairs"},{"data":6,"id":134,"name":"minecraft:spruce_stairs"},{"data":7,"id":134,"name":"minecraft:spruce_stairs"},{"data":0,"id":135,"name":"minecraft:birch_stairs"},{"data":1,"id":135,"name":"minecraft:birch_stairs"},{"data":2,"id":135,"name":"minecraft:birch_stairs"},{"data":3,"id":135,"name":"minecraft:birch_stairs"},{"data":4,"id":135,"name":"minecraft:birch_stairs"},{"data":5,"id":135,"name":"minecraft:birch_stairs"},{"data":6,"id":135,"name":"minecraft:birch_stairs"},{"data":7,"id":135,"name":"minecraft:birch_stairs"},{"data":0,"id":136,"name":"minecraft:jungle_stairs"},{"data":1,"id":136,"name":"minecraft:jungle_stairs"},{"data":2,"id":136,"name":"minecraft:jungle_stairs"},{"data":3,"id":136,"name":"minecraft:jungle_stairs"},{"data":4,"id":136,"name":"minecraft:jungle_stairs"},{"data":5,"id":136,"name":"minecraft:jungle_stairs"},{"data":6,"id":136,"name":"minecraft:jungle_stairs"},{"data":7,"id":136,"name":"minecraft:jungle_stairs"},{"data":0,"id":137,"name":"minecraft:command_block"},{"data":1,"id":137,"name":"minecraft:command_block"},{"data":2,"id":137,"name":"minecraft:command_block"},{"data":3,"id":137,"name":"minecraft:command_block"},{"data":4,"id":137,"name":"minecraft:command_block"},{"data":5,"id":137,"name":"minecraft:command_block"},{"data":6,"id":137,"name":"minecraft:command_block"},{"data":7,"id":137,"name":"minecraft:command_block"},{"data":8,"id":137,"name":"minecraft:command_block"},{"data":9,"id":137,"name":"minecraft:command_block"},{"data":10,"id":137,"name":"minecraft:command_block"},{"data":11,"id":137,"name":"minecraft:command_block"},{"data":12,"id":137,"name":"minecraft:command_block"},{"data":13,"id":137,"name":"minecraft:command_block"},{"data":14,"id":137,"name":"minecraft:command_block"},{"data":15,"id":137,"name":"minecraft:command_block"},{"data":0,"id":138,"name":"minecraft:beacon"},{"data":0,"id":139,"name":"minecraft:cobblestone_wall"},{"data":1,"id":139,"name":"minecraft:cobblestone_wall"},{"data":0,"id":140,"name":"minecraft:flower_pot"},{"data":1,"id":140,"name":"minecraft:flower_pot"},{"data":0,"id":141,"name":"minecraft:carrots"},{"data":1,"id":141,"name":"minecraft:carrots"},{"data":2,"id":141,"name":"minecraft:carrots"},{"data":3,"id":141,"name":"minecraft:carrots"},{"data":4,"id":141,"name":"minecraft:carrots"},{"data":5,"id":141,"name":"minecraft:carrots"},{"data":6,"id":141,"name":"minecraft:carrots"},{"data":7,"id":141,"name":"minecraft:carrots"},{"data":0,"id":142,"name":"minecraft:potatoes"},{"data":1,"id":142,"name":"minecraft:potatoes"},{"data":2,"id":142,"name":"minecraft:potatoes"},{"data":3,"id":142,"name":"minecraft:potatoes"},{"data":4,"id":142,"name":"minecraft:potatoes"},{"data":5,"id":142,"name":"minecraft:potatoes"},{"data":6,"id":142,"name":"minecraft:potatoes"},{"data":7,"id":142,"name":"minecraft:potatoes"},{"data":0,"id":143,"name":"minecraft:wooden_button"},{"data":1,"id":143,"name":"minecraft:wooden_button"},{"data":2,"id":143,"name":"minecraft:wooden_button"},{"data":3,"id":143,"name":"minecraft:wooden_button"},{"data":4,"id":143,"name":"minecraft:wooden_button"},{"data":5,"id":143,"name":"minecraft:wooden_button"},{"data":6,"id":143,"name":"minecraft:wooden_button"},{"data":7,"id":143,"name":"minecraft:wooden_button"},{"data":8,"id":143,"name":"minecraft:wooden_button"},{"data":9,"id":143,"name":"minecraft:wooden_button"},{"data":10,"id":143,"name":"minecraft:wooden_button"},{"data":11,"id":143,"name":"minecraft:wooden_button"},{"data":12,"id":143,"name":"minecraft:wooden_button"},{"data":13,"id":143,"name":"minecraft:wooden_button"},{"data":14,"id":143,"name":"minecraft:wooden_button"},{"data":15,"id":143,"name":"minecraft:wooden_button"},{"data":0,"id":144,"name":"minecraft:skull"},{"data":1,"id":144,"name":"minecraft:skull"},{"data":2,"id":144,"name":"minecraft:skull"},{"data":3,"id":144,"name":"minecraft:skull"},{"data":4,"id":144,"name":"minecraft:skull"},{"data":5,"id":144,"name":"minecraft:skull"},{"data":6,"id":144,"name":"minecraft:skull"},{"data":7,"id":144,"name":"minecraft:skull"},{"data":8,"id":144,"name":"minecraft:skull"},{"data":9,"id":144,"name":"minecraft:skull"},{"data":10,"id":144,"name":"minecraft:skull"},{"data":11,"id":144,"name":"minecraft:skull"},{"data":12,"id":144,"name":"minecraft:skull"},{"data":13,"id":144,"name":"minecraft:skull"},{"data":14,"id":144,"name":"minecraft:skull"},{"data":15,"id":144,"name":"minecraft:skull"},{"data":0,"id":145,"name":"minecraft:anvil"},{"data":1,"id":145,"name":"minecraft:anvil"},{"data":2,"id":145,"name":"minecraft:anvil"},{"data":3,"id":145,"name":"minecraft:anvil"},{"data":4,"id":145,"name":"minecraft:anvil"},{"data":5,"id":145,"name":"minecraft:anvil"},{"data":6,"id":145,"name":"minecraft:anvil"},{"data":7,"id":145,"name":"minecraft:anvil"},{"data":8,"id":145,"name":"minecraft:anvil"},{"data":9,"id":145,"name":"minecraft:anvil"},{"data":10,"id":145,"name":"minecraft:anvil"},{"data":11,"id":145,"name":"minecraft:anvil"},{"data":12,"id":145,"name":"minecraft:anvil"},{"data":13,"id":145,"name":"minecraft:anvil"},{"data":14,"id":145,"name":"minecraft:anvil"},{"data":15,"id":145,"name":"minecraft:anvil"},{"data":0,"id":146,"name":"minecraft:trapped_chest"},{"data":1,"id":146,"name":"minecraft:trapped_chest"},{"data":2,"id":146,"name":"minecraft:trapped_chest"},{"data":3,"id":146,"name":"minecraft:trapped_chest"},{"data":4,"id":146,"name":"minecraft:trapped_chest"},{"data":5,"id":146,"name":"minecraft:trapped_chest"},{"data":6,"id":146,"name":"minecraft:trapped_chest"},{"data":7,"id":146,"name":"minecraft:trapped_chest"},{"data":0,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":1,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":2,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":3,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":4,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":5,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":6,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":7,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":8,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":9,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":10,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":11,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":12,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":13,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":14,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":15,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":0,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":1,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":2,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":3,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":4,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":5,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":6,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":7,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":8,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":9,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":10,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":11,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":12,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":13,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":14,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":15,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":0,"id":149,"name":"minecraft:unpowered_comparator"},{"data":1,"id":149,"name":"minecraft:unpowered_comparator"},{"data":2,"id":149,"name":"minecraft:unpowered_comparator"},{"data":3,"id":149,"name":"minecraft:unpowered_comparator"},{"data":4,"id":149,"name":"minecraft:unpowered_comparator"},{"data":5,"id":149,"name":"minecraft:unpowered_comparator"},{"data":6,"id":149,"name":"minecraft:unpowered_comparator"},{"data":7,"id":149,"name":"minecraft:unpowered_comparator"},{"data":8,"id":149,"name":"minecraft:unpowered_comparator"},{"data":9,"id":149,"name":"minecraft:unpowered_comparator"},{"data":10,"id":149,"name":"minecraft:unpowered_comparator"},{"data":11,"id":149,"name":"minecraft:unpowered_comparator"},{"data":12,"id":149,"name":"minecraft:unpowered_comparator"},{"data":13,"id":149,"name":"minecraft:unpowered_comparator"},{"data":14,"id":149,"name":"minecraft:unpowered_comparator"},{"data":15,"id":149,"name":"minecraft:unpowered_comparator"},{"data":0,"id":150,"name":"minecraft:powered_comparator"},{"data":1,"id":150,"name":"minecraft:powered_comparator"},{"data":2,"id":150,"name":"minecraft:powered_comparator"},{"data":3,"id":150,"name":"minecraft:powered_comparator"},{"data":4,"id":150,"name":"minecraft:powered_comparator"},{"data":5,"id":150,"name":"minecraft:powered_comparator"},{"data":6,"id":150,"name":"minecraft:powered_comparator"},{"data":7,"id":150,"name":"minecraft:powered_comparator"},{"data":8,"id":150,"name":"minecraft:powered_comparator"},{"data":9,"id":150,"name":"minecraft:powered_comparator"},{"data":10,"id":150,"name":"minecraft:powered_comparator"},{"data":11,"id":150,"name":"minecraft:powered_comparator"},{"data":12,"id":150,"name":"minecraft:powered_comparator"},{"data":13,"id":150,"name":"minecraft:powered_comparator"},{"data":14,"id":150,"name":"minecraft:powered_comparator"},{"data":15,"id":150,"name":"minecraft:powered_comparator"},{"data":0,"id":151,"name":"minecraft:daylight_detector"},{"data":1,"id":151,"name":"minecraft:daylight_detector"},{"data":2,"id":151,"name":"minecraft:daylight_detector"},{"data":3,"id":151,"name":"minecraft:daylight_detector"},{"data":4,"id":151,"name":"minecraft:daylight_detector"},{"data":5,"id":151,"name":"minecraft:daylight_detector"},{"data":6,"id":151,"name":"minecraft:daylight_detector"},{"data":7,"id":151,"name":"minecraft:daylight_detector"},{"data":8,"id":151,"name":"minecraft:daylight_detector"},{"data":9,"id":151,"name":"minecraft:daylight_detector"},{"data":10,"id":151,"name":"minecraft:daylight_detector"},{"data":11,"id":151,"name":"minecraft:daylight_detector"},{"data":12,"id":151,"name":"minecraft:daylight_detector"},{"data":13,"id":151,"name":"minecraft:daylight_detector"},{"data":14,"id":151,"name":"minecraft:daylight_detector"},{"data":15,"id":151,"name":"minecraft:daylight_detector"},{"data":0,"id":152,"name":"minecraft:redstone_block"},{"data":0,"id":153,"name":"minecraft:quartz_ore"},{"data":0,"id":154,"name":"minecraft:hopper"},{"data":1,"id":154,"name":"minecraft:hopper"},{"data":2,"id":154,"name":"minecraft:hopper"},{"data":3,"id":154,"name":"minecraft:hopper"},{"data":4,"id":154,"name":"minecraft:hopper"},{"data":5,"id":154,"name":"minecraft:hopper"},{"data":6,"id":154,"name":"minecraft:hopper"},{"data":7,"id":154,"name":"minecraft:hopper"},{"data":8,"id":154,"name":"minecraft:hopper"},{"data":9,"id":154,"name":"minecraft:hopper"},{"data":10,"id":154,"name":"minecraft:hopper"},{"data":11,"id":154,"name":"minecraft:hopper"},{"data":12,"id":154,"name":"minecraft:hopper"},{"data":13,"id":154,"name":"minecraft:hopper"},{"data":14,"id":154,"name":"minecraft:hopper"},{"data":15,"id":154,"name":"minecraft:hopper"},{"data":0,"id":155,"name":"minecraft:quartz_block"},{"data":1,"id":155,"name":"minecraft:quartz_block"},{"data":2,"id":155,"name":"minecraft:quartz_block"},{"data":3,"id":155,"name":"minecraft:quartz_block"},{"data":4,"id":155,"name":"minecraft:quartz_block"},{"data":5,"id":155,"name":"minecraft:quartz_block"},{"data":6,"id":155,"name":"minecraft:quartz_block"},{"data":7,"id":155,"name":"minecraft:quartz_block"},{"data":8,"id":155,"name":"minecraft:quartz_block"},{"data":9,"id":155,"name":"minecraft:quartz_block"},{"data":10,"id":155,"name":"minecraft:quartz_block"},{"data":11,"id":155,"name":"minecraft:quartz_block"},{"data":12,"id":155,"name":"minecraft:quartz_block"},{"data":13,"id":155,"name":"minecraft:quartz_block"},{"data":14,"id":155,"name":"minecraft:quartz_block"},{"data":15,"id":155,"name":"minecraft:quartz_block"},{"data":0,"id":156,"name":"minecraft:quartz_stairs"},{"data":1,"id":156,"name":"minecraft:quartz_stairs"},{"data":2,"id":156,"name":"minecraft:quartz_stairs"},{"data":3,"id":156,"name":"minecraft:quartz_stairs"},{"data":4,"id":156,"name":"minecraft:quartz_stairs"},{"data":5,"id":156,"name":"minecraft:quartz_stairs"},{"data":6,"id":156,"name":"minecraft:quartz_stairs"},{"data":7,"id":156,"name":"minecraft:quartz_stairs"},{"data":0,"id":157,"name":"minecraft:double_wooden_slab"},{"data":1,"id":157,"name":"minecraft:double_wooden_slab"},{"data":2,"id":157,"name":"minecraft:double_wooden_slab"},{"data":3,"id":157,"name":"minecraft:double_wooden_slab"},{"data":4,"id":157,"name":"minecraft:double_wooden_slab"},{"data":5,"id":157,"name":"minecraft:double_wooden_slab"},{"data":6,"id":157,"name":"minecraft:double_wooden_slab"},{"data":7,"id":157,"name":"minecraft:double_wooden_slab"},{"data":8,"id":157,"name":"minecraft:double_wooden_slab"},{"data":9,"id":157,"name":"minecraft:double_wooden_slab"},{"data":10,"id":157,"name":"minecraft:double_wooden_slab"},{"data":11,"id":157,"name":"minecraft:double_wooden_slab"},{"data":12,"id":157,"name":"minecraft:double_wooden_slab"},{"data":13,"id":157,"name":"minecraft:double_wooden_slab"},{"data":14,"id":157,"name":"minecraft:double_wooden_slab"},{"data":15,"id":157,"name":"minecraft:double_wooden_slab"},{"data":0,"id":158,"name":"minecraft:wooden_slab"},{"data":1,"id":158,"name":"minecraft:wooden_slab"},{"data":2,"id":158,"name":"minecraft:wooden_slab"},{"data":3,"id":158,"name":"minecraft:wooden_slab"},{"data":4,"id":158,"name":"minecraft:wooden_slab"},{"data":5,"id":158,"name":"minecraft:wooden_slab"},{"data":6,"id":158,"name":"minecraft:wooden_slab"},{"data":7,"id":158,"name":"minecraft:wooden_slab"},{"data":8,"id":158,"name":"minecraft:wooden_slab"},{"data":9,"id":158,"name":"minecraft:wooden_slab"},{"data":10,"id":158,"name":"minecraft:wooden_slab"},{"data":11,"id":158,"name":"minecraft:wooden_slab"},{"data":12,"id":158,"name":"minecraft:wooden_slab"},{"data":13,"id":158,"name":"minecraft:wooden_slab"},{"data":14,"id":158,"name":"minecraft:wooden_slab"},{"data":15,"id":158,"name":"minecraft:wooden_slab"},{"data":0,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":1,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":2,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":3,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":4,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":5,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":6,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":7,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":8,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":9,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":10,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":11,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":12,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":13,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":14,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":15,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":0,"id":160,"name":"minecraft:stained_glass_pane"},{"data":1,"id":160,"name":"minecraft:stained_glass_pane"},{"data":2,"id":160,"name":"minecraft:stained_glass_pane"},{"data":3,"id":160,"name":"minecraft:stained_glass_pane"},{"data":4,"id":160,"name":"minecraft:stained_glass_pane"},{"data":5,"id":160,"name":"minecraft:stained_glass_pane"},{"data":6,"id":160,"name":"minecraft:stained_glass_pane"},{"data":7,"id":160,"name":"minecraft:stained_glass_pane"},{"data":8,"id":160,"name":"minecraft:stained_glass_pane"},{"data":9,"id":160,"name":"minecraft:stained_glass_pane"},{"data":10,"id":160,"name":"minecraft:stained_glass_pane"},{"data":11,"id":160,"name":"minecraft:stained_glass_pane"},{"data":12,"id":160,"name":"minecraft:stained_glass_pane"},{"data":13,"id":160,"name":"minecraft:stained_glass_pane"},{"data":14,"id":160,"name":"minecraft:stained_glass_pane"},{"data":15,"id":160,"name":"minecraft:stained_glass_pane"},{"data":0,"id":161,"name":"minecraft:leaves2"},{"data":1,"id":161,"name":"minecraft:leaves2"},{"data":2,"id":161,"name":"minecraft:leaves2"},{"data":3,"id":161,"name":"minecraft:leaves2"},{"data":4,"id":161,"name":"minecraft:leaves2"},{"data":5,"id":161,"name":"minecraft:leaves2"},{"data":6,"id":161,"name":"minecraft:leaves2"},{"data":7,"id":161,"name":"minecraft:leaves2"},{"data":8,"id":161,"name":"minecraft:leaves2"},{"data":9,"id":161,"name":"minecraft:leaves2"},{"data":10,"id":161,"name":"minecraft:leaves2"},{"data":11,"id":161,"name":"minecraft:leaves2"},{"data":12,"id":161,"name":"minecraft:leaves2"},{"data":13,"id":161,"name":"minecraft:leaves2"},{"data":14,"id":161,"name":"minecraft:leaves2"},{"data":15,"id":161,"name":"minecraft:leaves2"},{"data":0,"id":162,"name":"minecraft:log2"},{"data":1,"id":162,"name":"minecraft:log2"},{"data":2,"id":162,"name":"minecraft:log2"},{"data":3,"id":162,"name":"minecraft:log2"},{"data":4,"id":162,"name":"minecraft:log2"},{"data":5,"id":162,"name":"minecraft:log2"},{"data":6,"id":162,"name":"minecraft:log2"},{"data":7,"id":162,"name":"minecraft:log2"},{"data":8,"id":162,"name":"minecraft:log2"},{"data":9,"id":162,"name":"minecraft:log2"},{"data":10,"id":162,"name":"minecraft:log2"},{"data":11,"id":162,"name":"minecraft:log2"},{"data":12,"id":162,"name":"minecraft:log2"},{"data":13,"id":162,"name":"minecraft:log2"},{"data":14,"id":162,"name":"minecraft:log2"},{"data":15,"id":162,"name":"minecraft:log2"},{"data":0,"id":163,"name":"minecraft:acacia_stairs"},{"data":1,"id":163,"name":"minecraft:acacia_stairs"},{"data":2,"id":163,"name":"minecraft:acacia_stairs"},{"data":3,"id":163,"name":"minecraft:acacia_stairs"},{"data":4,"id":163,"name":"minecraft:acacia_stairs"},{"data":5,"id":163,"name":"minecraft:acacia_stairs"},{"data":6,"id":163,"name":"minecraft:acacia_stairs"},{"data":7,"id":163,"name":"minecraft:acacia_stairs"},{"data":0,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":1,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":2,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":3,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":4,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":5,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":6,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":7,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":0,"id":165,"name":"minecraft:slime"},{"data":0,"id":166,"name":"minecraft:glow_stick"},{"data":1,"id":166,"name":"minecraft:glow_stick"},{"data":2,"id":166,"name":"minecraft:glow_stick"},{"data":3,"id":166,"name":"minecraft:glow_stick"},{"data":4,"id":166,"name":"minecraft:glow_stick"},{"data":5,"id":166,"name":"minecraft:glow_stick"},{"data":6,"id":166,"name":"minecraft:glow_stick"},{"data":7,"id":166,"name":"minecraft:glow_stick"},{"data":8,"id":166,"name":"minecraft:glow_stick"},{"data":9,"id":166,"name":"minecraft:glow_stick"},{"data":10,"id":166,"name":"minecraft:glow_stick"},{"data":11,"id":166,"name":"minecraft:glow_stick"},{"data":12,"id":166,"name":"minecraft:glow_stick"},{"data":13,"id":166,"name":"minecraft:glow_stick"},{"data":14,"id":166,"name":"minecraft:glow_stick"},{"data":15,"id":166,"name":"minecraft:glow_stick"},{"data":0,"id":167,"name":"minecraft:iron_trapdoor"},{"data":1,"id":167,"name":"minecraft:iron_trapdoor"},{"data":2,"id":167,"name":"minecraft:iron_trapdoor"},{"data":3,"id":167,"name":"minecraft:iron_trapdoor"},{"data":4,"id":167,"name":"minecraft:iron_trapdoor"},{"data":5,"id":167,"name":"minecraft:iron_trapdoor"},{"data":6,"id":167,"name":"minecraft:iron_trapdoor"},{"data":7,"id":167,"name":"minecraft:iron_trapdoor"},{"data":8,"id":167,"name":"minecraft:iron_trapdoor"},{"data":9,"id":167,"name":"minecraft:iron_trapdoor"},{"data":10,"id":167,"name":"minecraft:iron_trapdoor"},{"data":11,"id":167,"name":"minecraft:iron_trapdoor"},{"data":12,"id":167,"name":"minecraft:iron_trapdoor"},{"data":13,"id":167,"name":"minecraft:iron_trapdoor"},{"data":14,"id":167,"name":"minecraft:iron_trapdoor"},{"data":15,"id":167,"name":"minecraft:iron_trapdoor"},{"data":0,"id":168,"name":"minecraft:prismarine"},{"data":1,"id":168,"name":"minecraft:prismarine"},{"data":2,"id":168,"name":"minecraft:prismarine"},{"data":3,"id":168,"name":"minecraft:prismarine"},{"data":0,"id":169,"name":"minecraft:seaLantern"},{"data":0,"id":170,"name":"minecraft:hay_block"},{"data":1,"id":170,"name":"minecraft:hay_block"},{"data":2,"id":170,"name":"minecraft:hay_block"},{"data":3,"id":170,"name":"minecraft:hay_block"},{"data":4,"id":170,"name":"minecraft:hay_block"},{"data":5,"id":170,"name":"minecraft:hay_block"},{"data":6,"id":170,"name":"minecraft:hay_block"},{"data":7,"id":170,"name":"minecraft:hay_block"},{"data":8,"id":170,"name":"minecraft:hay_block"},{"data":9,"id":170,"name":"minecraft:hay_block"},{"data":10,"id":170,"name":"minecraft:hay_block"},{"data":11,"id":170,"name":"minecraft:hay_block"},{"data":12,"id":170,"name":"minecraft:hay_block"},{"data":13,"id":170,"name":"minecraft:hay_block"},{"data":14,"id":170,"name":"minecraft:hay_block"},{"data":15,"id":170,"name":"minecraft:hay_block"},{"data":0,"id":171,"name":"minecraft:carpet"},{"data":1,"id":171,"name":"minecraft:carpet"},{"data":2,"id":171,"name":"minecraft:carpet"},{"data":3,"id":171,"name":"minecraft:carpet"},{"data":4,"id":171,"name":"minecraft:carpet"},{"data":5,"id":171,"name":"minecraft:carpet"},{"data":6,"id":171,"name":"minecraft:carpet"},{"data":7,"id":171,"name":"minecraft:carpet"},{"data":8,"id":171,"name":"minecraft:carpet"},{"data":9,"id":171,"name":"minecraft:carpet"},{"data":10,"id":171,"name":"minecraft:carpet"},{"data":11,"id":171,"name":"minecraft:carpet"},{"data":12,"id":171,"name":"minecraft:carpet"},{"data":13,"id":171,"name":"minecraft:carpet"},{"data":14,"id":171,"name":"minecraft:carpet"},{"data":15,"id":171,"name":"minecraft:carpet"},{"data":0,"id":172,"name":"minecraft:hardened_clay"},{"data":0,"id":173,"name":"minecraft:coal_block"},{"data":0,"id":174,"name":"minecraft:packed_ice"},{"data":0,"id":175,"name":"minecraft:double_plant"},{"data":1,"id":175,"name":"minecraft:double_plant"},{"data":2,"id":175,"name":"minecraft:double_plant"},{"data":3,"id":175,"name":"minecraft:double_plant"},{"data":4,"id":175,"name":"minecraft:double_plant"},{"data":5,"id":175,"name":"minecraft:double_plant"},{"data":6,"id":175,"name":"minecraft:double_plant"},{"data":7,"id":175,"name":"minecraft:double_plant"},{"data":8,"id":175,"name":"minecraft:double_plant"},{"data":9,"id":175,"name":"minecraft:double_plant"},{"data":10,"id":175,"name":"minecraft:double_plant"},{"data":11,"id":175,"name":"minecraft:double_plant"},{"data":12,"id":175,"name":"minecraft:double_plant"},{"data":13,"id":175,"name":"minecraft:double_plant"},{"data":14,"id":175,"name":"minecraft:double_plant"},{"data":15,"id":175,"name":"minecraft:double_plant"},{"data":0,"id":176,"name":"minecraft:standing_banner"},{"data":1,"id":176,"name":"minecraft:standing_banner"},{"data":2,"id":176,"name":"minecraft:standing_banner"},{"data":3,"id":176,"name":"minecraft:standing_banner"},{"data":4,"id":176,"name":"minecraft:standing_banner"},{"data":5,"id":176,"name":"minecraft:standing_banner"},{"data":6,"id":176,"name":"minecraft:standing_banner"},{"data":7,"id":176,"name":"minecraft:standing_banner"},{"data":8,"id":176,"name":"minecraft:standing_banner"},{"data":9,"id":176,"name":"minecraft:standing_banner"},{"data":10,"id":176,"name":"minecraft:standing_banner"},{"data":11,"id":176,"name":"minecraft:standing_banner"},{"data":12,"id":176,"name":"minecraft:standing_banner"},{"data":13,"id":176,"name":"minecraft:standing_banner"},{"data":14,"id":176,"name":"minecraft:standing_banner"},{"data":15,"id":176,"name":"minecraft:standing_banner"},{"data":0,"id":177,"name":"minecraft:wall_banner"},{"data":1,"id":177,"name":"minecraft:wall_banner"},{"data":2,"id":177,"name":"minecraft:wall_banner"},{"data":3,"id":177,"name":"minecraft:wall_banner"},{"data":4,"id":177,"name":"minecraft:wall_banner"},{"data":5,"id":177,"name":"minecraft:wall_banner"},{"data":6,"id":177,"name":"minecraft:wall_banner"},{"data":7,"id":177,"name":"minecraft:wall_banner"},{"data":0,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":1,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":2,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":3,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":4,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":5,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":6,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":7,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":8,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":9,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":10,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":11,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":12,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":13,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":14,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":15,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":0,"id":179,"name":"minecraft:red_sandstone"},{"data":1,"id":179,"name":"minecraft:red_sandstone"},{"data":2,"id":179,"name":"minecraft:red_sandstone"},{"data":3,"id":179,"name":"minecraft:red_sandstone"},{"data":0,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":1,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":2,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":3,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":4,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":5,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":6,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":7,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":0,"id":181,"name":"minecraft:double_stone_slab2"},{"data":1,"id":181,"name":"minecraft:double_stone_slab2"},{"data":2,"id":181,"name":"minecraft:double_stone_slab2"},{"data":3,"id":181,"name":"minecraft:double_stone_slab2"},{"data":4,"id":181,"name":"minecraft:double_stone_slab2"},{"data":5,"id":181,"name":"minecraft:double_stone_slab2"},{"data":6,"id":181,"name":"minecraft:double_stone_slab2"},{"data":7,"id":181,"name":"minecraft:double_stone_slab2"},{"data":8,"id":181,"name":"minecraft:double_stone_slab2"},{"data":9,"id":181,"name":"minecraft:double_stone_slab2"},{"data":10,"id":181,"name":"minecraft:double_stone_slab2"},{"data":11,"id":181,"name":"minecraft:double_stone_slab2"},{"data":12,"id":181,"name":"minecraft:double_stone_slab2"},{"data":13,"id":181,"name":"minecraft:double_stone_slab2"},{"data":14,"id":181,"name":"minecraft:double_stone_slab2"},{"data":15,"id":181,"name":"minecraft:double_stone_slab2"},{"data":0,"id":182,"name":"minecraft:stone_slab2"},{"data":1,"id":182,"name":"minecraft:stone_slab2"},{"data":2,"id":182,"name":"minecraft:stone_slab2"},{"data":3,"id":182,"name":"minecraft:stone_slab2"},{"data":4,"id":182,"name":"minecraft:stone_slab2"},{"data":5,"id":182,"name":"minecraft:stone_slab2"},{"data":6,"id":182,"name":"minecraft:stone_slab2"},{"data":7,"id":182,"name":"minecraft:stone_slab2"},{"data":8,"id":182,"name":"minecraft:stone_slab2"},{"data":9,"id":182,"name":"minecraft:stone_slab2"},{"data":10,"id":182,"name":"minecraft:stone_slab2"},{"data":11,"id":182,"name":"minecraft:stone_slab2"},{"data":12,"id":182,"name":"minecraft:stone_slab2"},{"data":13,"id":182,"name":"minecraft:stone_slab2"},{"data":14,"id":182,"name":"minecraft:stone_slab2"},{"data":15,"id":182,"name":"minecraft:stone_slab2"},{"data":0,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":1,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":2,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":3,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":4,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":5,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":6,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":7,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":8,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":9,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":10,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":11,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":12,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":13,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":14,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":15,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":0,"id":184,"name":"minecraft:birch_fence_gate"},{"data":1,"id":184,"name":"minecraft:birch_fence_gate"},{"data":2,"id":184,"name":"minecraft:birch_fence_gate"},{"data":3,"id":184,"name":"minecraft:birch_fence_gate"},{"data":4,"id":184,"name":"minecraft:birch_fence_gate"},{"data":5,"id":184,"name":"minecraft:birch_fence_gate"},{"data":6,"id":184,"name":"minecraft:birch_fence_gate"},{"data":7,"id":184,"name":"minecraft:birch_fence_gate"},{"data":8,"id":184,"name":"minecraft:birch_fence_gate"},{"data":9,"id":184,"name":"minecraft:birch_fence_gate"},{"data":10,"id":184,"name":"minecraft:birch_fence_gate"},{"data":11,"id":184,"name":"minecraft:birch_fence_gate"},{"data":12,"id":184,"name":"minecraft:birch_fence_gate"},{"data":13,"id":184,"name":"minecraft:birch_fence_gate"},{"data":14,"id":184,"name":"minecraft:birch_fence_gate"},{"data":15,"id":184,"name":"minecraft:birch_fence_gate"},{"data":0,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":1,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":2,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":3,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":4,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":5,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":6,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":7,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":8,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":9,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":10,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":11,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":12,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":13,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":14,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":15,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":0,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":1,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":2,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":3,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":4,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":5,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":6,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":7,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":8,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":9,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":10,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":11,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":12,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":13,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":14,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":15,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":0,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":1,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":2,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":3,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":4,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":5,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":6,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":7,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":8,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":9,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":10,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":11,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":12,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":13,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":14,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":15,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":0,"id":188,"name":"minecraft:repeating_command_block"},{"data":1,"id":188,"name":"minecraft:repeating_command_block"},{"data":2,"id":188,"name":"minecraft:repeating_command_block"},{"data":3,"id":188,"name":"minecraft:repeating_command_block"},{"data":4,"id":188,"name":"minecraft:repeating_command_block"},{"data":5,"id":188,"name":"minecraft:repeating_command_block"},{"data":6,"id":188,"name":"minecraft:repeating_command_block"},{"data":7,"id":188,"name":"minecraft:repeating_command_block"},{"data":8,"id":188,"name":"minecraft:repeating_command_block"},{"data":9,"id":188,"name":"minecraft:repeating_command_block"},{"data":10,"id":188,"name":"minecraft:repeating_command_block"},{"data":11,"id":188,"name":"minecraft:repeating_command_block"},{"data":12,"id":188,"name":"minecraft:repeating_command_block"},{"data":13,"id":188,"name":"minecraft:repeating_command_block"},{"data":14,"id":188,"name":"minecraft:repeating_command_block"},{"data":15,"id":188,"name":"minecraft:repeating_command_block"},{"data":0,"id":189,"name":"minecraft:chain_command_block"},{"data":1,"id":189,"name":"minecraft:chain_command_block"},{"data":2,"id":189,"name":"minecraft:chain_command_block"},{"data":3,"id":189,"name":"minecraft:chain_command_block"},{"data":4,"id":189,"name":"minecraft:chain_command_block"},{"data":5,"id":189,"name":"minecraft:chain_command_block"},{"data":6,"id":189,"name":"minecraft:chain_command_block"},{"data":7,"id":189,"name":"minecraft:chain_command_block"},{"data":8,"id":189,"name":"minecraft:chain_command_block"},{"data":9,"id":189,"name":"minecraft:chain_command_block"},{"data":10,"id":189,"name":"minecraft:chain_command_block"},{"data":11,"id":189,"name":"minecraft:chain_command_block"},{"data":12,"id":189,"name":"minecraft:chain_command_block"},{"data":13,"id":189,"name":"minecraft:chain_command_block"},{"data":14,"id":189,"name":"minecraft:chain_command_block"},{"data":15,"id":189,"name":"minecraft:chain_command_block"},{"data":0,"id":190,"name":"minecraft:hard_glass_pane"},{"data":0,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":1,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":2,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":3,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":4,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":5,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":6,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":7,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":8,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":9,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":10,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":11,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":12,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":13,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":14,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":15,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":0,"id":192,"name":"minecraft:chemical_heat"},{"data":0,"id":193,"name":"minecraft:spruce_door"},{"data":1,"id":193,"name":"minecraft:spruce_door"},{"data":2,"id":193,"name":"minecraft:spruce_door"},{"data":3,"id":193,"name":"minecraft:spruce_door"},{"data":4,"id":193,"name":"minecraft:spruce_door"},{"data":5,"id":193,"name":"minecraft:spruce_door"},{"data":6,"id":193,"name":"minecraft:spruce_door"},{"data":7,"id":193,"name":"minecraft:spruce_door"},{"data":8,"id":193,"name":"minecraft:spruce_door"},{"data":9,"id":193,"name":"minecraft:spruce_door"},{"data":10,"id":193,"name":"minecraft:spruce_door"},{"data":11,"id":193,"name":"minecraft:spruce_door"},{"data":12,"id":193,"name":"minecraft:spruce_door"},{"data":13,"id":193,"name":"minecraft:spruce_door"},{"data":14,"id":193,"name":"minecraft:spruce_door"},{"data":15,"id":193,"name":"minecraft:spruce_door"},{"data":0,"id":194,"name":"minecraft:birch_door"},{"data":1,"id":194,"name":"minecraft:birch_door"},{"data":2,"id":194,"name":"minecraft:birch_door"},{"data":3,"id":194,"name":"minecraft:birch_door"},{"data":4,"id":194,"name":"minecraft:birch_door"},{"data":5,"id":194,"name":"minecraft:birch_door"},{"data":6,"id":194,"name":"minecraft:birch_door"},{"data":7,"id":194,"name":"minecraft:birch_door"},{"data":8,"id":194,"name":"minecraft:birch_door"},{"data":9,"id":194,"name":"minecraft:birch_door"},{"data":10,"id":194,"name":"minecraft:birch_door"},{"data":11,"id":194,"name":"minecraft:birch_door"},{"data":12,"id":194,"name":"minecraft:birch_door"},{"data":13,"id":194,"name":"minecraft:birch_door"},{"data":14,"id":194,"name":"minecraft:birch_door"},{"data":15,"id":194,"name":"minecraft:birch_door"},{"data":0,"id":195,"name":"minecraft:jungle_door"},{"data":1,"id":195,"name":"minecraft:jungle_door"},{"data":2,"id":195,"name":"minecraft:jungle_door"},{"data":3,"id":195,"name":"minecraft:jungle_door"},{"data":4,"id":195,"name":"minecraft:jungle_door"},{"data":5,"id":195,"name":"minecraft:jungle_door"},{"data":6,"id":195,"name":"minecraft:jungle_door"},{"data":7,"id":195,"name":"minecraft:jungle_door"},{"data":8,"id":195,"name":"minecraft:jungle_door"},{"data":9,"id":195,"name":"minecraft:jungle_door"},{"data":10,"id":195,"name":"minecraft:jungle_door"},{"data":11,"id":195,"name":"minecraft:jungle_door"},{"data":12,"id":195,"name":"minecraft:jungle_door"},{"data":13,"id":195,"name":"minecraft:jungle_door"},{"data":14,"id":195,"name":"minecraft:jungle_door"},{"data":15,"id":195,"name":"minecraft:jungle_door"},{"data":0,"id":196,"name":"minecraft:acacia_door"},{"data":1,"id":196,"name":"minecraft:acacia_door"},{"data":2,"id":196,"name":"minecraft:acacia_door"},{"data":3,"id":196,"name":"minecraft:acacia_door"},{"data":4,"id":196,"name":"minecraft:acacia_door"},{"data":5,"id":196,"name":"minecraft:acacia_door"},{"data":6,"id":196,"name":"minecraft:acacia_door"},{"data":7,"id":196,"name":"minecraft:acacia_door"},{"data":8,"id":196,"name":"minecraft:acacia_door"},{"data":9,"id":196,"name":"minecraft:acacia_door"},{"data":10,"id":196,"name":"minecraft:acacia_door"},{"data":11,"id":196,"name":"minecraft:acacia_door"},{"data":12,"id":196,"name":"minecraft:acacia_door"},{"data":13,"id":196,"name":"minecraft:acacia_door"},{"data":14,"id":196,"name":"minecraft:acacia_door"},{"data":15,"id":196,"name":"minecraft:acacia_door"},{"data":0,"id":197,"name":"minecraft:dark_oak_door"},{"data":1,"id":197,"name":"minecraft:dark_oak_door"},{"data":2,"id":197,"name":"minecraft:dark_oak_door"},{"data":3,"id":197,"name":"minecraft:dark_oak_door"},{"data":4,"id":197,"name":"minecraft:dark_oak_door"},{"data":5,"id":197,"name":"minecraft:dark_oak_door"},{"data":6,"id":197,"name":"minecraft:dark_oak_door"},{"data":7,"id":197,"name":"minecraft:dark_oak_door"},{"data":8,"id":197,"name":"minecraft:dark_oak_door"},{"data":9,"id":197,"name":"minecraft:dark_oak_door"},{"data":10,"id":197,"name":"minecraft:dark_oak_door"},{"data":11,"id":197,"name":"minecraft:dark_oak_door"},{"data":12,"id":197,"name":"minecraft:dark_oak_door"},{"data":13,"id":197,"name":"minecraft:dark_oak_door"},{"data":14,"id":197,"name":"minecraft:dark_oak_door"},{"data":15,"id":197,"name":"minecraft:dark_oak_door"},{"data":0,"id":198,"name":"minecraft:grass_path"},{"data":0,"id":199,"name":"minecraft:frame"},{"data":1,"id":199,"name":"minecraft:frame"},{"data":2,"id":199,"name":"minecraft:frame"},{"data":3,"id":199,"name":"minecraft:frame"},{"data":4,"id":199,"name":"minecraft:frame"},{"data":5,"id":199,"name":"minecraft:frame"},{"data":6,"id":199,"name":"minecraft:frame"},{"data":7,"id":199,"name":"minecraft:frame"},{"data":0,"id":200,"name":"minecraft:chorus_flower"},{"data":1,"id":200,"name":"minecraft:chorus_flower"},{"data":2,"id":200,"name":"minecraft:chorus_flower"},{"data":3,"id":200,"name":"minecraft:chorus_flower"},{"data":4,"id":200,"name":"minecraft:chorus_flower"},{"data":5,"id":200,"name":"minecraft:chorus_flower"},{"data":6,"id":200,"name":"minecraft:chorus_flower"},{"data":7,"id":200,"name":"minecraft:chorus_flower"},{"data":0,"id":201,"name":"minecraft:purpur_block"},{"data":1,"id":201,"name":"minecraft:purpur_block"},{"data":2,"id":201,"name":"minecraft:purpur_block"},{"data":3,"id":201,"name":"minecraft:purpur_block"},{"data":4,"id":201,"name":"minecraft:purpur_block"},{"data":5,"id":201,"name":"minecraft:purpur_block"},{"data":6,"id":201,"name":"minecraft:purpur_block"},{"data":7,"id":201,"name":"minecraft:purpur_block"},{"data":8,"id":201,"name":"minecraft:purpur_block"},{"data":9,"id":201,"name":"minecraft:purpur_block"},{"data":10,"id":201,"name":"minecraft:purpur_block"},{"data":11,"id":201,"name":"minecraft:purpur_block"},{"data":12,"id":201,"name":"minecraft:purpur_block"},{"data":13,"id":201,"name":"minecraft:purpur_block"},{"data":14,"id":201,"name":"minecraft:purpur_block"},{"data":15,"id":201,"name":"minecraft:purpur_block"},{"data":0,"id":202,"name":"minecraft:colored_torch_rg"},{"data":1,"id":202,"name":"minecraft:colored_torch_rg"},{"data":2,"id":202,"name":"minecraft:colored_torch_rg"},{"data":3,"id":202,"name":"minecraft:colored_torch_rg"},{"data":4,"id":202,"name":"minecraft:colored_torch_rg"},{"data":5,"id":202,"name":"minecraft:colored_torch_rg"},{"data":6,"id":202,"name":"minecraft:colored_torch_rg"},{"data":7,"id":202,"name":"minecraft:colored_torch_rg"},{"data":8,"id":202,"name":"minecraft:colored_torch_rg"},{"data":9,"id":202,"name":"minecraft:colored_torch_rg"},{"data":10,"id":202,"name":"minecraft:colored_torch_rg"},{"data":11,"id":202,"name":"minecraft:colored_torch_rg"},{"data":12,"id":202,"name":"minecraft:colored_torch_rg"},{"data":13,"id":202,"name":"minecraft:colored_torch_rg"},{"data":14,"id":202,"name":"minecraft:colored_torch_rg"},{"data":15,"id":202,"name":"minecraft:colored_torch_rg"},{"data":0,"id":203,"name":"minecraft:purpur_stairs"},{"data":1,"id":203,"name":"minecraft:purpur_stairs"},{"data":2,"id":203,"name":"minecraft:purpur_stairs"},{"data":3,"id":203,"name":"minecraft:purpur_stairs"},{"data":4,"id":203,"name":"minecraft:purpur_stairs"},{"data":5,"id":203,"name":"minecraft:purpur_stairs"},{"data":6,"id":203,"name":"minecraft:purpur_stairs"},{"data":7,"id":203,"name":"minecraft:purpur_stairs"},{"data":0,"id":204,"name":"minecraft:colored_torch_bp"},{"data":1,"id":204,"name":"minecraft:colored_torch_bp"},{"data":2,"id":204,"name":"minecraft:colored_torch_bp"},{"data":3,"id":204,"name":"minecraft:colored_torch_bp"},{"data":4,"id":204,"name":"minecraft:colored_torch_bp"},{"data":5,"id":204,"name":"minecraft:colored_torch_bp"},{"data":6,"id":204,"name":"minecraft:colored_torch_bp"},{"data":7,"id":204,"name":"minecraft:colored_torch_bp"},{"data":8,"id":204,"name":"minecraft:colored_torch_bp"},{"data":9,"id":204,"name":"minecraft:colored_torch_bp"},{"data":10,"id":204,"name":"minecraft:colored_torch_bp"},{"data":11,"id":204,"name":"minecraft:colored_torch_bp"},{"data":12,"id":204,"name":"minecraft:colored_torch_bp"},{"data":13,"id":204,"name":"minecraft:colored_torch_bp"},{"data":14,"id":204,"name":"minecraft:colored_torch_bp"},{"data":15,"id":204,"name":"minecraft:colored_torch_bp"},{"data":0,"id":205,"name":"minecraft:undyed_shulker_box"},{"data":0,"id":206,"name":"minecraft:end_bricks"},{"data":0,"id":207,"name":"minecraft:frosted_ice"},{"data":1,"id":207,"name":"minecraft:frosted_ice"},{"data":2,"id":207,"name":"minecraft:frosted_ice"},{"data":3,"id":207,"name":"minecraft:frosted_ice"},{"data":0,"id":208,"name":"minecraft:end_rod"},{"data":1,"id":208,"name":"minecraft:end_rod"},{"data":2,"id":208,"name":"minecraft:end_rod"},{"data":3,"id":208,"name":"minecraft:end_rod"},{"data":4,"id":208,"name":"minecraft:end_rod"},{"data":5,"id":208,"name":"minecraft:end_rod"},{"data":6,"id":208,"name":"minecraft:end_rod"},{"data":7,"id":208,"name":"minecraft:end_rod"},{"data":0,"id":209,"name":"minecraft:end_gateway"},{"data":0,"id":213,"name":"minecraft:magma"},{"data":0,"id":214,"name":"minecraft:nether_wart_block"},{"data":0,"id":215,"name":"minecraft:red_nether_brick"},{"data":0,"id":216,"name":"minecraft:bone_block"},{"data":1,"id":216,"name":"minecraft:bone_block"},{"data":2,"id":216,"name":"minecraft:bone_block"},{"data":3,"id":216,"name":"minecraft:bone_block"},{"data":4,"id":216,"name":"minecraft:bone_block"},{"data":5,"id":216,"name":"minecraft:bone_block"},{"data":6,"id":216,"name":"minecraft:bone_block"},{"data":7,"id":216,"name":"minecraft:bone_block"},{"data":8,"id":216,"name":"minecraft:bone_block"},{"data":9,"id":216,"name":"minecraft:bone_block"},{"data":10,"id":216,"name":"minecraft:bone_block"},{"data":11,"id":216,"name":"minecraft:bone_block"},{"data":12,"id":216,"name":"minecraft:bone_block"},{"data":13,"id":216,"name":"minecraft:bone_block"},{"data":14,"id":216,"name":"minecraft:bone_block"},{"data":15,"id":216,"name":"minecraft:bone_block"},{"data":0,"id":218,"name":"minecraft:shulker_box"},{"data":1,"id":218,"name":"minecraft:shulker_box"},{"data":2,"id":218,"name":"minecraft:shulker_box"},{"data":3,"id":218,"name":"minecraft:shulker_box"},{"data":4,"id":218,"name":"minecraft:shulker_box"},{"data":5,"id":218,"name":"minecraft:shulker_box"},{"data":6,"id":218,"name":"minecraft:shulker_box"},{"data":7,"id":218,"name":"minecraft:shulker_box"},{"data":8,"id":218,"name":"minecraft:shulker_box"},{"data":9,"id":218,"name":"minecraft:shulker_box"},{"data":10,"id":218,"name":"minecraft:shulker_box"},{"data":11,"id":218,"name":"minecraft:shulker_box"},{"data":12,"id":218,"name":"minecraft:shulker_box"},{"data":13,"id":218,"name":"minecraft:shulker_box"},{"data":14,"id":218,"name":"minecraft:shulker_box"},{"data":15,"id":218,"name":"minecraft:shulker_box"},{"data":0,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":1,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":2,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":3,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":4,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":5,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":6,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":7,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":0,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":1,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":2,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":3,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":4,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":5,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":6,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":7,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":0,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":1,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":2,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":3,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":4,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":5,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":6,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":7,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":0,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":1,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":2,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":3,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":4,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":5,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":6,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":7,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":0,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":1,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":2,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":3,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":4,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":5,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":6,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":7,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":0,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":1,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":2,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":3,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":4,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":5,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":6,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":7,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":0,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":1,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":2,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":3,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":4,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":5,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":6,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":7,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":0,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":1,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":2,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":3,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":4,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":5,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":6,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":7,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":0,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":1,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":2,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":3,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":4,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":5,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":6,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":7,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":0,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":1,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":2,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":3,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":4,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":5,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":6,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":7,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":0,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":1,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":2,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":3,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":4,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":5,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":6,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":7,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":0,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":1,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":2,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":3,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":4,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":5,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":6,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":7,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":0,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":1,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":2,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":3,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":4,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":5,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":6,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":7,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":0,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":1,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":2,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":3,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":4,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":5,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":6,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":7,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":0,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":1,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":2,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":3,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":4,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":5,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":6,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":7,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":0,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":1,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":2,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":3,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":4,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":5,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":6,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":7,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":0,"id":236,"name":"minecraft:concrete"},{"data":1,"id":236,"name":"minecraft:concrete"},{"data":2,"id":236,"name":"minecraft:concrete"},{"data":3,"id":236,"name":"minecraft:concrete"},{"data":4,"id":236,"name":"minecraft:concrete"},{"data":5,"id":236,"name":"minecraft:concrete"},{"data":6,"id":236,"name":"minecraft:concrete"},{"data":7,"id":236,"name":"minecraft:concrete"},{"data":8,"id":236,"name":"minecraft:concrete"},{"data":9,"id":236,"name":"minecraft:concrete"},{"data":10,"id":236,"name":"minecraft:concrete"},{"data":11,"id":236,"name":"minecraft:concrete"},{"data":12,"id":236,"name":"minecraft:concrete"},{"data":13,"id":236,"name":"minecraft:concrete"},{"data":14,"id":236,"name":"minecraft:concrete"},{"data":15,"id":236,"name":"minecraft:concrete"},{"data":0,"id":237,"name":"minecraft:concretePowder"},{"data":1,"id":237,"name":"minecraft:concretePowder"},{"data":2,"id":237,"name":"minecraft:concretePowder"},{"data":3,"id":237,"name":"minecraft:concretePowder"},{"data":4,"id":237,"name":"minecraft:concretePowder"},{"data":5,"id":237,"name":"minecraft:concretePowder"},{"data":6,"id":237,"name":"minecraft:concretePowder"},{"data":7,"id":237,"name":"minecraft:concretePowder"},{"data":8,"id":237,"name":"minecraft:concretePowder"},{"data":9,"id":237,"name":"minecraft:concretePowder"},{"data":10,"id":237,"name":"minecraft:concretePowder"},{"data":11,"id":237,"name":"minecraft:concretePowder"},{"data":12,"id":237,"name":"minecraft:concretePowder"},{"data":13,"id":237,"name":"minecraft:concretePowder"},{"data":14,"id":237,"name":"minecraft:concretePowder"},{"data":15,"id":237,"name":"minecraft:concretePowder"},{"data":0,"id":238,"name":"minecraft:chemistry_table"},{"data":1,"id":238,"name":"minecraft:chemistry_table"},{"data":2,"id":238,"name":"minecraft:chemistry_table"},{"data":3,"id":238,"name":"minecraft:chemistry_table"},{"data":4,"id":238,"name":"minecraft:chemistry_table"},{"data":5,"id":238,"name":"minecraft:chemistry_table"},{"data":6,"id":238,"name":"minecraft:chemistry_table"},{"data":7,"id":238,"name":"minecraft:chemistry_table"},{"data":8,"id":238,"name":"minecraft:chemistry_table"},{"data":9,"id":238,"name":"minecraft:chemistry_table"},{"data":10,"id":238,"name":"minecraft:chemistry_table"},{"data":11,"id":238,"name":"minecraft:chemistry_table"},{"data":12,"id":238,"name":"minecraft:chemistry_table"},{"data":13,"id":238,"name":"minecraft:chemistry_table"},{"data":14,"id":238,"name":"minecraft:chemistry_table"},{"data":15,"id":238,"name":"minecraft:chemistry_table"},{"data":0,"id":239,"name":"minecraft:underwater_torch"},{"data":1,"id":239,"name":"minecraft:underwater_torch"},{"data":2,"id":239,"name":"minecraft:underwater_torch"},{"data":3,"id":239,"name":"minecraft:underwater_torch"},{"data":4,"id":239,"name":"minecraft:underwater_torch"},{"data":5,"id":239,"name":"minecraft:underwater_torch"},{"data":6,"id":239,"name":"minecraft:underwater_torch"},{"data":7,"id":239,"name":"minecraft:underwater_torch"},{"data":0,"id":240,"name":"minecraft:chorus_plant"},{"data":0,"id":241,"name":"minecraft:stained_glass"},{"data":1,"id":241,"name":"minecraft:stained_glass"},{"data":2,"id":241,"name":"minecraft:stained_glass"},{"data":3,"id":241,"name":"minecraft:stained_glass"},{"data":4,"id":241,"name":"minecraft:stained_glass"},{"data":5,"id":241,"name":"minecraft:stained_glass"},{"data":6,"id":241,"name":"minecraft:stained_glass"},{"data":7,"id":241,"name":"minecraft:stained_glass"},{"data":8,"id":241,"name":"minecraft:stained_glass"},{"data":9,"id":241,"name":"minecraft:stained_glass"},{"data":10,"id":241,"name":"minecraft:stained_glass"},{"data":11,"id":241,"name":"minecraft:stained_glass"},{"data":12,"id":241,"name":"minecraft:stained_glass"},{"data":13,"id":241,"name":"minecraft:stained_glass"},{"data":14,"id":241,"name":"minecraft:stained_glass"},{"data":15,"id":241,"name":"minecraft:stained_glass"},{"data":0,"id":243,"name":"minecraft:podzol"},{"data":0,"id":244,"name":"minecraft:beetroot"},{"data":1,"id":244,"name":"minecraft:beetroot"},{"data":2,"id":244,"name":"minecraft:beetroot"},{"data":3,"id":244,"name":"minecraft:beetroot"},{"data":4,"id":244,"name":"minecraft:beetroot"},{"data":5,"id":244,"name":"minecraft:beetroot"},{"data":6,"id":244,"name":"minecraft:beetroot"},{"data":7,"id":244,"name":"minecraft:beetroot"},{"data":0,"id":245,"name":"minecraft:stonecutter"},{"data":0,"id":246,"name":"minecraft:glowingobsidian"},{"data":0,"id":247,"name":"minecraft:netherreactor"},{"data":0,"id":248,"name":"minecraft:info_update"},{"data":0,"id":249,"name":"minecraft:info_update2"},{"data":0,"id":250,"name":"minecraft:movingBlock"},{"data":0,"id":251,"name":"minecraft:observer"},{"data":1,"id":251,"name":"minecraft:observer"},{"data":2,"id":251,"name":"minecraft:observer"},{"data":3,"id":251,"name":"minecraft:observer"},{"data":4,"id":251,"name":"minecraft:observer"},{"data":5,"id":251,"name":"minecraft:observer"},{"data":6,"id":251,"name":"minecraft:observer"},{"data":7,"id":251,"name":"minecraft:observer"},{"data":8,"id":251,"name":"minecraft:observer"},{"data":9,"id":251,"name":"minecraft:observer"},{"data":10,"id":251,"name":"minecraft:observer"},{"data":11,"id":251,"name":"minecraft:observer"},{"data":12,"id":251,"name":"minecraft:observer"},{"data":13,"id":251,"name":"minecraft:observer"},{"data":14,"id":251,"name":"minecraft:observer"},{"data":15,"id":251,"name":"minecraft:observer"},{"data":0,"id":252,"name":"minecraft:structure_block"},{"data":1,"id":252,"name":"minecraft:structure_block"},{"data":2,"id":252,"name":"minecraft:structure_block"},{"data":3,"id":252,"name":"minecraft:structure_block"},{"data":4,"id":252,"name":"minecraft:structure_block"},{"data":5,"id":252,"name":"minecraft:structure_block"},{"data":6,"id":252,"name":"minecraft:structure_block"},{"data":7,"id":252,"name":"minecraft:structure_block"},{"data":0,"id":253,"name":"minecraft:hard_glass"},{"data":0,"id":254,"name":"minecraft:hard_stained_glass"},{"data":1,"id":254,"name":"minecraft:hard_stained_glass"},{"data":2,"id":254,"name":"minecraft:hard_stained_glass"},{"data":3,"id":254,"name":"minecraft:hard_stained_glass"},{"data":4,"id":254,"name":"minecraft:hard_stained_glass"},{"data":5,"id":254,"name":"minecraft:hard_stained_glass"},{"data":6,"id":254,"name":"minecraft:hard_stained_glass"},{"data":7,"id":254,"name":"minecraft:hard_stained_glass"},{"data":8,"id":254,"name":"minecraft:hard_stained_glass"},{"data":9,"id":254,"name":"minecraft:hard_stained_glass"},{"data":10,"id":254,"name":"minecraft:hard_stained_glass"},{"data":11,"id":254,"name":"minecraft:hard_stained_glass"},{"data":12,"id":254,"name":"minecraft:hard_stained_glass"},{"data":13,"id":254,"name":"minecraft:hard_stained_glass"},{"data":14,"id":254,"name":"minecraft:hard_stained_glass"},{"data":15,"id":254,"name":"minecraft:hard_stained_glass"},{"data":0,"id":255,"name":"minecraft:reserved6"},{"data":0,"id":257,"name":"minecraft:prismarine_stairs"},{"data":1,"id":257,"name":"minecraft:prismarine_stairs"},{"data":2,"id":257,"name":"minecraft:prismarine_stairs"},{"data":3,"id":257,"name":"minecraft:prismarine_stairs"},{"data":4,"id":257,"name":"minecraft:prismarine_stairs"},{"data":5,"id":257,"name":"minecraft:prismarine_stairs"},{"data":6,"id":257,"name":"minecraft:prismarine_stairs"},{"data":7,"id":257,"name":"minecraft:prismarine_stairs"},{"data":0,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":1,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":2,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":3,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":4,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":5,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":6,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":7,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":0,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":1,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":2,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":3,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":4,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":5,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":6,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":7,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":0,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":1,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":2,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":3,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":0,"id":261,"name":"minecraft:stripped_birch_log"},{"data":1,"id":261,"name":"minecraft:stripped_birch_log"},{"data":2,"id":261,"name":"minecraft:stripped_birch_log"},{"data":3,"id":261,"name":"minecraft:stripped_birch_log"},{"data":0,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":1,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":2,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":3,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":0,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":1,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":2,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":3,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":0,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":1,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":2,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":3,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":0,"id":265,"name":"minecraft:stripped_oak_log"},{"data":1,"id":265,"name":"minecraft:stripped_oak_log"},{"data":2,"id":265,"name":"minecraft:stripped_oak_log"},{"data":3,"id":265,"name":"minecraft:stripped_oak_log"},{"data":0,"id":266,"name":"minecraft:blue_ice"},{"data":0,"id":267,"name":"minecraft:element_1"},{"data":1,"id":267,"name":"minecraft:element_1"},{"data":2,"id":267,"name":"minecraft:element_1"},{"data":3,"id":267,"name":"minecraft:element_1"},{"data":4,"id":267,"name":"minecraft:element_1"},{"data":5,"id":267,"name":"minecraft:element_1"},{"data":6,"id":267,"name":"minecraft:element_1"},{"data":7,"id":267,"name":"minecraft:element_1"},{"data":8,"id":267,"name":"minecraft:element_1"},{"data":9,"id":267,"name":"minecraft:element_1"},{"data":10,"id":267,"name":"minecraft:element_1"},{"data":11,"id":267,"name":"minecraft:element_1"},{"data":12,"id":267,"name":"minecraft:element_1"},{"data":13,"id":267,"name":"minecraft:element_1"},{"data":14,"id":267,"name":"minecraft:element_1"},{"data":15,"id":267,"name":"minecraft:element_1"},{"data":0,"id":268,"name":"minecraft:element_2"},{"data":1,"id":268,"name":"minecraft:element_2"},{"data":2,"id":268,"name":"minecraft:element_2"},{"data":3,"id":268,"name":"minecraft:element_2"},{"data":4,"id":268,"name":"minecraft:element_2"},{"data":5,"id":268,"name":"minecraft:element_2"},{"data":6,"id":268,"name":"minecraft:element_2"},{"data":7,"id":268,"name":"minecraft:element_2"},{"data":8,"id":268,"name":"minecraft:element_2"},{"data":9,"id":268,"name":"minecraft:element_2"},{"data":10,"id":268,"name":"minecraft:element_2"},{"data":11,"id":268,"name":"minecraft:element_2"},{"data":12,"id":268,"name":"minecraft:element_2"},{"data":13,"id":268,"name":"minecraft:element_2"},{"data":14,"id":268,"name":"minecraft:element_2"},{"data":15,"id":268,"name":"minecraft:element_2"},{"data":0,"id":269,"name":"minecraft:element_3"},{"data":1,"id":269,"name":"minecraft:element_3"},{"data":2,"id":269,"name":"minecraft:element_3"},{"data":3,"id":269,"name":"minecraft:element_3"},{"data":4,"id":269,"name":"minecraft:element_3"},{"data":5,"id":269,"name":"minecraft:element_3"},{"data":6,"id":269,"name":"minecraft:element_3"},{"data":7,"id":269,"name":"minecraft:element_3"},{"data":8,"id":269,"name":"minecraft:element_3"},{"data":9,"id":269,"name":"minecraft:element_3"},{"data":10,"id":269,"name":"minecraft:element_3"},{"data":11,"id":269,"name":"minecraft:element_3"},{"data":12,"id":269,"name":"minecraft:element_3"},{"data":13,"id":269,"name":"minecraft:element_3"},{"data":14,"id":269,"name":"minecraft:element_3"},{"data":15,"id":269,"name":"minecraft:element_3"},{"data":0,"id":270,"name":"minecraft:element_4"},{"data":1,"id":270,"name":"minecraft:element_4"},{"data":2,"id":270,"name":"minecraft:element_4"},{"data":3,"id":270,"name":"minecraft:element_4"},{"data":4,"id":270,"name":"minecraft:element_4"},{"data":5,"id":270,"name":"minecraft:element_4"},{"data":6,"id":270,"name":"minecraft:element_4"},{"data":7,"id":270,"name":"minecraft:element_4"},{"data":8,"id":270,"name":"minecraft:element_4"},{"data":9,"id":270,"name":"minecraft:element_4"},{"data":10,"id":270,"name":"minecraft:element_4"},{"data":11,"id":270,"name":"minecraft:element_4"},{"data":12,"id":270,"name":"minecraft:element_4"},{"data":13,"id":270,"name":"minecraft:element_4"},{"data":14,"id":270,"name":"minecraft:element_4"},{"data":15,"id":270,"name":"minecraft:element_4"},{"data":0,"id":271,"name":"minecraft:element_5"},{"data":1,"id":271,"name":"minecraft:element_5"},{"data":2,"id":271,"name":"minecraft:element_5"},{"data":3,"id":271,"name":"minecraft:element_5"},{"data":4,"id":271,"name":"minecraft:element_5"},{"data":5,"id":271,"name":"minecraft:element_5"},{"data":6,"id":271,"name":"minecraft:element_5"},{"data":7,"id":271,"name":"minecraft:element_5"},{"data":8,"id":271,"name":"minecraft:element_5"},{"data":9,"id":271,"name":"minecraft:element_5"},{"data":10,"id":271,"name":"minecraft:element_5"},{"data":11,"id":271,"name":"minecraft:element_5"},{"data":12,"id":271,"name":"minecraft:element_5"},{"data":13,"id":271,"name":"minecraft:element_5"},{"data":14,"id":271,"name":"minecraft:element_5"},{"data":15,"id":271,"name":"minecraft:element_5"},{"data":0,"id":272,"name":"minecraft:element_6"},{"data":1,"id":272,"name":"minecraft:element_6"},{"data":2,"id":272,"name":"minecraft:element_6"},{"data":3,"id":272,"name":"minecraft:element_6"},{"data":4,"id":272,"name":"minecraft:element_6"},{"data":5,"id":272,"name":"minecraft:element_6"},{"data":6,"id":272,"name":"minecraft:element_6"},{"data":7,"id":272,"name":"minecraft:element_6"},{"data":8,"id":272,"name":"minecraft:element_6"},{"data":9,"id":272,"name":"minecraft:element_6"},{"data":10,"id":272,"name":"minecraft:element_6"},{"data":11,"id":272,"name":"minecraft:element_6"},{"data":12,"id":272,"name":"minecraft:element_6"},{"data":13,"id":272,"name":"minecraft:element_6"},{"data":14,"id":272,"name":"minecraft:element_6"},{"data":15,"id":272,"name":"minecraft:element_6"},{"data":0,"id":273,"name":"minecraft:element_7"},{"data":1,"id":273,"name":"minecraft:element_7"},{"data":2,"id":273,"name":"minecraft:element_7"},{"data":3,"id":273,"name":"minecraft:element_7"},{"data":4,"id":273,"name":"minecraft:element_7"},{"data":5,"id":273,"name":"minecraft:element_7"},{"data":6,"id":273,"name":"minecraft:element_7"},{"data":7,"id":273,"name":"minecraft:element_7"},{"data":8,"id":273,"name":"minecraft:element_7"},{"data":9,"id":273,"name":"minecraft:element_7"},{"data":10,"id":273,"name":"minecraft:element_7"},{"data":11,"id":273,"name":"minecraft:element_7"},{"data":12,"id":273,"name":"minecraft:element_7"},{"data":13,"id":273,"name":"minecraft:element_7"},{"data":14,"id":273,"name":"minecraft:element_7"},{"data":15,"id":273,"name":"minecraft:element_7"},{"data":0,"id":274,"name":"minecraft:element_8"},{"data":1,"id":274,"name":"minecraft:element_8"},{"data":2,"id":274,"name":"minecraft:element_8"},{"data":3,"id":274,"name":"minecraft:element_8"},{"data":4,"id":274,"name":"minecraft:element_8"},{"data":5,"id":274,"name":"minecraft:element_8"},{"data":6,"id":274,"name":"minecraft:element_8"},{"data":7,"id":274,"name":"minecraft:element_8"},{"data":8,"id":274,"name":"minecraft:element_8"},{"data":9,"id":274,"name":"minecraft:element_8"},{"data":10,"id":274,"name":"minecraft:element_8"},{"data":11,"id":274,"name":"minecraft:element_8"},{"data":12,"id":274,"name":"minecraft:element_8"},{"data":13,"id":274,"name":"minecraft:element_8"},{"data":14,"id":274,"name":"minecraft:element_8"},{"data":15,"id":274,"name":"minecraft:element_8"},{"data":0,"id":275,"name":"minecraft:element_9"},{"data":1,"id":275,"name":"minecraft:element_9"},{"data":2,"id":275,"name":"minecraft:element_9"},{"data":3,"id":275,"name":"minecraft:element_9"},{"data":4,"id":275,"name":"minecraft:element_9"},{"data":5,"id":275,"name":"minecraft:element_9"},{"data":6,"id":275,"name":"minecraft:element_9"},{"data":7,"id":275,"name":"minecraft:element_9"},{"data":8,"id":275,"name":"minecraft:element_9"},{"data":9,"id":275,"name":"minecraft:element_9"},{"data":10,"id":275,"name":"minecraft:element_9"},{"data":11,"id":275,"name":"minecraft:element_9"},{"data":12,"id":275,"name":"minecraft:element_9"},{"data":13,"id":275,"name":"minecraft:element_9"},{"data":14,"id":275,"name":"minecraft:element_9"},{"data":15,"id":275,"name":"minecraft:element_9"},{"data":0,"id":276,"name":"minecraft:element_10"},{"data":1,"id":276,"name":"minecraft:element_10"},{"data":2,"id":276,"name":"minecraft:element_10"},{"data":3,"id":276,"name":"minecraft:element_10"},{"data":4,"id":276,"name":"minecraft:element_10"},{"data":5,"id":276,"name":"minecraft:element_10"},{"data":6,"id":276,"name":"minecraft:element_10"},{"data":7,"id":276,"name":"minecraft:element_10"},{"data":8,"id":276,"name":"minecraft:element_10"},{"data":9,"id":276,"name":"minecraft:element_10"},{"data":10,"id":276,"name":"minecraft:element_10"},{"data":11,"id":276,"name":"minecraft:element_10"},{"data":12,"id":276,"name":"minecraft:element_10"},{"data":13,"id":276,"name":"minecraft:element_10"},{"data":14,"id":276,"name":"minecraft:element_10"},{"data":15,"id":276,"name":"minecraft:element_10"},{"data":0,"id":277,"name":"minecraft:element_11"},{"data":1,"id":277,"name":"minecraft:element_11"},{"data":2,"id":277,"name":"minecraft:element_11"},{"data":3,"id":277,"name":"minecraft:element_11"},{"data":4,"id":277,"name":"minecraft:element_11"},{"data":5,"id":277,"name":"minecraft:element_11"},{"data":6,"id":277,"name":"minecraft:element_11"},{"data":7,"id":277,"name":"minecraft:element_11"},{"data":8,"id":277,"name":"minecraft:element_11"},{"data":9,"id":277,"name":"minecraft:element_11"},{"data":10,"id":277,"name":"minecraft:element_11"},{"data":11,"id":277,"name":"minecraft:element_11"},{"data":12,"id":277,"name":"minecraft:element_11"},{"data":13,"id":277,"name":"minecraft:element_11"},{"data":14,"id":277,"name":"minecraft:element_11"},{"data":15,"id":277,"name":"minecraft:element_11"},{"data":0,"id":278,"name":"minecraft:element_12"},{"data":1,"id":278,"name":"minecraft:element_12"},{"data":2,"id":278,"name":"minecraft:element_12"},{"data":3,"id":278,"name":"minecraft:element_12"},{"data":4,"id":278,"name":"minecraft:element_12"},{"data":5,"id":278,"name":"minecraft:element_12"},{"data":6,"id":278,"name":"minecraft:element_12"},{"data":7,"id":278,"name":"minecraft:element_12"},{"data":8,"id":278,"name":"minecraft:element_12"},{"data":9,"id":278,"name":"minecraft:element_12"},{"data":10,"id":278,"name":"minecraft:element_12"},{"data":11,"id":278,"name":"minecraft:element_12"},{"data":12,"id":278,"name":"minecraft:element_12"},{"data":13,"id":278,"name":"minecraft:element_12"},{"data":14,"id":278,"name":"minecraft:element_12"},{"data":15,"id":278,"name":"minecraft:element_12"},{"data":0,"id":279,"name":"minecraft:element_13"},{"data":1,"id":279,"name":"minecraft:element_13"},{"data":2,"id":279,"name":"minecraft:element_13"},{"data":3,"id":279,"name":"minecraft:element_13"},{"data":4,"id":279,"name":"minecraft:element_13"},{"data":5,"id":279,"name":"minecraft:element_13"},{"data":6,"id":279,"name":"minecraft:element_13"},{"data":7,"id":279,"name":"minecraft:element_13"},{"data":8,"id":279,"name":"minecraft:element_13"},{"data":9,"id":279,"name":"minecraft:element_13"},{"data":10,"id":279,"name":"minecraft:element_13"},{"data":11,"id":279,"name":"minecraft:element_13"},{"data":12,"id":279,"name":"minecraft:element_13"},{"data":13,"id":279,"name":"minecraft:element_13"},{"data":14,"id":279,"name":"minecraft:element_13"},{"data":15,"id":279,"name":"minecraft:element_13"},{"data":0,"id":280,"name":"minecraft:element_14"},{"data":1,"id":280,"name":"minecraft:element_14"},{"data":2,"id":280,"name":"minecraft:element_14"},{"data":3,"id":280,"name":"minecraft:element_14"},{"data":4,"id":280,"name":"minecraft:element_14"},{"data":5,"id":280,"name":"minecraft:element_14"},{"data":6,"id":280,"name":"minecraft:element_14"},{"data":7,"id":280,"name":"minecraft:element_14"},{"data":8,"id":280,"name":"minecraft:element_14"},{"data":9,"id":280,"name":"minecraft:element_14"},{"data":10,"id":280,"name":"minecraft:element_14"},{"data":11,"id":280,"name":"minecraft:element_14"},{"data":12,"id":280,"name":"minecraft:element_14"},{"data":13,"id":280,"name":"minecraft:element_14"},{"data":14,"id":280,"name":"minecraft:element_14"},{"data":15,"id":280,"name":"minecraft:element_14"},{"data":0,"id":281,"name":"minecraft:element_15"},{"data":1,"id":281,"name":"minecraft:element_15"},{"data":2,"id":281,"name":"minecraft:element_15"},{"data":3,"id":281,"name":"minecraft:element_15"},{"data":4,"id":281,"name":"minecraft:element_15"},{"data":5,"id":281,"name":"minecraft:element_15"},{"data":6,"id":281,"name":"minecraft:element_15"},{"data":7,"id":281,"name":"minecraft:element_15"},{"data":8,"id":281,"name":"minecraft:element_15"},{"data":9,"id":281,"name":"minecraft:element_15"},{"data":10,"id":281,"name":"minecraft:element_15"},{"data":11,"id":281,"name":"minecraft:element_15"},{"data":12,"id":281,"name":"minecraft:element_15"},{"data":13,"id":281,"name":"minecraft:element_15"},{"data":14,"id":281,"name":"minecraft:element_15"},{"data":15,"id":281,"name":"minecraft:element_15"},{"data":0,"id":282,"name":"minecraft:element_16"},{"data":1,"id":282,"name":"minecraft:element_16"},{"data":2,"id":282,"name":"minecraft:element_16"},{"data":3,"id":282,"name":"minecraft:element_16"},{"data":4,"id":282,"name":"minecraft:element_16"},{"data":5,"id":282,"name":"minecraft:element_16"},{"data":6,"id":282,"name":"minecraft:element_16"},{"data":7,"id":282,"name":"minecraft:element_16"},{"data":8,"id":282,"name":"minecraft:element_16"},{"data":9,"id":282,"name":"minecraft:element_16"},{"data":10,"id":282,"name":"minecraft:element_16"},{"data":11,"id":282,"name":"minecraft:element_16"},{"data":12,"id":282,"name":"minecraft:element_16"},{"data":13,"id":282,"name":"minecraft:element_16"},{"data":14,"id":282,"name":"minecraft:element_16"},{"data":15,"id":282,"name":"minecraft:element_16"},{"data":0,"id":283,"name":"minecraft:element_17"},{"data":1,"id":283,"name":"minecraft:element_17"},{"data":2,"id":283,"name":"minecraft:element_17"},{"data":3,"id":283,"name":"minecraft:element_17"},{"data":4,"id":283,"name":"minecraft:element_17"},{"data":5,"id":283,"name":"minecraft:element_17"},{"data":6,"id":283,"name":"minecraft:element_17"},{"data":7,"id":283,"name":"minecraft:element_17"},{"data":8,"id":283,"name":"minecraft:element_17"},{"data":9,"id":283,"name":"minecraft:element_17"},{"data":10,"id":283,"name":"minecraft:element_17"},{"data":11,"id":283,"name":"minecraft:element_17"},{"data":12,"id":283,"name":"minecraft:element_17"},{"data":13,"id":283,"name":"minecraft:element_17"},{"data":14,"id":283,"name":"minecraft:element_17"},{"data":15,"id":283,"name":"minecraft:element_17"},{"data":0,"id":284,"name":"minecraft:element_18"},{"data":1,"id":284,"name":"minecraft:element_18"},{"data":2,"id":284,"name":"minecraft:element_18"},{"data":3,"id":284,"name":"minecraft:element_18"},{"data":4,"id":284,"name":"minecraft:element_18"},{"data":5,"id":284,"name":"minecraft:element_18"},{"data":6,"id":284,"name":"minecraft:element_18"},{"data":7,"id":284,"name":"minecraft:element_18"},{"data":8,"id":284,"name":"minecraft:element_18"},{"data":9,"id":284,"name":"minecraft:element_18"},{"data":10,"id":284,"name":"minecraft:element_18"},{"data":11,"id":284,"name":"minecraft:element_18"},{"data":12,"id":284,"name":"minecraft:element_18"},{"data":13,"id":284,"name":"minecraft:element_18"},{"data":14,"id":284,"name":"minecraft:element_18"},{"data":15,"id":284,"name":"minecraft:element_18"},{"data":0,"id":285,"name":"minecraft:element_19"},{"data":1,"id":285,"name":"minecraft:element_19"},{"data":2,"id":285,"name":"minecraft:element_19"},{"data":3,"id":285,"name":"minecraft:element_19"},{"data":4,"id":285,"name":"minecraft:element_19"},{"data":5,"id":285,"name":"minecraft:element_19"},{"data":6,"id":285,"name":"minecraft:element_19"},{"data":7,"id":285,"name":"minecraft:element_19"},{"data":8,"id":285,"name":"minecraft:element_19"},{"data":9,"id":285,"name":"minecraft:element_19"},{"data":10,"id":285,"name":"minecraft:element_19"},{"data":11,"id":285,"name":"minecraft:element_19"},{"data":12,"id":285,"name":"minecraft:element_19"},{"data":13,"id":285,"name":"minecraft:element_19"},{"data":14,"id":285,"name":"minecraft:element_19"},{"data":15,"id":285,"name":"minecraft:element_19"},{"data":0,"id":286,"name":"minecraft:element_20"},{"data":1,"id":286,"name":"minecraft:element_20"},{"data":2,"id":286,"name":"minecraft:element_20"},{"data":3,"id":286,"name":"minecraft:element_20"},{"data":4,"id":286,"name":"minecraft:element_20"},{"data":5,"id":286,"name":"minecraft:element_20"},{"data":6,"id":286,"name":"minecraft:element_20"},{"data":7,"id":286,"name":"minecraft:element_20"},{"data":8,"id":286,"name":"minecraft:element_20"},{"data":9,"id":286,"name":"minecraft:element_20"},{"data":10,"id":286,"name":"minecraft:element_20"},{"data":11,"id":286,"name":"minecraft:element_20"},{"data":12,"id":286,"name":"minecraft:element_20"},{"data":13,"id":286,"name":"minecraft:element_20"},{"data":14,"id":286,"name":"minecraft:element_20"},{"data":15,"id":286,"name":"minecraft:element_20"},{"data":0,"id":287,"name":"minecraft:element_21"},{"data":1,"id":287,"name":"minecraft:element_21"},{"data":2,"id":287,"name":"minecraft:element_21"},{"data":3,"id":287,"name":"minecraft:element_21"},{"data":4,"id":287,"name":"minecraft:element_21"},{"data":5,"id":287,"name":"minecraft:element_21"},{"data":6,"id":287,"name":"minecraft:element_21"},{"data":7,"id":287,"name":"minecraft:element_21"},{"data":8,"id":287,"name":"minecraft:element_21"},{"data":9,"id":287,"name":"minecraft:element_21"},{"data":10,"id":287,"name":"minecraft:element_21"},{"data":11,"id":287,"name":"minecraft:element_21"},{"data":12,"id":287,"name":"minecraft:element_21"},{"data":13,"id":287,"name":"minecraft:element_21"},{"data":14,"id":287,"name":"minecraft:element_21"},{"data":15,"id":287,"name":"minecraft:element_21"},{"data":0,"id":288,"name":"minecraft:element_22"},{"data":1,"id":288,"name":"minecraft:element_22"},{"data":2,"id":288,"name":"minecraft:element_22"},{"data":3,"id":288,"name":"minecraft:element_22"},{"data":4,"id":288,"name":"minecraft:element_22"},{"data":5,"id":288,"name":"minecraft:element_22"},{"data":6,"id":288,"name":"minecraft:element_22"},{"data":7,"id":288,"name":"minecraft:element_22"},{"data":8,"id":288,"name":"minecraft:element_22"},{"data":9,"id":288,"name":"minecraft:element_22"},{"data":10,"id":288,"name":"minecraft:element_22"},{"data":11,"id":288,"name":"minecraft:element_22"},{"data":12,"id":288,"name":"minecraft:element_22"},{"data":13,"id":288,"name":"minecraft:element_22"},{"data":14,"id":288,"name":"minecraft:element_22"},{"data":15,"id":288,"name":"minecraft:element_22"},{"data":0,"id":289,"name":"minecraft:element_23"},{"data":1,"id":289,"name":"minecraft:element_23"},{"data":2,"id":289,"name":"minecraft:element_23"},{"data":3,"id":289,"name":"minecraft:element_23"},{"data":4,"id":289,"name":"minecraft:element_23"},{"data":5,"id":289,"name":"minecraft:element_23"},{"data":6,"id":289,"name":"minecraft:element_23"},{"data":7,"id":289,"name":"minecraft:element_23"},{"data":8,"id":289,"name":"minecraft:element_23"},{"data":9,"id":289,"name":"minecraft:element_23"},{"data":10,"id":289,"name":"minecraft:element_23"},{"data":11,"id":289,"name":"minecraft:element_23"},{"data":12,"id":289,"name":"minecraft:element_23"},{"data":13,"id":289,"name":"minecraft:element_23"},{"data":14,"id":289,"name":"minecraft:element_23"},{"data":15,"id":289,"name":"minecraft:element_23"},{"data":0,"id":290,"name":"minecraft:element_24"},{"data":1,"id":290,"name":"minecraft:element_24"},{"data":2,"id":290,"name":"minecraft:element_24"},{"data":3,"id":290,"name":"minecraft:element_24"},{"data":4,"id":290,"name":"minecraft:element_24"},{"data":5,"id":290,"name":"minecraft:element_24"},{"data":6,"id":290,"name":"minecraft:element_24"},{"data":7,"id":290,"name":"minecraft:element_24"},{"data":8,"id":290,"name":"minecraft:element_24"},{"data":9,"id":290,"name":"minecraft:element_24"},{"data":10,"id":290,"name":"minecraft:element_24"},{"data":11,"id":290,"name":"minecraft:element_24"},{"data":12,"id":290,"name":"minecraft:element_24"},{"data":13,"id":290,"name":"minecraft:element_24"},{"data":14,"id":290,"name":"minecraft:element_24"},{"data":15,"id":290,"name":"minecraft:element_24"},{"data":0,"id":291,"name":"minecraft:element_25"},{"data":1,"id":291,"name":"minecraft:element_25"},{"data":2,"id":291,"name":"minecraft:element_25"},{"data":3,"id":291,"name":"minecraft:element_25"},{"data":4,"id":291,"name":"minecraft:element_25"},{"data":5,"id":291,"name":"minecraft:element_25"},{"data":6,"id":291,"name":"minecraft:element_25"},{"data":7,"id":291,"name":"minecraft:element_25"},{"data":8,"id":291,"name":"minecraft:element_25"},{"data":9,"id":291,"name":"minecraft:element_25"},{"data":10,"id":291,"name":"minecraft:element_25"},{"data":11,"id":291,"name":"minecraft:element_25"},{"data":12,"id":291,"name":"minecraft:element_25"},{"data":13,"id":291,"name":"minecraft:element_25"},{"data":14,"id":291,"name":"minecraft:element_25"},{"data":15,"id":291,"name":"minecraft:element_25"},{"data":0,"id":292,"name":"minecraft:element_26"},{"data":1,"id":292,"name":"minecraft:element_26"},{"data":2,"id":292,"name":"minecraft:element_26"},{"data":3,"id":292,"name":"minecraft:element_26"},{"data":4,"id":292,"name":"minecraft:element_26"},{"data":5,"id":292,"name":"minecraft:element_26"},{"data":6,"id":292,"name":"minecraft:element_26"},{"data":7,"id":292,"name":"minecraft:element_26"},{"data":8,"id":292,"name":"minecraft:element_26"},{"data":9,"id":292,"name":"minecraft:element_26"},{"data":10,"id":292,"name":"minecraft:element_26"},{"data":11,"id":292,"name":"minecraft:element_26"},{"data":12,"id":292,"name":"minecraft:element_26"},{"data":13,"id":292,"name":"minecraft:element_26"},{"data":14,"id":292,"name":"minecraft:element_26"},{"data":15,"id":292,"name":"minecraft:element_26"},{"data":0,"id":293,"name":"minecraft:element_27"},{"data":1,"id":293,"name":"minecraft:element_27"},{"data":2,"id":293,"name":"minecraft:element_27"},{"data":3,"id":293,"name":"minecraft:element_27"},{"data":4,"id":293,"name":"minecraft:element_27"},{"data":5,"id":293,"name":"minecraft:element_27"},{"data":6,"id":293,"name":"minecraft:element_27"},{"data":7,"id":293,"name":"minecraft:element_27"},{"data":8,"id":293,"name":"minecraft:element_27"},{"data":9,"id":293,"name":"minecraft:element_27"},{"data":10,"id":293,"name":"minecraft:element_27"},{"data":11,"id":293,"name":"minecraft:element_27"},{"data":12,"id":293,"name":"minecraft:element_27"},{"data":13,"id":293,"name":"minecraft:element_27"},{"data":14,"id":293,"name":"minecraft:element_27"},{"data":15,"id":293,"name":"minecraft:element_27"},{"data":0,"id":294,"name":"minecraft:element_28"},{"data":1,"id":294,"name":"minecraft:element_28"},{"data":2,"id":294,"name":"minecraft:element_28"},{"data":3,"id":294,"name":"minecraft:element_28"},{"data":4,"id":294,"name":"minecraft:element_28"},{"data":5,"id":294,"name":"minecraft:element_28"},{"data":6,"id":294,"name":"minecraft:element_28"},{"data":7,"id":294,"name":"minecraft:element_28"},{"data":8,"id":294,"name":"minecraft:element_28"},{"data":9,"id":294,"name":"minecraft:element_28"},{"data":10,"id":294,"name":"minecraft:element_28"},{"data":11,"id":294,"name":"minecraft:element_28"},{"data":12,"id":294,"name":"minecraft:element_28"},{"data":13,"id":294,"name":"minecraft:element_28"},{"data":14,"id":294,"name":"minecraft:element_28"},{"data":15,"id":294,"name":"minecraft:element_28"},{"data":0,"id":295,"name":"minecraft:element_29"},{"data":1,"id":295,"name":"minecraft:element_29"},{"data":2,"id":295,"name":"minecraft:element_29"},{"data":3,"id":295,"name":"minecraft:element_29"},{"data":4,"id":295,"name":"minecraft:element_29"},{"data":5,"id":295,"name":"minecraft:element_29"},{"data":6,"id":295,"name":"minecraft:element_29"},{"data":7,"id":295,"name":"minecraft:element_29"},{"data":8,"id":295,"name":"minecraft:element_29"},{"data":9,"id":295,"name":"minecraft:element_29"},{"data":10,"id":295,"name":"minecraft:element_29"},{"data":11,"id":295,"name":"minecraft:element_29"},{"data":12,"id":295,"name":"minecraft:element_29"},{"data":13,"id":295,"name":"minecraft:element_29"},{"data":14,"id":295,"name":"minecraft:element_29"},{"data":15,"id":295,"name":"minecraft:element_29"},{"data":0,"id":296,"name":"minecraft:element_30"},{"data":1,"id":296,"name":"minecraft:element_30"},{"data":2,"id":296,"name":"minecraft:element_30"},{"data":3,"id":296,"name":"minecraft:element_30"},{"data":4,"id":296,"name":"minecraft:element_30"},{"data":5,"id":296,"name":"minecraft:element_30"},{"data":6,"id":296,"name":"minecraft:element_30"},{"data":7,"id":296,"name":"minecraft:element_30"},{"data":8,"id":296,"name":"minecraft:element_30"},{"data":9,"id":296,"name":"minecraft:element_30"},{"data":10,"id":296,"name":"minecraft:element_30"},{"data":11,"id":296,"name":"minecraft:element_30"},{"data":12,"id":296,"name":"minecraft:element_30"},{"data":13,"id":296,"name":"minecraft:element_30"},{"data":14,"id":296,"name":"minecraft:element_30"},{"data":15,"id":296,"name":"minecraft:element_30"},{"data":0,"id":297,"name":"minecraft:element_31"},{"data":1,"id":297,"name":"minecraft:element_31"},{"data":2,"id":297,"name":"minecraft:element_31"},{"data":3,"id":297,"name":"minecraft:element_31"},{"data":4,"id":297,"name":"minecraft:element_31"},{"data":5,"id":297,"name":"minecraft:element_31"},{"data":6,"id":297,"name":"minecraft:element_31"},{"data":7,"id":297,"name":"minecraft:element_31"},{"data":8,"id":297,"name":"minecraft:element_31"},{"data":9,"id":297,"name":"minecraft:element_31"},{"data":10,"id":297,"name":"minecraft:element_31"},{"data":11,"id":297,"name":"minecraft:element_31"},{"data":12,"id":297,"name":"minecraft:element_31"},{"data":13,"id":297,"name":"minecraft:element_31"},{"data":14,"id":297,"name":"minecraft:element_31"},{"data":15,"id":297,"name":"minecraft:element_31"},{"data":0,"id":298,"name":"minecraft:element_32"},{"data":1,"id":298,"name":"minecraft:element_32"},{"data":2,"id":298,"name":"minecraft:element_32"},{"data":3,"id":298,"name":"minecraft:element_32"},{"data":4,"id":298,"name":"minecraft:element_32"},{"data":5,"id":298,"name":"minecraft:element_32"},{"data":6,"id":298,"name":"minecraft:element_32"},{"data":7,"id":298,"name":"minecraft:element_32"},{"data":8,"id":298,"name":"minecraft:element_32"},{"data":9,"id":298,"name":"minecraft:element_32"},{"data":10,"id":298,"name":"minecraft:element_32"},{"data":11,"id":298,"name":"minecraft:element_32"},{"data":12,"id":298,"name":"minecraft:element_32"},{"data":13,"id":298,"name":"minecraft:element_32"},{"data":14,"id":298,"name":"minecraft:element_32"},{"data":15,"id":298,"name":"minecraft:element_32"},{"data":0,"id":299,"name":"minecraft:element_33"},{"data":1,"id":299,"name":"minecraft:element_33"},{"data":2,"id":299,"name":"minecraft:element_33"},{"data":3,"id":299,"name":"minecraft:element_33"},{"data":4,"id":299,"name":"minecraft:element_33"},{"data":5,"id":299,"name":"minecraft:element_33"},{"data":6,"id":299,"name":"minecraft:element_33"},{"data":7,"id":299,"name":"minecraft:element_33"},{"data":8,"id":299,"name":"minecraft:element_33"},{"data":9,"id":299,"name":"minecraft:element_33"},{"data":10,"id":299,"name":"minecraft:element_33"},{"data":11,"id":299,"name":"minecraft:element_33"},{"data":12,"id":299,"name":"minecraft:element_33"},{"data":13,"id":299,"name":"minecraft:element_33"},{"data":14,"id":299,"name":"minecraft:element_33"},{"data":15,"id":299,"name":"minecraft:element_33"},{"data":0,"id":300,"name":"minecraft:element_34"},{"data":1,"id":300,"name":"minecraft:element_34"},{"data":2,"id":300,"name":"minecraft:element_34"},{"data":3,"id":300,"name":"minecraft:element_34"},{"data":4,"id":300,"name":"minecraft:element_34"},{"data":5,"id":300,"name":"minecraft:element_34"},{"data":6,"id":300,"name":"minecraft:element_34"},{"data":7,"id":300,"name":"minecraft:element_34"},{"data":8,"id":300,"name":"minecraft:element_34"},{"data":9,"id":300,"name":"minecraft:element_34"},{"data":10,"id":300,"name":"minecraft:element_34"},{"data":11,"id":300,"name":"minecraft:element_34"},{"data":12,"id":300,"name":"minecraft:element_34"},{"data":13,"id":300,"name":"minecraft:element_34"},{"data":14,"id":300,"name":"minecraft:element_34"},{"data":15,"id":300,"name":"minecraft:element_34"},{"data":0,"id":301,"name":"minecraft:element_35"},{"data":1,"id":301,"name":"minecraft:element_35"},{"data":2,"id":301,"name":"minecraft:element_35"},{"data":3,"id":301,"name":"minecraft:element_35"},{"data":4,"id":301,"name":"minecraft:element_35"},{"data":5,"id":301,"name":"minecraft:element_35"},{"data":6,"id":301,"name":"minecraft:element_35"},{"data":7,"id":301,"name":"minecraft:element_35"},{"data":8,"id":301,"name":"minecraft:element_35"},{"data":9,"id":301,"name":"minecraft:element_35"},{"data":10,"id":301,"name":"minecraft:element_35"},{"data":11,"id":301,"name":"minecraft:element_35"},{"data":12,"id":301,"name":"minecraft:element_35"},{"data":13,"id":301,"name":"minecraft:element_35"},{"data":14,"id":301,"name":"minecraft:element_35"},{"data":15,"id":301,"name":"minecraft:element_35"},{"data":0,"id":302,"name":"minecraft:element_36"},{"data":1,"id":302,"name":"minecraft:element_36"},{"data":2,"id":302,"name":"minecraft:element_36"},{"data":3,"id":302,"name":"minecraft:element_36"},{"data":4,"id":302,"name":"minecraft:element_36"},{"data":5,"id":302,"name":"minecraft:element_36"},{"data":6,"id":302,"name":"minecraft:element_36"},{"data":7,"id":302,"name":"minecraft:element_36"},{"data":8,"id":302,"name":"minecraft:element_36"},{"data":9,"id":302,"name":"minecraft:element_36"},{"data":10,"id":302,"name":"minecraft:element_36"},{"data":11,"id":302,"name":"minecraft:element_36"},{"data":12,"id":302,"name":"minecraft:element_36"},{"data":13,"id":302,"name":"minecraft:element_36"},{"data":14,"id":302,"name":"minecraft:element_36"},{"data":15,"id":302,"name":"minecraft:element_36"},{"data":0,"id":303,"name":"minecraft:element_37"},{"data":1,"id":303,"name":"minecraft:element_37"},{"data":2,"id":303,"name":"minecraft:element_37"},{"data":3,"id":303,"name":"minecraft:element_37"},{"data":4,"id":303,"name":"minecraft:element_37"},{"data":5,"id":303,"name":"minecraft:element_37"},{"data":6,"id":303,"name":"minecraft:element_37"},{"data":7,"id":303,"name":"minecraft:element_37"},{"data":8,"id":303,"name":"minecraft:element_37"},{"data":9,"id":303,"name":"minecraft:element_37"},{"data":10,"id":303,"name":"minecraft:element_37"},{"data":11,"id":303,"name":"minecraft:element_37"},{"data":12,"id":303,"name":"minecraft:element_37"},{"data":13,"id":303,"name":"minecraft:element_37"},{"data":14,"id":303,"name":"minecraft:element_37"},{"data":15,"id":303,"name":"minecraft:element_37"},{"data":0,"id":304,"name":"minecraft:element_38"},{"data":1,"id":304,"name":"minecraft:element_38"},{"data":2,"id":304,"name":"minecraft:element_38"},{"data":3,"id":304,"name":"minecraft:element_38"},{"data":4,"id":304,"name":"minecraft:element_38"},{"data":5,"id":304,"name":"minecraft:element_38"},{"data":6,"id":304,"name":"minecraft:element_38"},{"data":7,"id":304,"name":"minecraft:element_38"},{"data":8,"id":304,"name":"minecraft:element_38"},{"data":9,"id":304,"name":"minecraft:element_38"},{"data":10,"id":304,"name":"minecraft:element_38"},{"data":11,"id":304,"name":"minecraft:element_38"},{"data":12,"id":304,"name":"minecraft:element_38"},{"data":13,"id":304,"name":"minecraft:element_38"},{"data":14,"id":304,"name":"minecraft:element_38"},{"data":15,"id":304,"name":"minecraft:element_38"},{"data":0,"id":305,"name":"minecraft:element_39"},{"data":1,"id":305,"name":"minecraft:element_39"},{"data":2,"id":305,"name":"minecraft:element_39"},{"data":3,"id":305,"name":"minecraft:element_39"},{"data":4,"id":305,"name":"minecraft:element_39"},{"data":5,"id":305,"name":"minecraft:element_39"},{"data":6,"id":305,"name":"minecraft:element_39"},{"data":7,"id":305,"name":"minecraft:element_39"},{"data":8,"id":305,"name":"minecraft:element_39"},{"data":9,"id":305,"name":"minecraft:element_39"},{"data":10,"id":305,"name":"minecraft:element_39"},{"data":11,"id":305,"name":"minecraft:element_39"},{"data":12,"id":305,"name":"minecraft:element_39"},{"data":13,"id":305,"name":"minecraft:element_39"},{"data":14,"id":305,"name":"minecraft:element_39"},{"data":15,"id":305,"name":"minecraft:element_39"},{"data":0,"id":306,"name":"minecraft:element_40"},{"data":1,"id":306,"name":"minecraft:element_40"},{"data":2,"id":306,"name":"minecraft:element_40"},{"data":3,"id":306,"name":"minecraft:element_40"},{"data":4,"id":306,"name":"minecraft:element_40"},{"data":5,"id":306,"name":"minecraft:element_40"},{"data":6,"id":306,"name":"minecraft:element_40"},{"data":7,"id":306,"name":"minecraft:element_40"},{"data":8,"id":306,"name":"minecraft:element_40"},{"data":9,"id":306,"name":"minecraft:element_40"},{"data":10,"id":306,"name":"minecraft:element_40"},{"data":11,"id":306,"name":"minecraft:element_40"},{"data":12,"id":306,"name":"minecraft:element_40"},{"data":13,"id":306,"name":"minecraft:element_40"},{"data":14,"id":306,"name":"minecraft:element_40"},{"data":15,"id":306,"name":"minecraft:element_40"},{"data":0,"id":307,"name":"minecraft:element_41"},{"data":1,"id":307,"name":"minecraft:element_41"},{"data":2,"id":307,"name":"minecraft:element_41"},{"data":3,"id":307,"name":"minecraft:element_41"},{"data":4,"id":307,"name":"minecraft:element_41"},{"data":5,"id":307,"name":"minecraft:element_41"},{"data":6,"id":307,"name":"minecraft:element_41"},{"data":7,"id":307,"name":"minecraft:element_41"},{"data":8,"id":307,"name":"minecraft:element_41"},{"data":9,"id":307,"name":"minecraft:element_41"},{"data":10,"id":307,"name":"minecraft:element_41"},{"data":11,"id":307,"name":"minecraft:element_41"},{"data":12,"id":307,"name":"minecraft:element_41"},{"data":13,"id":307,"name":"minecraft:element_41"},{"data":14,"id":307,"name":"minecraft:element_41"},{"data":15,"id":307,"name":"minecraft:element_41"},{"data":0,"id":308,"name":"minecraft:element_42"},{"data":1,"id":308,"name":"minecraft:element_42"},{"data":2,"id":308,"name":"minecraft:element_42"},{"data":3,"id":308,"name":"minecraft:element_42"},{"data":4,"id":308,"name":"minecraft:element_42"},{"data":5,"id":308,"name":"minecraft:element_42"},{"data":6,"id":308,"name":"minecraft:element_42"},{"data":7,"id":308,"name":"minecraft:element_42"},{"data":8,"id":308,"name":"minecraft:element_42"},{"data":9,"id":308,"name":"minecraft:element_42"},{"data":10,"id":308,"name":"minecraft:element_42"},{"data":11,"id":308,"name":"minecraft:element_42"},{"data":12,"id":308,"name":"minecraft:element_42"},{"data":13,"id":308,"name":"minecraft:element_42"},{"data":14,"id":308,"name":"minecraft:element_42"},{"data":15,"id":308,"name":"minecraft:element_42"},{"data":0,"id":309,"name":"minecraft:element_43"},{"data":1,"id":309,"name":"minecraft:element_43"},{"data":2,"id":309,"name":"minecraft:element_43"},{"data":3,"id":309,"name":"minecraft:element_43"},{"data":4,"id":309,"name":"minecraft:element_43"},{"data":5,"id":309,"name":"minecraft:element_43"},{"data":6,"id":309,"name":"minecraft:element_43"},{"data":7,"id":309,"name":"minecraft:element_43"},{"data":8,"id":309,"name":"minecraft:element_43"},{"data":9,"id":309,"name":"minecraft:element_43"},{"data":10,"id":309,"name":"minecraft:element_43"},{"data":11,"id":309,"name":"minecraft:element_43"},{"data":12,"id":309,"name":"minecraft:element_43"},{"data":13,"id":309,"name":"minecraft:element_43"},{"data":14,"id":309,"name":"minecraft:element_43"},{"data":15,"id":309,"name":"minecraft:element_43"},{"data":0,"id":310,"name":"minecraft:element_44"},{"data":1,"id":310,"name":"minecraft:element_44"},{"data":2,"id":310,"name":"minecraft:element_44"},{"data":3,"id":310,"name":"minecraft:element_44"},{"data":4,"id":310,"name":"minecraft:element_44"},{"data":5,"id":310,"name":"minecraft:element_44"},{"data":6,"id":310,"name":"minecraft:element_44"},{"data":7,"id":310,"name":"minecraft:element_44"},{"data":8,"id":310,"name":"minecraft:element_44"},{"data":9,"id":310,"name":"minecraft:element_44"},{"data":10,"id":310,"name":"minecraft:element_44"},{"data":11,"id":310,"name":"minecraft:element_44"},{"data":12,"id":310,"name":"minecraft:element_44"},{"data":13,"id":310,"name":"minecraft:element_44"},{"data":14,"id":310,"name":"minecraft:element_44"},{"data":15,"id":310,"name":"minecraft:element_44"},{"data":0,"id":311,"name":"minecraft:element_45"},{"data":1,"id":311,"name":"minecraft:element_45"},{"data":2,"id":311,"name":"minecraft:element_45"},{"data":3,"id":311,"name":"minecraft:element_45"},{"data":4,"id":311,"name":"minecraft:element_45"},{"data":5,"id":311,"name":"minecraft:element_45"},{"data":6,"id":311,"name":"minecraft:element_45"},{"data":7,"id":311,"name":"minecraft:element_45"},{"data":8,"id":311,"name":"minecraft:element_45"},{"data":9,"id":311,"name":"minecraft:element_45"},{"data":10,"id":311,"name":"minecraft:element_45"},{"data":11,"id":311,"name":"minecraft:element_45"},{"data":12,"id":311,"name":"minecraft:element_45"},{"data":13,"id":311,"name":"minecraft:element_45"},{"data":14,"id":311,"name":"minecraft:element_45"},{"data":15,"id":311,"name":"minecraft:element_45"},{"data":0,"id":312,"name":"minecraft:element_46"},{"data":1,"id":312,"name":"minecraft:element_46"},{"data":2,"id":312,"name":"minecraft:element_46"},{"data":3,"id":312,"name":"minecraft:element_46"},{"data":4,"id":312,"name":"minecraft:element_46"},{"data":5,"id":312,"name":"minecraft:element_46"},{"data":6,"id":312,"name":"minecraft:element_46"},{"data":7,"id":312,"name":"minecraft:element_46"},{"data":8,"id":312,"name":"minecraft:element_46"},{"data":9,"id":312,"name":"minecraft:element_46"},{"data":10,"id":312,"name":"minecraft:element_46"},{"data":11,"id":312,"name":"minecraft:element_46"},{"data":12,"id":312,"name":"minecraft:element_46"},{"data":13,"id":312,"name":"minecraft:element_46"},{"data":14,"id":312,"name":"minecraft:element_46"},{"data":15,"id":312,"name":"minecraft:element_46"},{"data":0,"id":313,"name":"minecraft:element_47"},{"data":1,"id":313,"name":"minecraft:element_47"},{"data":2,"id":313,"name":"minecraft:element_47"},{"data":3,"id":313,"name":"minecraft:element_47"},{"data":4,"id":313,"name":"minecraft:element_47"},{"data":5,"id":313,"name":"minecraft:element_47"},{"data":6,"id":313,"name":"minecraft:element_47"},{"data":7,"id":313,"name":"minecraft:element_47"},{"data":8,"id":313,"name":"minecraft:element_47"},{"data":9,"id":313,"name":"minecraft:element_47"},{"data":10,"id":313,"name":"minecraft:element_47"},{"data":11,"id":313,"name":"minecraft:element_47"},{"data":12,"id":313,"name":"minecraft:element_47"},{"data":13,"id":313,"name":"minecraft:element_47"},{"data":14,"id":313,"name":"minecraft:element_47"},{"data":15,"id":313,"name":"minecraft:element_47"},{"data":0,"id":314,"name":"minecraft:element_48"},{"data":1,"id":314,"name":"minecraft:element_48"},{"data":2,"id":314,"name":"minecraft:element_48"},{"data":3,"id":314,"name":"minecraft:element_48"},{"data":4,"id":314,"name":"minecraft:element_48"},{"data":5,"id":314,"name":"minecraft:element_48"},{"data":6,"id":314,"name":"minecraft:element_48"},{"data":7,"id":314,"name":"minecraft:element_48"},{"data":8,"id":314,"name":"minecraft:element_48"},{"data":9,"id":314,"name":"minecraft:element_48"},{"data":10,"id":314,"name":"minecraft:element_48"},{"data":11,"id":314,"name":"minecraft:element_48"},{"data":12,"id":314,"name":"minecraft:element_48"},{"data":13,"id":314,"name":"minecraft:element_48"},{"data":14,"id":314,"name":"minecraft:element_48"},{"data":15,"id":314,"name":"minecraft:element_48"},{"data":0,"id":315,"name":"minecraft:element_49"},{"data":1,"id":315,"name":"minecraft:element_49"},{"data":2,"id":315,"name":"minecraft:element_49"},{"data":3,"id":315,"name":"minecraft:element_49"},{"data":4,"id":315,"name":"minecraft:element_49"},{"data":5,"id":315,"name":"minecraft:element_49"},{"data":6,"id":315,"name":"minecraft:element_49"},{"data":7,"id":315,"name":"minecraft:element_49"},{"data":8,"id":315,"name":"minecraft:element_49"},{"data":9,"id":315,"name":"minecraft:element_49"},{"data":10,"id":315,"name":"minecraft:element_49"},{"data":11,"id":315,"name":"minecraft:element_49"},{"data":12,"id":315,"name":"minecraft:element_49"},{"data":13,"id":315,"name":"minecraft:element_49"},{"data":14,"id":315,"name":"minecraft:element_49"},{"data":15,"id":315,"name":"minecraft:element_49"},{"data":0,"id":316,"name":"minecraft:element_50"},{"data":1,"id":316,"name":"minecraft:element_50"},{"data":2,"id":316,"name":"minecraft:element_50"},{"data":3,"id":316,"name":"minecraft:element_50"},{"data":4,"id":316,"name":"minecraft:element_50"},{"data":5,"id":316,"name":"minecraft:element_50"},{"data":6,"id":316,"name":"minecraft:element_50"},{"data":7,"id":316,"name":"minecraft:element_50"},{"data":8,"id":316,"name":"minecraft:element_50"},{"data":9,"id":316,"name":"minecraft:element_50"},{"data":10,"id":316,"name":"minecraft:element_50"},{"data":11,"id":316,"name":"minecraft:element_50"},{"data":12,"id":316,"name":"minecraft:element_50"},{"data":13,"id":316,"name":"minecraft:element_50"},{"data":14,"id":316,"name":"minecraft:element_50"},{"data":15,"id":316,"name":"minecraft:element_50"},{"data":0,"id":317,"name":"minecraft:element_51"},{"data":1,"id":317,"name":"minecraft:element_51"},{"data":2,"id":317,"name":"minecraft:element_51"},{"data":3,"id":317,"name":"minecraft:element_51"},{"data":4,"id":317,"name":"minecraft:element_51"},{"data":5,"id":317,"name":"minecraft:element_51"},{"data":6,"id":317,"name":"minecraft:element_51"},{"data":7,"id":317,"name":"minecraft:element_51"},{"data":8,"id":317,"name":"minecraft:element_51"},{"data":9,"id":317,"name":"minecraft:element_51"},{"data":10,"id":317,"name":"minecraft:element_51"},{"data":11,"id":317,"name":"minecraft:element_51"},{"data":12,"id":317,"name":"minecraft:element_51"},{"data":13,"id":317,"name":"minecraft:element_51"},{"data":14,"id":317,"name":"minecraft:element_51"},{"data":15,"id":317,"name":"minecraft:element_51"},{"data":0,"id":318,"name":"minecraft:element_52"},{"data":1,"id":318,"name":"minecraft:element_52"},{"data":2,"id":318,"name":"minecraft:element_52"},{"data":3,"id":318,"name":"minecraft:element_52"},{"data":4,"id":318,"name":"minecraft:element_52"},{"data":5,"id":318,"name":"minecraft:element_52"},{"data":6,"id":318,"name":"minecraft:element_52"},{"data":7,"id":318,"name":"minecraft:element_52"},{"data":8,"id":318,"name":"minecraft:element_52"},{"data":9,"id":318,"name":"minecraft:element_52"},{"data":10,"id":318,"name":"minecraft:element_52"},{"data":11,"id":318,"name":"minecraft:element_52"},{"data":12,"id":318,"name":"minecraft:element_52"},{"data":13,"id":318,"name":"minecraft:element_52"},{"data":14,"id":318,"name":"minecraft:element_52"},{"data":15,"id":318,"name":"minecraft:element_52"},{"data":0,"id":319,"name":"minecraft:element_53"},{"data":1,"id":319,"name":"minecraft:element_53"},{"data":2,"id":319,"name":"minecraft:element_53"},{"data":3,"id":319,"name":"minecraft:element_53"},{"data":4,"id":319,"name":"minecraft:element_53"},{"data":5,"id":319,"name":"minecraft:element_53"},{"data":6,"id":319,"name":"minecraft:element_53"},{"data":7,"id":319,"name":"minecraft:element_53"},{"data":8,"id":319,"name":"minecraft:element_53"},{"data":9,"id":319,"name":"minecraft:element_53"},{"data":10,"id":319,"name":"minecraft:element_53"},{"data":11,"id":319,"name":"minecraft:element_53"},{"data":12,"id":319,"name":"minecraft:element_53"},{"data":13,"id":319,"name":"minecraft:element_53"},{"data":14,"id":319,"name":"minecraft:element_53"},{"data":15,"id":319,"name":"minecraft:element_53"},{"data":0,"id":320,"name":"minecraft:element_54"},{"data":1,"id":320,"name":"minecraft:element_54"},{"data":2,"id":320,"name":"minecraft:element_54"},{"data":3,"id":320,"name":"minecraft:element_54"},{"data":4,"id":320,"name":"minecraft:element_54"},{"data":5,"id":320,"name":"minecraft:element_54"},{"data":6,"id":320,"name":"minecraft:element_54"},{"data":7,"id":320,"name":"minecraft:element_54"},{"data":8,"id":320,"name":"minecraft:element_54"},{"data":9,"id":320,"name":"minecraft:element_54"},{"data":10,"id":320,"name":"minecraft:element_54"},{"data":11,"id":320,"name":"minecraft:element_54"},{"data":12,"id":320,"name":"minecraft:element_54"},{"data":13,"id":320,"name":"minecraft:element_54"},{"data":14,"id":320,"name":"minecraft:element_54"},{"data":15,"id":320,"name":"minecraft:element_54"},{"data":0,"id":321,"name":"minecraft:element_55"},{"data":1,"id":321,"name":"minecraft:element_55"},{"data":2,"id":321,"name":"minecraft:element_55"},{"data":3,"id":321,"name":"minecraft:element_55"},{"data":4,"id":321,"name":"minecraft:element_55"},{"data":5,"id":321,"name":"minecraft:element_55"},{"data":6,"id":321,"name":"minecraft:element_55"},{"data":7,"id":321,"name":"minecraft:element_55"},{"data":8,"id":321,"name":"minecraft:element_55"},{"data":9,"id":321,"name":"minecraft:element_55"},{"data":10,"id":321,"name":"minecraft:element_55"},{"data":11,"id":321,"name":"minecraft:element_55"},{"data":12,"id":321,"name":"minecraft:element_55"},{"data":13,"id":321,"name":"minecraft:element_55"},{"data":14,"id":321,"name":"minecraft:element_55"},{"data":15,"id":321,"name":"minecraft:element_55"},{"data":0,"id":322,"name":"minecraft:element_56"},{"data":1,"id":322,"name":"minecraft:element_56"},{"data":2,"id":322,"name":"minecraft:element_56"},{"data":3,"id":322,"name":"minecraft:element_56"},{"data":4,"id":322,"name":"minecraft:element_56"},{"data":5,"id":322,"name":"minecraft:element_56"},{"data":6,"id":322,"name":"minecraft:element_56"},{"data":7,"id":322,"name":"minecraft:element_56"},{"data":8,"id":322,"name":"minecraft:element_56"},{"data":9,"id":322,"name":"minecraft:element_56"},{"data":10,"id":322,"name":"minecraft:element_56"},{"data":11,"id":322,"name":"minecraft:element_56"},{"data":12,"id":322,"name":"minecraft:element_56"},{"data":13,"id":322,"name":"minecraft:element_56"},{"data":14,"id":322,"name":"minecraft:element_56"},{"data":15,"id":322,"name":"minecraft:element_56"},{"data":0,"id":323,"name":"minecraft:element_57"},{"data":1,"id":323,"name":"minecraft:element_57"},{"data":2,"id":323,"name":"minecraft:element_57"},{"data":3,"id":323,"name":"minecraft:element_57"},{"data":4,"id":323,"name":"minecraft:element_57"},{"data":5,"id":323,"name":"minecraft:element_57"},{"data":6,"id":323,"name":"minecraft:element_57"},{"data":7,"id":323,"name":"minecraft:element_57"},{"data":8,"id":323,"name":"minecraft:element_57"},{"data":9,"id":323,"name":"minecraft:element_57"},{"data":10,"id":323,"name":"minecraft:element_57"},{"data":11,"id":323,"name":"minecraft:element_57"},{"data":12,"id":323,"name":"minecraft:element_57"},{"data":13,"id":323,"name":"minecraft:element_57"},{"data":14,"id":323,"name":"minecraft:element_57"},{"data":15,"id":323,"name":"minecraft:element_57"},{"data":0,"id":324,"name":"minecraft:element_58"},{"data":1,"id":324,"name":"minecraft:element_58"},{"data":2,"id":324,"name":"minecraft:element_58"},{"data":3,"id":324,"name":"minecraft:element_58"},{"data":4,"id":324,"name":"minecraft:element_58"},{"data":5,"id":324,"name":"minecraft:element_58"},{"data":6,"id":324,"name":"minecraft:element_58"},{"data":7,"id":324,"name":"minecraft:element_58"},{"data":8,"id":324,"name":"minecraft:element_58"},{"data":9,"id":324,"name":"minecraft:element_58"},{"data":10,"id":324,"name":"minecraft:element_58"},{"data":11,"id":324,"name":"minecraft:element_58"},{"data":12,"id":324,"name":"minecraft:element_58"},{"data":13,"id":324,"name":"minecraft:element_58"},{"data":14,"id":324,"name":"minecraft:element_58"},{"data":15,"id":324,"name":"minecraft:element_58"},{"data":0,"id":325,"name":"minecraft:element_59"},{"data":1,"id":325,"name":"minecraft:element_59"},{"data":2,"id":325,"name":"minecraft:element_59"},{"data":3,"id":325,"name":"minecraft:element_59"},{"data":4,"id":325,"name":"minecraft:element_59"},{"data":5,"id":325,"name":"minecraft:element_59"},{"data":6,"id":325,"name":"minecraft:element_59"},{"data":7,"id":325,"name":"minecraft:element_59"},{"data":8,"id":325,"name":"minecraft:element_59"},{"data":9,"id":325,"name":"minecraft:element_59"},{"data":10,"id":325,"name":"minecraft:element_59"},{"data":11,"id":325,"name":"minecraft:element_59"},{"data":12,"id":325,"name":"minecraft:element_59"},{"data":13,"id":325,"name":"minecraft:element_59"},{"data":14,"id":325,"name":"minecraft:element_59"},{"data":15,"id":325,"name":"minecraft:element_59"},{"data":0,"id":326,"name":"minecraft:element_60"},{"data":1,"id":326,"name":"minecraft:element_60"},{"data":2,"id":326,"name":"minecraft:element_60"},{"data":3,"id":326,"name":"minecraft:element_60"},{"data":4,"id":326,"name":"minecraft:element_60"},{"data":5,"id":326,"name":"minecraft:element_60"},{"data":6,"id":326,"name":"minecraft:element_60"},{"data":7,"id":326,"name":"minecraft:element_60"},{"data":8,"id":326,"name":"minecraft:element_60"},{"data":9,"id":326,"name":"minecraft:element_60"},{"data":10,"id":326,"name":"minecraft:element_60"},{"data":11,"id":326,"name":"minecraft:element_60"},{"data":12,"id":326,"name":"minecraft:element_60"},{"data":13,"id":326,"name":"minecraft:element_60"},{"data":14,"id":326,"name":"minecraft:element_60"},{"data":15,"id":326,"name":"minecraft:element_60"},{"data":0,"id":327,"name":"minecraft:element_61"},{"data":1,"id":327,"name":"minecraft:element_61"},{"data":2,"id":327,"name":"minecraft:element_61"},{"data":3,"id":327,"name":"minecraft:element_61"},{"data":4,"id":327,"name":"minecraft:element_61"},{"data":5,"id":327,"name":"minecraft:element_61"},{"data":6,"id":327,"name":"minecraft:element_61"},{"data":7,"id":327,"name":"minecraft:element_61"},{"data":8,"id":327,"name":"minecraft:element_61"},{"data":9,"id":327,"name":"minecraft:element_61"},{"data":10,"id":327,"name":"minecraft:element_61"},{"data":11,"id":327,"name":"minecraft:element_61"},{"data":12,"id":327,"name":"minecraft:element_61"},{"data":13,"id":327,"name":"minecraft:element_61"},{"data":14,"id":327,"name":"minecraft:element_61"},{"data":15,"id":327,"name":"minecraft:element_61"},{"data":0,"id":328,"name":"minecraft:element_62"},{"data":1,"id":328,"name":"minecraft:element_62"},{"data":2,"id":328,"name":"minecraft:element_62"},{"data":3,"id":328,"name":"minecraft:element_62"},{"data":4,"id":328,"name":"minecraft:element_62"},{"data":5,"id":328,"name":"minecraft:element_62"},{"data":6,"id":328,"name":"minecraft:element_62"},{"data":7,"id":328,"name":"minecraft:element_62"},{"data":8,"id":328,"name":"minecraft:element_62"},{"data":9,"id":328,"name":"minecraft:element_62"},{"data":10,"id":328,"name":"minecraft:element_62"},{"data":11,"id":328,"name":"minecraft:element_62"},{"data":12,"id":328,"name":"minecraft:element_62"},{"data":13,"id":328,"name":"minecraft:element_62"},{"data":14,"id":328,"name":"minecraft:element_62"},{"data":15,"id":328,"name":"minecraft:element_62"},{"data":0,"id":329,"name":"minecraft:element_63"},{"data":1,"id":329,"name":"minecraft:element_63"},{"data":2,"id":329,"name":"minecraft:element_63"},{"data":3,"id":329,"name":"minecraft:element_63"},{"data":4,"id":329,"name":"minecraft:element_63"},{"data":5,"id":329,"name":"minecraft:element_63"},{"data":6,"id":329,"name":"minecraft:element_63"},{"data":7,"id":329,"name":"minecraft:element_63"},{"data":8,"id":329,"name":"minecraft:element_63"},{"data":9,"id":329,"name":"minecraft:element_63"},{"data":10,"id":329,"name":"minecraft:element_63"},{"data":11,"id":329,"name":"minecraft:element_63"},{"data":12,"id":329,"name":"minecraft:element_63"},{"data":13,"id":329,"name":"minecraft:element_63"},{"data":14,"id":329,"name":"minecraft:element_63"},{"data":15,"id":329,"name":"minecraft:element_63"},{"data":0,"id":330,"name":"minecraft:element_64"},{"data":1,"id":330,"name":"minecraft:element_64"},{"data":2,"id":330,"name":"minecraft:element_64"},{"data":3,"id":330,"name":"minecraft:element_64"},{"data":4,"id":330,"name":"minecraft:element_64"},{"data":5,"id":330,"name":"minecraft:element_64"},{"data":6,"id":330,"name":"minecraft:element_64"},{"data":7,"id":330,"name":"minecraft:element_64"},{"data":8,"id":330,"name":"minecraft:element_64"},{"data":9,"id":330,"name":"minecraft:element_64"},{"data":10,"id":330,"name":"minecraft:element_64"},{"data":11,"id":330,"name":"minecraft:element_64"},{"data":12,"id":330,"name":"minecraft:element_64"},{"data":13,"id":330,"name":"minecraft:element_64"},{"data":14,"id":330,"name":"minecraft:element_64"},{"data":15,"id":330,"name":"minecraft:element_64"},{"data":0,"id":331,"name":"minecraft:element_65"},{"data":1,"id":331,"name":"minecraft:element_65"},{"data":2,"id":331,"name":"minecraft:element_65"},{"data":3,"id":331,"name":"minecraft:element_65"},{"data":4,"id":331,"name":"minecraft:element_65"},{"data":5,"id":331,"name":"minecraft:element_65"},{"data":6,"id":331,"name":"minecraft:element_65"},{"data":7,"id":331,"name":"minecraft:element_65"},{"data":8,"id":331,"name":"minecraft:element_65"},{"data":9,"id":331,"name":"minecraft:element_65"},{"data":10,"id":331,"name":"minecraft:element_65"},{"data":11,"id":331,"name":"minecraft:element_65"},{"data":12,"id":331,"name":"minecraft:element_65"},{"data":13,"id":331,"name":"minecraft:element_65"},{"data":14,"id":331,"name":"minecraft:element_65"},{"data":15,"id":331,"name":"minecraft:element_65"},{"data":0,"id":332,"name":"minecraft:element_66"},{"data":1,"id":332,"name":"minecraft:element_66"},{"data":2,"id":332,"name":"minecraft:element_66"},{"data":3,"id":332,"name":"minecraft:element_66"},{"data":4,"id":332,"name":"minecraft:element_66"},{"data":5,"id":332,"name":"minecraft:element_66"},{"data":6,"id":332,"name":"minecraft:element_66"},{"data":7,"id":332,"name":"minecraft:element_66"},{"data":8,"id":332,"name":"minecraft:element_66"},{"data":9,"id":332,"name":"minecraft:element_66"},{"data":10,"id":332,"name":"minecraft:element_66"},{"data":11,"id":332,"name":"minecraft:element_66"},{"data":12,"id":332,"name":"minecraft:element_66"},{"data":13,"id":332,"name":"minecraft:element_66"},{"data":14,"id":332,"name":"minecraft:element_66"},{"data":15,"id":332,"name":"minecraft:element_66"},{"data":0,"id":333,"name":"minecraft:element_67"},{"data":1,"id":333,"name":"minecraft:element_67"},{"data":2,"id":333,"name":"minecraft:element_67"},{"data":3,"id":333,"name":"minecraft:element_67"},{"data":4,"id":333,"name":"minecraft:element_67"},{"data":5,"id":333,"name":"minecraft:element_67"},{"data":6,"id":333,"name":"minecraft:element_67"},{"data":7,"id":333,"name":"minecraft:element_67"},{"data":8,"id":333,"name":"minecraft:element_67"},{"data":9,"id":333,"name":"minecraft:element_67"},{"data":10,"id":333,"name":"minecraft:element_67"},{"data":11,"id":333,"name":"minecraft:element_67"},{"data":12,"id":333,"name":"minecraft:element_67"},{"data":13,"id":333,"name":"minecraft:element_67"},{"data":14,"id":333,"name":"minecraft:element_67"},{"data":15,"id":333,"name":"minecraft:element_67"},{"data":0,"id":334,"name":"minecraft:element_68"},{"data":1,"id":334,"name":"minecraft:element_68"},{"data":2,"id":334,"name":"minecraft:element_68"},{"data":3,"id":334,"name":"minecraft:element_68"},{"data":4,"id":334,"name":"minecraft:element_68"},{"data":5,"id":334,"name":"minecraft:element_68"},{"data":6,"id":334,"name":"minecraft:element_68"},{"data":7,"id":334,"name":"minecraft:element_68"},{"data":8,"id":334,"name":"minecraft:element_68"},{"data":9,"id":334,"name":"minecraft:element_68"},{"data":10,"id":334,"name":"minecraft:element_68"},{"data":11,"id":334,"name":"minecraft:element_68"},{"data":12,"id":334,"name":"minecraft:element_68"},{"data":13,"id":334,"name":"minecraft:element_68"},{"data":14,"id":334,"name":"minecraft:element_68"},{"data":15,"id":334,"name":"minecraft:element_68"},{"data":0,"id":335,"name":"minecraft:element_69"},{"data":1,"id":335,"name":"minecraft:element_69"},{"data":2,"id":335,"name":"minecraft:element_69"},{"data":3,"id":335,"name":"minecraft:element_69"},{"data":4,"id":335,"name":"minecraft:element_69"},{"data":5,"id":335,"name":"minecraft:element_69"},{"data":6,"id":335,"name":"minecraft:element_69"},{"data":7,"id":335,"name":"minecraft:element_69"},{"data":8,"id":335,"name":"minecraft:element_69"},{"data":9,"id":335,"name":"minecraft:element_69"},{"data":10,"id":335,"name":"minecraft:element_69"},{"data":11,"id":335,"name":"minecraft:element_69"},{"data":12,"id":335,"name":"minecraft:element_69"},{"data":13,"id":335,"name":"minecraft:element_69"},{"data":14,"id":335,"name":"minecraft:element_69"},{"data":15,"id":335,"name":"minecraft:element_69"},{"data":0,"id":336,"name":"minecraft:element_70"},{"data":1,"id":336,"name":"minecraft:element_70"},{"data":2,"id":336,"name":"minecraft:element_70"},{"data":3,"id":336,"name":"minecraft:element_70"},{"data":4,"id":336,"name":"minecraft:element_70"},{"data":5,"id":336,"name":"minecraft:element_70"},{"data":6,"id":336,"name":"minecraft:element_70"},{"data":7,"id":336,"name":"minecraft:element_70"},{"data":8,"id":336,"name":"minecraft:element_70"},{"data":9,"id":336,"name":"minecraft:element_70"},{"data":10,"id":336,"name":"minecraft:element_70"},{"data":11,"id":336,"name":"minecraft:element_70"},{"data":12,"id":336,"name":"minecraft:element_70"},{"data":13,"id":336,"name":"minecraft:element_70"},{"data":14,"id":336,"name":"minecraft:element_70"},{"data":15,"id":336,"name":"minecraft:element_70"},{"data":0,"id":337,"name":"minecraft:element_71"},{"data":1,"id":337,"name":"minecraft:element_71"},{"data":2,"id":337,"name":"minecraft:element_71"},{"data":3,"id":337,"name":"minecraft:element_71"},{"data":4,"id":337,"name":"minecraft:element_71"},{"data":5,"id":337,"name":"minecraft:element_71"},{"data":6,"id":337,"name":"minecraft:element_71"},{"data":7,"id":337,"name":"minecraft:element_71"},{"data":8,"id":337,"name":"minecraft:element_71"},{"data":9,"id":337,"name":"minecraft:element_71"},{"data":10,"id":337,"name":"minecraft:element_71"},{"data":11,"id":337,"name":"minecraft:element_71"},{"data":12,"id":337,"name":"minecraft:element_71"},{"data":13,"id":337,"name":"minecraft:element_71"},{"data":14,"id":337,"name":"minecraft:element_71"},{"data":15,"id":337,"name":"minecraft:element_71"},{"data":0,"id":338,"name":"minecraft:element_72"},{"data":1,"id":338,"name":"minecraft:element_72"},{"data":2,"id":338,"name":"minecraft:element_72"},{"data":3,"id":338,"name":"minecraft:element_72"},{"data":4,"id":338,"name":"minecraft:element_72"},{"data":5,"id":338,"name":"minecraft:element_72"},{"data":6,"id":338,"name":"minecraft:element_72"},{"data":7,"id":338,"name":"minecraft:element_72"},{"data":8,"id":338,"name":"minecraft:element_72"},{"data":9,"id":338,"name":"minecraft:element_72"},{"data":10,"id":338,"name":"minecraft:element_72"},{"data":11,"id":338,"name":"minecraft:element_72"},{"data":12,"id":338,"name":"minecraft:element_72"},{"data":13,"id":338,"name":"minecraft:element_72"},{"data":14,"id":338,"name":"minecraft:element_72"},{"data":15,"id":338,"name":"minecraft:element_72"},{"data":0,"id":339,"name":"minecraft:element_73"},{"data":1,"id":339,"name":"minecraft:element_73"},{"data":2,"id":339,"name":"minecraft:element_73"},{"data":3,"id":339,"name":"minecraft:element_73"},{"data":4,"id":339,"name":"minecraft:element_73"},{"data":5,"id":339,"name":"minecraft:element_73"},{"data":6,"id":339,"name":"minecraft:element_73"},{"data":7,"id":339,"name":"minecraft:element_73"},{"data":8,"id":339,"name":"minecraft:element_73"},{"data":9,"id":339,"name":"minecraft:element_73"},{"data":10,"id":339,"name":"minecraft:element_73"},{"data":11,"id":339,"name":"minecraft:element_73"},{"data":12,"id":339,"name":"minecraft:element_73"},{"data":13,"id":339,"name":"minecraft:element_73"},{"data":14,"id":339,"name":"minecraft:element_73"},{"data":15,"id":339,"name":"minecraft:element_73"},{"data":0,"id":340,"name":"minecraft:element_74"},{"data":1,"id":340,"name":"minecraft:element_74"},{"data":2,"id":340,"name":"minecraft:element_74"},{"data":3,"id":340,"name":"minecraft:element_74"},{"data":4,"id":340,"name":"minecraft:element_74"},{"data":5,"id":340,"name":"minecraft:element_74"},{"data":6,"id":340,"name":"minecraft:element_74"},{"data":7,"id":340,"name":"minecraft:element_74"},{"data":8,"id":340,"name":"minecraft:element_74"},{"data":9,"id":340,"name":"minecraft:element_74"},{"data":10,"id":340,"name":"minecraft:element_74"},{"data":11,"id":340,"name":"minecraft:element_74"},{"data":12,"id":340,"name":"minecraft:element_74"},{"data":13,"id":340,"name":"minecraft:element_74"},{"data":14,"id":340,"name":"minecraft:element_74"},{"data":15,"id":340,"name":"minecraft:element_74"},{"data":0,"id":341,"name":"minecraft:element_75"},{"data":1,"id":341,"name":"minecraft:element_75"},{"data":2,"id":341,"name":"minecraft:element_75"},{"data":3,"id":341,"name":"minecraft:element_75"},{"data":4,"id":341,"name":"minecraft:element_75"},{"data":5,"id":341,"name":"minecraft:element_75"},{"data":6,"id":341,"name":"minecraft:element_75"},{"data":7,"id":341,"name":"minecraft:element_75"},{"data":8,"id":341,"name":"minecraft:element_75"},{"data":9,"id":341,"name":"minecraft:element_75"},{"data":10,"id":341,"name":"minecraft:element_75"},{"data":11,"id":341,"name":"minecraft:element_75"},{"data":12,"id":341,"name":"minecraft:element_75"},{"data":13,"id":341,"name":"minecraft:element_75"},{"data":14,"id":341,"name":"minecraft:element_75"},{"data":15,"id":341,"name":"minecraft:element_75"},{"data":0,"id":342,"name":"minecraft:element_76"},{"data":1,"id":342,"name":"minecraft:element_76"},{"data":2,"id":342,"name":"minecraft:element_76"},{"data":3,"id":342,"name":"minecraft:element_76"},{"data":4,"id":342,"name":"minecraft:element_76"},{"data":5,"id":342,"name":"minecraft:element_76"},{"data":6,"id":342,"name":"minecraft:element_76"},{"data":7,"id":342,"name":"minecraft:element_76"},{"data":8,"id":342,"name":"minecraft:element_76"},{"data":9,"id":342,"name":"minecraft:element_76"},{"data":10,"id":342,"name":"minecraft:element_76"},{"data":11,"id":342,"name":"minecraft:element_76"},{"data":12,"id":342,"name":"minecraft:element_76"},{"data":13,"id":342,"name":"minecraft:element_76"},{"data":14,"id":342,"name":"minecraft:element_76"},{"data":15,"id":342,"name":"minecraft:element_76"},{"data":0,"id":343,"name":"minecraft:element_77"},{"data":1,"id":343,"name":"minecraft:element_77"},{"data":2,"id":343,"name":"minecraft:element_77"},{"data":3,"id":343,"name":"minecraft:element_77"},{"data":4,"id":343,"name":"minecraft:element_77"},{"data":5,"id":343,"name":"minecraft:element_77"},{"data":6,"id":343,"name":"minecraft:element_77"},{"data":7,"id":343,"name":"minecraft:element_77"},{"data":8,"id":343,"name":"minecraft:element_77"},{"data":9,"id":343,"name":"minecraft:element_77"},{"data":10,"id":343,"name":"minecraft:element_77"},{"data":11,"id":343,"name":"minecraft:element_77"},{"data":12,"id":343,"name":"minecraft:element_77"},{"data":13,"id":343,"name":"minecraft:element_77"},{"data":14,"id":343,"name":"minecraft:element_77"},{"data":15,"id":343,"name":"minecraft:element_77"},{"data":0,"id":344,"name":"minecraft:element_78"},{"data":1,"id":344,"name":"minecraft:element_78"},{"data":2,"id":344,"name":"minecraft:element_78"},{"data":3,"id":344,"name":"minecraft:element_78"},{"data":4,"id":344,"name":"minecraft:element_78"},{"data":5,"id":344,"name":"minecraft:element_78"},{"data":6,"id":344,"name":"minecraft:element_78"},{"data":7,"id":344,"name":"minecraft:element_78"},{"data":8,"id":344,"name":"minecraft:element_78"},{"data":9,"id":344,"name":"minecraft:element_78"},{"data":10,"id":344,"name":"minecraft:element_78"},{"data":11,"id":344,"name":"minecraft:element_78"},{"data":12,"id":344,"name":"minecraft:element_78"},{"data":13,"id":344,"name":"minecraft:element_78"},{"data":14,"id":344,"name":"minecraft:element_78"},{"data":15,"id":344,"name":"minecraft:element_78"},{"data":0,"id":345,"name":"minecraft:element_79"},{"data":1,"id":345,"name":"minecraft:element_79"},{"data":2,"id":345,"name":"minecraft:element_79"},{"data":3,"id":345,"name":"minecraft:element_79"},{"data":4,"id":345,"name":"minecraft:element_79"},{"data":5,"id":345,"name":"minecraft:element_79"},{"data":6,"id":345,"name":"minecraft:element_79"},{"data":7,"id":345,"name":"minecraft:element_79"},{"data":8,"id":345,"name":"minecraft:element_79"},{"data":9,"id":345,"name":"minecraft:element_79"},{"data":10,"id":345,"name":"minecraft:element_79"},{"data":11,"id":345,"name":"minecraft:element_79"},{"data":12,"id":345,"name":"minecraft:element_79"},{"data":13,"id":345,"name":"minecraft:element_79"},{"data":14,"id":345,"name":"minecraft:element_79"},{"data":15,"id":345,"name":"minecraft:element_79"},{"data":0,"id":346,"name":"minecraft:element_80"},{"data":1,"id":346,"name":"minecraft:element_80"},{"data":2,"id":346,"name":"minecraft:element_80"},{"data":3,"id":346,"name":"minecraft:element_80"},{"data":4,"id":346,"name":"minecraft:element_80"},{"data":5,"id":346,"name":"minecraft:element_80"},{"data":6,"id":346,"name":"minecraft:element_80"},{"data":7,"id":346,"name":"minecraft:element_80"},{"data":8,"id":346,"name":"minecraft:element_80"},{"data":9,"id":346,"name":"minecraft:element_80"},{"data":10,"id":346,"name":"minecraft:element_80"},{"data":11,"id":346,"name":"minecraft:element_80"},{"data":12,"id":346,"name":"minecraft:element_80"},{"data":13,"id":346,"name":"minecraft:element_80"},{"data":14,"id":346,"name":"minecraft:element_80"},{"data":15,"id":346,"name":"minecraft:element_80"},{"data":0,"id":347,"name":"minecraft:element_81"},{"data":1,"id":347,"name":"minecraft:element_81"},{"data":2,"id":347,"name":"minecraft:element_81"},{"data":3,"id":347,"name":"minecraft:element_81"},{"data":4,"id":347,"name":"minecraft:element_81"},{"data":5,"id":347,"name":"minecraft:element_81"},{"data":6,"id":347,"name":"minecraft:element_81"},{"data":7,"id":347,"name":"minecraft:element_81"},{"data":8,"id":347,"name":"minecraft:element_81"},{"data":9,"id":347,"name":"minecraft:element_81"},{"data":10,"id":347,"name":"minecraft:element_81"},{"data":11,"id":347,"name":"minecraft:element_81"},{"data":12,"id":347,"name":"minecraft:element_81"},{"data":13,"id":347,"name":"minecraft:element_81"},{"data":14,"id":347,"name":"minecraft:element_81"},{"data":15,"id":347,"name":"minecraft:element_81"},{"data":0,"id":348,"name":"minecraft:element_82"},{"data":1,"id":348,"name":"minecraft:element_82"},{"data":2,"id":348,"name":"minecraft:element_82"},{"data":3,"id":348,"name":"minecraft:element_82"},{"data":4,"id":348,"name":"minecraft:element_82"},{"data":5,"id":348,"name":"minecraft:element_82"},{"data":6,"id":348,"name":"minecraft:element_82"},{"data":7,"id":348,"name":"minecraft:element_82"},{"data":8,"id":348,"name":"minecraft:element_82"},{"data":9,"id":348,"name":"minecraft:element_82"},{"data":10,"id":348,"name":"minecraft:element_82"},{"data":11,"id":348,"name":"minecraft:element_82"},{"data":12,"id":348,"name":"minecraft:element_82"},{"data":13,"id":348,"name":"minecraft:element_82"},{"data":14,"id":348,"name":"minecraft:element_82"},{"data":15,"id":348,"name":"minecraft:element_82"},{"data":0,"id":349,"name":"minecraft:element_83"},{"data":1,"id":349,"name":"minecraft:element_83"},{"data":2,"id":349,"name":"minecraft:element_83"},{"data":3,"id":349,"name":"minecraft:element_83"},{"data":4,"id":349,"name":"minecraft:element_83"},{"data":5,"id":349,"name":"minecraft:element_83"},{"data":6,"id":349,"name":"minecraft:element_83"},{"data":7,"id":349,"name":"minecraft:element_83"},{"data":8,"id":349,"name":"minecraft:element_83"},{"data":9,"id":349,"name":"minecraft:element_83"},{"data":10,"id":349,"name":"minecraft:element_83"},{"data":11,"id":349,"name":"minecraft:element_83"},{"data":12,"id":349,"name":"minecraft:element_83"},{"data":13,"id":349,"name":"minecraft:element_83"},{"data":14,"id":349,"name":"minecraft:element_83"},{"data":15,"id":349,"name":"minecraft:element_83"},{"data":0,"id":350,"name":"minecraft:element_84"},{"data":1,"id":350,"name":"minecraft:element_84"},{"data":2,"id":350,"name":"minecraft:element_84"},{"data":3,"id":350,"name":"minecraft:element_84"},{"data":4,"id":350,"name":"minecraft:element_84"},{"data":5,"id":350,"name":"minecraft:element_84"},{"data":6,"id":350,"name":"minecraft:element_84"},{"data":7,"id":350,"name":"minecraft:element_84"},{"data":8,"id":350,"name":"minecraft:element_84"},{"data":9,"id":350,"name":"minecraft:element_84"},{"data":10,"id":350,"name":"minecraft:element_84"},{"data":11,"id":350,"name":"minecraft:element_84"},{"data":12,"id":350,"name":"minecraft:element_84"},{"data":13,"id":350,"name":"minecraft:element_84"},{"data":14,"id":350,"name":"minecraft:element_84"},{"data":15,"id":350,"name":"minecraft:element_84"},{"data":0,"id":351,"name":"minecraft:element_85"},{"data":1,"id":351,"name":"minecraft:element_85"},{"data":2,"id":351,"name":"minecraft:element_85"},{"data":3,"id":351,"name":"minecraft:element_85"},{"data":4,"id":351,"name":"minecraft:element_85"},{"data":5,"id":351,"name":"minecraft:element_85"},{"data":6,"id":351,"name":"minecraft:element_85"},{"data":7,"id":351,"name":"minecraft:element_85"},{"data":8,"id":351,"name":"minecraft:element_85"},{"data":9,"id":351,"name":"minecraft:element_85"},{"data":10,"id":351,"name":"minecraft:element_85"},{"data":11,"id":351,"name":"minecraft:element_85"},{"data":12,"id":351,"name":"minecraft:element_85"},{"data":13,"id":351,"name":"minecraft:element_85"},{"data":14,"id":351,"name":"minecraft:element_85"},{"data":15,"id":351,"name":"minecraft:element_85"},{"data":0,"id":352,"name":"minecraft:element_86"},{"data":1,"id":352,"name":"minecraft:element_86"},{"data":2,"id":352,"name":"minecraft:element_86"},{"data":3,"id":352,"name":"minecraft:element_86"},{"data":4,"id":352,"name":"minecraft:element_86"},{"data":5,"id":352,"name":"minecraft:element_86"},{"data":6,"id":352,"name":"minecraft:element_86"},{"data":7,"id":352,"name":"minecraft:element_86"},{"data":8,"id":352,"name":"minecraft:element_86"},{"data":9,"id":352,"name":"minecraft:element_86"},{"data":10,"id":352,"name":"minecraft:element_86"},{"data":11,"id":352,"name":"minecraft:element_86"},{"data":12,"id":352,"name":"minecraft:element_86"},{"data":13,"id":352,"name":"minecraft:element_86"},{"data":14,"id":352,"name":"minecraft:element_86"},{"data":15,"id":352,"name":"minecraft:element_86"},{"data":0,"id":353,"name":"minecraft:element_87"},{"data":1,"id":353,"name":"minecraft:element_87"},{"data":2,"id":353,"name":"minecraft:element_87"},{"data":3,"id":353,"name":"minecraft:element_87"},{"data":4,"id":353,"name":"minecraft:element_87"},{"data":5,"id":353,"name":"minecraft:element_87"},{"data":6,"id":353,"name":"minecraft:element_87"},{"data":7,"id":353,"name":"minecraft:element_87"},{"data":8,"id":353,"name":"minecraft:element_87"},{"data":9,"id":353,"name":"minecraft:element_87"},{"data":10,"id":353,"name":"minecraft:element_87"},{"data":11,"id":353,"name":"minecraft:element_87"},{"data":12,"id":353,"name":"minecraft:element_87"},{"data":13,"id":353,"name":"minecraft:element_87"},{"data":14,"id":353,"name":"minecraft:element_87"},{"data":15,"id":353,"name":"minecraft:element_87"},{"data":0,"id":354,"name":"minecraft:element_88"},{"data":1,"id":354,"name":"minecraft:element_88"},{"data":2,"id":354,"name":"minecraft:element_88"},{"data":3,"id":354,"name":"minecraft:element_88"},{"data":4,"id":354,"name":"minecraft:element_88"},{"data":5,"id":354,"name":"minecraft:element_88"},{"data":6,"id":354,"name":"minecraft:element_88"},{"data":7,"id":354,"name":"minecraft:element_88"},{"data":8,"id":354,"name":"minecraft:element_88"},{"data":9,"id":354,"name":"minecraft:element_88"},{"data":10,"id":354,"name":"minecraft:element_88"},{"data":11,"id":354,"name":"minecraft:element_88"},{"data":12,"id":354,"name":"minecraft:element_88"},{"data":13,"id":354,"name":"minecraft:element_88"},{"data":14,"id":354,"name":"minecraft:element_88"},{"data":15,"id":354,"name":"minecraft:element_88"},{"data":0,"id":355,"name":"minecraft:element_89"},{"data":1,"id":355,"name":"minecraft:element_89"},{"data":2,"id":355,"name":"minecraft:element_89"},{"data":3,"id":355,"name":"minecraft:element_89"},{"data":4,"id":355,"name":"minecraft:element_89"},{"data":5,"id":355,"name":"minecraft:element_89"},{"data":6,"id":355,"name":"minecraft:element_89"},{"data":7,"id":355,"name":"minecraft:element_89"},{"data":8,"id":355,"name":"minecraft:element_89"},{"data":9,"id":355,"name":"minecraft:element_89"},{"data":10,"id":355,"name":"minecraft:element_89"},{"data":11,"id":355,"name":"minecraft:element_89"},{"data":12,"id":355,"name":"minecraft:element_89"},{"data":13,"id":355,"name":"minecraft:element_89"},{"data":14,"id":355,"name":"minecraft:element_89"},{"data":15,"id":355,"name":"minecraft:element_89"},{"data":0,"id":356,"name":"minecraft:element_90"},{"data":1,"id":356,"name":"minecraft:element_90"},{"data":2,"id":356,"name":"minecraft:element_90"},{"data":3,"id":356,"name":"minecraft:element_90"},{"data":4,"id":356,"name":"minecraft:element_90"},{"data":5,"id":356,"name":"minecraft:element_90"},{"data":6,"id":356,"name":"minecraft:element_90"},{"data":7,"id":356,"name":"minecraft:element_90"},{"data":8,"id":356,"name":"minecraft:element_90"},{"data":9,"id":356,"name":"minecraft:element_90"},{"data":10,"id":356,"name":"minecraft:element_90"},{"data":11,"id":356,"name":"minecraft:element_90"},{"data":12,"id":356,"name":"minecraft:element_90"},{"data":13,"id":356,"name":"minecraft:element_90"},{"data":14,"id":356,"name":"minecraft:element_90"},{"data":15,"id":356,"name":"minecraft:element_90"},{"data":0,"id":357,"name":"minecraft:element_91"},{"data":1,"id":357,"name":"minecraft:element_91"},{"data":2,"id":357,"name":"minecraft:element_91"},{"data":3,"id":357,"name":"minecraft:element_91"},{"data":4,"id":357,"name":"minecraft:element_91"},{"data":5,"id":357,"name":"minecraft:element_91"},{"data":6,"id":357,"name":"minecraft:element_91"},{"data":7,"id":357,"name":"minecraft:element_91"},{"data":8,"id":357,"name":"minecraft:element_91"},{"data":9,"id":357,"name":"minecraft:element_91"},{"data":10,"id":357,"name":"minecraft:element_91"},{"data":11,"id":357,"name":"minecraft:element_91"},{"data":12,"id":357,"name":"minecraft:element_91"},{"data":13,"id":357,"name":"minecraft:element_91"},{"data":14,"id":357,"name":"minecraft:element_91"},{"data":15,"id":357,"name":"minecraft:element_91"},{"data":0,"id":358,"name":"minecraft:element_92"},{"data":1,"id":358,"name":"minecraft:element_92"},{"data":2,"id":358,"name":"minecraft:element_92"},{"data":3,"id":358,"name":"minecraft:element_92"},{"data":4,"id":358,"name":"minecraft:element_92"},{"data":5,"id":358,"name":"minecraft:element_92"},{"data":6,"id":358,"name":"minecraft:element_92"},{"data":7,"id":358,"name":"minecraft:element_92"},{"data":8,"id":358,"name":"minecraft:element_92"},{"data":9,"id":358,"name":"minecraft:element_92"},{"data":10,"id":358,"name":"minecraft:element_92"},{"data":11,"id":358,"name":"minecraft:element_92"},{"data":12,"id":358,"name":"minecraft:element_92"},{"data":13,"id":358,"name":"minecraft:element_92"},{"data":14,"id":358,"name":"minecraft:element_92"},{"data":15,"id":358,"name":"minecraft:element_92"},{"data":0,"id":359,"name":"minecraft:element_93"},{"data":1,"id":359,"name":"minecraft:element_93"},{"data":2,"id":359,"name":"minecraft:element_93"},{"data":3,"id":359,"name":"minecraft:element_93"},{"data":4,"id":359,"name":"minecraft:element_93"},{"data":5,"id":359,"name":"minecraft:element_93"},{"data":6,"id":359,"name":"minecraft:element_93"},{"data":7,"id":359,"name":"minecraft:element_93"},{"data":8,"id":359,"name":"minecraft:element_93"},{"data":9,"id":359,"name":"minecraft:element_93"},{"data":10,"id":359,"name":"minecraft:element_93"},{"data":11,"id":359,"name":"minecraft:element_93"},{"data":12,"id":359,"name":"minecraft:element_93"},{"data":13,"id":359,"name":"minecraft:element_93"},{"data":14,"id":359,"name":"minecraft:element_93"},{"data":15,"id":359,"name":"minecraft:element_93"},{"data":0,"id":360,"name":"minecraft:element_94"},{"data":1,"id":360,"name":"minecraft:element_94"},{"data":2,"id":360,"name":"minecraft:element_94"},{"data":3,"id":360,"name":"minecraft:element_94"},{"data":4,"id":360,"name":"minecraft:element_94"},{"data":5,"id":360,"name":"minecraft:element_94"},{"data":6,"id":360,"name":"minecraft:element_94"},{"data":7,"id":360,"name":"minecraft:element_94"},{"data":8,"id":360,"name":"minecraft:element_94"},{"data":9,"id":360,"name":"minecraft:element_94"},{"data":10,"id":360,"name":"minecraft:element_94"},{"data":11,"id":360,"name":"minecraft:element_94"},{"data":12,"id":360,"name":"minecraft:element_94"},{"data":13,"id":360,"name":"minecraft:element_94"},{"data":14,"id":360,"name":"minecraft:element_94"},{"data":15,"id":360,"name":"minecraft:element_94"},{"data":0,"id":361,"name":"minecraft:element_95"},{"data":1,"id":361,"name":"minecraft:element_95"},{"data":2,"id":361,"name":"minecraft:element_95"},{"data":3,"id":361,"name":"minecraft:element_95"},{"data":4,"id":361,"name":"minecraft:element_95"},{"data":5,"id":361,"name":"minecraft:element_95"},{"data":6,"id":361,"name":"minecraft:element_95"},{"data":7,"id":361,"name":"minecraft:element_95"},{"data":8,"id":361,"name":"minecraft:element_95"},{"data":9,"id":361,"name":"minecraft:element_95"},{"data":10,"id":361,"name":"minecraft:element_95"},{"data":11,"id":361,"name":"minecraft:element_95"},{"data":12,"id":361,"name":"minecraft:element_95"},{"data":13,"id":361,"name":"minecraft:element_95"},{"data":14,"id":361,"name":"minecraft:element_95"},{"data":15,"id":361,"name":"minecraft:element_95"},{"data":0,"id":362,"name":"minecraft:element_96"},{"data":1,"id":362,"name":"minecraft:element_96"},{"data":2,"id":362,"name":"minecraft:element_96"},{"data":3,"id":362,"name":"minecraft:element_96"},{"data":4,"id":362,"name":"minecraft:element_96"},{"data":5,"id":362,"name":"minecraft:element_96"},{"data":6,"id":362,"name":"minecraft:element_96"},{"data":7,"id":362,"name":"minecraft:element_96"},{"data":8,"id":362,"name":"minecraft:element_96"},{"data":9,"id":362,"name":"minecraft:element_96"},{"data":10,"id":362,"name":"minecraft:element_96"},{"data":11,"id":362,"name":"minecraft:element_96"},{"data":12,"id":362,"name":"minecraft:element_96"},{"data":13,"id":362,"name":"minecraft:element_96"},{"data":14,"id":362,"name":"minecraft:element_96"},{"data":15,"id":362,"name":"minecraft:element_96"},{"data":0,"id":363,"name":"minecraft:element_97"},{"data":1,"id":363,"name":"minecraft:element_97"},{"data":2,"id":363,"name":"minecraft:element_97"},{"data":3,"id":363,"name":"minecraft:element_97"},{"data":4,"id":363,"name":"minecraft:element_97"},{"data":5,"id":363,"name":"minecraft:element_97"},{"data":6,"id":363,"name":"minecraft:element_97"},{"data":7,"id":363,"name":"minecraft:element_97"},{"data":8,"id":363,"name":"minecraft:element_97"},{"data":9,"id":363,"name":"minecraft:element_97"},{"data":10,"id":363,"name":"minecraft:element_97"},{"data":11,"id":363,"name":"minecraft:element_97"},{"data":12,"id":363,"name":"minecraft:element_97"},{"data":13,"id":363,"name":"minecraft:element_97"},{"data":14,"id":363,"name":"minecraft:element_97"},{"data":15,"id":363,"name":"minecraft:element_97"},{"data":0,"id":364,"name":"minecraft:element_98"},{"data":1,"id":364,"name":"minecraft:element_98"},{"data":2,"id":364,"name":"minecraft:element_98"},{"data":3,"id":364,"name":"minecraft:element_98"},{"data":4,"id":364,"name":"minecraft:element_98"},{"data":5,"id":364,"name":"minecraft:element_98"},{"data":6,"id":364,"name":"minecraft:element_98"},{"data":7,"id":364,"name":"minecraft:element_98"},{"data":8,"id":364,"name":"minecraft:element_98"},{"data":9,"id":364,"name":"minecraft:element_98"},{"data":10,"id":364,"name":"minecraft:element_98"},{"data":11,"id":364,"name":"minecraft:element_98"},{"data":12,"id":364,"name":"minecraft:element_98"},{"data":13,"id":364,"name":"minecraft:element_98"},{"data":14,"id":364,"name":"minecraft:element_98"},{"data":15,"id":364,"name":"minecraft:element_98"},{"data":0,"id":365,"name":"minecraft:element_99"},{"data":1,"id":365,"name":"minecraft:element_99"},{"data":2,"id":365,"name":"minecraft:element_99"},{"data":3,"id":365,"name":"minecraft:element_99"},{"data":4,"id":365,"name":"minecraft:element_99"},{"data":5,"id":365,"name":"minecraft:element_99"},{"data":6,"id":365,"name":"minecraft:element_99"},{"data":7,"id":365,"name":"minecraft:element_99"},{"data":8,"id":365,"name":"minecraft:element_99"},{"data":9,"id":365,"name":"minecraft:element_99"},{"data":10,"id":365,"name":"minecraft:element_99"},{"data":11,"id":365,"name":"minecraft:element_99"},{"data":12,"id":365,"name":"minecraft:element_99"},{"data":13,"id":365,"name":"minecraft:element_99"},{"data":14,"id":365,"name":"minecraft:element_99"},{"data":15,"id":365,"name":"minecraft:element_99"},{"data":0,"id":366,"name":"minecraft:element_100"},{"data":1,"id":366,"name":"minecraft:element_100"},{"data":2,"id":366,"name":"minecraft:element_100"},{"data":3,"id":366,"name":"minecraft:element_100"},{"data":4,"id":366,"name":"minecraft:element_100"},{"data":5,"id":366,"name":"minecraft:element_100"},{"data":6,"id":366,"name":"minecraft:element_100"},{"data":7,"id":366,"name":"minecraft:element_100"},{"data":8,"id":366,"name":"minecraft:element_100"},{"data":9,"id":366,"name":"minecraft:element_100"},{"data":10,"id":366,"name":"minecraft:element_100"},{"data":11,"id":366,"name":"minecraft:element_100"},{"data":12,"id":366,"name":"minecraft:element_100"},{"data":13,"id":366,"name":"minecraft:element_100"},{"data":14,"id":366,"name":"minecraft:element_100"},{"data":15,"id":366,"name":"minecraft:element_100"},{"data":0,"id":367,"name":"minecraft:element_101"},{"data":1,"id":367,"name":"minecraft:element_101"},{"data":2,"id":367,"name":"minecraft:element_101"},{"data":3,"id":367,"name":"minecraft:element_101"},{"data":4,"id":367,"name":"minecraft:element_101"},{"data":5,"id":367,"name":"minecraft:element_101"},{"data":6,"id":367,"name":"minecraft:element_101"},{"data":7,"id":367,"name":"minecraft:element_101"},{"data":8,"id":367,"name":"minecraft:element_101"},{"data":9,"id":367,"name":"minecraft:element_101"},{"data":10,"id":367,"name":"minecraft:element_101"},{"data":11,"id":367,"name":"minecraft:element_101"},{"data":12,"id":367,"name":"minecraft:element_101"},{"data":13,"id":367,"name":"minecraft:element_101"},{"data":14,"id":367,"name":"minecraft:element_101"},{"data":15,"id":367,"name":"minecraft:element_101"},{"data":0,"id":368,"name":"minecraft:element_102"},{"data":1,"id":368,"name":"minecraft:element_102"},{"data":2,"id":368,"name":"minecraft:element_102"},{"data":3,"id":368,"name":"minecraft:element_102"},{"data":4,"id":368,"name":"minecraft:element_102"},{"data":5,"id":368,"name":"minecraft:element_102"},{"data":6,"id":368,"name":"minecraft:element_102"},{"data":7,"id":368,"name":"minecraft:element_102"},{"data":8,"id":368,"name":"minecraft:element_102"},{"data":9,"id":368,"name":"minecraft:element_102"},{"data":10,"id":368,"name":"minecraft:element_102"},{"data":11,"id":368,"name":"minecraft:element_102"},{"data":12,"id":368,"name":"minecraft:element_102"},{"data":13,"id":368,"name":"minecraft:element_102"},{"data":14,"id":368,"name":"minecraft:element_102"},{"data":15,"id":368,"name":"minecraft:element_102"},{"data":0,"id":369,"name":"minecraft:element_103"},{"data":1,"id":369,"name":"minecraft:element_103"},{"data":2,"id":369,"name":"minecraft:element_103"},{"data":3,"id":369,"name":"minecraft:element_103"},{"data":4,"id":369,"name":"minecraft:element_103"},{"data":5,"id":369,"name":"minecraft:element_103"},{"data":6,"id":369,"name":"minecraft:element_103"},{"data":7,"id":369,"name":"minecraft:element_103"},{"data":8,"id":369,"name":"minecraft:element_103"},{"data":9,"id":369,"name":"minecraft:element_103"},{"data":10,"id":369,"name":"minecraft:element_103"},{"data":11,"id":369,"name":"minecraft:element_103"},{"data":12,"id":369,"name":"minecraft:element_103"},{"data":13,"id":369,"name":"minecraft:element_103"},{"data":14,"id":369,"name":"minecraft:element_103"},{"data":15,"id":369,"name":"minecraft:element_103"},{"data":0,"id":370,"name":"minecraft:element_104"},{"data":1,"id":370,"name":"minecraft:element_104"},{"data":2,"id":370,"name":"minecraft:element_104"},{"data":3,"id":370,"name":"minecraft:element_104"},{"data":4,"id":370,"name":"minecraft:element_104"},{"data":5,"id":370,"name":"minecraft:element_104"},{"data":6,"id":370,"name":"minecraft:element_104"},{"data":7,"id":370,"name":"minecraft:element_104"},{"data":8,"id":370,"name":"minecraft:element_104"},{"data":9,"id":370,"name":"minecraft:element_104"},{"data":10,"id":370,"name":"minecraft:element_104"},{"data":11,"id":370,"name":"minecraft:element_104"},{"data":12,"id":370,"name":"minecraft:element_104"},{"data":13,"id":370,"name":"minecraft:element_104"},{"data":14,"id":370,"name":"minecraft:element_104"},{"data":15,"id":370,"name":"minecraft:element_104"},{"data":0,"id":371,"name":"minecraft:element_105"},{"data":1,"id":371,"name":"minecraft:element_105"},{"data":2,"id":371,"name":"minecraft:element_105"},{"data":3,"id":371,"name":"minecraft:element_105"},{"data":4,"id":371,"name":"minecraft:element_105"},{"data":5,"id":371,"name":"minecraft:element_105"},{"data":6,"id":371,"name":"minecraft:element_105"},{"data":7,"id":371,"name":"minecraft:element_105"},{"data":8,"id":371,"name":"minecraft:element_105"},{"data":9,"id":371,"name":"minecraft:element_105"},{"data":10,"id":371,"name":"minecraft:element_105"},{"data":11,"id":371,"name":"minecraft:element_105"},{"data":12,"id":371,"name":"minecraft:element_105"},{"data":13,"id":371,"name":"minecraft:element_105"},{"data":14,"id":371,"name":"minecraft:element_105"},{"data":15,"id":371,"name":"minecraft:element_105"},{"data":0,"id":372,"name":"minecraft:element_106"},{"data":1,"id":372,"name":"minecraft:element_106"},{"data":2,"id":372,"name":"minecraft:element_106"},{"data":3,"id":372,"name":"minecraft:element_106"},{"data":4,"id":372,"name":"minecraft:element_106"},{"data":5,"id":372,"name":"minecraft:element_106"},{"data":6,"id":372,"name":"minecraft:element_106"},{"data":7,"id":372,"name":"minecraft:element_106"},{"data":8,"id":372,"name":"minecraft:element_106"},{"data":9,"id":372,"name":"minecraft:element_106"},{"data":10,"id":372,"name":"minecraft:element_106"},{"data":11,"id":372,"name":"minecraft:element_106"},{"data":12,"id":372,"name":"minecraft:element_106"},{"data":13,"id":372,"name":"minecraft:element_106"},{"data":14,"id":372,"name":"minecraft:element_106"},{"data":15,"id":372,"name":"minecraft:element_106"},{"data":0,"id":373,"name":"minecraft:element_107"},{"data":1,"id":373,"name":"minecraft:element_107"},{"data":2,"id":373,"name":"minecraft:element_107"},{"data":3,"id":373,"name":"minecraft:element_107"},{"data":4,"id":373,"name":"minecraft:element_107"},{"data":5,"id":373,"name":"minecraft:element_107"},{"data":6,"id":373,"name":"minecraft:element_107"},{"data":7,"id":373,"name":"minecraft:element_107"},{"data":8,"id":373,"name":"minecraft:element_107"},{"data":9,"id":373,"name":"minecraft:element_107"},{"data":10,"id":373,"name":"minecraft:element_107"},{"data":11,"id":373,"name":"minecraft:element_107"},{"data":12,"id":373,"name":"minecraft:element_107"},{"data":13,"id":373,"name":"minecraft:element_107"},{"data":14,"id":373,"name":"minecraft:element_107"},{"data":15,"id":373,"name":"minecraft:element_107"},{"data":0,"id":374,"name":"minecraft:element_108"},{"data":1,"id":374,"name":"minecraft:element_108"},{"data":2,"id":374,"name":"minecraft:element_108"},{"data":3,"id":374,"name":"minecraft:element_108"},{"data":4,"id":374,"name":"minecraft:element_108"},{"data":5,"id":374,"name":"minecraft:element_108"},{"data":6,"id":374,"name":"minecraft:element_108"},{"data":7,"id":374,"name":"minecraft:element_108"},{"data":8,"id":374,"name":"minecraft:element_108"},{"data":9,"id":374,"name":"minecraft:element_108"},{"data":10,"id":374,"name":"minecraft:element_108"},{"data":11,"id":374,"name":"minecraft:element_108"},{"data":12,"id":374,"name":"minecraft:element_108"},{"data":13,"id":374,"name":"minecraft:element_108"},{"data":14,"id":374,"name":"minecraft:element_108"},{"data":15,"id":374,"name":"minecraft:element_108"},{"data":0,"id":375,"name":"minecraft:element_109"},{"data":1,"id":375,"name":"minecraft:element_109"},{"data":2,"id":375,"name":"minecraft:element_109"},{"data":3,"id":375,"name":"minecraft:element_109"},{"data":4,"id":375,"name":"minecraft:element_109"},{"data":5,"id":375,"name":"minecraft:element_109"},{"data":6,"id":375,"name":"minecraft:element_109"},{"data":7,"id":375,"name":"minecraft:element_109"},{"data":8,"id":375,"name":"minecraft:element_109"},{"data":9,"id":375,"name":"minecraft:element_109"},{"data":10,"id":375,"name":"minecraft:element_109"},{"data":11,"id":375,"name":"minecraft:element_109"},{"data":12,"id":375,"name":"minecraft:element_109"},{"data":13,"id":375,"name":"minecraft:element_109"},{"data":14,"id":375,"name":"minecraft:element_109"},{"data":15,"id":375,"name":"minecraft:element_109"},{"data":0,"id":376,"name":"minecraft:element_110"},{"data":1,"id":376,"name":"minecraft:element_110"},{"data":2,"id":376,"name":"minecraft:element_110"},{"data":3,"id":376,"name":"minecraft:element_110"},{"data":4,"id":376,"name":"minecraft:element_110"},{"data":5,"id":376,"name":"minecraft:element_110"},{"data":6,"id":376,"name":"minecraft:element_110"},{"data":7,"id":376,"name":"minecraft:element_110"},{"data":8,"id":376,"name":"minecraft:element_110"},{"data":9,"id":376,"name":"minecraft:element_110"},{"data":10,"id":376,"name":"minecraft:element_110"},{"data":11,"id":376,"name":"minecraft:element_110"},{"data":12,"id":376,"name":"minecraft:element_110"},{"data":13,"id":376,"name":"minecraft:element_110"},{"data":14,"id":376,"name":"minecraft:element_110"},{"data":15,"id":376,"name":"minecraft:element_110"},{"data":0,"id":377,"name":"minecraft:element_111"},{"data":1,"id":377,"name":"minecraft:element_111"},{"data":2,"id":377,"name":"minecraft:element_111"},{"data":3,"id":377,"name":"minecraft:element_111"},{"data":4,"id":377,"name":"minecraft:element_111"},{"data":5,"id":377,"name":"minecraft:element_111"},{"data":6,"id":377,"name":"minecraft:element_111"},{"data":7,"id":377,"name":"minecraft:element_111"},{"data":8,"id":377,"name":"minecraft:element_111"},{"data":9,"id":377,"name":"minecraft:element_111"},{"data":10,"id":377,"name":"minecraft:element_111"},{"data":11,"id":377,"name":"minecraft:element_111"},{"data":12,"id":377,"name":"minecraft:element_111"},{"data":13,"id":377,"name":"minecraft:element_111"},{"data":14,"id":377,"name":"minecraft:element_111"},{"data":15,"id":377,"name":"minecraft:element_111"},{"data":0,"id":378,"name":"minecraft:element_112"},{"data":1,"id":378,"name":"minecraft:element_112"},{"data":2,"id":378,"name":"minecraft:element_112"},{"data":3,"id":378,"name":"minecraft:element_112"},{"data":4,"id":378,"name":"minecraft:element_112"},{"data":5,"id":378,"name":"minecraft:element_112"},{"data":6,"id":378,"name":"minecraft:element_112"},{"data":7,"id":378,"name":"minecraft:element_112"},{"data":8,"id":378,"name":"minecraft:element_112"},{"data":9,"id":378,"name":"minecraft:element_112"},{"data":10,"id":378,"name":"minecraft:element_112"},{"data":11,"id":378,"name":"minecraft:element_112"},{"data":12,"id":378,"name":"minecraft:element_112"},{"data":13,"id":378,"name":"minecraft:element_112"},{"data":14,"id":378,"name":"minecraft:element_112"},{"data":15,"id":378,"name":"minecraft:element_112"},{"data":0,"id":379,"name":"minecraft:element_113"},{"data":1,"id":379,"name":"minecraft:element_113"},{"data":2,"id":379,"name":"minecraft:element_113"},{"data":3,"id":379,"name":"minecraft:element_113"},{"data":4,"id":379,"name":"minecraft:element_113"},{"data":5,"id":379,"name":"minecraft:element_113"},{"data":6,"id":379,"name":"minecraft:element_113"},{"data":7,"id":379,"name":"minecraft:element_113"},{"data":8,"id":379,"name":"minecraft:element_113"},{"data":9,"id":379,"name":"minecraft:element_113"},{"data":10,"id":379,"name":"minecraft:element_113"},{"data":11,"id":379,"name":"minecraft:element_113"},{"data":12,"id":379,"name":"minecraft:element_113"},{"data":13,"id":379,"name":"minecraft:element_113"},{"data":14,"id":379,"name":"minecraft:element_113"},{"data":15,"id":379,"name":"minecraft:element_113"},{"data":0,"id":380,"name":"minecraft:element_114"},{"data":1,"id":380,"name":"minecraft:element_114"},{"data":2,"id":380,"name":"minecraft:element_114"},{"data":3,"id":380,"name":"minecraft:element_114"},{"data":4,"id":380,"name":"minecraft:element_114"},{"data":5,"id":380,"name":"minecraft:element_114"},{"data":6,"id":380,"name":"minecraft:element_114"},{"data":7,"id":380,"name":"minecraft:element_114"},{"data":8,"id":380,"name":"minecraft:element_114"},{"data":9,"id":380,"name":"minecraft:element_114"},{"data":10,"id":380,"name":"minecraft:element_114"},{"data":11,"id":380,"name":"minecraft:element_114"},{"data":12,"id":380,"name":"minecraft:element_114"},{"data":13,"id":380,"name":"minecraft:element_114"},{"data":14,"id":380,"name":"minecraft:element_114"},{"data":15,"id":380,"name":"minecraft:element_114"},{"data":0,"id":381,"name":"minecraft:element_115"},{"data":1,"id":381,"name":"minecraft:element_115"},{"data":2,"id":381,"name":"minecraft:element_115"},{"data":3,"id":381,"name":"minecraft:element_115"},{"data":4,"id":381,"name":"minecraft:element_115"},{"data":5,"id":381,"name":"minecraft:element_115"},{"data":6,"id":381,"name":"minecraft:element_115"},{"data":7,"id":381,"name":"minecraft:element_115"},{"data":8,"id":381,"name":"minecraft:element_115"},{"data":9,"id":381,"name":"minecraft:element_115"},{"data":10,"id":381,"name":"minecraft:element_115"},{"data":11,"id":381,"name":"minecraft:element_115"},{"data":12,"id":381,"name":"minecraft:element_115"},{"data":13,"id":381,"name":"minecraft:element_115"},{"data":14,"id":381,"name":"minecraft:element_115"},{"data":15,"id":381,"name":"minecraft:element_115"},{"data":0,"id":382,"name":"minecraft:element_116"},{"data":1,"id":382,"name":"minecraft:element_116"},{"data":2,"id":382,"name":"minecraft:element_116"},{"data":3,"id":382,"name":"minecraft:element_116"},{"data":4,"id":382,"name":"minecraft:element_116"},{"data":5,"id":382,"name":"minecraft:element_116"},{"data":6,"id":382,"name":"minecraft:element_116"},{"data":7,"id":382,"name":"minecraft:element_116"},{"data":8,"id":382,"name":"minecraft:element_116"},{"data":9,"id":382,"name":"minecraft:element_116"},{"data":10,"id":382,"name":"minecraft:element_116"},{"data":11,"id":382,"name":"minecraft:element_116"},{"data":12,"id":382,"name":"minecraft:element_116"},{"data":13,"id":382,"name":"minecraft:element_116"},{"data":14,"id":382,"name":"minecraft:element_116"},{"data":15,"id":382,"name":"minecraft:element_116"},{"data":0,"id":383,"name":"minecraft:element_117"},{"data":1,"id":383,"name":"minecraft:element_117"},{"data":2,"id":383,"name":"minecraft:element_117"},{"data":3,"id":383,"name":"minecraft:element_117"},{"data":4,"id":383,"name":"minecraft:element_117"},{"data":5,"id":383,"name":"minecraft:element_117"},{"data":6,"id":383,"name":"minecraft:element_117"},{"data":7,"id":383,"name":"minecraft:element_117"},{"data":8,"id":383,"name":"minecraft:element_117"},{"data":9,"id":383,"name":"minecraft:element_117"},{"data":10,"id":383,"name":"minecraft:element_117"},{"data":11,"id":383,"name":"minecraft:element_117"},{"data":12,"id":383,"name":"minecraft:element_117"},{"data":13,"id":383,"name":"minecraft:element_117"},{"data":14,"id":383,"name":"minecraft:element_117"},{"data":15,"id":383,"name":"minecraft:element_117"},{"data":0,"id":384,"name":"minecraft:element_118"},{"data":1,"id":384,"name":"minecraft:element_118"},{"data":2,"id":384,"name":"minecraft:element_118"},{"data":3,"id":384,"name":"minecraft:element_118"},{"data":4,"id":384,"name":"minecraft:element_118"},{"data":5,"id":384,"name":"minecraft:element_118"},{"data":6,"id":384,"name":"minecraft:element_118"},{"data":7,"id":384,"name":"minecraft:element_118"},{"data":8,"id":384,"name":"minecraft:element_118"},{"data":9,"id":384,"name":"minecraft:element_118"},{"data":10,"id":384,"name":"minecraft:element_118"},{"data":11,"id":384,"name":"minecraft:element_118"},{"data":12,"id":384,"name":"minecraft:element_118"},{"data":13,"id":384,"name":"minecraft:element_118"},{"data":14,"id":384,"name":"minecraft:element_118"},{"data":15,"id":384,"name":"minecraft:element_118"},{"data":0,"id":385,"name":"minecraft:seagrass"},{"data":1,"id":385,"name":"minecraft:seagrass"},{"data":2,"id":385,"name":"minecraft:seagrass"},{"data":3,"id":385,"name":"minecraft:seagrass"},{"data":0,"id":386,"name":"minecraft:coral"},{"data":1,"id":386,"name":"minecraft:coral"},{"data":2,"id":386,"name":"minecraft:coral"},{"data":3,"id":386,"name":"minecraft:coral"},{"data":4,"id":386,"name":"minecraft:coral"},{"data":5,"id":386,"name":"minecraft:coral"},{"data":6,"id":386,"name":"minecraft:coral"},{"data":7,"id":386,"name":"minecraft:coral"},{"data":8,"id":386,"name":"minecraft:coral"},{"data":9,"id":386,"name":"minecraft:coral"},{"data":10,"id":386,"name":"minecraft:coral"},{"data":11,"id":386,"name":"minecraft:coral"},{"data":12,"id":386,"name":"minecraft:coral"},{"data":13,"id":386,"name":"minecraft:coral"},{"data":14,"id":386,"name":"minecraft:coral"},{"data":15,"id":386,"name":"minecraft:coral"},{"data":0,"id":387,"name":"minecraft:coral_block"},{"data":1,"id":387,"name":"minecraft:coral_block"},{"data":2,"id":387,"name":"minecraft:coral_block"},{"data":3,"id":387,"name":"minecraft:coral_block"},{"data":4,"id":387,"name":"minecraft:coral_block"},{"data":5,"id":387,"name":"minecraft:coral_block"},{"data":6,"id":387,"name":"minecraft:coral_block"},{"data":7,"id":387,"name":"minecraft:coral_block"},{"data":8,"id":387,"name":"minecraft:coral_block"},{"data":9,"id":387,"name":"minecraft:coral_block"},{"data":10,"id":387,"name":"minecraft:coral_block"},{"data":11,"id":387,"name":"minecraft:coral_block"},{"data":12,"id":387,"name":"minecraft:coral_block"},{"data":13,"id":387,"name":"minecraft:coral_block"},{"data":14,"id":387,"name":"minecraft:coral_block"},{"data":15,"id":387,"name":"minecraft:coral_block"},{"data":0,"id":388,"name":"minecraft:coral_fan"},{"data":1,"id":388,"name":"minecraft:coral_fan"},{"data":2,"id":388,"name":"minecraft:coral_fan"},{"data":3,"id":388,"name":"minecraft:coral_fan"},{"data":4,"id":388,"name":"minecraft:coral_fan"},{"data":5,"id":388,"name":"minecraft:coral_fan"},{"data":6,"id":388,"name":"minecraft:coral_fan"},{"data":7,"id":388,"name":"minecraft:coral_fan"},{"data":8,"id":388,"name":"minecraft:coral_fan"},{"data":9,"id":388,"name":"minecraft:coral_fan"},{"data":10,"id":388,"name":"minecraft:coral_fan"},{"data":11,"id":388,"name":"minecraft:coral_fan"},{"data":12,"id":388,"name":"minecraft:coral_fan"},{"data":13,"id":388,"name":"minecraft:coral_fan"},{"data":14,"id":388,"name":"minecraft:coral_fan"},{"data":15,"id":388,"name":"minecraft:coral_fan"},{"data":0,"id":389,"name":"minecraft:coral_fan_dead"},{"data":1,"id":389,"name":"minecraft:coral_fan_dead"},{"data":2,"id":389,"name":"minecraft:coral_fan_dead"},{"data":3,"id":389,"name":"minecraft:coral_fan_dead"},{"data":4,"id":389,"name":"minecraft:coral_fan_dead"},{"data":5,"id":389,"name":"minecraft:coral_fan_dead"},{"data":6,"id":389,"name":"minecraft:coral_fan_dead"},{"data":7,"id":389,"name":"minecraft:coral_fan_dead"},{"data":8,"id":389,"name":"minecraft:coral_fan_dead"},{"data":9,"id":389,"name":"minecraft:coral_fan_dead"},{"data":10,"id":389,"name":"minecraft:coral_fan_dead"},{"data":11,"id":389,"name":"minecraft:coral_fan_dead"},{"data":12,"id":389,"name":"minecraft:coral_fan_dead"},{"data":13,"id":389,"name":"minecraft:coral_fan_dead"},{"data":14,"id":389,"name":"minecraft:coral_fan_dead"},{"data":15,"id":389,"name":"minecraft:coral_fan_dead"},{"data":0,"id":390,"name":"minecraft:coral_fan_hang"},{"data":1,"id":390,"name":"minecraft:coral_fan_hang"},{"data":2,"id":390,"name":"minecraft:coral_fan_hang"},{"data":3,"id":390,"name":"minecraft:coral_fan_hang"},{"data":4,"id":390,"name":"minecraft:coral_fan_hang"},{"data":5,"id":390,"name":"minecraft:coral_fan_hang"},{"data":6,"id":390,"name":"minecraft:coral_fan_hang"},{"data":7,"id":390,"name":"minecraft:coral_fan_hang"},{"data":8,"id":390,"name":"minecraft:coral_fan_hang"},{"data":9,"id":390,"name":"minecraft:coral_fan_hang"},{"data":10,"id":390,"name":"minecraft:coral_fan_hang"},{"data":11,"id":390,"name":"minecraft:coral_fan_hang"},{"data":12,"id":390,"name":"minecraft:coral_fan_hang"},{"data":13,"id":390,"name":"minecraft:coral_fan_hang"},{"data":14,"id":390,"name":"minecraft:coral_fan_hang"},{"data":15,"id":390,"name":"minecraft:coral_fan_hang"},{"data":0,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":1,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":2,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":3,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":4,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":5,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":6,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":7,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":8,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":9,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":10,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":11,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":12,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":13,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":14,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":15,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":0,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":1,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":2,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":3,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":4,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":5,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":6,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":7,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":8,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":9,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":10,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":11,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":12,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":13,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":14,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":15,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":0,"id":393,"name":"minecraft:kelp"},{"data":1,"id":393,"name":"minecraft:kelp"},{"data":2,"id":393,"name":"minecraft:kelp"},{"data":3,"id":393,"name":"minecraft:kelp"},{"data":4,"id":393,"name":"minecraft:kelp"},{"data":5,"id":393,"name":"minecraft:kelp"},{"data":6,"id":393,"name":"minecraft:kelp"},{"data":7,"id":393,"name":"minecraft:kelp"},{"data":8,"id":393,"name":"minecraft:kelp"},{"data":9,"id":393,"name":"minecraft:kelp"},{"data":10,"id":393,"name":"minecraft:kelp"},{"data":11,"id":393,"name":"minecraft:kelp"},{"data":12,"id":393,"name":"minecraft:kelp"},{"data":13,"id":393,"name":"minecraft:kelp"},{"data":14,"id":393,"name":"minecraft:kelp"},{"data":15,"id":393,"name":"minecraft:kelp"},{"data":0,"id":394,"name":"minecraft:dried_kelp_block"},{"data":0,"id":395,"name":"minecraft:acacia_button"},{"data":1,"id":395,"name":"minecraft:acacia_button"},{"data":2,"id":395,"name":"minecraft:acacia_button"},{"data":3,"id":395,"name":"minecraft:acacia_button"},{"data":4,"id":395,"name":"minecraft:acacia_button"},{"data":5,"id":395,"name":"minecraft:acacia_button"},{"data":6,"id":395,"name":"minecraft:acacia_button"},{"data":7,"id":395,"name":"minecraft:acacia_button"},{"data":8,"id":395,"name":"minecraft:acacia_button"},{"data":9,"id":395,"name":"minecraft:acacia_button"},{"data":10,"id":395,"name":"minecraft:acacia_button"},{"data":11,"id":395,"name":"minecraft:acacia_button"},{"data":12,"id":395,"name":"minecraft:acacia_button"},{"data":13,"id":395,"name":"minecraft:acacia_button"},{"data":14,"id":395,"name":"minecraft:acacia_button"},{"data":15,"id":395,"name":"minecraft:acacia_button"},{"data":0,"id":396,"name":"minecraft:birch_button"},{"data":1,"id":396,"name":"minecraft:birch_button"},{"data":2,"id":396,"name":"minecraft:birch_button"},{"data":3,"id":396,"name":"minecraft:birch_button"},{"data":4,"id":396,"name":"minecraft:birch_button"},{"data":5,"id":396,"name":"minecraft:birch_button"},{"data":6,"id":396,"name":"minecraft:birch_button"},{"data":7,"id":396,"name":"minecraft:birch_button"},{"data":8,"id":396,"name":"minecraft:birch_button"},{"data":9,"id":396,"name":"minecraft:birch_button"},{"data":10,"id":396,"name":"minecraft:birch_button"},{"data":11,"id":396,"name":"minecraft:birch_button"},{"data":12,"id":396,"name":"minecraft:birch_button"},{"data":13,"id":396,"name":"minecraft:birch_button"},{"data":14,"id":396,"name":"minecraft:birch_button"},{"data":15,"id":396,"name":"minecraft:birch_button"},{"data":0,"id":397,"name":"minecraft:dark_oak_button"},{"data":1,"id":397,"name":"minecraft:dark_oak_button"},{"data":2,"id":397,"name":"minecraft:dark_oak_button"},{"data":3,"id":397,"name":"minecraft:dark_oak_button"},{"data":4,"id":397,"name":"minecraft:dark_oak_button"},{"data":5,"id":397,"name":"minecraft:dark_oak_button"},{"data":6,"id":397,"name":"minecraft:dark_oak_button"},{"data":7,"id":397,"name":"minecraft:dark_oak_button"},{"data":8,"id":397,"name":"minecraft:dark_oak_button"},{"data":9,"id":397,"name":"minecraft:dark_oak_button"},{"data":10,"id":397,"name":"minecraft:dark_oak_button"},{"data":11,"id":397,"name":"minecraft:dark_oak_button"},{"data":12,"id":397,"name":"minecraft:dark_oak_button"},{"data":13,"id":397,"name":"minecraft:dark_oak_button"},{"data":14,"id":397,"name":"minecraft:dark_oak_button"},{"data":15,"id":397,"name":"minecraft:dark_oak_button"},{"data":0,"id":398,"name":"minecraft:jungle_button"},{"data":1,"id":398,"name":"minecraft:jungle_button"},{"data":2,"id":398,"name":"minecraft:jungle_button"},{"data":3,"id":398,"name":"minecraft:jungle_button"},{"data":4,"id":398,"name":"minecraft:jungle_button"},{"data":5,"id":398,"name":"minecraft:jungle_button"},{"data":6,"id":398,"name":"minecraft:jungle_button"},{"data":7,"id":398,"name":"minecraft:jungle_button"},{"data":8,"id":398,"name":"minecraft:jungle_button"},{"data":9,"id":398,"name":"minecraft:jungle_button"},{"data":10,"id":398,"name":"minecraft:jungle_button"},{"data":11,"id":398,"name":"minecraft:jungle_button"},{"data":12,"id":398,"name":"minecraft:jungle_button"},{"data":13,"id":398,"name":"minecraft:jungle_button"},{"data":14,"id":398,"name":"minecraft:jungle_button"},{"data":15,"id":398,"name":"minecraft:jungle_button"},{"data":0,"id":399,"name":"minecraft:spruce_button"},{"data":1,"id":399,"name":"minecraft:spruce_button"},{"data":2,"id":399,"name":"minecraft:spruce_button"},{"data":3,"id":399,"name":"minecraft:spruce_button"},{"data":4,"id":399,"name":"minecraft:spruce_button"},{"data":5,"id":399,"name":"minecraft:spruce_button"},{"data":6,"id":399,"name":"minecraft:spruce_button"},{"data":7,"id":399,"name":"minecraft:spruce_button"},{"data":8,"id":399,"name":"minecraft:spruce_button"},{"data":9,"id":399,"name":"minecraft:spruce_button"},{"data":10,"id":399,"name":"minecraft:spruce_button"},{"data":11,"id":399,"name":"minecraft:spruce_button"},{"data":12,"id":399,"name":"minecraft:spruce_button"},{"data":13,"id":399,"name":"minecraft:spruce_button"},{"data":14,"id":399,"name":"minecraft:spruce_button"},{"data":15,"id":399,"name":"minecraft:spruce_button"},{"data":0,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":1,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":2,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":3,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":4,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":5,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":6,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":7,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":8,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":9,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":10,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":11,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":12,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":13,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":14,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":15,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":0,"id":401,"name":"minecraft:birch_trapdoor"},{"data":1,"id":401,"name":"minecraft:birch_trapdoor"},{"data":2,"id":401,"name":"minecraft:birch_trapdoor"},{"data":3,"id":401,"name":"minecraft:birch_trapdoor"},{"data":4,"id":401,"name":"minecraft:birch_trapdoor"},{"data":5,"id":401,"name":"minecraft:birch_trapdoor"},{"data":6,"id":401,"name":"minecraft:birch_trapdoor"},{"data":7,"id":401,"name":"minecraft:birch_trapdoor"},{"data":8,"id":401,"name":"minecraft:birch_trapdoor"},{"data":9,"id":401,"name":"minecraft:birch_trapdoor"},{"data":10,"id":401,"name":"minecraft:birch_trapdoor"},{"data":11,"id":401,"name":"minecraft:birch_trapdoor"},{"data":12,"id":401,"name":"minecraft:birch_trapdoor"},{"data":13,"id":401,"name":"minecraft:birch_trapdoor"},{"data":14,"id":401,"name":"minecraft:birch_trapdoor"},{"data":15,"id":401,"name":"minecraft:birch_trapdoor"},{"data":0,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":1,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":2,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":3,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":4,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":5,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":6,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":7,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":8,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":9,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":10,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":11,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":12,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":13,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":14,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":15,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":0,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":1,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":2,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":3,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":4,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":5,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":6,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":7,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":8,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":9,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":10,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":11,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":12,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":13,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":14,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":15,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":0,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":1,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":2,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":3,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":4,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":5,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":6,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":7,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":8,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":9,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":10,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":11,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":12,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":13,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":14,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":15,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":0,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":1,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":2,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":3,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":4,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":5,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":6,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":7,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":8,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":9,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":10,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":11,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":12,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":13,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":14,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":15,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":0,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":1,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":2,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":3,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":4,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":5,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":6,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":7,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":8,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":9,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":10,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":11,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":12,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":13,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":14,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":15,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":0,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":1,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":2,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":3,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":4,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":5,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":6,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":7,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":8,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":9,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":10,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":11,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":12,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":13,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":14,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":15,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":0,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":1,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":2,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":3,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":4,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":5,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":6,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":7,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":8,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":9,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":10,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":11,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":12,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":13,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":14,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":15,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":0,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":1,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":2,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":3,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":4,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":5,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":6,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":7,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":8,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":9,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":10,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":11,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":12,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":13,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":14,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":15,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":0,"id":410,"name":"minecraft:carved_pumpkin"},{"data":1,"id":410,"name":"minecraft:carved_pumpkin"},{"data":2,"id":410,"name":"minecraft:carved_pumpkin"},{"data":3,"id":410,"name":"minecraft:carved_pumpkin"},{"data":0,"id":411,"name":"minecraft:sea_pickle"},{"data":1,"id":411,"name":"minecraft:sea_pickle"},{"data":2,"id":411,"name":"minecraft:sea_pickle"},{"data":3,"id":411,"name":"minecraft:sea_pickle"},{"data":4,"id":411,"name":"minecraft:sea_pickle"},{"data":5,"id":411,"name":"minecraft:sea_pickle"},{"data":6,"id":411,"name":"minecraft:sea_pickle"},{"data":7,"id":411,"name":"minecraft:sea_pickle"},{"data":0,"id":412,"name":"minecraft:conduit"},{"data":0,"id":414,"name":"minecraft:turtle_egg"},{"data":1,"id":414,"name":"minecraft:turtle_egg"},{"data":2,"id":414,"name":"minecraft:turtle_egg"},{"data":3,"id":414,"name":"minecraft:turtle_egg"},{"data":4,"id":414,"name":"minecraft:turtle_egg"},{"data":5,"id":414,"name":"minecraft:turtle_egg"},{"data":6,"id":414,"name":"minecraft:turtle_egg"},{"data":7,"id":414,"name":"minecraft:turtle_egg"},{"data":8,"id":414,"name":"minecraft:turtle_egg"},{"data":9,"id":414,"name":"minecraft:turtle_egg"},{"data":10,"id":414,"name":"minecraft:turtle_egg"},{"data":11,"id":414,"name":"minecraft:turtle_egg"},{"data":12,"id":414,"name":"minecraft:turtle_egg"},{"data":13,"id":414,"name":"minecraft:turtle_egg"},{"data":14,"id":414,"name":"minecraft:turtle_egg"},{"data":15,"id":414,"name":"minecraft:turtle_egg"},{"data":0,"id":415,"name":"minecraft:bubble_column"},{"data":1,"id":415,"name":"minecraft:bubble_column"},{"data":0,"id":416,"name":"minecraft:barrier"}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_313.json b/src/main/resources/runtimeid_table_313.json deleted file mode 100644 index 03e59cff1..000000000 --- a/src/main/resources/runtimeid_table_313.json +++ /dev/null @@ -1 +0,0 @@ -[{"data":0,"id":0,"name":"minecraft:air"},{"data":0,"id":1,"name":"minecraft:stone"},{"data":1,"id":1,"name":"minecraft:stone"},{"data":2,"id":1,"name":"minecraft:stone"},{"data":3,"id":1,"name":"minecraft:stone"},{"data":4,"id":1,"name":"minecraft:stone"},{"data":5,"id":1,"name":"minecraft:stone"},{"data":6,"id":1,"name":"minecraft:stone"},{"data":7,"id":1,"name":"minecraft:stone"},{"data":0,"id":2,"name":"minecraft:grass"},{"data":1,"id":2,"name":"minecraft:grass"},{"data":2,"id":2,"name":"minecraft:grass"},{"data":3,"id":2,"name":"minecraft:grass"},{"data":4,"id":2,"name":"minecraft:grass"},{"data":5,"id":2,"name":"minecraft:grass"},{"data":6,"id":2,"name":"minecraft:grass"},{"data":7,"id":2,"name":"minecraft:grass"},{"data":8,"id":2,"name":"minecraft:grass"},{"data":9,"id":2,"name":"minecraft:grass"},{"data":10,"id":2,"name":"minecraft:grass"},{"data":11,"id":2,"name":"minecraft:grass"},{"data":12,"id":2,"name":"minecraft:grass"},{"data":13,"id":2,"name":"minecraft:grass"},{"data":14,"id":2,"name":"minecraft:grass"},{"data":15,"id":2,"name":"minecraft:grass"},{"data":0,"id":3,"name":"minecraft:dirt"},{"data":1,"id":3,"name":"minecraft:dirt"},{"data":0,"id":4,"name":"minecraft:cobblestone"},{"data":0,"id":5,"name":"minecraft:planks"},{"data":1,"id":5,"name":"minecraft:planks"},{"data":2,"id":5,"name":"minecraft:planks"},{"data":3,"id":5,"name":"minecraft:planks"},{"data":4,"id":5,"name":"minecraft:planks"},{"data":5,"id":5,"name":"minecraft:planks"},{"data":6,"id":5,"name":"minecraft:planks"},{"data":7,"id":5,"name":"minecraft:planks"},{"data":0,"id":6,"name":"minecraft:sapling"},{"data":1,"id":6,"name":"minecraft:sapling"},{"data":2,"id":6,"name":"minecraft:sapling"},{"data":3,"id":6,"name":"minecraft:sapling"},{"data":4,"id":6,"name":"minecraft:sapling"},{"data":5,"id":6,"name":"minecraft:sapling"},{"data":6,"id":6,"name":"minecraft:sapling"},{"data":7,"id":6,"name":"minecraft:sapling"},{"data":8,"id":6,"name":"minecraft:sapling"},{"data":9,"id":6,"name":"minecraft:sapling"},{"data":10,"id":6,"name":"minecraft:sapling"},{"data":11,"id":6,"name":"minecraft:sapling"},{"data":12,"id":6,"name":"minecraft:sapling"},{"data":13,"id":6,"name":"minecraft:sapling"},{"data":14,"id":6,"name":"minecraft:sapling"},{"data":15,"id":6,"name":"minecraft:sapling"},{"data":0,"id":7,"name":"minecraft:bedrock"},{"data":1,"id":7,"name":"minecraft:bedrock"},{"data":0,"id":8,"name":"minecraft:flowing_water"},{"data":1,"id":8,"name":"minecraft:flowing_water"},{"data":2,"id":8,"name":"minecraft:flowing_water"},{"data":3,"id":8,"name":"minecraft:flowing_water"},{"data":4,"id":8,"name":"minecraft:flowing_water"},{"data":5,"id":8,"name":"minecraft:flowing_water"},{"data":6,"id":8,"name":"minecraft:flowing_water"},{"data":7,"id":8,"name":"minecraft:flowing_water"},{"data":8,"id":8,"name":"minecraft:flowing_water"},{"data":9,"id":8,"name":"minecraft:flowing_water"},{"data":10,"id":8,"name":"minecraft:flowing_water"},{"data":11,"id":8,"name":"minecraft:flowing_water"},{"data":12,"id":8,"name":"minecraft:flowing_water"},{"data":13,"id":8,"name":"minecraft:flowing_water"},{"data":14,"id":8,"name":"minecraft:flowing_water"},{"data":15,"id":8,"name":"minecraft:flowing_water"},{"data":0,"id":9,"name":"minecraft:water"},{"data":1,"id":9,"name":"minecraft:water"},{"data":2,"id":9,"name":"minecraft:water"},{"data":3,"id":9,"name":"minecraft:water"},{"data":4,"id":9,"name":"minecraft:water"},{"data":5,"id":9,"name":"minecraft:water"},{"data":6,"id":9,"name":"minecraft:water"},{"data":7,"id":9,"name":"minecraft:water"},{"data":8,"id":9,"name":"minecraft:water"},{"data":9,"id":9,"name":"minecraft:water"},{"data":10,"id":9,"name":"minecraft:water"},{"data":11,"id":9,"name":"minecraft:water"},{"data":12,"id":9,"name":"minecraft:water"},{"data":13,"id":9,"name":"minecraft:water"},{"data":14,"id":9,"name":"minecraft:water"},{"data":15,"id":9,"name":"minecraft:water"},{"data":0,"id":10,"name":"minecraft:flowing_lava"},{"data":1,"id":10,"name":"minecraft:flowing_lava"},{"data":2,"id":10,"name":"minecraft:flowing_lava"},{"data":3,"id":10,"name":"minecraft:flowing_lava"},{"data":4,"id":10,"name":"minecraft:flowing_lava"},{"data":5,"id":10,"name":"minecraft:flowing_lava"},{"data":6,"id":10,"name":"minecraft:flowing_lava"},{"data":7,"id":10,"name":"minecraft:flowing_lava"},{"data":8,"id":10,"name":"minecraft:flowing_lava"},{"data":9,"id":10,"name":"minecraft:flowing_lava"},{"data":10,"id":10,"name":"minecraft:flowing_lava"},{"data":11,"id":10,"name":"minecraft:flowing_lava"},{"data":12,"id":10,"name":"minecraft:flowing_lava"},{"data":13,"id":10,"name":"minecraft:flowing_lava"},{"data":14,"id":10,"name":"minecraft:flowing_lava"},{"data":15,"id":10,"name":"minecraft:flowing_lava"},{"data":0,"id":11,"name":"minecraft:lava"},{"data":1,"id":11,"name":"minecraft:lava"},{"data":2,"id":11,"name":"minecraft:lava"},{"data":3,"id":11,"name":"minecraft:lava"},{"data":4,"id":11,"name":"minecraft:lava"},{"data":5,"id":11,"name":"minecraft:lava"},{"data":6,"id":11,"name":"minecraft:lava"},{"data":7,"id":11,"name":"minecraft:lava"},{"data":8,"id":11,"name":"minecraft:lava"},{"data":9,"id":11,"name":"minecraft:lava"},{"data":10,"id":11,"name":"minecraft:lava"},{"data":11,"id":11,"name":"minecraft:lava"},{"data":12,"id":11,"name":"minecraft:lava"},{"data":13,"id":11,"name":"minecraft:lava"},{"data":14,"id":11,"name":"minecraft:lava"},{"data":15,"id":11,"name":"minecraft:lava"},{"data":0,"id":12,"name":"minecraft:sand"},{"data":1,"id":12,"name":"minecraft:sand"},{"data":0,"id":13,"name":"minecraft:gravel"},{"data":0,"id":14,"name":"minecraft:gold_ore"},{"data":0,"id":15,"name":"minecraft:iron_ore"},{"data":0,"id":16,"name":"minecraft:coal_ore"},{"data":0,"id":17,"name":"minecraft:log"},{"data":1,"id":17,"name":"minecraft:log"},{"data":2,"id":17,"name":"minecraft:log"},{"data":3,"id":17,"name":"minecraft:log"},{"data":4,"id":17,"name":"minecraft:log"},{"data":5,"id":17,"name":"minecraft:log"},{"data":6,"id":17,"name":"minecraft:log"},{"data":7,"id":17,"name":"minecraft:log"},{"data":8,"id":17,"name":"minecraft:log"},{"data":9,"id":17,"name":"minecraft:log"},{"data":10,"id":17,"name":"minecraft:log"},{"data":11,"id":17,"name":"minecraft:log"},{"data":12,"id":17,"name":"minecraft:log"},{"data":13,"id":17,"name":"minecraft:log"},{"data":14,"id":17,"name":"minecraft:log"},{"data":15,"id":17,"name":"minecraft:log"},{"data":0,"id":18,"name":"minecraft:leaves"},{"data":1,"id":18,"name":"minecraft:leaves"},{"data":2,"id":18,"name":"minecraft:leaves"},{"data":3,"id":18,"name":"minecraft:leaves"},{"data":4,"id":18,"name":"minecraft:leaves"},{"data":5,"id":18,"name":"minecraft:leaves"},{"data":6,"id":18,"name":"minecraft:leaves"},{"data":7,"id":18,"name":"minecraft:leaves"},{"data":8,"id":18,"name":"minecraft:leaves"},{"data":9,"id":18,"name":"minecraft:leaves"},{"data":10,"id":18,"name":"minecraft:leaves"},{"data":11,"id":18,"name":"minecraft:leaves"},{"data":12,"id":18,"name":"minecraft:leaves"},{"data":13,"id":18,"name":"minecraft:leaves"},{"data":14,"id":18,"name":"minecraft:leaves"},{"data":15,"id":18,"name":"minecraft:leaves"},{"data":0,"id":19,"name":"minecraft:sponge"},{"data":1,"id":19,"name":"minecraft:sponge"},{"data":0,"id":20,"name":"minecraft:glass"},{"data":0,"id":21,"name":"minecraft:lapis_ore"},{"data":0,"id":22,"name":"minecraft:lapis_block"},{"data":0,"id":23,"name":"minecraft:dispenser"},{"data":1,"id":23,"name":"minecraft:dispenser"},{"data":2,"id":23,"name":"minecraft:dispenser"},{"data":3,"id":23,"name":"minecraft:dispenser"},{"data":4,"id":23,"name":"minecraft:dispenser"},{"data":5,"id":23,"name":"minecraft:dispenser"},{"data":6,"id":23,"name":"minecraft:dispenser"},{"data":7,"id":23,"name":"minecraft:dispenser"},{"data":8,"id":23,"name":"minecraft:dispenser"},{"data":9,"id":23,"name":"minecraft:dispenser"},{"data":10,"id":23,"name":"minecraft:dispenser"},{"data":11,"id":23,"name":"minecraft:dispenser"},{"data":12,"id":23,"name":"minecraft:dispenser"},{"data":13,"id":23,"name":"minecraft:dispenser"},{"data":14,"id":23,"name":"minecraft:dispenser"},{"data":15,"id":23,"name":"minecraft:dispenser"},{"data":0,"id":24,"name":"minecraft:sandstone"},{"data":1,"id":24,"name":"minecraft:sandstone"},{"data":2,"id":24,"name":"minecraft:sandstone"},{"data":3,"id":24,"name":"minecraft:sandstone"},{"data":0,"id":25,"name":"minecraft:noteblock"},{"data":0,"id":26,"name":"minecraft:bed"},{"data":1,"id":26,"name":"minecraft:bed"},{"data":2,"id":26,"name":"minecraft:bed"},{"data":3,"id":26,"name":"minecraft:bed"},{"data":4,"id":26,"name":"minecraft:bed"},{"data":5,"id":26,"name":"minecraft:bed"},{"data":6,"id":26,"name":"minecraft:bed"},{"data":7,"id":26,"name":"minecraft:bed"},{"data":8,"id":26,"name":"minecraft:bed"},{"data":9,"id":26,"name":"minecraft:bed"},{"data":10,"id":26,"name":"minecraft:bed"},{"data":11,"id":26,"name":"minecraft:bed"},{"data":12,"id":26,"name":"minecraft:bed"},{"data":13,"id":26,"name":"minecraft:bed"},{"data":14,"id":26,"name":"minecraft:bed"},{"data":15,"id":26,"name":"minecraft:bed"},{"data":0,"id":27,"name":"minecraft:golden_rail"},{"data":1,"id":27,"name":"minecraft:golden_rail"},{"data":2,"id":27,"name":"minecraft:golden_rail"},{"data":3,"id":27,"name":"minecraft:golden_rail"},{"data":4,"id":27,"name":"minecraft:golden_rail"},{"data":5,"id":27,"name":"minecraft:golden_rail"},{"data":6,"id":27,"name":"minecraft:golden_rail"},{"data":7,"id":27,"name":"minecraft:golden_rail"},{"data":8,"id":27,"name":"minecraft:golden_rail"},{"data":9,"id":27,"name":"minecraft:golden_rail"},{"data":10,"id":27,"name":"minecraft:golden_rail"},{"data":11,"id":27,"name":"minecraft:golden_rail"},{"data":12,"id":27,"name":"minecraft:golden_rail"},{"data":13,"id":27,"name":"minecraft:golden_rail"},{"data":14,"id":27,"name":"minecraft:golden_rail"},{"data":15,"id":27,"name":"minecraft:golden_rail"},{"data":0,"id":28,"name":"minecraft:detector_rail"},{"data":1,"id":28,"name":"minecraft:detector_rail"},{"data":2,"id":28,"name":"minecraft:detector_rail"},{"data":3,"id":28,"name":"minecraft:detector_rail"},{"data":4,"id":28,"name":"minecraft:detector_rail"},{"data":5,"id":28,"name":"minecraft:detector_rail"},{"data":6,"id":28,"name":"minecraft:detector_rail"},{"data":7,"id":28,"name":"minecraft:detector_rail"},{"data":8,"id":28,"name":"minecraft:detector_rail"},{"data":9,"id":28,"name":"minecraft:detector_rail"},{"data":10,"id":28,"name":"minecraft:detector_rail"},{"data":11,"id":28,"name":"minecraft:detector_rail"},{"data":12,"id":28,"name":"minecraft:detector_rail"},{"data":13,"id":28,"name":"minecraft:detector_rail"},{"data":14,"id":28,"name":"minecraft:detector_rail"},{"data":15,"id":28,"name":"minecraft:detector_rail"},{"data":0,"id":29,"name":"minecraft:sticky_piston"},{"data":1,"id":29,"name":"minecraft:sticky_piston"},{"data":2,"id":29,"name":"minecraft:sticky_piston"},{"data":3,"id":29,"name":"minecraft:sticky_piston"},{"data":4,"id":29,"name":"minecraft:sticky_piston"},{"data":5,"id":29,"name":"minecraft:sticky_piston"},{"data":6,"id":29,"name":"minecraft:sticky_piston"},{"data":7,"id":29,"name":"minecraft:sticky_piston"},{"data":0,"id":30,"name":"minecraft:web"},{"data":0,"id":31,"name":"minecraft:tallgrass"},{"data":1,"id":31,"name":"minecraft:tallgrass"},{"data":2,"id":31,"name":"minecraft:tallgrass"},{"data":3,"id":31,"name":"minecraft:tallgrass"},{"data":0,"id":32,"name":"minecraft:deadbush"},{"data":0,"id":33,"name":"minecraft:piston"},{"data":1,"id":33,"name":"minecraft:piston"},{"data":2,"id":33,"name":"minecraft:piston"},{"data":3,"id":33,"name":"minecraft:piston"},{"data":4,"id":33,"name":"minecraft:piston"},{"data":5,"id":33,"name":"minecraft:piston"},{"data":6,"id":33,"name":"minecraft:piston"},{"data":7,"id":33,"name":"minecraft:piston"},{"data":0,"id":34,"name":"minecraft:pistonArmCollision"},{"data":1,"id":34,"name":"minecraft:pistonArmCollision"},{"data":2,"id":34,"name":"minecraft:pistonArmCollision"},{"data":3,"id":34,"name":"minecraft:pistonArmCollision"},{"data":4,"id":34,"name":"minecraft:pistonArmCollision"},{"data":5,"id":34,"name":"minecraft:pistonArmCollision"},{"data":6,"id":34,"name":"minecraft:pistonArmCollision"},{"data":7,"id":34,"name":"minecraft:pistonArmCollision"},{"data":0,"id":35,"name":"minecraft:wool"},{"data":1,"id":35,"name":"minecraft:wool"},{"data":2,"id":35,"name":"minecraft:wool"},{"data":3,"id":35,"name":"minecraft:wool"},{"data":4,"id":35,"name":"minecraft:wool"},{"data":5,"id":35,"name":"minecraft:wool"},{"data":6,"id":35,"name":"minecraft:wool"},{"data":7,"id":35,"name":"minecraft:wool"},{"data":8,"id":35,"name":"minecraft:wool"},{"data":9,"id":35,"name":"minecraft:wool"},{"data":10,"id":35,"name":"minecraft:wool"},{"data":11,"id":35,"name":"minecraft:wool"},{"data":12,"id":35,"name":"minecraft:wool"},{"data":13,"id":35,"name":"minecraft:wool"},{"data":14,"id":35,"name":"minecraft:wool"},{"data":15,"id":35,"name":"minecraft:wool"},{"data":0,"id":36,"name":"minecraft:element_0"},{"data":1,"id":36,"name":"minecraft:element_0"},{"data":2,"id":36,"name":"minecraft:element_0"},{"data":3,"id":36,"name":"minecraft:element_0"},{"data":4,"id":36,"name":"minecraft:element_0"},{"data":5,"id":36,"name":"minecraft:element_0"},{"data":6,"id":36,"name":"minecraft:element_0"},{"data":7,"id":36,"name":"minecraft:element_0"},{"data":8,"id":36,"name":"minecraft:element_0"},{"data":9,"id":36,"name":"minecraft:element_0"},{"data":10,"id":36,"name":"minecraft:element_0"},{"data":11,"id":36,"name":"minecraft:element_0"},{"data":12,"id":36,"name":"minecraft:element_0"},{"data":13,"id":36,"name":"minecraft:element_0"},{"data":14,"id":36,"name":"minecraft:element_0"},{"data":15,"id":36,"name":"minecraft:element_0"},{"data":0,"id":37,"name":"minecraft:yellow_flower"},{"data":1,"id":37,"name":"minecraft:yellow_flower"},{"data":2,"id":37,"name":"minecraft:yellow_flower"},{"data":3,"id":37,"name":"minecraft:yellow_flower"},{"data":4,"id":37,"name":"minecraft:yellow_flower"},{"data":5,"id":37,"name":"minecraft:yellow_flower"},{"data":6,"id":37,"name":"minecraft:yellow_flower"},{"data":7,"id":37,"name":"minecraft:yellow_flower"},{"data":8,"id":37,"name":"minecraft:yellow_flower"},{"data":9,"id":37,"name":"minecraft:yellow_flower"},{"data":10,"id":37,"name":"minecraft:yellow_flower"},{"data":11,"id":37,"name":"minecraft:yellow_flower"},{"data":12,"id":37,"name":"minecraft:yellow_flower"},{"data":13,"id":37,"name":"minecraft:yellow_flower"},{"data":14,"id":37,"name":"minecraft:yellow_flower"},{"data":15,"id":37,"name":"minecraft:yellow_flower"},{"data":0,"id":38,"name":"minecraft:red_flower"},{"data":1,"id":38,"name":"minecraft:red_flower"},{"data":2,"id":38,"name":"minecraft:red_flower"},{"data":3,"id":38,"name":"minecraft:red_flower"},{"data":4,"id":38,"name":"minecraft:red_flower"},{"data":5,"id":38,"name":"minecraft:red_flower"},{"data":6,"id":38,"name":"minecraft:red_flower"},{"data":7,"id":38,"name":"minecraft:red_flower"},{"data":8,"id":38,"name":"minecraft:red_flower"},{"data":9,"id":38,"name":"minecraft:red_flower"},{"data":10,"id":38,"name":"minecraft:red_flower"},{"data":11,"id":38,"name":"minecraft:red_flower"},{"data":12,"id":38,"name":"minecraft:red_flower"},{"data":13,"id":38,"name":"minecraft:red_flower"},{"data":14,"id":38,"name":"minecraft:red_flower"},{"data":15,"id":38,"name":"minecraft:red_flower"},{"data":0,"id":39,"name":"minecraft:brown_mushroom"},{"data":0,"id":40,"name":"minecraft:red_mushroom"},{"data":0,"id":41,"name":"minecraft:gold_block"},{"data":0,"id":42,"name":"minecraft:iron_block"},{"data":0,"id":43,"name":"minecraft:double_stone_slab"},{"data":1,"id":43,"name":"minecraft:double_stone_slab"},{"data":2,"id":43,"name":"minecraft:double_stone_slab"},{"data":3,"id":43,"name":"minecraft:double_stone_slab"},{"data":4,"id":43,"name":"minecraft:double_stone_slab"},{"data":5,"id":43,"name":"minecraft:double_stone_slab"},{"data":6,"id":43,"name":"minecraft:double_stone_slab"},{"data":7,"id":43,"name":"minecraft:double_stone_slab"},{"data":8,"id":43,"name":"minecraft:double_stone_slab"},{"data":9,"id":43,"name":"minecraft:double_stone_slab"},{"data":10,"id":43,"name":"minecraft:double_stone_slab"},{"data":11,"id":43,"name":"minecraft:double_stone_slab"},{"data":12,"id":43,"name":"minecraft:double_stone_slab"},{"data":13,"id":43,"name":"minecraft:double_stone_slab"},{"data":14,"id":43,"name":"minecraft:double_stone_slab"},{"data":15,"id":43,"name":"minecraft:double_stone_slab"},{"data":0,"id":44,"name":"minecraft:stone_slab"},{"data":1,"id":44,"name":"minecraft:stone_slab"},{"data":2,"id":44,"name":"minecraft:stone_slab"},{"data":3,"id":44,"name":"minecraft:stone_slab"},{"data":4,"id":44,"name":"minecraft:stone_slab"},{"data":5,"id":44,"name":"minecraft:stone_slab"},{"data":6,"id":44,"name":"minecraft:stone_slab"},{"data":7,"id":44,"name":"minecraft:stone_slab"},{"data":8,"id":44,"name":"minecraft:stone_slab"},{"data":9,"id":44,"name":"minecraft:stone_slab"},{"data":10,"id":44,"name":"minecraft:stone_slab"},{"data":11,"id":44,"name":"minecraft:stone_slab"},{"data":12,"id":44,"name":"minecraft:stone_slab"},{"data":13,"id":44,"name":"minecraft:stone_slab"},{"data":14,"id":44,"name":"minecraft:stone_slab"},{"data":15,"id":44,"name":"minecraft:stone_slab"},{"data":0,"id":45,"name":"minecraft:brick_block"},{"data":0,"id":46,"name":"minecraft:tnt"},{"data":1,"id":46,"name":"minecraft:tnt"},{"data":2,"id":46,"name":"minecraft:tnt"},{"data":3,"id":46,"name":"minecraft:tnt"},{"data":0,"id":47,"name":"minecraft:bookshelf"},{"data":0,"id":48,"name":"minecraft:mossy_cobblestone"},{"data":0,"id":49,"name":"minecraft:obsidian"},{"data":0,"id":50,"name":"minecraft:torch"},{"data":1,"id":50,"name":"minecraft:torch"},{"data":2,"id":50,"name":"minecraft:torch"},{"data":3,"id":50,"name":"minecraft:torch"},{"data":4,"id":50,"name":"minecraft:torch"},{"data":5,"id":50,"name":"minecraft:torch"},{"data":6,"id":50,"name":"minecraft:torch"},{"data":7,"id":50,"name":"minecraft:torch"},{"data":0,"id":51,"name":"minecraft:fire"},{"data":1,"id":51,"name":"minecraft:fire"},{"data":2,"id":51,"name":"minecraft:fire"},{"data":3,"id":51,"name":"minecraft:fire"},{"data":4,"id":51,"name":"minecraft:fire"},{"data":5,"id":51,"name":"minecraft:fire"},{"data":6,"id":51,"name":"minecraft:fire"},{"data":7,"id":51,"name":"minecraft:fire"},{"data":8,"id":51,"name":"minecraft:fire"},{"data":9,"id":51,"name":"minecraft:fire"},{"data":10,"id":51,"name":"minecraft:fire"},{"data":11,"id":51,"name":"minecraft:fire"},{"data":12,"id":51,"name":"minecraft:fire"},{"data":13,"id":51,"name":"minecraft:fire"},{"data":14,"id":51,"name":"minecraft:fire"},{"data":15,"id":51,"name":"minecraft:fire"},{"data":0,"id":52,"name":"minecraft:mob_spawner"},{"data":0,"id":53,"name":"minecraft:oak_stairs"},{"data":1,"id":53,"name":"minecraft:oak_stairs"},{"data":2,"id":53,"name":"minecraft:oak_stairs"},{"data":3,"id":53,"name":"minecraft:oak_stairs"},{"data":4,"id":53,"name":"minecraft:oak_stairs"},{"data":5,"id":53,"name":"minecraft:oak_stairs"},{"data":6,"id":53,"name":"minecraft:oak_stairs"},{"data":7,"id":53,"name":"minecraft:oak_stairs"},{"data":0,"id":54,"name":"minecraft:chest"},{"data":1,"id":54,"name":"minecraft:chest"},{"data":2,"id":54,"name":"minecraft:chest"},{"data":3,"id":54,"name":"minecraft:chest"},{"data":4,"id":54,"name":"minecraft:chest"},{"data":5,"id":54,"name":"minecraft:chest"},{"data":6,"id":54,"name":"minecraft:chest"},{"data":7,"id":54,"name":"minecraft:chest"},{"data":0,"id":55,"name":"minecraft:redstone_wire"},{"data":1,"id":55,"name":"minecraft:redstone_wire"},{"data":2,"id":55,"name":"minecraft:redstone_wire"},{"data":3,"id":55,"name":"minecraft:redstone_wire"},{"data":4,"id":55,"name":"minecraft:redstone_wire"},{"data":5,"id":55,"name":"minecraft:redstone_wire"},{"data":6,"id":55,"name":"minecraft:redstone_wire"},{"data":7,"id":55,"name":"minecraft:redstone_wire"},{"data":8,"id":55,"name":"minecraft:redstone_wire"},{"data":9,"id":55,"name":"minecraft:redstone_wire"},{"data":10,"id":55,"name":"minecraft:redstone_wire"},{"data":11,"id":55,"name":"minecraft:redstone_wire"},{"data":12,"id":55,"name":"minecraft:redstone_wire"},{"data":13,"id":55,"name":"minecraft:redstone_wire"},{"data":14,"id":55,"name":"minecraft:redstone_wire"},{"data":15,"id":55,"name":"minecraft:redstone_wire"},{"data":0,"id":56,"name":"minecraft:diamond_ore"},{"data":0,"id":57,"name":"minecraft:diamond_block"},{"data":0,"id":58,"name":"minecraft:crafting_table"},{"data":0,"id":59,"name":"minecraft:wheat"},{"data":1,"id":59,"name":"minecraft:wheat"},{"data":2,"id":59,"name":"minecraft:wheat"},{"data":3,"id":59,"name":"minecraft:wheat"},{"data":4,"id":59,"name":"minecraft:wheat"},{"data":5,"id":59,"name":"minecraft:wheat"},{"data":6,"id":59,"name":"minecraft:wheat"},{"data":7,"id":59,"name":"minecraft:wheat"},{"data":0,"id":60,"name":"minecraft:farmland"},{"data":1,"id":60,"name":"minecraft:farmland"},{"data":2,"id":60,"name":"minecraft:farmland"},{"data":3,"id":60,"name":"minecraft:farmland"},{"data":4,"id":60,"name":"minecraft:farmland"},{"data":5,"id":60,"name":"minecraft:farmland"},{"data":6,"id":60,"name":"minecraft:farmland"},{"data":7,"id":60,"name":"minecraft:farmland"},{"data":0,"id":61,"name":"minecraft:furnace"},{"data":1,"id":61,"name":"minecraft:furnace"},{"data":2,"id":61,"name":"minecraft:furnace"},{"data":3,"id":61,"name":"minecraft:furnace"},{"data":4,"id":61,"name":"minecraft:furnace"},{"data":5,"id":61,"name":"minecraft:furnace"},{"data":6,"id":61,"name":"minecraft:furnace"},{"data":7,"id":61,"name":"minecraft:furnace"},{"data":0,"id":62,"name":"minecraft:lit_furnace"},{"data":1,"id":62,"name":"minecraft:lit_furnace"},{"data":2,"id":62,"name":"minecraft:lit_furnace"},{"data":3,"id":62,"name":"minecraft:lit_furnace"},{"data":4,"id":62,"name":"minecraft:lit_furnace"},{"data":5,"id":62,"name":"minecraft:lit_furnace"},{"data":6,"id":62,"name":"minecraft:lit_furnace"},{"data":7,"id":62,"name":"minecraft:lit_furnace"},{"data":0,"id":63,"name":"minecraft:standing_sign"},{"data":1,"id":63,"name":"minecraft:standing_sign"},{"data":2,"id":63,"name":"minecraft:standing_sign"},{"data":3,"id":63,"name":"minecraft:standing_sign"},{"data":4,"id":63,"name":"minecraft:standing_sign"},{"data":5,"id":63,"name":"minecraft:standing_sign"},{"data":6,"id":63,"name":"minecraft:standing_sign"},{"data":7,"id":63,"name":"minecraft:standing_sign"},{"data":8,"id":63,"name":"minecraft:standing_sign"},{"data":9,"id":63,"name":"minecraft:standing_sign"},{"data":10,"id":63,"name":"minecraft:standing_sign"},{"data":11,"id":63,"name":"minecraft:standing_sign"},{"data":12,"id":63,"name":"minecraft:standing_sign"},{"data":13,"id":63,"name":"minecraft:standing_sign"},{"data":14,"id":63,"name":"minecraft:standing_sign"},{"data":15,"id":63,"name":"minecraft:standing_sign"},{"data":0,"id":64,"name":"minecraft:wooden_door"},{"data":1,"id":64,"name":"minecraft:wooden_door"},{"data":2,"id":64,"name":"minecraft:wooden_door"},{"data":3,"id":64,"name":"minecraft:wooden_door"},{"data":4,"id":64,"name":"minecraft:wooden_door"},{"data":5,"id":64,"name":"minecraft:wooden_door"},{"data":6,"id":64,"name":"minecraft:wooden_door"},{"data":7,"id":64,"name":"minecraft:wooden_door"},{"data":8,"id":64,"name":"minecraft:wooden_door"},{"data":9,"id":64,"name":"minecraft:wooden_door"},{"data":10,"id":64,"name":"minecraft:wooden_door"},{"data":11,"id":64,"name":"minecraft:wooden_door"},{"data":12,"id":64,"name":"minecraft:wooden_door"},{"data":13,"id":64,"name":"minecraft:wooden_door"},{"data":14,"id":64,"name":"minecraft:wooden_door"},{"data":15,"id":64,"name":"minecraft:wooden_door"},{"data":0,"id":65,"name":"minecraft:ladder"},{"data":1,"id":65,"name":"minecraft:ladder"},{"data":2,"id":65,"name":"minecraft:ladder"},{"data":3,"id":65,"name":"minecraft:ladder"},{"data":4,"id":65,"name":"minecraft:ladder"},{"data":5,"id":65,"name":"minecraft:ladder"},{"data":6,"id":65,"name":"minecraft:ladder"},{"data":7,"id":65,"name":"minecraft:ladder"},{"data":0,"id":66,"name":"minecraft:rail"},{"data":1,"id":66,"name":"minecraft:rail"},{"data":2,"id":66,"name":"minecraft:rail"},{"data":3,"id":66,"name":"minecraft:rail"},{"data":4,"id":66,"name":"minecraft:rail"},{"data":5,"id":66,"name":"minecraft:rail"},{"data":6,"id":66,"name":"minecraft:rail"},{"data":7,"id":66,"name":"minecraft:rail"},{"data":8,"id":66,"name":"minecraft:rail"},{"data":9,"id":66,"name":"minecraft:rail"},{"data":10,"id":66,"name":"minecraft:rail"},{"data":11,"id":66,"name":"minecraft:rail"},{"data":12,"id":66,"name":"minecraft:rail"},{"data":13,"id":66,"name":"minecraft:rail"},{"data":14,"id":66,"name":"minecraft:rail"},{"data":15,"id":66,"name":"minecraft:rail"},{"data":0,"id":67,"name":"minecraft:stone_stairs"},{"data":1,"id":67,"name":"minecraft:stone_stairs"},{"data":2,"id":67,"name":"minecraft:stone_stairs"},{"data":3,"id":67,"name":"minecraft:stone_stairs"},{"data":4,"id":67,"name":"minecraft:stone_stairs"},{"data":5,"id":67,"name":"minecraft:stone_stairs"},{"data":6,"id":67,"name":"minecraft:stone_stairs"},{"data":7,"id":67,"name":"minecraft:stone_stairs"},{"data":0,"id":68,"name":"minecraft:wall_sign"},{"data":1,"id":68,"name":"minecraft:wall_sign"},{"data":2,"id":68,"name":"minecraft:wall_sign"},{"data":3,"id":68,"name":"minecraft:wall_sign"},{"data":4,"id":68,"name":"minecraft:wall_sign"},{"data":5,"id":68,"name":"minecraft:wall_sign"},{"data":6,"id":68,"name":"minecraft:wall_sign"},{"data":7,"id":68,"name":"minecraft:wall_sign"},{"data":0,"id":69,"name":"minecraft:lever"},{"data":1,"id":69,"name":"minecraft:lever"},{"data":2,"id":69,"name":"minecraft:lever"},{"data":3,"id":69,"name":"minecraft:lever"},{"data":4,"id":69,"name":"minecraft:lever"},{"data":5,"id":69,"name":"minecraft:lever"},{"data":6,"id":69,"name":"minecraft:lever"},{"data":7,"id":69,"name":"minecraft:lever"},{"data":8,"id":69,"name":"minecraft:lever"},{"data":9,"id":69,"name":"minecraft:lever"},{"data":10,"id":69,"name":"minecraft:lever"},{"data":11,"id":69,"name":"minecraft:lever"},{"data":12,"id":69,"name":"minecraft:lever"},{"data":13,"id":69,"name":"minecraft:lever"},{"data":14,"id":69,"name":"minecraft:lever"},{"data":15,"id":69,"name":"minecraft:lever"},{"data":0,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":1,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":2,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":3,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":4,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":5,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":6,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":7,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":8,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":9,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":10,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":11,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":12,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":13,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":14,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":15,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":0,"id":71,"name":"minecraft:iron_door"},{"data":1,"id":71,"name":"minecraft:iron_door"},{"data":2,"id":71,"name":"minecraft:iron_door"},{"data":3,"id":71,"name":"minecraft:iron_door"},{"data":4,"id":71,"name":"minecraft:iron_door"},{"data":5,"id":71,"name":"minecraft:iron_door"},{"data":6,"id":71,"name":"minecraft:iron_door"},{"data":7,"id":71,"name":"minecraft:iron_door"},{"data":8,"id":71,"name":"minecraft:iron_door"},{"data":9,"id":71,"name":"minecraft:iron_door"},{"data":10,"id":71,"name":"minecraft:iron_door"},{"data":11,"id":71,"name":"minecraft:iron_door"},{"data":12,"id":71,"name":"minecraft:iron_door"},{"data":13,"id":71,"name":"minecraft:iron_door"},{"data":14,"id":71,"name":"minecraft:iron_door"},{"data":15,"id":71,"name":"minecraft:iron_door"},{"data":0,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":1,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":2,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":3,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":4,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":5,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":6,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":7,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":8,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":9,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":10,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":11,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":12,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":13,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":14,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":15,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":0,"id":73,"name":"minecraft:redstone_ore"},{"data":0,"id":74,"name":"minecraft:lit_redstone_ore"},{"data":0,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":1,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":2,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":3,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":4,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":5,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":6,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":7,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":0,"id":76,"name":"minecraft:redstone_torch"},{"data":1,"id":76,"name":"minecraft:redstone_torch"},{"data":2,"id":76,"name":"minecraft:redstone_torch"},{"data":3,"id":76,"name":"minecraft:redstone_torch"},{"data":4,"id":76,"name":"minecraft:redstone_torch"},{"data":5,"id":76,"name":"minecraft:redstone_torch"},{"data":6,"id":76,"name":"minecraft:redstone_torch"},{"data":7,"id":76,"name":"minecraft:redstone_torch"},{"data":0,"id":77,"name":"minecraft:stone_button"},{"data":1,"id":77,"name":"minecraft:stone_button"},{"data":2,"id":77,"name":"minecraft:stone_button"},{"data":3,"id":77,"name":"minecraft:stone_button"},{"data":4,"id":77,"name":"minecraft:stone_button"},{"data":5,"id":77,"name":"minecraft:stone_button"},{"data":6,"id":77,"name":"minecraft:stone_button"},{"data":7,"id":77,"name":"minecraft:stone_button"},{"data":8,"id":77,"name":"minecraft:stone_button"},{"data":9,"id":77,"name":"minecraft:stone_button"},{"data":10,"id":77,"name":"minecraft:stone_button"},{"data":11,"id":77,"name":"minecraft:stone_button"},{"data":12,"id":77,"name":"minecraft:stone_button"},{"data":13,"id":77,"name":"minecraft:stone_button"},{"data":14,"id":77,"name":"minecraft:stone_button"},{"data":15,"id":77,"name":"minecraft:stone_button"},{"data":0,"id":78,"name":"minecraft:snow_layer"},{"data":1,"id":78,"name":"minecraft:snow_layer"},{"data":2,"id":78,"name":"minecraft:snow_layer"},{"data":3,"id":78,"name":"minecraft:snow_layer"},{"data":4,"id":78,"name":"minecraft:snow_layer"},{"data":5,"id":78,"name":"minecraft:snow_layer"},{"data":6,"id":78,"name":"minecraft:snow_layer"},{"data":7,"id":78,"name":"minecraft:snow_layer"},{"data":8,"id":78,"name":"minecraft:snow_layer"},{"data":9,"id":78,"name":"minecraft:snow_layer"},{"data":10,"id":78,"name":"minecraft:snow_layer"},{"data":11,"id":78,"name":"minecraft:snow_layer"},{"data":12,"id":78,"name":"minecraft:snow_layer"},{"data":13,"id":78,"name":"minecraft:snow_layer"},{"data":14,"id":78,"name":"minecraft:snow_layer"},{"data":15,"id":78,"name":"minecraft:snow_layer"},{"data":0,"id":79,"name":"minecraft:ice"},{"data":0,"id":80,"name":"minecraft:snow"},{"data":0,"id":81,"name":"minecraft:cactus"},{"data":1,"id":81,"name":"minecraft:cactus"},{"data":2,"id":81,"name":"minecraft:cactus"},{"data":3,"id":81,"name":"minecraft:cactus"},{"data":4,"id":81,"name":"minecraft:cactus"},{"data":5,"id":81,"name":"minecraft:cactus"},{"data":6,"id":81,"name":"minecraft:cactus"},{"data":7,"id":81,"name":"minecraft:cactus"},{"data":8,"id":81,"name":"minecraft:cactus"},{"data":9,"id":81,"name":"minecraft:cactus"},{"data":10,"id":81,"name":"minecraft:cactus"},{"data":11,"id":81,"name":"minecraft:cactus"},{"data":12,"id":81,"name":"minecraft:cactus"},{"data":13,"id":81,"name":"minecraft:cactus"},{"data":14,"id":81,"name":"minecraft:cactus"},{"data":15,"id":81,"name":"minecraft:cactus"},{"data":0,"id":82,"name":"minecraft:clay"},{"data":0,"id":83,"name":"minecraft:reeds"},{"data":1,"id":83,"name":"minecraft:reeds"},{"data":2,"id":83,"name":"minecraft:reeds"},{"data":3,"id":83,"name":"minecraft:reeds"},{"data":4,"id":83,"name":"minecraft:reeds"},{"data":5,"id":83,"name":"minecraft:reeds"},{"data":6,"id":83,"name":"minecraft:reeds"},{"data":7,"id":83,"name":"minecraft:reeds"},{"data":8,"id":83,"name":"minecraft:reeds"},{"data":9,"id":83,"name":"minecraft:reeds"},{"data":10,"id":83,"name":"minecraft:reeds"},{"data":11,"id":83,"name":"minecraft:reeds"},{"data":12,"id":83,"name":"minecraft:reeds"},{"data":13,"id":83,"name":"minecraft:reeds"},{"data":14,"id":83,"name":"minecraft:reeds"},{"data":15,"id":83,"name":"minecraft:reeds"},{"data":0,"id":84,"name":"minecraft:jukebox"},{"data":0,"id":85,"name":"minecraft:fence"},{"data":1,"id":85,"name":"minecraft:fence"},{"data":2,"id":85,"name":"minecraft:fence"},{"data":3,"id":85,"name":"minecraft:fence"},{"data":4,"id":85,"name":"minecraft:fence"},{"data":5,"id":85,"name":"minecraft:fence"},{"data":6,"id":85,"name":"minecraft:fence"},{"data":7,"id":85,"name":"minecraft:fence"},{"data":0,"id":86,"name":"minecraft:pumpkin"},{"data":1,"id":86,"name":"minecraft:pumpkin"},{"data":2,"id":86,"name":"minecraft:pumpkin"},{"data":3,"id":86,"name":"minecraft:pumpkin"},{"data":0,"id":87,"name":"minecraft:netherrack"},{"data":0,"id":88,"name":"minecraft:soul_sand"},{"data":0,"id":89,"name":"minecraft:glowstone"},{"data":0,"id":90,"name":"minecraft:portal"},{"data":1,"id":90,"name":"minecraft:portal"},{"data":2,"id":90,"name":"minecraft:portal"},{"data":3,"id":90,"name":"minecraft:portal"},{"data":0,"id":91,"name":"minecraft:lit_pumpkin"},{"data":1,"id":91,"name":"minecraft:lit_pumpkin"},{"data":2,"id":91,"name":"minecraft:lit_pumpkin"},{"data":3,"id":91,"name":"minecraft:lit_pumpkin"},{"data":0,"id":92,"name":"minecraft:cake"},{"data":1,"id":92,"name":"minecraft:cake"},{"data":2,"id":92,"name":"minecraft:cake"},{"data":3,"id":92,"name":"minecraft:cake"},{"data":4,"id":92,"name":"minecraft:cake"},{"data":5,"id":92,"name":"minecraft:cake"},{"data":6,"id":92,"name":"minecraft:cake"},{"data":7,"id":92,"name":"minecraft:cake"},{"data":0,"id":93,"name":"minecraft:unpowered_repeater"},{"data":1,"id":93,"name":"minecraft:unpowered_repeater"},{"data":2,"id":93,"name":"minecraft:unpowered_repeater"},{"data":3,"id":93,"name":"minecraft:unpowered_repeater"},{"data":4,"id":93,"name":"minecraft:unpowered_repeater"},{"data":5,"id":93,"name":"minecraft:unpowered_repeater"},{"data":6,"id":93,"name":"minecraft:unpowered_repeater"},{"data":7,"id":93,"name":"minecraft:unpowered_repeater"},{"data":8,"id":93,"name":"minecraft:unpowered_repeater"},{"data":9,"id":93,"name":"minecraft:unpowered_repeater"},{"data":10,"id":93,"name":"minecraft:unpowered_repeater"},{"data":11,"id":93,"name":"minecraft:unpowered_repeater"},{"data":12,"id":93,"name":"minecraft:unpowered_repeater"},{"data":13,"id":93,"name":"minecraft:unpowered_repeater"},{"data":14,"id":93,"name":"minecraft:unpowered_repeater"},{"data":15,"id":93,"name":"minecraft:unpowered_repeater"},{"data":0,"id":94,"name":"minecraft:powered_repeater"},{"data":1,"id":94,"name":"minecraft:powered_repeater"},{"data":2,"id":94,"name":"minecraft:powered_repeater"},{"data":3,"id":94,"name":"minecraft:powered_repeater"},{"data":4,"id":94,"name":"minecraft:powered_repeater"},{"data":5,"id":94,"name":"minecraft:powered_repeater"},{"data":6,"id":94,"name":"minecraft:powered_repeater"},{"data":7,"id":94,"name":"minecraft:powered_repeater"},{"data":8,"id":94,"name":"minecraft:powered_repeater"},{"data":9,"id":94,"name":"minecraft:powered_repeater"},{"data":10,"id":94,"name":"minecraft:powered_repeater"},{"data":11,"id":94,"name":"minecraft:powered_repeater"},{"data":12,"id":94,"name":"minecraft:powered_repeater"},{"data":13,"id":94,"name":"minecraft:powered_repeater"},{"data":14,"id":94,"name":"minecraft:powered_repeater"},{"data":15,"id":94,"name":"minecraft:powered_repeater"},{"data":0,"id":95,"name":"minecraft:invisibleBedrock"},{"data":0,"id":96,"name":"minecraft:trapdoor"},{"data":1,"id":96,"name":"minecraft:trapdoor"},{"data":2,"id":96,"name":"minecraft:trapdoor"},{"data":3,"id":96,"name":"minecraft:trapdoor"},{"data":4,"id":96,"name":"minecraft:trapdoor"},{"data":5,"id":96,"name":"minecraft:trapdoor"},{"data":6,"id":96,"name":"minecraft:trapdoor"},{"data":7,"id":96,"name":"minecraft:trapdoor"},{"data":8,"id":96,"name":"minecraft:trapdoor"},{"data":9,"id":96,"name":"minecraft:trapdoor"},{"data":10,"id":96,"name":"minecraft:trapdoor"},{"data":11,"id":96,"name":"minecraft:trapdoor"},{"data":12,"id":96,"name":"minecraft:trapdoor"},{"data":13,"id":96,"name":"minecraft:trapdoor"},{"data":14,"id":96,"name":"minecraft:trapdoor"},{"data":15,"id":96,"name":"minecraft:trapdoor"},{"data":0,"id":97,"name":"minecraft:monster_egg"},{"data":1,"id":97,"name":"minecraft:monster_egg"},{"data":2,"id":97,"name":"minecraft:monster_egg"},{"data":3,"id":97,"name":"minecraft:monster_egg"},{"data":4,"id":97,"name":"minecraft:monster_egg"},{"data":5,"id":97,"name":"minecraft:monster_egg"},{"data":6,"id":97,"name":"minecraft:monster_egg"},{"data":7,"id":97,"name":"minecraft:monster_egg"},{"data":0,"id":98,"name":"minecraft:stonebrick"},{"data":1,"id":98,"name":"minecraft:stonebrick"},{"data":2,"id":98,"name":"minecraft:stonebrick"},{"data":3,"id":98,"name":"minecraft:stonebrick"},{"data":4,"id":98,"name":"minecraft:stonebrick"},{"data":5,"id":98,"name":"minecraft:stonebrick"},{"data":6,"id":98,"name":"minecraft:stonebrick"},{"data":7,"id":98,"name":"minecraft:stonebrick"},{"data":0,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":1,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":2,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":3,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":4,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":5,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":6,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":7,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":8,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":9,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":10,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":11,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":12,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":13,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":14,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":15,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":0,"id":100,"name":"minecraft:red_mushroom_block"},{"data":1,"id":100,"name":"minecraft:red_mushroom_block"},{"data":2,"id":100,"name":"minecraft:red_mushroom_block"},{"data":3,"id":100,"name":"minecraft:red_mushroom_block"},{"data":4,"id":100,"name":"minecraft:red_mushroom_block"},{"data":5,"id":100,"name":"minecraft:red_mushroom_block"},{"data":6,"id":100,"name":"minecraft:red_mushroom_block"},{"data":7,"id":100,"name":"minecraft:red_mushroom_block"},{"data":8,"id":100,"name":"minecraft:red_mushroom_block"},{"data":9,"id":100,"name":"minecraft:red_mushroom_block"},{"data":10,"id":100,"name":"minecraft:red_mushroom_block"},{"data":11,"id":100,"name":"minecraft:red_mushroom_block"},{"data":12,"id":100,"name":"minecraft:red_mushroom_block"},{"data":13,"id":100,"name":"minecraft:red_mushroom_block"},{"data":14,"id":100,"name":"minecraft:red_mushroom_block"},{"data":15,"id":100,"name":"minecraft:red_mushroom_block"},{"data":0,"id":101,"name":"minecraft:iron_bars"},{"data":0,"id":102,"name":"minecraft:glass_pane"},{"data":0,"id":103,"name":"minecraft:melon_block"},{"data":0,"id":104,"name":"minecraft:pumpkin_stem"},{"data":1,"id":104,"name":"minecraft:pumpkin_stem"},{"data":2,"id":104,"name":"minecraft:pumpkin_stem"},{"data":3,"id":104,"name":"minecraft:pumpkin_stem"},{"data":4,"id":104,"name":"minecraft:pumpkin_stem"},{"data":5,"id":104,"name":"minecraft:pumpkin_stem"},{"data":6,"id":104,"name":"minecraft:pumpkin_stem"},{"data":7,"id":104,"name":"minecraft:pumpkin_stem"},{"data":0,"id":105,"name":"minecraft:melon_stem"},{"data":1,"id":105,"name":"minecraft:melon_stem"},{"data":2,"id":105,"name":"minecraft:melon_stem"},{"data":3,"id":105,"name":"minecraft:melon_stem"},{"data":4,"id":105,"name":"minecraft:melon_stem"},{"data":5,"id":105,"name":"minecraft:melon_stem"},{"data":6,"id":105,"name":"minecraft:melon_stem"},{"data":7,"id":105,"name":"minecraft:melon_stem"},{"data":0,"id":106,"name":"minecraft:vine"},{"data":1,"id":106,"name":"minecraft:vine"},{"data":2,"id":106,"name":"minecraft:vine"},{"data":3,"id":106,"name":"minecraft:vine"},{"data":4,"id":106,"name":"minecraft:vine"},{"data":5,"id":106,"name":"minecraft:vine"},{"data":6,"id":106,"name":"minecraft:vine"},{"data":7,"id":106,"name":"minecraft:vine"},{"data":8,"id":106,"name":"minecraft:vine"},{"data":9,"id":106,"name":"minecraft:vine"},{"data":10,"id":106,"name":"minecraft:vine"},{"data":11,"id":106,"name":"minecraft:vine"},{"data":12,"id":106,"name":"minecraft:vine"},{"data":13,"id":106,"name":"minecraft:vine"},{"data":14,"id":106,"name":"minecraft:vine"},{"data":15,"id":106,"name":"minecraft:vine"},{"data":0,"id":107,"name":"minecraft:fence_gate"},{"data":1,"id":107,"name":"minecraft:fence_gate"},{"data":2,"id":107,"name":"minecraft:fence_gate"},{"data":3,"id":107,"name":"minecraft:fence_gate"},{"data":4,"id":107,"name":"minecraft:fence_gate"},{"data":5,"id":107,"name":"minecraft:fence_gate"},{"data":6,"id":107,"name":"minecraft:fence_gate"},{"data":7,"id":107,"name":"minecraft:fence_gate"},{"data":8,"id":107,"name":"minecraft:fence_gate"},{"data":9,"id":107,"name":"minecraft:fence_gate"},{"data":10,"id":107,"name":"minecraft:fence_gate"},{"data":11,"id":107,"name":"minecraft:fence_gate"},{"data":12,"id":107,"name":"minecraft:fence_gate"},{"data":13,"id":107,"name":"minecraft:fence_gate"},{"data":14,"id":107,"name":"minecraft:fence_gate"},{"data":15,"id":107,"name":"minecraft:fence_gate"},{"data":0,"id":108,"name":"minecraft:brick_stairs"},{"data":1,"id":108,"name":"minecraft:brick_stairs"},{"data":2,"id":108,"name":"minecraft:brick_stairs"},{"data":3,"id":108,"name":"minecraft:brick_stairs"},{"data":4,"id":108,"name":"minecraft:brick_stairs"},{"data":5,"id":108,"name":"minecraft:brick_stairs"},{"data":6,"id":108,"name":"minecraft:brick_stairs"},{"data":7,"id":108,"name":"minecraft:brick_stairs"},{"data":0,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":1,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":2,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":3,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":4,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":5,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":6,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":7,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":0,"id":110,"name":"minecraft:mycelium"},{"data":0,"id":111,"name":"minecraft:waterlily"},{"data":0,"id":112,"name":"minecraft:nether_brick"},{"data":0,"id":113,"name":"minecraft:nether_brick_fence"},{"data":1,"id":113,"name":"minecraft:nether_brick_fence"},{"data":2,"id":113,"name":"minecraft:nether_brick_fence"},{"data":3,"id":113,"name":"minecraft:nether_brick_fence"},{"data":4,"id":113,"name":"minecraft:nether_brick_fence"},{"data":5,"id":113,"name":"minecraft:nether_brick_fence"},{"data":6,"id":113,"name":"minecraft:nether_brick_fence"},{"data":7,"id":113,"name":"minecraft:nether_brick_fence"},{"data":0,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":1,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":2,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":3,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":4,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":5,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":6,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":7,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":0,"id":115,"name":"minecraft:nether_wart"},{"data":1,"id":115,"name":"minecraft:nether_wart"},{"data":2,"id":115,"name":"minecraft:nether_wart"},{"data":3,"id":115,"name":"minecraft:nether_wart"},{"data":0,"id":116,"name":"minecraft:enchanting_table"},{"data":0,"id":117,"name":"minecraft:brewing_stand"},{"data":1,"id":117,"name":"minecraft:brewing_stand"},{"data":2,"id":117,"name":"minecraft:brewing_stand"},{"data":3,"id":117,"name":"minecraft:brewing_stand"},{"data":4,"id":117,"name":"minecraft:brewing_stand"},{"data":5,"id":117,"name":"minecraft:brewing_stand"},{"data":6,"id":117,"name":"minecraft:brewing_stand"},{"data":7,"id":117,"name":"minecraft:brewing_stand"},{"data":0,"id":118,"name":"minecraft:cauldron"},{"data":1,"id":118,"name":"minecraft:cauldron"},{"data":2,"id":118,"name":"minecraft:cauldron"},{"data":3,"id":118,"name":"minecraft:cauldron"},{"data":4,"id":118,"name":"minecraft:cauldron"},{"data":5,"id":118,"name":"minecraft:cauldron"},{"data":6,"id":118,"name":"minecraft:cauldron"},{"data":7,"id":118,"name":"minecraft:cauldron"},{"data":0,"id":119,"name":"minecraft:end_portal"},{"data":0,"id":120,"name":"minecraft:end_portal_frame"},{"data":1,"id":120,"name":"minecraft:end_portal_frame"},{"data":2,"id":120,"name":"minecraft:end_portal_frame"},{"data":3,"id":120,"name":"minecraft:end_portal_frame"},{"data":4,"id":120,"name":"minecraft:end_portal_frame"},{"data":5,"id":120,"name":"minecraft:end_portal_frame"},{"data":6,"id":120,"name":"minecraft:end_portal_frame"},{"data":7,"id":120,"name":"minecraft:end_portal_frame"},{"data":0,"id":121,"name":"minecraft:end_stone"},{"data":0,"id":122,"name":"minecraft:dragon_egg"},{"data":0,"id":123,"name":"minecraft:redstone_lamp"},{"data":0,"id":124,"name":"minecraft:lit_redstone_lamp"},{"data":0,"id":125,"name":"minecraft:dropper"},{"data":1,"id":125,"name":"minecraft:dropper"},{"data":2,"id":125,"name":"minecraft:dropper"},{"data":3,"id":125,"name":"minecraft:dropper"},{"data":4,"id":125,"name":"minecraft:dropper"},{"data":5,"id":125,"name":"minecraft:dropper"},{"data":6,"id":125,"name":"minecraft:dropper"},{"data":7,"id":125,"name":"minecraft:dropper"},{"data":8,"id":125,"name":"minecraft:dropper"},{"data":9,"id":125,"name":"minecraft:dropper"},{"data":10,"id":125,"name":"minecraft:dropper"},{"data":11,"id":125,"name":"minecraft:dropper"},{"data":12,"id":125,"name":"minecraft:dropper"},{"data":13,"id":125,"name":"minecraft:dropper"},{"data":14,"id":125,"name":"minecraft:dropper"},{"data":15,"id":125,"name":"minecraft:dropper"},{"data":0,"id":126,"name":"minecraft:activator_rail"},{"data":1,"id":126,"name":"minecraft:activator_rail"},{"data":2,"id":126,"name":"minecraft:activator_rail"},{"data":3,"id":126,"name":"minecraft:activator_rail"},{"data":4,"id":126,"name":"minecraft:activator_rail"},{"data":5,"id":126,"name":"minecraft:activator_rail"},{"data":6,"id":126,"name":"minecraft:activator_rail"},{"data":7,"id":126,"name":"minecraft:activator_rail"},{"data":8,"id":126,"name":"minecraft:activator_rail"},{"data":9,"id":126,"name":"minecraft:activator_rail"},{"data":10,"id":126,"name":"minecraft:activator_rail"},{"data":11,"id":126,"name":"minecraft:activator_rail"},{"data":12,"id":126,"name":"minecraft:activator_rail"},{"data":13,"id":126,"name":"minecraft:activator_rail"},{"data":14,"id":126,"name":"minecraft:activator_rail"},{"data":15,"id":126,"name":"minecraft:activator_rail"},{"data":0,"id":127,"name":"minecraft:cocoa"},{"data":1,"id":127,"name":"minecraft:cocoa"},{"data":2,"id":127,"name":"minecraft:cocoa"},{"data":3,"id":127,"name":"minecraft:cocoa"},{"data":4,"id":127,"name":"minecraft:cocoa"},{"data":5,"id":127,"name":"minecraft:cocoa"},{"data":6,"id":127,"name":"minecraft:cocoa"},{"data":7,"id":127,"name":"minecraft:cocoa"},{"data":8,"id":127,"name":"minecraft:cocoa"},{"data":9,"id":127,"name":"minecraft:cocoa"},{"data":10,"id":127,"name":"minecraft:cocoa"},{"data":11,"id":127,"name":"minecraft:cocoa"},{"data":12,"id":127,"name":"minecraft:cocoa"},{"data":13,"id":127,"name":"minecraft:cocoa"},{"data":14,"id":127,"name":"minecraft:cocoa"},{"data":15,"id":127,"name":"minecraft:cocoa"},{"data":0,"id":128,"name":"minecraft:sandstone_stairs"},{"data":1,"id":128,"name":"minecraft:sandstone_stairs"},{"data":2,"id":128,"name":"minecraft:sandstone_stairs"},{"data":3,"id":128,"name":"minecraft:sandstone_stairs"},{"data":4,"id":128,"name":"minecraft:sandstone_stairs"},{"data":5,"id":128,"name":"minecraft:sandstone_stairs"},{"data":6,"id":128,"name":"minecraft:sandstone_stairs"},{"data":7,"id":128,"name":"minecraft:sandstone_stairs"},{"data":0,"id":129,"name":"minecraft:emerald_ore"},{"data":0,"id":130,"name":"minecraft:ender_chest"},{"data":1,"id":130,"name":"minecraft:ender_chest"},{"data":2,"id":130,"name":"minecraft:ender_chest"},{"data":3,"id":130,"name":"minecraft:ender_chest"},{"data":4,"id":130,"name":"minecraft:ender_chest"},{"data":5,"id":130,"name":"minecraft:ender_chest"},{"data":6,"id":130,"name":"minecraft:ender_chest"},{"data":7,"id":130,"name":"minecraft:ender_chest"},{"data":0,"id":131,"name":"minecraft:tripwire_hook"},{"data":1,"id":131,"name":"minecraft:tripwire_hook"},{"data":2,"id":131,"name":"minecraft:tripwire_hook"},{"data":3,"id":131,"name":"minecraft:tripwire_hook"},{"data":4,"id":131,"name":"minecraft:tripwire_hook"},{"data":5,"id":131,"name":"minecraft:tripwire_hook"},{"data":6,"id":131,"name":"minecraft:tripwire_hook"},{"data":7,"id":131,"name":"minecraft:tripwire_hook"},{"data":8,"id":131,"name":"minecraft:tripwire_hook"},{"data":9,"id":131,"name":"minecraft:tripwire_hook"},{"data":10,"id":131,"name":"minecraft:tripwire_hook"},{"data":11,"id":131,"name":"minecraft:tripwire_hook"},{"data":12,"id":131,"name":"minecraft:tripwire_hook"},{"data":13,"id":131,"name":"minecraft:tripwire_hook"},{"data":14,"id":131,"name":"minecraft:tripwire_hook"},{"data":15,"id":131,"name":"minecraft:tripwire_hook"},{"data":0,"id":132,"name":"minecraft:tripWire"},{"data":1,"id":132,"name":"minecraft:tripWire"},{"data":2,"id":132,"name":"minecraft:tripWire"},{"data":3,"id":132,"name":"minecraft:tripWire"},{"data":4,"id":132,"name":"minecraft:tripWire"},{"data":5,"id":132,"name":"minecraft:tripWire"},{"data":6,"id":132,"name":"minecraft:tripWire"},{"data":7,"id":132,"name":"minecraft:tripWire"},{"data":8,"id":132,"name":"minecraft:tripWire"},{"data":9,"id":132,"name":"minecraft:tripWire"},{"data":10,"id":132,"name":"minecraft:tripWire"},{"data":11,"id":132,"name":"minecraft:tripWire"},{"data":12,"id":132,"name":"minecraft:tripWire"},{"data":13,"id":132,"name":"minecraft:tripWire"},{"data":14,"id":132,"name":"minecraft:tripWire"},{"data":15,"id":132,"name":"minecraft:tripWire"},{"data":0,"id":133,"name":"minecraft:emerald_block"},{"data":0,"id":134,"name":"minecraft:spruce_stairs"},{"data":1,"id":134,"name":"minecraft:spruce_stairs"},{"data":2,"id":134,"name":"minecraft:spruce_stairs"},{"data":3,"id":134,"name":"minecraft:spruce_stairs"},{"data":4,"id":134,"name":"minecraft:spruce_stairs"},{"data":5,"id":134,"name":"minecraft:spruce_stairs"},{"data":6,"id":134,"name":"minecraft:spruce_stairs"},{"data":7,"id":134,"name":"minecraft:spruce_stairs"},{"data":0,"id":135,"name":"minecraft:birch_stairs"},{"data":1,"id":135,"name":"minecraft:birch_stairs"},{"data":2,"id":135,"name":"minecraft:birch_stairs"},{"data":3,"id":135,"name":"minecraft:birch_stairs"},{"data":4,"id":135,"name":"minecraft:birch_stairs"},{"data":5,"id":135,"name":"minecraft:birch_stairs"},{"data":6,"id":135,"name":"minecraft:birch_stairs"},{"data":7,"id":135,"name":"minecraft:birch_stairs"},{"data":0,"id":136,"name":"minecraft:jungle_stairs"},{"data":1,"id":136,"name":"minecraft:jungle_stairs"},{"data":2,"id":136,"name":"minecraft:jungle_stairs"},{"data":3,"id":136,"name":"minecraft:jungle_stairs"},{"data":4,"id":136,"name":"minecraft:jungle_stairs"},{"data":5,"id":136,"name":"minecraft:jungle_stairs"},{"data":6,"id":136,"name":"minecraft:jungle_stairs"},{"data":7,"id":136,"name":"minecraft:jungle_stairs"},{"data":0,"id":137,"name":"minecraft:command_block"},{"data":1,"id":137,"name":"minecraft:command_block"},{"data":2,"id":137,"name":"minecraft:command_block"},{"data":3,"id":137,"name":"minecraft:command_block"},{"data":4,"id":137,"name":"minecraft:command_block"},{"data":5,"id":137,"name":"minecraft:command_block"},{"data":6,"id":137,"name":"minecraft:command_block"},{"data":7,"id":137,"name":"minecraft:command_block"},{"data":8,"id":137,"name":"minecraft:command_block"},{"data":9,"id":137,"name":"minecraft:command_block"},{"data":10,"id":137,"name":"minecraft:command_block"},{"data":11,"id":137,"name":"minecraft:command_block"},{"data":12,"id":137,"name":"minecraft:command_block"},{"data":13,"id":137,"name":"minecraft:command_block"},{"data":14,"id":137,"name":"minecraft:command_block"},{"data":15,"id":137,"name":"minecraft:command_block"},{"data":0,"id":138,"name":"minecraft:beacon"},{"data":0,"id":139,"name":"minecraft:cobblestone_wall"},{"data":1,"id":139,"name":"minecraft:cobblestone_wall"},{"data":0,"id":140,"name":"minecraft:flower_pot"},{"data":1,"id":140,"name":"minecraft:flower_pot"},{"data":0,"id":141,"name":"minecraft:carrots"},{"data":1,"id":141,"name":"minecraft:carrots"},{"data":2,"id":141,"name":"minecraft:carrots"},{"data":3,"id":141,"name":"minecraft:carrots"},{"data":4,"id":141,"name":"minecraft:carrots"},{"data":5,"id":141,"name":"minecraft:carrots"},{"data":6,"id":141,"name":"minecraft:carrots"},{"data":7,"id":141,"name":"minecraft:carrots"},{"data":0,"id":142,"name":"minecraft:potatoes"},{"data":1,"id":142,"name":"minecraft:potatoes"},{"data":2,"id":142,"name":"minecraft:potatoes"},{"data":3,"id":142,"name":"minecraft:potatoes"},{"data":4,"id":142,"name":"minecraft:potatoes"},{"data":5,"id":142,"name":"minecraft:potatoes"},{"data":6,"id":142,"name":"minecraft:potatoes"},{"data":7,"id":142,"name":"minecraft:potatoes"},{"data":0,"id":143,"name":"minecraft:wooden_button"},{"data":1,"id":143,"name":"minecraft:wooden_button"},{"data":2,"id":143,"name":"minecraft:wooden_button"},{"data":3,"id":143,"name":"minecraft:wooden_button"},{"data":4,"id":143,"name":"minecraft:wooden_button"},{"data":5,"id":143,"name":"minecraft:wooden_button"},{"data":6,"id":143,"name":"minecraft:wooden_button"},{"data":7,"id":143,"name":"minecraft:wooden_button"},{"data":8,"id":143,"name":"minecraft:wooden_button"},{"data":9,"id":143,"name":"minecraft:wooden_button"},{"data":10,"id":143,"name":"minecraft:wooden_button"},{"data":11,"id":143,"name":"minecraft:wooden_button"},{"data":12,"id":143,"name":"minecraft:wooden_button"},{"data":13,"id":143,"name":"minecraft:wooden_button"},{"data":14,"id":143,"name":"minecraft:wooden_button"},{"data":15,"id":143,"name":"minecraft:wooden_button"},{"data":0,"id":144,"name":"minecraft:skull"},{"data":1,"id":144,"name":"minecraft:skull"},{"data":2,"id":144,"name":"minecraft:skull"},{"data":3,"id":144,"name":"minecraft:skull"},{"data":4,"id":144,"name":"minecraft:skull"},{"data":5,"id":144,"name":"minecraft:skull"},{"data":6,"id":144,"name":"minecraft:skull"},{"data":7,"id":144,"name":"minecraft:skull"},{"data":8,"id":144,"name":"minecraft:skull"},{"data":9,"id":144,"name":"minecraft:skull"},{"data":10,"id":144,"name":"minecraft:skull"},{"data":11,"id":144,"name":"minecraft:skull"},{"data":12,"id":144,"name":"minecraft:skull"},{"data":13,"id":144,"name":"minecraft:skull"},{"data":14,"id":144,"name":"minecraft:skull"},{"data":15,"id":144,"name":"minecraft:skull"},{"data":0,"id":145,"name":"minecraft:anvil"},{"data":1,"id":145,"name":"minecraft:anvil"},{"data":2,"id":145,"name":"minecraft:anvil"},{"data":3,"id":145,"name":"minecraft:anvil"},{"data":4,"id":145,"name":"minecraft:anvil"},{"data":5,"id":145,"name":"minecraft:anvil"},{"data":6,"id":145,"name":"minecraft:anvil"},{"data":7,"id":145,"name":"minecraft:anvil"},{"data":8,"id":145,"name":"minecraft:anvil"},{"data":9,"id":145,"name":"minecraft:anvil"},{"data":10,"id":145,"name":"minecraft:anvil"},{"data":11,"id":145,"name":"minecraft:anvil"},{"data":12,"id":145,"name":"minecraft:anvil"},{"data":13,"id":145,"name":"minecraft:anvil"},{"data":14,"id":145,"name":"minecraft:anvil"},{"data":15,"id":145,"name":"minecraft:anvil"},{"data":0,"id":146,"name":"minecraft:trapped_chest"},{"data":1,"id":146,"name":"minecraft:trapped_chest"},{"data":2,"id":146,"name":"minecraft:trapped_chest"},{"data":3,"id":146,"name":"minecraft:trapped_chest"},{"data":4,"id":146,"name":"minecraft:trapped_chest"},{"data":5,"id":146,"name":"minecraft:trapped_chest"},{"data":6,"id":146,"name":"minecraft:trapped_chest"},{"data":7,"id":146,"name":"minecraft:trapped_chest"},{"data":0,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":1,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":2,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":3,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":4,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":5,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":6,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":7,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":8,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":9,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":10,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":11,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":12,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":13,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":14,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":15,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":0,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":1,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":2,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":3,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":4,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":5,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":6,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":7,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":8,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":9,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":10,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":11,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":12,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":13,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":14,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":15,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":0,"id":149,"name":"minecraft:unpowered_comparator"},{"data":1,"id":149,"name":"minecraft:unpowered_comparator"},{"data":2,"id":149,"name":"minecraft:unpowered_comparator"},{"data":3,"id":149,"name":"minecraft:unpowered_comparator"},{"data":4,"id":149,"name":"minecraft:unpowered_comparator"},{"data":5,"id":149,"name":"minecraft:unpowered_comparator"},{"data":6,"id":149,"name":"minecraft:unpowered_comparator"},{"data":7,"id":149,"name":"minecraft:unpowered_comparator"},{"data":8,"id":149,"name":"minecraft:unpowered_comparator"},{"data":9,"id":149,"name":"minecraft:unpowered_comparator"},{"data":10,"id":149,"name":"minecraft:unpowered_comparator"},{"data":11,"id":149,"name":"minecraft:unpowered_comparator"},{"data":12,"id":149,"name":"minecraft:unpowered_comparator"},{"data":13,"id":149,"name":"minecraft:unpowered_comparator"},{"data":14,"id":149,"name":"minecraft:unpowered_comparator"},{"data":15,"id":149,"name":"minecraft:unpowered_comparator"},{"data":0,"id":150,"name":"minecraft:powered_comparator"},{"data":1,"id":150,"name":"minecraft:powered_comparator"},{"data":2,"id":150,"name":"minecraft:powered_comparator"},{"data":3,"id":150,"name":"minecraft:powered_comparator"},{"data":4,"id":150,"name":"minecraft:powered_comparator"},{"data":5,"id":150,"name":"minecraft:powered_comparator"},{"data":6,"id":150,"name":"minecraft:powered_comparator"},{"data":7,"id":150,"name":"minecraft:powered_comparator"},{"data":8,"id":150,"name":"minecraft:powered_comparator"},{"data":9,"id":150,"name":"minecraft:powered_comparator"},{"data":10,"id":150,"name":"minecraft:powered_comparator"},{"data":11,"id":150,"name":"minecraft:powered_comparator"},{"data":12,"id":150,"name":"minecraft:powered_comparator"},{"data":13,"id":150,"name":"minecraft:powered_comparator"},{"data":14,"id":150,"name":"minecraft:powered_comparator"},{"data":15,"id":150,"name":"minecraft:powered_comparator"},{"data":0,"id":151,"name":"minecraft:daylight_detector"},{"data":1,"id":151,"name":"minecraft:daylight_detector"},{"data":2,"id":151,"name":"minecraft:daylight_detector"},{"data":3,"id":151,"name":"minecraft:daylight_detector"},{"data":4,"id":151,"name":"minecraft:daylight_detector"},{"data":5,"id":151,"name":"minecraft:daylight_detector"},{"data":6,"id":151,"name":"minecraft:daylight_detector"},{"data":7,"id":151,"name":"minecraft:daylight_detector"},{"data":8,"id":151,"name":"minecraft:daylight_detector"},{"data":9,"id":151,"name":"minecraft:daylight_detector"},{"data":10,"id":151,"name":"minecraft:daylight_detector"},{"data":11,"id":151,"name":"minecraft:daylight_detector"},{"data":12,"id":151,"name":"minecraft:daylight_detector"},{"data":13,"id":151,"name":"minecraft:daylight_detector"},{"data":14,"id":151,"name":"minecraft:daylight_detector"},{"data":15,"id":151,"name":"minecraft:daylight_detector"},{"data":0,"id":152,"name":"minecraft:redstone_block"},{"data":0,"id":153,"name":"minecraft:quartz_ore"},{"data":0,"id":154,"name":"minecraft:hopper"},{"data":1,"id":154,"name":"minecraft:hopper"},{"data":2,"id":154,"name":"minecraft:hopper"},{"data":3,"id":154,"name":"minecraft:hopper"},{"data":4,"id":154,"name":"minecraft:hopper"},{"data":5,"id":154,"name":"minecraft:hopper"},{"data":6,"id":154,"name":"minecraft:hopper"},{"data":7,"id":154,"name":"minecraft:hopper"},{"data":8,"id":154,"name":"minecraft:hopper"},{"data":9,"id":154,"name":"minecraft:hopper"},{"data":10,"id":154,"name":"minecraft:hopper"},{"data":11,"id":154,"name":"minecraft:hopper"},{"data":12,"id":154,"name":"minecraft:hopper"},{"data":13,"id":154,"name":"minecraft:hopper"},{"data":14,"id":154,"name":"minecraft:hopper"},{"data":15,"id":154,"name":"minecraft:hopper"},{"data":0,"id":155,"name":"minecraft:quartz_block"},{"data":1,"id":155,"name":"minecraft:quartz_block"},{"data":2,"id":155,"name":"minecraft:quartz_block"},{"data":3,"id":155,"name":"minecraft:quartz_block"},{"data":4,"id":155,"name":"minecraft:quartz_block"},{"data":5,"id":155,"name":"minecraft:quartz_block"},{"data":6,"id":155,"name":"minecraft:quartz_block"},{"data":7,"id":155,"name":"minecraft:quartz_block"},{"data":8,"id":155,"name":"minecraft:quartz_block"},{"data":9,"id":155,"name":"minecraft:quartz_block"},{"data":10,"id":155,"name":"minecraft:quartz_block"},{"data":11,"id":155,"name":"minecraft:quartz_block"},{"data":12,"id":155,"name":"minecraft:quartz_block"},{"data":13,"id":155,"name":"minecraft:quartz_block"},{"data":14,"id":155,"name":"minecraft:quartz_block"},{"data":15,"id":155,"name":"minecraft:quartz_block"},{"data":0,"id":156,"name":"minecraft:quartz_stairs"},{"data":1,"id":156,"name":"minecraft:quartz_stairs"},{"data":2,"id":156,"name":"minecraft:quartz_stairs"},{"data":3,"id":156,"name":"minecraft:quartz_stairs"},{"data":4,"id":156,"name":"minecraft:quartz_stairs"},{"data":5,"id":156,"name":"minecraft:quartz_stairs"},{"data":6,"id":156,"name":"minecraft:quartz_stairs"},{"data":7,"id":156,"name":"minecraft:quartz_stairs"},{"data":0,"id":157,"name":"minecraft:double_wooden_slab"},{"data":1,"id":157,"name":"minecraft:double_wooden_slab"},{"data":2,"id":157,"name":"minecraft:double_wooden_slab"},{"data":3,"id":157,"name":"minecraft:double_wooden_slab"},{"data":4,"id":157,"name":"minecraft:double_wooden_slab"},{"data":5,"id":157,"name":"minecraft:double_wooden_slab"},{"data":6,"id":157,"name":"minecraft:double_wooden_slab"},{"data":7,"id":157,"name":"minecraft:double_wooden_slab"},{"data":8,"id":157,"name":"minecraft:double_wooden_slab"},{"data":9,"id":157,"name":"minecraft:double_wooden_slab"},{"data":10,"id":157,"name":"minecraft:double_wooden_slab"},{"data":11,"id":157,"name":"minecraft:double_wooden_slab"},{"data":12,"id":157,"name":"minecraft:double_wooden_slab"},{"data":13,"id":157,"name":"minecraft:double_wooden_slab"},{"data":14,"id":157,"name":"minecraft:double_wooden_slab"},{"data":15,"id":157,"name":"minecraft:double_wooden_slab"},{"data":0,"id":158,"name":"minecraft:wooden_slab"},{"data":1,"id":158,"name":"minecraft:wooden_slab"},{"data":2,"id":158,"name":"minecraft:wooden_slab"},{"data":3,"id":158,"name":"minecraft:wooden_slab"},{"data":4,"id":158,"name":"minecraft:wooden_slab"},{"data":5,"id":158,"name":"minecraft:wooden_slab"},{"data":6,"id":158,"name":"minecraft:wooden_slab"},{"data":7,"id":158,"name":"minecraft:wooden_slab"},{"data":8,"id":158,"name":"minecraft:wooden_slab"},{"data":9,"id":158,"name":"minecraft:wooden_slab"},{"data":10,"id":158,"name":"minecraft:wooden_slab"},{"data":11,"id":158,"name":"minecraft:wooden_slab"},{"data":12,"id":158,"name":"minecraft:wooden_slab"},{"data":13,"id":158,"name":"minecraft:wooden_slab"},{"data":14,"id":158,"name":"minecraft:wooden_slab"},{"data":15,"id":158,"name":"minecraft:wooden_slab"},{"data":0,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":1,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":2,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":3,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":4,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":5,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":6,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":7,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":8,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":9,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":10,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":11,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":12,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":13,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":14,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":15,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":0,"id":160,"name":"minecraft:stained_glass_pane"},{"data":1,"id":160,"name":"minecraft:stained_glass_pane"},{"data":2,"id":160,"name":"minecraft:stained_glass_pane"},{"data":3,"id":160,"name":"minecraft:stained_glass_pane"},{"data":4,"id":160,"name":"minecraft:stained_glass_pane"},{"data":5,"id":160,"name":"minecraft:stained_glass_pane"},{"data":6,"id":160,"name":"minecraft:stained_glass_pane"},{"data":7,"id":160,"name":"minecraft:stained_glass_pane"},{"data":8,"id":160,"name":"minecraft:stained_glass_pane"},{"data":9,"id":160,"name":"minecraft:stained_glass_pane"},{"data":10,"id":160,"name":"minecraft:stained_glass_pane"},{"data":11,"id":160,"name":"minecraft:stained_glass_pane"},{"data":12,"id":160,"name":"minecraft:stained_glass_pane"},{"data":13,"id":160,"name":"minecraft:stained_glass_pane"},{"data":14,"id":160,"name":"minecraft:stained_glass_pane"},{"data":15,"id":160,"name":"minecraft:stained_glass_pane"},{"data":0,"id":161,"name":"minecraft:leaves2"},{"data":1,"id":161,"name":"minecraft:leaves2"},{"data":2,"id":161,"name":"minecraft:leaves2"},{"data":3,"id":161,"name":"minecraft:leaves2"},{"data":4,"id":161,"name":"minecraft:leaves2"},{"data":5,"id":161,"name":"minecraft:leaves2"},{"data":6,"id":161,"name":"minecraft:leaves2"},{"data":7,"id":161,"name":"minecraft:leaves2"},{"data":8,"id":161,"name":"minecraft:leaves2"},{"data":9,"id":161,"name":"minecraft:leaves2"},{"data":10,"id":161,"name":"minecraft:leaves2"},{"data":11,"id":161,"name":"minecraft:leaves2"},{"data":12,"id":161,"name":"minecraft:leaves2"},{"data":13,"id":161,"name":"minecraft:leaves2"},{"data":14,"id":161,"name":"minecraft:leaves2"},{"data":15,"id":161,"name":"minecraft:leaves2"},{"data":0,"id":162,"name":"minecraft:log2"},{"data":1,"id":162,"name":"minecraft:log2"},{"data":2,"id":162,"name":"minecraft:log2"},{"data":3,"id":162,"name":"minecraft:log2"},{"data":4,"id":162,"name":"minecraft:log2"},{"data":5,"id":162,"name":"minecraft:log2"},{"data":6,"id":162,"name":"minecraft:log2"},{"data":7,"id":162,"name":"minecraft:log2"},{"data":8,"id":162,"name":"minecraft:log2"},{"data":9,"id":162,"name":"minecraft:log2"},{"data":10,"id":162,"name":"minecraft:log2"},{"data":11,"id":162,"name":"minecraft:log2"},{"data":12,"id":162,"name":"minecraft:log2"},{"data":13,"id":162,"name":"minecraft:log2"},{"data":14,"id":162,"name":"minecraft:log2"},{"data":15,"id":162,"name":"minecraft:log2"},{"data":0,"id":163,"name":"minecraft:acacia_stairs"},{"data":1,"id":163,"name":"minecraft:acacia_stairs"},{"data":2,"id":163,"name":"minecraft:acacia_stairs"},{"data":3,"id":163,"name":"minecraft:acacia_stairs"},{"data":4,"id":163,"name":"minecraft:acacia_stairs"},{"data":5,"id":163,"name":"minecraft:acacia_stairs"},{"data":6,"id":163,"name":"minecraft:acacia_stairs"},{"data":7,"id":163,"name":"minecraft:acacia_stairs"},{"data":0,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":1,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":2,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":3,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":4,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":5,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":6,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":7,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":0,"id":165,"name":"minecraft:slime"},{"data":0,"id":167,"name":"minecraft:iron_trapdoor"},{"data":1,"id":167,"name":"minecraft:iron_trapdoor"},{"data":2,"id":167,"name":"minecraft:iron_trapdoor"},{"data":3,"id":167,"name":"minecraft:iron_trapdoor"},{"data":4,"id":167,"name":"minecraft:iron_trapdoor"},{"data":5,"id":167,"name":"minecraft:iron_trapdoor"},{"data":6,"id":167,"name":"minecraft:iron_trapdoor"},{"data":7,"id":167,"name":"minecraft:iron_trapdoor"},{"data":8,"id":167,"name":"minecraft:iron_trapdoor"},{"data":9,"id":167,"name":"minecraft:iron_trapdoor"},{"data":10,"id":167,"name":"minecraft:iron_trapdoor"},{"data":11,"id":167,"name":"minecraft:iron_trapdoor"},{"data":12,"id":167,"name":"minecraft:iron_trapdoor"},{"data":13,"id":167,"name":"minecraft:iron_trapdoor"},{"data":14,"id":167,"name":"minecraft:iron_trapdoor"},{"data":15,"id":167,"name":"minecraft:iron_trapdoor"},{"data":0,"id":168,"name":"minecraft:prismarine"},{"data":1,"id":168,"name":"minecraft:prismarine"},{"data":2,"id":168,"name":"minecraft:prismarine"},{"data":3,"id":168,"name":"minecraft:prismarine"},{"data":0,"id":169,"name":"minecraft:seaLantern"},{"data":0,"id":170,"name":"minecraft:hay_block"},{"data":1,"id":170,"name":"minecraft:hay_block"},{"data":2,"id":170,"name":"minecraft:hay_block"},{"data":3,"id":170,"name":"minecraft:hay_block"},{"data":4,"id":170,"name":"minecraft:hay_block"},{"data":5,"id":170,"name":"minecraft:hay_block"},{"data":6,"id":170,"name":"minecraft:hay_block"},{"data":7,"id":170,"name":"minecraft:hay_block"},{"data":8,"id":170,"name":"minecraft:hay_block"},{"data":9,"id":170,"name":"minecraft:hay_block"},{"data":10,"id":170,"name":"minecraft:hay_block"},{"data":11,"id":170,"name":"minecraft:hay_block"},{"data":12,"id":170,"name":"minecraft:hay_block"},{"data":13,"id":170,"name":"minecraft:hay_block"},{"data":14,"id":170,"name":"minecraft:hay_block"},{"data":15,"id":170,"name":"minecraft:hay_block"},{"data":0,"id":171,"name":"minecraft:carpet"},{"data":1,"id":171,"name":"minecraft:carpet"},{"data":2,"id":171,"name":"minecraft:carpet"},{"data":3,"id":171,"name":"minecraft:carpet"},{"data":4,"id":171,"name":"minecraft:carpet"},{"data":5,"id":171,"name":"minecraft:carpet"},{"data":6,"id":171,"name":"minecraft:carpet"},{"data":7,"id":171,"name":"minecraft:carpet"},{"data":8,"id":171,"name":"minecraft:carpet"},{"data":9,"id":171,"name":"minecraft:carpet"},{"data":10,"id":171,"name":"minecraft:carpet"},{"data":11,"id":171,"name":"minecraft:carpet"},{"data":12,"id":171,"name":"minecraft:carpet"},{"data":13,"id":171,"name":"minecraft:carpet"},{"data":14,"id":171,"name":"minecraft:carpet"},{"data":15,"id":171,"name":"minecraft:carpet"},{"data":0,"id":172,"name":"minecraft:hardened_clay"},{"data":0,"id":173,"name":"minecraft:coal_block"},{"data":0,"id":174,"name":"minecraft:packed_ice"},{"data":0,"id":175,"name":"minecraft:double_plant"},{"data":1,"id":175,"name":"minecraft:double_plant"},{"data":2,"id":175,"name":"minecraft:double_plant"},{"data":3,"id":175,"name":"minecraft:double_plant"},{"data":4,"id":175,"name":"minecraft:double_plant"},{"data":5,"id":175,"name":"minecraft:double_plant"},{"data":6,"id":175,"name":"minecraft:double_plant"},{"data":7,"id":175,"name":"minecraft:double_plant"},{"data":8,"id":175,"name":"minecraft:double_plant"},{"data":9,"id":175,"name":"minecraft:double_plant"},{"data":10,"id":175,"name":"minecraft:double_plant"},{"data":11,"id":175,"name":"minecraft:double_plant"},{"data":12,"id":175,"name":"minecraft:double_plant"},{"data":13,"id":175,"name":"minecraft:double_plant"},{"data":14,"id":175,"name":"minecraft:double_plant"},{"data":15,"id":175,"name":"minecraft:double_plant"},{"data":0,"id":176,"name":"minecraft:standing_banner"},{"data":1,"id":176,"name":"minecraft:standing_banner"},{"data":2,"id":176,"name":"minecraft:standing_banner"},{"data":3,"id":176,"name":"minecraft:standing_banner"},{"data":4,"id":176,"name":"minecraft:standing_banner"},{"data":5,"id":176,"name":"minecraft:standing_banner"},{"data":6,"id":176,"name":"minecraft:standing_banner"},{"data":7,"id":176,"name":"minecraft:standing_banner"},{"data":8,"id":176,"name":"minecraft:standing_banner"},{"data":9,"id":176,"name":"minecraft:standing_banner"},{"data":10,"id":176,"name":"minecraft:standing_banner"},{"data":11,"id":176,"name":"minecraft:standing_banner"},{"data":12,"id":176,"name":"minecraft:standing_banner"},{"data":13,"id":176,"name":"minecraft:standing_banner"},{"data":14,"id":176,"name":"minecraft:standing_banner"},{"data":15,"id":176,"name":"minecraft:standing_banner"},{"data":0,"id":177,"name":"minecraft:wall_banner"},{"data":1,"id":177,"name":"minecraft:wall_banner"},{"data":2,"id":177,"name":"minecraft:wall_banner"},{"data":3,"id":177,"name":"minecraft:wall_banner"},{"data":4,"id":177,"name":"minecraft:wall_banner"},{"data":5,"id":177,"name":"minecraft:wall_banner"},{"data":6,"id":177,"name":"minecraft:wall_banner"},{"data":7,"id":177,"name":"minecraft:wall_banner"},{"data":0,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":1,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":2,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":3,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":4,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":5,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":6,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":7,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":8,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":9,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":10,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":11,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":12,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":13,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":14,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":15,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":0,"id":179,"name":"minecraft:red_sandstone"},{"data":1,"id":179,"name":"minecraft:red_sandstone"},{"data":2,"id":179,"name":"minecraft:red_sandstone"},{"data":3,"id":179,"name":"minecraft:red_sandstone"},{"data":0,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":1,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":2,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":3,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":4,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":5,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":6,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":7,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":0,"id":181,"name":"minecraft:double_stone_slab2"},{"data":1,"id":181,"name":"minecraft:double_stone_slab2"},{"data":2,"id":181,"name":"minecraft:double_stone_slab2"},{"data":3,"id":181,"name":"minecraft:double_stone_slab2"},{"data":4,"id":181,"name":"minecraft:double_stone_slab2"},{"data":5,"id":181,"name":"minecraft:double_stone_slab2"},{"data":6,"id":181,"name":"minecraft:double_stone_slab2"},{"data":7,"id":181,"name":"minecraft:double_stone_slab2"},{"data":8,"id":181,"name":"minecraft:double_stone_slab2"},{"data":9,"id":181,"name":"minecraft:double_stone_slab2"},{"data":10,"id":181,"name":"minecraft:double_stone_slab2"},{"data":11,"id":181,"name":"minecraft:double_stone_slab2"},{"data":12,"id":181,"name":"minecraft:double_stone_slab2"},{"data":13,"id":181,"name":"minecraft:double_stone_slab2"},{"data":14,"id":181,"name":"minecraft:double_stone_slab2"},{"data":15,"id":181,"name":"minecraft:double_stone_slab2"},{"data":0,"id":182,"name":"minecraft:stone_slab2"},{"data":1,"id":182,"name":"minecraft:stone_slab2"},{"data":2,"id":182,"name":"minecraft:stone_slab2"},{"data":3,"id":182,"name":"minecraft:stone_slab2"},{"data":4,"id":182,"name":"minecraft:stone_slab2"},{"data":5,"id":182,"name":"minecraft:stone_slab2"},{"data":6,"id":182,"name":"minecraft:stone_slab2"},{"data":7,"id":182,"name":"minecraft:stone_slab2"},{"data":8,"id":182,"name":"minecraft:stone_slab2"},{"data":9,"id":182,"name":"minecraft:stone_slab2"},{"data":10,"id":182,"name":"minecraft:stone_slab2"},{"data":11,"id":182,"name":"minecraft:stone_slab2"},{"data":12,"id":182,"name":"minecraft:stone_slab2"},{"data":13,"id":182,"name":"minecraft:stone_slab2"},{"data":14,"id":182,"name":"minecraft:stone_slab2"},{"data":15,"id":182,"name":"minecraft:stone_slab2"},{"data":0,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":1,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":2,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":3,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":4,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":5,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":6,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":7,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":8,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":9,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":10,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":11,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":12,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":13,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":14,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":15,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":0,"id":184,"name":"minecraft:birch_fence_gate"},{"data":1,"id":184,"name":"minecraft:birch_fence_gate"},{"data":2,"id":184,"name":"minecraft:birch_fence_gate"},{"data":3,"id":184,"name":"minecraft:birch_fence_gate"},{"data":4,"id":184,"name":"minecraft:birch_fence_gate"},{"data":5,"id":184,"name":"minecraft:birch_fence_gate"},{"data":6,"id":184,"name":"minecraft:birch_fence_gate"},{"data":7,"id":184,"name":"minecraft:birch_fence_gate"},{"data":8,"id":184,"name":"minecraft:birch_fence_gate"},{"data":9,"id":184,"name":"minecraft:birch_fence_gate"},{"data":10,"id":184,"name":"minecraft:birch_fence_gate"},{"data":11,"id":184,"name":"minecraft:birch_fence_gate"},{"data":12,"id":184,"name":"minecraft:birch_fence_gate"},{"data":13,"id":184,"name":"minecraft:birch_fence_gate"},{"data":14,"id":184,"name":"minecraft:birch_fence_gate"},{"data":15,"id":184,"name":"minecraft:birch_fence_gate"},{"data":0,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":1,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":2,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":3,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":4,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":5,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":6,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":7,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":8,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":9,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":10,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":11,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":12,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":13,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":14,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":15,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":0,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":1,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":2,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":3,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":4,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":5,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":6,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":7,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":8,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":9,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":10,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":11,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":12,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":13,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":14,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":15,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":0,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":1,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":2,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":3,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":4,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":5,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":6,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":7,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":8,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":9,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":10,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":11,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":12,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":13,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":14,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":15,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":0,"id":188,"name":"minecraft:repeating_command_block"},{"data":1,"id":188,"name":"minecraft:repeating_command_block"},{"data":2,"id":188,"name":"minecraft:repeating_command_block"},{"data":3,"id":188,"name":"minecraft:repeating_command_block"},{"data":4,"id":188,"name":"minecraft:repeating_command_block"},{"data":5,"id":188,"name":"minecraft:repeating_command_block"},{"data":6,"id":188,"name":"minecraft:repeating_command_block"},{"data":7,"id":188,"name":"minecraft:repeating_command_block"},{"data":8,"id":188,"name":"minecraft:repeating_command_block"},{"data":9,"id":188,"name":"minecraft:repeating_command_block"},{"data":10,"id":188,"name":"minecraft:repeating_command_block"},{"data":11,"id":188,"name":"minecraft:repeating_command_block"},{"data":12,"id":188,"name":"minecraft:repeating_command_block"},{"data":13,"id":188,"name":"minecraft:repeating_command_block"},{"data":14,"id":188,"name":"minecraft:repeating_command_block"},{"data":15,"id":188,"name":"minecraft:repeating_command_block"},{"data":0,"id":189,"name":"minecraft:chain_command_block"},{"data":1,"id":189,"name":"minecraft:chain_command_block"},{"data":2,"id":189,"name":"minecraft:chain_command_block"},{"data":3,"id":189,"name":"minecraft:chain_command_block"},{"data":4,"id":189,"name":"minecraft:chain_command_block"},{"data":5,"id":189,"name":"minecraft:chain_command_block"},{"data":6,"id":189,"name":"minecraft:chain_command_block"},{"data":7,"id":189,"name":"minecraft:chain_command_block"},{"data":8,"id":189,"name":"minecraft:chain_command_block"},{"data":9,"id":189,"name":"minecraft:chain_command_block"},{"data":10,"id":189,"name":"minecraft:chain_command_block"},{"data":11,"id":189,"name":"minecraft:chain_command_block"},{"data":12,"id":189,"name":"minecraft:chain_command_block"},{"data":13,"id":189,"name":"minecraft:chain_command_block"},{"data":14,"id":189,"name":"minecraft:chain_command_block"},{"data":15,"id":189,"name":"minecraft:chain_command_block"},{"data":0,"id":190,"name":"minecraft:hard_glass_pane"},{"data":0,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":1,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":2,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":3,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":4,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":5,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":6,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":7,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":8,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":9,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":10,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":11,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":12,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":13,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":14,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":15,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":0,"id":192,"name":"minecraft:chemical_heat"},{"data":0,"id":193,"name":"minecraft:spruce_door"},{"data":1,"id":193,"name":"minecraft:spruce_door"},{"data":2,"id":193,"name":"minecraft:spruce_door"},{"data":3,"id":193,"name":"minecraft:spruce_door"},{"data":4,"id":193,"name":"minecraft:spruce_door"},{"data":5,"id":193,"name":"minecraft:spruce_door"},{"data":6,"id":193,"name":"minecraft:spruce_door"},{"data":7,"id":193,"name":"minecraft:spruce_door"},{"data":8,"id":193,"name":"minecraft:spruce_door"},{"data":9,"id":193,"name":"minecraft:spruce_door"},{"data":10,"id":193,"name":"minecraft:spruce_door"},{"data":11,"id":193,"name":"minecraft:spruce_door"},{"data":12,"id":193,"name":"minecraft:spruce_door"},{"data":13,"id":193,"name":"minecraft:spruce_door"},{"data":14,"id":193,"name":"minecraft:spruce_door"},{"data":15,"id":193,"name":"minecraft:spruce_door"},{"data":0,"id":194,"name":"minecraft:birch_door"},{"data":1,"id":194,"name":"minecraft:birch_door"},{"data":2,"id":194,"name":"minecraft:birch_door"},{"data":3,"id":194,"name":"minecraft:birch_door"},{"data":4,"id":194,"name":"minecraft:birch_door"},{"data":5,"id":194,"name":"minecraft:birch_door"},{"data":6,"id":194,"name":"minecraft:birch_door"},{"data":7,"id":194,"name":"minecraft:birch_door"},{"data":8,"id":194,"name":"minecraft:birch_door"},{"data":9,"id":194,"name":"minecraft:birch_door"},{"data":10,"id":194,"name":"minecraft:birch_door"},{"data":11,"id":194,"name":"minecraft:birch_door"},{"data":12,"id":194,"name":"minecraft:birch_door"},{"data":13,"id":194,"name":"minecraft:birch_door"},{"data":14,"id":194,"name":"minecraft:birch_door"},{"data":15,"id":194,"name":"minecraft:birch_door"},{"data":0,"id":195,"name":"minecraft:jungle_door"},{"data":1,"id":195,"name":"minecraft:jungle_door"},{"data":2,"id":195,"name":"minecraft:jungle_door"},{"data":3,"id":195,"name":"minecraft:jungle_door"},{"data":4,"id":195,"name":"minecraft:jungle_door"},{"data":5,"id":195,"name":"minecraft:jungle_door"},{"data":6,"id":195,"name":"minecraft:jungle_door"},{"data":7,"id":195,"name":"minecraft:jungle_door"},{"data":8,"id":195,"name":"minecraft:jungle_door"},{"data":9,"id":195,"name":"minecraft:jungle_door"},{"data":10,"id":195,"name":"minecraft:jungle_door"},{"data":11,"id":195,"name":"minecraft:jungle_door"},{"data":12,"id":195,"name":"minecraft:jungle_door"},{"data":13,"id":195,"name":"minecraft:jungle_door"},{"data":14,"id":195,"name":"minecraft:jungle_door"},{"data":15,"id":195,"name":"minecraft:jungle_door"},{"data":0,"id":196,"name":"minecraft:acacia_door"},{"data":1,"id":196,"name":"minecraft:acacia_door"},{"data":2,"id":196,"name":"minecraft:acacia_door"},{"data":3,"id":196,"name":"minecraft:acacia_door"},{"data":4,"id":196,"name":"minecraft:acacia_door"},{"data":5,"id":196,"name":"minecraft:acacia_door"},{"data":6,"id":196,"name":"minecraft:acacia_door"},{"data":7,"id":196,"name":"minecraft:acacia_door"},{"data":8,"id":196,"name":"minecraft:acacia_door"},{"data":9,"id":196,"name":"minecraft:acacia_door"},{"data":10,"id":196,"name":"minecraft:acacia_door"},{"data":11,"id":196,"name":"minecraft:acacia_door"},{"data":12,"id":196,"name":"minecraft:acacia_door"},{"data":13,"id":196,"name":"minecraft:acacia_door"},{"data":14,"id":196,"name":"minecraft:acacia_door"},{"data":15,"id":196,"name":"minecraft:acacia_door"},{"data":0,"id":197,"name":"minecraft:dark_oak_door"},{"data":1,"id":197,"name":"minecraft:dark_oak_door"},{"data":2,"id":197,"name":"minecraft:dark_oak_door"},{"data":3,"id":197,"name":"minecraft:dark_oak_door"},{"data":4,"id":197,"name":"minecraft:dark_oak_door"},{"data":5,"id":197,"name":"minecraft:dark_oak_door"},{"data":6,"id":197,"name":"minecraft:dark_oak_door"},{"data":7,"id":197,"name":"minecraft:dark_oak_door"},{"data":8,"id":197,"name":"minecraft:dark_oak_door"},{"data":9,"id":197,"name":"minecraft:dark_oak_door"},{"data":10,"id":197,"name":"minecraft:dark_oak_door"},{"data":11,"id":197,"name":"minecraft:dark_oak_door"},{"data":12,"id":197,"name":"minecraft:dark_oak_door"},{"data":13,"id":197,"name":"minecraft:dark_oak_door"},{"data":14,"id":197,"name":"minecraft:dark_oak_door"},{"data":15,"id":197,"name":"minecraft:dark_oak_door"},{"data":0,"id":198,"name":"minecraft:grass_path"},{"data":0,"id":199,"name":"minecraft:frame"},{"data":1,"id":199,"name":"minecraft:frame"},{"data":2,"id":199,"name":"minecraft:frame"},{"data":3,"id":199,"name":"minecraft:frame"},{"data":4,"id":199,"name":"minecraft:frame"},{"data":5,"id":199,"name":"minecraft:frame"},{"data":6,"id":199,"name":"minecraft:frame"},{"data":7,"id":199,"name":"minecraft:frame"},{"data":0,"id":200,"name":"minecraft:chorus_flower"},{"data":1,"id":200,"name":"minecraft:chorus_flower"},{"data":2,"id":200,"name":"minecraft:chorus_flower"},{"data":3,"id":200,"name":"minecraft:chorus_flower"},{"data":4,"id":200,"name":"minecraft:chorus_flower"},{"data":5,"id":200,"name":"minecraft:chorus_flower"},{"data":6,"id":200,"name":"minecraft:chorus_flower"},{"data":7,"id":200,"name":"minecraft:chorus_flower"},{"data":0,"id":201,"name":"minecraft:purpur_block"},{"data":1,"id":201,"name":"minecraft:purpur_block"},{"data":2,"id":201,"name":"minecraft:purpur_block"},{"data":3,"id":201,"name":"minecraft:purpur_block"},{"data":4,"id":201,"name":"minecraft:purpur_block"},{"data":5,"id":201,"name":"minecraft:purpur_block"},{"data":6,"id":201,"name":"minecraft:purpur_block"},{"data":7,"id":201,"name":"minecraft:purpur_block"},{"data":8,"id":201,"name":"minecraft:purpur_block"},{"data":9,"id":201,"name":"minecraft:purpur_block"},{"data":10,"id":201,"name":"minecraft:purpur_block"},{"data":11,"id":201,"name":"minecraft:purpur_block"},{"data":12,"id":201,"name":"minecraft:purpur_block"},{"data":13,"id":201,"name":"minecraft:purpur_block"},{"data":14,"id":201,"name":"minecraft:purpur_block"},{"data":15,"id":201,"name":"minecraft:purpur_block"},{"data":0,"id":202,"name":"minecraft:colored_torch_rg"},{"data":1,"id":202,"name":"minecraft:colored_torch_rg"},{"data":2,"id":202,"name":"minecraft:colored_torch_rg"},{"data":3,"id":202,"name":"minecraft:colored_torch_rg"},{"data":4,"id":202,"name":"minecraft:colored_torch_rg"},{"data":5,"id":202,"name":"minecraft:colored_torch_rg"},{"data":6,"id":202,"name":"minecraft:colored_torch_rg"},{"data":7,"id":202,"name":"minecraft:colored_torch_rg"},{"data":8,"id":202,"name":"minecraft:colored_torch_rg"},{"data":9,"id":202,"name":"minecraft:colored_torch_rg"},{"data":10,"id":202,"name":"minecraft:colored_torch_rg"},{"data":11,"id":202,"name":"minecraft:colored_torch_rg"},{"data":12,"id":202,"name":"minecraft:colored_torch_rg"},{"data":13,"id":202,"name":"minecraft:colored_torch_rg"},{"data":14,"id":202,"name":"minecraft:colored_torch_rg"},{"data":15,"id":202,"name":"minecraft:colored_torch_rg"},{"data":0,"id":203,"name":"minecraft:purpur_stairs"},{"data":1,"id":203,"name":"minecraft:purpur_stairs"},{"data":2,"id":203,"name":"minecraft:purpur_stairs"},{"data":3,"id":203,"name":"minecraft:purpur_stairs"},{"data":4,"id":203,"name":"minecraft:purpur_stairs"},{"data":5,"id":203,"name":"minecraft:purpur_stairs"},{"data":6,"id":203,"name":"minecraft:purpur_stairs"},{"data":7,"id":203,"name":"minecraft:purpur_stairs"},{"data":0,"id":204,"name":"minecraft:colored_torch_bp"},{"data":1,"id":204,"name":"minecraft:colored_torch_bp"},{"data":2,"id":204,"name":"minecraft:colored_torch_bp"},{"data":3,"id":204,"name":"minecraft:colored_torch_bp"},{"data":4,"id":204,"name":"minecraft:colored_torch_bp"},{"data":5,"id":204,"name":"minecraft:colored_torch_bp"},{"data":6,"id":204,"name":"minecraft:colored_torch_bp"},{"data":7,"id":204,"name":"minecraft:colored_torch_bp"},{"data":8,"id":204,"name":"minecraft:colored_torch_bp"},{"data":9,"id":204,"name":"minecraft:colored_torch_bp"},{"data":10,"id":204,"name":"minecraft:colored_torch_bp"},{"data":11,"id":204,"name":"minecraft:colored_torch_bp"},{"data":12,"id":204,"name":"minecraft:colored_torch_bp"},{"data":13,"id":204,"name":"minecraft:colored_torch_bp"},{"data":14,"id":204,"name":"minecraft:colored_torch_bp"},{"data":15,"id":204,"name":"minecraft:colored_torch_bp"},{"data":0,"id":205,"name":"minecraft:undyed_shulker_box"},{"data":0,"id":206,"name":"minecraft:end_bricks"},{"data":0,"id":207,"name":"minecraft:frosted_ice"},{"data":1,"id":207,"name":"minecraft:frosted_ice"},{"data":2,"id":207,"name":"minecraft:frosted_ice"},{"data":3,"id":207,"name":"minecraft:frosted_ice"},{"data":0,"id":208,"name":"minecraft:end_rod"},{"data":1,"id":208,"name":"minecraft:end_rod"},{"data":2,"id":208,"name":"minecraft:end_rod"},{"data":3,"id":208,"name":"minecraft:end_rod"},{"data":4,"id":208,"name":"minecraft:end_rod"},{"data":5,"id":208,"name":"minecraft:end_rod"},{"data":6,"id":208,"name":"minecraft:end_rod"},{"data":7,"id":208,"name":"minecraft:end_rod"},{"data":0,"id":209,"name":"minecraft:end_gateway"},{"data":0,"id":213,"name":"minecraft:magma"},{"data":0,"id":214,"name":"minecraft:nether_wart_block"},{"data":0,"id":215,"name":"minecraft:red_nether_brick"},{"data":0,"id":216,"name":"minecraft:bone_block"},{"data":1,"id":216,"name":"minecraft:bone_block"},{"data":2,"id":216,"name":"minecraft:bone_block"},{"data":3,"id":216,"name":"minecraft:bone_block"},{"data":4,"id":216,"name":"minecraft:bone_block"},{"data":5,"id":216,"name":"minecraft:bone_block"},{"data":6,"id":216,"name":"minecraft:bone_block"},{"data":7,"id":216,"name":"minecraft:bone_block"},{"data":8,"id":216,"name":"minecraft:bone_block"},{"data":9,"id":216,"name":"minecraft:bone_block"},{"data":10,"id":216,"name":"minecraft:bone_block"},{"data":11,"id":216,"name":"minecraft:bone_block"},{"data":12,"id":216,"name":"minecraft:bone_block"},{"data":13,"id":216,"name":"minecraft:bone_block"},{"data":14,"id":216,"name":"minecraft:bone_block"},{"data":15,"id":216,"name":"minecraft:bone_block"},{"data":0,"id":218,"name":"minecraft:shulker_box"},{"data":1,"id":218,"name":"minecraft:shulker_box"},{"data":2,"id":218,"name":"minecraft:shulker_box"},{"data":3,"id":218,"name":"minecraft:shulker_box"},{"data":4,"id":218,"name":"minecraft:shulker_box"},{"data":5,"id":218,"name":"minecraft:shulker_box"},{"data":6,"id":218,"name":"minecraft:shulker_box"},{"data":7,"id":218,"name":"minecraft:shulker_box"},{"data":8,"id":218,"name":"minecraft:shulker_box"},{"data":9,"id":218,"name":"minecraft:shulker_box"},{"data":10,"id":218,"name":"minecraft:shulker_box"},{"data":11,"id":218,"name":"minecraft:shulker_box"},{"data":12,"id":218,"name":"minecraft:shulker_box"},{"data":13,"id":218,"name":"minecraft:shulker_box"},{"data":14,"id":218,"name":"minecraft:shulker_box"},{"data":15,"id":218,"name":"minecraft:shulker_box"},{"data":0,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":1,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":2,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":3,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":4,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":5,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":6,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":7,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":0,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":1,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":2,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":3,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":4,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":5,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":6,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":7,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":0,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":1,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":2,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":3,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":4,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":5,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":6,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":7,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":0,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":1,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":2,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":3,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":4,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":5,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":6,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":7,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":0,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":1,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":2,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":3,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":4,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":5,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":6,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":7,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":0,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":1,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":2,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":3,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":4,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":5,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":6,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":7,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":0,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":1,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":2,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":3,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":4,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":5,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":6,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":7,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":0,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":1,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":2,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":3,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":4,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":5,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":6,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":7,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":0,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":1,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":2,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":3,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":4,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":5,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":6,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":7,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":0,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":1,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":2,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":3,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":4,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":5,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":6,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":7,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":0,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":1,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":2,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":3,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":4,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":5,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":6,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":7,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":0,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":1,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":2,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":3,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":4,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":5,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":6,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":7,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":0,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":1,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":2,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":3,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":4,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":5,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":6,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":7,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":0,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":1,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":2,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":3,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":4,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":5,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":6,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":7,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":0,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":1,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":2,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":3,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":4,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":5,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":6,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":7,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":0,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":1,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":2,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":3,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":4,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":5,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":6,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":7,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":0,"id":236,"name":"minecraft:concrete"},{"data":1,"id":236,"name":"minecraft:concrete"},{"data":2,"id":236,"name":"minecraft:concrete"},{"data":3,"id":236,"name":"minecraft:concrete"},{"data":4,"id":236,"name":"minecraft:concrete"},{"data":5,"id":236,"name":"minecraft:concrete"},{"data":6,"id":236,"name":"minecraft:concrete"},{"data":7,"id":236,"name":"minecraft:concrete"},{"data":8,"id":236,"name":"minecraft:concrete"},{"data":9,"id":236,"name":"minecraft:concrete"},{"data":10,"id":236,"name":"minecraft:concrete"},{"data":11,"id":236,"name":"minecraft:concrete"},{"data":12,"id":236,"name":"minecraft:concrete"},{"data":13,"id":236,"name":"minecraft:concrete"},{"data":14,"id":236,"name":"minecraft:concrete"},{"data":15,"id":236,"name":"minecraft:concrete"},{"data":0,"id":237,"name":"minecraft:concretePowder"},{"data":1,"id":237,"name":"minecraft:concretePowder"},{"data":2,"id":237,"name":"minecraft:concretePowder"},{"data":3,"id":237,"name":"minecraft:concretePowder"},{"data":4,"id":237,"name":"minecraft:concretePowder"},{"data":5,"id":237,"name":"minecraft:concretePowder"},{"data":6,"id":237,"name":"minecraft:concretePowder"},{"data":7,"id":237,"name":"minecraft:concretePowder"},{"data":8,"id":237,"name":"minecraft:concretePowder"},{"data":9,"id":237,"name":"minecraft:concretePowder"},{"data":10,"id":237,"name":"minecraft:concretePowder"},{"data":11,"id":237,"name":"minecraft:concretePowder"},{"data":12,"id":237,"name":"minecraft:concretePowder"},{"data":13,"id":237,"name":"minecraft:concretePowder"},{"data":14,"id":237,"name":"minecraft:concretePowder"},{"data":15,"id":237,"name":"minecraft:concretePowder"},{"data":0,"id":238,"name":"minecraft:chemistry_table"},{"data":1,"id":238,"name":"minecraft:chemistry_table"},{"data":2,"id":238,"name":"minecraft:chemistry_table"},{"data":3,"id":238,"name":"minecraft:chemistry_table"},{"data":4,"id":238,"name":"minecraft:chemistry_table"},{"data":5,"id":238,"name":"minecraft:chemistry_table"},{"data":6,"id":238,"name":"minecraft:chemistry_table"},{"data":7,"id":238,"name":"minecraft:chemistry_table"},{"data":8,"id":238,"name":"minecraft:chemistry_table"},{"data":9,"id":238,"name":"minecraft:chemistry_table"},{"data":10,"id":238,"name":"minecraft:chemistry_table"},{"data":11,"id":238,"name":"minecraft:chemistry_table"},{"data":12,"id":238,"name":"minecraft:chemistry_table"},{"data":13,"id":238,"name":"minecraft:chemistry_table"},{"data":14,"id":238,"name":"minecraft:chemistry_table"},{"data":15,"id":238,"name":"minecraft:chemistry_table"},{"data":0,"id":239,"name":"minecraft:underwater_torch"},{"data":1,"id":239,"name":"minecraft:underwater_torch"},{"data":2,"id":239,"name":"minecraft:underwater_torch"},{"data":3,"id":239,"name":"minecraft:underwater_torch"},{"data":4,"id":239,"name":"minecraft:underwater_torch"},{"data":5,"id":239,"name":"minecraft:underwater_torch"},{"data":6,"id":239,"name":"minecraft:underwater_torch"},{"data":7,"id":239,"name":"minecraft:underwater_torch"},{"data":0,"id":240,"name":"minecraft:chorus_plant"},{"data":0,"id":241,"name":"minecraft:stained_glass"},{"data":1,"id":241,"name":"minecraft:stained_glass"},{"data":2,"id":241,"name":"minecraft:stained_glass"},{"data":3,"id":241,"name":"minecraft:stained_glass"},{"data":4,"id":241,"name":"minecraft:stained_glass"},{"data":5,"id":241,"name":"minecraft:stained_glass"},{"data":6,"id":241,"name":"minecraft:stained_glass"},{"data":7,"id":241,"name":"minecraft:stained_glass"},{"data":8,"id":241,"name":"minecraft:stained_glass"},{"data":9,"id":241,"name":"minecraft:stained_glass"},{"data":10,"id":241,"name":"minecraft:stained_glass"},{"data":11,"id":241,"name":"minecraft:stained_glass"},{"data":12,"id":241,"name":"minecraft:stained_glass"},{"data":13,"id":241,"name":"minecraft:stained_glass"},{"data":14,"id":241,"name":"minecraft:stained_glass"},{"data":15,"id":241,"name":"minecraft:stained_glass"},{"data":0,"id":243,"name":"minecraft:podzol"},{"data":0,"id":244,"name":"minecraft:beetroot"},{"data":1,"id":244,"name":"minecraft:beetroot"},{"data":2,"id":244,"name":"minecraft:beetroot"},{"data":3,"id":244,"name":"minecraft:beetroot"},{"data":4,"id":244,"name":"minecraft:beetroot"},{"data":5,"id":244,"name":"minecraft:beetroot"},{"data":6,"id":244,"name":"minecraft:beetroot"},{"data":7,"id":244,"name":"minecraft:beetroot"},{"data":0,"id":245,"name":"minecraft:stonecutter"},{"data":0,"id":246,"name":"minecraft:glowingobsidian"},{"data":0,"id":247,"name":"minecraft:netherreactor"},{"data":0,"id":248,"name":"minecraft:info_update"},{"data":0,"id":249,"name":"minecraft:info_update2"},{"data":0,"id":250,"name":"minecraft:movingBlock"},{"data":0,"id":251,"name":"minecraft:observer"},{"data":1,"id":251,"name":"minecraft:observer"},{"data":2,"id":251,"name":"minecraft:observer"},{"data":3,"id":251,"name":"minecraft:observer"},{"data":4,"id":251,"name":"minecraft:observer"},{"data":5,"id":251,"name":"minecraft:observer"},{"data":6,"id":251,"name":"minecraft:observer"},{"data":7,"id":251,"name":"minecraft:observer"},{"data":8,"id":251,"name":"minecraft:observer"},{"data":9,"id":251,"name":"minecraft:observer"},{"data":10,"id":251,"name":"minecraft:observer"},{"data":11,"id":251,"name":"minecraft:observer"},{"data":12,"id":251,"name":"minecraft:observer"},{"data":13,"id":251,"name":"minecraft:observer"},{"data":14,"id":251,"name":"minecraft:observer"},{"data":15,"id":251,"name":"minecraft:observer"},{"data":0,"id":252,"name":"minecraft:structure_block"},{"data":1,"id":252,"name":"minecraft:structure_block"},{"data":2,"id":252,"name":"minecraft:structure_block"},{"data":3,"id":252,"name":"minecraft:structure_block"},{"data":4,"id":252,"name":"minecraft:structure_block"},{"data":5,"id":252,"name":"minecraft:structure_block"},{"data":6,"id":252,"name":"minecraft:structure_block"},{"data":7,"id":252,"name":"minecraft:structure_block"},{"data":0,"id":253,"name":"minecraft:hard_glass"},{"data":0,"id":254,"name":"minecraft:hard_stained_glass"},{"data":1,"id":254,"name":"minecraft:hard_stained_glass"},{"data":2,"id":254,"name":"minecraft:hard_stained_glass"},{"data":3,"id":254,"name":"minecraft:hard_stained_glass"},{"data":4,"id":254,"name":"minecraft:hard_stained_glass"},{"data":5,"id":254,"name":"minecraft:hard_stained_glass"},{"data":6,"id":254,"name":"minecraft:hard_stained_glass"},{"data":7,"id":254,"name":"minecraft:hard_stained_glass"},{"data":8,"id":254,"name":"minecraft:hard_stained_glass"},{"data":9,"id":254,"name":"minecraft:hard_stained_glass"},{"data":10,"id":254,"name":"minecraft:hard_stained_glass"},{"data":11,"id":254,"name":"minecraft:hard_stained_glass"},{"data":12,"id":254,"name":"minecraft:hard_stained_glass"},{"data":13,"id":254,"name":"minecraft:hard_stained_glass"},{"data":14,"id":254,"name":"minecraft:hard_stained_glass"},{"data":15,"id":254,"name":"minecraft:hard_stained_glass"},{"data":0,"id":255,"name":"minecraft:reserved6"},{"data":0,"id":257,"name":"minecraft:prismarine_stairs"},{"data":1,"id":257,"name":"minecraft:prismarine_stairs"},{"data":2,"id":257,"name":"minecraft:prismarine_stairs"},{"data":3,"id":257,"name":"minecraft:prismarine_stairs"},{"data":4,"id":257,"name":"minecraft:prismarine_stairs"},{"data":5,"id":257,"name":"minecraft:prismarine_stairs"},{"data":6,"id":257,"name":"minecraft:prismarine_stairs"},{"data":7,"id":257,"name":"minecraft:prismarine_stairs"},{"data":0,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":1,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":2,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":3,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":4,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":5,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":6,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":7,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":0,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":1,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":2,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":3,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":4,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":5,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":6,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":7,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":0,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":1,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":2,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":3,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":0,"id":261,"name":"minecraft:stripped_birch_log"},{"data":1,"id":261,"name":"minecraft:stripped_birch_log"},{"data":2,"id":261,"name":"minecraft:stripped_birch_log"},{"data":3,"id":261,"name":"minecraft:stripped_birch_log"},{"data":0,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":1,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":2,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":3,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":0,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":1,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":2,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":3,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":0,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":1,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":2,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":3,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":0,"id":265,"name":"minecraft:stripped_oak_log"},{"data":1,"id":265,"name":"minecraft:stripped_oak_log"},{"data":2,"id":265,"name":"minecraft:stripped_oak_log"},{"data":3,"id":265,"name":"minecraft:stripped_oak_log"},{"data":0,"id":266,"name":"minecraft:blue_ice"},{"data":0,"id":267,"name":"minecraft:element_1"},{"data":1,"id":267,"name":"minecraft:element_1"},{"data":2,"id":267,"name":"minecraft:element_1"},{"data":3,"id":267,"name":"minecraft:element_1"},{"data":4,"id":267,"name":"minecraft:element_1"},{"data":5,"id":267,"name":"minecraft:element_1"},{"data":6,"id":267,"name":"minecraft:element_1"},{"data":7,"id":267,"name":"minecraft:element_1"},{"data":8,"id":267,"name":"minecraft:element_1"},{"data":9,"id":267,"name":"minecraft:element_1"},{"data":10,"id":267,"name":"minecraft:element_1"},{"data":11,"id":267,"name":"minecraft:element_1"},{"data":12,"id":267,"name":"minecraft:element_1"},{"data":13,"id":267,"name":"minecraft:element_1"},{"data":14,"id":267,"name":"minecraft:element_1"},{"data":15,"id":267,"name":"minecraft:element_1"},{"data":0,"id":268,"name":"minecraft:element_2"},{"data":1,"id":268,"name":"minecraft:element_2"},{"data":2,"id":268,"name":"minecraft:element_2"},{"data":3,"id":268,"name":"minecraft:element_2"},{"data":4,"id":268,"name":"minecraft:element_2"},{"data":5,"id":268,"name":"minecraft:element_2"},{"data":6,"id":268,"name":"minecraft:element_2"},{"data":7,"id":268,"name":"minecraft:element_2"},{"data":8,"id":268,"name":"minecraft:element_2"},{"data":9,"id":268,"name":"minecraft:element_2"},{"data":10,"id":268,"name":"minecraft:element_2"},{"data":11,"id":268,"name":"minecraft:element_2"},{"data":12,"id":268,"name":"minecraft:element_2"},{"data":13,"id":268,"name":"minecraft:element_2"},{"data":14,"id":268,"name":"minecraft:element_2"},{"data":15,"id":268,"name":"minecraft:element_2"},{"data":0,"id":269,"name":"minecraft:element_3"},{"data":1,"id":269,"name":"minecraft:element_3"},{"data":2,"id":269,"name":"minecraft:element_3"},{"data":3,"id":269,"name":"minecraft:element_3"},{"data":4,"id":269,"name":"minecraft:element_3"},{"data":5,"id":269,"name":"minecraft:element_3"},{"data":6,"id":269,"name":"minecraft:element_3"},{"data":7,"id":269,"name":"minecraft:element_3"},{"data":8,"id":269,"name":"minecraft:element_3"},{"data":9,"id":269,"name":"minecraft:element_3"},{"data":10,"id":269,"name":"minecraft:element_3"},{"data":11,"id":269,"name":"minecraft:element_3"},{"data":12,"id":269,"name":"minecraft:element_3"},{"data":13,"id":269,"name":"minecraft:element_3"},{"data":14,"id":269,"name":"minecraft:element_3"},{"data":15,"id":269,"name":"minecraft:element_3"},{"data":0,"id":270,"name":"minecraft:element_4"},{"data":1,"id":270,"name":"minecraft:element_4"},{"data":2,"id":270,"name":"minecraft:element_4"},{"data":3,"id":270,"name":"minecraft:element_4"},{"data":4,"id":270,"name":"minecraft:element_4"},{"data":5,"id":270,"name":"minecraft:element_4"},{"data":6,"id":270,"name":"minecraft:element_4"},{"data":7,"id":270,"name":"minecraft:element_4"},{"data":8,"id":270,"name":"minecraft:element_4"},{"data":9,"id":270,"name":"minecraft:element_4"},{"data":10,"id":270,"name":"minecraft:element_4"},{"data":11,"id":270,"name":"minecraft:element_4"},{"data":12,"id":270,"name":"minecraft:element_4"},{"data":13,"id":270,"name":"minecraft:element_4"},{"data":14,"id":270,"name":"minecraft:element_4"},{"data":15,"id":270,"name":"minecraft:element_4"},{"data":0,"id":271,"name":"minecraft:element_5"},{"data":1,"id":271,"name":"minecraft:element_5"},{"data":2,"id":271,"name":"minecraft:element_5"},{"data":3,"id":271,"name":"minecraft:element_5"},{"data":4,"id":271,"name":"minecraft:element_5"},{"data":5,"id":271,"name":"minecraft:element_5"},{"data":6,"id":271,"name":"minecraft:element_5"},{"data":7,"id":271,"name":"minecraft:element_5"},{"data":8,"id":271,"name":"minecraft:element_5"},{"data":9,"id":271,"name":"minecraft:element_5"},{"data":10,"id":271,"name":"minecraft:element_5"},{"data":11,"id":271,"name":"minecraft:element_5"},{"data":12,"id":271,"name":"minecraft:element_5"},{"data":13,"id":271,"name":"minecraft:element_5"},{"data":14,"id":271,"name":"minecraft:element_5"},{"data":15,"id":271,"name":"minecraft:element_5"},{"data":0,"id":272,"name":"minecraft:element_6"},{"data":1,"id":272,"name":"minecraft:element_6"},{"data":2,"id":272,"name":"minecraft:element_6"},{"data":3,"id":272,"name":"minecraft:element_6"},{"data":4,"id":272,"name":"minecraft:element_6"},{"data":5,"id":272,"name":"minecraft:element_6"},{"data":6,"id":272,"name":"minecraft:element_6"},{"data":7,"id":272,"name":"minecraft:element_6"},{"data":8,"id":272,"name":"minecraft:element_6"},{"data":9,"id":272,"name":"minecraft:element_6"},{"data":10,"id":272,"name":"minecraft:element_6"},{"data":11,"id":272,"name":"minecraft:element_6"},{"data":12,"id":272,"name":"minecraft:element_6"},{"data":13,"id":272,"name":"minecraft:element_6"},{"data":14,"id":272,"name":"minecraft:element_6"},{"data":15,"id":272,"name":"minecraft:element_6"},{"data":0,"id":273,"name":"minecraft:element_7"},{"data":1,"id":273,"name":"minecraft:element_7"},{"data":2,"id":273,"name":"minecraft:element_7"},{"data":3,"id":273,"name":"minecraft:element_7"},{"data":4,"id":273,"name":"minecraft:element_7"},{"data":5,"id":273,"name":"minecraft:element_7"},{"data":6,"id":273,"name":"minecraft:element_7"},{"data":7,"id":273,"name":"minecraft:element_7"},{"data":8,"id":273,"name":"minecraft:element_7"},{"data":9,"id":273,"name":"minecraft:element_7"},{"data":10,"id":273,"name":"minecraft:element_7"},{"data":11,"id":273,"name":"minecraft:element_7"},{"data":12,"id":273,"name":"minecraft:element_7"},{"data":13,"id":273,"name":"minecraft:element_7"},{"data":14,"id":273,"name":"minecraft:element_7"},{"data":15,"id":273,"name":"minecraft:element_7"},{"data":0,"id":274,"name":"minecraft:element_8"},{"data":1,"id":274,"name":"minecraft:element_8"},{"data":2,"id":274,"name":"minecraft:element_8"},{"data":3,"id":274,"name":"minecraft:element_8"},{"data":4,"id":274,"name":"minecraft:element_8"},{"data":5,"id":274,"name":"minecraft:element_8"},{"data":6,"id":274,"name":"minecraft:element_8"},{"data":7,"id":274,"name":"minecraft:element_8"},{"data":8,"id":274,"name":"minecraft:element_8"},{"data":9,"id":274,"name":"minecraft:element_8"},{"data":10,"id":274,"name":"minecraft:element_8"},{"data":11,"id":274,"name":"minecraft:element_8"},{"data":12,"id":274,"name":"minecraft:element_8"},{"data":13,"id":274,"name":"minecraft:element_8"},{"data":14,"id":274,"name":"minecraft:element_8"},{"data":15,"id":274,"name":"minecraft:element_8"},{"data":0,"id":275,"name":"minecraft:element_9"},{"data":1,"id":275,"name":"minecraft:element_9"},{"data":2,"id":275,"name":"minecraft:element_9"},{"data":3,"id":275,"name":"minecraft:element_9"},{"data":4,"id":275,"name":"minecraft:element_9"},{"data":5,"id":275,"name":"minecraft:element_9"},{"data":6,"id":275,"name":"minecraft:element_9"},{"data":7,"id":275,"name":"minecraft:element_9"},{"data":8,"id":275,"name":"minecraft:element_9"},{"data":9,"id":275,"name":"minecraft:element_9"},{"data":10,"id":275,"name":"minecraft:element_9"},{"data":11,"id":275,"name":"minecraft:element_9"},{"data":12,"id":275,"name":"minecraft:element_9"},{"data":13,"id":275,"name":"minecraft:element_9"},{"data":14,"id":275,"name":"minecraft:element_9"},{"data":15,"id":275,"name":"minecraft:element_9"},{"data":0,"id":276,"name":"minecraft:element_10"},{"data":1,"id":276,"name":"minecraft:element_10"},{"data":2,"id":276,"name":"minecraft:element_10"},{"data":3,"id":276,"name":"minecraft:element_10"},{"data":4,"id":276,"name":"minecraft:element_10"},{"data":5,"id":276,"name":"minecraft:element_10"},{"data":6,"id":276,"name":"minecraft:element_10"},{"data":7,"id":276,"name":"minecraft:element_10"},{"data":8,"id":276,"name":"minecraft:element_10"},{"data":9,"id":276,"name":"minecraft:element_10"},{"data":10,"id":276,"name":"minecraft:element_10"},{"data":11,"id":276,"name":"minecraft:element_10"},{"data":12,"id":276,"name":"minecraft:element_10"},{"data":13,"id":276,"name":"minecraft:element_10"},{"data":14,"id":276,"name":"minecraft:element_10"},{"data":15,"id":276,"name":"minecraft:element_10"},{"data":0,"id":277,"name":"minecraft:element_11"},{"data":1,"id":277,"name":"minecraft:element_11"},{"data":2,"id":277,"name":"minecraft:element_11"},{"data":3,"id":277,"name":"minecraft:element_11"},{"data":4,"id":277,"name":"minecraft:element_11"},{"data":5,"id":277,"name":"minecraft:element_11"},{"data":6,"id":277,"name":"minecraft:element_11"},{"data":7,"id":277,"name":"minecraft:element_11"},{"data":8,"id":277,"name":"minecraft:element_11"},{"data":9,"id":277,"name":"minecraft:element_11"},{"data":10,"id":277,"name":"minecraft:element_11"},{"data":11,"id":277,"name":"minecraft:element_11"},{"data":12,"id":277,"name":"minecraft:element_11"},{"data":13,"id":277,"name":"minecraft:element_11"},{"data":14,"id":277,"name":"minecraft:element_11"},{"data":15,"id":277,"name":"minecraft:element_11"},{"data":0,"id":278,"name":"minecraft:element_12"},{"data":1,"id":278,"name":"minecraft:element_12"},{"data":2,"id":278,"name":"minecraft:element_12"},{"data":3,"id":278,"name":"minecraft:element_12"},{"data":4,"id":278,"name":"minecraft:element_12"},{"data":5,"id":278,"name":"minecraft:element_12"},{"data":6,"id":278,"name":"minecraft:element_12"},{"data":7,"id":278,"name":"minecraft:element_12"},{"data":8,"id":278,"name":"minecraft:element_12"},{"data":9,"id":278,"name":"minecraft:element_12"},{"data":10,"id":278,"name":"minecraft:element_12"},{"data":11,"id":278,"name":"minecraft:element_12"},{"data":12,"id":278,"name":"minecraft:element_12"},{"data":13,"id":278,"name":"minecraft:element_12"},{"data":14,"id":278,"name":"minecraft:element_12"},{"data":15,"id":278,"name":"minecraft:element_12"},{"data":0,"id":279,"name":"minecraft:element_13"},{"data":1,"id":279,"name":"minecraft:element_13"},{"data":2,"id":279,"name":"minecraft:element_13"},{"data":3,"id":279,"name":"minecraft:element_13"},{"data":4,"id":279,"name":"minecraft:element_13"},{"data":5,"id":279,"name":"minecraft:element_13"},{"data":6,"id":279,"name":"minecraft:element_13"},{"data":7,"id":279,"name":"minecraft:element_13"},{"data":8,"id":279,"name":"minecraft:element_13"},{"data":9,"id":279,"name":"minecraft:element_13"},{"data":10,"id":279,"name":"minecraft:element_13"},{"data":11,"id":279,"name":"minecraft:element_13"},{"data":12,"id":279,"name":"minecraft:element_13"},{"data":13,"id":279,"name":"minecraft:element_13"},{"data":14,"id":279,"name":"minecraft:element_13"},{"data":15,"id":279,"name":"minecraft:element_13"},{"data":0,"id":280,"name":"minecraft:element_14"},{"data":1,"id":280,"name":"minecraft:element_14"},{"data":2,"id":280,"name":"minecraft:element_14"},{"data":3,"id":280,"name":"minecraft:element_14"},{"data":4,"id":280,"name":"minecraft:element_14"},{"data":5,"id":280,"name":"minecraft:element_14"},{"data":6,"id":280,"name":"minecraft:element_14"},{"data":7,"id":280,"name":"minecraft:element_14"},{"data":8,"id":280,"name":"minecraft:element_14"},{"data":9,"id":280,"name":"minecraft:element_14"},{"data":10,"id":280,"name":"minecraft:element_14"},{"data":11,"id":280,"name":"minecraft:element_14"},{"data":12,"id":280,"name":"minecraft:element_14"},{"data":13,"id":280,"name":"minecraft:element_14"},{"data":14,"id":280,"name":"minecraft:element_14"},{"data":15,"id":280,"name":"minecraft:element_14"},{"data":0,"id":281,"name":"minecraft:element_15"},{"data":1,"id":281,"name":"minecraft:element_15"},{"data":2,"id":281,"name":"minecraft:element_15"},{"data":3,"id":281,"name":"minecraft:element_15"},{"data":4,"id":281,"name":"minecraft:element_15"},{"data":5,"id":281,"name":"minecraft:element_15"},{"data":6,"id":281,"name":"minecraft:element_15"},{"data":7,"id":281,"name":"minecraft:element_15"},{"data":8,"id":281,"name":"minecraft:element_15"},{"data":9,"id":281,"name":"minecraft:element_15"},{"data":10,"id":281,"name":"minecraft:element_15"},{"data":11,"id":281,"name":"minecraft:element_15"},{"data":12,"id":281,"name":"minecraft:element_15"},{"data":13,"id":281,"name":"minecraft:element_15"},{"data":14,"id":281,"name":"minecraft:element_15"},{"data":15,"id":281,"name":"minecraft:element_15"},{"data":0,"id":282,"name":"minecraft:element_16"},{"data":1,"id":282,"name":"minecraft:element_16"},{"data":2,"id":282,"name":"minecraft:element_16"},{"data":3,"id":282,"name":"minecraft:element_16"},{"data":4,"id":282,"name":"minecraft:element_16"},{"data":5,"id":282,"name":"minecraft:element_16"},{"data":6,"id":282,"name":"minecraft:element_16"},{"data":7,"id":282,"name":"minecraft:element_16"},{"data":8,"id":282,"name":"minecraft:element_16"},{"data":9,"id":282,"name":"minecraft:element_16"},{"data":10,"id":282,"name":"minecraft:element_16"},{"data":11,"id":282,"name":"minecraft:element_16"},{"data":12,"id":282,"name":"minecraft:element_16"},{"data":13,"id":282,"name":"minecraft:element_16"},{"data":14,"id":282,"name":"minecraft:element_16"},{"data":15,"id":282,"name":"minecraft:element_16"},{"data":0,"id":283,"name":"minecraft:element_17"},{"data":1,"id":283,"name":"minecraft:element_17"},{"data":2,"id":283,"name":"minecraft:element_17"},{"data":3,"id":283,"name":"minecraft:element_17"},{"data":4,"id":283,"name":"minecraft:element_17"},{"data":5,"id":283,"name":"minecraft:element_17"},{"data":6,"id":283,"name":"minecraft:element_17"},{"data":7,"id":283,"name":"minecraft:element_17"},{"data":8,"id":283,"name":"minecraft:element_17"},{"data":9,"id":283,"name":"minecraft:element_17"},{"data":10,"id":283,"name":"minecraft:element_17"},{"data":11,"id":283,"name":"minecraft:element_17"},{"data":12,"id":283,"name":"minecraft:element_17"},{"data":13,"id":283,"name":"minecraft:element_17"},{"data":14,"id":283,"name":"minecraft:element_17"},{"data":15,"id":283,"name":"minecraft:element_17"},{"data":0,"id":284,"name":"minecraft:element_18"},{"data":1,"id":284,"name":"minecraft:element_18"},{"data":2,"id":284,"name":"minecraft:element_18"},{"data":3,"id":284,"name":"minecraft:element_18"},{"data":4,"id":284,"name":"minecraft:element_18"},{"data":5,"id":284,"name":"minecraft:element_18"},{"data":6,"id":284,"name":"minecraft:element_18"},{"data":7,"id":284,"name":"minecraft:element_18"},{"data":8,"id":284,"name":"minecraft:element_18"},{"data":9,"id":284,"name":"minecraft:element_18"},{"data":10,"id":284,"name":"minecraft:element_18"},{"data":11,"id":284,"name":"minecraft:element_18"},{"data":12,"id":284,"name":"minecraft:element_18"},{"data":13,"id":284,"name":"minecraft:element_18"},{"data":14,"id":284,"name":"minecraft:element_18"},{"data":15,"id":284,"name":"minecraft:element_18"},{"data":0,"id":285,"name":"minecraft:element_19"},{"data":1,"id":285,"name":"minecraft:element_19"},{"data":2,"id":285,"name":"minecraft:element_19"},{"data":3,"id":285,"name":"minecraft:element_19"},{"data":4,"id":285,"name":"minecraft:element_19"},{"data":5,"id":285,"name":"minecraft:element_19"},{"data":6,"id":285,"name":"minecraft:element_19"},{"data":7,"id":285,"name":"minecraft:element_19"},{"data":8,"id":285,"name":"minecraft:element_19"},{"data":9,"id":285,"name":"minecraft:element_19"},{"data":10,"id":285,"name":"minecraft:element_19"},{"data":11,"id":285,"name":"minecraft:element_19"},{"data":12,"id":285,"name":"minecraft:element_19"},{"data":13,"id":285,"name":"minecraft:element_19"},{"data":14,"id":285,"name":"minecraft:element_19"},{"data":15,"id":285,"name":"minecraft:element_19"},{"data":0,"id":286,"name":"minecraft:element_20"},{"data":1,"id":286,"name":"minecraft:element_20"},{"data":2,"id":286,"name":"minecraft:element_20"},{"data":3,"id":286,"name":"minecraft:element_20"},{"data":4,"id":286,"name":"minecraft:element_20"},{"data":5,"id":286,"name":"minecraft:element_20"},{"data":6,"id":286,"name":"minecraft:element_20"},{"data":7,"id":286,"name":"minecraft:element_20"},{"data":8,"id":286,"name":"minecraft:element_20"},{"data":9,"id":286,"name":"minecraft:element_20"},{"data":10,"id":286,"name":"minecraft:element_20"},{"data":11,"id":286,"name":"minecraft:element_20"},{"data":12,"id":286,"name":"minecraft:element_20"},{"data":13,"id":286,"name":"minecraft:element_20"},{"data":14,"id":286,"name":"minecraft:element_20"},{"data":15,"id":286,"name":"minecraft:element_20"},{"data":0,"id":287,"name":"minecraft:element_21"},{"data":1,"id":287,"name":"minecraft:element_21"},{"data":2,"id":287,"name":"minecraft:element_21"},{"data":3,"id":287,"name":"minecraft:element_21"},{"data":4,"id":287,"name":"minecraft:element_21"},{"data":5,"id":287,"name":"minecraft:element_21"},{"data":6,"id":287,"name":"minecraft:element_21"},{"data":7,"id":287,"name":"minecraft:element_21"},{"data":8,"id":287,"name":"minecraft:element_21"},{"data":9,"id":287,"name":"minecraft:element_21"},{"data":10,"id":287,"name":"minecraft:element_21"},{"data":11,"id":287,"name":"minecraft:element_21"},{"data":12,"id":287,"name":"minecraft:element_21"},{"data":13,"id":287,"name":"minecraft:element_21"},{"data":14,"id":287,"name":"minecraft:element_21"},{"data":15,"id":287,"name":"minecraft:element_21"},{"data":0,"id":288,"name":"minecraft:element_22"},{"data":1,"id":288,"name":"minecraft:element_22"},{"data":2,"id":288,"name":"minecraft:element_22"},{"data":3,"id":288,"name":"minecraft:element_22"},{"data":4,"id":288,"name":"minecraft:element_22"},{"data":5,"id":288,"name":"minecraft:element_22"},{"data":6,"id":288,"name":"minecraft:element_22"},{"data":7,"id":288,"name":"minecraft:element_22"},{"data":8,"id":288,"name":"minecraft:element_22"},{"data":9,"id":288,"name":"minecraft:element_22"},{"data":10,"id":288,"name":"minecraft:element_22"},{"data":11,"id":288,"name":"minecraft:element_22"},{"data":12,"id":288,"name":"minecraft:element_22"},{"data":13,"id":288,"name":"minecraft:element_22"},{"data":14,"id":288,"name":"minecraft:element_22"},{"data":15,"id":288,"name":"minecraft:element_22"},{"data":0,"id":289,"name":"minecraft:element_23"},{"data":1,"id":289,"name":"minecraft:element_23"},{"data":2,"id":289,"name":"minecraft:element_23"},{"data":3,"id":289,"name":"minecraft:element_23"},{"data":4,"id":289,"name":"minecraft:element_23"},{"data":5,"id":289,"name":"minecraft:element_23"},{"data":6,"id":289,"name":"minecraft:element_23"},{"data":7,"id":289,"name":"minecraft:element_23"},{"data":8,"id":289,"name":"minecraft:element_23"},{"data":9,"id":289,"name":"minecraft:element_23"},{"data":10,"id":289,"name":"minecraft:element_23"},{"data":11,"id":289,"name":"minecraft:element_23"},{"data":12,"id":289,"name":"minecraft:element_23"},{"data":13,"id":289,"name":"minecraft:element_23"},{"data":14,"id":289,"name":"minecraft:element_23"},{"data":15,"id":289,"name":"minecraft:element_23"},{"data":0,"id":290,"name":"minecraft:element_24"},{"data":1,"id":290,"name":"minecraft:element_24"},{"data":2,"id":290,"name":"minecraft:element_24"},{"data":3,"id":290,"name":"minecraft:element_24"},{"data":4,"id":290,"name":"minecraft:element_24"},{"data":5,"id":290,"name":"minecraft:element_24"},{"data":6,"id":290,"name":"minecraft:element_24"},{"data":7,"id":290,"name":"minecraft:element_24"},{"data":8,"id":290,"name":"minecraft:element_24"},{"data":9,"id":290,"name":"minecraft:element_24"},{"data":10,"id":290,"name":"minecraft:element_24"},{"data":11,"id":290,"name":"minecraft:element_24"},{"data":12,"id":290,"name":"minecraft:element_24"},{"data":13,"id":290,"name":"minecraft:element_24"},{"data":14,"id":290,"name":"minecraft:element_24"},{"data":15,"id":290,"name":"minecraft:element_24"},{"data":0,"id":291,"name":"minecraft:element_25"},{"data":1,"id":291,"name":"minecraft:element_25"},{"data":2,"id":291,"name":"minecraft:element_25"},{"data":3,"id":291,"name":"minecraft:element_25"},{"data":4,"id":291,"name":"minecraft:element_25"},{"data":5,"id":291,"name":"minecraft:element_25"},{"data":6,"id":291,"name":"minecraft:element_25"},{"data":7,"id":291,"name":"minecraft:element_25"},{"data":8,"id":291,"name":"minecraft:element_25"},{"data":9,"id":291,"name":"minecraft:element_25"},{"data":10,"id":291,"name":"minecraft:element_25"},{"data":11,"id":291,"name":"minecraft:element_25"},{"data":12,"id":291,"name":"minecraft:element_25"},{"data":13,"id":291,"name":"minecraft:element_25"},{"data":14,"id":291,"name":"minecraft:element_25"},{"data":15,"id":291,"name":"minecraft:element_25"},{"data":0,"id":292,"name":"minecraft:element_26"},{"data":1,"id":292,"name":"minecraft:element_26"},{"data":2,"id":292,"name":"minecraft:element_26"},{"data":3,"id":292,"name":"minecraft:element_26"},{"data":4,"id":292,"name":"minecraft:element_26"},{"data":5,"id":292,"name":"minecraft:element_26"},{"data":6,"id":292,"name":"minecraft:element_26"},{"data":7,"id":292,"name":"minecraft:element_26"},{"data":8,"id":292,"name":"minecraft:element_26"},{"data":9,"id":292,"name":"minecraft:element_26"},{"data":10,"id":292,"name":"minecraft:element_26"},{"data":11,"id":292,"name":"minecraft:element_26"},{"data":12,"id":292,"name":"minecraft:element_26"},{"data":13,"id":292,"name":"minecraft:element_26"},{"data":14,"id":292,"name":"minecraft:element_26"},{"data":15,"id":292,"name":"minecraft:element_26"},{"data":0,"id":293,"name":"minecraft:element_27"},{"data":1,"id":293,"name":"minecraft:element_27"},{"data":2,"id":293,"name":"minecraft:element_27"},{"data":3,"id":293,"name":"minecraft:element_27"},{"data":4,"id":293,"name":"minecraft:element_27"},{"data":5,"id":293,"name":"minecraft:element_27"},{"data":6,"id":293,"name":"minecraft:element_27"},{"data":7,"id":293,"name":"minecraft:element_27"},{"data":8,"id":293,"name":"minecraft:element_27"},{"data":9,"id":293,"name":"minecraft:element_27"},{"data":10,"id":293,"name":"minecraft:element_27"},{"data":11,"id":293,"name":"minecraft:element_27"},{"data":12,"id":293,"name":"minecraft:element_27"},{"data":13,"id":293,"name":"minecraft:element_27"},{"data":14,"id":293,"name":"minecraft:element_27"},{"data":15,"id":293,"name":"minecraft:element_27"},{"data":0,"id":294,"name":"minecraft:element_28"},{"data":1,"id":294,"name":"minecraft:element_28"},{"data":2,"id":294,"name":"minecraft:element_28"},{"data":3,"id":294,"name":"minecraft:element_28"},{"data":4,"id":294,"name":"minecraft:element_28"},{"data":5,"id":294,"name":"minecraft:element_28"},{"data":6,"id":294,"name":"minecraft:element_28"},{"data":7,"id":294,"name":"minecraft:element_28"},{"data":8,"id":294,"name":"minecraft:element_28"},{"data":9,"id":294,"name":"minecraft:element_28"},{"data":10,"id":294,"name":"minecraft:element_28"},{"data":11,"id":294,"name":"minecraft:element_28"},{"data":12,"id":294,"name":"minecraft:element_28"},{"data":13,"id":294,"name":"minecraft:element_28"},{"data":14,"id":294,"name":"minecraft:element_28"},{"data":15,"id":294,"name":"minecraft:element_28"},{"data":0,"id":295,"name":"minecraft:element_29"},{"data":1,"id":295,"name":"minecraft:element_29"},{"data":2,"id":295,"name":"minecraft:element_29"},{"data":3,"id":295,"name":"minecraft:element_29"},{"data":4,"id":295,"name":"minecraft:element_29"},{"data":5,"id":295,"name":"minecraft:element_29"},{"data":6,"id":295,"name":"minecraft:element_29"},{"data":7,"id":295,"name":"minecraft:element_29"},{"data":8,"id":295,"name":"minecraft:element_29"},{"data":9,"id":295,"name":"minecraft:element_29"},{"data":10,"id":295,"name":"minecraft:element_29"},{"data":11,"id":295,"name":"minecraft:element_29"},{"data":12,"id":295,"name":"minecraft:element_29"},{"data":13,"id":295,"name":"minecraft:element_29"},{"data":14,"id":295,"name":"minecraft:element_29"},{"data":15,"id":295,"name":"minecraft:element_29"},{"data":0,"id":296,"name":"minecraft:element_30"},{"data":1,"id":296,"name":"minecraft:element_30"},{"data":2,"id":296,"name":"minecraft:element_30"},{"data":3,"id":296,"name":"minecraft:element_30"},{"data":4,"id":296,"name":"minecraft:element_30"},{"data":5,"id":296,"name":"minecraft:element_30"},{"data":6,"id":296,"name":"minecraft:element_30"},{"data":7,"id":296,"name":"minecraft:element_30"},{"data":8,"id":296,"name":"minecraft:element_30"},{"data":9,"id":296,"name":"minecraft:element_30"},{"data":10,"id":296,"name":"minecraft:element_30"},{"data":11,"id":296,"name":"minecraft:element_30"},{"data":12,"id":296,"name":"minecraft:element_30"},{"data":13,"id":296,"name":"minecraft:element_30"},{"data":14,"id":296,"name":"minecraft:element_30"},{"data":15,"id":296,"name":"minecraft:element_30"},{"data":0,"id":297,"name":"minecraft:element_31"},{"data":1,"id":297,"name":"minecraft:element_31"},{"data":2,"id":297,"name":"minecraft:element_31"},{"data":3,"id":297,"name":"minecraft:element_31"},{"data":4,"id":297,"name":"minecraft:element_31"},{"data":5,"id":297,"name":"minecraft:element_31"},{"data":6,"id":297,"name":"minecraft:element_31"},{"data":7,"id":297,"name":"minecraft:element_31"},{"data":8,"id":297,"name":"minecraft:element_31"},{"data":9,"id":297,"name":"minecraft:element_31"},{"data":10,"id":297,"name":"minecraft:element_31"},{"data":11,"id":297,"name":"minecraft:element_31"},{"data":12,"id":297,"name":"minecraft:element_31"},{"data":13,"id":297,"name":"minecraft:element_31"},{"data":14,"id":297,"name":"minecraft:element_31"},{"data":15,"id":297,"name":"minecraft:element_31"},{"data":0,"id":298,"name":"minecraft:element_32"},{"data":1,"id":298,"name":"minecraft:element_32"},{"data":2,"id":298,"name":"minecraft:element_32"},{"data":3,"id":298,"name":"minecraft:element_32"},{"data":4,"id":298,"name":"minecraft:element_32"},{"data":5,"id":298,"name":"minecraft:element_32"},{"data":6,"id":298,"name":"minecraft:element_32"},{"data":7,"id":298,"name":"minecraft:element_32"},{"data":8,"id":298,"name":"minecraft:element_32"},{"data":9,"id":298,"name":"minecraft:element_32"},{"data":10,"id":298,"name":"minecraft:element_32"},{"data":11,"id":298,"name":"minecraft:element_32"},{"data":12,"id":298,"name":"minecraft:element_32"},{"data":13,"id":298,"name":"minecraft:element_32"},{"data":14,"id":298,"name":"minecraft:element_32"},{"data":15,"id":298,"name":"minecraft:element_32"},{"data":0,"id":299,"name":"minecraft:element_33"},{"data":1,"id":299,"name":"minecraft:element_33"},{"data":2,"id":299,"name":"minecraft:element_33"},{"data":3,"id":299,"name":"minecraft:element_33"},{"data":4,"id":299,"name":"minecraft:element_33"},{"data":5,"id":299,"name":"minecraft:element_33"},{"data":6,"id":299,"name":"minecraft:element_33"},{"data":7,"id":299,"name":"minecraft:element_33"},{"data":8,"id":299,"name":"minecraft:element_33"},{"data":9,"id":299,"name":"minecraft:element_33"},{"data":10,"id":299,"name":"minecraft:element_33"},{"data":11,"id":299,"name":"minecraft:element_33"},{"data":12,"id":299,"name":"minecraft:element_33"},{"data":13,"id":299,"name":"minecraft:element_33"},{"data":14,"id":299,"name":"minecraft:element_33"},{"data":15,"id":299,"name":"minecraft:element_33"},{"data":0,"id":300,"name":"minecraft:element_34"},{"data":1,"id":300,"name":"minecraft:element_34"},{"data":2,"id":300,"name":"minecraft:element_34"},{"data":3,"id":300,"name":"minecraft:element_34"},{"data":4,"id":300,"name":"minecraft:element_34"},{"data":5,"id":300,"name":"minecraft:element_34"},{"data":6,"id":300,"name":"minecraft:element_34"},{"data":7,"id":300,"name":"minecraft:element_34"},{"data":8,"id":300,"name":"minecraft:element_34"},{"data":9,"id":300,"name":"minecraft:element_34"},{"data":10,"id":300,"name":"minecraft:element_34"},{"data":11,"id":300,"name":"minecraft:element_34"},{"data":12,"id":300,"name":"minecraft:element_34"},{"data":13,"id":300,"name":"minecraft:element_34"},{"data":14,"id":300,"name":"minecraft:element_34"},{"data":15,"id":300,"name":"minecraft:element_34"},{"data":0,"id":301,"name":"minecraft:element_35"},{"data":1,"id":301,"name":"minecraft:element_35"},{"data":2,"id":301,"name":"minecraft:element_35"},{"data":3,"id":301,"name":"minecraft:element_35"},{"data":4,"id":301,"name":"minecraft:element_35"},{"data":5,"id":301,"name":"minecraft:element_35"},{"data":6,"id":301,"name":"minecraft:element_35"},{"data":7,"id":301,"name":"minecraft:element_35"},{"data":8,"id":301,"name":"minecraft:element_35"},{"data":9,"id":301,"name":"minecraft:element_35"},{"data":10,"id":301,"name":"minecraft:element_35"},{"data":11,"id":301,"name":"minecraft:element_35"},{"data":12,"id":301,"name":"minecraft:element_35"},{"data":13,"id":301,"name":"minecraft:element_35"},{"data":14,"id":301,"name":"minecraft:element_35"},{"data":15,"id":301,"name":"minecraft:element_35"},{"data":0,"id":302,"name":"minecraft:element_36"},{"data":1,"id":302,"name":"minecraft:element_36"},{"data":2,"id":302,"name":"minecraft:element_36"},{"data":3,"id":302,"name":"minecraft:element_36"},{"data":4,"id":302,"name":"minecraft:element_36"},{"data":5,"id":302,"name":"minecraft:element_36"},{"data":6,"id":302,"name":"minecraft:element_36"},{"data":7,"id":302,"name":"minecraft:element_36"},{"data":8,"id":302,"name":"minecraft:element_36"},{"data":9,"id":302,"name":"minecraft:element_36"},{"data":10,"id":302,"name":"minecraft:element_36"},{"data":11,"id":302,"name":"minecraft:element_36"},{"data":12,"id":302,"name":"minecraft:element_36"},{"data":13,"id":302,"name":"minecraft:element_36"},{"data":14,"id":302,"name":"minecraft:element_36"},{"data":15,"id":302,"name":"minecraft:element_36"},{"data":0,"id":303,"name":"minecraft:element_37"},{"data":1,"id":303,"name":"minecraft:element_37"},{"data":2,"id":303,"name":"minecraft:element_37"},{"data":3,"id":303,"name":"minecraft:element_37"},{"data":4,"id":303,"name":"minecraft:element_37"},{"data":5,"id":303,"name":"minecraft:element_37"},{"data":6,"id":303,"name":"minecraft:element_37"},{"data":7,"id":303,"name":"minecraft:element_37"},{"data":8,"id":303,"name":"minecraft:element_37"},{"data":9,"id":303,"name":"minecraft:element_37"},{"data":10,"id":303,"name":"minecraft:element_37"},{"data":11,"id":303,"name":"minecraft:element_37"},{"data":12,"id":303,"name":"minecraft:element_37"},{"data":13,"id":303,"name":"minecraft:element_37"},{"data":14,"id":303,"name":"minecraft:element_37"},{"data":15,"id":303,"name":"minecraft:element_37"},{"data":0,"id":304,"name":"minecraft:element_38"},{"data":1,"id":304,"name":"minecraft:element_38"},{"data":2,"id":304,"name":"minecraft:element_38"},{"data":3,"id":304,"name":"minecraft:element_38"},{"data":4,"id":304,"name":"minecraft:element_38"},{"data":5,"id":304,"name":"minecraft:element_38"},{"data":6,"id":304,"name":"minecraft:element_38"},{"data":7,"id":304,"name":"minecraft:element_38"},{"data":8,"id":304,"name":"minecraft:element_38"},{"data":9,"id":304,"name":"minecraft:element_38"},{"data":10,"id":304,"name":"minecraft:element_38"},{"data":11,"id":304,"name":"minecraft:element_38"},{"data":12,"id":304,"name":"minecraft:element_38"},{"data":13,"id":304,"name":"minecraft:element_38"},{"data":14,"id":304,"name":"minecraft:element_38"},{"data":15,"id":304,"name":"minecraft:element_38"},{"data":0,"id":305,"name":"minecraft:element_39"},{"data":1,"id":305,"name":"minecraft:element_39"},{"data":2,"id":305,"name":"minecraft:element_39"},{"data":3,"id":305,"name":"minecraft:element_39"},{"data":4,"id":305,"name":"minecraft:element_39"},{"data":5,"id":305,"name":"minecraft:element_39"},{"data":6,"id":305,"name":"minecraft:element_39"},{"data":7,"id":305,"name":"minecraft:element_39"},{"data":8,"id":305,"name":"minecraft:element_39"},{"data":9,"id":305,"name":"minecraft:element_39"},{"data":10,"id":305,"name":"minecraft:element_39"},{"data":11,"id":305,"name":"minecraft:element_39"},{"data":12,"id":305,"name":"minecraft:element_39"},{"data":13,"id":305,"name":"minecraft:element_39"},{"data":14,"id":305,"name":"minecraft:element_39"},{"data":15,"id":305,"name":"minecraft:element_39"},{"data":0,"id":306,"name":"minecraft:element_40"},{"data":1,"id":306,"name":"minecraft:element_40"},{"data":2,"id":306,"name":"minecraft:element_40"},{"data":3,"id":306,"name":"minecraft:element_40"},{"data":4,"id":306,"name":"minecraft:element_40"},{"data":5,"id":306,"name":"minecraft:element_40"},{"data":6,"id":306,"name":"minecraft:element_40"},{"data":7,"id":306,"name":"minecraft:element_40"},{"data":8,"id":306,"name":"minecraft:element_40"},{"data":9,"id":306,"name":"minecraft:element_40"},{"data":10,"id":306,"name":"minecraft:element_40"},{"data":11,"id":306,"name":"minecraft:element_40"},{"data":12,"id":306,"name":"minecraft:element_40"},{"data":13,"id":306,"name":"minecraft:element_40"},{"data":14,"id":306,"name":"minecraft:element_40"},{"data":15,"id":306,"name":"minecraft:element_40"},{"data":0,"id":307,"name":"minecraft:element_41"},{"data":1,"id":307,"name":"minecraft:element_41"},{"data":2,"id":307,"name":"minecraft:element_41"},{"data":3,"id":307,"name":"minecraft:element_41"},{"data":4,"id":307,"name":"minecraft:element_41"},{"data":5,"id":307,"name":"minecraft:element_41"},{"data":6,"id":307,"name":"minecraft:element_41"},{"data":7,"id":307,"name":"minecraft:element_41"},{"data":8,"id":307,"name":"minecraft:element_41"},{"data":9,"id":307,"name":"minecraft:element_41"},{"data":10,"id":307,"name":"minecraft:element_41"},{"data":11,"id":307,"name":"minecraft:element_41"},{"data":12,"id":307,"name":"minecraft:element_41"},{"data":13,"id":307,"name":"minecraft:element_41"},{"data":14,"id":307,"name":"minecraft:element_41"},{"data":15,"id":307,"name":"minecraft:element_41"},{"data":0,"id":308,"name":"minecraft:element_42"},{"data":1,"id":308,"name":"minecraft:element_42"},{"data":2,"id":308,"name":"minecraft:element_42"},{"data":3,"id":308,"name":"minecraft:element_42"},{"data":4,"id":308,"name":"minecraft:element_42"},{"data":5,"id":308,"name":"minecraft:element_42"},{"data":6,"id":308,"name":"minecraft:element_42"},{"data":7,"id":308,"name":"minecraft:element_42"},{"data":8,"id":308,"name":"minecraft:element_42"},{"data":9,"id":308,"name":"minecraft:element_42"},{"data":10,"id":308,"name":"minecraft:element_42"},{"data":11,"id":308,"name":"minecraft:element_42"},{"data":12,"id":308,"name":"minecraft:element_42"},{"data":13,"id":308,"name":"minecraft:element_42"},{"data":14,"id":308,"name":"minecraft:element_42"},{"data":15,"id":308,"name":"minecraft:element_42"},{"data":0,"id":309,"name":"minecraft:element_43"},{"data":1,"id":309,"name":"minecraft:element_43"},{"data":2,"id":309,"name":"minecraft:element_43"},{"data":3,"id":309,"name":"minecraft:element_43"},{"data":4,"id":309,"name":"minecraft:element_43"},{"data":5,"id":309,"name":"minecraft:element_43"},{"data":6,"id":309,"name":"minecraft:element_43"},{"data":7,"id":309,"name":"minecraft:element_43"},{"data":8,"id":309,"name":"minecraft:element_43"},{"data":9,"id":309,"name":"minecraft:element_43"},{"data":10,"id":309,"name":"minecraft:element_43"},{"data":11,"id":309,"name":"minecraft:element_43"},{"data":12,"id":309,"name":"minecraft:element_43"},{"data":13,"id":309,"name":"minecraft:element_43"},{"data":14,"id":309,"name":"minecraft:element_43"},{"data":15,"id":309,"name":"minecraft:element_43"},{"data":0,"id":310,"name":"minecraft:element_44"},{"data":1,"id":310,"name":"minecraft:element_44"},{"data":2,"id":310,"name":"minecraft:element_44"},{"data":3,"id":310,"name":"minecraft:element_44"},{"data":4,"id":310,"name":"minecraft:element_44"},{"data":5,"id":310,"name":"minecraft:element_44"},{"data":6,"id":310,"name":"minecraft:element_44"},{"data":7,"id":310,"name":"minecraft:element_44"},{"data":8,"id":310,"name":"minecraft:element_44"},{"data":9,"id":310,"name":"minecraft:element_44"},{"data":10,"id":310,"name":"minecraft:element_44"},{"data":11,"id":310,"name":"minecraft:element_44"},{"data":12,"id":310,"name":"minecraft:element_44"},{"data":13,"id":310,"name":"minecraft:element_44"},{"data":14,"id":310,"name":"minecraft:element_44"},{"data":15,"id":310,"name":"minecraft:element_44"},{"data":0,"id":311,"name":"minecraft:element_45"},{"data":1,"id":311,"name":"minecraft:element_45"},{"data":2,"id":311,"name":"minecraft:element_45"},{"data":3,"id":311,"name":"minecraft:element_45"},{"data":4,"id":311,"name":"minecraft:element_45"},{"data":5,"id":311,"name":"minecraft:element_45"},{"data":6,"id":311,"name":"minecraft:element_45"},{"data":7,"id":311,"name":"minecraft:element_45"},{"data":8,"id":311,"name":"minecraft:element_45"},{"data":9,"id":311,"name":"minecraft:element_45"},{"data":10,"id":311,"name":"minecraft:element_45"},{"data":11,"id":311,"name":"minecraft:element_45"},{"data":12,"id":311,"name":"minecraft:element_45"},{"data":13,"id":311,"name":"minecraft:element_45"},{"data":14,"id":311,"name":"minecraft:element_45"},{"data":15,"id":311,"name":"minecraft:element_45"},{"data":0,"id":312,"name":"minecraft:element_46"},{"data":1,"id":312,"name":"minecraft:element_46"},{"data":2,"id":312,"name":"minecraft:element_46"},{"data":3,"id":312,"name":"minecraft:element_46"},{"data":4,"id":312,"name":"minecraft:element_46"},{"data":5,"id":312,"name":"minecraft:element_46"},{"data":6,"id":312,"name":"minecraft:element_46"},{"data":7,"id":312,"name":"minecraft:element_46"},{"data":8,"id":312,"name":"minecraft:element_46"},{"data":9,"id":312,"name":"minecraft:element_46"},{"data":10,"id":312,"name":"minecraft:element_46"},{"data":11,"id":312,"name":"minecraft:element_46"},{"data":12,"id":312,"name":"minecraft:element_46"},{"data":13,"id":312,"name":"minecraft:element_46"},{"data":14,"id":312,"name":"minecraft:element_46"},{"data":15,"id":312,"name":"minecraft:element_46"},{"data":0,"id":313,"name":"minecraft:element_47"},{"data":1,"id":313,"name":"minecraft:element_47"},{"data":2,"id":313,"name":"minecraft:element_47"},{"data":3,"id":313,"name":"minecraft:element_47"},{"data":4,"id":313,"name":"minecraft:element_47"},{"data":5,"id":313,"name":"minecraft:element_47"},{"data":6,"id":313,"name":"minecraft:element_47"},{"data":7,"id":313,"name":"minecraft:element_47"},{"data":8,"id":313,"name":"minecraft:element_47"},{"data":9,"id":313,"name":"minecraft:element_47"},{"data":10,"id":313,"name":"minecraft:element_47"},{"data":11,"id":313,"name":"minecraft:element_47"},{"data":12,"id":313,"name":"minecraft:element_47"},{"data":13,"id":313,"name":"minecraft:element_47"},{"data":14,"id":313,"name":"minecraft:element_47"},{"data":15,"id":313,"name":"minecraft:element_47"},{"data":0,"id":314,"name":"minecraft:element_48"},{"data":1,"id":314,"name":"minecraft:element_48"},{"data":2,"id":314,"name":"minecraft:element_48"},{"data":3,"id":314,"name":"minecraft:element_48"},{"data":4,"id":314,"name":"minecraft:element_48"},{"data":5,"id":314,"name":"minecraft:element_48"},{"data":6,"id":314,"name":"minecraft:element_48"},{"data":7,"id":314,"name":"minecraft:element_48"},{"data":8,"id":314,"name":"minecraft:element_48"},{"data":9,"id":314,"name":"minecraft:element_48"},{"data":10,"id":314,"name":"minecraft:element_48"},{"data":11,"id":314,"name":"minecraft:element_48"},{"data":12,"id":314,"name":"minecraft:element_48"},{"data":13,"id":314,"name":"minecraft:element_48"},{"data":14,"id":314,"name":"minecraft:element_48"},{"data":15,"id":314,"name":"minecraft:element_48"},{"data":0,"id":315,"name":"minecraft:element_49"},{"data":1,"id":315,"name":"minecraft:element_49"},{"data":2,"id":315,"name":"minecraft:element_49"},{"data":3,"id":315,"name":"minecraft:element_49"},{"data":4,"id":315,"name":"minecraft:element_49"},{"data":5,"id":315,"name":"minecraft:element_49"},{"data":6,"id":315,"name":"minecraft:element_49"},{"data":7,"id":315,"name":"minecraft:element_49"},{"data":8,"id":315,"name":"minecraft:element_49"},{"data":9,"id":315,"name":"minecraft:element_49"},{"data":10,"id":315,"name":"minecraft:element_49"},{"data":11,"id":315,"name":"minecraft:element_49"},{"data":12,"id":315,"name":"minecraft:element_49"},{"data":13,"id":315,"name":"minecraft:element_49"},{"data":14,"id":315,"name":"minecraft:element_49"},{"data":15,"id":315,"name":"minecraft:element_49"},{"data":0,"id":316,"name":"minecraft:element_50"},{"data":1,"id":316,"name":"minecraft:element_50"},{"data":2,"id":316,"name":"minecraft:element_50"},{"data":3,"id":316,"name":"minecraft:element_50"},{"data":4,"id":316,"name":"minecraft:element_50"},{"data":5,"id":316,"name":"minecraft:element_50"},{"data":6,"id":316,"name":"minecraft:element_50"},{"data":7,"id":316,"name":"minecraft:element_50"},{"data":8,"id":316,"name":"minecraft:element_50"},{"data":9,"id":316,"name":"minecraft:element_50"},{"data":10,"id":316,"name":"minecraft:element_50"},{"data":11,"id":316,"name":"minecraft:element_50"},{"data":12,"id":316,"name":"minecraft:element_50"},{"data":13,"id":316,"name":"minecraft:element_50"},{"data":14,"id":316,"name":"minecraft:element_50"},{"data":15,"id":316,"name":"minecraft:element_50"},{"data":0,"id":317,"name":"minecraft:element_51"},{"data":1,"id":317,"name":"minecraft:element_51"},{"data":2,"id":317,"name":"minecraft:element_51"},{"data":3,"id":317,"name":"minecraft:element_51"},{"data":4,"id":317,"name":"minecraft:element_51"},{"data":5,"id":317,"name":"minecraft:element_51"},{"data":6,"id":317,"name":"minecraft:element_51"},{"data":7,"id":317,"name":"minecraft:element_51"},{"data":8,"id":317,"name":"minecraft:element_51"},{"data":9,"id":317,"name":"minecraft:element_51"},{"data":10,"id":317,"name":"minecraft:element_51"},{"data":11,"id":317,"name":"minecraft:element_51"},{"data":12,"id":317,"name":"minecraft:element_51"},{"data":13,"id":317,"name":"minecraft:element_51"},{"data":14,"id":317,"name":"minecraft:element_51"},{"data":15,"id":317,"name":"minecraft:element_51"},{"data":0,"id":318,"name":"minecraft:element_52"},{"data":1,"id":318,"name":"minecraft:element_52"},{"data":2,"id":318,"name":"minecraft:element_52"},{"data":3,"id":318,"name":"minecraft:element_52"},{"data":4,"id":318,"name":"minecraft:element_52"},{"data":5,"id":318,"name":"minecraft:element_52"},{"data":6,"id":318,"name":"minecraft:element_52"},{"data":7,"id":318,"name":"minecraft:element_52"},{"data":8,"id":318,"name":"minecraft:element_52"},{"data":9,"id":318,"name":"minecraft:element_52"},{"data":10,"id":318,"name":"minecraft:element_52"},{"data":11,"id":318,"name":"minecraft:element_52"},{"data":12,"id":318,"name":"minecraft:element_52"},{"data":13,"id":318,"name":"minecraft:element_52"},{"data":14,"id":318,"name":"minecraft:element_52"},{"data":15,"id":318,"name":"minecraft:element_52"},{"data":0,"id":319,"name":"minecraft:element_53"},{"data":1,"id":319,"name":"minecraft:element_53"},{"data":2,"id":319,"name":"minecraft:element_53"},{"data":3,"id":319,"name":"minecraft:element_53"},{"data":4,"id":319,"name":"minecraft:element_53"},{"data":5,"id":319,"name":"minecraft:element_53"},{"data":6,"id":319,"name":"minecraft:element_53"},{"data":7,"id":319,"name":"minecraft:element_53"},{"data":8,"id":319,"name":"minecraft:element_53"},{"data":9,"id":319,"name":"minecraft:element_53"},{"data":10,"id":319,"name":"minecraft:element_53"},{"data":11,"id":319,"name":"minecraft:element_53"},{"data":12,"id":319,"name":"minecraft:element_53"},{"data":13,"id":319,"name":"minecraft:element_53"},{"data":14,"id":319,"name":"minecraft:element_53"},{"data":15,"id":319,"name":"minecraft:element_53"},{"data":0,"id":320,"name":"minecraft:element_54"},{"data":1,"id":320,"name":"minecraft:element_54"},{"data":2,"id":320,"name":"minecraft:element_54"},{"data":3,"id":320,"name":"minecraft:element_54"},{"data":4,"id":320,"name":"minecraft:element_54"},{"data":5,"id":320,"name":"minecraft:element_54"},{"data":6,"id":320,"name":"minecraft:element_54"},{"data":7,"id":320,"name":"minecraft:element_54"},{"data":8,"id":320,"name":"minecraft:element_54"},{"data":9,"id":320,"name":"minecraft:element_54"},{"data":10,"id":320,"name":"minecraft:element_54"},{"data":11,"id":320,"name":"minecraft:element_54"},{"data":12,"id":320,"name":"minecraft:element_54"},{"data":13,"id":320,"name":"minecraft:element_54"},{"data":14,"id":320,"name":"minecraft:element_54"},{"data":15,"id":320,"name":"minecraft:element_54"},{"data":0,"id":321,"name":"minecraft:element_55"},{"data":1,"id":321,"name":"minecraft:element_55"},{"data":2,"id":321,"name":"minecraft:element_55"},{"data":3,"id":321,"name":"minecraft:element_55"},{"data":4,"id":321,"name":"minecraft:element_55"},{"data":5,"id":321,"name":"minecraft:element_55"},{"data":6,"id":321,"name":"minecraft:element_55"},{"data":7,"id":321,"name":"minecraft:element_55"},{"data":8,"id":321,"name":"minecraft:element_55"},{"data":9,"id":321,"name":"minecraft:element_55"},{"data":10,"id":321,"name":"minecraft:element_55"},{"data":11,"id":321,"name":"minecraft:element_55"},{"data":12,"id":321,"name":"minecraft:element_55"},{"data":13,"id":321,"name":"minecraft:element_55"},{"data":14,"id":321,"name":"minecraft:element_55"},{"data":15,"id":321,"name":"minecraft:element_55"},{"data":0,"id":322,"name":"minecraft:element_56"},{"data":1,"id":322,"name":"minecraft:element_56"},{"data":2,"id":322,"name":"minecraft:element_56"},{"data":3,"id":322,"name":"minecraft:element_56"},{"data":4,"id":322,"name":"minecraft:element_56"},{"data":5,"id":322,"name":"minecraft:element_56"},{"data":6,"id":322,"name":"minecraft:element_56"},{"data":7,"id":322,"name":"minecraft:element_56"},{"data":8,"id":322,"name":"minecraft:element_56"},{"data":9,"id":322,"name":"minecraft:element_56"},{"data":10,"id":322,"name":"minecraft:element_56"},{"data":11,"id":322,"name":"minecraft:element_56"},{"data":12,"id":322,"name":"minecraft:element_56"},{"data":13,"id":322,"name":"minecraft:element_56"},{"data":14,"id":322,"name":"minecraft:element_56"},{"data":15,"id":322,"name":"minecraft:element_56"},{"data":0,"id":323,"name":"minecraft:element_57"},{"data":1,"id":323,"name":"minecraft:element_57"},{"data":2,"id":323,"name":"minecraft:element_57"},{"data":3,"id":323,"name":"minecraft:element_57"},{"data":4,"id":323,"name":"minecraft:element_57"},{"data":5,"id":323,"name":"minecraft:element_57"},{"data":6,"id":323,"name":"minecraft:element_57"},{"data":7,"id":323,"name":"minecraft:element_57"},{"data":8,"id":323,"name":"minecraft:element_57"},{"data":9,"id":323,"name":"minecraft:element_57"},{"data":10,"id":323,"name":"minecraft:element_57"},{"data":11,"id":323,"name":"minecraft:element_57"},{"data":12,"id":323,"name":"minecraft:element_57"},{"data":13,"id":323,"name":"minecraft:element_57"},{"data":14,"id":323,"name":"minecraft:element_57"},{"data":15,"id":323,"name":"minecraft:element_57"},{"data":0,"id":324,"name":"minecraft:element_58"},{"data":1,"id":324,"name":"minecraft:element_58"},{"data":2,"id":324,"name":"minecraft:element_58"},{"data":3,"id":324,"name":"minecraft:element_58"},{"data":4,"id":324,"name":"minecraft:element_58"},{"data":5,"id":324,"name":"minecraft:element_58"},{"data":6,"id":324,"name":"minecraft:element_58"},{"data":7,"id":324,"name":"minecraft:element_58"},{"data":8,"id":324,"name":"minecraft:element_58"},{"data":9,"id":324,"name":"minecraft:element_58"},{"data":10,"id":324,"name":"minecraft:element_58"},{"data":11,"id":324,"name":"minecraft:element_58"},{"data":12,"id":324,"name":"minecraft:element_58"},{"data":13,"id":324,"name":"minecraft:element_58"},{"data":14,"id":324,"name":"minecraft:element_58"},{"data":15,"id":324,"name":"minecraft:element_58"},{"data":0,"id":325,"name":"minecraft:element_59"},{"data":1,"id":325,"name":"minecraft:element_59"},{"data":2,"id":325,"name":"minecraft:element_59"},{"data":3,"id":325,"name":"minecraft:element_59"},{"data":4,"id":325,"name":"minecraft:element_59"},{"data":5,"id":325,"name":"minecraft:element_59"},{"data":6,"id":325,"name":"minecraft:element_59"},{"data":7,"id":325,"name":"minecraft:element_59"},{"data":8,"id":325,"name":"minecraft:element_59"},{"data":9,"id":325,"name":"minecraft:element_59"},{"data":10,"id":325,"name":"minecraft:element_59"},{"data":11,"id":325,"name":"minecraft:element_59"},{"data":12,"id":325,"name":"minecraft:element_59"},{"data":13,"id":325,"name":"minecraft:element_59"},{"data":14,"id":325,"name":"minecraft:element_59"},{"data":15,"id":325,"name":"minecraft:element_59"},{"data":0,"id":326,"name":"minecraft:element_60"},{"data":1,"id":326,"name":"minecraft:element_60"},{"data":2,"id":326,"name":"minecraft:element_60"},{"data":3,"id":326,"name":"minecraft:element_60"},{"data":4,"id":326,"name":"minecraft:element_60"},{"data":5,"id":326,"name":"minecraft:element_60"},{"data":6,"id":326,"name":"minecraft:element_60"},{"data":7,"id":326,"name":"minecraft:element_60"},{"data":8,"id":326,"name":"minecraft:element_60"},{"data":9,"id":326,"name":"minecraft:element_60"},{"data":10,"id":326,"name":"minecraft:element_60"},{"data":11,"id":326,"name":"minecraft:element_60"},{"data":12,"id":326,"name":"minecraft:element_60"},{"data":13,"id":326,"name":"minecraft:element_60"},{"data":14,"id":326,"name":"minecraft:element_60"},{"data":15,"id":326,"name":"minecraft:element_60"},{"data":0,"id":327,"name":"minecraft:element_61"},{"data":1,"id":327,"name":"minecraft:element_61"},{"data":2,"id":327,"name":"minecraft:element_61"},{"data":3,"id":327,"name":"minecraft:element_61"},{"data":4,"id":327,"name":"minecraft:element_61"},{"data":5,"id":327,"name":"minecraft:element_61"},{"data":6,"id":327,"name":"minecraft:element_61"},{"data":7,"id":327,"name":"minecraft:element_61"},{"data":8,"id":327,"name":"minecraft:element_61"},{"data":9,"id":327,"name":"minecraft:element_61"},{"data":10,"id":327,"name":"minecraft:element_61"},{"data":11,"id":327,"name":"minecraft:element_61"},{"data":12,"id":327,"name":"minecraft:element_61"},{"data":13,"id":327,"name":"minecraft:element_61"},{"data":14,"id":327,"name":"minecraft:element_61"},{"data":15,"id":327,"name":"minecraft:element_61"},{"data":0,"id":328,"name":"minecraft:element_62"},{"data":1,"id":328,"name":"minecraft:element_62"},{"data":2,"id":328,"name":"minecraft:element_62"},{"data":3,"id":328,"name":"minecraft:element_62"},{"data":4,"id":328,"name":"minecraft:element_62"},{"data":5,"id":328,"name":"minecraft:element_62"},{"data":6,"id":328,"name":"minecraft:element_62"},{"data":7,"id":328,"name":"minecraft:element_62"},{"data":8,"id":328,"name":"minecraft:element_62"},{"data":9,"id":328,"name":"minecraft:element_62"},{"data":10,"id":328,"name":"minecraft:element_62"},{"data":11,"id":328,"name":"minecraft:element_62"},{"data":12,"id":328,"name":"minecraft:element_62"},{"data":13,"id":328,"name":"minecraft:element_62"},{"data":14,"id":328,"name":"minecraft:element_62"},{"data":15,"id":328,"name":"minecraft:element_62"},{"data":0,"id":329,"name":"minecraft:element_63"},{"data":1,"id":329,"name":"minecraft:element_63"},{"data":2,"id":329,"name":"minecraft:element_63"},{"data":3,"id":329,"name":"minecraft:element_63"},{"data":4,"id":329,"name":"minecraft:element_63"},{"data":5,"id":329,"name":"minecraft:element_63"},{"data":6,"id":329,"name":"minecraft:element_63"},{"data":7,"id":329,"name":"minecraft:element_63"},{"data":8,"id":329,"name":"minecraft:element_63"},{"data":9,"id":329,"name":"minecraft:element_63"},{"data":10,"id":329,"name":"minecraft:element_63"},{"data":11,"id":329,"name":"minecraft:element_63"},{"data":12,"id":329,"name":"minecraft:element_63"},{"data":13,"id":329,"name":"minecraft:element_63"},{"data":14,"id":329,"name":"minecraft:element_63"},{"data":15,"id":329,"name":"minecraft:element_63"},{"data":0,"id":330,"name":"minecraft:element_64"},{"data":1,"id":330,"name":"minecraft:element_64"},{"data":2,"id":330,"name":"minecraft:element_64"},{"data":3,"id":330,"name":"minecraft:element_64"},{"data":4,"id":330,"name":"minecraft:element_64"},{"data":5,"id":330,"name":"minecraft:element_64"},{"data":6,"id":330,"name":"minecraft:element_64"},{"data":7,"id":330,"name":"minecraft:element_64"},{"data":8,"id":330,"name":"minecraft:element_64"},{"data":9,"id":330,"name":"minecraft:element_64"},{"data":10,"id":330,"name":"minecraft:element_64"},{"data":11,"id":330,"name":"minecraft:element_64"},{"data":12,"id":330,"name":"minecraft:element_64"},{"data":13,"id":330,"name":"minecraft:element_64"},{"data":14,"id":330,"name":"minecraft:element_64"},{"data":15,"id":330,"name":"minecraft:element_64"},{"data":0,"id":331,"name":"minecraft:element_65"},{"data":1,"id":331,"name":"minecraft:element_65"},{"data":2,"id":331,"name":"minecraft:element_65"},{"data":3,"id":331,"name":"minecraft:element_65"},{"data":4,"id":331,"name":"minecraft:element_65"},{"data":5,"id":331,"name":"minecraft:element_65"},{"data":6,"id":331,"name":"minecraft:element_65"},{"data":7,"id":331,"name":"minecraft:element_65"},{"data":8,"id":331,"name":"minecraft:element_65"},{"data":9,"id":331,"name":"minecraft:element_65"},{"data":10,"id":331,"name":"minecraft:element_65"},{"data":11,"id":331,"name":"minecraft:element_65"},{"data":12,"id":331,"name":"minecraft:element_65"},{"data":13,"id":331,"name":"minecraft:element_65"},{"data":14,"id":331,"name":"minecraft:element_65"},{"data":15,"id":331,"name":"minecraft:element_65"},{"data":0,"id":332,"name":"minecraft:element_66"},{"data":1,"id":332,"name":"minecraft:element_66"},{"data":2,"id":332,"name":"minecraft:element_66"},{"data":3,"id":332,"name":"minecraft:element_66"},{"data":4,"id":332,"name":"minecraft:element_66"},{"data":5,"id":332,"name":"minecraft:element_66"},{"data":6,"id":332,"name":"minecraft:element_66"},{"data":7,"id":332,"name":"minecraft:element_66"},{"data":8,"id":332,"name":"minecraft:element_66"},{"data":9,"id":332,"name":"minecraft:element_66"},{"data":10,"id":332,"name":"minecraft:element_66"},{"data":11,"id":332,"name":"minecraft:element_66"},{"data":12,"id":332,"name":"minecraft:element_66"},{"data":13,"id":332,"name":"minecraft:element_66"},{"data":14,"id":332,"name":"minecraft:element_66"},{"data":15,"id":332,"name":"minecraft:element_66"},{"data":0,"id":333,"name":"minecraft:element_67"},{"data":1,"id":333,"name":"minecraft:element_67"},{"data":2,"id":333,"name":"minecraft:element_67"},{"data":3,"id":333,"name":"minecraft:element_67"},{"data":4,"id":333,"name":"minecraft:element_67"},{"data":5,"id":333,"name":"minecraft:element_67"},{"data":6,"id":333,"name":"minecraft:element_67"},{"data":7,"id":333,"name":"minecraft:element_67"},{"data":8,"id":333,"name":"minecraft:element_67"},{"data":9,"id":333,"name":"minecraft:element_67"},{"data":10,"id":333,"name":"minecraft:element_67"},{"data":11,"id":333,"name":"minecraft:element_67"},{"data":12,"id":333,"name":"minecraft:element_67"},{"data":13,"id":333,"name":"minecraft:element_67"},{"data":14,"id":333,"name":"minecraft:element_67"},{"data":15,"id":333,"name":"minecraft:element_67"},{"data":0,"id":334,"name":"minecraft:element_68"},{"data":1,"id":334,"name":"minecraft:element_68"},{"data":2,"id":334,"name":"minecraft:element_68"},{"data":3,"id":334,"name":"minecraft:element_68"},{"data":4,"id":334,"name":"minecraft:element_68"},{"data":5,"id":334,"name":"minecraft:element_68"},{"data":6,"id":334,"name":"minecraft:element_68"},{"data":7,"id":334,"name":"minecraft:element_68"},{"data":8,"id":334,"name":"minecraft:element_68"},{"data":9,"id":334,"name":"minecraft:element_68"},{"data":10,"id":334,"name":"minecraft:element_68"},{"data":11,"id":334,"name":"minecraft:element_68"},{"data":12,"id":334,"name":"minecraft:element_68"},{"data":13,"id":334,"name":"minecraft:element_68"},{"data":14,"id":334,"name":"minecraft:element_68"},{"data":15,"id":334,"name":"minecraft:element_68"},{"data":0,"id":335,"name":"minecraft:element_69"},{"data":1,"id":335,"name":"minecraft:element_69"},{"data":2,"id":335,"name":"minecraft:element_69"},{"data":3,"id":335,"name":"minecraft:element_69"},{"data":4,"id":335,"name":"minecraft:element_69"},{"data":5,"id":335,"name":"minecraft:element_69"},{"data":6,"id":335,"name":"minecraft:element_69"},{"data":7,"id":335,"name":"minecraft:element_69"},{"data":8,"id":335,"name":"minecraft:element_69"},{"data":9,"id":335,"name":"minecraft:element_69"},{"data":10,"id":335,"name":"minecraft:element_69"},{"data":11,"id":335,"name":"minecraft:element_69"},{"data":12,"id":335,"name":"minecraft:element_69"},{"data":13,"id":335,"name":"minecraft:element_69"},{"data":14,"id":335,"name":"minecraft:element_69"},{"data":15,"id":335,"name":"minecraft:element_69"},{"data":0,"id":336,"name":"minecraft:element_70"},{"data":1,"id":336,"name":"minecraft:element_70"},{"data":2,"id":336,"name":"minecraft:element_70"},{"data":3,"id":336,"name":"minecraft:element_70"},{"data":4,"id":336,"name":"minecraft:element_70"},{"data":5,"id":336,"name":"minecraft:element_70"},{"data":6,"id":336,"name":"minecraft:element_70"},{"data":7,"id":336,"name":"minecraft:element_70"},{"data":8,"id":336,"name":"minecraft:element_70"},{"data":9,"id":336,"name":"minecraft:element_70"},{"data":10,"id":336,"name":"minecraft:element_70"},{"data":11,"id":336,"name":"minecraft:element_70"},{"data":12,"id":336,"name":"minecraft:element_70"},{"data":13,"id":336,"name":"minecraft:element_70"},{"data":14,"id":336,"name":"minecraft:element_70"},{"data":15,"id":336,"name":"minecraft:element_70"},{"data":0,"id":337,"name":"minecraft:element_71"},{"data":1,"id":337,"name":"minecraft:element_71"},{"data":2,"id":337,"name":"minecraft:element_71"},{"data":3,"id":337,"name":"minecraft:element_71"},{"data":4,"id":337,"name":"minecraft:element_71"},{"data":5,"id":337,"name":"minecraft:element_71"},{"data":6,"id":337,"name":"minecraft:element_71"},{"data":7,"id":337,"name":"minecraft:element_71"},{"data":8,"id":337,"name":"minecraft:element_71"},{"data":9,"id":337,"name":"minecraft:element_71"},{"data":10,"id":337,"name":"minecraft:element_71"},{"data":11,"id":337,"name":"minecraft:element_71"},{"data":12,"id":337,"name":"minecraft:element_71"},{"data":13,"id":337,"name":"minecraft:element_71"},{"data":14,"id":337,"name":"minecraft:element_71"},{"data":15,"id":337,"name":"minecraft:element_71"},{"data":0,"id":338,"name":"minecraft:element_72"},{"data":1,"id":338,"name":"minecraft:element_72"},{"data":2,"id":338,"name":"minecraft:element_72"},{"data":3,"id":338,"name":"minecraft:element_72"},{"data":4,"id":338,"name":"minecraft:element_72"},{"data":5,"id":338,"name":"minecraft:element_72"},{"data":6,"id":338,"name":"minecraft:element_72"},{"data":7,"id":338,"name":"minecraft:element_72"},{"data":8,"id":338,"name":"minecraft:element_72"},{"data":9,"id":338,"name":"minecraft:element_72"},{"data":10,"id":338,"name":"minecraft:element_72"},{"data":11,"id":338,"name":"minecraft:element_72"},{"data":12,"id":338,"name":"minecraft:element_72"},{"data":13,"id":338,"name":"minecraft:element_72"},{"data":14,"id":338,"name":"minecraft:element_72"},{"data":15,"id":338,"name":"minecraft:element_72"},{"data":0,"id":339,"name":"minecraft:element_73"},{"data":1,"id":339,"name":"minecraft:element_73"},{"data":2,"id":339,"name":"minecraft:element_73"},{"data":3,"id":339,"name":"minecraft:element_73"},{"data":4,"id":339,"name":"minecraft:element_73"},{"data":5,"id":339,"name":"minecraft:element_73"},{"data":6,"id":339,"name":"minecraft:element_73"},{"data":7,"id":339,"name":"minecraft:element_73"},{"data":8,"id":339,"name":"minecraft:element_73"},{"data":9,"id":339,"name":"minecraft:element_73"},{"data":10,"id":339,"name":"minecraft:element_73"},{"data":11,"id":339,"name":"minecraft:element_73"},{"data":12,"id":339,"name":"minecraft:element_73"},{"data":13,"id":339,"name":"minecraft:element_73"},{"data":14,"id":339,"name":"minecraft:element_73"},{"data":15,"id":339,"name":"minecraft:element_73"},{"data":0,"id":340,"name":"minecraft:element_74"},{"data":1,"id":340,"name":"minecraft:element_74"},{"data":2,"id":340,"name":"minecraft:element_74"},{"data":3,"id":340,"name":"minecraft:element_74"},{"data":4,"id":340,"name":"minecraft:element_74"},{"data":5,"id":340,"name":"minecraft:element_74"},{"data":6,"id":340,"name":"minecraft:element_74"},{"data":7,"id":340,"name":"minecraft:element_74"},{"data":8,"id":340,"name":"minecraft:element_74"},{"data":9,"id":340,"name":"minecraft:element_74"},{"data":10,"id":340,"name":"minecraft:element_74"},{"data":11,"id":340,"name":"minecraft:element_74"},{"data":12,"id":340,"name":"minecraft:element_74"},{"data":13,"id":340,"name":"minecraft:element_74"},{"data":14,"id":340,"name":"minecraft:element_74"},{"data":15,"id":340,"name":"minecraft:element_74"},{"data":0,"id":341,"name":"minecraft:element_75"},{"data":1,"id":341,"name":"minecraft:element_75"},{"data":2,"id":341,"name":"minecraft:element_75"},{"data":3,"id":341,"name":"minecraft:element_75"},{"data":4,"id":341,"name":"minecraft:element_75"},{"data":5,"id":341,"name":"minecraft:element_75"},{"data":6,"id":341,"name":"minecraft:element_75"},{"data":7,"id":341,"name":"minecraft:element_75"},{"data":8,"id":341,"name":"minecraft:element_75"},{"data":9,"id":341,"name":"minecraft:element_75"},{"data":10,"id":341,"name":"minecraft:element_75"},{"data":11,"id":341,"name":"minecraft:element_75"},{"data":12,"id":341,"name":"minecraft:element_75"},{"data":13,"id":341,"name":"minecraft:element_75"},{"data":14,"id":341,"name":"minecraft:element_75"},{"data":15,"id":341,"name":"minecraft:element_75"},{"data":0,"id":342,"name":"minecraft:element_76"},{"data":1,"id":342,"name":"minecraft:element_76"},{"data":2,"id":342,"name":"minecraft:element_76"},{"data":3,"id":342,"name":"minecraft:element_76"},{"data":4,"id":342,"name":"minecraft:element_76"},{"data":5,"id":342,"name":"minecraft:element_76"},{"data":6,"id":342,"name":"minecraft:element_76"},{"data":7,"id":342,"name":"minecraft:element_76"},{"data":8,"id":342,"name":"minecraft:element_76"},{"data":9,"id":342,"name":"minecraft:element_76"},{"data":10,"id":342,"name":"minecraft:element_76"},{"data":11,"id":342,"name":"minecraft:element_76"},{"data":12,"id":342,"name":"minecraft:element_76"},{"data":13,"id":342,"name":"minecraft:element_76"},{"data":14,"id":342,"name":"minecraft:element_76"},{"data":15,"id":342,"name":"minecraft:element_76"},{"data":0,"id":343,"name":"minecraft:element_77"},{"data":1,"id":343,"name":"minecraft:element_77"},{"data":2,"id":343,"name":"minecraft:element_77"},{"data":3,"id":343,"name":"minecraft:element_77"},{"data":4,"id":343,"name":"minecraft:element_77"},{"data":5,"id":343,"name":"minecraft:element_77"},{"data":6,"id":343,"name":"minecraft:element_77"},{"data":7,"id":343,"name":"minecraft:element_77"},{"data":8,"id":343,"name":"minecraft:element_77"},{"data":9,"id":343,"name":"minecraft:element_77"},{"data":10,"id":343,"name":"minecraft:element_77"},{"data":11,"id":343,"name":"minecraft:element_77"},{"data":12,"id":343,"name":"minecraft:element_77"},{"data":13,"id":343,"name":"minecraft:element_77"},{"data":14,"id":343,"name":"minecraft:element_77"},{"data":15,"id":343,"name":"minecraft:element_77"},{"data":0,"id":344,"name":"minecraft:element_78"},{"data":1,"id":344,"name":"minecraft:element_78"},{"data":2,"id":344,"name":"minecraft:element_78"},{"data":3,"id":344,"name":"minecraft:element_78"},{"data":4,"id":344,"name":"minecraft:element_78"},{"data":5,"id":344,"name":"minecraft:element_78"},{"data":6,"id":344,"name":"minecraft:element_78"},{"data":7,"id":344,"name":"minecraft:element_78"},{"data":8,"id":344,"name":"minecraft:element_78"},{"data":9,"id":344,"name":"minecraft:element_78"},{"data":10,"id":344,"name":"minecraft:element_78"},{"data":11,"id":344,"name":"minecraft:element_78"},{"data":12,"id":344,"name":"minecraft:element_78"},{"data":13,"id":344,"name":"minecraft:element_78"},{"data":14,"id":344,"name":"minecraft:element_78"},{"data":15,"id":344,"name":"minecraft:element_78"},{"data":0,"id":345,"name":"minecraft:element_79"},{"data":1,"id":345,"name":"minecraft:element_79"},{"data":2,"id":345,"name":"minecraft:element_79"},{"data":3,"id":345,"name":"minecraft:element_79"},{"data":4,"id":345,"name":"minecraft:element_79"},{"data":5,"id":345,"name":"minecraft:element_79"},{"data":6,"id":345,"name":"minecraft:element_79"},{"data":7,"id":345,"name":"minecraft:element_79"},{"data":8,"id":345,"name":"minecraft:element_79"},{"data":9,"id":345,"name":"minecraft:element_79"},{"data":10,"id":345,"name":"minecraft:element_79"},{"data":11,"id":345,"name":"minecraft:element_79"},{"data":12,"id":345,"name":"minecraft:element_79"},{"data":13,"id":345,"name":"minecraft:element_79"},{"data":14,"id":345,"name":"minecraft:element_79"},{"data":15,"id":345,"name":"minecraft:element_79"},{"data":0,"id":346,"name":"minecraft:element_80"},{"data":1,"id":346,"name":"minecraft:element_80"},{"data":2,"id":346,"name":"minecraft:element_80"},{"data":3,"id":346,"name":"minecraft:element_80"},{"data":4,"id":346,"name":"minecraft:element_80"},{"data":5,"id":346,"name":"minecraft:element_80"},{"data":6,"id":346,"name":"minecraft:element_80"},{"data":7,"id":346,"name":"minecraft:element_80"},{"data":8,"id":346,"name":"minecraft:element_80"},{"data":9,"id":346,"name":"minecraft:element_80"},{"data":10,"id":346,"name":"minecraft:element_80"},{"data":11,"id":346,"name":"minecraft:element_80"},{"data":12,"id":346,"name":"minecraft:element_80"},{"data":13,"id":346,"name":"minecraft:element_80"},{"data":14,"id":346,"name":"minecraft:element_80"},{"data":15,"id":346,"name":"minecraft:element_80"},{"data":0,"id":347,"name":"minecraft:element_81"},{"data":1,"id":347,"name":"minecraft:element_81"},{"data":2,"id":347,"name":"minecraft:element_81"},{"data":3,"id":347,"name":"minecraft:element_81"},{"data":4,"id":347,"name":"minecraft:element_81"},{"data":5,"id":347,"name":"minecraft:element_81"},{"data":6,"id":347,"name":"minecraft:element_81"},{"data":7,"id":347,"name":"minecraft:element_81"},{"data":8,"id":347,"name":"minecraft:element_81"},{"data":9,"id":347,"name":"minecraft:element_81"},{"data":10,"id":347,"name":"minecraft:element_81"},{"data":11,"id":347,"name":"minecraft:element_81"},{"data":12,"id":347,"name":"minecraft:element_81"},{"data":13,"id":347,"name":"minecraft:element_81"},{"data":14,"id":347,"name":"minecraft:element_81"},{"data":15,"id":347,"name":"minecraft:element_81"},{"data":0,"id":348,"name":"minecraft:element_82"},{"data":1,"id":348,"name":"minecraft:element_82"},{"data":2,"id":348,"name":"minecraft:element_82"},{"data":3,"id":348,"name":"minecraft:element_82"},{"data":4,"id":348,"name":"minecraft:element_82"},{"data":5,"id":348,"name":"minecraft:element_82"},{"data":6,"id":348,"name":"minecraft:element_82"},{"data":7,"id":348,"name":"minecraft:element_82"},{"data":8,"id":348,"name":"minecraft:element_82"},{"data":9,"id":348,"name":"minecraft:element_82"},{"data":10,"id":348,"name":"minecraft:element_82"},{"data":11,"id":348,"name":"minecraft:element_82"},{"data":12,"id":348,"name":"minecraft:element_82"},{"data":13,"id":348,"name":"minecraft:element_82"},{"data":14,"id":348,"name":"minecraft:element_82"},{"data":15,"id":348,"name":"minecraft:element_82"},{"data":0,"id":349,"name":"minecraft:element_83"},{"data":1,"id":349,"name":"minecraft:element_83"},{"data":2,"id":349,"name":"minecraft:element_83"},{"data":3,"id":349,"name":"minecraft:element_83"},{"data":4,"id":349,"name":"minecraft:element_83"},{"data":5,"id":349,"name":"minecraft:element_83"},{"data":6,"id":349,"name":"minecraft:element_83"},{"data":7,"id":349,"name":"minecraft:element_83"},{"data":8,"id":349,"name":"minecraft:element_83"},{"data":9,"id":349,"name":"minecraft:element_83"},{"data":10,"id":349,"name":"minecraft:element_83"},{"data":11,"id":349,"name":"minecraft:element_83"},{"data":12,"id":349,"name":"minecraft:element_83"},{"data":13,"id":349,"name":"minecraft:element_83"},{"data":14,"id":349,"name":"minecraft:element_83"},{"data":15,"id":349,"name":"minecraft:element_83"},{"data":0,"id":350,"name":"minecraft:element_84"},{"data":1,"id":350,"name":"minecraft:element_84"},{"data":2,"id":350,"name":"minecraft:element_84"},{"data":3,"id":350,"name":"minecraft:element_84"},{"data":4,"id":350,"name":"minecraft:element_84"},{"data":5,"id":350,"name":"minecraft:element_84"},{"data":6,"id":350,"name":"minecraft:element_84"},{"data":7,"id":350,"name":"minecraft:element_84"},{"data":8,"id":350,"name":"minecraft:element_84"},{"data":9,"id":350,"name":"minecraft:element_84"},{"data":10,"id":350,"name":"minecraft:element_84"},{"data":11,"id":350,"name":"minecraft:element_84"},{"data":12,"id":350,"name":"minecraft:element_84"},{"data":13,"id":350,"name":"minecraft:element_84"},{"data":14,"id":350,"name":"minecraft:element_84"},{"data":15,"id":350,"name":"minecraft:element_84"},{"data":0,"id":351,"name":"minecraft:element_85"},{"data":1,"id":351,"name":"minecraft:element_85"},{"data":2,"id":351,"name":"minecraft:element_85"},{"data":3,"id":351,"name":"minecraft:element_85"},{"data":4,"id":351,"name":"minecraft:element_85"},{"data":5,"id":351,"name":"minecraft:element_85"},{"data":6,"id":351,"name":"minecraft:element_85"},{"data":7,"id":351,"name":"minecraft:element_85"},{"data":8,"id":351,"name":"minecraft:element_85"},{"data":9,"id":351,"name":"minecraft:element_85"},{"data":10,"id":351,"name":"minecraft:element_85"},{"data":11,"id":351,"name":"minecraft:element_85"},{"data":12,"id":351,"name":"minecraft:element_85"},{"data":13,"id":351,"name":"minecraft:element_85"},{"data":14,"id":351,"name":"minecraft:element_85"},{"data":15,"id":351,"name":"minecraft:element_85"},{"data":0,"id":352,"name":"minecraft:element_86"},{"data":1,"id":352,"name":"minecraft:element_86"},{"data":2,"id":352,"name":"minecraft:element_86"},{"data":3,"id":352,"name":"minecraft:element_86"},{"data":4,"id":352,"name":"minecraft:element_86"},{"data":5,"id":352,"name":"minecraft:element_86"},{"data":6,"id":352,"name":"minecraft:element_86"},{"data":7,"id":352,"name":"minecraft:element_86"},{"data":8,"id":352,"name":"minecraft:element_86"},{"data":9,"id":352,"name":"minecraft:element_86"},{"data":10,"id":352,"name":"minecraft:element_86"},{"data":11,"id":352,"name":"minecraft:element_86"},{"data":12,"id":352,"name":"minecraft:element_86"},{"data":13,"id":352,"name":"minecraft:element_86"},{"data":14,"id":352,"name":"minecraft:element_86"},{"data":15,"id":352,"name":"minecraft:element_86"},{"data":0,"id":353,"name":"minecraft:element_87"},{"data":1,"id":353,"name":"minecraft:element_87"},{"data":2,"id":353,"name":"minecraft:element_87"},{"data":3,"id":353,"name":"minecraft:element_87"},{"data":4,"id":353,"name":"minecraft:element_87"},{"data":5,"id":353,"name":"minecraft:element_87"},{"data":6,"id":353,"name":"minecraft:element_87"},{"data":7,"id":353,"name":"minecraft:element_87"},{"data":8,"id":353,"name":"minecraft:element_87"},{"data":9,"id":353,"name":"minecraft:element_87"},{"data":10,"id":353,"name":"minecraft:element_87"},{"data":11,"id":353,"name":"minecraft:element_87"},{"data":12,"id":353,"name":"minecraft:element_87"},{"data":13,"id":353,"name":"minecraft:element_87"},{"data":14,"id":353,"name":"minecraft:element_87"},{"data":15,"id":353,"name":"minecraft:element_87"},{"data":0,"id":354,"name":"minecraft:element_88"},{"data":1,"id":354,"name":"minecraft:element_88"},{"data":2,"id":354,"name":"minecraft:element_88"},{"data":3,"id":354,"name":"minecraft:element_88"},{"data":4,"id":354,"name":"minecraft:element_88"},{"data":5,"id":354,"name":"minecraft:element_88"},{"data":6,"id":354,"name":"minecraft:element_88"},{"data":7,"id":354,"name":"minecraft:element_88"},{"data":8,"id":354,"name":"minecraft:element_88"},{"data":9,"id":354,"name":"minecraft:element_88"},{"data":10,"id":354,"name":"minecraft:element_88"},{"data":11,"id":354,"name":"minecraft:element_88"},{"data":12,"id":354,"name":"minecraft:element_88"},{"data":13,"id":354,"name":"minecraft:element_88"},{"data":14,"id":354,"name":"minecraft:element_88"},{"data":15,"id":354,"name":"minecraft:element_88"},{"data":0,"id":355,"name":"minecraft:element_89"},{"data":1,"id":355,"name":"minecraft:element_89"},{"data":2,"id":355,"name":"minecraft:element_89"},{"data":3,"id":355,"name":"minecraft:element_89"},{"data":4,"id":355,"name":"minecraft:element_89"},{"data":5,"id":355,"name":"minecraft:element_89"},{"data":6,"id":355,"name":"minecraft:element_89"},{"data":7,"id":355,"name":"minecraft:element_89"},{"data":8,"id":355,"name":"minecraft:element_89"},{"data":9,"id":355,"name":"minecraft:element_89"},{"data":10,"id":355,"name":"minecraft:element_89"},{"data":11,"id":355,"name":"minecraft:element_89"},{"data":12,"id":355,"name":"minecraft:element_89"},{"data":13,"id":355,"name":"minecraft:element_89"},{"data":14,"id":355,"name":"minecraft:element_89"},{"data":15,"id":355,"name":"minecraft:element_89"},{"data":0,"id":356,"name":"minecraft:element_90"},{"data":1,"id":356,"name":"minecraft:element_90"},{"data":2,"id":356,"name":"minecraft:element_90"},{"data":3,"id":356,"name":"minecraft:element_90"},{"data":4,"id":356,"name":"minecraft:element_90"},{"data":5,"id":356,"name":"minecraft:element_90"},{"data":6,"id":356,"name":"minecraft:element_90"},{"data":7,"id":356,"name":"minecraft:element_90"},{"data":8,"id":356,"name":"minecraft:element_90"},{"data":9,"id":356,"name":"minecraft:element_90"},{"data":10,"id":356,"name":"minecraft:element_90"},{"data":11,"id":356,"name":"minecraft:element_90"},{"data":12,"id":356,"name":"minecraft:element_90"},{"data":13,"id":356,"name":"minecraft:element_90"},{"data":14,"id":356,"name":"minecraft:element_90"},{"data":15,"id":356,"name":"minecraft:element_90"},{"data":0,"id":357,"name":"minecraft:element_91"},{"data":1,"id":357,"name":"minecraft:element_91"},{"data":2,"id":357,"name":"minecraft:element_91"},{"data":3,"id":357,"name":"minecraft:element_91"},{"data":4,"id":357,"name":"minecraft:element_91"},{"data":5,"id":357,"name":"minecraft:element_91"},{"data":6,"id":357,"name":"minecraft:element_91"},{"data":7,"id":357,"name":"minecraft:element_91"},{"data":8,"id":357,"name":"minecraft:element_91"},{"data":9,"id":357,"name":"minecraft:element_91"},{"data":10,"id":357,"name":"minecraft:element_91"},{"data":11,"id":357,"name":"minecraft:element_91"},{"data":12,"id":357,"name":"minecraft:element_91"},{"data":13,"id":357,"name":"minecraft:element_91"},{"data":14,"id":357,"name":"minecraft:element_91"},{"data":15,"id":357,"name":"minecraft:element_91"},{"data":0,"id":358,"name":"minecraft:element_92"},{"data":1,"id":358,"name":"minecraft:element_92"},{"data":2,"id":358,"name":"minecraft:element_92"},{"data":3,"id":358,"name":"minecraft:element_92"},{"data":4,"id":358,"name":"minecraft:element_92"},{"data":5,"id":358,"name":"minecraft:element_92"},{"data":6,"id":358,"name":"minecraft:element_92"},{"data":7,"id":358,"name":"minecraft:element_92"},{"data":8,"id":358,"name":"minecraft:element_92"},{"data":9,"id":358,"name":"minecraft:element_92"},{"data":10,"id":358,"name":"minecraft:element_92"},{"data":11,"id":358,"name":"minecraft:element_92"},{"data":12,"id":358,"name":"minecraft:element_92"},{"data":13,"id":358,"name":"minecraft:element_92"},{"data":14,"id":358,"name":"minecraft:element_92"},{"data":15,"id":358,"name":"minecraft:element_92"},{"data":0,"id":359,"name":"minecraft:element_93"},{"data":1,"id":359,"name":"minecraft:element_93"},{"data":2,"id":359,"name":"minecraft:element_93"},{"data":3,"id":359,"name":"minecraft:element_93"},{"data":4,"id":359,"name":"minecraft:element_93"},{"data":5,"id":359,"name":"minecraft:element_93"},{"data":6,"id":359,"name":"minecraft:element_93"},{"data":7,"id":359,"name":"minecraft:element_93"},{"data":8,"id":359,"name":"minecraft:element_93"},{"data":9,"id":359,"name":"minecraft:element_93"},{"data":10,"id":359,"name":"minecraft:element_93"},{"data":11,"id":359,"name":"minecraft:element_93"},{"data":12,"id":359,"name":"minecraft:element_93"},{"data":13,"id":359,"name":"minecraft:element_93"},{"data":14,"id":359,"name":"minecraft:element_93"},{"data":15,"id":359,"name":"minecraft:element_93"},{"data":0,"id":360,"name":"minecraft:element_94"},{"data":1,"id":360,"name":"minecraft:element_94"},{"data":2,"id":360,"name":"minecraft:element_94"},{"data":3,"id":360,"name":"minecraft:element_94"},{"data":4,"id":360,"name":"minecraft:element_94"},{"data":5,"id":360,"name":"minecraft:element_94"},{"data":6,"id":360,"name":"minecraft:element_94"},{"data":7,"id":360,"name":"minecraft:element_94"},{"data":8,"id":360,"name":"minecraft:element_94"},{"data":9,"id":360,"name":"minecraft:element_94"},{"data":10,"id":360,"name":"minecraft:element_94"},{"data":11,"id":360,"name":"minecraft:element_94"},{"data":12,"id":360,"name":"minecraft:element_94"},{"data":13,"id":360,"name":"minecraft:element_94"},{"data":14,"id":360,"name":"minecraft:element_94"},{"data":15,"id":360,"name":"minecraft:element_94"},{"data":0,"id":361,"name":"minecraft:element_95"},{"data":1,"id":361,"name":"minecraft:element_95"},{"data":2,"id":361,"name":"minecraft:element_95"},{"data":3,"id":361,"name":"minecraft:element_95"},{"data":4,"id":361,"name":"minecraft:element_95"},{"data":5,"id":361,"name":"minecraft:element_95"},{"data":6,"id":361,"name":"minecraft:element_95"},{"data":7,"id":361,"name":"minecraft:element_95"},{"data":8,"id":361,"name":"minecraft:element_95"},{"data":9,"id":361,"name":"minecraft:element_95"},{"data":10,"id":361,"name":"minecraft:element_95"},{"data":11,"id":361,"name":"minecraft:element_95"},{"data":12,"id":361,"name":"minecraft:element_95"},{"data":13,"id":361,"name":"minecraft:element_95"},{"data":14,"id":361,"name":"minecraft:element_95"},{"data":15,"id":361,"name":"minecraft:element_95"},{"data":0,"id":362,"name":"minecraft:element_96"},{"data":1,"id":362,"name":"minecraft:element_96"},{"data":2,"id":362,"name":"minecraft:element_96"},{"data":3,"id":362,"name":"minecraft:element_96"},{"data":4,"id":362,"name":"minecraft:element_96"},{"data":5,"id":362,"name":"minecraft:element_96"},{"data":6,"id":362,"name":"minecraft:element_96"},{"data":7,"id":362,"name":"minecraft:element_96"},{"data":8,"id":362,"name":"minecraft:element_96"},{"data":9,"id":362,"name":"minecraft:element_96"},{"data":10,"id":362,"name":"minecraft:element_96"},{"data":11,"id":362,"name":"minecraft:element_96"},{"data":12,"id":362,"name":"minecraft:element_96"},{"data":13,"id":362,"name":"minecraft:element_96"},{"data":14,"id":362,"name":"minecraft:element_96"},{"data":15,"id":362,"name":"minecraft:element_96"},{"data":0,"id":363,"name":"minecraft:element_97"},{"data":1,"id":363,"name":"minecraft:element_97"},{"data":2,"id":363,"name":"minecraft:element_97"},{"data":3,"id":363,"name":"minecraft:element_97"},{"data":4,"id":363,"name":"minecraft:element_97"},{"data":5,"id":363,"name":"minecraft:element_97"},{"data":6,"id":363,"name":"minecraft:element_97"},{"data":7,"id":363,"name":"minecraft:element_97"},{"data":8,"id":363,"name":"minecraft:element_97"},{"data":9,"id":363,"name":"minecraft:element_97"},{"data":10,"id":363,"name":"minecraft:element_97"},{"data":11,"id":363,"name":"minecraft:element_97"},{"data":12,"id":363,"name":"minecraft:element_97"},{"data":13,"id":363,"name":"minecraft:element_97"},{"data":14,"id":363,"name":"minecraft:element_97"},{"data":15,"id":363,"name":"minecraft:element_97"},{"data":0,"id":364,"name":"minecraft:element_98"},{"data":1,"id":364,"name":"minecraft:element_98"},{"data":2,"id":364,"name":"minecraft:element_98"},{"data":3,"id":364,"name":"minecraft:element_98"},{"data":4,"id":364,"name":"minecraft:element_98"},{"data":5,"id":364,"name":"minecraft:element_98"},{"data":6,"id":364,"name":"minecraft:element_98"},{"data":7,"id":364,"name":"minecraft:element_98"},{"data":8,"id":364,"name":"minecraft:element_98"},{"data":9,"id":364,"name":"minecraft:element_98"},{"data":10,"id":364,"name":"minecraft:element_98"},{"data":11,"id":364,"name":"minecraft:element_98"},{"data":12,"id":364,"name":"minecraft:element_98"},{"data":13,"id":364,"name":"minecraft:element_98"},{"data":14,"id":364,"name":"minecraft:element_98"},{"data":15,"id":364,"name":"minecraft:element_98"},{"data":0,"id":365,"name":"minecraft:element_99"},{"data":1,"id":365,"name":"minecraft:element_99"},{"data":2,"id":365,"name":"minecraft:element_99"},{"data":3,"id":365,"name":"minecraft:element_99"},{"data":4,"id":365,"name":"minecraft:element_99"},{"data":5,"id":365,"name":"minecraft:element_99"},{"data":6,"id":365,"name":"minecraft:element_99"},{"data":7,"id":365,"name":"minecraft:element_99"},{"data":8,"id":365,"name":"minecraft:element_99"},{"data":9,"id":365,"name":"minecraft:element_99"},{"data":10,"id":365,"name":"minecraft:element_99"},{"data":11,"id":365,"name":"minecraft:element_99"},{"data":12,"id":365,"name":"minecraft:element_99"},{"data":13,"id":365,"name":"minecraft:element_99"},{"data":14,"id":365,"name":"minecraft:element_99"},{"data":15,"id":365,"name":"minecraft:element_99"},{"data":0,"id":366,"name":"minecraft:element_100"},{"data":1,"id":366,"name":"minecraft:element_100"},{"data":2,"id":366,"name":"minecraft:element_100"},{"data":3,"id":366,"name":"minecraft:element_100"},{"data":4,"id":366,"name":"minecraft:element_100"},{"data":5,"id":366,"name":"minecraft:element_100"},{"data":6,"id":366,"name":"minecraft:element_100"},{"data":7,"id":366,"name":"minecraft:element_100"},{"data":8,"id":366,"name":"minecraft:element_100"},{"data":9,"id":366,"name":"minecraft:element_100"},{"data":10,"id":366,"name":"minecraft:element_100"},{"data":11,"id":366,"name":"minecraft:element_100"},{"data":12,"id":366,"name":"minecraft:element_100"},{"data":13,"id":366,"name":"minecraft:element_100"},{"data":14,"id":366,"name":"minecraft:element_100"},{"data":15,"id":366,"name":"minecraft:element_100"},{"data":0,"id":367,"name":"minecraft:element_101"},{"data":1,"id":367,"name":"minecraft:element_101"},{"data":2,"id":367,"name":"minecraft:element_101"},{"data":3,"id":367,"name":"minecraft:element_101"},{"data":4,"id":367,"name":"minecraft:element_101"},{"data":5,"id":367,"name":"minecraft:element_101"},{"data":6,"id":367,"name":"minecraft:element_101"},{"data":7,"id":367,"name":"minecraft:element_101"},{"data":8,"id":367,"name":"minecraft:element_101"},{"data":9,"id":367,"name":"minecraft:element_101"},{"data":10,"id":367,"name":"minecraft:element_101"},{"data":11,"id":367,"name":"minecraft:element_101"},{"data":12,"id":367,"name":"minecraft:element_101"},{"data":13,"id":367,"name":"minecraft:element_101"},{"data":14,"id":367,"name":"minecraft:element_101"},{"data":15,"id":367,"name":"minecraft:element_101"},{"data":0,"id":368,"name":"minecraft:element_102"},{"data":1,"id":368,"name":"minecraft:element_102"},{"data":2,"id":368,"name":"minecraft:element_102"},{"data":3,"id":368,"name":"minecraft:element_102"},{"data":4,"id":368,"name":"minecraft:element_102"},{"data":5,"id":368,"name":"minecraft:element_102"},{"data":6,"id":368,"name":"minecraft:element_102"},{"data":7,"id":368,"name":"minecraft:element_102"},{"data":8,"id":368,"name":"minecraft:element_102"},{"data":9,"id":368,"name":"minecraft:element_102"},{"data":10,"id":368,"name":"minecraft:element_102"},{"data":11,"id":368,"name":"minecraft:element_102"},{"data":12,"id":368,"name":"minecraft:element_102"},{"data":13,"id":368,"name":"minecraft:element_102"},{"data":14,"id":368,"name":"minecraft:element_102"},{"data":15,"id":368,"name":"minecraft:element_102"},{"data":0,"id":369,"name":"minecraft:element_103"},{"data":1,"id":369,"name":"minecraft:element_103"},{"data":2,"id":369,"name":"minecraft:element_103"},{"data":3,"id":369,"name":"minecraft:element_103"},{"data":4,"id":369,"name":"minecraft:element_103"},{"data":5,"id":369,"name":"minecraft:element_103"},{"data":6,"id":369,"name":"minecraft:element_103"},{"data":7,"id":369,"name":"minecraft:element_103"},{"data":8,"id":369,"name":"minecraft:element_103"},{"data":9,"id":369,"name":"minecraft:element_103"},{"data":10,"id":369,"name":"minecraft:element_103"},{"data":11,"id":369,"name":"minecraft:element_103"},{"data":12,"id":369,"name":"minecraft:element_103"},{"data":13,"id":369,"name":"minecraft:element_103"},{"data":14,"id":369,"name":"minecraft:element_103"},{"data":15,"id":369,"name":"minecraft:element_103"},{"data":0,"id":370,"name":"minecraft:element_104"},{"data":1,"id":370,"name":"minecraft:element_104"},{"data":2,"id":370,"name":"minecraft:element_104"},{"data":3,"id":370,"name":"minecraft:element_104"},{"data":4,"id":370,"name":"minecraft:element_104"},{"data":5,"id":370,"name":"minecraft:element_104"},{"data":6,"id":370,"name":"minecraft:element_104"},{"data":7,"id":370,"name":"minecraft:element_104"},{"data":8,"id":370,"name":"minecraft:element_104"},{"data":9,"id":370,"name":"minecraft:element_104"},{"data":10,"id":370,"name":"minecraft:element_104"},{"data":11,"id":370,"name":"minecraft:element_104"},{"data":12,"id":370,"name":"minecraft:element_104"},{"data":13,"id":370,"name":"minecraft:element_104"},{"data":14,"id":370,"name":"minecraft:element_104"},{"data":15,"id":370,"name":"minecraft:element_104"},{"data":0,"id":371,"name":"minecraft:element_105"},{"data":1,"id":371,"name":"minecraft:element_105"},{"data":2,"id":371,"name":"minecraft:element_105"},{"data":3,"id":371,"name":"minecraft:element_105"},{"data":4,"id":371,"name":"minecraft:element_105"},{"data":5,"id":371,"name":"minecraft:element_105"},{"data":6,"id":371,"name":"minecraft:element_105"},{"data":7,"id":371,"name":"minecraft:element_105"},{"data":8,"id":371,"name":"minecraft:element_105"},{"data":9,"id":371,"name":"minecraft:element_105"},{"data":10,"id":371,"name":"minecraft:element_105"},{"data":11,"id":371,"name":"minecraft:element_105"},{"data":12,"id":371,"name":"minecraft:element_105"},{"data":13,"id":371,"name":"minecraft:element_105"},{"data":14,"id":371,"name":"minecraft:element_105"},{"data":15,"id":371,"name":"minecraft:element_105"},{"data":0,"id":372,"name":"minecraft:element_106"},{"data":1,"id":372,"name":"minecraft:element_106"},{"data":2,"id":372,"name":"minecraft:element_106"},{"data":3,"id":372,"name":"minecraft:element_106"},{"data":4,"id":372,"name":"minecraft:element_106"},{"data":5,"id":372,"name":"minecraft:element_106"},{"data":6,"id":372,"name":"minecraft:element_106"},{"data":7,"id":372,"name":"minecraft:element_106"},{"data":8,"id":372,"name":"minecraft:element_106"},{"data":9,"id":372,"name":"minecraft:element_106"},{"data":10,"id":372,"name":"minecraft:element_106"},{"data":11,"id":372,"name":"minecraft:element_106"},{"data":12,"id":372,"name":"minecraft:element_106"},{"data":13,"id":372,"name":"minecraft:element_106"},{"data":14,"id":372,"name":"minecraft:element_106"},{"data":15,"id":372,"name":"minecraft:element_106"},{"data":0,"id":373,"name":"minecraft:element_107"},{"data":1,"id":373,"name":"minecraft:element_107"},{"data":2,"id":373,"name":"minecraft:element_107"},{"data":3,"id":373,"name":"minecraft:element_107"},{"data":4,"id":373,"name":"minecraft:element_107"},{"data":5,"id":373,"name":"minecraft:element_107"},{"data":6,"id":373,"name":"minecraft:element_107"},{"data":7,"id":373,"name":"minecraft:element_107"},{"data":8,"id":373,"name":"minecraft:element_107"},{"data":9,"id":373,"name":"minecraft:element_107"},{"data":10,"id":373,"name":"minecraft:element_107"},{"data":11,"id":373,"name":"minecraft:element_107"},{"data":12,"id":373,"name":"minecraft:element_107"},{"data":13,"id":373,"name":"minecraft:element_107"},{"data":14,"id":373,"name":"minecraft:element_107"},{"data":15,"id":373,"name":"minecraft:element_107"},{"data":0,"id":374,"name":"minecraft:element_108"},{"data":1,"id":374,"name":"minecraft:element_108"},{"data":2,"id":374,"name":"minecraft:element_108"},{"data":3,"id":374,"name":"minecraft:element_108"},{"data":4,"id":374,"name":"minecraft:element_108"},{"data":5,"id":374,"name":"minecraft:element_108"},{"data":6,"id":374,"name":"minecraft:element_108"},{"data":7,"id":374,"name":"minecraft:element_108"},{"data":8,"id":374,"name":"minecraft:element_108"},{"data":9,"id":374,"name":"minecraft:element_108"},{"data":10,"id":374,"name":"minecraft:element_108"},{"data":11,"id":374,"name":"minecraft:element_108"},{"data":12,"id":374,"name":"minecraft:element_108"},{"data":13,"id":374,"name":"minecraft:element_108"},{"data":14,"id":374,"name":"minecraft:element_108"},{"data":15,"id":374,"name":"minecraft:element_108"},{"data":0,"id":375,"name":"minecraft:element_109"},{"data":1,"id":375,"name":"minecraft:element_109"},{"data":2,"id":375,"name":"minecraft:element_109"},{"data":3,"id":375,"name":"minecraft:element_109"},{"data":4,"id":375,"name":"minecraft:element_109"},{"data":5,"id":375,"name":"minecraft:element_109"},{"data":6,"id":375,"name":"minecraft:element_109"},{"data":7,"id":375,"name":"minecraft:element_109"},{"data":8,"id":375,"name":"minecraft:element_109"},{"data":9,"id":375,"name":"minecraft:element_109"},{"data":10,"id":375,"name":"minecraft:element_109"},{"data":11,"id":375,"name":"minecraft:element_109"},{"data":12,"id":375,"name":"minecraft:element_109"},{"data":13,"id":375,"name":"minecraft:element_109"},{"data":14,"id":375,"name":"minecraft:element_109"},{"data":15,"id":375,"name":"minecraft:element_109"},{"data":0,"id":376,"name":"minecraft:element_110"},{"data":1,"id":376,"name":"minecraft:element_110"},{"data":2,"id":376,"name":"minecraft:element_110"},{"data":3,"id":376,"name":"minecraft:element_110"},{"data":4,"id":376,"name":"minecraft:element_110"},{"data":5,"id":376,"name":"minecraft:element_110"},{"data":6,"id":376,"name":"minecraft:element_110"},{"data":7,"id":376,"name":"minecraft:element_110"},{"data":8,"id":376,"name":"minecraft:element_110"},{"data":9,"id":376,"name":"minecraft:element_110"},{"data":10,"id":376,"name":"minecraft:element_110"},{"data":11,"id":376,"name":"minecraft:element_110"},{"data":12,"id":376,"name":"minecraft:element_110"},{"data":13,"id":376,"name":"minecraft:element_110"},{"data":14,"id":376,"name":"minecraft:element_110"},{"data":15,"id":376,"name":"minecraft:element_110"},{"data":0,"id":377,"name":"minecraft:element_111"},{"data":1,"id":377,"name":"minecraft:element_111"},{"data":2,"id":377,"name":"minecraft:element_111"},{"data":3,"id":377,"name":"minecraft:element_111"},{"data":4,"id":377,"name":"minecraft:element_111"},{"data":5,"id":377,"name":"minecraft:element_111"},{"data":6,"id":377,"name":"minecraft:element_111"},{"data":7,"id":377,"name":"minecraft:element_111"},{"data":8,"id":377,"name":"minecraft:element_111"},{"data":9,"id":377,"name":"minecraft:element_111"},{"data":10,"id":377,"name":"minecraft:element_111"},{"data":11,"id":377,"name":"minecraft:element_111"},{"data":12,"id":377,"name":"minecraft:element_111"},{"data":13,"id":377,"name":"minecraft:element_111"},{"data":14,"id":377,"name":"minecraft:element_111"},{"data":15,"id":377,"name":"minecraft:element_111"},{"data":0,"id":378,"name":"minecraft:element_112"},{"data":1,"id":378,"name":"minecraft:element_112"},{"data":2,"id":378,"name":"minecraft:element_112"},{"data":3,"id":378,"name":"minecraft:element_112"},{"data":4,"id":378,"name":"minecraft:element_112"},{"data":5,"id":378,"name":"minecraft:element_112"},{"data":6,"id":378,"name":"minecraft:element_112"},{"data":7,"id":378,"name":"minecraft:element_112"},{"data":8,"id":378,"name":"minecraft:element_112"},{"data":9,"id":378,"name":"minecraft:element_112"},{"data":10,"id":378,"name":"minecraft:element_112"},{"data":11,"id":378,"name":"minecraft:element_112"},{"data":12,"id":378,"name":"minecraft:element_112"},{"data":13,"id":378,"name":"minecraft:element_112"},{"data":14,"id":378,"name":"minecraft:element_112"},{"data":15,"id":378,"name":"minecraft:element_112"},{"data":0,"id":379,"name":"minecraft:element_113"},{"data":1,"id":379,"name":"minecraft:element_113"},{"data":2,"id":379,"name":"minecraft:element_113"},{"data":3,"id":379,"name":"minecraft:element_113"},{"data":4,"id":379,"name":"minecraft:element_113"},{"data":5,"id":379,"name":"minecraft:element_113"},{"data":6,"id":379,"name":"minecraft:element_113"},{"data":7,"id":379,"name":"minecraft:element_113"},{"data":8,"id":379,"name":"minecraft:element_113"},{"data":9,"id":379,"name":"minecraft:element_113"},{"data":10,"id":379,"name":"minecraft:element_113"},{"data":11,"id":379,"name":"minecraft:element_113"},{"data":12,"id":379,"name":"minecraft:element_113"},{"data":13,"id":379,"name":"minecraft:element_113"},{"data":14,"id":379,"name":"minecraft:element_113"},{"data":15,"id":379,"name":"minecraft:element_113"},{"data":0,"id":380,"name":"minecraft:element_114"},{"data":1,"id":380,"name":"minecraft:element_114"},{"data":2,"id":380,"name":"minecraft:element_114"},{"data":3,"id":380,"name":"minecraft:element_114"},{"data":4,"id":380,"name":"minecraft:element_114"},{"data":5,"id":380,"name":"minecraft:element_114"},{"data":6,"id":380,"name":"minecraft:element_114"},{"data":7,"id":380,"name":"minecraft:element_114"},{"data":8,"id":380,"name":"minecraft:element_114"},{"data":9,"id":380,"name":"minecraft:element_114"},{"data":10,"id":380,"name":"minecraft:element_114"},{"data":11,"id":380,"name":"minecraft:element_114"},{"data":12,"id":380,"name":"minecraft:element_114"},{"data":13,"id":380,"name":"minecraft:element_114"},{"data":14,"id":380,"name":"minecraft:element_114"},{"data":15,"id":380,"name":"minecraft:element_114"},{"data":0,"id":381,"name":"minecraft:element_115"},{"data":1,"id":381,"name":"minecraft:element_115"},{"data":2,"id":381,"name":"minecraft:element_115"},{"data":3,"id":381,"name":"minecraft:element_115"},{"data":4,"id":381,"name":"minecraft:element_115"},{"data":5,"id":381,"name":"minecraft:element_115"},{"data":6,"id":381,"name":"minecraft:element_115"},{"data":7,"id":381,"name":"minecraft:element_115"},{"data":8,"id":381,"name":"minecraft:element_115"},{"data":9,"id":381,"name":"minecraft:element_115"},{"data":10,"id":381,"name":"minecraft:element_115"},{"data":11,"id":381,"name":"minecraft:element_115"},{"data":12,"id":381,"name":"minecraft:element_115"},{"data":13,"id":381,"name":"minecraft:element_115"},{"data":14,"id":381,"name":"minecraft:element_115"},{"data":15,"id":381,"name":"minecraft:element_115"},{"data":0,"id":382,"name":"minecraft:element_116"},{"data":1,"id":382,"name":"minecraft:element_116"},{"data":2,"id":382,"name":"minecraft:element_116"},{"data":3,"id":382,"name":"minecraft:element_116"},{"data":4,"id":382,"name":"minecraft:element_116"},{"data":5,"id":382,"name":"minecraft:element_116"},{"data":6,"id":382,"name":"minecraft:element_116"},{"data":7,"id":382,"name":"minecraft:element_116"},{"data":8,"id":382,"name":"minecraft:element_116"},{"data":9,"id":382,"name":"minecraft:element_116"},{"data":10,"id":382,"name":"minecraft:element_116"},{"data":11,"id":382,"name":"minecraft:element_116"},{"data":12,"id":382,"name":"minecraft:element_116"},{"data":13,"id":382,"name":"minecraft:element_116"},{"data":14,"id":382,"name":"minecraft:element_116"},{"data":15,"id":382,"name":"minecraft:element_116"},{"data":0,"id":383,"name":"minecraft:element_117"},{"data":1,"id":383,"name":"minecraft:element_117"},{"data":2,"id":383,"name":"minecraft:element_117"},{"data":3,"id":383,"name":"minecraft:element_117"},{"data":4,"id":383,"name":"minecraft:element_117"},{"data":5,"id":383,"name":"minecraft:element_117"},{"data":6,"id":383,"name":"minecraft:element_117"},{"data":7,"id":383,"name":"minecraft:element_117"},{"data":8,"id":383,"name":"minecraft:element_117"},{"data":9,"id":383,"name":"minecraft:element_117"},{"data":10,"id":383,"name":"minecraft:element_117"},{"data":11,"id":383,"name":"minecraft:element_117"},{"data":12,"id":383,"name":"minecraft:element_117"},{"data":13,"id":383,"name":"minecraft:element_117"},{"data":14,"id":383,"name":"minecraft:element_117"},{"data":15,"id":383,"name":"minecraft:element_117"},{"data":0,"id":384,"name":"minecraft:element_118"},{"data":1,"id":384,"name":"minecraft:element_118"},{"data":2,"id":384,"name":"minecraft:element_118"},{"data":3,"id":384,"name":"minecraft:element_118"},{"data":4,"id":384,"name":"minecraft:element_118"},{"data":5,"id":384,"name":"minecraft:element_118"},{"data":6,"id":384,"name":"minecraft:element_118"},{"data":7,"id":384,"name":"minecraft:element_118"},{"data":8,"id":384,"name":"minecraft:element_118"},{"data":9,"id":384,"name":"minecraft:element_118"},{"data":10,"id":384,"name":"minecraft:element_118"},{"data":11,"id":384,"name":"minecraft:element_118"},{"data":12,"id":384,"name":"minecraft:element_118"},{"data":13,"id":384,"name":"minecraft:element_118"},{"data":14,"id":384,"name":"minecraft:element_118"},{"data":15,"id":384,"name":"minecraft:element_118"},{"data":0,"id":385,"name":"minecraft:seagrass"},{"data":1,"id":385,"name":"minecraft:seagrass"},{"data":2,"id":385,"name":"minecraft:seagrass"},{"data":3,"id":385,"name":"minecraft:seagrass"},{"data":0,"id":386,"name":"minecraft:coral"},{"data":1,"id":386,"name":"minecraft:coral"},{"data":2,"id":386,"name":"minecraft:coral"},{"data":3,"id":386,"name":"minecraft:coral"},{"data":4,"id":386,"name":"minecraft:coral"},{"data":5,"id":386,"name":"minecraft:coral"},{"data":6,"id":386,"name":"minecraft:coral"},{"data":7,"id":386,"name":"minecraft:coral"},{"data":8,"id":386,"name":"minecraft:coral"},{"data":9,"id":386,"name":"minecraft:coral"},{"data":10,"id":386,"name":"minecraft:coral"},{"data":11,"id":386,"name":"minecraft:coral"},{"data":12,"id":386,"name":"minecraft:coral"},{"data":13,"id":386,"name":"minecraft:coral"},{"data":14,"id":386,"name":"minecraft:coral"},{"data":15,"id":386,"name":"minecraft:coral"},{"data":0,"id":387,"name":"minecraft:coral_block"},{"data":1,"id":387,"name":"minecraft:coral_block"},{"data":2,"id":387,"name":"minecraft:coral_block"},{"data":3,"id":387,"name":"minecraft:coral_block"},{"data":4,"id":387,"name":"minecraft:coral_block"},{"data":5,"id":387,"name":"minecraft:coral_block"},{"data":6,"id":387,"name":"minecraft:coral_block"},{"data":7,"id":387,"name":"minecraft:coral_block"},{"data":8,"id":387,"name":"minecraft:coral_block"},{"data":9,"id":387,"name":"minecraft:coral_block"},{"data":10,"id":387,"name":"minecraft:coral_block"},{"data":11,"id":387,"name":"minecraft:coral_block"},{"data":12,"id":387,"name":"minecraft:coral_block"},{"data":13,"id":387,"name":"minecraft:coral_block"},{"data":14,"id":387,"name":"minecraft:coral_block"},{"data":15,"id":387,"name":"minecraft:coral_block"},{"data":0,"id":388,"name":"minecraft:coral_fan"},{"data":1,"id":388,"name":"minecraft:coral_fan"},{"data":2,"id":388,"name":"minecraft:coral_fan"},{"data":3,"id":388,"name":"minecraft:coral_fan"},{"data":4,"id":388,"name":"minecraft:coral_fan"},{"data":5,"id":388,"name":"minecraft:coral_fan"},{"data":6,"id":388,"name":"minecraft:coral_fan"},{"data":7,"id":388,"name":"minecraft:coral_fan"},{"data":8,"id":388,"name":"minecraft:coral_fan"},{"data":9,"id":388,"name":"minecraft:coral_fan"},{"data":10,"id":388,"name":"minecraft:coral_fan"},{"data":11,"id":388,"name":"minecraft:coral_fan"},{"data":12,"id":388,"name":"minecraft:coral_fan"},{"data":13,"id":388,"name":"minecraft:coral_fan"},{"data":14,"id":388,"name":"minecraft:coral_fan"},{"data":15,"id":388,"name":"minecraft:coral_fan"},{"data":0,"id":389,"name":"minecraft:coral_fan_dead"},{"data":1,"id":389,"name":"minecraft:coral_fan_dead"},{"data":2,"id":389,"name":"minecraft:coral_fan_dead"},{"data":3,"id":389,"name":"minecraft:coral_fan_dead"},{"data":4,"id":389,"name":"minecraft:coral_fan_dead"},{"data":5,"id":389,"name":"minecraft:coral_fan_dead"},{"data":6,"id":389,"name":"minecraft:coral_fan_dead"},{"data":7,"id":389,"name":"minecraft:coral_fan_dead"},{"data":8,"id":389,"name":"minecraft:coral_fan_dead"},{"data":9,"id":389,"name":"minecraft:coral_fan_dead"},{"data":10,"id":389,"name":"minecraft:coral_fan_dead"},{"data":11,"id":389,"name":"minecraft:coral_fan_dead"},{"data":12,"id":389,"name":"minecraft:coral_fan_dead"},{"data":13,"id":389,"name":"minecraft:coral_fan_dead"},{"data":14,"id":389,"name":"minecraft:coral_fan_dead"},{"data":15,"id":389,"name":"minecraft:coral_fan_dead"},{"data":0,"id":390,"name":"minecraft:coral_fan_hang"},{"data":1,"id":390,"name":"minecraft:coral_fan_hang"},{"data":2,"id":390,"name":"minecraft:coral_fan_hang"},{"data":3,"id":390,"name":"minecraft:coral_fan_hang"},{"data":4,"id":390,"name":"minecraft:coral_fan_hang"},{"data":5,"id":390,"name":"minecraft:coral_fan_hang"},{"data":6,"id":390,"name":"minecraft:coral_fan_hang"},{"data":7,"id":390,"name":"minecraft:coral_fan_hang"},{"data":8,"id":390,"name":"minecraft:coral_fan_hang"},{"data":9,"id":390,"name":"minecraft:coral_fan_hang"},{"data":10,"id":390,"name":"minecraft:coral_fan_hang"},{"data":11,"id":390,"name":"minecraft:coral_fan_hang"},{"data":12,"id":390,"name":"minecraft:coral_fan_hang"},{"data":13,"id":390,"name":"minecraft:coral_fan_hang"},{"data":14,"id":390,"name":"minecraft:coral_fan_hang"},{"data":15,"id":390,"name":"minecraft:coral_fan_hang"},{"data":0,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":1,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":2,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":3,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":4,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":5,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":6,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":7,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":8,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":9,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":10,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":11,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":12,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":13,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":14,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":15,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":0,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":1,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":2,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":3,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":4,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":5,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":6,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":7,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":8,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":9,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":10,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":11,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":12,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":13,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":14,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":15,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":0,"id":393,"name":"minecraft:kelp"},{"data":1,"id":393,"name":"minecraft:kelp"},{"data":2,"id":393,"name":"minecraft:kelp"},{"data":3,"id":393,"name":"minecraft:kelp"},{"data":4,"id":393,"name":"minecraft:kelp"},{"data":5,"id":393,"name":"minecraft:kelp"},{"data":6,"id":393,"name":"minecraft:kelp"},{"data":7,"id":393,"name":"minecraft:kelp"},{"data":8,"id":393,"name":"minecraft:kelp"},{"data":9,"id":393,"name":"minecraft:kelp"},{"data":10,"id":393,"name":"minecraft:kelp"},{"data":11,"id":393,"name":"minecraft:kelp"},{"data":12,"id":393,"name":"minecraft:kelp"},{"data":13,"id":393,"name":"minecraft:kelp"},{"data":14,"id":393,"name":"minecraft:kelp"},{"data":15,"id":393,"name":"minecraft:kelp"},{"data":0,"id":394,"name":"minecraft:dried_kelp_block"},{"data":0,"id":395,"name":"minecraft:acacia_button"},{"data":1,"id":395,"name":"minecraft:acacia_button"},{"data":2,"id":395,"name":"minecraft:acacia_button"},{"data":3,"id":395,"name":"minecraft:acacia_button"},{"data":4,"id":395,"name":"minecraft:acacia_button"},{"data":5,"id":395,"name":"minecraft:acacia_button"},{"data":6,"id":395,"name":"minecraft:acacia_button"},{"data":7,"id":395,"name":"minecraft:acacia_button"},{"data":8,"id":395,"name":"minecraft:acacia_button"},{"data":9,"id":395,"name":"minecraft:acacia_button"},{"data":10,"id":395,"name":"minecraft:acacia_button"},{"data":11,"id":395,"name":"minecraft:acacia_button"},{"data":12,"id":395,"name":"minecraft:acacia_button"},{"data":13,"id":395,"name":"minecraft:acacia_button"},{"data":14,"id":395,"name":"minecraft:acacia_button"},{"data":15,"id":395,"name":"minecraft:acacia_button"},{"data":0,"id":396,"name":"minecraft:birch_button"},{"data":1,"id":396,"name":"minecraft:birch_button"},{"data":2,"id":396,"name":"minecraft:birch_button"},{"data":3,"id":396,"name":"minecraft:birch_button"},{"data":4,"id":396,"name":"minecraft:birch_button"},{"data":5,"id":396,"name":"minecraft:birch_button"},{"data":6,"id":396,"name":"minecraft:birch_button"},{"data":7,"id":396,"name":"minecraft:birch_button"},{"data":8,"id":396,"name":"minecraft:birch_button"},{"data":9,"id":396,"name":"minecraft:birch_button"},{"data":10,"id":396,"name":"minecraft:birch_button"},{"data":11,"id":396,"name":"minecraft:birch_button"},{"data":12,"id":396,"name":"minecraft:birch_button"},{"data":13,"id":396,"name":"minecraft:birch_button"},{"data":14,"id":396,"name":"minecraft:birch_button"},{"data":15,"id":396,"name":"minecraft:birch_button"},{"data":0,"id":397,"name":"minecraft:dark_oak_button"},{"data":1,"id":397,"name":"minecraft:dark_oak_button"},{"data":2,"id":397,"name":"minecraft:dark_oak_button"},{"data":3,"id":397,"name":"minecraft:dark_oak_button"},{"data":4,"id":397,"name":"minecraft:dark_oak_button"},{"data":5,"id":397,"name":"minecraft:dark_oak_button"},{"data":6,"id":397,"name":"minecraft:dark_oak_button"},{"data":7,"id":397,"name":"minecraft:dark_oak_button"},{"data":8,"id":397,"name":"minecraft:dark_oak_button"},{"data":9,"id":397,"name":"minecraft:dark_oak_button"},{"data":10,"id":397,"name":"minecraft:dark_oak_button"},{"data":11,"id":397,"name":"minecraft:dark_oak_button"},{"data":12,"id":397,"name":"minecraft:dark_oak_button"},{"data":13,"id":397,"name":"minecraft:dark_oak_button"},{"data":14,"id":397,"name":"minecraft:dark_oak_button"},{"data":15,"id":397,"name":"minecraft:dark_oak_button"},{"data":0,"id":398,"name":"minecraft:jungle_button"},{"data":1,"id":398,"name":"minecraft:jungle_button"},{"data":2,"id":398,"name":"minecraft:jungle_button"},{"data":3,"id":398,"name":"minecraft:jungle_button"},{"data":4,"id":398,"name":"minecraft:jungle_button"},{"data":5,"id":398,"name":"minecraft:jungle_button"},{"data":6,"id":398,"name":"minecraft:jungle_button"},{"data":7,"id":398,"name":"minecraft:jungle_button"},{"data":8,"id":398,"name":"minecraft:jungle_button"},{"data":9,"id":398,"name":"minecraft:jungle_button"},{"data":10,"id":398,"name":"minecraft:jungle_button"},{"data":11,"id":398,"name":"minecraft:jungle_button"},{"data":12,"id":398,"name":"minecraft:jungle_button"},{"data":13,"id":398,"name":"minecraft:jungle_button"},{"data":14,"id":398,"name":"minecraft:jungle_button"},{"data":15,"id":398,"name":"minecraft:jungle_button"},{"data":0,"id":399,"name":"minecraft:spruce_button"},{"data":1,"id":399,"name":"minecraft:spruce_button"},{"data":2,"id":399,"name":"minecraft:spruce_button"},{"data":3,"id":399,"name":"minecraft:spruce_button"},{"data":4,"id":399,"name":"minecraft:spruce_button"},{"data":5,"id":399,"name":"minecraft:spruce_button"},{"data":6,"id":399,"name":"minecraft:spruce_button"},{"data":7,"id":399,"name":"minecraft:spruce_button"},{"data":8,"id":399,"name":"minecraft:spruce_button"},{"data":9,"id":399,"name":"minecraft:spruce_button"},{"data":10,"id":399,"name":"minecraft:spruce_button"},{"data":11,"id":399,"name":"minecraft:spruce_button"},{"data":12,"id":399,"name":"minecraft:spruce_button"},{"data":13,"id":399,"name":"minecraft:spruce_button"},{"data":14,"id":399,"name":"minecraft:spruce_button"},{"data":15,"id":399,"name":"minecraft:spruce_button"},{"data":0,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":1,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":2,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":3,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":4,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":5,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":6,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":7,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":8,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":9,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":10,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":11,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":12,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":13,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":14,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":15,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":0,"id":401,"name":"minecraft:birch_trapdoor"},{"data":1,"id":401,"name":"minecraft:birch_trapdoor"},{"data":2,"id":401,"name":"minecraft:birch_trapdoor"},{"data":3,"id":401,"name":"minecraft:birch_trapdoor"},{"data":4,"id":401,"name":"minecraft:birch_trapdoor"},{"data":5,"id":401,"name":"minecraft:birch_trapdoor"},{"data":6,"id":401,"name":"minecraft:birch_trapdoor"},{"data":7,"id":401,"name":"minecraft:birch_trapdoor"},{"data":8,"id":401,"name":"minecraft:birch_trapdoor"},{"data":9,"id":401,"name":"minecraft:birch_trapdoor"},{"data":10,"id":401,"name":"minecraft:birch_trapdoor"},{"data":11,"id":401,"name":"minecraft:birch_trapdoor"},{"data":12,"id":401,"name":"minecraft:birch_trapdoor"},{"data":13,"id":401,"name":"minecraft:birch_trapdoor"},{"data":14,"id":401,"name":"minecraft:birch_trapdoor"},{"data":15,"id":401,"name":"minecraft:birch_trapdoor"},{"data":0,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":1,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":2,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":3,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":4,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":5,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":6,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":7,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":8,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":9,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":10,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":11,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":12,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":13,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":14,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":15,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":0,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":1,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":2,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":3,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":4,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":5,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":6,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":7,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":8,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":9,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":10,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":11,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":12,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":13,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":14,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":15,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":0,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":1,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":2,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":3,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":4,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":5,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":6,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":7,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":8,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":9,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":10,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":11,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":12,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":13,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":14,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":15,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":0,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":1,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":2,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":3,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":4,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":5,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":6,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":7,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":8,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":9,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":10,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":11,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":12,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":13,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":14,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":15,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":0,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":1,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":2,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":3,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":4,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":5,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":6,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":7,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":8,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":9,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":10,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":11,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":12,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":13,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":14,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":15,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":0,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":1,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":2,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":3,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":4,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":5,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":6,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":7,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":8,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":9,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":10,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":11,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":12,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":13,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":14,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":15,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":0,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":1,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":2,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":3,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":4,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":5,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":6,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":7,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":8,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":9,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":10,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":11,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":12,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":13,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":14,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":15,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":0,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":1,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":2,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":3,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":4,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":5,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":6,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":7,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":8,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":9,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":10,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":11,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":12,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":13,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":14,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":15,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":0,"id":410,"name":"minecraft:carved_pumpkin"},{"data":1,"id":410,"name":"minecraft:carved_pumpkin"},{"data":2,"id":410,"name":"minecraft:carved_pumpkin"},{"data":3,"id":410,"name":"minecraft:carved_pumpkin"},{"data":0,"id":411,"name":"minecraft:sea_pickle"},{"data":1,"id":411,"name":"minecraft:sea_pickle"},{"data":2,"id":411,"name":"minecraft:sea_pickle"},{"data":3,"id":411,"name":"minecraft:sea_pickle"},{"data":4,"id":411,"name":"minecraft:sea_pickle"},{"data":5,"id":411,"name":"minecraft:sea_pickle"},{"data":6,"id":411,"name":"minecraft:sea_pickle"},{"data":7,"id":411,"name":"minecraft:sea_pickle"},{"data":0,"id":412,"name":"minecraft:conduit"},{"data":0,"id":414,"name":"minecraft:turtle_egg"},{"data":1,"id":414,"name":"minecraft:turtle_egg"},{"data":2,"id":414,"name":"minecraft:turtle_egg"},{"data":3,"id":414,"name":"minecraft:turtle_egg"},{"data":4,"id":414,"name":"minecraft:turtle_egg"},{"data":5,"id":414,"name":"minecraft:turtle_egg"},{"data":6,"id":414,"name":"minecraft:turtle_egg"},{"data":7,"id":414,"name":"minecraft:turtle_egg"},{"data":8,"id":414,"name":"minecraft:turtle_egg"},{"data":9,"id":414,"name":"minecraft:turtle_egg"},{"data":10,"id":414,"name":"minecraft:turtle_egg"},{"data":11,"id":414,"name":"minecraft:turtle_egg"},{"data":12,"id":414,"name":"minecraft:turtle_egg"},{"data":13,"id":414,"name":"minecraft:turtle_egg"},{"data":14,"id":414,"name":"minecraft:turtle_egg"},{"data":15,"id":414,"name":"minecraft:turtle_egg"},{"data":0,"id":415,"name":"minecraft:bubble_column"},{"data":1,"id":415,"name":"minecraft:bubble_column"},{"data":0,"id":416,"name":"minecraft:barrier"},{"data":0,"id":418,"name":"minecraft:bamboo"},{"data":1,"id":418,"name":"minecraft:bamboo"},{"data":2,"id":418,"name":"minecraft:bamboo"},{"data":3,"id":418,"name":"minecraft:bamboo"},{"data":4,"id":418,"name":"minecraft:bamboo"},{"data":5,"id":418,"name":"minecraft:bamboo"},{"data":6,"id":418,"name":"minecraft:bamboo"},{"data":7,"id":418,"name":"minecraft:bamboo"},{"data":8,"id":418,"name":"minecraft:bamboo"},{"data":9,"id":418,"name":"minecraft:bamboo"},{"data":10,"id":418,"name":"minecraft:bamboo"},{"data":11,"id":418,"name":"minecraft:bamboo"},{"data":12,"id":418,"name":"minecraft:bamboo"},{"data":13,"id":418,"name":"minecraft:bamboo"},{"data":14,"id":418,"name":"minecraft:bamboo"},{"data":15,"id":418,"name":"minecraft:bamboo"},{"data":0,"id":419,"name":"minecraft:bamboo_sapling"},{"data":1,"id":419,"name":"minecraft:bamboo_sapling"},{"data":2,"id":419,"name":"minecraft:bamboo_sapling"},{"data":3,"id":419,"name":"minecraft:bamboo_sapling"},{"data":4,"id":419,"name":"minecraft:bamboo_sapling"},{"data":5,"id":419,"name":"minecraft:bamboo_sapling"},{"data":6,"id":419,"name":"minecraft:bamboo_sapling"},{"data":7,"id":419,"name":"minecraft:bamboo_sapling"},{"data":8,"id":419,"name":"minecraft:bamboo_sapling"},{"data":9,"id":419,"name":"minecraft:bamboo_sapling"},{"data":10,"id":419,"name":"minecraft:bamboo_sapling"},{"data":11,"id":419,"name":"minecraft:bamboo_sapling"},{"data":12,"id":419,"name":"minecraft:bamboo_sapling"},{"data":13,"id":419,"name":"minecraft:bamboo_sapling"},{"data":14,"id":419,"name":"minecraft:bamboo_sapling"},{"data":15,"id":419,"name":"minecraft:bamboo_sapling"},{"data":0,"id":420,"name":"minecraft:scaffolding"},{"data":1,"id":420,"name":"minecraft:scaffolding"},{"data":2,"id":420,"name":"minecraft:scaffolding"},{"data":3,"id":420,"name":"minecraft:scaffolding"},{"data":4,"id":420,"name":"minecraft:scaffolding"},{"data":5,"id":420,"name":"minecraft:scaffolding"},{"data":6,"id":420,"name":"minecraft:scaffolding"},{"data":7,"id":420,"name":"minecraft:scaffolding"},{"data":8,"id":420,"name":"minecraft:scaffolding"},{"data":9,"id":420,"name":"minecraft:scaffolding"},{"data":10,"id":420,"name":"minecraft:scaffolding"},{"data":11,"id":420,"name":"minecraft:scaffolding"},{"data":12,"id":420,"name":"minecraft:scaffolding"},{"data":13,"id":420,"name":"minecraft:scaffolding"},{"data":14,"id":420,"name":"minecraft:scaffolding"},{"data":15,"id":420,"name":"minecraft:scaffolding"}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_332.json b/src/main/resources/runtimeid_table_332.json deleted file mode 100644 index 1d32c4fea..000000000 --- a/src/main/resources/runtimeid_table_332.json +++ /dev/null @@ -1 +0,0 @@ -[{"data":0,"id":0,"name":"minecraft:air"},{"data":0,"id":1,"name":"minecraft:stone"},{"data":1,"id":1,"name":"minecraft:stone"},{"data":2,"id":1,"name":"minecraft:stone"},{"data":3,"id":1,"name":"minecraft:stone"},{"data":4,"id":1,"name":"minecraft:stone"},{"data":5,"id":1,"name":"minecraft:stone"},{"data":6,"id":1,"name":"minecraft:stone"},{"data":7,"id":1,"name":"minecraft:stone"},{"data":0,"id":2,"name":"minecraft:grass"},{"data":1,"id":2,"name":"minecraft:grass"},{"data":2,"id":2,"name":"minecraft:grass"},{"data":3,"id":2,"name":"minecraft:grass"},{"data":4,"id":2,"name":"minecraft:grass"},{"data":5,"id":2,"name":"minecraft:grass"},{"data":6,"id":2,"name":"minecraft:grass"},{"data":7,"id":2,"name":"minecraft:grass"},{"data":8,"id":2,"name":"minecraft:grass"},{"data":9,"id":2,"name":"minecraft:grass"},{"data":10,"id":2,"name":"minecraft:grass"},{"data":11,"id":2,"name":"minecraft:grass"},{"data":12,"id":2,"name":"minecraft:grass"},{"data":13,"id":2,"name":"minecraft:grass"},{"data":14,"id":2,"name":"minecraft:grass"},{"data":15,"id":2,"name":"minecraft:grass"},{"data":0,"id":3,"name":"minecraft:dirt"},{"data":1,"id":3,"name":"minecraft:dirt"},{"data":0,"id":4,"name":"minecraft:cobblestone"},{"data":0,"id":5,"name":"minecraft:planks"},{"data":1,"id":5,"name":"minecraft:planks"},{"data":2,"id":5,"name":"minecraft:planks"},{"data":3,"id":5,"name":"minecraft:planks"},{"data":4,"id":5,"name":"minecraft:planks"},{"data":5,"id":5,"name":"minecraft:planks"},{"data":6,"id":5,"name":"minecraft:planks"},{"data":7,"id":5,"name":"minecraft:planks"},{"data":0,"id":6,"name":"minecraft:sapling"},{"data":1,"id":6,"name":"minecraft:sapling"},{"data":2,"id":6,"name":"minecraft:sapling"},{"data":3,"id":6,"name":"minecraft:sapling"},{"data":4,"id":6,"name":"minecraft:sapling"},{"data":5,"id":6,"name":"minecraft:sapling"},{"data":6,"id":6,"name":"minecraft:sapling"},{"data":7,"id":6,"name":"minecraft:sapling"},{"data":8,"id":6,"name":"minecraft:sapling"},{"data":9,"id":6,"name":"minecraft:sapling"},{"data":10,"id":6,"name":"minecraft:sapling"},{"data":11,"id":6,"name":"minecraft:sapling"},{"data":12,"id":6,"name":"minecraft:sapling"},{"data":13,"id":6,"name":"minecraft:sapling"},{"data":14,"id":6,"name":"minecraft:sapling"},{"data":15,"id":6,"name":"minecraft:sapling"},{"data":0,"id":7,"name":"minecraft:bedrock"},{"data":1,"id":7,"name":"minecraft:bedrock"},{"data":0,"id":8,"name":"minecraft:flowing_water"},{"data":1,"id":8,"name":"minecraft:flowing_water"},{"data":2,"id":8,"name":"minecraft:flowing_water"},{"data":3,"id":8,"name":"minecraft:flowing_water"},{"data":4,"id":8,"name":"minecraft:flowing_water"},{"data":5,"id":8,"name":"minecraft:flowing_water"},{"data":6,"id":8,"name":"minecraft:flowing_water"},{"data":7,"id":8,"name":"minecraft:flowing_water"},{"data":8,"id":8,"name":"minecraft:flowing_water"},{"data":9,"id":8,"name":"minecraft:flowing_water"},{"data":10,"id":8,"name":"minecraft:flowing_water"},{"data":11,"id":8,"name":"minecraft:flowing_water"},{"data":12,"id":8,"name":"minecraft:flowing_water"},{"data":13,"id":8,"name":"minecraft:flowing_water"},{"data":14,"id":8,"name":"minecraft:flowing_water"},{"data":15,"id":8,"name":"minecraft:flowing_water"},{"data":0,"id":9,"name":"minecraft:water"},{"data":1,"id":9,"name":"minecraft:water"},{"data":2,"id":9,"name":"minecraft:water"},{"data":3,"id":9,"name":"minecraft:water"},{"data":4,"id":9,"name":"minecraft:water"},{"data":5,"id":9,"name":"minecraft:water"},{"data":6,"id":9,"name":"minecraft:water"},{"data":7,"id":9,"name":"minecraft:water"},{"data":8,"id":9,"name":"minecraft:water"},{"data":9,"id":9,"name":"minecraft:water"},{"data":10,"id":9,"name":"minecraft:water"},{"data":11,"id":9,"name":"minecraft:water"},{"data":12,"id":9,"name":"minecraft:water"},{"data":13,"id":9,"name":"minecraft:water"},{"data":14,"id":9,"name":"minecraft:water"},{"data":15,"id":9,"name":"minecraft:water"},{"data":0,"id":10,"name":"minecraft:flowing_lava"},{"data":1,"id":10,"name":"minecraft:flowing_lava"},{"data":2,"id":10,"name":"minecraft:flowing_lava"},{"data":3,"id":10,"name":"minecraft:flowing_lava"},{"data":4,"id":10,"name":"minecraft:flowing_lava"},{"data":5,"id":10,"name":"minecraft:flowing_lava"},{"data":6,"id":10,"name":"minecraft:flowing_lava"},{"data":7,"id":10,"name":"minecraft:flowing_lava"},{"data":8,"id":10,"name":"minecraft:flowing_lava"},{"data":9,"id":10,"name":"minecraft:flowing_lava"},{"data":10,"id":10,"name":"minecraft:flowing_lava"},{"data":11,"id":10,"name":"minecraft:flowing_lava"},{"data":12,"id":10,"name":"minecraft:flowing_lava"},{"data":13,"id":10,"name":"minecraft:flowing_lava"},{"data":14,"id":10,"name":"minecraft:flowing_lava"},{"data":15,"id":10,"name":"minecraft:flowing_lava"},{"data":0,"id":11,"name":"minecraft:lava"},{"data":1,"id":11,"name":"minecraft:lava"},{"data":2,"id":11,"name":"minecraft:lava"},{"data":3,"id":11,"name":"minecraft:lava"},{"data":4,"id":11,"name":"minecraft:lava"},{"data":5,"id":11,"name":"minecraft:lava"},{"data":6,"id":11,"name":"minecraft:lava"},{"data":7,"id":11,"name":"minecraft:lava"},{"data":8,"id":11,"name":"minecraft:lava"},{"data":9,"id":11,"name":"minecraft:lava"},{"data":10,"id":11,"name":"minecraft:lava"},{"data":11,"id":11,"name":"minecraft:lava"},{"data":12,"id":11,"name":"minecraft:lava"},{"data":13,"id":11,"name":"minecraft:lava"},{"data":14,"id":11,"name":"minecraft:lava"},{"data":15,"id":11,"name":"minecraft:lava"},{"data":0,"id":12,"name":"minecraft:sand"},{"data":1,"id":12,"name":"minecraft:sand"},{"data":0,"id":13,"name":"minecraft:gravel"},{"data":0,"id":14,"name":"minecraft:gold_ore"},{"data":0,"id":15,"name":"minecraft:iron_ore"},{"data":0,"id":16,"name":"minecraft:coal_ore"},{"data":0,"id":17,"name":"minecraft:log"},{"data":1,"id":17,"name":"minecraft:log"},{"data":2,"id":17,"name":"minecraft:log"},{"data":3,"id":17,"name":"minecraft:log"},{"data":4,"id":17,"name":"minecraft:log"},{"data":5,"id":17,"name":"minecraft:log"},{"data":6,"id":17,"name":"minecraft:log"},{"data":7,"id":17,"name":"minecraft:log"},{"data":8,"id":17,"name":"minecraft:log"},{"data":9,"id":17,"name":"minecraft:log"},{"data":10,"id":17,"name":"minecraft:log"},{"data":11,"id":17,"name":"minecraft:log"},{"data":12,"id":17,"name":"minecraft:log"},{"data":13,"id":17,"name":"minecraft:log"},{"data":14,"id":17,"name":"minecraft:log"},{"data":15,"id":17,"name":"minecraft:log"},{"data":0,"id":18,"name":"minecraft:leaves"},{"data":1,"id":18,"name":"minecraft:leaves"},{"data":2,"id":18,"name":"minecraft:leaves"},{"data":3,"id":18,"name":"minecraft:leaves"},{"data":4,"id":18,"name":"minecraft:leaves"},{"data":5,"id":18,"name":"minecraft:leaves"},{"data":6,"id":18,"name":"minecraft:leaves"},{"data":7,"id":18,"name":"minecraft:leaves"},{"data":8,"id":18,"name":"minecraft:leaves"},{"data":9,"id":18,"name":"minecraft:leaves"},{"data":10,"id":18,"name":"minecraft:leaves"},{"data":11,"id":18,"name":"minecraft:leaves"},{"data":12,"id":18,"name":"minecraft:leaves"},{"data":13,"id":18,"name":"minecraft:leaves"},{"data":14,"id":18,"name":"minecraft:leaves"},{"data":15,"id":18,"name":"minecraft:leaves"},{"data":0,"id":19,"name":"minecraft:sponge"},{"data":1,"id":19,"name":"minecraft:sponge"},{"data":0,"id":20,"name":"minecraft:glass"},{"data":0,"id":21,"name":"minecraft:lapis_ore"},{"data":0,"id":22,"name":"minecraft:lapis_block"},{"data":0,"id":23,"name":"minecraft:dispenser"},{"data":1,"id":23,"name":"minecraft:dispenser"},{"data":2,"id":23,"name":"minecraft:dispenser"},{"data":3,"id":23,"name":"minecraft:dispenser"},{"data":4,"id":23,"name":"minecraft:dispenser"},{"data":5,"id":23,"name":"minecraft:dispenser"},{"data":6,"id":23,"name":"minecraft:dispenser"},{"data":7,"id":23,"name":"minecraft:dispenser"},{"data":8,"id":23,"name":"minecraft:dispenser"},{"data":9,"id":23,"name":"minecraft:dispenser"},{"data":10,"id":23,"name":"minecraft:dispenser"},{"data":11,"id":23,"name":"minecraft:dispenser"},{"data":12,"id":23,"name":"minecraft:dispenser"},{"data":13,"id":23,"name":"minecraft:dispenser"},{"data":14,"id":23,"name":"minecraft:dispenser"},{"data":15,"id":23,"name":"minecraft:dispenser"},{"data":0,"id":24,"name":"minecraft:sandstone"},{"data":1,"id":24,"name":"minecraft:sandstone"},{"data":2,"id":24,"name":"minecraft:sandstone"},{"data":3,"id":24,"name":"minecraft:sandstone"},{"data":0,"id":25,"name":"minecraft:noteblock"},{"data":0,"id":26,"name":"minecraft:bed"},{"data":1,"id":26,"name":"minecraft:bed"},{"data":2,"id":26,"name":"minecraft:bed"},{"data":3,"id":26,"name":"minecraft:bed"},{"data":4,"id":26,"name":"minecraft:bed"},{"data":5,"id":26,"name":"minecraft:bed"},{"data":6,"id":26,"name":"minecraft:bed"},{"data":7,"id":26,"name":"minecraft:bed"},{"data":8,"id":26,"name":"minecraft:bed"},{"data":9,"id":26,"name":"minecraft:bed"},{"data":10,"id":26,"name":"minecraft:bed"},{"data":11,"id":26,"name":"minecraft:bed"},{"data":12,"id":26,"name":"minecraft:bed"},{"data":13,"id":26,"name":"minecraft:bed"},{"data":14,"id":26,"name":"minecraft:bed"},{"data":15,"id":26,"name":"minecraft:bed"},{"data":0,"id":27,"name":"minecraft:golden_rail"},{"data":1,"id":27,"name":"minecraft:golden_rail"},{"data":2,"id":27,"name":"minecraft:golden_rail"},{"data":3,"id":27,"name":"minecraft:golden_rail"},{"data":4,"id":27,"name":"minecraft:golden_rail"},{"data":5,"id":27,"name":"minecraft:golden_rail"},{"data":6,"id":27,"name":"minecraft:golden_rail"},{"data":7,"id":27,"name":"minecraft:golden_rail"},{"data":8,"id":27,"name":"minecraft:golden_rail"},{"data":9,"id":27,"name":"minecraft:golden_rail"},{"data":10,"id":27,"name":"minecraft:golden_rail"},{"data":11,"id":27,"name":"minecraft:golden_rail"},{"data":12,"id":27,"name":"minecraft:golden_rail"},{"data":13,"id":27,"name":"minecraft:golden_rail"},{"data":14,"id":27,"name":"minecraft:golden_rail"},{"data":15,"id":27,"name":"minecraft:golden_rail"},{"data":0,"id":28,"name":"minecraft:detector_rail"},{"data":1,"id":28,"name":"minecraft:detector_rail"},{"data":2,"id":28,"name":"minecraft:detector_rail"},{"data":3,"id":28,"name":"minecraft:detector_rail"},{"data":4,"id":28,"name":"minecraft:detector_rail"},{"data":5,"id":28,"name":"minecraft:detector_rail"},{"data":6,"id":28,"name":"minecraft:detector_rail"},{"data":7,"id":28,"name":"minecraft:detector_rail"},{"data":8,"id":28,"name":"minecraft:detector_rail"},{"data":9,"id":28,"name":"minecraft:detector_rail"},{"data":10,"id":28,"name":"minecraft:detector_rail"},{"data":11,"id":28,"name":"minecraft:detector_rail"},{"data":12,"id":28,"name":"minecraft:detector_rail"},{"data":13,"id":28,"name":"minecraft:detector_rail"},{"data":14,"id":28,"name":"minecraft:detector_rail"},{"data":15,"id":28,"name":"minecraft:detector_rail"},{"data":0,"id":29,"name":"minecraft:sticky_piston"},{"data":1,"id":29,"name":"minecraft:sticky_piston"},{"data":2,"id":29,"name":"minecraft:sticky_piston"},{"data":3,"id":29,"name":"minecraft:sticky_piston"},{"data":4,"id":29,"name":"minecraft:sticky_piston"},{"data":5,"id":29,"name":"minecraft:sticky_piston"},{"data":6,"id":29,"name":"minecraft:sticky_piston"},{"data":7,"id":29,"name":"minecraft:sticky_piston"},{"data":0,"id":30,"name":"minecraft:web"},{"data":0,"id":31,"name":"minecraft:tallgrass"},{"data":1,"id":31,"name":"minecraft:tallgrass"},{"data":2,"id":31,"name":"minecraft:tallgrass"},{"data":3,"id":31,"name":"minecraft:tallgrass"},{"data":0,"id":32,"name":"minecraft:deadbush"},{"data":0,"id":33,"name":"minecraft:piston"},{"data":1,"id":33,"name":"minecraft:piston"},{"data":2,"id":33,"name":"minecraft:piston"},{"data":3,"id":33,"name":"minecraft:piston"},{"data":4,"id":33,"name":"minecraft:piston"},{"data":5,"id":33,"name":"minecraft:piston"},{"data":6,"id":33,"name":"minecraft:piston"},{"data":7,"id":33,"name":"minecraft:piston"},{"data":0,"id":34,"name":"minecraft:pistonArmCollision"},{"data":1,"id":34,"name":"minecraft:pistonArmCollision"},{"data":2,"id":34,"name":"minecraft:pistonArmCollision"},{"data":3,"id":34,"name":"minecraft:pistonArmCollision"},{"data":4,"id":34,"name":"minecraft:pistonArmCollision"},{"data":5,"id":34,"name":"minecraft:pistonArmCollision"},{"data":6,"id":34,"name":"minecraft:pistonArmCollision"},{"data":7,"id":34,"name":"minecraft:pistonArmCollision"},{"data":0,"id":35,"name":"minecraft:wool"},{"data":1,"id":35,"name":"minecraft:wool"},{"data":2,"id":35,"name":"minecraft:wool"},{"data":3,"id":35,"name":"minecraft:wool"},{"data":4,"id":35,"name":"minecraft:wool"},{"data":5,"id":35,"name":"minecraft:wool"},{"data":6,"id":35,"name":"minecraft:wool"},{"data":7,"id":35,"name":"minecraft:wool"},{"data":8,"id":35,"name":"minecraft:wool"},{"data":9,"id":35,"name":"minecraft:wool"},{"data":10,"id":35,"name":"minecraft:wool"},{"data":11,"id":35,"name":"minecraft:wool"},{"data":12,"id":35,"name":"minecraft:wool"},{"data":13,"id":35,"name":"minecraft:wool"},{"data":14,"id":35,"name":"minecraft:wool"},{"data":15,"id":35,"name":"minecraft:wool"},{"data":0,"id":36,"name":"minecraft:element_0"},{"data":1,"id":36,"name":"minecraft:element_0"},{"data":2,"id":36,"name":"minecraft:element_0"},{"data":3,"id":36,"name":"minecraft:element_0"},{"data":4,"id":36,"name":"minecraft:element_0"},{"data":5,"id":36,"name":"minecraft:element_0"},{"data":6,"id":36,"name":"minecraft:element_0"},{"data":7,"id":36,"name":"minecraft:element_0"},{"data":8,"id":36,"name":"minecraft:element_0"},{"data":9,"id":36,"name":"minecraft:element_0"},{"data":10,"id":36,"name":"minecraft:element_0"},{"data":11,"id":36,"name":"minecraft:element_0"},{"data":12,"id":36,"name":"minecraft:element_0"},{"data":13,"id":36,"name":"minecraft:element_0"},{"data":14,"id":36,"name":"minecraft:element_0"},{"data":15,"id":36,"name":"minecraft:element_0"},{"data":0,"id":37,"name":"minecraft:yellow_flower"},{"data":1,"id":37,"name":"minecraft:yellow_flower"},{"data":2,"id":37,"name":"minecraft:yellow_flower"},{"data":3,"id":37,"name":"minecraft:yellow_flower"},{"data":4,"id":37,"name":"minecraft:yellow_flower"},{"data":5,"id":37,"name":"minecraft:yellow_flower"},{"data":6,"id":37,"name":"minecraft:yellow_flower"},{"data":7,"id":37,"name":"minecraft:yellow_flower"},{"data":8,"id":37,"name":"minecraft:yellow_flower"},{"data":9,"id":37,"name":"minecraft:yellow_flower"},{"data":10,"id":37,"name":"minecraft:yellow_flower"},{"data":11,"id":37,"name":"minecraft:yellow_flower"},{"data":12,"id":37,"name":"minecraft:yellow_flower"},{"data":13,"id":37,"name":"minecraft:yellow_flower"},{"data":14,"id":37,"name":"minecraft:yellow_flower"},{"data":15,"id":37,"name":"minecraft:yellow_flower"},{"data":0,"id":38,"name":"minecraft:red_flower"},{"data":1,"id":38,"name":"minecraft:red_flower"},{"data":2,"id":38,"name":"minecraft:red_flower"},{"data":3,"id":38,"name":"minecraft:red_flower"},{"data":4,"id":38,"name":"minecraft:red_flower"},{"data":5,"id":38,"name":"minecraft:red_flower"},{"data":6,"id":38,"name":"minecraft:red_flower"},{"data":7,"id":38,"name":"minecraft:red_flower"},{"data":8,"id":38,"name":"minecraft:red_flower"},{"data":9,"id":38,"name":"minecraft:red_flower"},{"data":10,"id":38,"name":"minecraft:red_flower"},{"data":11,"id":38,"name":"minecraft:red_flower"},{"data":12,"id":38,"name":"minecraft:red_flower"},{"data":13,"id":38,"name":"minecraft:red_flower"},{"data":14,"id":38,"name":"minecraft:red_flower"},{"data":15,"id":38,"name":"minecraft:red_flower"},{"data":0,"id":39,"name":"minecraft:brown_mushroom"},{"data":0,"id":40,"name":"minecraft:red_mushroom"},{"data":0,"id":41,"name":"minecraft:gold_block"},{"data":0,"id":42,"name":"minecraft:iron_block"},{"data":0,"id":43,"name":"minecraft:double_stone_slab"},{"data":1,"id":43,"name":"minecraft:double_stone_slab"},{"data":2,"id":43,"name":"minecraft:double_stone_slab"},{"data":3,"id":43,"name":"minecraft:double_stone_slab"},{"data":4,"id":43,"name":"minecraft:double_stone_slab"},{"data":5,"id":43,"name":"minecraft:double_stone_slab"},{"data":6,"id":43,"name":"minecraft:double_stone_slab"},{"data":7,"id":43,"name":"minecraft:double_stone_slab"},{"data":8,"id":43,"name":"minecraft:double_stone_slab"},{"data":9,"id":43,"name":"minecraft:double_stone_slab"},{"data":10,"id":43,"name":"minecraft:double_stone_slab"},{"data":11,"id":43,"name":"minecraft:double_stone_slab"},{"data":12,"id":43,"name":"minecraft:double_stone_slab"},{"data":13,"id":43,"name":"minecraft:double_stone_slab"},{"data":14,"id":43,"name":"minecraft:double_stone_slab"},{"data":15,"id":43,"name":"minecraft:double_stone_slab"},{"data":0,"id":44,"name":"minecraft:stone_slab"},{"data":1,"id":44,"name":"minecraft:stone_slab"},{"data":2,"id":44,"name":"minecraft:stone_slab"},{"data":3,"id":44,"name":"minecraft:stone_slab"},{"data":4,"id":44,"name":"minecraft:stone_slab"},{"data":5,"id":44,"name":"minecraft:stone_slab"},{"data":6,"id":44,"name":"minecraft:stone_slab"},{"data":7,"id":44,"name":"minecraft:stone_slab"},{"data":8,"id":44,"name":"minecraft:stone_slab"},{"data":9,"id":44,"name":"minecraft:stone_slab"},{"data":10,"id":44,"name":"minecraft:stone_slab"},{"data":11,"id":44,"name":"minecraft:stone_slab"},{"data":12,"id":44,"name":"minecraft:stone_slab"},{"data":13,"id":44,"name":"minecraft:stone_slab"},{"data":14,"id":44,"name":"minecraft:stone_slab"},{"data":15,"id":44,"name":"minecraft:stone_slab"},{"data":0,"id":45,"name":"minecraft:brick_block"},{"data":0,"id":46,"name":"minecraft:tnt"},{"data":1,"id":46,"name":"minecraft:tnt"},{"data":2,"id":46,"name":"minecraft:tnt"},{"data":3,"id":46,"name":"minecraft:tnt"},{"data":0,"id":47,"name":"minecraft:bookshelf"},{"data":0,"id":48,"name":"minecraft:mossy_cobblestone"},{"data":0,"id":49,"name":"minecraft:obsidian"},{"data":0,"id":50,"name":"minecraft:torch"},{"data":1,"id":50,"name":"minecraft:torch"},{"data":2,"id":50,"name":"minecraft:torch"},{"data":3,"id":50,"name":"minecraft:torch"},{"data":4,"id":50,"name":"minecraft:torch"},{"data":5,"id":50,"name":"minecraft:torch"},{"data":6,"id":50,"name":"minecraft:torch"},{"data":7,"id":50,"name":"minecraft:torch"},{"data":0,"id":51,"name":"minecraft:fire"},{"data":1,"id":51,"name":"minecraft:fire"},{"data":2,"id":51,"name":"minecraft:fire"},{"data":3,"id":51,"name":"minecraft:fire"},{"data":4,"id":51,"name":"minecraft:fire"},{"data":5,"id":51,"name":"minecraft:fire"},{"data":6,"id":51,"name":"minecraft:fire"},{"data":7,"id":51,"name":"minecraft:fire"},{"data":8,"id":51,"name":"minecraft:fire"},{"data":9,"id":51,"name":"minecraft:fire"},{"data":10,"id":51,"name":"minecraft:fire"},{"data":11,"id":51,"name":"minecraft:fire"},{"data":12,"id":51,"name":"minecraft:fire"},{"data":13,"id":51,"name":"minecraft:fire"},{"data":14,"id":51,"name":"minecraft:fire"},{"data":15,"id":51,"name":"minecraft:fire"},{"data":0,"id":52,"name":"minecraft:mob_spawner"},{"data":0,"id":53,"name":"minecraft:oak_stairs"},{"data":1,"id":53,"name":"minecraft:oak_stairs"},{"data":2,"id":53,"name":"minecraft:oak_stairs"},{"data":3,"id":53,"name":"minecraft:oak_stairs"},{"data":4,"id":53,"name":"minecraft:oak_stairs"},{"data":5,"id":53,"name":"minecraft:oak_stairs"},{"data":6,"id":53,"name":"minecraft:oak_stairs"},{"data":7,"id":53,"name":"minecraft:oak_stairs"},{"data":0,"id":54,"name":"minecraft:chest"},{"data":1,"id":54,"name":"minecraft:chest"},{"data":2,"id":54,"name":"minecraft:chest"},{"data":3,"id":54,"name":"minecraft:chest"},{"data":4,"id":54,"name":"minecraft:chest"},{"data":5,"id":54,"name":"minecraft:chest"},{"data":6,"id":54,"name":"minecraft:chest"},{"data":7,"id":54,"name":"minecraft:chest"},{"data":0,"id":55,"name":"minecraft:redstone_wire"},{"data":1,"id":55,"name":"minecraft:redstone_wire"},{"data":2,"id":55,"name":"minecraft:redstone_wire"},{"data":3,"id":55,"name":"minecraft:redstone_wire"},{"data":4,"id":55,"name":"minecraft:redstone_wire"},{"data":5,"id":55,"name":"minecraft:redstone_wire"},{"data":6,"id":55,"name":"minecraft:redstone_wire"},{"data":7,"id":55,"name":"minecraft:redstone_wire"},{"data":8,"id":55,"name":"minecraft:redstone_wire"},{"data":9,"id":55,"name":"minecraft:redstone_wire"},{"data":10,"id":55,"name":"minecraft:redstone_wire"},{"data":11,"id":55,"name":"minecraft:redstone_wire"},{"data":12,"id":55,"name":"minecraft:redstone_wire"},{"data":13,"id":55,"name":"minecraft:redstone_wire"},{"data":14,"id":55,"name":"minecraft:redstone_wire"},{"data":15,"id":55,"name":"minecraft:redstone_wire"},{"data":0,"id":56,"name":"minecraft:diamond_ore"},{"data":0,"id":57,"name":"minecraft:diamond_block"},{"data":0,"id":58,"name":"minecraft:crafting_table"},{"data":0,"id":59,"name":"minecraft:wheat"},{"data":1,"id":59,"name":"minecraft:wheat"},{"data":2,"id":59,"name":"minecraft:wheat"},{"data":3,"id":59,"name":"minecraft:wheat"},{"data":4,"id":59,"name":"minecraft:wheat"},{"data":5,"id":59,"name":"minecraft:wheat"},{"data":6,"id":59,"name":"minecraft:wheat"},{"data":7,"id":59,"name":"minecraft:wheat"},{"data":0,"id":60,"name":"minecraft:farmland"},{"data":1,"id":60,"name":"minecraft:farmland"},{"data":2,"id":60,"name":"minecraft:farmland"},{"data":3,"id":60,"name":"minecraft:farmland"},{"data":4,"id":60,"name":"minecraft:farmland"},{"data":5,"id":60,"name":"minecraft:farmland"},{"data":6,"id":60,"name":"minecraft:farmland"},{"data":7,"id":60,"name":"minecraft:farmland"},{"data":0,"id":61,"name":"minecraft:furnace"},{"data":1,"id":61,"name":"minecraft:furnace"},{"data":2,"id":61,"name":"minecraft:furnace"},{"data":3,"id":61,"name":"minecraft:furnace"},{"data":4,"id":61,"name":"minecraft:furnace"},{"data":5,"id":61,"name":"minecraft:furnace"},{"data":6,"id":61,"name":"minecraft:furnace"},{"data":7,"id":61,"name":"minecraft:furnace"},{"data":0,"id":62,"name":"minecraft:lit_furnace"},{"data":1,"id":62,"name":"minecraft:lit_furnace"},{"data":2,"id":62,"name":"minecraft:lit_furnace"},{"data":3,"id":62,"name":"minecraft:lit_furnace"},{"data":4,"id":62,"name":"minecraft:lit_furnace"},{"data":5,"id":62,"name":"minecraft:lit_furnace"},{"data":6,"id":62,"name":"minecraft:lit_furnace"},{"data":7,"id":62,"name":"minecraft:lit_furnace"},{"data":0,"id":63,"name":"minecraft:standing_sign"},{"data":1,"id":63,"name":"minecraft:standing_sign"},{"data":2,"id":63,"name":"minecraft:standing_sign"},{"data":3,"id":63,"name":"minecraft:standing_sign"},{"data":4,"id":63,"name":"minecraft:standing_sign"},{"data":5,"id":63,"name":"minecraft:standing_sign"},{"data":6,"id":63,"name":"minecraft:standing_sign"},{"data":7,"id":63,"name":"minecraft:standing_sign"},{"data":8,"id":63,"name":"minecraft:standing_sign"},{"data":9,"id":63,"name":"minecraft:standing_sign"},{"data":10,"id":63,"name":"minecraft:standing_sign"},{"data":11,"id":63,"name":"minecraft:standing_sign"},{"data":12,"id":63,"name":"minecraft:standing_sign"},{"data":13,"id":63,"name":"minecraft:standing_sign"},{"data":14,"id":63,"name":"minecraft:standing_sign"},{"data":15,"id":63,"name":"minecraft:standing_sign"},{"data":0,"id":64,"name":"minecraft:wooden_door"},{"data":1,"id":64,"name":"minecraft:wooden_door"},{"data":2,"id":64,"name":"minecraft:wooden_door"},{"data":3,"id":64,"name":"minecraft:wooden_door"},{"data":4,"id":64,"name":"minecraft:wooden_door"},{"data":5,"id":64,"name":"minecraft:wooden_door"},{"data":6,"id":64,"name":"minecraft:wooden_door"},{"data":7,"id":64,"name":"minecraft:wooden_door"},{"data":8,"id":64,"name":"minecraft:wooden_door"},{"data":9,"id":64,"name":"minecraft:wooden_door"},{"data":10,"id":64,"name":"minecraft:wooden_door"},{"data":11,"id":64,"name":"minecraft:wooden_door"},{"data":12,"id":64,"name":"minecraft:wooden_door"},{"data":13,"id":64,"name":"minecraft:wooden_door"},{"data":14,"id":64,"name":"minecraft:wooden_door"},{"data":15,"id":64,"name":"minecraft:wooden_door"},{"data":0,"id":65,"name":"minecraft:ladder"},{"data":1,"id":65,"name":"minecraft:ladder"},{"data":2,"id":65,"name":"minecraft:ladder"},{"data":3,"id":65,"name":"minecraft:ladder"},{"data":4,"id":65,"name":"minecraft:ladder"},{"data":5,"id":65,"name":"minecraft:ladder"},{"data":6,"id":65,"name":"minecraft:ladder"},{"data":7,"id":65,"name":"minecraft:ladder"},{"data":0,"id":66,"name":"minecraft:rail"},{"data":1,"id":66,"name":"minecraft:rail"},{"data":2,"id":66,"name":"minecraft:rail"},{"data":3,"id":66,"name":"minecraft:rail"},{"data":4,"id":66,"name":"minecraft:rail"},{"data":5,"id":66,"name":"minecraft:rail"},{"data":6,"id":66,"name":"minecraft:rail"},{"data":7,"id":66,"name":"minecraft:rail"},{"data":8,"id":66,"name":"minecraft:rail"},{"data":9,"id":66,"name":"minecraft:rail"},{"data":10,"id":66,"name":"minecraft:rail"},{"data":11,"id":66,"name":"minecraft:rail"},{"data":12,"id":66,"name":"minecraft:rail"},{"data":13,"id":66,"name":"minecraft:rail"},{"data":14,"id":66,"name":"minecraft:rail"},{"data":15,"id":66,"name":"minecraft:rail"},{"data":0,"id":67,"name":"minecraft:stone_stairs"},{"data":1,"id":67,"name":"minecraft:stone_stairs"},{"data":2,"id":67,"name":"minecraft:stone_stairs"},{"data":3,"id":67,"name":"minecraft:stone_stairs"},{"data":4,"id":67,"name":"minecraft:stone_stairs"},{"data":5,"id":67,"name":"minecraft:stone_stairs"},{"data":6,"id":67,"name":"minecraft:stone_stairs"},{"data":7,"id":67,"name":"minecraft:stone_stairs"},{"data":0,"id":68,"name":"minecraft:wall_sign"},{"data":1,"id":68,"name":"minecraft:wall_sign"},{"data":2,"id":68,"name":"minecraft:wall_sign"},{"data":3,"id":68,"name":"minecraft:wall_sign"},{"data":4,"id":68,"name":"minecraft:wall_sign"},{"data":5,"id":68,"name":"minecraft:wall_sign"},{"data":6,"id":68,"name":"minecraft:wall_sign"},{"data":7,"id":68,"name":"minecraft:wall_sign"},{"data":8,"id":68,"name":"minecraft:wall_sign"},{"data":9,"id":68,"name":"minecraft:wall_sign"},{"data":10,"id":68,"name":"minecraft:wall_sign"},{"data":11,"id":68,"name":"minecraft:wall_sign"},{"data":12,"id":68,"name":"minecraft:wall_sign"},{"data":13,"id":68,"name":"minecraft:wall_sign"},{"data":14,"id":68,"name":"minecraft:wall_sign"},{"data":15,"id":68,"name":"minecraft:wall_sign"},{"data":0,"id":69,"name":"minecraft:lever"},{"data":1,"id":69,"name":"minecraft:lever"},{"data":2,"id":69,"name":"minecraft:lever"},{"data":3,"id":69,"name":"minecraft:lever"},{"data":4,"id":69,"name":"minecraft:lever"},{"data":5,"id":69,"name":"minecraft:lever"},{"data":6,"id":69,"name":"minecraft:lever"},{"data":7,"id":69,"name":"minecraft:lever"},{"data":8,"id":69,"name":"minecraft:lever"},{"data":9,"id":69,"name":"minecraft:lever"},{"data":10,"id":69,"name":"minecraft:lever"},{"data":11,"id":69,"name":"minecraft:lever"},{"data":12,"id":69,"name":"minecraft:lever"},{"data":13,"id":69,"name":"minecraft:lever"},{"data":14,"id":69,"name":"minecraft:lever"},{"data":15,"id":69,"name":"minecraft:lever"},{"data":0,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":1,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":2,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":3,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":4,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":5,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":6,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":7,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":8,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":9,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":10,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":11,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":12,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":13,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":14,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":15,"id":70,"name":"minecraft:stone_pressure_plate"},{"data":0,"id":71,"name":"minecraft:iron_door"},{"data":1,"id":71,"name":"minecraft:iron_door"},{"data":2,"id":71,"name":"minecraft:iron_door"},{"data":3,"id":71,"name":"minecraft:iron_door"},{"data":4,"id":71,"name":"minecraft:iron_door"},{"data":5,"id":71,"name":"minecraft:iron_door"},{"data":6,"id":71,"name":"minecraft:iron_door"},{"data":7,"id":71,"name":"minecraft:iron_door"},{"data":8,"id":71,"name":"minecraft:iron_door"},{"data":9,"id":71,"name":"minecraft:iron_door"},{"data":10,"id":71,"name":"minecraft:iron_door"},{"data":11,"id":71,"name":"minecraft:iron_door"},{"data":12,"id":71,"name":"minecraft:iron_door"},{"data":13,"id":71,"name":"minecraft:iron_door"},{"data":14,"id":71,"name":"minecraft:iron_door"},{"data":15,"id":71,"name":"minecraft:iron_door"},{"data":0,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":1,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":2,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":3,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":4,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":5,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":6,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":7,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":8,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":9,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":10,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":11,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":12,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":13,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":14,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":15,"id":72,"name":"minecraft:wooden_pressure_plate"},{"data":0,"id":73,"name":"minecraft:redstone_ore"},{"data":0,"id":74,"name":"minecraft:lit_redstone_ore"},{"data":0,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":1,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":2,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":3,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":4,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":5,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":6,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":7,"id":75,"name":"minecraft:unlit_redstone_torch"},{"data":0,"id":76,"name":"minecraft:redstone_torch"},{"data":1,"id":76,"name":"minecraft:redstone_torch"},{"data":2,"id":76,"name":"minecraft:redstone_torch"},{"data":3,"id":76,"name":"minecraft:redstone_torch"},{"data":4,"id":76,"name":"minecraft:redstone_torch"},{"data":5,"id":76,"name":"minecraft:redstone_torch"},{"data":6,"id":76,"name":"minecraft:redstone_torch"},{"data":7,"id":76,"name":"minecraft:redstone_torch"},{"data":0,"id":77,"name":"minecraft:stone_button"},{"data":1,"id":77,"name":"minecraft:stone_button"},{"data":2,"id":77,"name":"minecraft:stone_button"},{"data":3,"id":77,"name":"minecraft:stone_button"},{"data":4,"id":77,"name":"minecraft:stone_button"},{"data":5,"id":77,"name":"minecraft:stone_button"},{"data":6,"id":77,"name":"minecraft:stone_button"},{"data":7,"id":77,"name":"minecraft:stone_button"},{"data":8,"id":77,"name":"minecraft:stone_button"},{"data":9,"id":77,"name":"minecraft:stone_button"},{"data":10,"id":77,"name":"minecraft:stone_button"},{"data":11,"id":77,"name":"minecraft:stone_button"},{"data":12,"id":77,"name":"minecraft:stone_button"},{"data":13,"id":77,"name":"minecraft:stone_button"},{"data":14,"id":77,"name":"minecraft:stone_button"},{"data":15,"id":77,"name":"minecraft:stone_button"},{"data":0,"id":78,"name":"minecraft:snow_layer"},{"data":1,"id":78,"name":"minecraft:snow_layer"},{"data":2,"id":78,"name":"minecraft:snow_layer"},{"data":3,"id":78,"name":"minecraft:snow_layer"},{"data":4,"id":78,"name":"minecraft:snow_layer"},{"data":5,"id":78,"name":"minecraft:snow_layer"},{"data":6,"id":78,"name":"minecraft:snow_layer"},{"data":7,"id":78,"name":"minecraft:snow_layer"},{"data":8,"id":78,"name":"minecraft:snow_layer"},{"data":9,"id":78,"name":"minecraft:snow_layer"},{"data":10,"id":78,"name":"minecraft:snow_layer"},{"data":11,"id":78,"name":"minecraft:snow_layer"},{"data":12,"id":78,"name":"minecraft:snow_layer"},{"data":13,"id":78,"name":"minecraft:snow_layer"},{"data":14,"id":78,"name":"minecraft:snow_layer"},{"data":15,"id":78,"name":"minecraft:snow_layer"},{"data":0,"id":79,"name":"minecraft:ice"},{"data":0,"id":80,"name":"minecraft:snow"},{"data":0,"id":81,"name":"minecraft:cactus"},{"data":1,"id":81,"name":"minecraft:cactus"},{"data":2,"id":81,"name":"minecraft:cactus"},{"data":3,"id":81,"name":"minecraft:cactus"},{"data":4,"id":81,"name":"minecraft:cactus"},{"data":5,"id":81,"name":"minecraft:cactus"},{"data":6,"id":81,"name":"minecraft:cactus"},{"data":7,"id":81,"name":"minecraft:cactus"},{"data":8,"id":81,"name":"minecraft:cactus"},{"data":9,"id":81,"name":"minecraft:cactus"},{"data":10,"id":81,"name":"minecraft:cactus"},{"data":11,"id":81,"name":"minecraft:cactus"},{"data":12,"id":81,"name":"minecraft:cactus"},{"data":13,"id":81,"name":"minecraft:cactus"},{"data":14,"id":81,"name":"minecraft:cactus"},{"data":15,"id":81,"name":"minecraft:cactus"},{"data":0,"id":82,"name":"minecraft:clay"},{"data":0,"id":83,"name":"minecraft:reeds"},{"data":1,"id":83,"name":"minecraft:reeds"},{"data":2,"id":83,"name":"minecraft:reeds"},{"data":3,"id":83,"name":"minecraft:reeds"},{"data":4,"id":83,"name":"minecraft:reeds"},{"data":5,"id":83,"name":"minecraft:reeds"},{"data":6,"id":83,"name":"minecraft:reeds"},{"data":7,"id":83,"name":"minecraft:reeds"},{"data":8,"id":83,"name":"minecraft:reeds"},{"data":9,"id":83,"name":"minecraft:reeds"},{"data":10,"id":83,"name":"minecraft:reeds"},{"data":11,"id":83,"name":"minecraft:reeds"},{"data":12,"id":83,"name":"minecraft:reeds"},{"data":13,"id":83,"name":"minecraft:reeds"},{"data":14,"id":83,"name":"minecraft:reeds"},{"data":15,"id":83,"name":"minecraft:reeds"},{"data":0,"id":84,"name":"minecraft:jukebox"},{"data":0,"id":85,"name":"minecraft:fence"},{"data":1,"id":85,"name":"minecraft:fence"},{"data":2,"id":85,"name":"minecraft:fence"},{"data":3,"id":85,"name":"minecraft:fence"},{"data":4,"id":85,"name":"minecraft:fence"},{"data":5,"id":85,"name":"minecraft:fence"},{"data":6,"id":85,"name":"minecraft:fence"},{"data":7,"id":85,"name":"minecraft:fence"},{"data":0,"id":86,"name":"minecraft:pumpkin"},{"data":1,"id":86,"name":"minecraft:pumpkin"},{"data":2,"id":86,"name":"minecraft:pumpkin"},{"data":3,"id":86,"name":"minecraft:pumpkin"},{"data":0,"id":87,"name":"minecraft:netherrack"},{"data":0,"id":88,"name":"minecraft:soul_sand"},{"data":0,"id":89,"name":"minecraft:glowstone"},{"data":0,"id":90,"name":"minecraft:portal"},{"data":1,"id":90,"name":"minecraft:portal"},{"data":2,"id":90,"name":"minecraft:portal"},{"data":3,"id":90,"name":"minecraft:portal"},{"data":0,"id":91,"name":"minecraft:lit_pumpkin"},{"data":1,"id":91,"name":"minecraft:lit_pumpkin"},{"data":2,"id":91,"name":"minecraft:lit_pumpkin"},{"data":3,"id":91,"name":"minecraft:lit_pumpkin"},{"data":0,"id":92,"name":"minecraft:cake"},{"data":1,"id":92,"name":"minecraft:cake"},{"data":2,"id":92,"name":"minecraft:cake"},{"data":3,"id":92,"name":"minecraft:cake"},{"data":4,"id":92,"name":"minecraft:cake"},{"data":5,"id":92,"name":"minecraft:cake"},{"data":6,"id":92,"name":"minecraft:cake"},{"data":7,"id":92,"name":"minecraft:cake"},{"data":0,"id":93,"name":"minecraft:unpowered_repeater"},{"data":1,"id":93,"name":"minecraft:unpowered_repeater"},{"data":2,"id":93,"name":"minecraft:unpowered_repeater"},{"data":3,"id":93,"name":"minecraft:unpowered_repeater"},{"data":4,"id":93,"name":"minecraft:unpowered_repeater"},{"data":5,"id":93,"name":"minecraft:unpowered_repeater"},{"data":6,"id":93,"name":"minecraft:unpowered_repeater"},{"data":7,"id":93,"name":"minecraft:unpowered_repeater"},{"data":8,"id":93,"name":"minecraft:unpowered_repeater"},{"data":9,"id":93,"name":"minecraft:unpowered_repeater"},{"data":10,"id":93,"name":"minecraft:unpowered_repeater"},{"data":11,"id":93,"name":"minecraft:unpowered_repeater"},{"data":12,"id":93,"name":"minecraft:unpowered_repeater"},{"data":13,"id":93,"name":"minecraft:unpowered_repeater"},{"data":14,"id":93,"name":"minecraft:unpowered_repeater"},{"data":15,"id":93,"name":"minecraft:unpowered_repeater"},{"data":0,"id":94,"name":"minecraft:powered_repeater"},{"data":1,"id":94,"name":"minecraft:powered_repeater"},{"data":2,"id":94,"name":"minecraft:powered_repeater"},{"data":3,"id":94,"name":"minecraft:powered_repeater"},{"data":4,"id":94,"name":"minecraft:powered_repeater"},{"data":5,"id":94,"name":"minecraft:powered_repeater"},{"data":6,"id":94,"name":"minecraft:powered_repeater"},{"data":7,"id":94,"name":"minecraft:powered_repeater"},{"data":8,"id":94,"name":"minecraft:powered_repeater"},{"data":9,"id":94,"name":"minecraft:powered_repeater"},{"data":10,"id":94,"name":"minecraft:powered_repeater"},{"data":11,"id":94,"name":"minecraft:powered_repeater"},{"data":12,"id":94,"name":"minecraft:powered_repeater"},{"data":13,"id":94,"name":"minecraft:powered_repeater"},{"data":14,"id":94,"name":"minecraft:powered_repeater"},{"data":15,"id":94,"name":"minecraft:powered_repeater"},{"data":0,"id":95,"name":"minecraft:invisibleBedrock"},{"data":0,"id":96,"name":"minecraft:trapdoor"},{"data":1,"id":96,"name":"minecraft:trapdoor"},{"data":2,"id":96,"name":"minecraft:trapdoor"},{"data":3,"id":96,"name":"minecraft:trapdoor"},{"data":4,"id":96,"name":"minecraft:trapdoor"},{"data":5,"id":96,"name":"minecraft:trapdoor"},{"data":6,"id":96,"name":"minecraft:trapdoor"},{"data":7,"id":96,"name":"minecraft:trapdoor"},{"data":8,"id":96,"name":"minecraft:trapdoor"},{"data":9,"id":96,"name":"minecraft:trapdoor"},{"data":10,"id":96,"name":"minecraft:trapdoor"},{"data":11,"id":96,"name":"minecraft:trapdoor"},{"data":12,"id":96,"name":"minecraft:trapdoor"},{"data":13,"id":96,"name":"minecraft:trapdoor"},{"data":14,"id":96,"name":"minecraft:trapdoor"},{"data":15,"id":96,"name":"minecraft:trapdoor"},{"data":0,"id":97,"name":"minecraft:monster_egg"},{"data":1,"id":97,"name":"minecraft:monster_egg"},{"data":2,"id":97,"name":"minecraft:monster_egg"},{"data":3,"id":97,"name":"minecraft:monster_egg"},{"data":4,"id":97,"name":"minecraft:monster_egg"},{"data":5,"id":97,"name":"minecraft:monster_egg"},{"data":6,"id":97,"name":"minecraft:monster_egg"},{"data":7,"id":97,"name":"minecraft:monster_egg"},{"data":0,"id":98,"name":"minecraft:stonebrick"},{"data":1,"id":98,"name":"minecraft:stonebrick"},{"data":2,"id":98,"name":"minecraft:stonebrick"},{"data":3,"id":98,"name":"minecraft:stonebrick"},{"data":4,"id":98,"name":"minecraft:stonebrick"},{"data":5,"id":98,"name":"minecraft:stonebrick"},{"data":6,"id":98,"name":"minecraft:stonebrick"},{"data":7,"id":98,"name":"minecraft:stonebrick"},{"data":0,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":1,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":2,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":3,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":4,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":5,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":6,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":7,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":8,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":9,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":10,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":11,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":12,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":13,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":14,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":15,"id":99,"name":"minecraft:brown_mushroom_block"},{"data":0,"id":100,"name":"minecraft:red_mushroom_block"},{"data":1,"id":100,"name":"minecraft:red_mushroom_block"},{"data":2,"id":100,"name":"minecraft:red_mushroom_block"},{"data":3,"id":100,"name":"minecraft:red_mushroom_block"},{"data":4,"id":100,"name":"minecraft:red_mushroom_block"},{"data":5,"id":100,"name":"minecraft:red_mushroom_block"},{"data":6,"id":100,"name":"minecraft:red_mushroom_block"},{"data":7,"id":100,"name":"minecraft:red_mushroom_block"},{"data":8,"id":100,"name":"minecraft:red_mushroom_block"},{"data":9,"id":100,"name":"minecraft:red_mushroom_block"},{"data":10,"id":100,"name":"minecraft:red_mushroom_block"},{"data":11,"id":100,"name":"minecraft:red_mushroom_block"},{"data":12,"id":100,"name":"minecraft:red_mushroom_block"},{"data":13,"id":100,"name":"minecraft:red_mushroom_block"},{"data":14,"id":100,"name":"minecraft:red_mushroom_block"},{"data":15,"id":100,"name":"minecraft:red_mushroom_block"},{"data":0,"id":101,"name":"minecraft:iron_bars"},{"data":0,"id":102,"name":"minecraft:glass_pane"},{"data":0,"id":103,"name":"minecraft:melon_block"},{"data":0,"id":104,"name":"minecraft:pumpkin_stem"},{"data":1,"id":104,"name":"minecraft:pumpkin_stem"},{"data":2,"id":104,"name":"minecraft:pumpkin_stem"},{"data":3,"id":104,"name":"minecraft:pumpkin_stem"},{"data":4,"id":104,"name":"minecraft:pumpkin_stem"},{"data":5,"id":104,"name":"minecraft:pumpkin_stem"},{"data":6,"id":104,"name":"minecraft:pumpkin_stem"},{"data":7,"id":104,"name":"minecraft:pumpkin_stem"},{"data":0,"id":105,"name":"minecraft:melon_stem"},{"data":1,"id":105,"name":"minecraft:melon_stem"},{"data":2,"id":105,"name":"minecraft:melon_stem"},{"data":3,"id":105,"name":"minecraft:melon_stem"},{"data":4,"id":105,"name":"minecraft:melon_stem"},{"data":5,"id":105,"name":"minecraft:melon_stem"},{"data":6,"id":105,"name":"minecraft:melon_stem"},{"data":7,"id":105,"name":"minecraft:melon_stem"},{"data":0,"id":106,"name":"minecraft:vine"},{"data":1,"id":106,"name":"minecraft:vine"},{"data":2,"id":106,"name":"minecraft:vine"},{"data":3,"id":106,"name":"minecraft:vine"},{"data":4,"id":106,"name":"minecraft:vine"},{"data":5,"id":106,"name":"minecraft:vine"},{"data":6,"id":106,"name":"minecraft:vine"},{"data":7,"id":106,"name":"minecraft:vine"},{"data":8,"id":106,"name":"minecraft:vine"},{"data":9,"id":106,"name":"minecraft:vine"},{"data":10,"id":106,"name":"minecraft:vine"},{"data":11,"id":106,"name":"minecraft:vine"},{"data":12,"id":106,"name":"minecraft:vine"},{"data":13,"id":106,"name":"minecraft:vine"},{"data":14,"id":106,"name":"minecraft:vine"},{"data":15,"id":106,"name":"minecraft:vine"},{"data":0,"id":107,"name":"minecraft:fence_gate"},{"data":1,"id":107,"name":"minecraft:fence_gate"},{"data":2,"id":107,"name":"minecraft:fence_gate"},{"data":3,"id":107,"name":"minecraft:fence_gate"},{"data":4,"id":107,"name":"minecraft:fence_gate"},{"data":5,"id":107,"name":"minecraft:fence_gate"},{"data":6,"id":107,"name":"minecraft:fence_gate"},{"data":7,"id":107,"name":"minecraft:fence_gate"},{"data":8,"id":107,"name":"minecraft:fence_gate"},{"data":9,"id":107,"name":"minecraft:fence_gate"},{"data":10,"id":107,"name":"minecraft:fence_gate"},{"data":11,"id":107,"name":"minecraft:fence_gate"},{"data":12,"id":107,"name":"minecraft:fence_gate"},{"data":13,"id":107,"name":"minecraft:fence_gate"},{"data":14,"id":107,"name":"minecraft:fence_gate"},{"data":15,"id":107,"name":"minecraft:fence_gate"},{"data":0,"id":108,"name":"minecraft:brick_stairs"},{"data":1,"id":108,"name":"minecraft:brick_stairs"},{"data":2,"id":108,"name":"minecraft:brick_stairs"},{"data":3,"id":108,"name":"minecraft:brick_stairs"},{"data":4,"id":108,"name":"minecraft:brick_stairs"},{"data":5,"id":108,"name":"minecraft:brick_stairs"},{"data":6,"id":108,"name":"minecraft:brick_stairs"},{"data":7,"id":108,"name":"minecraft:brick_stairs"},{"data":0,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":1,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":2,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":3,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":4,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":5,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":6,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":7,"id":109,"name":"minecraft:stone_brick_stairs"},{"data":0,"id":110,"name":"minecraft:mycelium"},{"data":0,"id":111,"name":"minecraft:waterlily"},{"data":0,"id":112,"name":"minecraft:nether_brick"},{"data":0,"id":113,"name":"minecraft:nether_brick_fence"},{"data":1,"id":113,"name":"minecraft:nether_brick_fence"},{"data":2,"id":113,"name":"minecraft:nether_brick_fence"},{"data":3,"id":113,"name":"minecraft:nether_brick_fence"},{"data":4,"id":113,"name":"minecraft:nether_brick_fence"},{"data":5,"id":113,"name":"minecraft:nether_brick_fence"},{"data":6,"id":113,"name":"minecraft:nether_brick_fence"},{"data":7,"id":113,"name":"minecraft:nether_brick_fence"},{"data":0,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":1,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":2,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":3,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":4,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":5,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":6,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":7,"id":114,"name":"minecraft:nether_brick_stairs"},{"data":0,"id":115,"name":"minecraft:nether_wart"},{"data":1,"id":115,"name":"minecraft:nether_wart"},{"data":2,"id":115,"name":"minecraft:nether_wart"},{"data":3,"id":115,"name":"minecraft:nether_wart"},{"data":0,"id":116,"name":"minecraft:enchanting_table"},{"data":0,"id":117,"name":"minecraft:brewing_stand"},{"data":1,"id":117,"name":"minecraft:brewing_stand"},{"data":2,"id":117,"name":"minecraft:brewing_stand"},{"data":3,"id":117,"name":"minecraft:brewing_stand"},{"data":4,"id":117,"name":"minecraft:brewing_stand"},{"data":5,"id":117,"name":"minecraft:brewing_stand"},{"data":6,"id":117,"name":"minecraft:brewing_stand"},{"data":7,"id":117,"name":"minecraft:brewing_stand"},{"data":0,"id":118,"name":"minecraft:cauldron"},{"data":1,"id":118,"name":"minecraft:cauldron"},{"data":2,"id":118,"name":"minecraft:cauldron"},{"data":3,"id":118,"name":"minecraft:cauldron"},{"data":4,"id":118,"name":"minecraft:cauldron"},{"data":5,"id":118,"name":"minecraft:cauldron"},{"data":6,"id":118,"name":"minecraft:cauldron"},{"data":7,"id":118,"name":"minecraft:cauldron"},{"data":8,"id":118,"name":"minecraft:cauldron"},{"data":9,"id":118,"name":"minecraft:cauldron"},{"data":10,"id":118,"name":"minecraft:cauldron"},{"data":11,"id":118,"name":"minecraft:cauldron"},{"data":12,"id":118,"name":"minecraft:cauldron"},{"data":13,"id":118,"name":"minecraft:cauldron"},{"data":14,"id":118,"name":"minecraft:cauldron"},{"data":15,"id":118,"name":"minecraft:cauldron"},{"data":0,"id":119,"name":"minecraft:end_portal"},{"data":0,"id":120,"name":"minecraft:end_portal_frame"},{"data":1,"id":120,"name":"minecraft:end_portal_frame"},{"data":2,"id":120,"name":"minecraft:end_portal_frame"},{"data":3,"id":120,"name":"minecraft:end_portal_frame"},{"data":4,"id":120,"name":"minecraft:end_portal_frame"},{"data":5,"id":120,"name":"minecraft:end_portal_frame"},{"data":6,"id":120,"name":"minecraft:end_portal_frame"},{"data":7,"id":120,"name":"minecraft:end_portal_frame"},{"data":0,"id":121,"name":"minecraft:end_stone"},{"data":0,"id":122,"name":"minecraft:dragon_egg"},{"data":0,"id":123,"name":"minecraft:redstone_lamp"},{"data":0,"id":124,"name":"minecraft:lit_redstone_lamp"},{"data":0,"id":125,"name":"minecraft:dropper"},{"data":1,"id":125,"name":"minecraft:dropper"},{"data":2,"id":125,"name":"minecraft:dropper"},{"data":3,"id":125,"name":"minecraft:dropper"},{"data":4,"id":125,"name":"minecraft:dropper"},{"data":5,"id":125,"name":"minecraft:dropper"},{"data":6,"id":125,"name":"minecraft:dropper"},{"data":7,"id":125,"name":"minecraft:dropper"},{"data":8,"id":125,"name":"minecraft:dropper"},{"data":9,"id":125,"name":"minecraft:dropper"},{"data":10,"id":125,"name":"minecraft:dropper"},{"data":11,"id":125,"name":"minecraft:dropper"},{"data":12,"id":125,"name":"minecraft:dropper"},{"data":13,"id":125,"name":"minecraft:dropper"},{"data":14,"id":125,"name":"minecraft:dropper"},{"data":15,"id":125,"name":"minecraft:dropper"},{"data":0,"id":126,"name":"minecraft:activator_rail"},{"data":1,"id":126,"name":"minecraft:activator_rail"},{"data":2,"id":126,"name":"minecraft:activator_rail"},{"data":3,"id":126,"name":"minecraft:activator_rail"},{"data":4,"id":126,"name":"minecraft:activator_rail"},{"data":5,"id":126,"name":"minecraft:activator_rail"},{"data":6,"id":126,"name":"minecraft:activator_rail"},{"data":7,"id":126,"name":"minecraft:activator_rail"},{"data":8,"id":126,"name":"minecraft:activator_rail"},{"data":9,"id":126,"name":"minecraft:activator_rail"},{"data":10,"id":126,"name":"minecraft:activator_rail"},{"data":11,"id":126,"name":"minecraft:activator_rail"},{"data":12,"id":126,"name":"minecraft:activator_rail"},{"data":13,"id":126,"name":"minecraft:activator_rail"},{"data":14,"id":126,"name":"minecraft:activator_rail"},{"data":15,"id":126,"name":"minecraft:activator_rail"},{"data":0,"id":127,"name":"minecraft:cocoa"},{"data":1,"id":127,"name":"minecraft:cocoa"},{"data":2,"id":127,"name":"minecraft:cocoa"},{"data":3,"id":127,"name":"minecraft:cocoa"},{"data":4,"id":127,"name":"minecraft:cocoa"},{"data":5,"id":127,"name":"minecraft:cocoa"},{"data":6,"id":127,"name":"minecraft:cocoa"},{"data":7,"id":127,"name":"minecraft:cocoa"},{"data":8,"id":127,"name":"minecraft:cocoa"},{"data":9,"id":127,"name":"minecraft:cocoa"},{"data":10,"id":127,"name":"minecraft:cocoa"},{"data":11,"id":127,"name":"minecraft:cocoa"},{"data":12,"id":127,"name":"minecraft:cocoa"},{"data":13,"id":127,"name":"minecraft:cocoa"},{"data":14,"id":127,"name":"minecraft:cocoa"},{"data":15,"id":127,"name":"minecraft:cocoa"},{"data":0,"id":128,"name":"minecraft:sandstone_stairs"},{"data":1,"id":128,"name":"minecraft:sandstone_stairs"},{"data":2,"id":128,"name":"minecraft:sandstone_stairs"},{"data":3,"id":128,"name":"minecraft:sandstone_stairs"},{"data":4,"id":128,"name":"minecraft:sandstone_stairs"},{"data":5,"id":128,"name":"minecraft:sandstone_stairs"},{"data":6,"id":128,"name":"minecraft:sandstone_stairs"},{"data":7,"id":128,"name":"minecraft:sandstone_stairs"},{"data":0,"id":129,"name":"minecraft:emerald_ore"},{"data":0,"id":130,"name":"minecraft:ender_chest"},{"data":1,"id":130,"name":"minecraft:ender_chest"},{"data":2,"id":130,"name":"minecraft:ender_chest"},{"data":3,"id":130,"name":"minecraft:ender_chest"},{"data":4,"id":130,"name":"minecraft:ender_chest"},{"data":5,"id":130,"name":"minecraft:ender_chest"},{"data":6,"id":130,"name":"minecraft:ender_chest"},{"data":7,"id":130,"name":"minecraft:ender_chest"},{"data":0,"id":131,"name":"minecraft:tripwire_hook"},{"data":1,"id":131,"name":"minecraft:tripwire_hook"},{"data":2,"id":131,"name":"minecraft:tripwire_hook"},{"data":3,"id":131,"name":"minecraft:tripwire_hook"},{"data":4,"id":131,"name":"minecraft:tripwire_hook"},{"data":5,"id":131,"name":"minecraft:tripwire_hook"},{"data":6,"id":131,"name":"minecraft:tripwire_hook"},{"data":7,"id":131,"name":"minecraft:tripwire_hook"},{"data":8,"id":131,"name":"minecraft:tripwire_hook"},{"data":9,"id":131,"name":"minecraft:tripwire_hook"},{"data":10,"id":131,"name":"minecraft:tripwire_hook"},{"data":11,"id":131,"name":"minecraft:tripwire_hook"},{"data":12,"id":131,"name":"minecraft:tripwire_hook"},{"data":13,"id":131,"name":"minecraft:tripwire_hook"},{"data":14,"id":131,"name":"minecraft:tripwire_hook"},{"data":15,"id":131,"name":"minecraft:tripwire_hook"},{"data":0,"id":132,"name":"minecraft:tripWire"},{"data":1,"id":132,"name":"minecraft:tripWire"},{"data":2,"id":132,"name":"minecraft:tripWire"},{"data":3,"id":132,"name":"minecraft:tripWire"},{"data":4,"id":132,"name":"minecraft:tripWire"},{"data":5,"id":132,"name":"minecraft:tripWire"},{"data":6,"id":132,"name":"minecraft:tripWire"},{"data":7,"id":132,"name":"minecraft:tripWire"},{"data":8,"id":132,"name":"minecraft:tripWire"},{"data":9,"id":132,"name":"minecraft:tripWire"},{"data":10,"id":132,"name":"minecraft:tripWire"},{"data":11,"id":132,"name":"minecraft:tripWire"},{"data":12,"id":132,"name":"minecraft:tripWire"},{"data":13,"id":132,"name":"minecraft:tripWire"},{"data":14,"id":132,"name":"minecraft:tripWire"},{"data":15,"id":132,"name":"minecraft:tripWire"},{"data":0,"id":133,"name":"minecraft:emerald_block"},{"data":0,"id":134,"name":"minecraft:spruce_stairs"},{"data":1,"id":134,"name":"minecraft:spruce_stairs"},{"data":2,"id":134,"name":"minecraft:spruce_stairs"},{"data":3,"id":134,"name":"minecraft:spruce_stairs"},{"data":4,"id":134,"name":"minecraft:spruce_stairs"},{"data":5,"id":134,"name":"minecraft:spruce_stairs"},{"data":6,"id":134,"name":"minecraft:spruce_stairs"},{"data":7,"id":134,"name":"minecraft:spruce_stairs"},{"data":0,"id":135,"name":"minecraft:birch_stairs"},{"data":1,"id":135,"name":"minecraft:birch_stairs"},{"data":2,"id":135,"name":"minecraft:birch_stairs"},{"data":3,"id":135,"name":"minecraft:birch_stairs"},{"data":4,"id":135,"name":"minecraft:birch_stairs"},{"data":5,"id":135,"name":"minecraft:birch_stairs"},{"data":6,"id":135,"name":"minecraft:birch_stairs"},{"data":7,"id":135,"name":"minecraft:birch_stairs"},{"data":0,"id":136,"name":"minecraft:jungle_stairs"},{"data":1,"id":136,"name":"minecraft:jungle_stairs"},{"data":2,"id":136,"name":"minecraft:jungle_stairs"},{"data":3,"id":136,"name":"minecraft:jungle_stairs"},{"data":4,"id":136,"name":"minecraft:jungle_stairs"},{"data":5,"id":136,"name":"minecraft:jungle_stairs"},{"data":6,"id":136,"name":"minecraft:jungle_stairs"},{"data":7,"id":136,"name":"minecraft:jungle_stairs"},{"data":0,"id":137,"name":"minecraft:command_block"},{"data":1,"id":137,"name":"minecraft:command_block"},{"data":2,"id":137,"name":"minecraft:command_block"},{"data":3,"id":137,"name":"minecraft:command_block"},{"data":4,"id":137,"name":"minecraft:command_block"},{"data":5,"id":137,"name":"minecraft:command_block"},{"data":6,"id":137,"name":"minecraft:command_block"},{"data":7,"id":137,"name":"minecraft:command_block"},{"data":8,"id":137,"name":"minecraft:command_block"},{"data":9,"id":137,"name":"minecraft:command_block"},{"data":10,"id":137,"name":"minecraft:command_block"},{"data":11,"id":137,"name":"minecraft:command_block"},{"data":12,"id":137,"name":"minecraft:command_block"},{"data":13,"id":137,"name":"minecraft:command_block"},{"data":14,"id":137,"name":"minecraft:command_block"},{"data":15,"id":137,"name":"minecraft:command_block"},{"data":0,"id":138,"name":"minecraft:beacon"},{"data":0,"id":139,"name":"minecraft:cobblestone_wall"},{"data":1,"id":139,"name":"minecraft:cobblestone_wall"},{"data":2,"id":139,"name":"minecraft:cobblestone_wall"},{"data":3,"id":139,"name":"minecraft:cobblestone_wall"},{"data":4,"id":139,"name":"minecraft:cobblestone_wall"},{"data":5,"id":139,"name":"minecraft:cobblestone_wall"},{"data":6,"id":139,"name":"minecraft:cobblestone_wall"},{"data":7,"id":139,"name":"minecraft:cobblestone_wall"},{"data":8,"id":139,"name":"minecraft:cobblestone_wall"},{"data":9,"id":139,"name":"minecraft:cobblestone_wall"},{"data":10,"id":139,"name":"minecraft:cobblestone_wall"},{"data":11,"id":139,"name":"minecraft:cobblestone_wall"},{"data":12,"id":139,"name":"minecraft:cobblestone_wall"},{"data":13,"id":139,"name":"minecraft:cobblestone_wall"},{"data":14,"id":139,"name":"minecraft:cobblestone_wall"},{"data":15,"id":139,"name":"minecraft:cobblestone_wall"},{"data":0,"id":140,"name":"minecraft:flower_pot"},{"data":1,"id":140,"name":"minecraft:flower_pot"},{"data":0,"id":141,"name":"minecraft:carrots"},{"data":1,"id":141,"name":"minecraft:carrots"},{"data":2,"id":141,"name":"minecraft:carrots"},{"data":3,"id":141,"name":"minecraft:carrots"},{"data":4,"id":141,"name":"minecraft:carrots"},{"data":5,"id":141,"name":"minecraft:carrots"},{"data":6,"id":141,"name":"minecraft:carrots"},{"data":7,"id":141,"name":"minecraft:carrots"},{"data":0,"id":142,"name":"minecraft:potatoes"},{"data":1,"id":142,"name":"minecraft:potatoes"},{"data":2,"id":142,"name":"minecraft:potatoes"},{"data":3,"id":142,"name":"minecraft:potatoes"},{"data":4,"id":142,"name":"minecraft:potatoes"},{"data":5,"id":142,"name":"minecraft:potatoes"},{"data":6,"id":142,"name":"minecraft:potatoes"},{"data":7,"id":142,"name":"minecraft:potatoes"},{"data":0,"id":143,"name":"minecraft:wooden_button"},{"data":1,"id":143,"name":"minecraft:wooden_button"},{"data":2,"id":143,"name":"minecraft:wooden_button"},{"data":3,"id":143,"name":"minecraft:wooden_button"},{"data":4,"id":143,"name":"minecraft:wooden_button"},{"data":5,"id":143,"name":"minecraft:wooden_button"},{"data":6,"id":143,"name":"minecraft:wooden_button"},{"data":7,"id":143,"name":"minecraft:wooden_button"},{"data":8,"id":143,"name":"minecraft:wooden_button"},{"data":9,"id":143,"name":"minecraft:wooden_button"},{"data":10,"id":143,"name":"minecraft:wooden_button"},{"data":11,"id":143,"name":"minecraft:wooden_button"},{"data":12,"id":143,"name":"minecraft:wooden_button"},{"data":13,"id":143,"name":"minecraft:wooden_button"},{"data":14,"id":143,"name":"minecraft:wooden_button"},{"data":15,"id":143,"name":"minecraft:wooden_button"},{"data":0,"id":144,"name":"minecraft:skull"},{"data":1,"id":144,"name":"minecraft:skull"},{"data":2,"id":144,"name":"minecraft:skull"},{"data":3,"id":144,"name":"minecraft:skull"},{"data":4,"id":144,"name":"minecraft:skull"},{"data":5,"id":144,"name":"minecraft:skull"},{"data":6,"id":144,"name":"minecraft:skull"},{"data":7,"id":144,"name":"minecraft:skull"},{"data":8,"id":144,"name":"minecraft:skull"},{"data":9,"id":144,"name":"minecraft:skull"},{"data":10,"id":144,"name":"minecraft:skull"},{"data":11,"id":144,"name":"minecraft:skull"},{"data":12,"id":144,"name":"minecraft:skull"},{"data":13,"id":144,"name":"minecraft:skull"},{"data":14,"id":144,"name":"minecraft:skull"},{"data":15,"id":144,"name":"minecraft:skull"},{"data":0,"id":145,"name":"minecraft:anvil"},{"data":1,"id":145,"name":"minecraft:anvil"},{"data":2,"id":145,"name":"minecraft:anvil"},{"data":3,"id":145,"name":"minecraft:anvil"},{"data":4,"id":145,"name":"minecraft:anvil"},{"data":5,"id":145,"name":"minecraft:anvil"},{"data":6,"id":145,"name":"minecraft:anvil"},{"data":7,"id":145,"name":"minecraft:anvil"},{"data":8,"id":145,"name":"minecraft:anvil"},{"data":9,"id":145,"name":"minecraft:anvil"},{"data":10,"id":145,"name":"minecraft:anvil"},{"data":11,"id":145,"name":"minecraft:anvil"},{"data":12,"id":145,"name":"minecraft:anvil"},{"data":13,"id":145,"name":"minecraft:anvil"},{"data":14,"id":145,"name":"minecraft:anvil"},{"data":15,"id":145,"name":"minecraft:anvil"},{"data":0,"id":146,"name":"minecraft:trapped_chest"},{"data":1,"id":146,"name":"minecraft:trapped_chest"},{"data":2,"id":146,"name":"minecraft:trapped_chest"},{"data":3,"id":146,"name":"minecraft:trapped_chest"},{"data":4,"id":146,"name":"minecraft:trapped_chest"},{"data":5,"id":146,"name":"minecraft:trapped_chest"},{"data":6,"id":146,"name":"minecraft:trapped_chest"},{"data":7,"id":146,"name":"minecraft:trapped_chest"},{"data":0,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":1,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":2,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":3,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":4,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":5,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":6,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":7,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":8,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":9,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":10,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":11,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":12,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":13,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":14,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":15,"id":147,"name":"minecraft:light_weighted_pressure_plate"},{"data":0,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":1,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":2,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":3,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":4,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":5,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":6,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":7,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":8,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":9,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":10,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":11,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":12,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":13,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":14,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":15,"id":148,"name":"minecraft:heavy_weighted_pressure_plate"},{"data":0,"id":149,"name":"minecraft:unpowered_comparator"},{"data":1,"id":149,"name":"minecraft:unpowered_comparator"},{"data":2,"id":149,"name":"minecraft:unpowered_comparator"},{"data":3,"id":149,"name":"minecraft:unpowered_comparator"},{"data":4,"id":149,"name":"minecraft:unpowered_comparator"},{"data":5,"id":149,"name":"minecraft:unpowered_comparator"},{"data":6,"id":149,"name":"minecraft:unpowered_comparator"},{"data":7,"id":149,"name":"minecraft:unpowered_comparator"},{"data":8,"id":149,"name":"minecraft:unpowered_comparator"},{"data":9,"id":149,"name":"minecraft:unpowered_comparator"},{"data":10,"id":149,"name":"minecraft:unpowered_comparator"},{"data":11,"id":149,"name":"minecraft:unpowered_comparator"},{"data":12,"id":149,"name":"minecraft:unpowered_comparator"},{"data":13,"id":149,"name":"minecraft:unpowered_comparator"},{"data":14,"id":149,"name":"minecraft:unpowered_comparator"},{"data":15,"id":149,"name":"minecraft:unpowered_comparator"},{"data":0,"id":150,"name":"minecraft:powered_comparator"},{"data":1,"id":150,"name":"minecraft:powered_comparator"},{"data":2,"id":150,"name":"minecraft:powered_comparator"},{"data":3,"id":150,"name":"minecraft:powered_comparator"},{"data":4,"id":150,"name":"minecraft:powered_comparator"},{"data":5,"id":150,"name":"minecraft:powered_comparator"},{"data":6,"id":150,"name":"minecraft:powered_comparator"},{"data":7,"id":150,"name":"minecraft:powered_comparator"},{"data":8,"id":150,"name":"minecraft:powered_comparator"},{"data":9,"id":150,"name":"minecraft:powered_comparator"},{"data":10,"id":150,"name":"minecraft:powered_comparator"},{"data":11,"id":150,"name":"minecraft:powered_comparator"},{"data":12,"id":150,"name":"minecraft:powered_comparator"},{"data":13,"id":150,"name":"minecraft:powered_comparator"},{"data":14,"id":150,"name":"minecraft:powered_comparator"},{"data":15,"id":150,"name":"minecraft:powered_comparator"},{"data":0,"id":151,"name":"minecraft:daylight_detector"},{"data":1,"id":151,"name":"minecraft:daylight_detector"},{"data":2,"id":151,"name":"minecraft:daylight_detector"},{"data":3,"id":151,"name":"minecraft:daylight_detector"},{"data":4,"id":151,"name":"minecraft:daylight_detector"},{"data":5,"id":151,"name":"minecraft:daylight_detector"},{"data":6,"id":151,"name":"minecraft:daylight_detector"},{"data":7,"id":151,"name":"minecraft:daylight_detector"},{"data":8,"id":151,"name":"minecraft:daylight_detector"},{"data":9,"id":151,"name":"minecraft:daylight_detector"},{"data":10,"id":151,"name":"minecraft:daylight_detector"},{"data":11,"id":151,"name":"minecraft:daylight_detector"},{"data":12,"id":151,"name":"minecraft:daylight_detector"},{"data":13,"id":151,"name":"minecraft:daylight_detector"},{"data":14,"id":151,"name":"minecraft:daylight_detector"},{"data":15,"id":151,"name":"minecraft:daylight_detector"},{"data":0,"id":152,"name":"minecraft:redstone_block"},{"data":0,"id":153,"name":"minecraft:quartz_ore"},{"data":0,"id":154,"name":"minecraft:hopper"},{"data":1,"id":154,"name":"minecraft:hopper"},{"data":2,"id":154,"name":"minecraft:hopper"},{"data":3,"id":154,"name":"minecraft:hopper"},{"data":4,"id":154,"name":"minecraft:hopper"},{"data":5,"id":154,"name":"minecraft:hopper"},{"data":6,"id":154,"name":"minecraft:hopper"},{"data":7,"id":154,"name":"minecraft:hopper"},{"data":8,"id":154,"name":"minecraft:hopper"},{"data":9,"id":154,"name":"minecraft:hopper"},{"data":10,"id":154,"name":"minecraft:hopper"},{"data":11,"id":154,"name":"minecraft:hopper"},{"data":12,"id":154,"name":"minecraft:hopper"},{"data":13,"id":154,"name":"minecraft:hopper"},{"data":14,"id":154,"name":"minecraft:hopper"},{"data":15,"id":154,"name":"minecraft:hopper"},{"data":0,"id":155,"name":"minecraft:quartz_block"},{"data":1,"id":155,"name":"minecraft:quartz_block"},{"data":2,"id":155,"name":"minecraft:quartz_block"},{"data":3,"id":155,"name":"minecraft:quartz_block"},{"data":4,"id":155,"name":"minecraft:quartz_block"},{"data":5,"id":155,"name":"minecraft:quartz_block"},{"data":6,"id":155,"name":"minecraft:quartz_block"},{"data":7,"id":155,"name":"minecraft:quartz_block"},{"data":8,"id":155,"name":"minecraft:quartz_block"},{"data":9,"id":155,"name":"minecraft:quartz_block"},{"data":10,"id":155,"name":"minecraft:quartz_block"},{"data":11,"id":155,"name":"minecraft:quartz_block"},{"data":12,"id":155,"name":"minecraft:quartz_block"},{"data":13,"id":155,"name":"minecraft:quartz_block"},{"data":14,"id":155,"name":"minecraft:quartz_block"},{"data":15,"id":155,"name":"minecraft:quartz_block"},{"data":0,"id":156,"name":"minecraft:quartz_stairs"},{"data":1,"id":156,"name":"minecraft:quartz_stairs"},{"data":2,"id":156,"name":"minecraft:quartz_stairs"},{"data":3,"id":156,"name":"minecraft:quartz_stairs"},{"data":4,"id":156,"name":"minecraft:quartz_stairs"},{"data":5,"id":156,"name":"minecraft:quartz_stairs"},{"data":6,"id":156,"name":"minecraft:quartz_stairs"},{"data":7,"id":156,"name":"minecraft:quartz_stairs"},{"data":0,"id":157,"name":"minecraft:double_wooden_slab"},{"data":1,"id":157,"name":"minecraft:double_wooden_slab"},{"data":2,"id":157,"name":"minecraft:double_wooden_slab"},{"data":3,"id":157,"name":"minecraft:double_wooden_slab"},{"data":4,"id":157,"name":"minecraft:double_wooden_slab"},{"data":5,"id":157,"name":"minecraft:double_wooden_slab"},{"data":6,"id":157,"name":"minecraft:double_wooden_slab"},{"data":7,"id":157,"name":"minecraft:double_wooden_slab"},{"data":8,"id":157,"name":"minecraft:double_wooden_slab"},{"data":9,"id":157,"name":"minecraft:double_wooden_slab"},{"data":10,"id":157,"name":"minecraft:double_wooden_slab"},{"data":11,"id":157,"name":"minecraft:double_wooden_slab"},{"data":12,"id":157,"name":"minecraft:double_wooden_slab"},{"data":13,"id":157,"name":"minecraft:double_wooden_slab"},{"data":14,"id":157,"name":"minecraft:double_wooden_slab"},{"data":15,"id":157,"name":"minecraft:double_wooden_slab"},{"data":0,"id":158,"name":"minecraft:wooden_slab"},{"data":1,"id":158,"name":"minecraft:wooden_slab"},{"data":2,"id":158,"name":"minecraft:wooden_slab"},{"data":3,"id":158,"name":"minecraft:wooden_slab"},{"data":4,"id":158,"name":"minecraft:wooden_slab"},{"data":5,"id":158,"name":"minecraft:wooden_slab"},{"data":6,"id":158,"name":"minecraft:wooden_slab"},{"data":7,"id":158,"name":"minecraft:wooden_slab"},{"data":8,"id":158,"name":"minecraft:wooden_slab"},{"data":9,"id":158,"name":"minecraft:wooden_slab"},{"data":10,"id":158,"name":"minecraft:wooden_slab"},{"data":11,"id":158,"name":"minecraft:wooden_slab"},{"data":12,"id":158,"name":"minecraft:wooden_slab"},{"data":13,"id":158,"name":"minecraft:wooden_slab"},{"data":14,"id":158,"name":"minecraft:wooden_slab"},{"data":15,"id":158,"name":"minecraft:wooden_slab"},{"data":0,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":1,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":2,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":3,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":4,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":5,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":6,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":7,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":8,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":9,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":10,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":11,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":12,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":13,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":14,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":15,"id":159,"name":"minecraft:stained_hardened_clay"},{"data":0,"id":160,"name":"minecraft:stained_glass_pane"},{"data":1,"id":160,"name":"minecraft:stained_glass_pane"},{"data":2,"id":160,"name":"minecraft:stained_glass_pane"},{"data":3,"id":160,"name":"minecraft:stained_glass_pane"},{"data":4,"id":160,"name":"minecraft:stained_glass_pane"},{"data":5,"id":160,"name":"minecraft:stained_glass_pane"},{"data":6,"id":160,"name":"minecraft:stained_glass_pane"},{"data":7,"id":160,"name":"minecraft:stained_glass_pane"},{"data":8,"id":160,"name":"minecraft:stained_glass_pane"},{"data":9,"id":160,"name":"minecraft:stained_glass_pane"},{"data":10,"id":160,"name":"minecraft:stained_glass_pane"},{"data":11,"id":160,"name":"minecraft:stained_glass_pane"},{"data":12,"id":160,"name":"minecraft:stained_glass_pane"},{"data":13,"id":160,"name":"minecraft:stained_glass_pane"},{"data":14,"id":160,"name":"minecraft:stained_glass_pane"},{"data":15,"id":160,"name":"minecraft:stained_glass_pane"},{"data":0,"id":161,"name":"minecraft:leaves2"},{"data":1,"id":161,"name":"minecraft:leaves2"},{"data":2,"id":161,"name":"minecraft:leaves2"},{"data":3,"id":161,"name":"minecraft:leaves2"},{"data":4,"id":161,"name":"minecraft:leaves2"},{"data":5,"id":161,"name":"minecraft:leaves2"},{"data":6,"id":161,"name":"minecraft:leaves2"},{"data":7,"id":161,"name":"minecraft:leaves2"},{"data":8,"id":161,"name":"minecraft:leaves2"},{"data":9,"id":161,"name":"minecraft:leaves2"},{"data":10,"id":161,"name":"minecraft:leaves2"},{"data":11,"id":161,"name":"minecraft:leaves2"},{"data":12,"id":161,"name":"minecraft:leaves2"},{"data":13,"id":161,"name":"minecraft:leaves2"},{"data":14,"id":161,"name":"minecraft:leaves2"},{"data":15,"id":161,"name":"minecraft:leaves2"},{"data":0,"id":162,"name":"minecraft:log2"},{"data":1,"id":162,"name":"minecraft:log2"},{"data":2,"id":162,"name":"minecraft:log2"},{"data":3,"id":162,"name":"minecraft:log2"},{"data":4,"id":162,"name":"minecraft:log2"},{"data":5,"id":162,"name":"minecraft:log2"},{"data":6,"id":162,"name":"minecraft:log2"},{"data":7,"id":162,"name":"minecraft:log2"},{"data":8,"id":162,"name":"minecraft:log2"},{"data":9,"id":162,"name":"minecraft:log2"},{"data":10,"id":162,"name":"minecraft:log2"},{"data":11,"id":162,"name":"minecraft:log2"},{"data":12,"id":162,"name":"minecraft:log2"},{"data":13,"id":162,"name":"minecraft:log2"},{"data":14,"id":162,"name":"minecraft:log2"},{"data":15,"id":162,"name":"minecraft:log2"},{"data":0,"id":163,"name":"minecraft:acacia_stairs"},{"data":1,"id":163,"name":"minecraft:acacia_stairs"},{"data":2,"id":163,"name":"minecraft:acacia_stairs"},{"data":3,"id":163,"name":"minecraft:acacia_stairs"},{"data":4,"id":163,"name":"minecraft:acacia_stairs"},{"data":5,"id":163,"name":"minecraft:acacia_stairs"},{"data":6,"id":163,"name":"minecraft:acacia_stairs"},{"data":7,"id":163,"name":"minecraft:acacia_stairs"},{"data":0,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":1,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":2,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":3,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":4,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":5,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":6,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":7,"id":164,"name":"minecraft:dark_oak_stairs"},{"data":0,"id":165,"name":"minecraft:slime"},{"data":0,"id":167,"name":"minecraft:iron_trapdoor"},{"data":1,"id":167,"name":"minecraft:iron_trapdoor"},{"data":2,"id":167,"name":"minecraft:iron_trapdoor"},{"data":3,"id":167,"name":"minecraft:iron_trapdoor"},{"data":4,"id":167,"name":"minecraft:iron_trapdoor"},{"data":5,"id":167,"name":"minecraft:iron_trapdoor"},{"data":6,"id":167,"name":"minecraft:iron_trapdoor"},{"data":7,"id":167,"name":"minecraft:iron_trapdoor"},{"data":8,"id":167,"name":"minecraft:iron_trapdoor"},{"data":9,"id":167,"name":"minecraft:iron_trapdoor"},{"data":10,"id":167,"name":"minecraft:iron_trapdoor"},{"data":11,"id":167,"name":"minecraft:iron_trapdoor"},{"data":12,"id":167,"name":"minecraft:iron_trapdoor"},{"data":13,"id":167,"name":"minecraft:iron_trapdoor"},{"data":14,"id":167,"name":"minecraft:iron_trapdoor"},{"data":15,"id":167,"name":"minecraft:iron_trapdoor"},{"data":0,"id":168,"name":"minecraft:prismarine"},{"data":1,"id":168,"name":"minecraft:prismarine"},{"data":2,"id":168,"name":"minecraft:prismarine"},{"data":3,"id":168,"name":"minecraft:prismarine"},{"data":0,"id":169,"name":"minecraft:seaLantern"},{"data":0,"id":170,"name":"minecraft:hay_block"},{"data":1,"id":170,"name":"minecraft:hay_block"},{"data":2,"id":170,"name":"minecraft:hay_block"},{"data":3,"id":170,"name":"minecraft:hay_block"},{"data":4,"id":170,"name":"minecraft:hay_block"},{"data":5,"id":170,"name":"minecraft:hay_block"},{"data":6,"id":170,"name":"minecraft:hay_block"},{"data":7,"id":170,"name":"minecraft:hay_block"},{"data":8,"id":170,"name":"minecraft:hay_block"},{"data":9,"id":170,"name":"minecraft:hay_block"},{"data":10,"id":170,"name":"minecraft:hay_block"},{"data":11,"id":170,"name":"minecraft:hay_block"},{"data":12,"id":170,"name":"minecraft:hay_block"},{"data":13,"id":170,"name":"minecraft:hay_block"},{"data":14,"id":170,"name":"minecraft:hay_block"},{"data":15,"id":170,"name":"minecraft:hay_block"},{"data":0,"id":171,"name":"minecraft:carpet"},{"data":1,"id":171,"name":"minecraft:carpet"},{"data":2,"id":171,"name":"minecraft:carpet"},{"data":3,"id":171,"name":"minecraft:carpet"},{"data":4,"id":171,"name":"minecraft:carpet"},{"data":5,"id":171,"name":"minecraft:carpet"},{"data":6,"id":171,"name":"minecraft:carpet"},{"data":7,"id":171,"name":"minecraft:carpet"},{"data":8,"id":171,"name":"minecraft:carpet"},{"data":9,"id":171,"name":"minecraft:carpet"},{"data":10,"id":171,"name":"minecraft:carpet"},{"data":11,"id":171,"name":"minecraft:carpet"},{"data":12,"id":171,"name":"minecraft:carpet"},{"data":13,"id":171,"name":"minecraft:carpet"},{"data":14,"id":171,"name":"minecraft:carpet"},{"data":15,"id":171,"name":"minecraft:carpet"},{"data":0,"id":172,"name":"minecraft:hardened_clay"},{"data":0,"id":173,"name":"minecraft:coal_block"},{"data":0,"id":174,"name":"minecraft:packed_ice"},{"data":0,"id":175,"name":"minecraft:double_plant"},{"data":1,"id":175,"name":"minecraft:double_plant"},{"data":2,"id":175,"name":"minecraft:double_plant"},{"data":3,"id":175,"name":"minecraft:double_plant"},{"data":4,"id":175,"name":"minecraft:double_plant"},{"data":5,"id":175,"name":"minecraft:double_plant"},{"data":6,"id":175,"name":"minecraft:double_plant"},{"data":7,"id":175,"name":"minecraft:double_plant"},{"data":8,"id":175,"name":"minecraft:double_plant"},{"data":9,"id":175,"name":"minecraft:double_plant"},{"data":10,"id":175,"name":"minecraft:double_plant"},{"data":11,"id":175,"name":"minecraft:double_plant"},{"data":12,"id":175,"name":"minecraft:double_plant"},{"data":13,"id":175,"name":"minecraft:double_plant"},{"data":14,"id":175,"name":"minecraft:double_plant"},{"data":15,"id":175,"name":"minecraft:double_plant"},{"data":0,"id":176,"name":"minecraft:standing_banner"},{"data":1,"id":176,"name":"minecraft:standing_banner"},{"data":2,"id":176,"name":"minecraft:standing_banner"},{"data":3,"id":176,"name":"minecraft:standing_banner"},{"data":4,"id":176,"name":"minecraft:standing_banner"},{"data":5,"id":176,"name":"minecraft:standing_banner"},{"data":6,"id":176,"name":"minecraft:standing_banner"},{"data":7,"id":176,"name":"minecraft:standing_banner"},{"data":8,"id":176,"name":"minecraft:standing_banner"},{"data":9,"id":176,"name":"minecraft:standing_banner"},{"data":10,"id":176,"name":"minecraft:standing_banner"},{"data":11,"id":176,"name":"minecraft:standing_banner"},{"data":12,"id":176,"name":"minecraft:standing_banner"},{"data":13,"id":176,"name":"minecraft:standing_banner"},{"data":14,"id":176,"name":"minecraft:standing_banner"},{"data":15,"id":176,"name":"minecraft:standing_banner"},{"data":0,"id":177,"name":"minecraft:wall_banner"},{"data":1,"id":177,"name":"minecraft:wall_banner"},{"data":2,"id":177,"name":"minecraft:wall_banner"},{"data":3,"id":177,"name":"minecraft:wall_banner"},{"data":4,"id":177,"name":"minecraft:wall_banner"},{"data":5,"id":177,"name":"minecraft:wall_banner"},{"data":6,"id":177,"name":"minecraft:wall_banner"},{"data":7,"id":177,"name":"minecraft:wall_banner"},{"data":0,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":1,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":2,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":3,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":4,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":5,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":6,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":7,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":8,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":9,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":10,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":11,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":12,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":13,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":14,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":15,"id":178,"name":"minecraft:daylight_detector_inverted"},{"data":0,"id":179,"name":"minecraft:red_sandstone"},{"data":1,"id":179,"name":"minecraft:red_sandstone"},{"data":2,"id":179,"name":"minecraft:red_sandstone"},{"data":3,"id":179,"name":"minecraft:red_sandstone"},{"data":0,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":1,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":2,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":3,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":4,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":5,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":6,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":7,"id":180,"name":"minecraft:red_sandstone_stairs"},{"data":0,"id":181,"name":"minecraft:double_stone_slab2"},{"data":1,"id":181,"name":"minecraft:double_stone_slab2"},{"data":2,"id":181,"name":"minecraft:double_stone_slab2"},{"data":3,"id":181,"name":"minecraft:double_stone_slab2"},{"data":4,"id":181,"name":"minecraft:double_stone_slab2"},{"data":5,"id":181,"name":"minecraft:double_stone_slab2"},{"data":6,"id":181,"name":"minecraft:double_stone_slab2"},{"data":7,"id":181,"name":"minecraft:double_stone_slab2"},{"data":8,"id":181,"name":"minecraft:double_stone_slab2"},{"data":9,"id":181,"name":"minecraft:double_stone_slab2"},{"data":10,"id":181,"name":"minecraft:double_stone_slab2"},{"data":11,"id":181,"name":"minecraft:double_stone_slab2"},{"data":12,"id":181,"name":"minecraft:double_stone_slab2"},{"data":13,"id":181,"name":"minecraft:double_stone_slab2"},{"data":14,"id":181,"name":"minecraft:double_stone_slab2"},{"data":15,"id":181,"name":"minecraft:double_stone_slab2"},{"data":0,"id":182,"name":"minecraft:stone_slab2"},{"data":1,"id":182,"name":"minecraft:stone_slab2"},{"data":2,"id":182,"name":"minecraft:stone_slab2"},{"data":3,"id":182,"name":"minecraft:stone_slab2"},{"data":4,"id":182,"name":"minecraft:stone_slab2"},{"data":5,"id":182,"name":"minecraft:stone_slab2"},{"data":6,"id":182,"name":"minecraft:stone_slab2"},{"data":7,"id":182,"name":"minecraft:stone_slab2"},{"data":8,"id":182,"name":"minecraft:stone_slab2"},{"data":9,"id":182,"name":"minecraft:stone_slab2"},{"data":10,"id":182,"name":"minecraft:stone_slab2"},{"data":11,"id":182,"name":"minecraft:stone_slab2"},{"data":12,"id":182,"name":"minecraft:stone_slab2"},{"data":13,"id":182,"name":"minecraft:stone_slab2"},{"data":14,"id":182,"name":"minecraft:stone_slab2"},{"data":15,"id":182,"name":"minecraft:stone_slab2"},{"data":0,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":1,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":2,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":3,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":4,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":5,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":6,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":7,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":8,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":9,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":10,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":11,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":12,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":13,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":14,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":15,"id":183,"name":"minecraft:spruce_fence_gate"},{"data":0,"id":184,"name":"minecraft:birch_fence_gate"},{"data":1,"id":184,"name":"minecraft:birch_fence_gate"},{"data":2,"id":184,"name":"minecraft:birch_fence_gate"},{"data":3,"id":184,"name":"minecraft:birch_fence_gate"},{"data":4,"id":184,"name":"minecraft:birch_fence_gate"},{"data":5,"id":184,"name":"minecraft:birch_fence_gate"},{"data":6,"id":184,"name":"minecraft:birch_fence_gate"},{"data":7,"id":184,"name":"minecraft:birch_fence_gate"},{"data":8,"id":184,"name":"minecraft:birch_fence_gate"},{"data":9,"id":184,"name":"minecraft:birch_fence_gate"},{"data":10,"id":184,"name":"minecraft:birch_fence_gate"},{"data":11,"id":184,"name":"minecraft:birch_fence_gate"},{"data":12,"id":184,"name":"minecraft:birch_fence_gate"},{"data":13,"id":184,"name":"minecraft:birch_fence_gate"},{"data":14,"id":184,"name":"minecraft:birch_fence_gate"},{"data":15,"id":184,"name":"minecraft:birch_fence_gate"},{"data":0,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":1,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":2,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":3,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":4,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":5,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":6,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":7,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":8,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":9,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":10,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":11,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":12,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":13,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":14,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":15,"id":185,"name":"minecraft:jungle_fence_gate"},{"data":0,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":1,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":2,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":3,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":4,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":5,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":6,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":7,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":8,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":9,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":10,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":11,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":12,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":13,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":14,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":15,"id":186,"name":"minecraft:dark_oak_fence_gate"},{"data":0,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":1,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":2,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":3,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":4,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":5,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":6,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":7,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":8,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":9,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":10,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":11,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":12,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":13,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":14,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":15,"id":187,"name":"minecraft:acacia_fence_gate"},{"data":0,"id":188,"name":"minecraft:repeating_command_block"},{"data":1,"id":188,"name":"minecraft:repeating_command_block"},{"data":2,"id":188,"name":"minecraft:repeating_command_block"},{"data":3,"id":188,"name":"minecraft:repeating_command_block"},{"data":4,"id":188,"name":"minecraft:repeating_command_block"},{"data":5,"id":188,"name":"minecraft:repeating_command_block"},{"data":6,"id":188,"name":"minecraft:repeating_command_block"},{"data":7,"id":188,"name":"minecraft:repeating_command_block"},{"data":8,"id":188,"name":"minecraft:repeating_command_block"},{"data":9,"id":188,"name":"minecraft:repeating_command_block"},{"data":10,"id":188,"name":"minecraft:repeating_command_block"},{"data":11,"id":188,"name":"minecraft:repeating_command_block"},{"data":12,"id":188,"name":"minecraft:repeating_command_block"},{"data":13,"id":188,"name":"minecraft:repeating_command_block"},{"data":14,"id":188,"name":"minecraft:repeating_command_block"},{"data":15,"id":188,"name":"minecraft:repeating_command_block"},{"data":0,"id":189,"name":"minecraft:chain_command_block"},{"data":1,"id":189,"name":"minecraft:chain_command_block"},{"data":2,"id":189,"name":"minecraft:chain_command_block"},{"data":3,"id":189,"name":"minecraft:chain_command_block"},{"data":4,"id":189,"name":"minecraft:chain_command_block"},{"data":5,"id":189,"name":"minecraft:chain_command_block"},{"data":6,"id":189,"name":"minecraft:chain_command_block"},{"data":7,"id":189,"name":"minecraft:chain_command_block"},{"data":8,"id":189,"name":"minecraft:chain_command_block"},{"data":9,"id":189,"name":"minecraft:chain_command_block"},{"data":10,"id":189,"name":"minecraft:chain_command_block"},{"data":11,"id":189,"name":"minecraft:chain_command_block"},{"data":12,"id":189,"name":"minecraft:chain_command_block"},{"data":13,"id":189,"name":"minecraft:chain_command_block"},{"data":14,"id":189,"name":"minecraft:chain_command_block"},{"data":15,"id":189,"name":"minecraft:chain_command_block"},{"data":0,"id":190,"name":"minecraft:hard_glass_pane"},{"data":0,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":1,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":2,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":3,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":4,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":5,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":6,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":7,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":8,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":9,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":10,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":11,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":12,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":13,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":14,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":15,"id":191,"name":"minecraft:hard_stained_glass_pane"},{"data":0,"id":192,"name":"minecraft:chemical_heat"},{"data":0,"id":193,"name":"minecraft:spruce_door"},{"data":1,"id":193,"name":"minecraft:spruce_door"},{"data":2,"id":193,"name":"minecraft:spruce_door"},{"data":3,"id":193,"name":"minecraft:spruce_door"},{"data":4,"id":193,"name":"minecraft:spruce_door"},{"data":5,"id":193,"name":"minecraft:spruce_door"},{"data":6,"id":193,"name":"minecraft:spruce_door"},{"data":7,"id":193,"name":"minecraft:spruce_door"},{"data":8,"id":193,"name":"minecraft:spruce_door"},{"data":9,"id":193,"name":"minecraft:spruce_door"},{"data":10,"id":193,"name":"minecraft:spruce_door"},{"data":11,"id":193,"name":"minecraft:spruce_door"},{"data":12,"id":193,"name":"minecraft:spruce_door"},{"data":13,"id":193,"name":"minecraft:spruce_door"},{"data":14,"id":193,"name":"minecraft:spruce_door"},{"data":15,"id":193,"name":"minecraft:spruce_door"},{"data":0,"id":194,"name":"minecraft:birch_door"},{"data":1,"id":194,"name":"minecraft:birch_door"},{"data":2,"id":194,"name":"minecraft:birch_door"},{"data":3,"id":194,"name":"minecraft:birch_door"},{"data":4,"id":194,"name":"minecraft:birch_door"},{"data":5,"id":194,"name":"minecraft:birch_door"},{"data":6,"id":194,"name":"minecraft:birch_door"},{"data":7,"id":194,"name":"minecraft:birch_door"},{"data":8,"id":194,"name":"minecraft:birch_door"},{"data":9,"id":194,"name":"minecraft:birch_door"},{"data":10,"id":194,"name":"minecraft:birch_door"},{"data":11,"id":194,"name":"minecraft:birch_door"},{"data":12,"id":194,"name":"minecraft:birch_door"},{"data":13,"id":194,"name":"minecraft:birch_door"},{"data":14,"id":194,"name":"minecraft:birch_door"},{"data":15,"id":194,"name":"minecraft:birch_door"},{"data":0,"id":195,"name":"minecraft:jungle_door"},{"data":1,"id":195,"name":"minecraft:jungle_door"},{"data":2,"id":195,"name":"minecraft:jungle_door"},{"data":3,"id":195,"name":"minecraft:jungle_door"},{"data":4,"id":195,"name":"minecraft:jungle_door"},{"data":5,"id":195,"name":"minecraft:jungle_door"},{"data":6,"id":195,"name":"minecraft:jungle_door"},{"data":7,"id":195,"name":"minecraft:jungle_door"},{"data":8,"id":195,"name":"minecraft:jungle_door"},{"data":9,"id":195,"name":"minecraft:jungle_door"},{"data":10,"id":195,"name":"minecraft:jungle_door"},{"data":11,"id":195,"name":"minecraft:jungle_door"},{"data":12,"id":195,"name":"minecraft:jungle_door"},{"data":13,"id":195,"name":"minecraft:jungle_door"},{"data":14,"id":195,"name":"minecraft:jungle_door"},{"data":15,"id":195,"name":"minecraft:jungle_door"},{"data":0,"id":196,"name":"minecraft:acacia_door"},{"data":1,"id":196,"name":"minecraft:acacia_door"},{"data":2,"id":196,"name":"minecraft:acacia_door"},{"data":3,"id":196,"name":"minecraft:acacia_door"},{"data":4,"id":196,"name":"minecraft:acacia_door"},{"data":5,"id":196,"name":"minecraft:acacia_door"},{"data":6,"id":196,"name":"minecraft:acacia_door"},{"data":7,"id":196,"name":"minecraft:acacia_door"},{"data":8,"id":196,"name":"minecraft:acacia_door"},{"data":9,"id":196,"name":"minecraft:acacia_door"},{"data":10,"id":196,"name":"minecraft:acacia_door"},{"data":11,"id":196,"name":"minecraft:acacia_door"},{"data":12,"id":196,"name":"minecraft:acacia_door"},{"data":13,"id":196,"name":"minecraft:acacia_door"},{"data":14,"id":196,"name":"minecraft:acacia_door"},{"data":15,"id":196,"name":"minecraft:acacia_door"},{"data":0,"id":197,"name":"minecraft:dark_oak_door"},{"data":1,"id":197,"name":"minecraft:dark_oak_door"},{"data":2,"id":197,"name":"minecraft:dark_oak_door"},{"data":3,"id":197,"name":"minecraft:dark_oak_door"},{"data":4,"id":197,"name":"minecraft:dark_oak_door"},{"data":5,"id":197,"name":"minecraft:dark_oak_door"},{"data":6,"id":197,"name":"minecraft:dark_oak_door"},{"data":7,"id":197,"name":"minecraft:dark_oak_door"},{"data":8,"id":197,"name":"minecraft:dark_oak_door"},{"data":9,"id":197,"name":"minecraft:dark_oak_door"},{"data":10,"id":197,"name":"minecraft:dark_oak_door"},{"data":11,"id":197,"name":"minecraft:dark_oak_door"},{"data":12,"id":197,"name":"minecraft:dark_oak_door"},{"data":13,"id":197,"name":"minecraft:dark_oak_door"},{"data":14,"id":197,"name":"minecraft:dark_oak_door"},{"data":15,"id":197,"name":"minecraft:dark_oak_door"},{"data":0,"id":198,"name":"minecraft:grass_path"},{"data":0,"id":199,"name":"minecraft:frame"},{"data":1,"id":199,"name":"minecraft:frame"},{"data":2,"id":199,"name":"minecraft:frame"},{"data":3,"id":199,"name":"minecraft:frame"},{"data":4,"id":199,"name":"minecraft:frame"},{"data":5,"id":199,"name":"minecraft:frame"},{"data":6,"id":199,"name":"minecraft:frame"},{"data":7,"id":199,"name":"minecraft:frame"},{"data":0,"id":200,"name":"minecraft:chorus_flower"},{"data":1,"id":200,"name":"minecraft:chorus_flower"},{"data":2,"id":200,"name":"minecraft:chorus_flower"},{"data":3,"id":200,"name":"minecraft:chorus_flower"},{"data":4,"id":200,"name":"minecraft:chorus_flower"},{"data":5,"id":200,"name":"minecraft:chorus_flower"},{"data":6,"id":200,"name":"minecraft:chorus_flower"},{"data":7,"id":200,"name":"minecraft:chorus_flower"},{"data":0,"id":201,"name":"minecraft:purpur_block"},{"data":1,"id":201,"name":"minecraft:purpur_block"},{"data":2,"id":201,"name":"minecraft:purpur_block"},{"data":3,"id":201,"name":"minecraft:purpur_block"},{"data":4,"id":201,"name":"minecraft:purpur_block"},{"data":5,"id":201,"name":"minecraft:purpur_block"},{"data":6,"id":201,"name":"minecraft:purpur_block"},{"data":7,"id":201,"name":"minecraft:purpur_block"},{"data":8,"id":201,"name":"minecraft:purpur_block"},{"data":9,"id":201,"name":"minecraft:purpur_block"},{"data":10,"id":201,"name":"minecraft:purpur_block"},{"data":11,"id":201,"name":"minecraft:purpur_block"},{"data":12,"id":201,"name":"minecraft:purpur_block"},{"data":13,"id":201,"name":"minecraft:purpur_block"},{"data":14,"id":201,"name":"minecraft:purpur_block"},{"data":15,"id":201,"name":"minecraft:purpur_block"},{"data":0,"id":202,"name":"minecraft:colored_torch_rg"},{"data":1,"id":202,"name":"minecraft:colored_torch_rg"},{"data":2,"id":202,"name":"minecraft:colored_torch_rg"},{"data":3,"id":202,"name":"minecraft:colored_torch_rg"},{"data":4,"id":202,"name":"minecraft:colored_torch_rg"},{"data":5,"id":202,"name":"minecraft:colored_torch_rg"},{"data":6,"id":202,"name":"minecraft:colored_torch_rg"},{"data":7,"id":202,"name":"minecraft:colored_torch_rg"},{"data":8,"id":202,"name":"minecraft:colored_torch_rg"},{"data":9,"id":202,"name":"minecraft:colored_torch_rg"},{"data":10,"id":202,"name":"minecraft:colored_torch_rg"},{"data":11,"id":202,"name":"minecraft:colored_torch_rg"},{"data":12,"id":202,"name":"minecraft:colored_torch_rg"},{"data":13,"id":202,"name":"minecraft:colored_torch_rg"},{"data":14,"id":202,"name":"minecraft:colored_torch_rg"},{"data":15,"id":202,"name":"minecraft:colored_torch_rg"},{"data":0,"id":203,"name":"minecraft:purpur_stairs"},{"data":1,"id":203,"name":"minecraft:purpur_stairs"},{"data":2,"id":203,"name":"minecraft:purpur_stairs"},{"data":3,"id":203,"name":"minecraft:purpur_stairs"},{"data":4,"id":203,"name":"minecraft:purpur_stairs"},{"data":5,"id":203,"name":"minecraft:purpur_stairs"},{"data":6,"id":203,"name":"minecraft:purpur_stairs"},{"data":7,"id":203,"name":"minecraft:purpur_stairs"},{"data":0,"id":204,"name":"minecraft:colored_torch_bp"},{"data":1,"id":204,"name":"minecraft:colored_torch_bp"},{"data":2,"id":204,"name":"minecraft:colored_torch_bp"},{"data":3,"id":204,"name":"minecraft:colored_torch_bp"},{"data":4,"id":204,"name":"minecraft:colored_torch_bp"},{"data":5,"id":204,"name":"minecraft:colored_torch_bp"},{"data":6,"id":204,"name":"minecraft:colored_torch_bp"},{"data":7,"id":204,"name":"minecraft:colored_torch_bp"},{"data":8,"id":204,"name":"minecraft:colored_torch_bp"},{"data":9,"id":204,"name":"minecraft:colored_torch_bp"},{"data":10,"id":204,"name":"minecraft:colored_torch_bp"},{"data":11,"id":204,"name":"minecraft:colored_torch_bp"},{"data":12,"id":204,"name":"minecraft:colored_torch_bp"},{"data":13,"id":204,"name":"minecraft:colored_torch_bp"},{"data":14,"id":204,"name":"minecraft:colored_torch_bp"},{"data":15,"id":204,"name":"minecraft:colored_torch_bp"},{"data":0,"id":205,"name":"minecraft:undyed_shulker_box"},{"data":0,"id":206,"name":"minecraft:end_bricks"},{"data":0,"id":207,"name":"minecraft:frosted_ice"},{"data":1,"id":207,"name":"minecraft:frosted_ice"},{"data":2,"id":207,"name":"minecraft:frosted_ice"},{"data":3,"id":207,"name":"minecraft:frosted_ice"},{"data":0,"id":208,"name":"minecraft:end_rod"},{"data":1,"id":208,"name":"minecraft:end_rod"},{"data":2,"id":208,"name":"minecraft:end_rod"},{"data":3,"id":208,"name":"minecraft:end_rod"},{"data":4,"id":208,"name":"minecraft:end_rod"},{"data":5,"id":208,"name":"minecraft:end_rod"},{"data":6,"id":208,"name":"minecraft:end_rod"},{"data":7,"id":208,"name":"minecraft:end_rod"},{"data":0,"id":209,"name":"minecraft:end_gateway"},{"data":0,"id":213,"name":"minecraft:magma"},{"data":0,"id":214,"name":"minecraft:nether_wart_block"},{"data":0,"id":215,"name":"minecraft:red_nether_brick"},{"data":0,"id":216,"name":"minecraft:bone_block"},{"data":1,"id":216,"name":"minecraft:bone_block"},{"data":2,"id":216,"name":"minecraft:bone_block"},{"data":3,"id":216,"name":"minecraft:bone_block"},{"data":4,"id":216,"name":"minecraft:bone_block"},{"data":5,"id":216,"name":"minecraft:bone_block"},{"data":6,"id":216,"name":"minecraft:bone_block"},{"data":7,"id":216,"name":"minecraft:bone_block"},{"data":8,"id":216,"name":"minecraft:bone_block"},{"data":9,"id":216,"name":"minecraft:bone_block"},{"data":10,"id":216,"name":"minecraft:bone_block"},{"data":11,"id":216,"name":"minecraft:bone_block"},{"data":12,"id":216,"name":"minecraft:bone_block"},{"data":13,"id":216,"name":"minecraft:bone_block"},{"data":14,"id":216,"name":"minecraft:bone_block"},{"data":15,"id":216,"name":"minecraft:bone_block"},{"data":0,"id":218,"name":"minecraft:shulker_box"},{"data":1,"id":218,"name":"minecraft:shulker_box"},{"data":2,"id":218,"name":"minecraft:shulker_box"},{"data":3,"id":218,"name":"minecraft:shulker_box"},{"data":4,"id":218,"name":"minecraft:shulker_box"},{"data":5,"id":218,"name":"minecraft:shulker_box"},{"data":6,"id":218,"name":"minecraft:shulker_box"},{"data":7,"id":218,"name":"minecraft:shulker_box"},{"data":8,"id":218,"name":"minecraft:shulker_box"},{"data":9,"id":218,"name":"minecraft:shulker_box"},{"data":10,"id":218,"name":"minecraft:shulker_box"},{"data":11,"id":218,"name":"minecraft:shulker_box"},{"data":12,"id":218,"name":"minecraft:shulker_box"},{"data":13,"id":218,"name":"minecraft:shulker_box"},{"data":14,"id":218,"name":"minecraft:shulker_box"},{"data":15,"id":218,"name":"minecraft:shulker_box"},{"data":0,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":1,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":2,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":3,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":4,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":5,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":6,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":7,"id":219,"name":"minecraft:purple_glazed_terracotta"},{"data":0,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":1,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":2,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":3,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":4,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":5,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":6,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":7,"id":220,"name":"minecraft:white_glazed_terracotta"},{"data":0,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":1,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":2,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":3,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":4,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":5,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":6,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":7,"id":221,"name":"minecraft:orange_glazed_terracotta"},{"data":0,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":1,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":2,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":3,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":4,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":5,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":6,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":7,"id":222,"name":"minecraft:magenta_glazed_terracotta"},{"data":0,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":1,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":2,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":3,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":4,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":5,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":6,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":7,"id":223,"name":"minecraft:light_blue_glazed_terracotta"},{"data":0,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":1,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":2,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":3,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":4,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":5,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":6,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":7,"id":224,"name":"minecraft:yellow_glazed_terracotta"},{"data":0,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":1,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":2,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":3,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":4,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":5,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":6,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":7,"id":225,"name":"minecraft:lime_glazed_terracotta"},{"data":0,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":1,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":2,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":3,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":4,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":5,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":6,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":7,"id":226,"name":"minecraft:pink_glazed_terracotta"},{"data":0,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":1,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":2,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":3,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":4,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":5,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":6,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":7,"id":227,"name":"minecraft:gray_glazed_terracotta"},{"data":0,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":1,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":2,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":3,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":4,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":5,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":6,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":7,"id":228,"name":"minecraft:silver_glazed_terracotta"},{"data":0,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":1,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":2,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":3,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":4,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":5,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":6,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":7,"id":229,"name":"minecraft:cyan_glazed_terracotta"},{"data":0,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":1,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":2,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":3,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":4,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":5,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":6,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":7,"id":231,"name":"minecraft:blue_glazed_terracotta"},{"data":0,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":1,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":2,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":3,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":4,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":5,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":6,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":7,"id":232,"name":"minecraft:brown_glazed_terracotta"},{"data":0,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":1,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":2,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":3,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":4,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":5,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":6,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":7,"id":233,"name":"minecraft:green_glazed_terracotta"},{"data":0,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":1,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":2,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":3,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":4,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":5,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":6,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":7,"id":234,"name":"minecraft:red_glazed_terracotta"},{"data":0,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":1,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":2,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":3,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":4,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":5,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":6,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":7,"id":235,"name":"minecraft:black_glazed_terracotta"},{"data":0,"id":236,"name":"minecraft:concrete"},{"data":1,"id":236,"name":"minecraft:concrete"},{"data":2,"id":236,"name":"minecraft:concrete"},{"data":3,"id":236,"name":"minecraft:concrete"},{"data":4,"id":236,"name":"minecraft:concrete"},{"data":5,"id":236,"name":"minecraft:concrete"},{"data":6,"id":236,"name":"minecraft:concrete"},{"data":7,"id":236,"name":"minecraft:concrete"},{"data":8,"id":236,"name":"minecraft:concrete"},{"data":9,"id":236,"name":"minecraft:concrete"},{"data":10,"id":236,"name":"minecraft:concrete"},{"data":11,"id":236,"name":"minecraft:concrete"},{"data":12,"id":236,"name":"minecraft:concrete"},{"data":13,"id":236,"name":"minecraft:concrete"},{"data":14,"id":236,"name":"minecraft:concrete"},{"data":15,"id":236,"name":"minecraft:concrete"},{"data":0,"id":237,"name":"minecraft:concretePowder"},{"data":1,"id":237,"name":"minecraft:concretePowder"},{"data":2,"id":237,"name":"minecraft:concretePowder"},{"data":3,"id":237,"name":"minecraft:concretePowder"},{"data":4,"id":237,"name":"minecraft:concretePowder"},{"data":5,"id":237,"name":"minecraft:concretePowder"},{"data":6,"id":237,"name":"minecraft:concretePowder"},{"data":7,"id":237,"name":"minecraft:concretePowder"},{"data":8,"id":237,"name":"minecraft:concretePowder"},{"data":9,"id":237,"name":"minecraft:concretePowder"},{"data":10,"id":237,"name":"minecraft:concretePowder"},{"data":11,"id":237,"name":"minecraft:concretePowder"},{"data":12,"id":237,"name":"minecraft:concretePowder"},{"data":13,"id":237,"name":"minecraft:concretePowder"},{"data":14,"id":237,"name":"minecraft:concretePowder"},{"data":15,"id":237,"name":"minecraft:concretePowder"},{"data":0,"id":238,"name":"minecraft:chemistry_table"},{"data":1,"id":238,"name":"minecraft:chemistry_table"},{"data":2,"id":238,"name":"minecraft:chemistry_table"},{"data":3,"id":238,"name":"minecraft:chemistry_table"},{"data":4,"id":238,"name":"minecraft:chemistry_table"},{"data":5,"id":238,"name":"minecraft:chemistry_table"},{"data":6,"id":238,"name":"minecraft:chemistry_table"},{"data":7,"id":238,"name":"minecraft:chemistry_table"},{"data":8,"id":238,"name":"minecraft:chemistry_table"},{"data":9,"id":238,"name":"minecraft:chemistry_table"},{"data":10,"id":238,"name":"minecraft:chemistry_table"},{"data":11,"id":238,"name":"minecraft:chemistry_table"},{"data":12,"id":238,"name":"minecraft:chemistry_table"},{"data":13,"id":238,"name":"minecraft:chemistry_table"},{"data":14,"id":238,"name":"minecraft:chemistry_table"},{"data":15,"id":238,"name":"minecraft:chemistry_table"},{"data":0,"id":239,"name":"minecraft:underwater_torch"},{"data":1,"id":239,"name":"minecraft:underwater_torch"},{"data":2,"id":239,"name":"minecraft:underwater_torch"},{"data":3,"id":239,"name":"minecraft:underwater_torch"},{"data":4,"id":239,"name":"minecraft:underwater_torch"},{"data":5,"id":239,"name":"minecraft:underwater_torch"},{"data":6,"id":239,"name":"minecraft:underwater_torch"},{"data":7,"id":239,"name":"minecraft:underwater_torch"},{"data":0,"id":240,"name":"minecraft:chorus_plant"},{"data":0,"id":241,"name":"minecraft:stained_glass"},{"data":1,"id":241,"name":"minecraft:stained_glass"},{"data":2,"id":241,"name":"minecraft:stained_glass"},{"data":3,"id":241,"name":"minecraft:stained_glass"},{"data":4,"id":241,"name":"minecraft:stained_glass"},{"data":5,"id":241,"name":"minecraft:stained_glass"},{"data":6,"id":241,"name":"minecraft:stained_glass"},{"data":7,"id":241,"name":"minecraft:stained_glass"},{"data":8,"id":241,"name":"minecraft:stained_glass"},{"data":9,"id":241,"name":"minecraft:stained_glass"},{"data":10,"id":241,"name":"minecraft:stained_glass"},{"data":11,"id":241,"name":"minecraft:stained_glass"},{"data":12,"id":241,"name":"minecraft:stained_glass"},{"data":13,"id":241,"name":"minecraft:stained_glass"},{"data":14,"id":241,"name":"minecraft:stained_glass"},{"data":15,"id":241,"name":"minecraft:stained_glass"},{"data":0,"id":243,"name":"minecraft:podzol"},{"data":0,"id":244,"name":"minecraft:beetroot"},{"data":1,"id":244,"name":"minecraft:beetroot"},{"data":2,"id":244,"name":"minecraft:beetroot"},{"data":3,"id":244,"name":"minecraft:beetroot"},{"data":4,"id":244,"name":"minecraft:beetroot"},{"data":5,"id":244,"name":"minecraft:beetroot"},{"data":6,"id":244,"name":"minecraft:beetroot"},{"data":7,"id":244,"name":"minecraft:beetroot"},{"data":0,"id":245,"name":"minecraft:stonecutter"},{"data":0,"id":246,"name":"minecraft:glowingobsidian"},{"data":0,"id":247,"name":"minecraft:netherreactor"},{"data":0,"id":248,"name":"minecraft:info_update"},{"data":0,"id":249,"name":"minecraft:info_update2"},{"data":0,"id":250,"name":"minecraft:movingBlock"},{"data":0,"id":251,"name":"minecraft:observer"},{"data":1,"id":251,"name":"minecraft:observer"},{"data":2,"id":251,"name":"minecraft:observer"},{"data":3,"id":251,"name":"minecraft:observer"},{"data":4,"id":251,"name":"minecraft:observer"},{"data":5,"id":251,"name":"minecraft:observer"},{"data":6,"id":251,"name":"minecraft:observer"},{"data":7,"id":251,"name":"minecraft:observer"},{"data":8,"id":251,"name":"minecraft:observer"},{"data":9,"id":251,"name":"minecraft:observer"},{"data":10,"id":251,"name":"minecraft:observer"},{"data":11,"id":251,"name":"minecraft:observer"},{"data":12,"id":251,"name":"minecraft:observer"},{"data":13,"id":251,"name":"minecraft:observer"},{"data":14,"id":251,"name":"minecraft:observer"},{"data":15,"id":251,"name":"minecraft:observer"},{"data":0,"id":252,"name":"minecraft:structure_block"},{"data":1,"id":252,"name":"minecraft:structure_block"},{"data":2,"id":252,"name":"minecraft:structure_block"},{"data":3,"id":252,"name":"minecraft:structure_block"},{"data":4,"id":252,"name":"minecraft:structure_block"},{"data":5,"id":252,"name":"minecraft:structure_block"},{"data":6,"id":252,"name":"minecraft:structure_block"},{"data":7,"id":252,"name":"minecraft:structure_block"},{"data":0,"id":253,"name":"minecraft:hard_glass"},{"data":0,"id":254,"name":"minecraft:hard_stained_glass"},{"data":1,"id":254,"name":"minecraft:hard_stained_glass"},{"data":2,"id":254,"name":"minecraft:hard_stained_glass"},{"data":3,"id":254,"name":"minecraft:hard_stained_glass"},{"data":4,"id":254,"name":"minecraft:hard_stained_glass"},{"data":5,"id":254,"name":"minecraft:hard_stained_glass"},{"data":6,"id":254,"name":"minecraft:hard_stained_glass"},{"data":7,"id":254,"name":"minecraft:hard_stained_glass"},{"data":8,"id":254,"name":"minecraft:hard_stained_glass"},{"data":9,"id":254,"name":"minecraft:hard_stained_glass"},{"data":10,"id":254,"name":"minecraft:hard_stained_glass"},{"data":11,"id":254,"name":"minecraft:hard_stained_glass"},{"data":12,"id":254,"name":"minecraft:hard_stained_glass"},{"data":13,"id":254,"name":"minecraft:hard_stained_glass"},{"data":14,"id":254,"name":"minecraft:hard_stained_glass"},{"data":15,"id":254,"name":"minecraft:hard_stained_glass"},{"data":0,"id":255,"name":"minecraft:reserved6"},{"data":0,"id":257,"name":"minecraft:prismarine_stairs"},{"data":1,"id":257,"name":"minecraft:prismarine_stairs"},{"data":2,"id":257,"name":"minecraft:prismarine_stairs"},{"data":3,"id":257,"name":"minecraft:prismarine_stairs"},{"data":4,"id":257,"name":"minecraft:prismarine_stairs"},{"data":5,"id":257,"name":"minecraft:prismarine_stairs"},{"data":6,"id":257,"name":"minecraft:prismarine_stairs"},{"data":7,"id":257,"name":"minecraft:prismarine_stairs"},{"data":0,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":1,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":2,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":3,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":4,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":5,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":6,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":7,"id":258,"name":"minecraft:dark_prismarine_stairs"},{"data":0,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":1,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":2,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":3,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":4,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":5,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":6,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":7,"id":259,"name":"minecraft:prismarine_bricks_stairs"},{"data":0,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":1,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":2,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":3,"id":260,"name":"minecraft:stripped_spruce_log"},{"data":0,"id":261,"name":"minecraft:stripped_birch_log"},{"data":1,"id":261,"name":"minecraft:stripped_birch_log"},{"data":2,"id":261,"name":"minecraft:stripped_birch_log"},{"data":3,"id":261,"name":"minecraft:stripped_birch_log"},{"data":0,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":1,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":2,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":3,"id":262,"name":"minecraft:stripped_jungle_log"},{"data":0,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":1,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":2,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":3,"id":263,"name":"minecraft:stripped_acacia_log"},{"data":0,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":1,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":2,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":3,"id":264,"name":"minecraft:stripped_dark_oak_log"},{"data":0,"id":265,"name":"minecraft:stripped_oak_log"},{"data":1,"id":265,"name":"minecraft:stripped_oak_log"},{"data":2,"id":265,"name":"minecraft:stripped_oak_log"},{"data":3,"id":265,"name":"minecraft:stripped_oak_log"},{"data":0,"id":266,"name":"minecraft:blue_ice"},{"data":0,"id":267,"name":"minecraft:element_1"},{"data":1,"id":267,"name":"minecraft:element_1"},{"data":2,"id":267,"name":"minecraft:element_1"},{"data":3,"id":267,"name":"minecraft:element_1"},{"data":4,"id":267,"name":"minecraft:element_1"},{"data":5,"id":267,"name":"minecraft:element_1"},{"data":6,"id":267,"name":"minecraft:element_1"},{"data":7,"id":267,"name":"minecraft:element_1"},{"data":8,"id":267,"name":"minecraft:element_1"},{"data":9,"id":267,"name":"minecraft:element_1"},{"data":10,"id":267,"name":"minecraft:element_1"},{"data":11,"id":267,"name":"minecraft:element_1"},{"data":12,"id":267,"name":"minecraft:element_1"},{"data":13,"id":267,"name":"minecraft:element_1"},{"data":14,"id":267,"name":"minecraft:element_1"},{"data":15,"id":267,"name":"minecraft:element_1"},{"data":0,"id":268,"name":"minecraft:element_2"},{"data":1,"id":268,"name":"minecraft:element_2"},{"data":2,"id":268,"name":"minecraft:element_2"},{"data":3,"id":268,"name":"minecraft:element_2"},{"data":4,"id":268,"name":"minecraft:element_2"},{"data":5,"id":268,"name":"minecraft:element_2"},{"data":6,"id":268,"name":"minecraft:element_2"},{"data":7,"id":268,"name":"minecraft:element_2"},{"data":8,"id":268,"name":"minecraft:element_2"},{"data":9,"id":268,"name":"minecraft:element_2"},{"data":10,"id":268,"name":"minecraft:element_2"},{"data":11,"id":268,"name":"minecraft:element_2"},{"data":12,"id":268,"name":"minecraft:element_2"},{"data":13,"id":268,"name":"minecraft:element_2"},{"data":14,"id":268,"name":"minecraft:element_2"},{"data":15,"id":268,"name":"minecraft:element_2"},{"data":0,"id":269,"name":"minecraft:element_3"},{"data":1,"id":269,"name":"minecraft:element_3"},{"data":2,"id":269,"name":"minecraft:element_3"},{"data":3,"id":269,"name":"minecraft:element_3"},{"data":4,"id":269,"name":"minecraft:element_3"},{"data":5,"id":269,"name":"minecraft:element_3"},{"data":6,"id":269,"name":"minecraft:element_3"},{"data":7,"id":269,"name":"minecraft:element_3"},{"data":8,"id":269,"name":"minecraft:element_3"},{"data":9,"id":269,"name":"minecraft:element_3"},{"data":10,"id":269,"name":"minecraft:element_3"},{"data":11,"id":269,"name":"minecraft:element_3"},{"data":12,"id":269,"name":"minecraft:element_3"},{"data":13,"id":269,"name":"minecraft:element_3"},{"data":14,"id":269,"name":"minecraft:element_3"},{"data":15,"id":269,"name":"minecraft:element_3"},{"data":0,"id":270,"name":"minecraft:element_4"},{"data":1,"id":270,"name":"minecraft:element_4"},{"data":2,"id":270,"name":"minecraft:element_4"},{"data":3,"id":270,"name":"minecraft:element_4"},{"data":4,"id":270,"name":"minecraft:element_4"},{"data":5,"id":270,"name":"minecraft:element_4"},{"data":6,"id":270,"name":"minecraft:element_4"},{"data":7,"id":270,"name":"minecraft:element_4"},{"data":8,"id":270,"name":"minecraft:element_4"},{"data":9,"id":270,"name":"minecraft:element_4"},{"data":10,"id":270,"name":"minecraft:element_4"},{"data":11,"id":270,"name":"minecraft:element_4"},{"data":12,"id":270,"name":"minecraft:element_4"},{"data":13,"id":270,"name":"minecraft:element_4"},{"data":14,"id":270,"name":"minecraft:element_4"},{"data":15,"id":270,"name":"minecraft:element_4"},{"data":0,"id":271,"name":"minecraft:element_5"},{"data":1,"id":271,"name":"minecraft:element_5"},{"data":2,"id":271,"name":"minecraft:element_5"},{"data":3,"id":271,"name":"minecraft:element_5"},{"data":4,"id":271,"name":"minecraft:element_5"},{"data":5,"id":271,"name":"minecraft:element_5"},{"data":6,"id":271,"name":"minecraft:element_5"},{"data":7,"id":271,"name":"minecraft:element_5"},{"data":8,"id":271,"name":"minecraft:element_5"},{"data":9,"id":271,"name":"minecraft:element_5"},{"data":10,"id":271,"name":"minecraft:element_5"},{"data":11,"id":271,"name":"minecraft:element_5"},{"data":12,"id":271,"name":"minecraft:element_5"},{"data":13,"id":271,"name":"minecraft:element_5"},{"data":14,"id":271,"name":"minecraft:element_5"},{"data":15,"id":271,"name":"minecraft:element_5"},{"data":0,"id":272,"name":"minecraft:element_6"},{"data":1,"id":272,"name":"minecraft:element_6"},{"data":2,"id":272,"name":"minecraft:element_6"},{"data":3,"id":272,"name":"minecraft:element_6"},{"data":4,"id":272,"name":"minecraft:element_6"},{"data":5,"id":272,"name":"minecraft:element_6"},{"data":6,"id":272,"name":"minecraft:element_6"},{"data":7,"id":272,"name":"minecraft:element_6"},{"data":8,"id":272,"name":"minecraft:element_6"},{"data":9,"id":272,"name":"minecraft:element_6"},{"data":10,"id":272,"name":"minecraft:element_6"},{"data":11,"id":272,"name":"minecraft:element_6"},{"data":12,"id":272,"name":"minecraft:element_6"},{"data":13,"id":272,"name":"minecraft:element_6"},{"data":14,"id":272,"name":"minecraft:element_6"},{"data":15,"id":272,"name":"minecraft:element_6"},{"data":0,"id":273,"name":"minecraft:element_7"},{"data":1,"id":273,"name":"minecraft:element_7"},{"data":2,"id":273,"name":"minecraft:element_7"},{"data":3,"id":273,"name":"minecraft:element_7"},{"data":4,"id":273,"name":"minecraft:element_7"},{"data":5,"id":273,"name":"minecraft:element_7"},{"data":6,"id":273,"name":"minecraft:element_7"},{"data":7,"id":273,"name":"minecraft:element_7"},{"data":8,"id":273,"name":"minecraft:element_7"},{"data":9,"id":273,"name":"minecraft:element_7"},{"data":10,"id":273,"name":"minecraft:element_7"},{"data":11,"id":273,"name":"minecraft:element_7"},{"data":12,"id":273,"name":"minecraft:element_7"},{"data":13,"id":273,"name":"minecraft:element_7"},{"data":14,"id":273,"name":"minecraft:element_7"},{"data":15,"id":273,"name":"minecraft:element_7"},{"data":0,"id":274,"name":"minecraft:element_8"},{"data":1,"id":274,"name":"minecraft:element_8"},{"data":2,"id":274,"name":"minecraft:element_8"},{"data":3,"id":274,"name":"minecraft:element_8"},{"data":4,"id":274,"name":"minecraft:element_8"},{"data":5,"id":274,"name":"minecraft:element_8"},{"data":6,"id":274,"name":"minecraft:element_8"},{"data":7,"id":274,"name":"minecraft:element_8"},{"data":8,"id":274,"name":"minecraft:element_8"},{"data":9,"id":274,"name":"minecraft:element_8"},{"data":10,"id":274,"name":"minecraft:element_8"},{"data":11,"id":274,"name":"minecraft:element_8"},{"data":12,"id":274,"name":"minecraft:element_8"},{"data":13,"id":274,"name":"minecraft:element_8"},{"data":14,"id":274,"name":"minecraft:element_8"},{"data":15,"id":274,"name":"minecraft:element_8"},{"data":0,"id":275,"name":"minecraft:element_9"},{"data":1,"id":275,"name":"minecraft:element_9"},{"data":2,"id":275,"name":"minecraft:element_9"},{"data":3,"id":275,"name":"minecraft:element_9"},{"data":4,"id":275,"name":"minecraft:element_9"},{"data":5,"id":275,"name":"minecraft:element_9"},{"data":6,"id":275,"name":"minecraft:element_9"},{"data":7,"id":275,"name":"minecraft:element_9"},{"data":8,"id":275,"name":"minecraft:element_9"},{"data":9,"id":275,"name":"minecraft:element_9"},{"data":10,"id":275,"name":"minecraft:element_9"},{"data":11,"id":275,"name":"minecraft:element_9"},{"data":12,"id":275,"name":"minecraft:element_9"},{"data":13,"id":275,"name":"minecraft:element_9"},{"data":14,"id":275,"name":"minecraft:element_9"},{"data":15,"id":275,"name":"minecraft:element_9"},{"data":0,"id":276,"name":"minecraft:element_10"},{"data":1,"id":276,"name":"minecraft:element_10"},{"data":2,"id":276,"name":"minecraft:element_10"},{"data":3,"id":276,"name":"minecraft:element_10"},{"data":4,"id":276,"name":"minecraft:element_10"},{"data":5,"id":276,"name":"minecraft:element_10"},{"data":6,"id":276,"name":"minecraft:element_10"},{"data":7,"id":276,"name":"minecraft:element_10"},{"data":8,"id":276,"name":"minecraft:element_10"},{"data":9,"id":276,"name":"minecraft:element_10"},{"data":10,"id":276,"name":"minecraft:element_10"},{"data":11,"id":276,"name":"minecraft:element_10"},{"data":12,"id":276,"name":"minecraft:element_10"},{"data":13,"id":276,"name":"minecraft:element_10"},{"data":14,"id":276,"name":"minecraft:element_10"},{"data":15,"id":276,"name":"minecraft:element_10"},{"data":0,"id":277,"name":"minecraft:element_11"},{"data":1,"id":277,"name":"minecraft:element_11"},{"data":2,"id":277,"name":"minecraft:element_11"},{"data":3,"id":277,"name":"minecraft:element_11"},{"data":4,"id":277,"name":"minecraft:element_11"},{"data":5,"id":277,"name":"minecraft:element_11"},{"data":6,"id":277,"name":"minecraft:element_11"},{"data":7,"id":277,"name":"minecraft:element_11"},{"data":8,"id":277,"name":"minecraft:element_11"},{"data":9,"id":277,"name":"minecraft:element_11"},{"data":10,"id":277,"name":"minecraft:element_11"},{"data":11,"id":277,"name":"minecraft:element_11"},{"data":12,"id":277,"name":"minecraft:element_11"},{"data":13,"id":277,"name":"minecraft:element_11"},{"data":14,"id":277,"name":"minecraft:element_11"},{"data":15,"id":277,"name":"minecraft:element_11"},{"data":0,"id":278,"name":"minecraft:element_12"},{"data":1,"id":278,"name":"minecraft:element_12"},{"data":2,"id":278,"name":"minecraft:element_12"},{"data":3,"id":278,"name":"minecraft:element_12"},{"data":4,"id":278,"name":"minecraft:element_12"},{"data":5,"id":278,"name":"minecraft:element_12"},{"data":6,"id":278,"name":"minecraft:element_12"},{"data":7,"id":278,"name":"minecraft:element_12"},{"data":8,"id":278,"name":"minecraft:element_12"},{"data":9,"id":278,"name":"minecraft:element_12"},{"data":10,"id":278,"name":"minecraft:element_12"},{"data":11,"id":278,"name":"minecraft:element_12"},{"data":12,"id":278,"name":"minecraft:element_12"},{"data":13,"id":278,"name":"minecraft:element_12"},{"data":14,"id":278,"name":"minecraft:element_12"},{"data":15,"id":278,"name":"minecraft:element_12"},{"data":0,"id":279,"name":"minecraft:element_13"},{"data":1,"id":279,"name":"minecraft:element_13"},{"data":2,"id":279,"name":"minecraft:element_13"},{"data":3,"id":279,"name":"minecraft:element_13"},{"data":4,"id":279,"name":"minecraft:element_13"},{"data":5,"id":279,"name":"minecraft:element_13"},{"data":6,"id":279,"name":"minecraft:element_13"},{"data":7,"id":279,"name":"minecraft:element_13"},{"data":8,"id":279,"name":"minecraft:element_13"},{"data":9,"id":279,"name":"minecraft:element_13"},{"data":10,"id":279,"name":"minecraft:element_13"},{"data":11,"id":279,"name":"minecraft:element_13"},{"data":12,"id":279,"name":"minecraft:element_13"},{"data":13,"id":279,"name":"minecraft:element_13"},{"data":14,"id":279,"name":"minecraft:element_13"},{"data":15,"id":279,"name":"minecraft:element_13"},{"data":0,"id":280,"name":"minecraft:element_14"},{"data":1,"id":280,"name":"minecraft:element_14"},{"data":2,"id":280,"name":"minecraft:element_14"},{"data":3,"id":280,"name":"minecraft:element_14"},{"data":4,"id":280,"name":"minecraft:element_14"},{"data":5,"id":280,"name":"minecraft:element_14"},{"data":6,"id":280,"name":"minecraft:element_14"},{"data":7,"id":280,"name":"minecraft:element_14"},{"data":8,"id":280,"name":"minecraft:element_14"},{"data":9,"id":280,"name":"minecraft:element_14"},{"data":10,"id":280,"name":"minecraft:element_14"},{"data":11,"id":280,"name":"minecraft:element_14"},{"data":12,"id":280,"name":"minecraft:element_14"},{"data":13,"id":280,"name":"minecraft:element_14"},{"data":14,"id":280,"name":"minecraft:element_14"},{"data":15,"id":280,"name":"minecraft:element_14"},{"data":0,"id":281,"name":"minecraft:element_15"},{"data":1,"id":281,"name":"minecraft:element_15"},{"data":2,"id":281,"name":"minecraft:element_15"},{"data":3,"id":281,"name":"minecraft:element_15"},{"data":4,"id":281,"name":"minecraft:element_15"},{"data":5,"id":281,"name":"minecraft:element_15"},{"data":6,"id":281,"name":"minecraft:element_15"},{"data":7,"id":281,"name":"minecraft:element_15"},{"data":8,"id":281,"name":"minecraft:element_15"},{"data":9,"id":281,"name":"minecraft:element_15"},{"data":10,"id":281,"name":"minecraft:element_15"},{"data":11,"id":281,"name":"minecraft:element_15"},{"data":12,"id":281,"name":"minecraft:element_15"},{"data":13,"id":281,"name":"minecraft:element_15"},{"data":14,"id":281,"name":"minecraft:element_15"},{"data":15,"id":281,"name":"minecraft:element_15"},{"data":0,"id":282,"name":"minecraft:element_16"},{"data":1,"id":282,"name":"minecraft:element_16"},{"data":2,"id":282,"name":"minecraft:element_16"},{"data":3,"id":282,"name":"minecraft:element_16"},{"data":4,"id":282,"name":"minecraft:element_16"},{"data":5,"id":282,"name":"minecraft:element_16"},{"data":6,"id":282,"name":"minecraft:element_16"},{"data":7,"id":282,"name":"minecraft:element_16"},{"data":8,"id":282,"name":"minecraft:element_16"},{"data":9,"id":282,"name":"minecraft:element_16"},{"data":10,"id":282,"name":"minecraft:element_16"},{"data":11,"id":282,"name":"minecraft:element_16"},{"data":12,"id":282,"name":"minecraft:element_16"},{"data":13,"id":282,"name":"minecraft:element_16"},{"data":14,"id":282,"name":"minecraft:element_16"},{"data":15,"id":282,"name":"minecraft:element_16"},{"data":0,"id":283,"name":"minecraft:element_17"},{"data":1,"id":283,"name":"minecraft:element_17"},{"data":2,"id":283,"name":"minecraft:element_17"},{"data":3,"id":283,"name":"minecraft:element_17"},{"data":4,"id":283,"name":"minecraft:element_17"},{"data":5,"id":283,"name":"minecraft:element_17"},{"data":6,"id":283,"name":"minecraft:element_17"},{"data":7,"id":283,"name":"minecraft:element_17"},{"data":8,"id":283,"name":"minecraft:element_17"},{"data":9,"id":283,"name":"minecraft:element_17"},{"data":10,"id":283,"name":"minecraft:element_17"},{"data":11,"id":283,"name":"minecraft:element_17"},{"data":12,"id":283,"name":"minecraft:element_17"},{"data":13,"id":283,"name":"minecraft:element_17"},{"data":14,"id":283,"name":"minecraft:element_17"},{"data":15,"id":283,"name":"minecraft:element_17"},{"data":0,"id":284,"name":"minecraft:element_18"},{"data":1,"id":284,"name":"minecraft:element_18"},{"data":2,"id":284,"name":"minecraft:element_18"},{"data":3,"id":284,"name":"minecraft:element_18"},{"data":4,"id":284,"name":"minecraft:element_18"},{"data":5,"id":284,"name":"minecraft:element_18"},{"data":6,"id":284,"name":"minecraft:element_18"},{"data":7,"id":284,"name":"minecraft:element_18"},{"data":8,"id":284,"name":"minecraft:element_18"},{"data":9,"id":284,"name":"minecraft:element_18"},{"data":10,"id":284,"name":"minecraft:element_18"},{"data":11,"id":284,"name":"minecraft:element_18"},{"data":12,"id":284,"name":"minecraft:element_18"},{"data":13,"id":284,"name":"minecraft:element_18"},{"data":14,"id":284,"name":"minecraft:element_18"},{"data":15,"id":284,"name":"minecraft:element_18"},{"data":0,"id":285,"name":"minecraft:element_19"},{"data":1,"id":285,"name":"minecraft:element_19"},{"data":2,"id":285,"name":"minecraft:element_19"},{"data":3,"id":285,"name":"minecraft:element_19"},{"data":4,"id":285,"name":"minecraft:element_19"},{"data":5,"id":285,"name":"minecraft:element_19"},{"data":6,"id":285,"name":"minecraft:element_19"},{"data":7,"id":285,"name":"minecraft:element_19"},{"data":8,"id":285,"name":"minecraft:element_19"},{"data":9,"id":285,"name":"minecraft:element_19"},{"data":10,"id":285,"name":"minecraft:element_19"},{"data":11,"id":285,"name":"minecraft:element_19"},{"data":12,"id":285,"name":"minecraft:element_19"},{"data":13,"id":285,"name":"minecraft:element_19"},{"data":14,"id":285,"name":"minecraft:element_19"},{"data":15,"id":285,"name":"minecraft:element_19"},{"data":0,"id":286,"name":"minecraft:element_20"},{"data":1,"id":286,"name":"minecraft:element_20"},{"data":2,"id":286,"name":"minecraft:element_20"},{"data":3,"id":286,"name":"minecraft:element_20"},{"data":4,"id":286,"name":"minecraft:element_20"},{"data":5,"id":286,"name":"minecraft:element_20"},{"data":6,"id":286,"name":"minecraft:element_20"},{"data":7,"id":286,"name":"minecraft:element_20"},{"data":8,"id":286,"name":"minecraft:element_20"},{"data":9,"id":286,"name":"minecraft:element_20"},{"data":10,"id":286,"name":"minecraft:element_20"},{"data":11,"id":286,"name":"minecraft:element_20"},{"data":12,"id":286,"name":"minecraft:element_20"},{"data":13,"id":286,"name":"minecraft:element_20"},{"data":14,"id":286,"name":"minecraft:element_20"},{"data":15,"id":286,"name":"minecraft:element_20"},{"data":0,"id":287,"name":"minecraft:element_21"},{"data":1,"id":287,"name":"minecraft:element_21"},{"data":2,"id":287,"name":"minecraft:element_21"},{"data":3,"id":287,"name":"minecraft:element_21"},{"data":4,"id":287,"name":"minecraft:element_21"},{"data":5,"id":287,"name":"minecraft:element_21"},{"data":6,"id":287,"name":"minecraft:element_21"},{"data":7,"id":287,"name":"minecraft:element_21"},{"data":8,"id":287,"name":"minecraft:element_21"},{"data":9,"id":287,"name":"minecraft:element_21"},{"data":10,"id":287,"name":"minecraft:element_21"},{"data":11,"id":287,"name":"minecraft:element_21"},{"data":12,"id":287,"name":"minecraft:element_21"},{"data":13,"id":287,"name":"minecraft:element_21"},{"data":14,"id":287,"name":"minecraft:element_21"},{"data":15,"id":287,"name":"minecraft:element_21"},{"data":0,"id":288,"name":"minecraft:element_22"},{"data":1,"id":288,"name":"minecraft:element_22"},{"data":2,"id":288,"name":"minecraft:element_22"},{"data":3,"id":288,"name":"minecraft:element_22"},{"data":4,"id":288,"name":"minecraft:element_22"},{"data":5,"id":288,"name":"minecraft:element_22"},{"data":6,"id":288,"name":"minecraft:element_22"},{"data":7,"id":288,"name":"minecraft:element_22"},{"data":8,"id":288,"name":"minecraft:element_22"},{"data":9,"id":288,"name":"minecraft:element_22"},{"data":10,"id":288,"name":"minecraft:element_22"},{"data":11,"id":288,"name":"minecraft:element_22"},{"data":12,"id":288,"name":"minecraft:element_22"},{"data":13,"id":288,"name":"minecraft:element_22"},{"data":14,"id":288,"name":"minecraft:element_22"},{"data":15,"id":288,"name":"minecraft:element_22"},{"data":0,"id":289,"name":"minecraft:element_23"},{"data":1,"id":289,"name":"minecraft:element_23"},{"data":2,"id":289,"name":"minecraft:element_23"},{"data":3,"id":289,"name":"minecraft:element_23"},{"data":4,"id":289,"name":"minecraft:element_23"},{"data":5,"id":289,"name":"minecraft:element_23"},{"data":6,"id":289,"name":"minecraft:element_23"},{"data":7,"id":289,"name":"minecraft:element_23"},{"data":8,"id":289,"name":"minecraft:element_23"},{"data":9,"id":289,"name":"minecraft:element_23"},{"data":10,"id":289,"name":"minecraft:element_23"},{"data":11,"id":289,"name":"minecraft:element_23"},{"data":12,"id":289,"name":"minecraft:element_23"},{"data":13,"id":289,"name":"minecraft:element_23"},{"data":14,"id":289,"name":"minecraft:element_23"},{"data":15,"id":289,"name":"minecraft:element_23"},{"data":0,"id":290,"name":"minecraft:element_24"},{"data":1,"id":290,"name":"minecraft:element_24"},{"data":2,"id":290,"name":"minecraft:element_24"},{"data":3,"id":290,"name":"minecraft:element_24"},{"data":4,"id":290,"name":"minecraft:element_24"},{"data":5,"id":290,"name":"minecraft:element_24"},{"data":6,"id":290,"name":"minecraft:element_24"},{"data":7,"id":290,"name":"minecraft:element_24"},{"data":8,"id":290,"name":"minecraft:element_24"},{"data":9,"id":290,"name":"minecraft:element_24"},{"data":10,"id":290,"name":"minecraft:element_24"},{"data":11,"id":290,"name":"minecraft:element_24"},{"data":12,"id":290,"name":"minecraft:element_24"},{"data":13,"id":290,"name":"minecraft:element_24"},{"data":14,"id":290,"name":"minecraft:element_24"},{"data":15,"id":290,"name":"minecraft:element_24"},{"data":0,"id":291,"name":"minecraft:element_25"},{"data":1,"id":291,"name":"minecraft:element_25"},{"data":2,"id":291,"name":"minecraft:element_25"},{"data":3,"id":291,"name":"minecraft:element_25"},{"data":4,"id":291,"name":"minecraft:element_25"},{"data":5,"id":291,"name":"minecraft:element_25"},{"data":6,"id":291,"name":"minecraft:element_25"},{"data":7,"id":291,"name":"minecraft:element_25"},{"data":8,"id":291,"name":"minecraft:element_25"},{"data":9,"id":291,"name":"minecraft:element_25"},{"data":10,"id":291,"name":"minecraft:element_25"},{"data":11,"id":291,"name":"minecraft:element_25"},{"data":12,"id":291,"name":"minecraft:element_25"},{"data":13,"id":291,"name":"minecraft:element_25"},{"data":14,"id":291,"name":"minecraft:element_25"},{"data":15,"id":291,"name":"minecraft:element_25"},{"data":0,"id":292,"name":"minecraft:element_26"},{"data":1,"id":292,"name":"minecraft:element_26"},{"data":2,"id":292,"name":"minecraft:element_26"},{"data":3,"id":292,"name":"minecraft:element_26"},{"data":4,"id":292,"name":"minecraft:element_26"},{"data":5,"id":292,"name":"minecraft:element_26"},{"data":6,"id":292,"name":"minecraft:element_26"},{"data":7,"id":292,"name":"minecraft:element_26"},{"data":8,"id":292,"name":"minecraft:element_26"},{"data":9,"id":292,"name":"minecraft:element_26"},{"data":10,"id":292,"name":"minecraft:element_26"},{"data":11,"id":292,"name":"minecraft:element_26"},{"data":12,"id":292,"name":"minecraft:element_26"},{"data":13,"id":292,"name":"minecraft:element_26"},{"data":14,"id":292,"name":"minecraft:element_26"},{"data":15,"id":292,"name":"minecraft:element_26"},{"data":0,"id":293,"name":"minecraft:element_27"},{"data":1,"id":293,"name":"minecraft:element_27"},{"data":2,"id":293,"name":"minecraft:element_27"},{"data":3,"id":293,"name":"minecraft:element_27"},{"data":4,"id":293,"name":"minecraft:element_27"},{"data":5,"id":293,"name":"minecraft:element_27"},{"data":6,"id":293,"name":"minecraft:element_27"},{"data":7,"id":293,"name":"minecraft:element_27"},{"data":8,"id":293,"name":"minecraft:element_27"},{"data":9,"id":293,"name":"minecraft:element_27"},{"data":10,"id":293,"name":"minecraft:element_27"},{"data":11,"id":293,"name":"minecraft:element_27"},{"data":12,"id":293,"name":"minecraft:element_27"},{"data":13,"id":293,"name":"minecraft:element_27"},{"data":14,"id":293,"name":"minecraft:element_27"},{"data":15,"id":293,"name":"minecraft:element_27"},{"data":0,"id":294,"name":"minecraft:element_28"},{"data":1,"id":294,"name":"minecraft:element_28"},{"data":2,"id":294,"name":"minecraft:element_28"},{"data":3,"id":294,"name":"minecraft:element_28"},{"data":4,"id":294,"name":"minecraft:element_28"},{"data":5,"id":294,"name":"minecraft:element_28"},{"data":6,"id":294,"name":"minecraft:element_28"},{"data":7,"id":294,"name":"minecraft:element_28"},{"data":8,"id":294,"name":"minecraft:element_28"},{"data":9,"id":294,"name":"minecraft:element_28"},{"data":10,"id":294,"name":"minecraft:element_28"},{"data":11,"id":294,"name":"minecraft:element_28"},{"data":12,"id":294,"name":"minecraft:element_28"},{"data":13,"id":294,"name":"minecraft:element_28"},{"data":14,"id":294,"name":"minecraft:element_28"},{"data":15,"id":294,"name":"minecraft:element_28"},{"data":0,"id":295,"name":"minecraft:element_29"},{"data":1,"id":295,"name":"minecraft:element_29"},{"data":2,"id":295,"name":"minecraft:element_29"},{"data":3,"id":295,"name":"minecraft:element_29"},{"data":4,"id":295,"name":"minecraft:element_29"},{"data":5,"id":295,"name":"minecraft:element_29"},{"data":6,"id":295,"name":"minecraft:element_29"},{"data":7,"id":295,"name":"minecraft:element_29"},{"data":8,"id":295,"name":"minecraft:element_29"},{"data":9,"id":295,"name":"minecraft:element_29"},{"data":10,"id":295,"name":"minecraft:element_29"},{"data":11,"id":295,"name":"minecraft:element_29"},{"data":12,"id":295,"name":"minecraft:element_29"},{"data":13,"id":295,"name":"minecraft:element_29"},{"data":14,"id":295,"name":"minecraft:element_29"},{"data":15,"id":295,"name":"minecraft:element_29"},{"data":0,"id":296,"name":"minecraft:element_30"},{"data":1,"id":296,"name":"minecraft:element_30"},{"data":2,"id":296,"name":"minecraft:element_30"},{"data":3,"id":296,"name":"minecraft:element_30"},{"data":4,"id":296,"name":"minecraft:element_30"},{"data":5,"id":296,"name":"minecraft:element_30"},{"data":6,"id":296,"name":"minecraft:element_30"},{"data":7,"id":296,"name":"minecraft:element_30"},{"data":8,"id":296,"name":"minecraft:element_30"},{"data":9,"id":296,"name":"minecraft:element_30"},{"data":10,"id":296,"name":"minecraft:element_30"},{"data":11,"id":296,"name":"minecraft:element_30"},{"data":12,"id":296,"name":"minecraft:element_30"},{"data":13,"id":296,"name":"minecraft:element_30"},{"data":14,"id":296,"name":"minecraft:element_30"},{"data":15,"id":296,"name":"minecraft:element_30"},{"data":0,"id":297,"name":"minecraft:element_31"},{"data":1,"id":297,"name":"minecraft:element_31"},{"data":2,"id":297,"name":"minecraft:element_31"},{"data":3,"id":297,"name":"minecraft:element_31"},{"data":4,"id":297,"name":"minecraft:element_31"},{"data":5,"id":297,"name":"minecraft:element_31"},{"data":6,"id":297,"name":"minecraft:element_31"},{"data":7,"id":297,"name":"minecraft:element_31"},{"data":8,"id":297,"name":"minecraft:element_31"},{"data":9,"id":297,"name":"minecraft:element_31"},{"data":10,"id":297,"name":"minecraft:element_31"},{"data":11,"id":297,"name":"minecraft:element_31"},{"data":12,"id":297,"name":"minecraft:element_31"},{"data":13,"id":297,"name":"minecraft:element_31"},{"data":14,"id":297,"name":"minecraft:element_31"},{"data":15,"id":297,"name":"minecraft:element_31"},{"data":0,"id":298,"name":"minecraft:element_32"},{"data":1,"id":298,"name":"minecraft:element_32"},{"data":2,"id":298,"name":"minecraft:element_32"},{"data":3,"id":298,"name":"minecraft:element_32"},{"data":4,"id":298,"name":"minecraft:element_32"},{"data":5,"id":298,"name":"minecraft:element_32"},{"data":6,"id":298,"name":"minecraft:element_32"},{"data":7,"id":298,"name":"minecraft:element_32"},{"data":8,"id":298,"name":"minecraft:element_32"},{"data":9,"id":298,"name":"minecraft:element_32"},{"data":10,"id":298,"name":"minecraft:element_32"},{"data":11,"id":298,"name":"minecraft:element_32"},{"data":12,"id":298,"name":"minecraft:element_32"},{"data":13,"id":298,"name":"minecraft:element_32"},{"data":14,"id":298,"name":"minecraft:element_32"},{"data":15,"id":298,"name":"minecraft:element_32"},{"data":0,"id":299,"name":"minecraft:element_33"},{"data":1,"id":299,"name":"minecraft:element_33"},{"data":2,"id":299,"name":"minecraft:element_33"},{"data":3,"id":299,"name":"minecraft:element_33"},{"data":4,"id":299,"name":"minecraft:element_33"},{"data":5,"id":299,"name":"minecraft:element_33"},{"data":6,"id":299,"name":"minecraft:element_33"},{"data":7,"id":299,"name":"minecraft:element_33"},{"data":8,"id":299,"name":"minecraft:element_33"},{"data":9,"id":299,"name":"minecraft:element_33"},{"data":10,"id":299,"name":"minecraft:element_33"},{"data":11,"id":299,"name":"minecraft:element_33"},{"data":12,"id":299,"name":"minecraft:element_33"},{"data":13,"id":299,"name":"minecraft:element_33"},{"data":14,"id":299,"name":"minecraft:element_33"},{"data":15,"id":299,"name":"minecraft:element_33"},{"data":0,"id":300,"name":"minecraft:element_34"},{"data":1,"id":300,"name":"minecraft:element_34"},{"data":2,"id":300,"name":"minecraft:element_34"},{"data":3,"id":300,"name":"minecraft:element_34"},{"data":4,"id":300,"name":"minecraft:element_34"},{"data":5,"id":300,"name":"minecraft:element_34"},{"data":6,"id":300,"name":"minecraft:element_34"},{"data":7,"id":300,"name":"minecraft:element_34"},{"data":8,"id":300,"name":"minecraft:element_34"},{"data":9,"id":300,"name":"minecraft:element_34"},{"data":10,"id":300,"name":"minecraft:element_34"},{"data":11,"id":300,"name":"minecraft:element_34"},{"data":12,"id":300,"name":"minecraft:element_34"},{"data":13,"id":300,"name":"minecraft:element_34"},{"data":14,"id":300,"name":"minecraft:element_34"},{"data":15,"id":300,"name":"minecraft:element_34"},{"data":0,"id":301,"name":"minecraft:element_35"},{"data":1,"id":301,"name":"minecraft:element_35"},{"data":2,"id":301,"name":"minecraft:element_35"},{"data":3,"id":301,"name":"minecraft:element_35"},{"data":4,"id":301,"name":"minecraft:element_35"},{"data":5,"id":301,"name":"minecraft:element_35"},{"data":6,"id":301,"name":"minecraft:element_35"},{"data":7,"id":301,"name":"minecraft:element_35"},{"data":8,"id":301,"name":"minecraft:element_35"},{"data":9,"id":301,"name":"minecraft:element_35"},{"data":10,"id":301,"name":"minecraft:element_35"},{"data":11,"id":301,"name":"minecraft:element_35"},{"data":12,"id":301,"name":"minecraft:element_35"},{"data":13,"id":301,"name":"minecraft:element_35"},{"data":14,"id":301,"name":"minecraft:element_35"},{"data":15,"id":301,"name":"minecraft:element_35"},{"data":0,"id":302,"name":"minecraft:element_36"},{"data":1,"id":302,"name":"minecraft:element_36"},{"data":2,"id":302,"name":"minecraft:element_36"},{"data":3,"id":302,"name":"minecraft:element_36"},{"data":4,"id":302,"name":"minecraft:element_36"},{"data":5,"id":302,"name":"minecraft:element_36"},{"data":6,"id":302,"name":"minecraft:element_36"},{"data":7,"id":302,"name":"minecraft:element_36"},{"data":8,"id":302,"name":"minecraft:element_36"},{"data":9,"id":302,"name":"minecraft:element_36"},{"data":10,"id":302,"name":"minecraft:element_36"},{"data":11,"id":302,"name":"minecraft:element_36"},{"data":12,"id":302,"name":"minecraft:element_36"},{"data":13,"id":302,"name":"minecraft:element_36"},{"data":14,"id":302,"name":"minecraft:element_36"},{"data":15,"id":302,"name":"minecraft:element_36"},{"data":0,"id":303,"name":"minecraft:element_37"},{"data":1,"id":303,"name":"minecraft:element_37"},{"data":2,"id":303,"name":"minecraft:element_37"},{"data":3,"id":303,"name":"minecraft:element_37"},{"data":4,"id":303,"name":"minecraft:element_37"},{"data":5,"id":303,"name":"minecraft:element_37"},{"data":6,"id":303,"name":"minecraft:element_37"},{"data":7,"id":303,"name":"minecraft:element_37"},{"data":8,"id":303,"name":"minecraft:element_37"},{"data":9,"id":303,"name":"minecraft:element_37"},{"data":10,"id":303,"name":"minecraft:element_37"},{"data":11,"id":303,"name":"minecraft:element_37"},{"data":12,"id":303,"name":"minecraft:element_37"},{"data":13,"id":303,"name":"minecraft:element_37"},{"data":14,"id":303,"name":"minecraft:element_37"},{"data":15,"id":303,"name":"minecraft:element_37"},{"data":0,"id":304,"name":"minecraft:element_38"},{"data":1,"id":304,"name":"minecraft:element_38"},{"data":2,"id":304,"name":"minecraft:element_38"},{"data":3,"id":304,"name":"minecraft:element_38"},{"data":4,"id":304,"name":"minecraft:element_38"},{"data":5,"id":304,"name":"minecraft:element_38"},{"data":6,"id":304,"name":"minecraft:element_38"},{"data":7,"id":304,"name":"minecraft:element_38"},{"data":8,"id":304,"name":"minecraft:element_38"},{"data":9,"id":304,"name":"minecraft:element_38"},{"data":10,"id":304,"name":"minecraft:element_38"},{"data":11,"id":304,"name":"minecraft:element_38"},{"data":12,"id":304,"name":"minecraft:element_38"},{"data":13,"id":304,"name":"minecraft:element_38"},{"data":14,"id":304,"name":"minecraft:element_38"},{"data":15,"id":304,"name":"minecraft:element_38"},{"data":0,"id":305,"name":"minecraft:element_39"},{"data":1,"id":305,"name":"minecraft:element_39"},{"data":2,"id":305,"name":"minecraft:element_39"},{"data":3,"id":305,"name":"minecraft:element_39"},{"data":4,"id":305,"name":"minecraft:element_39"},{"data":5,"id":305,"name":"minecraft:element_39"},{"data":6,"id":305,"name":"minecraft:element_39"},{"data":7,"id":305,"name":"minecraft:element_39"},{"data":8,"id":305,"name":"minecraft:element_39"},{"data":9,"id":305,"name":"minecraft:element_39"},{"data":10,"id":305,"name":"minecraft:element_39"},{"data":11,"id":305,"name":"minecraft:element_39"},{"data":12,"id":305,"name":"minecraft:element_39"},{"data":13,"id":305,"name":"minecraft:element_39"},{"data":14,"id":305,"name":"minecraft:element_39"},{"data":15,"id":305,"name":"minecraft:element_39"},{"data":0,"id":306,"name":"minecraft:element_40"},{"data":1,"id":306,"name":"minecraft:element_40"},{"data":2,"id":306,"name":"minecraft:element_40"},{"data":3,"id":306,"name":"minecraft:element_40"},{"data":4,"id":306,"name":"minecraft:element_40"},{"data":5,"id":306,"name":"minecraft:element_40"},{"data":6,"id":306,"name":"minecraft:element_40"},{"data":7,"id":306,"name":"minecraft:element_40"},{"data":8,"id":306,"name":"minecraft:element_40"},{"data":9,"id":306,"name":"minecraft:element_40"},{"data":10,"id":306,"name":"minecraft:element_40"},{"data":11,"id":306,"name":"minecraft:element_40"},{"data":12,"id":306,"name":"minecraft:element_40"},{"data":13,"id":306,"name":"minecraft:element_40"},{"data":14,"id":306,"name":"minecraft:element_40"},{"data":15,"id":306,"name":"minecraft:element_40"},{"data":0,"id":307,"name":"minecraft:element_41"},{"data":1,"id":307,"name":"minecraft:element_41"},{"data":2,"id":307,"name":"minecraft:element_41"},{"data":3,"id":307,"name":"minecraft:element_41"},{"data":4,"id":307,"name":"minecraft:element_41"},{"data":5,"id":307,"name":"minecraft:element_41"},{"data":6,"id":307,"name":"minecraft:element_41"},{"data":7,"id":307,"name":"minecraft:element_41"},{"data":8,"id":307,"name":"minecraft:element_41"},{"data":9,"id":307,"name":"minecraft:element_41"},{"data":10,"id":307,"name":"minecraft:element_41"},{"data":11,"id":307,"name":"minecraft:element_41"},{"data":12,"id":307,"name":"minecraft:element_41"},{"data":13,"id":307,"name":"minecraft:element_41"},{"data":14,"id":307,"name":"minecraft:element_41"},{"data":15,"id":307,"name":"minecraft:element_41"},{"data":0,"id":308,"name":"minecraft:element_42"},{"data":1,"id":308,"name":"minecraft:element_42"},{"data":2,"id":308,"name":"minecraft:element_42"},{"data":3,"id":308,"name":"minecraft:element_42"},{"data":4,"id":308,"name":"minecraft:element_42"},{"data":5,"id":308,"name":"minecraft:element_42"},{"data":6,"id":308,"name":"minecraft:element_42"},{"data":7,"id":308,"name":"minecraft:element_42"},{"data":8,"id":308,"name":"minecraft:element_42"},{"data":9,"id":308,"name":"minecraft:element_42"},{"data":10,"id":308,"name":"minecraft:element_42"},{"data":11,"id":308,"name":"minecraft:element_42"},{"data":12,"id":308,"name":"minecraft:element_42"},{"data":13,"id":308,"name":"minecraft:element_42"},{"data":14,"id":308,"name":"minecraft:element_42"},{"data":15,"id":308,"name":"minecraft:element_42"},{"data":0,"id":309,"name":"minecraft:element_43"},{"data":1,"id":309,"name":"minecraft:element_43"},{"data":2,"id":309,"name":"minecraft:element_43"},{"data":3,"id":309,"name":"minecraft:element_43"},{"data":4,"id":309,"name":"minecraft:element_43"},{"data":5,"id":309,"name":"minecraft:element_43"},{"data":6,"id":309,"name":"minecraft:element_43"},{"data":7,"id":309,"name":"minecraft:element_43"},{"data":8,"id":309,"name":"minecraft:element_43"},{"data":9,"id":309,"name":"minecraft:element_43"},{"data":10,"id":309,"name":"minecraft:element_43"},{"data":11,"id":309,"name":"minecraft:element_43"},{"data":12,"id":309,"name":"minecraft:element_43"},{"data":13,"id":309,"name":"minecraft:element_43"},{"data":14,"id":309,"name":"minecraft:element_43"},{"data":15,"id":309,"name":"minecraft:element_43"},{"data":0,"id":310,"name":"minecraft:element_44"},{"data":1,"id":310,"name":"minecraft:element_44"},{"data":2,"id":310,"name":"minecraft:element_44"},{"data":3,"id":310,"name":"minecraft:element_44"},{"data":4,"id":310,"name":"minecraft:element_44"},{"data":5,"id":310,"name":"minecraft:element_44"},{"data":6,"id":310,"name":"minecraft:element_44"},{"data":7,"id":310,"name":"minecraft:element_44"},{"data":8,"id":310,"name":"minecraft:element_44"},{"data":9,"id":310,"name":"minecraft:element_44"},{"data":10,"id":310,"name":"minecraft:element_44"},{"data":11,"id":310,"name":"minecraft:element_44"},{"data":12,"id":310,"name":"minecraft:element_44"},{"data":13,"id":310,"name":"minecraft:element_44"},{"data":14,"id":310,"name":"minecraft:element_44"},{"data":15,"id":310,"name":"minecraft:element_44"},{"data":0,"id":311,"name":"minecraft:element_45"},{"data":1,"id":311,"name":"minecraft:element_45"},{"data":2,"id":311,"name":"minecraft:element_45"},{"data":3,"id":311,"name":"minecraft:element_45"},{"data":4,"id":311,"name":"minecraft:element_45"},{"data":5,"id":311,"name":"minecraft:element_45"},{"data":6,"id":311,"name":"minecraft:element_45"},{"data":7,"id":311,"name":"minecraft:element_45"},{"data":8,"id":311,"name":"minecraft:element_45"},{"data":9,"id":311,"name":"minecraft:element_45"},{"data":10,"id":311,"name":"minecraft:element_45"},{"data":11,"id":311,"name":"minecraft:element_45"},{"data":12,"id":311,"name":"minecraft:element_45"},{"data":13,"id":311,"name":"minecraft:element_45"},{"data":14,"id":311,"name":"minecraft:element_45"},{"data":15,"id":311,"name":"minecraft:element_45"},{"data":0,"id":312,"name":"minecraft:element_46"},{"data":1,"id":312,"name":"minecraft:element_46"},{"data":2,"id":312,"name":"minecraft:element_46"},{"data":3,"id":312,"name":"minecraft:element_46"},{"data":4,"id":312,"name":"minecraft:element_46"},{"data":5,"id":312,"name":"minecraft:element_46"},{"data":6,"id":312,"name":"minecraft:element_46"},{"data":7,"id":312,"name":"minecraft:element_46"},{"data":8,"id":312,"name":"minecraft:element_46"},{"data":9,"id":312,"name":"minecraft:element_46"},{"data":10,"id":312,"name":"minecraft:element_46"},{"data":11,"id":312,"name":"minecraft:element_46"},{"data":12,"id":312,"name":"minecraft:element_46"},{"data":13,"id":312,"name":"minecraft:element_46"},{"data":14,"id":312,"name":"minecraft:element_46"},{"data":15,"id":312,"name":"minecraft:element_46"},{"data":0,"id":313,"name":"minecraft:element_47"},{"data":1,"id":313,"name":"minecraft:element_47"},{"data":2,"id":313,"name":"minecraft:element_47"},{"data":3,"id":313,"name":"minecraft:element_47"},{"data":4,"id":313,"name":"minecraft:element_47"},{"data":5,"id":313,"name":"minecraft:element_47"},{"data":6,"id":313,"name":"minecraft:element_47"},{"data":7,"id":313,"name":"minecraft:element_47"},{"data":8,"id":313,"name":"minecraft:element_47"},{"data":9,"id":313,"name":"minecraft:element_47"},{"data":10,"id":313,"name":"minecraft:element_47"},{"data":11,"id":313,"name":"minecraft:element_47"},{"data":12,"id":313,"name":"minecraft:element_47"},{"data":13,"id":313,"name":"minecraft:element_47"},{"data":14,"id":313,"name":"minecraft:element_47"},{"data":15,"id":313,"name":"minecraft:element_47"},{"data":0,"id":314,"name":"minecraft:element_48"},{"data":1,"id":314,"name":"minecraft:element_48"},{"data":2,"id":314,"name":"minecraft:element_48"},{"data":3,"id":314,"name":"minecraft:element_48"},{"data":4,"id":314,"name":"minecraft:element_48"},{"data":5,"id":314,"name":"minecraft:element_48"},{"data":6,"id":314,"name":"minecraft:element_48"},{"data":7,"id":314,"name":"minecraft:element_48"},{"data":8,"id":314,"name":"minecraft:element_48"},{"data":9,"id":314,"name":"minecraft:element_48"},{"data":10,"id":314,"name":"minecraft:element_48"},{"data":11,"id":314,"name":"minecraft:element_48"},{"data":12,"id":314,"name":"minecraft:element_48"},{"data":13,"id":314,"name":"minecraft:element_48"},{"data":14,"id":314,"name":"minecraft:element_48"},{"data":15,"id":314,"name":"minecraft:element_48"},{"data":0,"id":315,"name":"minecraft:element_49"},{"data":1,"id":315,"name":"minecraft:element_49"},{"data":2,"id":315,"name":"minecraft:element_49"},{"data":3,"id":315,"name":"minecraft:element_49"},{"data":4,"id":315,"name":"minecraft:element_49"},{"data":5,"id":315,"name":"minecraft:element_49"},{"data":6,"id":315,"name":"minecraft:element_49"},{"data":7,"id":315,"name":"minecraft:element_49"},{"data":8,"id":315,"name":"minecraft:element_49"},{"data":9,"id":315,"name":"minecraft:element_49"},{"data":10,"id":315,"name":"minecraft:element_49"},{"data":11,"id":315,"name":"minecraft:element_49"},{"data":12,"id":315,"name":"minecraft:element_49"},{"data":13,"id":315,"name":"minecraft:element_49"},{"data":14,"id":315,"name":"minecraft:element_49"},{"data":15,"id":315,"name":"minecraft:element_49"},{"data":0,"id":316,"name":"minecraft:element_50"},{"data":1,"id":316,"name":"minecraft:element_50"},{"data":2,"id":316,"name":"minecraft:element_50"},{"data":3,"id":316,"name":"minecraft:element_50"},{"data":4,"id":316,"name":"minecraft:element_50"},{"data":5,"id":316,"name":"minecraft:element_50"},{"data":6,"id":316,"name":"minecraft:element_50"},{"data":7,"id":316,"name":"minecraft:element_50"},{"data":8,"id":316,"name":"minecraft:element_50"},{"data":9,"id":316,"name":"minecraft:element_50"},{"data":10,"id":316,"name":"minecraft:element_50"},{"data":11,"id":316,"name":"minecraft:element_50"},{"data":12,"id":316,"name":"minecraft:element_50"},{"data":13,"id":316,"name":"minecraft:element_50"},{"data":14,"id":316,"name":"minecraft:element_50"},{"data":15,"id":316,"name":"minecraft:element_50"},{"data":0,"id":317,"name":"minecraft:element_51"},{"data":1,"id":317,"name":"minecraft:element_51"},{"data":2,"id":317,"name":"minecraft:element_51"},{"data":3,"id":317,"name":"minecraft:element_51"},{"data":4,"id":317,"name":"minecraft:element_51"},{"data":5,"id":317,"name":"minecraft:element_51"},{"data":6,"id":317,"name":"minecraft:element_51"},{"data":7,"id":317,"name":"minecraft:element_51"},{"data":8,"id":317,"name":"minecraft:element_51"},{"data":9,"id":317,"name":"minecraft:element_51"},{"data":10,"id":317,"name":"minecraft:element_51"},{"data":11,"id":317,"name":"minecraft:element_51"},{"data":12,"id":317,"name":"minecraft:element_51"},{"data":13,"id":317,"name":"minecraft:element_51"},{"data":14,"id":317,"name":"minecraft:element_51"},{"data":15,"id":317,"name":"minecraft:element_51"},{"data":0,"id":318,"name":"minecraft:element_52"},{"data":1,"id":318,"name":"minecraft:element_52"},{"data":2,"id":318,"name":"minecraft:element_52"},{"data":3,"id":318,"name":"minecraft:element_52"},{"data":4,"id":318,"name":"minecraft:element_52"},{"data":5,"id":318,"name":"minecraft:element_52"},{"data":6,"id":318,"name":"minecraft:element_52"},{"data":7,"id":318,"name":"minecraft:element_52"},{"data":8,"id":318,"name":"minecraft:element_52"},{"data":9,"id":318,"name":"minecraft:element_52"},{"data":10,"id":318,"name":"minecraft:element_52"},{"data":11,"id":318,"name":"minecraft:element_52"},{"data":12,"id":318,"name":"minecraft:element_52"},{"data":13,"id":318,"name":"minecraft:element_52"},{"data":14,"id":318,"name":"minecraft:element_52"},{"data":15,"id":318,"name":"minecraft:element_52"},{"data":0,"id":319,"name":"minecraft:element_53"},{"data":1,"id":319,"name":"minecraft:element_53"},{"data":2,"id":319,"name":"minecraft:element_53"},{"data":3,"id":319,"name":"minecraft:element_53"},{"data":4,"id":319,"name":"minecraft:element_53"},{"data":5,"id":319,"name":"minecraft:element_53"},{"data":6,"id":319,"name":"minecraft:element_53"},{"data":7,"id":319,"name":"minecraft:element_53"},{"data":8,"id":319,"name":"minecraft:element_53"},{"data":9,"id":319,"name":"minecraft:element_53"},{"data":10,"id":319,"name":"minecraft:element_53"},{"data":11,"id":319,"name":"minecraft:element_53"},{"data":12,"id":319,"name":"minecraft:element_53"},{"data":13,"id":319,"name":"minecraft:element_53"},{"data":14,"id":319,"name":"minecraft:element_53"},{"data":15,"id":319,"name":"minecraft:element_53"},{"data":0,"id":320,"name":"minecraft:element_54"},{"data":1,"id":320,"name":"minecraft:element_54"},{"data":2,"id":320,"name":"minecraft:element_54"},{"data":3,"id":320,"name":"minecraft:element_54"},{"data":4,"id":320,"name":"minecraft:element_54"},{"data":5,"id":320,"name":"minecraft:element_54"},{"data":6,"id":320,"name":"minecraft:element_54"},{"data":7,"id":320,"name":"minecraft:element_54"},{"data":8,"id":320,"name":"minecraft:element_54"},{"data":9,"id":320,"name":"minecraft:element_54"},{"data":10,"id":320,"name":"minecraft:element_54"},{"data":11,"id":320,"name":"minecraft:element_54"},{"data":12,"id":320,"name":"minecraft:element_54"},{"data":13,"id":320,"name":"minecraft:element_54"},{"data":14,"id":320,"name":"minecraft:element_54"},{"data":15,"id":320,"name":"minecraft:element_54"},{"data":0,"id":321,"name":"minecraft:element_55"},{"data":1,"id":321,"name":"minecraft:element_55"},{"data":2,"id":321,"name":"minecraft:element_55"},{"data":3,"id":321,"name":"minecraft:element_55"},{"data":4,"id":321,"name":"minecraft:element_55"},{"data":5,"id":321,"name":"minecraft:element_55"},{"data":6,"id":321,"name":"minecraft:element_55"},{"data":7,"id":321,"name":"minecraft:element_55"},{"data":8,"id":321,"name":"minecraft:element_55"},{"data":9,"id":321,"name":"minecraft:element_55"},{"data":10,"id":321,"name":"minecraft:element_55"},{"data":11,"id":321,"name":"minecraft:element_55"},{"data":12,"id":321,"name":"minecraft:element_55"},{"data":13,"id":321,"name":"minecraft:element_55"},{"data":14,"id":321,"name":"minecraft:element_55"},{"data":15,"id":321,"name":"minecraft:element_55"},{"data":0,"id":322,"name":"minecraft:element_56"},{"data":1,"id":322,"name":"minecraft:element_56"},{"data":2,"id":322,"name":"minecraft:element_56"},{"data":3,"id":322,"name":"minecraft:element_56"},{"data":4,"id":322,"name":"minecraft:element_56"},{"data":5,"id":322,"name":"minecraft:element_56"},{"data":6,"id":322,"name":"minecraft:element_56"},{"data":7,"id":322,"name":"minecraft:element_56"},{"data":8,"id":322,"name":"minecraft:element_56"},{"data":9,"id":322,"name":"minecraft:element_56"},{"data":10,"id":322,"name":"minecraft:element_56"},{"data":11,"id":322,"name":"minecraft:element_56"},{"data":12,"id":322,"name":"minecraft:element_56"},{"data":13,"id":322,"name":"minecraft:element_56"},{"data":14,"id":322,"name":"minecraft:element_56"},{"data":15,"id":322,"name":"minecraft:element_56"},{"data":0,"id":323,"name":"minecraft:element_57"},{"data":1,"id":323,"name":"minecraft:element_57"},{"data":2,"id":323,"name":"minecraft:element_57"},{"data":3,"id":323,"name":"minecraft:element_57"},{"data":4,"id":323,"name":"minecraft:element_57"},{"data":5,"id":323,"name":"minecraft:element_57"},{"data":6,"id":323,"name":"minecraft:element_57"},{"data":7,"id":323,"name":"minecraft:element_57"},{"data":8,"id":323,"name":"minecraft:element_57"},{"data":9,"id":323,"name":"minecraft:element_57"},{"data":10,"id":323,"name":"minecraft:element_57"},{"data":11,"id":323,"name":"minecraft:element_57"},{"data":12,"id":323,"name":"minecraft:element_57"},{"data":13,"id":323,"name":"minecraft:element_57"},{"data":14,"id":323,"name":"minecraft:element_57"},{"data":15,"id":323,"name":"minecraft:element_57"},{"data":0,"id":324,"name":"minecraft:element_58"},{"data":1,"id":324,"name":"minecraft:element_58"},{"data":2,"id":324,"name":"minecraft:element_58"},{"data":3,"id":324,"name":"minecraft:element_58"},{"data":4,"id":324,"name":"minecraft:element_58"},{"data":5,"id":324,"name":"minecraft:element_58"},{"data":6,"id":324,"name":"minecraft:element_58"},{"data":7,"id":324,"name":"minecraft:element_58"},{"data":8,"id":324,"name":"minecraft:element_58"},{"data":9,"id":324,"name":"minecraft:element_58"},{"data":10,"id":324,"name":"minecraft:element_58"},{"data":11,"id":324,"name":"minecraft:element_58"},{"data":12,"id":324,"name":"minecraft:element_58"},{"data":13,"id":324,"name":"minecraft:element_58"},{"data":14,"id":324,"name":"minecraft:element_58"},{"data":15,"id":324,"name":"minecraft:element_58"},{"data":0,"id":325,"name":"minecraft:element_59"},{"data":1,"id":325,"name":"minecraft:element_59"},{"data":2,"id":325,"name":"minecraft:element_59"},{"data":3,"id":325,"name":"minecraft:element_59"},{"data":4,"id":325,"name":"minecraft:element_59"},{"data":5,"id":325,"name":"minecraft:element_59"},{"data":6,"id":325,"name":"minecraft:element_59"},{"data":7,"id":325,"name":"minecraft:element_59"},{"data":8,"id":325,"name":"minecraft:element_59"},{"data":9,"id":325,"name":"minecraft:element_59"},{"data":10,"id":325,"name":"minecraft:element_59"},{"data":11,"id":325,"name":"minecraft:element_59"},{"data":12,"id":325,"name":"minecraft:element_59"},{"data":13,"id":325,"name":"minecraft:element_59"},{"data":14,"id":325,"name":"minecraft:element_59"},{"data":15,"id":325,"name":"minecraft:element_59"},{"data":0,"id":326,"name":"minecraft:element_60"},{"data":1,"id":326,"name":"minecraft:element_60"},{"data":2,"id":326,"name":"minecraft:element_60"},{"data":3,"id":326,"name":"minecraft:element_60"},{"data":4,"id":326,"name":"minecraft:element_60"},{"data":5,"id":326,"name":"minecraft:element_60"},{"data":6,"id":326,"name":"minecraft:element_60"},{"data":7,"id":326,"name":"minecraft:element_60"},{"data":8,"id":326,"name":"minecraft:element_60"},{"data":9,"id":326,"name":"minecraft:element_60"},{"data":10,"id":326,"name":"minecraft:element_60"},{"data":11,"id":326,"name":"minecraft:element_60"},{"data":12,"id":326,"name":"minecraft:element_60"},{"data":13,"id":326,"name":"minecraft:element_60"},{"data":14,"id":326,"name":"minecraft:element_60"},{"data":15,"id":326,"name":"minecraft:element_60"},{"data":0,"id":327,"name":"minecraft:element_61"},{"data":1,"id":327,"name":"minecraft:element_61"},{"data":2,"id":327,"name":"minecraft:element_61"},{"data":3,"id":327,"name":"minecraft:element_61"},{"data":4,"id":327,"name":"minecraft:element_61"},{"data":5,"id":327,"name":"minecraft:element_61"},{"data":6,"id":327,"name":"minecraft:element_61"},{"data":7,"id":327,"name":"minecraft:element_61"},{"data":8,"id":327,"name":"minecraft:element_61"},{"data":9,"id":327,"name":"minecraft:element_61"},{"data":10,"id":327,"name":"minecraft:element_61"},{"data":11,"id":327,"name":"minecraft:element_61"},{"data":12,"id":327,"name":"minecraft:element_61"},{"data":13,"id":327,"name":"minecraft:element_61"},{"data":14,"id":327,"name":"minecraft:element_61"},{"data":15,"id":327,"name":"minecraft:element_61"},{"data":0,"id":328,"name":"minecraft:element_62"},{"data":1,"id":328,"name":"minecraft:element_62"},{"data":2,"id":328,"name":"minecraft:element_62"},{"data":3,"id":328,"name":"minecraft:element_62"},{"data":4,"id":328,"name":"minecraft:element_62"},{"data":5,"id":328,"name":"minecraft:element_62"},{"data":6,"id":328,"name":"minecraft:element_62"},{"data":7,"id":328,"name":"minecraft:element_62"},{"data":8,"id":328,"name":"minecraft:element_62"},{"data":9,"id":328,"name":"minecraft:element_62"},{"data":10,"id":328,"name":"minecraft:element_62"},{"data":11,"id":328,"name":"minecraft:element_62"},{"data":12,"id":328,"name":"minecraft:element_62"},{"data":13,"id":328,"name":"minecraft:element_62"},{"data":14,"id":328,"name":"minecraft:element_62"},{"data":15,"id":328,"name":"minecraft:element_62"},{"data":0,"id":329,"name":"minecraft:element_63"},{"data":1,"id":329,"name":"minecraft:element_63"},{"data":2,"id":329,"name":"minecraft:element_63"},{"data":3,"id":329,"name":"minecraft:element_63"},{"data":4,"id":329,"name":"minecraft:element_63"},{"data":5,"id":329,"name":"minecraft:element_63"},{"data":6,"id":329,"name":"minecraft:element_63"},{"data":7,"id":329,"name":"minecraft:element_63"},{"data":8,"id":329,"name":"minecraft:element_63"},{"data":9,"id":329,"name":"minecraft:element_63"},{"data":10,"id":329,"name":"minecraft:element_63"},{"data":11,"id":329,"name":"minecraft:element_63"},{"data":12,"id":329,"name":"minecraft:element_63"},{"data":13,"id":329,"name":"minecraft:element_63"},{"data":14,"id":329,"name":"minecraft:element_63"},{"data":15,"id":329,"name":"minecraft:element_63"},{"data":0,"id":330,"name":"minecraft:element_64"},{"data":1,"id":330,"name":"minecraft:element_64"},{"data":2,"id":330,"name":"minecraft:element_64"},{"data":3,"id":330,"name":"minecraft:element_64"},{"data":4,"id":330,"name":"minecraft:element_64"},{"data":5,"id":330,"name":"minecraft:element_64"},{"data":6,"id":330,"name":"minecraft:element_64"},{"data":7,"id":330,"name":"minecraft:element_64"},{"data":8,"id":330,"name":"minecraft:element_64"},{"data":9,"id":330,"name":"minecraft:element_64"},{"data":10,"id":330,"name":"minecraft:element_64"},{"data":11,"id":330,"name":"minecraft:element_64"},{"data":12,"id":330,"name":"minecraft:element_64"},{"data":13,"id":330,"name":"minecraft:element_64"},{"data":14,"id":330,"name":"minecraft:element_64"},{"data":15,"id":330,"name":"minecraft:element_64"},{"data":0,"id":331,"name":"minecraft:element_65"},{"data":1,"id":331,"name":"minecraft:element_65"},{"data":2,"id":331,"name":"minecraft:element_65"},{"data":3,"id":331,"name":"minecraft:element_65"},{"data":4,"id":331,"name":"minecraft:element_65"},{"data":5,"id":331,"name":"minecraft:element_65"},{"data":6,"id":331,"name":"minecraft:element_65"},{"data":7,"id":331,"name":"minecraft:element_65"},{"data":8,"id":331,"name":"minecraft:element_65"},{"data":9,"id":331,"name":"minecraft:element_65"},{"data":10,"id":331,"name":"minecraft:element_65"},{"data":11,"id":331,"name":"minecraft:element_65"},{"data":12,"id":331,"name":"minecraft:element_65"},{"data":13,"id":331,"name":"minecraft:element_65"},{"data":14,"id":331,"name":"minecraft:element_65"},{"data":15,"id":331,"name":"minecraft:element_65"},{"data":0,"id":332,"name":"minecraft:element_66"},{"data":1,"id":332,"name":"minecraft:element_66"},{"data":2,"id":332,"name":"minecraft:element_66"},{"data":3,"id":332,"name":"minecraft:element_66"},{"data":4,"id":332,"name":"minecraft:element_66"},{"data":5,"id":332,"name":"minecraft:element_66"},{"data":6,"id":332,"name":"minecraft:element_66"},{"data":7,"id":332,"name":"minecraft:element_66"},{"data":8,"id":332,"name":"minecraft:element_66"},{"data":9,"id":332,"name":"minecraft:element_66"},{"data":10,"id":332,"name":"minecraft:element_66"},{"data":11,"id":332,"name":"minecraft:element_66"},{"data":12,"id":332,"name":"minecraft:element_66"},{"data":13,"id":332,"name":"minecraft:element_66"},{"data":14,"id":332,"name":"minecraft:element_66"},{"data":15,"id":332,"name":"minecraft:element_66"},{"data":0,"id":333,"name":"minecraft:element_67"},{"data":1,"id":333,"name":"minecraft:element_67"},{"data":2,"id":333,"name":"minecraft:element_67"},{"data":3,"id":333,"name":"minecraft:element_67"},{"data":4,"id":333,"name":"minecraft:element_67"},{"data":5,"id":333,"name":"minecraft:element_67"},{"data":6,"id":333,"name":"minecraft:element_67"},{"data":7,"id":333,"name":"minecraft:element_67"},{"data":8,"id":333,"name":"minecraft:element_67"},{"data":9,"id":333,"name":"minecraft:element_67"},{"data":10,"id":333,"name":"minecraft:element_67"},{"data":11,"id":333,"name":"minecraft:element_67"},{"data":12,"id":333,"name":"minecraft:element_67"},{"data":13,"id":333,"name":"minecraft:element_67"},{"data":14,"id":333,"name":"minecraft:element_67"},{"data":15,"id":333,"name":"minecraft:element_67"},{"data":0,"id":334,"name":"minecraft:element_68"},{"data":1,"id":334,"name":"minecraft:element_68"},{"data":2,"id":334,"name":"minecraft:element_68"},{"data":3,"id":334,"name":"minecraft:element_68"},{"data":4,"id":334,"name":"minecraft:element_68"},{"data":5,"id":334,"name":"minecraft:element_68"},{"data":6,"id":334,"name":"minecraft:element_68"},{"data":7,"id":334,"name":"minecraft:element_68"},{"data":8,"id":334,"name":"minecraft:element_68"},{"data":9,"id":334,"name":"minecraft:element_68"},{"data":10,"id":334,"name":"minecraft:element_68"},{"data":11,"id":334,"name":"minecraft:element_68"},{"data":12,"id":334,"name":"minecraft:element_68"},{"data":13,"id":334,"name":"minecraft:element_68"},{"data":14,"id":334,"name":"minecraft:element_68"},{"data":15,"id":334,"name":"minecraft:element_68"},{"data":0,"id":335,"name":"minecraft:element_69"},{"data":1,"id":335,"name":"minecraft:element_69"},{"data":2,"id":335,"name":"minecraft:element_69"},{"data":3,"id":335,"name":"minecraft:element_69"},{"data":4,"id":335,"name":"minecraft:element_69"},{"data":5,"id":335,"name":"minecraft:element_69"},{"data":6,"id":335,"name":"minecraft:element_69"},{"data":7,"id":335,"name":"minecraft:element_69"},{"data":8,"id":335,"name":"minecraft:element_69"},{"data":9,"id":335,"name":"minecraft:element_69"},{"data":10,"id":335,"name":"minecraft:element_69"},{"data":11,"id":335,"name":"minecraft:element_69"},{"data":12,"id":335,"name":"minecraft:element_69"},{"data":13,"id":335,"name":"minecraft:element_69"},{"data":14,"id":335,"name":"minecraft:element_69"},{"data":15,"id":335,"name":"minecraft:element_69"},{"data":0,"id":336,"name":"minecraft:element_70"},{"data":1,"id":336,"name":"minecraft:element_70"},{"data":2,"id":336,"name":"minecraft:element_70"},{"data":3,"id":336,"name":"minecraft:element_70"},{"data":4,"id":336,"name":"minecraft:element_70"},{"data":5,"id":336,"name":"minecraft:element_70"},{"data":6,"id":336,"name":"minecraft:element_70"},{"data":7,"id":336,"name":"minecraft:element_70"},{"data":8,"id":336,"name":"minecraft:element_70"},{"data":9,"id":336,"name":"minecraft:element_70"},{"data":10,"id":336,"name":"minecraft:element_70"},{"data":11,"id":336,"name":"minecraft:element_70"},{"data":12,"id":336,"name":"minecraft:element_70"},{"data":13,"id":336,"name":"minecraft:element_70"},{"data":14,"id":336,"name":"minecraft:element_70"},{"data":15,"id":336,"name":"minecraft:element_70"},{"data":0,"id":337,"name":"minecraft:element_71"},{"data":1,"id":337,"name":"minecraft:element_71"},{"data":2,"id":337,"name":"minecraft:element_71"},{"data":3,"id":337,"name":"minecraft:element_71"},{"data":4,"id":337,"name":"minecraft:element_71"},{"data":5,"id":337,"name":"minecraft:element_71"},{"data":6,"id":337,"name":"minecraft:element_71"},{"data":7,"id":337,"name":"minecraft:element_71"},{"data":8,"id":337,"name":"minecraft:element_71"},{"data":9,"id":337,"name":"minecraft:element_71"},{"data":10,"id":337,"name":"minecraft:element_71"},{"data":11,"id":337,"name":"minecraft:element_71"},{"data":12,"id":337,"name":"minecraft:element_71"},{"data":13,"id":337,"name":"minecraft:element_71"},{"data":14,"id":337,"name":"minecraft:element_71"},{"data":15,"id":337,"name":"minecraft:element_71"},{"data":0,"id":338,"name":"minecraft:element_72"},{"data":1,"id":338,"name":"minecraft:element_72"},{"data":2,"id":338,"name":"minecraft:element_72"},{"data":3,"id":338,"name":"minecraft:element_72"},{"data":4,"id":338,"name":"minecraft:element_72"},{"data":5,"id":338,"name":"minecraft:element_72"},{"data":6,"id":338,"name":"minecraft:element_72"},{"data":7,"id":338,"name":"minecraft:element_72"},{"data":8,"id":338,"name":"minecraft:element_72"},{"data":9,"id":338,"name":"minecraft:element_72"},{"data":10,"id":338,"name":"minecraft:element_72"},{"data":11,"id":338,"name":"minecraft:element_72"},{"data":12,"id":338,"name":"minecraft:element_72"},{"data":13,"id":338,"name":"minecraft:element_72"},{"data":14,"id":338,"name":"minecraft:element_72"},{"data":15,"id":338,"name":"minecraft:element_72"},{"data":0,"id":339,"name":"minecraft:element_73"},{"data":1,"id":339,"name":"minecraft:element_73"},{"data":2,"id":339,"name":"minecraft:element_73"},{"data":3,"id":339,"name":"minecraft:element_73"},{"data":4,"id":339,"name":"minecraft:element_73"},{"data":5,"id":339,"name":"minecraft:element_73"},{"data":6,"id":339,"name":"minecraft:element_73"},{"data":7,"id":339,"name":"minecraft:element_73"},{"data":8,"id":339,"name":"minecraft:element_73"},{"data":9,"id":339,"name":"minecraft:element_73"},{"data":10,"id":339,"name":"minecraft:element_73"},{"data":11,"id":339,"name":"minecraft:element_73"},{"data":12,"id":339,"name":"minecraft:element_73"},{"data":13,"id":339,"name":"minecraft:element_73"},{"data":14,"id":339,"name":"minecraft:element_73"},{"data":15,"id":339,"name":"minecraft:element_73"},{"data":0,"id":340,"name":"minecraft:element_74"},{"data":1,"id":340,"name":"minecraft:element_74"},{"data":2,"id":340,"name":"minecraft:element_74"},{"data":3,"id":340,"name":"minecraft:element_74"},{"data":4,"id":340,"name":"minecraft:element_74"},{"data":5,"id":340,"name":"minecraft:element_74"},{"data":6,"id":340,"name":"minecraft:element_74"},{"data":7,"id":340,"name":"minecraft:element_74"},{"data":8,"id":340,"name":"minecraft:element_74"},{"data":9,"id":340,"name":"minecraft:element_74"},{"data":10,"id":340,"name":"minecraft:element_74"},{"data":11,"id":340,"name":"minecraft:element_74"},{"data":12,"id":340,"name":"minecraft:element_74"},{"data":13,"id":340,"name":"minecraft:element_74"},{"data":14,"id":340,"name":"minecraft:element_74"},{"data":15,"id":340,"name":"minecraft:element_74"},{"data":0,"id":341,"name":"minecraft:element_75"},{"data":1,"id":341,"name":"minecraft:element_75"},{"data":2,"id":341,"name":"minecraft:element_75"},{"data":3,"id":341,"name":"minecraft:element_75"},{"data":4,"id":341,"name":"minecraft:element_75"},{"data":5,"id":341,"name":"minecraft:element_75"},{"data":6,"id":341,"name":"minecraft:element_75"},{"data":7,"id":341,"name":"minecraft:element_75"},{"data":8,"id":341,"name":"minecraft:element_75"},{"data":9,"id":341,"name":"minecraft:element_75"},{"data":10,"id":341,"name":"minecraft:element_75"},{"data":11,"id":341,"name":"minecraft:element_75"},{"data":12,"id":341,"name":"minecraft:element_75"},{"data":13,"id":341,"name":"minecraft:element_75"},{"data":14,"id":341,"name":"minecraft:element_75"},{"data":15,"id":341,"name":"minecraft:element_75"},{"data":0,"id":342,"name":"minecraft:element_76"},{"data":1,"id":342,"name":"minecraft:element_76"},{"data":2,"id":342,"name":"minecraft:element_76"},{"data":3,"id":342,"name":"minecraft:element_76"},{"data":4,"id":342,"name":"minecraft:element_76"},{"data":5,"id":342,"name":"minecraft:element_76"},{"data":6,"id":342,"name":"minecraft:element_76"},{"data":7,"id":342,"name":"minecraft:element_76"},{"data":8,"id":342,"name":"minecraft:element_76"},{"data":9,"id":342,"name":"minecraft:element_76"},{"data":10,"id":342,"name":"minecraft:element_76"},{"data":11,"id":342,"name":"minecraft:element_76"},{"data":12,"id":342,"name":"minecraft:element_76"},{"data":13,"id":342,"name":"minecraft:element_76"},{"data":14,"id":342,"name":"minecraft:element_76"},{"data":15,"id":342,"name":"minecraft:element_76"},{"data":0,"id":343,"name":"minecraft:element_77"},{"data":1,"id":343,"name":"minecraft:element_77"},{"data":2,"id":343,"name":"minecraft:element_77"},{"data":3,"id":343,"name":"minecraft:element_77"},{"data":4,"id":343,"name":"minecraft:element_77"},{"data":5,"id":343,"name":"minecraft:element_77"},{"data":6,"id":343,"name":"minecraft:element_77"},{"data":7,"id":343,"name":"minecraft:element_77"},{"data":8,"id":343,"name":"minecraft:element_77"},{"data":9,"id":343,"name":"minecraft:element_77"},{"data":10,"id":343,"name":"minecraft:element_77"},{"data":11,"id":343,"name":"minecraft:element_77"},{"data":12,"id":343,"name":"minecraft:element_77"},{"data":13,"id":343,"name":"minecraft:element_77"},{"data":14,"id":343,"name":"minecraft:element_77"},{"data":15,"id":343,"name":"minecraft:element_77"},{"data":0,"id":344,"name":"minecraft:element_78"},{"data":1,"id":344,"name":"minecraft:element_78"},{"data":2,"id":344,"name":"minecraft:element_78"},{"data":3,"id":344,"name":"minecraft:element_78"},{"data":4,"id":344,"name":"minecraft:element_78"},{"data":5,"id":344,"name":"minecraft:element_78"},{"data":6,"id":344,"name":"minecraft:element_78"},{"data":7,"id":344,"name":"minecraft:element_78"},{"data":8,"id":344,"name":"minecraft:element_78"},{"data":9,"id":344,"name":"minecraft:element_78"},{"data":10,"id":344,"name":"minecraft:element_78"},{"data":11,"id":344,"name":"minecraft:element_78"},{"data":12,"id":344,"name":"minecraft:element_78"},{"data":13,"id":344,"name":"minecraft:element_78"},{"data":14,"id":344,"name":"minecraft:element_78"},{"data":15,"id":344,"name":"minecraft:element_78"},{"data":0,"id":345,"name":"minecraft:element_79"},{"data":1,"id":345,"name":"minecraft:element_79"},{"data":2,"id":345,"name":"minecraft:element_79"},{"data":3,"id":345,"name":"minecraft:element_79"},{"data":4,"id":345,"name":"minecraft:element_79"},{"data":5,"id":345,"name":"minecraft:element_79"},{"data":6,"id":345,"name":"minecraft:element_79"},{"data":7,"id":345,"name":"minecraft:element_79"},{"data":8,"id":345,"name":"minecraft:element_79"},{"data":9,"id":345,"name":"minecraft:element_79"},{"data":10,"id":345,"name":"minecraft:element_79"},{"data":11,"id":345,"name":"minecraft:element_79"},{"data":12,"id":345,"name":"minecraft:element_79"},{"data":13,"id":345,"name":"minecraft:element_79"},{"data":14,"id":345,"name":"minecraft:element_79"},{"data":15,"id":345,"name":"minecraft:element_79"},{"data":0,"id":346,"name":"minecraft:element_80"},{"data":1,"id":346,"name":"minecraft:element_80"},{"data":2,"id":346,"name":"minecraft:element_80"},{"data":3,"id":346,"name":"minecraft:element_80"},{"data":4,"id":346,"name":"minecraft:element_80"},{"data":5,"id":346,"name":"minecraft:element_80"},{"data":6,"id":346,"name":"minecraft:element_80"},{"data":7,"id":346,"name":"minecraft:element_80"},{"data":8,"id":346,"name":"minecraft:element_80"},{"data":9,"id":346,"name":"minecraft:element_80"},{"data":10,"id":346,"name":"minecraft:element_80"},{"data":11,"id":346,"name":"minecraft:element_80"},{"data":12,"id":346,"name":"minecraft:element_80"},{"data":13,"id":346,"name":"minecraft:element_80"},{"data":14,"id":346,"name":"minecraft:element_80"},{"data":15,"id":346,"name":"minecraft:element_80"},{"data":0,"id":347,"name":"minecraft:element_81"},{"data":1,"id":347,"name":"minecraft:element_81"},{"data":2,"id":347,"name":"minecraft:element_81"},{"data":3,"id":347,"name":"minecraft:element_81"},{"data":4,"id":347,"name":"minecraft:element_81"},{"data":5,"id":347,"name":"minecraft:element_81"},{"data":6,"id":347,"name":"minecraft:element_81"},{"data":7,"id":347,"name":"minecraft:element_81"},{"data":8,"id":347,"name":"minecraft:element_81"},{"data":9,"id":347,"name":"minecraft:element_81"},{"data":10,"id":347,"name":"minecraft:element_81"},{"data":11,"id":347,"name":"minecraft:element_81"},{"data":12,"id":347,"name":"minecraft:element_81"},{"data":13,"id":347,"name":"minecraft:element_81"},{"data":14,"id":347,"name":"minecraft:element_81"},{"data":15,"id":347,"name":"minecraft:element_81"},{"data":0,"id":348,"name":"minecraft:element_82"},{"data":1,"id":348,"name":"minecraft:element_82"},{"data":2,"id":348,"name":"minecraft:element_82"},{"data":3,"id":348,"name":"minecraft:element_82"},{"data":4,"id":348,"name":"minecraft:element_82"},{"data":5,"id":348,"name":"minecraft:element_82"},{"data":6,"id":348,"name":"minecraft:element_82"},{"data":7,"id":348,"name":"minecraft:element_82"},{"data":8,"id":348,"name":"minecraft:element_82"},{"data":9,"id":348,"name":"minecraft:element_82"},{"data":10,"id":348,"name":"minecraft:element_82"},{"data":11,"id":348,"name":"minecraft:element_82"},{"data":12,"id":348,"name":"minecraft:element_82"},{"data":13,"id":348,"name":"minecraft:element_82"},{"data":14,"id":348,"name":"minecraft:element_82"},{"data":15,"id":348,"name":"minecraft:element_82"},{"data":0,"id":349,"name":"minecraft:element_83"},{"data":1,"id":349,"name":"minecraft:element_83"},{"data":2,"id":349,"name":"minecraft:element_83"},{"data":3,"id":349,"name":"minecraft:element_83"},{"data":4,"id":349,"name":"minecraft:element_83"},{"data":5,"id":349,"name":"minecraft:element_83"},{"data":6,"id":349,"name":"minecraft:element_83"},{"data":7,"id":349,"name":"minecraft:element_83"},{"data":8,"id":349,"name":"minecraft:element_83"},{"data":9,"id":349,"name":"minecraft:element_83"},{"data":10,"id":349,"name":"minecraft:element_83"},{"data":11,"id":349,"name":"minecraft:element_83"},{"data":12,"id":349,"name":"minecraft:element_83"},{"data":13,"id":349,"name":"minecraft:element_83"},{"data":14,"id":349,"name":"minecraft:element_83"},{"data":15,"id":349,"name":"minecraft:element_83"},{"data":0,"id":350,"name":"minecraft:element_84"},{"data":1,"id":350,"name":"minecraft:element_84"},{"data":2,"id":350,"name":"minecraft:element_84"},{"data":3,"id":350,"name":"minecraft:element_84"},{"data":4,"id":350,"name":"minecraft:element_84"},{"data":5,"id":350,"name":"minecraft:element_84"},{"data":6,"id":350,"name":"minecraft:element_84"},{"data":7,"id":350,"name":"minecraft:element_84"},{"data":8,"id":350,"name":"minecraft:element_84"},{"data":9,"id":350,"name":"minecraft:element_84"},{"data":10,"id":350,"name":"minecraft:element_84"},{"data":11,"id":350,"name":"minecraft:element_84"},{"data":12,"id":350,"name":"minecraft:element_84"},{"data":13,"id":350,"name":"minecraft:element_84"},{"data":14,"id":350,"name":"minecraft:element_84"},{"data":15,"id":350,"name":"minecraft:element_84"},{"data":0,"id":351,"name":"minecraft:element_85"},{"data":1,"id":351,"name":"minecraft:element_85"},{"data":2,"id":351,"name":"minecraft:element_85"},{"data":3,"id":351,"name":"minecraft:element_85"},{"data":4,"id":351,"name":"minecraft:element_85"},{"data":5,"id":351,"name":"minecraft:element_85"},{"data":6,"id":351,"name":"minecraft:element_85"},{"data":7,"id":351,"name":"minecraft:element_85"},{"data":8,"id":351,"name":"minecraft:element_85"},{"data":9,"id":351,"name":"minecraft:element_85"},{"data":10,"id":351,"name":"minecraft:element_85"},{"data":11,"id":351,"name":"minecraft:element_85"},{"data":12,"id":351,"name":"minecraft:element_85"},{"data":13,"id":351,"name":"minecraft:element_85"},{"data":14,"id":351,"name":"minecraft:element_85"},{"data":15,"id":351,"name":"minecraft:element_85"},{"data":0,"id":352,"name":"minecraft:element_86"},{"data":1,"id":352,"name":"minecraft:element_86"},{"data":2,"id":352,"name":"minecraft:element_86"},{"data":3,"id":352,"name":"minecraft:element_86"},{"data":4,"id":352,"name":"minecraft:element_86"},{"data":5,"id":352,"name":"minecraft:element_86"},{"data":6,"id":352,"name":"minecraft:element_86"},{"data":7,"id":352,"name":"minecraft:element_86"},{"data":8,"id":352,"name":"minecraft:element_86"},{"data":9,"id":352,"name":"minecraft:element_86"},{"data":10,"id":352,"name":"minecraft:element_86"},{"data":11,"id":352,"name":"minecraft:element_86"},{"data":12,"id":352,"name":"minecraft:element_86"},{"data":13,"id":352,"name":"minecraft:element_86"},{"data":14,"id":352,"name":"minecraft:element_86"},{"data":15,"id":352,"name":"minecraft:element_86"},{"data":0,"id":353,"name":"minecraft:element_87"},{"data":1,"id":353,"name":"minecraft:element_87"},{"data":2,"id":353,"name":"minecraft:element_87"},{"data":3,"id":353,"name":"minecraft:element_87"},{"data":4,"id":353,"name":"minecraft:element_87"},{"data":5,"id":353,"name":"minecraft:element_87"},{"data":6,"id":353,"name":"minecraft:element_87"},{"data":7,"id":353,"name":"minecraft:element_87"},{"data":8,"id":353,"name":"minecraft:element_87"},{"data":9,"id":353,"name":"minecraft:element_87"},{"data":10,"id":353,"name":"minecraft:element_87"},{"data":11,"id":353,"name":"minecraft:element_87"},{"data":12,"id":353,"name":"minecraft:element_87"},{"data":13,"id":353,"name":"minecraft:element_87"},{"data":14,"id":353,"name":"minecraft:element_87"},{"data":15,"id":353,"name":"minecraft:element_87"},{"data":0,"id":354,"name":"minecraft:element_88"},{"data":1,"id":354,"name":"minecraft:element_88"},{"data":2,"id":354,"name":"minecraft:element_88"},{"data":3,"id":354,"name":"minecraft:element_88"},{"data":4,"id":354,"name":"minecraft:element_88"},{"data":5,"id":354,"name":"minecraft:element_88"},{"data":6,"id":354,"name":"minecraft:element_88"},{"data":7,"id":354,"name":"minecraft:element_88"},{"data":8,"id":354,"name":"minecraft:element_88"},{"data":9,"id":354,"name":"minecraft:element_88"},{"data":10,"id":354,"name":"minecraft:element_88"},{"data":11,"id":354,"name":"minecraft:element_88"},{"data":12,"id":354,"name":"minecraft:element_88"},{"data":13,"id":354,"name":"minecraft:element_88"},{"data":14,"id":354,"name":"minecraft:element_88"},{"data":15,"id":354,"name":"minecraft:element_88"},{"data":0,"id":355,"name":"minecraft:element_89"},{"data":1,"id":355,"name":"minecraft:element_89"},{"data":2,"id":355,"name":"minecraft:element_89"},{"data":3,"id":355,"name":"minecraft:element_89"},{"data":4,"id":355,"name":"minecraft:element_89"},{"data":5,"id":355,"name":"minecraft:element_89"},{"data":6,"id":355,"name":"minecraft:element_89"},{"data":7,"id":355,"name":"minecraft:element_89"},{"data":8,"id":355,"name":"minecraft:element_89"},{"data":9,"id":355,"name":"minecraft:element_89"},{"data":10,"id":355,"name":"minecraft:element_89"},{"data":11,"id":355,"name":"minecraft:element_89"},{"data":12,"id":355,"name":"minecraft:element_89"},{"data":13,"id":355,"name":"minecraft:element_89"},{"data":14,"id":355,"name":"minecraft:element_89"},{"data":15,"id":355,"name":"minecraft:element_89"},{"data":0,"id":356,"name":"minecraft:element_90"},{"data":1,"id":356,"name":"minecraft:element_90"},{"data":2,"id":356,"name":"minecraft:element_90"},{"data":3,"id":356,"name":"minecraft:element_90"},{"data":4,"id":356,"name":"minecraft:element_90"},{"data":5,"id":356,"name":"minecraft:element_90"},{"data":6,"id":356,"name":"minecraft:element_90"},{"data":7,"id":356,"name":"minecraft:element_90"},{"data":8,"id":356,"name":"minecraft:element_90"},{"data":9,"id":356,"name":"minecraft:element_90"},{"data":10,"id":356,"name":"minecraft:element_90"},{"data":11,"id":356,"name":"minecraft:element_90"},{"data":12,"id":356,"name":"minecraft:element_90"},{"data":13,"id":356,"name":"minecraft:element_90"},{"data":14,"id":356,"name":"minecraft:element_90"},{"data":15,"id":356,"name":"minecraft:element_90"},{"data":0,"id":357,"name":"minecraft:element_91"},{"data":1,"id":357,"name":"minecraft:element_91"},{"data":2,"id":357,"name":"minecraft:element_91"},{"data":3,"id":357,"name":"minecraft:element_91"},{"data":4,"id":357,"name":"minecraft:element_91"},{"data":5,"id":357,"name":"minecraft:element_91"},{"data":6,"id":357,"name":"minecraft:element_91"},{"data":7,"id":357,"name":"minecraft:element_91"},{"data":8,"id":357,"name":"minecraft:element_91"},{"data":9,"id":357,"name":"minecraft:element_91"},{"data":10,"id":357,"name":"minecraft:element_91"},{"data":11,"id":357,"name":"minecraft:element_91"},{"data":12,"id":357,"name":"minecraft:element_91"},{"data":13,"id":357,"name":"minecraft:element_91"},{"data":14,"id":357,"name":"minecraft:element_91"},{"data":15,"id":357,"name":"minecraft:element_91"},{"data":0,"id":358,"name":"minecraft:element_92"},{"data":1,"id":358,"name":"minecraft:element_92"},{"data":2,"id":358,"name":"minecraft:element_92"},{"data":3,"id":358,"name":"minecraft:element_92"},{"data":4,"id":358,"name":"minecraft:element_92"},{"data":5,"id":358,"name":"minecraft:element_92"},{"data":6,"id":358,"name":"minecraft:element_92"},{"data":7,"id":358,"name":"minecraft:element_92"},{"data":8,"id":358,"name":"minecraft:element_92"},{"data":9,"id":358,"name":"minecraft:element_92"},{"data":10,"id":358,"name":"minecraft:element_92"},{"data":11,"id":358,"name":"minecraft:element_92"},{"data":12,"id":358,"name":"minecraft:element_92"},{"data":13,"id":358,"name":"minecraft:element_92"},{"data":14,"id":358,"name":"minecraft:element_92"},{"data":15,"id":358,"name":"minecraft:element_92"},{"data":0,"id":359,"name":"minecraft:element_93"},{"data":1,"id":359,"name":"minecraft:element_93"},{"data":2,"id":359,"name":"minecraft:element_93"},{"data":3,"id":359,"name":"minecraft:element_93"},{"data":4,"id":359,"name":"minecraft:element_93"},{"data":5,"id":359,"name":"minecraft:element_93"},{"data":6,"id":359,"name":"minecraft:element_93"},{"data":7,"id":359,"name":"minecraft:element_93"},{"data":8,"id":359,"name":"minecraft:element_93"},{"data":9,"id":359,"name":"minecraft:element_93"},{"data":10,"id":359,"name":"minecraft:element_93"},{"data":11,"id":359,"name":"minecraft:element_93"},{"data":12,"id":359,"name":"minecraft:element_93"},{"data":13,"id":359,"name":"minecraft:element_93"},{"data":14,"id":359,"name":"minecraft:element_93"},{"data":15,"id":359,"name":"minecraft:element_93"},{"data":0,"id":360,"name":"minecraft:element_94"},{"data":1,"id":360,"name":"minecraft:element_94"},{"data":2,"id":360,"name":"minecraft:element_94"},{"data":3,"id":360,"name":"minecraft:element_94"},{"data":4,"id":360,"name":"minecraft:element_94"},{"data":5,"id":360,"name":"minecraft:element_94"},{"data":6,"id":360,"name":"minecraft:element_94"},{"data":7,"id":360,"name":"minecraft:element_94"},{"data":8,"id":360,"name":"minecraft:element_94"},{"data":9,"id":360,"name":"minecraft:element_94"},{"data":10,"id":360,"name":"minecraft:element_94"},{"data":11,"id":360,"name":"minecraft:element_94"},{"data":12,"id":360,"name":"minecraft:element_94"},{"data":13,"id":360,"name":"minecraft:element_94"},{"data":14,"id":360,"name":"minecraft:element_94"},{"data":15,"id":360,"name":"minecraft:element_94"},{"data":0,"id":361,"name":"minecraft:element_95"},{"data":1,"id":361,"name":"minecraft:element_95"},{"data":2,"id":361,"name":"minecraft:element_95"},{"data":3,"id":361,"name":"minecraft:element_95"},{"data":4,"id":361,"name":"minecraft:element_95"},{"data":5,"id":361,"name":"minecraft:element_95"},{"data":6,"id":361,"name":"minecraft:element_95"},{"data":7,"id":361,"name":"minecraft:element_95"},{"data":8,"id":361,"name":"minecraft:element_95"},{"data":9,"id":361,"name":"minecraft:element_95"},{"data":10,"id":361,"name":"minecraft:element_95"},{"data":11,"id":361,"name":"minecraft:element_95"},{"data":12,"id":361,"name":"minecraft:element_95"},{"data":13,"id":361,"name":"minecraft:element_95"},{"data":14,"id":361,"name":"minecraft:element_95"},{"data":15,"id":361,"name":"minecraft:element_95"},{"data":0,"id":362,"name":"minecraft:element_96"},{"data":1,"id":362,"name":"minecraft:element_96"},{"data":2,"id":362,"name":"minecraft:element_96"},{"data":3,"id":362,"name":"minecraft:element_96"},{"data":4,"id":362,"name":"minecraft:element_96"},{"data":5,"id":362,"name":"minecraft:element_96"},{"data":6,"id":362,"name":"minecraft:element_96"},{"data":7,"id":362,"name":"minecraft:element_96"},{"data":8,"id":362,"name":"minecraft:element_96"},{"data":9,"id":362,"name":"minecraft:element_96"},{"data":10,"id":362,"name":"minecraft:element_96"},{"data":11,"id":362,"name":"minecraft:element_96"},{"data":12,"id":362,"name":"minecraft:element_96"},{"data":13,"id":362,"name":"minecraft:element_96"},{"data":14,"id":362,"name":"minecraft:element_96"},{"data":15,"id":362,"name":"minecraft:element_96"},{"data":0,"id":363,"name":"minecraft:element_97"},{"data":1,"id":363,"name":"minecraft:element_97"},{"data":2,"id":363,"name":"minecraft:element_97"},{"data":3,"id":363,"name":"minecraft:element_97"},{"data":4,"id":363,"name":"minecraft:element_97"},{"data":5,"id":363,"name":"minecraft:element_97"},{"data":6,"id":363,"name":"minecraft:element_97"},{"data":7,"id":363,"name":"minecraft:element_97"},{"data":8,"id":363,"name":"minecraft:element_97"},{"data":9,"id":363,"name":"minecraft:element_97"},{"data":10,"id":363,"name":"minecraft:element_97"},{"data":11,"id":363,"name":"minecraft:element_97"},{"data":12,"id":363,"name":"minecraft:element_97"},{"data":13,"id":363,"name":"minecraft:element_97"},{"data":14,"id":363,"name":"minecraft:element_97"},{"data":15,"id":363,"name":"minecraft:element_97"},{"data":0,"id":364,"name":"minecraft:element_98"},{"data":1,"id":364,"name":"minecraft:element_98"},{"data":2,"id":364,"name":"minecraft:element_98"},{"data":3,"id":364,"name":"minecraft:element_98"},{"data":4,"id":364,"name":"minecraft:element_98"},{"data":5,"id":364,"name":"minecraft:element_98"},{"data":6,"id":364,"name":"minecraft:element_98"},{"data":7,"id":364,"name":"minecraft:element_98"},{"data":8,"id":364,"name":"minecraft:element_98"},{"data":9,"id":364,"name":"minecraft:element_98"},{"data":10,"id":364,"name":"minecraft:element_98"},{"data":11,"id":364,"name":"minecraft:element_98"},{"data":12,"id":364,"name":"minecraft:element_98"},{"data":13,"id":364,"name":"minecraft:element_98"},{"data":14,"id":364,"name":"minecraft:element_98"},{"data":15,"id":364,"name":"minecraft:element_98"},{"data":0,"id":365,"name":"minecraft:element_99"},{"data":1,"id":365,"name":"minecraft:element_99"},{"data":2,"id":365,"name":"minecraft:element_99"},{"data":3,"id":365,"name":"minecraft:element_99"},{"data":4,"id":365,"name":"minecraft:element_99"},{"data":5,"id":365,"name":"minecraft:element_99"},{"data":6,"id":365,"name":"minecraft:element_99"},{"data":7,"id":365,"name":"minecraft:element_99"},{"data":8,"id":365,"name":"minecraft:element_99"},{"data":9,"id":365,"name":"minecraft:element_99"},{"data":10,"id":365,"name":"minecraft:element_99"},{"data":11,"id":365,"name":"minecraft:element_99"},{"data":12,"id":365,"name":"minecraft:element_99"},{"data":13,"id":365,"name":"minecraft:element_99"},{"data":14,"id":365,"name":"minecraft:element_99"},{"data":15,"id":365,"name":"minecraft:element_99"},{"data":0,"id":366,"name":"minecraft:element_100"},{"data":1,"id":366,"name":"minecraft:element_100"},{"data":2,"id":366,"name":"minecraft:element_100"},{"data":3,"id":366,"name":"minecraft:element_100"},{"data":4,"id":366,"name":"minecraft:element_100"},{"data":5,"id":366,"name":"minecraft:element_100"},{"data":6,"id":366,"name":"minecraft:element_100"},{"data":7,"id":366,"name":"minecraft:element_100"},{"data":8,"id":366,"name":"minecraft:element_100"},{"data":9,"id":366,"name":"minecraft:element_100"},{"data":10,"id":366,"name":"minecraft:element_100"},{"data":11,"id":366,"name":"minecraft:element_100"},{"data":12,"id":366,"name":"minecraft:element_100"},{"data":13,"id":366,"name":"minecraft:element_100"},{"data":14,"id":366,"name":"minecraft:element_100"},{"data":15,"id":366,"name":"minecraft:element_100"},{"data":0,"id":367,"name":"minecraft:element_101"},{"data":1,"id":367,"name":"minecraft:element_101"},{"data":2,"id":367,"name":"minecraft:element_101"},{"data":3,"id":367,"name":"minecraft:element_101"},{"data":4,"id":367,"name":"minecraft:element_101"},{"data":5,"id":367,"name":"minecraft:element_101"},{"data":6,"id":367,"name":"minecraft:element_101"},{"data":7,"id":367,"name":"minecraft:element_101"},{"data":8,"id":367,"name":"minecraft:element_101"},{"data":9,"id":367,"name":"minecraft:element_101"},{"data":10,"id":367,"name":"minecraft:element_101"},{"data":11,"id":367,"name":"minecraft:element_101"},{"data":12,"id":367,"name":"minecraft:element_101"},{"data":13,"id":367,"name":"minecraft:element_101"},{"data":14,"id":367,"name":"minecraft:element_101"},{"data":15,"id":367,"name":"minecraft:element_101"},{"data":0,"id":368,"name":"minecraft:element_102"},{"data":1,"id":368,"name":"minecraft:element_102"},{"data":2,"id":368,"name":"minecraft:element_102"},{"data":3,"id":368,"name":"minecraft:element_102"},{"data":4,"id":368,"name":"minecraft:element_102"},{"data":5,"id":368,"name":"minecraft:element_102"},{"data":6,"id":368,"name":"minecraft:element_102"},{"data":7,"id":368,"name":"minecraft:element_102"},{"data":8,"id":368,"name":"minecraft:element_102"},{"data":9,"id":368,"name":"minecraft:element_102"},{"data":10,"id":368,"name":"minecraft:element_102"},{"data":11,"id":368,"name":"minecraft:element_102"},{"data":12,"id":368,"name":"minecraft:element_102"},{"data":13,"id":368,"name":"minecraft:element_102"},{"data":14,"id":368,"name":"minecraft:element_102"},{"data":15,"id":368,"name":"minecraft:element_102"},{"data":0,"id":369,"name":"minecraft:element_103"},{"data":1,"id":369,"name":"minecraft:element_103"},{"data":2,"id":369,"name":"minecraft:element_103"},{"data":3,"id":369,"name":"minecraft:element_103"},{"data":4,"id":369,"name":"minecraft:element_103"},{"data":5,"id":369,"name":"minecraft:element_103"},{"data":6,"id":369,"name":"minecraft:element_103"},{"data":7,"id":369,"name":"minecraft:element_103"},{"data":8,"id":369,"name":"minecraft:element_103"},{"data":9,"id":369,"name":"minecraft:element_103"},{"data":10,"id":369,"name":"minecraft:element_103"},{"data":11,"id":369,"name":"minecraft:element_103"},{"data":12,"id":369,"name":"minecraft:element_103"},{"data":13,"id":369,"name":"minecraft:element_103"},{"data":14,"id":369,"name":"minecraft:element_103"},{"data":15,"id":369,"name":"minecraft:element_103"},{"data":0,"id":370,"name":"minecraft:element_104"},{"data":1,"id":370,"name":"minecraft:element_104"},{"data":2,"id":370,"name":"minecraft:element_104"},{"data":3,"id":370,"name":"minecraft:element_104"},{"data":4,"id":370,"name":"minecraft:element_104"},{"data":5,"id":370,"name":"minecraft:element_104"},{"data":6,"id":370,"name":"minecraft:element_104"},{"data":7,"id":370,"name":"minecraft:element_104"},{"data":8,"id":370,"name":"minecraft:element_104"},{"data":9,"id":370,"name":"minecraft:element_104"},{"data":10,"id":370,"name":"minecraft:element_104"},{"data":11,"id":370,"name":"minecraft:element_104"},{"data":12,"id":370,"name":"minecraft:element_104"},{"data":13,"id":370,"name":"minecraft:element_104"},{"data":14,"id":370,"name":"minecraft:element_104"},{"data":15,"id":370,"name":"minecraft:element_104"},{"data":0,"id":371,"name":"minecraft:element_105"},{"data":1,"id":371,"name":"minecraft:element_105"},{"data":2,"id":371,"name":"minecraft:element_105"},{"data":3,"id":371,"name":"minecraft:element_105"},{"data":4,"id":371,"name":"minecraft:element_105"},{"data":5,"id":371,"name":"minecraft:element_105"},{"data":6,"id":371,"name":"minecraft:element_105"},{"data":7,"id":371,"name":"minecraft:element_105"},{"data":8,"id":371,"name":"minecraft:element_105"},{"data":9,"id":371,"name":"minecraft:element_105"},{"data":10,"id":371,"name":"minecraft:element_105"},{"data":11,"id":371,"name":"minecraft:element_105"},{"data":12,"id":371,"name":"minecraft:element_105"},{"data":13,"id":371,"name":"minecraft:element_105"},{"data":14,"id":371,"name":"minecraft:element_105"},{"data":15,"id":371,"name":"minecraft:element_105"},{"data":0,"id":372,"name":"minecraft:element_106"},{"data":1,"id":372,"name":"minecraft:element_106"},{"data":2,"id":372,"name":"minecraft:element_106"},{"data":3,"id":372,"name":"minecraft:element_106"},{"data":4,"id":372,"name":"minecraft:element_106"},{"data":5,"id":372,"name":"minecraft:element_106"},{"data":6,"id":372,"name":"minecraft:element_106"},{"data":7,"id":372,"name":"minecraft:element_106"},{"data":8,"id":372,"name":"minecraft:element_106"},{"data":9,"id":372,"name":"minecraft:element_106"},{"data":10,"id":372,"name":"minecraft:element_106"},{"data":11,"id":372,"name":"minecraft:element_106"},{"data":12,"id":372,"name":"minecraft:element_106"},{"data":13,"id":372,"name":"minecraft:element_106"},{"data":14,"id":372,"name":"minecraft:element_106"},{"data":15,"id":372,"name":"minecraft:element_106"},{"data":0,"id":373,"name":"minecraft:element_107"},{"data":1,"id":373,"name":"minecraft:element_107"},{"data":2,"id":373,"name":"minecraft:element_107"},{"data":3,"id":373,"name":"minecraft:element_107"},{"data":4,"id":373,"name":"minecraft:element_107"},{"data":5,"id":373,"name":"minecraft:element_107"},{"data":6,"id":373,"name":"minecraft:element_107"},{"data":7,"id":373,"name":"minecraft:element_107"},{"data":8,"id":373,"name":"minecraft:element_107"},{"data":9,"id":373,"name":"minecraft:element_107"},{"data":10,"id":373,"name":"minecraft:element_107"},{"data":11,"id":373,"name":"minecraft:element_107"},{"data":12,"id":373,"name":"minecraft:element_107"},{"data":13,"id":373,"name":"minecraft:element_107"},{"data":14,"id":373,"name":"minecraft:element_107"},{"data":15,"id":373,"name":"minecraft:element_107"},{"data":0,"id":374,"name":"minecraft:element_108"},{"data":1,"id":374,"name":"minecraft:element_108"},{"data":2,"id":374,"name":"minecraft:element_108"},{"data":3,"id":374,"name":"minecraft:element_108"},{"data":4,"id":374,"name":"minecraft:element_108"},{"data":5,"id":374,"name":"minecraft:element_108"},{"data":6,"id":374,"name":"minecraft:element_108"},{"data":7,"id":374,"name":"minecraft:element_108"},{"data":8,"id":374,"name":"minecraft:element_108"},{"data":9,"id":374,"name":"minecraft:element_108"},{"data":10,"id":374,"name":"minecraft:element_108"},{"data":11,"id":374,"name":"minecraft:element_108"},{"data":12,"id":374,"name":"minecraft:element_108"},{"data":13,"id":374,"name":"minecraft:element_108"},{"data":14,"id":374,"name":"minecraft:element_108"},{"data":15,"id":374,"name":"minecraft:element_108"},{"data":0,"id":375,"name":"minecraft:element_109"},{"data":1,"id":375,"name":"minecraft:element_109"},{"data":2,"id":375,"name":"minecraft:element_109"},{"data":3,"id":375,"name":"minecraft:element_109"},{"data":4,"id":375,"name":"minecraft:element_109"},{"data":5,"id":375,"name":"minecraft:element_109"},{"data":6,"id":375,"name":"minecraft:element_109"},{"data":7,"id":375,"name":"minecraft:element_109"},{"data":8,"id":375,"name":"minecraft:element_109"},{"data":9,"id":375,"name":"minecraft:element_109"},{"data":10,"id":375,"name":"minecraft:element_109"},{"data":11,"id":375,"name":"minecraft:element_109"},{"data":12,"id":375,"name":"minecraft:element_109"},{"data":13,"id":375,"name":"minecraft:element_109"},{"data":14,"id":375,"name":"minecraft:element_109"},{"data":15,"id":375,"name":"minecraft:element_109"},{"data":0,"id":376,"name":"minecraft:element_110"},{"data":1,"id":376,"name":"minecraft:element_110"},{"data":2,"id":376,"name":"minecraft:element_110"},{"data":3,"id":376,"name":"minecraft:element_110"},{"data":4,"id":376,"name":"minecraft:element_110"},{"data":5,"id":376,"name":"minecraft:element_110"},{"data":6,"id":376,"name":"minecraft:element_110"},{"data":7,"id":376,"name":"minecraft:element_110"},{"data":8,"id":376,"name":"minecraft:element_110"},{"data":9,"id":376,"name":"minecraft:element_110"},{"data":10,"id":376,"name":"minecraft:element_110"},{"data":11,"id":376,"name":"minecraft:element_110"},{"data":12,"id":376,"name":"minecraft:element_110"},{"data":13,"id":376,"name":"minecraft:element_110"},{"data":14,"id":376,"name":"minecraft:element_110"},{"data":15,"id":376,"name":"minecraft:element_110"},{"data":0,"id":377,"name":"minecraft:element_111"},{"data":1,"id":377,"name":"minecraft:element_111"},{"data":2,"id":377,"name":"minecraft:element_111"},{"data":3,"id":377,"name":"minecraft:element_111"},{"data":4,"id":377,"name":"minecraft:element_111"},{"data":5,"id":377,"name":"minecraft:element_111"},{"data":6,"id":377,"name":"minecraft:element_111"},{"data":7,"id":377,"name":"minecraft:element_111"},{"data":8,"id":377,"name":"minecraft:element_111"},{"data":9,"id":377,"name":"minecraft:element_111"},{"data":10,"id":377,"name":"minecraft:element_111"},{"data":11,"id":377,"name":"minecraft:element_111"},{"data":12,"id":377,"name":"minecraft:element_111"},{"data":13,"id":377,"name":"minecraft:element_111"},{"data":14,"id":377,"name":"minecraft:element_111"},{"data":15,"id":377,"name":"minecraft:element_111"},{"data":0,"id":378,"name":"minecraft:element_112"},{"data":1,"id":378,"name":"minecraft:element_112"},{"data":2,"id":378,"name":"minecraft:element_112"},{"data":3,"id":378,"name":"minecraft:element_112"},{"data":4,"id":378,"name":"minecraft:element_112"},{"data":5,"id":378,"name":"minecraft:element_112"},{"data":6,"id":378,"name":"minecraft:element_112"},{"data":7,"id":378,"name":"minecraft:element_112"},{"data":8,"id":378,"name":"minecraft:element_112"},{"data":9,"id":378,"name":"minecraft:element_112"},{"data":10,"id":378,"name":"minecraft:element_112"},{"data":11,"id":378,"name":"minecraft:element_112"},{"data":12,"id":378,"name":"minecraft:element_112"},{"data":13,"id":378,"name":"minecraft:element_112"},{"data":14,"id":378,"name":"minecraft:element_112"},{"data":15,"id":378,"name":"minecraft:element_112"},{"data":0,"id":379,"name":"minecraft:element_113"},{"data":1,"id":379,"name":"minecraft:element_113"},{"data":2,"id":379,"name":"minecraft:element_113"},{"data":3,"id":379,"name":"minecraft:element_113"},{"data":4,"id":379,"name":"minecraft:element_113"},{"data":5,"id":379,"name":"minecraft:element_113"},{"data":6,"id":379,"name":"minecraft:element_113"},{"data":7,"id":379,"name":"minecraft:element_113"},{"data":8,"id":379,"name":"minecraft:element_113"},{"data":9,"id":379,"name":"minecraft:element_113"},{"data":10,"id":379,"name":"minecraft:element_113"},{"data":11,"id":379,"name":"minecraft:element_113"},{"data":12,"id":379,"name":"minecraft:element_113"},{"data":13,"id":379,"name":"minecraft:element_113"},{"data":14,"id":379,"name":"minecraft:element_113"},{"data":15,"id":379,"name":"minecraft:element_113"},{"data":0,"id":380,"name":"minecraft:element_114"},{"data":1,"id":380,"name":"minecraft:element_114"},{"data":2,"id":380,"name":"minecraft:element_114"},{"data":3,"id":380,"name":"minecraft:element_114"},{"data":4,"id":380,"name":"minecraft:element_114"},{"data":5,"id":380,"name":"minecraft:element_114"},{"data":6,"id":380,"name":"minecraft:element_114"},{"data":7,"id":380,"name":"minecraft:element_114"},{"data":8,"id":380,"name":"minecraft:element_114"},{"data":9,"id":380,"name":"minecraft:element_114"},{"data":10,"id":380,"name":"minecraft:element_114"},{"data":11,"id":380,"name":"minecraft:element_114"},{"data":12,"id":380,"name":"minecraft:element_114"},{"data":13,"id":380,"name":"minecraft:element_114"},{"data":14,"id":380,"name":"minecraft:element_114"},{"data":15,"id":380,"name":"minecraft:element_114"},{"data":0,"id":381,"name":"minecraft:element_115"},{"data":1,"id":381,"name":"minecraft:element_115"},{"data":2,"id":381,"name":"minecraft:element_115"},{"data":3,"id":381,"name":"minecraft:element_115"},{"data":4,"id":381,"name":"minecraft:element_115"},{"data":5,"id":381,"name":"minecraft:element_115"},{"data":6,"id":381,"name":"minecraft:element_115"},{"data":7,"id":381,"name":"minecraft:element_115"},{"data":8,"id":381,"name":"minecraft:element_115"},{"data":9,"id":381,"name":"minecraft:element_115"},{"data":10,"id":381,"name":"minecraft:element_115"},{"data":11,"id":381,"name":"minecraft:element_115"},{"data":12,"id":381,"name":"minecraft:element_115"},{"data":13,"id":381,"name":"minecraft:element_115"},{"data":14,"id":381,"name":"minecraft:element_115"},{"data":15,"id":381,"name":"minecraft:element_115"},{"data":0,"id":382,"name":"minecraft:element_116"},{"data":1,"id":382,"name":"minecraft:element_116"},{"data":2,"id":382,"name":"minecraft:element_116"},{"data":3,"id":382,"name":"minecraft:element_116"},{"data":4,"id":382,"name":"minecraft:element_116"},{"data":5,"id":382,"name":"minecraft:element_116"},{"data":6,"id":382,"name":"minecraft:element_116"},{"data":7,"id":382,"name":"minecraft:element_116"},{"data":8,"id":382,"name":"minecraft:element_116"},{"data":9,"id":382,"name":"minecraft:element_116"},{"data":10,"id":382,"name":"minecraft:element_116"},{"data":11,"id":382,"name":"minecraft:element_116"},{"data":12,"id":382,"name":"minecraft:element_116"},{"data":13,"id":382,"name":"minecraft:element_116"},{"data":14,"id":382,"name":"minecraft:element_116"},{"data":15,"id":382,"name":"minecraft:element_116"},{"data":0,"id":383,"name":"minecraft:element_117"},{"data":1,"id":383,"name":"minecraft:element_117"},{"data":2,"id":383,"name":"minecraft:element_117"},{"data":3,"id":383,"name":"minecraft:element_117"},{"data":4,"id":383,"name":"minecraft:element_117"},{"data":5,"id":383,"name":"minecraft:element_117"},{"data":6,"id":383,"name":"minecraft:element_117"},{"data":7,"id":383,"name":"minecraft:element_117"},{"data":8,"id":383,"name":"minecraft:element_117"},{"data":9,"id":383,"name":"minecraft:element_117"},{"data":10,"id":383,"name":"minecraft:element_117"},{"data":11,"id":383,"name":"minecraft:element_117"},{"data":12,"id":383,"name":"minecraft:element_117"},{"data":13,"id":383,"name":"minecraft:element_117"},{"data":14,"id":383,"name":"minecraft:element_117"},{"data":15,"id":383,"name":"minecraft:element_117"},{"data":0,"id":384,"name":"minecraft:element_118"},{"data":1,"id":384,"name":"minecraft:element_118"},{"data":2,"id":384,"name":"minecraft:element_118"},{"data":3,"id":384,"name":"minecraft:element_118"},{"data":4,"id":384,"name":"minecraft:element_118"},{"data":5,"id":384,"name":"minecraft:element_118"},{"data":6,"id":384,"name":"minecraft:element_118"},{"data":7,"id":384,"name":"minecraft:element_118"},{"data":8,"id":384,"name":"minecraft:element_118"},{"data":9,"id":384,"name":"minecraft:element_118"},{"data":10,"id":384,"name":"minecraft:element_118"},{"data":11,"id":384,"name":"minecraft:element_118"},{"data":12,"id":384,"name":"minecraft:element_118"},{"data":13,"id":384,"name":"minecraft:element_118"},{"data":14,"id":384,"name":"minecraft:element_118"},{"data":15,"id":384,"name":"minecraft:element_118"},{"data":0,"id":385,"name":"minecraft:seagrass"},{"data":1,"id":385,"name":"minecraft:seagrass"},{"data":2,"id":385,"name":"minecraft:seagrass"},{"data":3,"id":385,"name":"minecraft:seagrass"},{"data":0,"id":386,"name":"minecraft:coral"},{"data":1,"id":386,"name":"minecraft:coral"},{"data":2,"id":386,"name":"minecraft:coral"},{"data":3,"id":386,"name":"minecraft:coral"},{"data":4,"id":386,"name":"minecraft:coral"},{"data":5,"id":386,"name":"minecraft:coral"},{"data":6,"id":386,"name":"minecraft:coral"},{"data":7,"id":386,"name":"minecraft:coral"},{"data":8,"id":386,"name":"minecraft:coral"},{"data":9,"id":386,"name":"minecraft:coral"},{"data":10,"id":386,"name":"minecraft:coral"},{"data":11,"id":386,"name":"minecraft:coral"},{"data":12,"id":386,"name":"minecraft:coral"},{"data":13,"id":386,"name":"minecraft:coral"},{"data":14,"id":386,"name":"minecraft:coral"},{"data":15,"id":386,"name":"minecraft:coral"},{"data":0,"id":387,"name":"minecraft:coral_block"},{"data":1,"id":387,"name":"minecraft:coral_block"},{"data":2,"id":387,"name":"minecraft:coral_block"},{"data":3,"id":387,"name":"minecraft:coral_block"},{"data":4,"id":387,"name":"minecraft:coral_block"},{"data":5,"id":387,"name":"minecraft:coral_block"},{"data":6,"id":387,"name":"minecraft:coral_block"},{"data":7,"id":387,"name":"minecraft:coral_block"},{"data":8,"id":387,"name":"minecraft:coral_block"},{"data":9,"id":387,"name":"minecraft:coral_block"},{"data":10,"id":387,"name":"minecraft:coral_block"},{"data":11,"id":387,"name":"minecraft:coral_block"},{"data":12,"id":387,"name":"minecraft:coral_block"},{"data":13,"id":387,"name":"minecraft:coral_block"},{"data":14,"id":387,"name":"minecraft:coral_block"},{"data":15,"id":387,"name":"minecraft:coral_block"},{"data":0,"id":388,"name":"minecraft:coral_fan"},{"data":1,"id":388,"name":"minecraft:coral_fan"},{"data":2,"id":388,"name":"minecraft:coral_fan"},{"data":3,"id":388,"name":"minecraft:coral_fan"},{"data":4,"id":388,"name":"minecraft:coral_fan"},{"data":5,"id":388,"name":"minecraft:coral_fan"},{"data":6,"id":388,"name":"minecraft:coral_fan"},{"data":7,"id":388,"name":"minecraft:coral_fan"},{"data":8,"id":388,"name":"minecraft:coral_fan"},{"data":9,"id":388,"name":"minecraft:coral_fan"},{"data":10,"id":388,"name":"minecraft:coral_fan"},{"data":11,"id":388,"name":"minecraft:coral_fan"},{"data":12,"id":388,"name":"minecraft:coral_fan"},{"data":13,"id":388,"name":"minecraft:coral_fan"},{"data":14,"id":388,"name":"minecraft:coral_fan"},{"data":15,"id":388,"name":"minecraft:coral_fan"},{"data":0,"id":389,"name":"minecraft:coral_fan_dead"},{"data":1,"id":389,"name":"minecraft:coral_fan_dead"},{"data":2,"id":389,"name":"minecraft:coral_fan_dead"},{"data":3,"id":389,"name":"minecraft:coral_fan_dead"},{"data":4,"id":389,"name":"minecraft:coral_fan_dead"},{"data":5,"id":389,"name":"minecraft:coral_fan_dead"},{"data":6,"id":389,"name":"minecraft:coral_fan_dead"},{"data":7,"id":389,"name":"minecraft:coral_fan_dead"},{"data":8,"id":389,"name":"minecraft:coral_fan_dead"},{"data":9,"id":389,"name":"minecraft:coral_fan_dead"},{"data":10,"id":389,"name":"minecraft:coral_fan_dead"},{"data":11,"id":389,"name":"minecraft:coral_fan_dead"},{"data":12,"id":389,"name":"minecraft:coral_fan_dead"},{"data":13,"id":389,"name":"minecraft:coral_fan_dead"},{"data":14,"id":389,"name":"minecraft:coral_fan_dead"},{"data":15,"id":389,"name":"minecraft:coral_fan_dead"},{"data":0,"id":390,"name":"minecraft:coral_fan_hang"},{"data":1,"id":390,"name":"minecraft:coral_fan_hang"},{"data":2,"id":390,"name":"minecraft:coral_fan_hang"},{"data":3,"id":390,"name":"minecraft:coral_fan_hang"},{"data":4,"id":390,"name":"minecraft:coral_fan_hang"},{"data":5,"id":390,"name":"minecraft:coral_fan_hang"},{"data":6,"id":390,"name":"minecraft:coral_fan_hang"},{"data":7,"id":390,"name":"minecraft:coral_fan_hang"},{"data":8,"id":390,"name":"minecraft:coral_fan_hang"},{"data":9,"id":390,"name":"minecraft:coral_fan_hang"},{"data":10,"id":390,"name":"minecraft:coral_fan_hang"},{"data":11,"id":390,"name":"minecraft:coral_fan_hang"},{"data":12,"id":390,"name":"minecraft:coral_fan_hang"},{"data":13,"id":390,"name":"minecraft:coral_fan_hang"},{"data":14,"id":390,"name":"minecraft:coral_fan_hang"},{"data":15,"id":390,"name":"minecraft:coral_fan_hang"},{"data":0,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":1,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":2,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":3,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":4,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":5,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":6,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":7,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":8,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":9,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":10,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":11,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":12,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":13,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":14,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":15,"id":391,"name":"minecraft:coral_fan_hang2"},{"data":0,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":1,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":2,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":3,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":4,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":5,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":6,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":7,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":8,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":9,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":10,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":11,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":12,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":13,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":14,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":15,"id":392,"name":"minecraft:coral_fan_hang3"},{"data":0,"id":393,"name":"minecraft:kelp"},{"data":1,"id":393,"name":"minecraft:kelp"},{"data":2,"id":393,"name":"minecraft:kelp"},{"data":3,"id":393,"name":"minecraft:kelp"},{"data":4,"id":393,"name":"minecraft:kelp"},{"data":5,"id":393,"name":"minecraft:kelp"},{"data":6,"id":393,"name":"minecraft:kelp"},{"data":7,"id":393,"name":"minecraft:kelp"},{"data":8,"id":393,"name":"minecraft:kelp"},{"data":9,"id":393,"name":"minecraft:kelp"},{"data":10,"id":393,"name":"minecraft:kelp"},{"data":11,"id":393,"name":"minecraft:kelp"},{"data":12,"id":393,"name":"minecraft:kelp"},{"data":13,"id":393,"name":"minecraft:kelp"},{"data":14,"id":393,"name":"minecraft:kelp"},{"data":15,"id":393,"name":"minecraft:kelp"},{"data":0,"id":394,"name":"minecraft:dried_kelp_block"},{"data":0,"id":395,"name":"minecraft:acacia_button"},{"data":1,"id":395,"name":"minecraft:acacia_button"},{"data":2,"id":395,"name":"minecraft:acacia_button"},{"data":3,"id":395,"name":"minecraft:acacia_button"},{"data":4,"id":395,"name":"minecraft:acacia_button"},{"data":5,"id":395,"name":"minecraft:acacia_button"},{"data":6,"id":395,"name":"minecraft:acacia_button"},{"data":7,"id":395,"name":"minecraft:acacia_button"},{"data":8,"id":395,"name":"minecraft:acacia_button"},{"data":9,"id":395,"name":"minecraft:acacia_button"},{"data":10,"id":395,"name":"minecraft:acacia_button"},{"data":11,"id":395,"name":"minecraft:acacia_button"},{"data":12,"id":395,"name":"minecraft:acacia_button"},{"data":13,"id":395,"name":"minecraft:acacia_button"},{"data":14,"id":395,"name":"minecraft:acacia_button"},{"data":15,"id":395,"name":"minecraft:acacia_button"},{"data":0,"id":396,"name":"minecraft:birch_button"},{"data":1,"id":396,"name":"minecraft:birch_button"},{"data":2,"id":396,"name":"minecraft:birch_button"},{"data":3,"id":396,"name":"minecraft:birch_button"},{"data":4,"id":396,"name":"minecraft:birch_button"},{"data":5,"id":396,"name":"minecraft:birch_button"},{"data":6,"id":396,"name":"minecraft:birch_button"},{"data":7,"id":396,"name":"minecraft:birch_button"},{"data":8,"id":396,"name":"minecraft:birch_button"},{"data":9,"id":396,"name":"minecraft:birch_button"},{"data":10,"id":396,"name":"minecraft:birch_button"},{"data":11,"id":396,"name":"minecraft:birch_button"},{"data":12,"id":396,"name":"minecraft:birch_button"},{"data":13,"id":396,"name":"minecraft:birch_button"},{"data":14,"id":396,"name":"minecraft:birch_button"},{"data":15,"id":396,"name":"minecraft:birch_button"},{"data":0,"id":397,"name":"minecraft:dark_oak_button"},{"data":1,"id":397,"name":"minecraft:dark_oak_button"},{"data":2,"id":397,"name":"minecraft:dark_oak_button"},{"data":3,"id":397,"name":"minecraft:dark_oak_button"},{"data":4,"id":397,"name":"minecraft:dark_oak_button"},{"data":5,"id":397,"name":"minecraft:dark_oak_button"},{"data":6,"id":397,"name":"minecraft:dark_oak_button"},{"data":7,"id":397,"name":"minecraft:dark_oak_button"},{"data":8,"id":397,"name":"minecraft:dark_oak_button"},{"data":9,"id":397,"name":"minecraft:dark_oak_button"},{"data":10,"id":397,"name":"minecraft:dark_oak_button"},{"data":11,"id":397,"name":"minecraft:dark_oak_button"},{"data":12,"id":397,"name":"minecraft:dark_oak_button"},{"data":13,"id":397,"name":"minecraft:dark_oak_button"},{"data":14,"id":397,"name":"minecraft:dark_oak_button"},{"data":15,"id":397,"name":"minecraft:dark_oak_button"},{"data":0,"id":398,"name":"minecraft:jungle_button"},{"data":1,"id":398,"name":"minecraft:jungle_button"},{"data":2,"id":398,"name":"minecraft:jungle_button"},{"data":3,"id":398,"name":"minecraft:jungle_button"},{"data":4,"id":398,"name":"minecraft:jungle_button"},{"data":5,"id":398,"name":"minecraft:jungle_button"},{"data":6,"id":398,"name":"minecraft:jungle_button"},{"data":7,"id":398,"name":"minecraft:jungle_button"},{"data":8,"id":398,"name":"minecraft:jungle_button"},{"data":9,"id":398,"name":"minecraft:jungle_button"},{"data":10,"id":398,"name":"minecraft:jungle_button"},{"data":11,"id":398,"name":"minecraft:jungle_button"},{"data":12,"id":398,"name":"minecraft:jungle_button"},{"data":13,"id":398,"name":"minecraft:jungle_button"},{"data":14,"id":398,"name":"minecraft:jungle_button"},{"data":15,"id":398,"name":"minecraft:jungle_button"},{"data":0,"id":399,"name":"minecraft:spruce_button"},{"data":1,"id":399,"name":"minecraft:spruce_button"},{"data":2,"id":399,"name":"minecraft:spruce_button"},{"data":3,"id":399,"name":"minecraft:spruce_button"},{"data":4,"id":399,"name":"minecraft:spruce_button"},{"data":5,"id":399,"name":"minecraft:spruce_button"},{"data":6,"id":399,"name":"minecraft:spruce_button"},{"data":7,"id":399,"name":"minecraft:spruce_button"},{"data":8,"id":399,"name":"minecraft:spruce_button"},{"data":9,"id":399,"name":"minecraft:spruce_button"},{"data":10,"id":399,"name":"minecraft:spruce_button"},{"data":11,"id":399,"name":"minecraft:spruce_button"},{"data":12,"id":399,"name":"minecraft:spruce_button"},{"data":13,"id":399,"name":"minecraft:spruce_button"},{"data":14,"id":399,"name":"minecraft:spruce_button"},{"data":15,"id":399,"name":"minecraft:spruce_button"},{"data":0,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":1,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":2,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":3,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":4,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":5,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":6,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":7,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":8,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":9,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":10,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":11,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":12,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":13,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":14,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":15,"id":400,"name":"minecraft:acacia_trapdoor"},{"data":0,"id":401,"name":"minecraft:birch_trapdoor"},{"data":1,"id":401,"name":"minecraft:birch_trapdoor"},{"data":2,"id":401,"name":"minecraft:birch_trapdoor"},{"data":3,"id":401,"name":"minecraft:birch_trapdoor"},{"data":4,"id":401,"name":"minecraft:birch_trapdoor"},{"data":5,"id":401,"name":"minecraft:birch_trapdoor"},{"data":6,"id":401,"name":"minecraft:birch_trapdoor"},{"data":7,"id":401,"name":"minecraft:birch_trapdoor"},{"data":8,"id":401,"name":"minecraft:birch_trapdoor"},{"data":9,"id":401,"name":"minecraft:birch_trapdoor"},{"data":10,"id":401,"name":"minecraft:birch_trapdoor"},{"data":11,"id":401,"name":"minecraft:birch_trapdoor"},{"data":12,"id":401,"name":"minecraft:birch_trapdoor"},{"data":13,"id":401,"name":"minecraft:birch_trapdoor"},{"data":14,"id":401,"name":"minecraft:birch_trapdoor"},{"data":15,"id":401,"name":"minecraft:birch_trapdoor"},{"data":0,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":1,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":2,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":3,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":4,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":5,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":6,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":7,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":8,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":9,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":10,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":11,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":12,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":13,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":14,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":15,"id":402,"name":"minecraft:dark_oak_trapdoor"},{"data":0,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":1,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":2,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":3,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":4,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":5,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":6,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":7,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":8,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":9,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":10,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":11,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":12,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":13,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":14,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":15,"id":403,"name":"minecraft:jungle_trapdoor"},{"data":0,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":1,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":2,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":3,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":4,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":5,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":6,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":7,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":8,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":9,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":10,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":11,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":12,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":13,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":14,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":15,"id":404,"name":"minecraft:spruce_trapdoor"},{"data":0,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":1,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":2,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":3,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":4,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":5,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":6,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":7,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":8,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":9,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":10,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":11,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":12,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":13,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":14,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":15,"id":405,"name":"minecraft:acacia_pressure_plate"},{"data":0,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":1,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":2,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":3,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":4,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":5,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":6,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":7,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":8,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":9,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":10,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":11,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":12,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":13,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":14,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":15,"id":406,"name":"minecraft:birch_pressure_plate"},{"data":0,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":1,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":2,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":3,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":4,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":5,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":6,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":7,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":8,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":9,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":10,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":11,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":12,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":13,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":14,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":15,"id":407,"name":"minecraft:dark_oak_pressure_plate"},{"data":0,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":1,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":2,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":3,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":4,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":5,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":6,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":7,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":8,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":9,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":10,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":11,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":12,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":13,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":14,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":15,"id":408,"name":"minecraft:jungle_pressure_plate"},{"data":0,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":1,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":2,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":3,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":4,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":5,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":6,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":7,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":8,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":9,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":10,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":11,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":12,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":13,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":14,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":15,"id":409,"name":"minecraft:spruce_pressure_plate"},{"data":0,"id":410,"name":"minecraft:carved_pumpkin"},{"data":1,"id":410,"name":"minecraft:carved_pumpkin"},{"data":2,"id":410,"name":"minecraft:carved_pumpkin"},{"data":3,"id":410,"name":"minecraft:carved_pumpkin"},{"data":0,"id":411,"name":"minecraft:sea_pickle"},{"data":1,"id":411,"name":"minecraft:sea_pickle"},{"data":2,"id":411,"name":"minecraft:sea_pickle"},{"data":3,"id":411,"name":"minecraft:sea_pickle"},{"data":4,"id":411,"name":"minecraft:sea_pickle"},{"data":5,"id":411,"name":"minecraft:sea_pickle"},{"data":6,"id":411,"name":"minecraft:sea_pickle"},{"data":7,"id":411,"name":"minecraft:sea_pickle"},{"data":0,"id":412,"name":"minecraft:conduit"},{"data":0,"id":414,"name":"minecraft:turtle_egg"},{"data":1,"id":414,"name":"minecraft:turtle_egg"},{"data":2,"id":414,"name":"minecraft:turtle_egg"},{"data":3,"id":414,"name":"minecraft:turtle_egg"},{"data":4,"id":414,"name":"minecraft:turtle_egg"},{"data":5,"id":414,"name":"minecraft:turtle_egg"},{"data":6,"id":414,"name":"minecraft:turtle_egg"},{"data":7,"id":414,"name":"minecraft:turtle_egg"},{"data":8,"id":414,"name":"minecraft:turtle_egg"},{"data":9,"id":414,"name":"minecraft:turtle_egg"},{"data":10,"id":414,"name":"minecraft:turtle_egg"},{"data":11,"id":414,"name":"minecraft:turtle_egg"},{"data":12,"id":414,"name":"minecraft:turtle_egg"},{"data":13,"id":414,"name":"minecraft:turtle_egg"},{"data":14,"id":414,"name":"minecraft:turtle_egg"},{"data":15,"id":414,"name":"minecraft:turtle_egg"},{"data":0,"id":415,"name":"minecraft:bubble_column"},{"data":1,"id":415,"name":"minecraft:bubble_column"},{"data":0,"id":416,"name":"minecraft:barrier"},{"data":0,"id":417,"name":"minecraft:bamboo"},{"data":1,"id":417,"name":"minecraft:bamboo"},{"data":2,"id":417,"name":"minecraft:bamboo"},{"data":3,"id":417,"name":"minecraft:bamboo"},{"data":4,"id":417,"name":"minecraft:bamboo"},{"data":5,"id":417,"name":"minecraft:bamboo"},{"data":6,"id":417,"name":"minecraft:bamboo"},{"data":7,"id":417,"name":"minecraft:bamboo"},{"data":8,"id":417,"name":"minecraft:bamboo"},{"data":9,"id":417,"name":"minecraft:bamboo"},{"data":10,"id":417,"name":"minecraft:bamboo"},{"data":11,"id":417,"name":"minecraft:bamboo"},{"data":12,"id":417,"name":"minecraft:bamboo"},{"data":13,"id":417,"name":"minecraft:bamboo"},{"data":14,"id":417,"name":"minecraft:bamboo"},{"data":15,"id":417,"name":"minecraft:bamboo"},{"data":0,"id":418,"name":"minecraft:bamboo_sapling"},{"data":1,"id":418,"name":"minecraft:bamboo_sapling"},{"data":2,"id":418,"name":"minecraft:bamboo_sapling"},{"data":3,"id":418,"name":"minecraft:bamboo_sapling"},{"data":4,"id":418,"name":"minecraft:bamboo_sapling"},{"data":5,"id":418,"name":"minecraft:bamboo_sapling"},{"data":6,"id":418,"name":"minecraft:bamboo_sapling"},{"data":7,"id":418,"name":"minecraft:bamboo_sapling"},{"data":8,"id":418,"name":"minecraft:bamboo_sapling"},{"data":9,"id":418,"name":"minecraft:bamboo_sapling"},{"data":10,"id":418,"name":"minecraft:bamboo_sapling"},{"data":11,"id":418,"name":"minecraft:bamboo_sapling"},{"data":12,"id":418,"name":"minecraft:bamboo_sapling"},{"data":13,"id":418,"name":"minecraft:bamboo_sapling"},{"data":14,"id":418,"name":"minecraft:bamboo_sapling"},{"data":15,"id":418,"name":"minecraft:bamboo_sapling"},{"data":0,"id":419,"name":"minecraft:scaffolding"},{"data":1,"id":419,"name":"minecraft:scaffolding"},{"data":2,"id":419,"name":"minecraft:scaffolding"},{"data":3,"id":419,"name":"minecraft:scaffolding"},{"data":4,"id":419,"name":"minecraft:scaffolding"},{"data":5,"id":419,"name":"minecraft:scaffolding"},{"data":6,"id":419,"name":"minecraft:scaffolding"},{"data":7,"id":419,"name":"minecraft:scaffolding"},{"data":8,"id":419,"name":"minecraft:scaffolding"},{"data":9,"id":419,"name":"minecraft:scaffolding"},{"data":10,"id":419,"name":"minecraft:scaffolding"},{"data":11,"id":419,"name":"minecraft:scaffolding"},{"data":12,"id":419,"name":"minecraft:scaffolding"},{"data":13,"id":419,"name":"minecraft:scaffolding"},{"data":14,"id":419,"name":"minecraft:scaffolding"},{"data":15,"id":419,"name":"minecraft:scaffolding"},{"data":0,"id":420,"name":"minecraft:smooth_stone"},{"data":1,"id":420,"name":"minecraft:smooth_stone"},{"data":2,"id":420,"name":"minecraft:smooth_stone"},{"data":3,"id":420,"name":"minecraft:smooth_stone"},{"data":4,"id":420,"name":"minecraft:smooth_stone"},{"data":5,"id":420,"name":"minecraft:smooth_stone"},{"data":6,"id":420,"name":"minecraft:smooth_stone"},{"data":7,"id":420,"name":"minecraft:smooth_stone"},{"data":0,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":1,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":2,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":3,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":4,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":5,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":6,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":7,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":8,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":9,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":10,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":11,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":12,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":13,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":14,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":15,"id":421,"name":"minecraft:spruce_standing_sign"},{"data":0,"id":422,"name":"minecraft:diorite_stairs"},{"data":1,"id":422,"name":"minecraft:diorite_stairs"},{"data":2,"id":422,"name":"minecraft:diorite_stairs"},{"data":3,"id":422,"name":"minecraft:diorite_stairs"},{"data":4,"id":422,"name":"minecraft:diorite_stairs"},{"data":5,"id":422,"name":"minecraft:diorite_stairs"},{"data":6,"id":422,"name":"minecraft:diorite_stairs"},{"data":7,"id":422,"name":"minecraft:diorite_stairs"},{"data":0,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":1,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":2,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":3,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":4,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":5,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":6,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":7,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":8,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":9,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":10,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":11,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":12,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":13,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":14,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":15,"id":423,"name":"minecraft:darkoak_standing_sign"},{"data":0,"id":424,"name":"minecraft:double_stone_slab4"},{"data":1,"id":424,"name":"minecraft:double_stone_slab4"},{"data":2,"id":424,"name":"minecraft:double_stone_slab4"},{"data":3,"id":424,"name":"minecraft:double_stone_slab4"},{"data":4,"id":424,"name":"minecraft:double_stone_slab4"},{"data":5,"id":424,"name":"minecraft:double_stone_slab4"},{"data":6,"id":424,"name":"minecraft:double_stone_slab4"},{"data":7,"id":424,"name":"minecraft:double_stone_slab4"},{"data":8,"id":424,"name":"minecraft:double_stone_slab4"},{"data":9,"id":424,"name":"minecraft:double_stone_slab4"},{"data":10,"id":424,"name":"minecraft:double_stone_slab4"},{"data":11,"id":424,"name":"minecraft:double_stone_slab4"},{"data":12,"id":424,"name":"minecraft:double_stone_slab4"},{"data":13,"id":424,"name":"minecraft:double_stone_slab4"},{"data":14,"id":424,"name":"minecraft:double_stone_slab4"},{"data":15,"id":424,"name":"minecraft:double_stone_slab4"},{"data":0,"id":425,"name":"minecraft:stone_slab4"},{"data":1,"id":425,"name":"minecraft:stone_slab4"},{"data":2,"id":425,"name":"minecraft:stone_slab4"},{"data":3,"id":425,"name":"minecraft:stone_slab4"},{"data":4,"id":425,"name":"minecraft:stone_slab4"},{"data":5,"id":425,"name":"minecraft:stone_slab4"},{"data":6,"id":425,"name":"minecraft:stone_slab4"},{"data":7,"id":425,"name":"minecraft:stone_slab4"},{"data":8,"id":425,"name":"minecraft:stone_slab4"},{"data":9,"id":425,"name":"minecraft:stone_slab4"},{"data":10,"id":425,"name":"minecraft:stone_slab4"},{"data":11,"id":425,"name":"minecraft:stone_slab4"},{"data":12,"id":425,"name":"minecraft:stone_slab4"},{"data":13,"id":425,"name":"minecraft:stone_slab4"},{"data":14,"id":425,"name":"minecraft:stone_slab4"},{"data":15,"id":425,"name":"minecraft:stone_slab4"},{"data":0,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":1,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":2,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":3,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":4,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":5,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":6,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":7,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":8,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":9,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":10,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":11,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":12,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":13,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":14,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":15,"id":426,"name":"minecraft:acacia_standing_sign"},{"data":0,"id":427,"name":"minecraft:polished_diorite_stairs"},{"data":1,"id":427,"name":"minecraft:polished_diorite_stairs"},{"data":2,"id":427,"name":"minecraft:polished_diorite_stairs"},{"data":3,"id":427,"name":"minecraft:polished_diorite_stairs"},{"data":4,"id":427,"name":"minecraft:polished_diorite_stairs"},{"data":5,"id":427,"name":"minecraft:polished_diorite_stairs"},{"data":6,"id":427,"name":"minecraft:polished_diorite_stairs"},{"data":7,"id":427,"name":"minecraft:polished_diorite_stairs"},{"data":0,"id":428,"name":"minecraft:birch_standing_sign"},{"data":1,"id":428,"name":"minecraft:birch_standing_sign"},{"data":2,"id":428,"name":"minecraft:birch_standing_sign"},{"data":3,"id":428,"name":"minecraft:birch_standing_sign"},{"data":4,"id":428,"name":"minecraft:birch_standing_sign"},{"data":5,"id":428,"name":"minecraft:birch_standing_sign"},{"data":6,"id":428,"name":"minecraft:birch_standing_sign"},{"data":7,"id":428,"name":"minecraft:birch_standing_sign"},{"data":8,"id":428,"name":"minecraft:birch_standing_sign"},{"data":9,"id":428,"name":"minecraft:birch_standing_sign"},{"data":10,"id":428,"name":"minecraft:birch_standing_sign"},{"data":11,"id":428,"name":"minecraft:birch_standing_sign"},{"data":12,"id":428,"name":"minecraft:birch_standing_sign"},{"data":13,"id":428,"name":"minecraft:birch_standing_sign"},{"data":14,"id":428,"name":"minecraft:birch_standing_sign"},{"data":15,"id":428,"name":"minecraft:birch_standing_sign"},{"data":0,"id":429,"name":"minecraft:mossy_stone_brick_stairs"},{"data":1,"id":429,"name":"minecraft:mossy_stone_brick_stairs"},{"data":2,"id":429,"name":"minecraft:mossy_stone_brick_stairs"},{"data":3,"id":429,"name":"minecraft:mossy_stone_brick_stairs"},{"data":4,"id":429,"name":"minecraft:mossy_stone_brick_stairs"},{"data":5,"id":429,"name":"minecraft:mossy_stone_brick_stairs"},{"data":6,"id":429,"name":"minecraft:mossy_stone_brick_stairs"},{"data":7,"id":429,"name":"minecraft:mossy_stone_brick_stairs"},{"data":0,"id":430,"name":"minecraft:polished_granite_stairs"},{"data":1,"id":430,"name":"minecraft:polished_granite_stairs"},{"data":2,"id":430,"name":"minecraft:polished_granite_stairs"},{"data":3,"id":430,"name":"minecraft:polished_granite_stairs"},{"data":4,"id":430,"name":"minecraft:polished_granite_stairs"},{"data":5,"id":430,"name":"minecraft:polished_granite_stairs"},{"data":6,"id":430,"name":"minecraft:polished_granite_stairs"},{"data":7,"id":430,"name":"minecraft:polished_granite_stairs"},{"data":0,"id":431,"name":"minecraft:stone_slab3"},{"data":1,"id":431,"name":"minecraft:stone_slab3"},{"data":2,"id":431,"name":"minecraft:stone_slab3"},{"data":3,"id":431,"name":"minecraft:stone_slab3"},{"data":4,"id":431,"name":"minecraft:stone_slab3"},{"data":5,"id":431,"name":"minecraft:stone_slab3"},{"data":6,"id":431,"name":"minecraft:stone_slab3"},{"data":7,"id":431,"name":"minecraft:stone_slab3"},{"data":8,"id":431,"name":"minecraft:stone_slab3"},{"data":9,"id":431,"name":"minecraft:stone_slab3"},{"data":10,"id":431,"name":"minecraft:stone_slab3"},{"data":11,"id":431,"name":"minecraft:stone_slab3"},{"data":12,"id":431,"name":"minecraft:stone_slab3"},{"data":13,"id":431,"name":"minecraft:stone_slab3"},{"data":14,"id":431,"name":"minecraft:stone_slab3"},{"data":15,"id":431,"name":"minecraft:stone_slab3"},{"data":0,"id":432,"name":"minecraft:double_stone_slab3"},{"data":1,"id":432,"name":"minecraft:double_stone_slab3"},{"data":2,"id":432,"name":"minecraft:double_stone_slab3"},{"data":3,"id":432,"name":"minecraft:double_stone_slab3"},{"data":4,"id":432,"name":"minecraft:double_stone_slab3"},{"data":5,"id":432,"name":"minecraft:double_stone_slab3"},{"data":6,"id":432,"name":"minecraft:double_stone_slab3"},{"data":7,"id":432,"name":"minecraft:double_stone_slab3"},{"data":8,"id":432,"name":"minecraft:double_stone_slab3"},{"data":9,"id":432,"name":"minecraft:double_stone_slab3"},{"data":10,"id":432,"name":"minecraft:double_stone_slab3"},{"data":11,"id":432,"name":"minecraft:double_stone_slab3"},{"data":12,"id":432,"name":"minecraft:double_stone_slab3"},{"data":13,"id":432,"name":"minecraft:double_stone_slab3"},{"data":14,"id":432,"name":"minecraft:double_stone_slab3"},{"data":15,"id":432,"name":"minecraft:double_stone_slab3"},{"data":0,"id":433,"name":"minecraft:end_brick_stairs"},{"data":1,"id":433,"name":"minecraft:end_brick_stairs"},{"data":2,"id":433,"name":"minecraft:end_brick_stairs"},{"data":3,"id":433,"name":"minecraft:end_brick_stairs"},{"data":4,"id":433,"name":"minecraft:end_brick_stairs"},{"data":5,"id":433,"name":"minecraft:end_brick_stairs"},{"data":6,"id":433,"name":"minecraft:end_brick_stairs"},{"data":7,"id":433,"name":"minecraft:end_brick_stairs"},{"data":0,"id":434,"name":"minecraft:birch_wall_sign"},{"data":1,"id":434,"name":"minecraft:birch_wall_sign"},{"data":2,"id":434,"name":"minecraft:birch_wall_sign"},{"data":3,"id":434,"name":"minecraft:birch_wall_sign"},{"data":4,"id":434,"name":"minecraft:birch_wall_sign"},{"data":5,"id":434,"name":"minecraft:birch_wall_sign"},{"data":6,"id":434,"name":"minecraft:birch_wall_sign"},{"data":7,"id":434,"name":"minecraft:birch_wall_sign"},{"data":0,"id":435,"name":"minecraft:red_nether_brick_stairs"},{"data":1,"id":435,"name":"minecraft:red_nether_brick_stairs"},{"data":2,"id":435,"name":"minecraft:red_nether_brick_stairs"},{"data":3,"id":435,"name":"minecraft:red_nether_brick_stairs"},{"data":4,"id":435,"name":"minecraft:red_nether_brick_stairs"},{"data":5,"id":435,"name":"minecraft:red_nether_brick_stairs"},{"data":6,"id":435,"name":"minecraft:red_nether_brick_stairs"},{"data":7,"id":435,"name":"minecraft:red_nether_brick_stairs"},{"data":0,"id":436,"name":"minecraft:acacia_wall_sign"},{"data":1,"id":436,"name":"minecraft:acacia_wall_sign"},{"data":2,"id":436,"name":"minecraft:acacia_wall_sign"},{"data":3,"id":436,"name":"minecraft:acacia_wall_sign"},{"data":4,"id":436,"name":"minecraft:acacia_wall_sign"},{"data":5,"id":436,"name":"minecraft:acacia_wall_sign"},{"data":6,"id":436,"name":"minecraft:acacia_wall_sign"},{"data":7,"id":436,"name":"minecraft:acacia_wall_sign"},{"data":0,"id":437,"name":"minecraft:polished_andesite_stairs"},{"data":1,"id":437,"name":"minecraft:polished_andesite_stairs"},{"data":2,"id":437,"name":"minecraft:polished_andesite_stairs"},{"data":3,"id":437,"name":"minecraft:polished_andesite_stairs"},{"data":4,"id":437,"name":"minecraft:polished_andesite_stairs"},{"data":5,"id":437,"name":"minecraft:polished_andesite_stairs"},{"data":6,"id":437,"name":"minecraft:polished_andesite_stairs"},{"data":7,"id":437,"name":"minecraft:polished_andesite_stairs"},{"data":0,"id":438,"name":"minecraft:normal_stone_stairs"},{"data":1,"id":438,"name":"minecraft:normal_stone_stairs"},{"data":2,"id":438,"name":"minecraft:normal_stone_stairs"},{"data":3,"id":438,"name":"minecraft:normal_stone_stairs"},{"data":4,"id":438,"name":"minecraft:normal_stone_stairs"},{"data":5,"id":438,"name":"minecraft:normal_stone_stairs"},{"data":6,"id":438,"name":"minecraft:normal_stone_stairs"},{"data":7,"id":438,"name":"minecraft:normal_stone_stairs"},{"data":0,"id":439,"name":"minecraft:granite_stairs"},{"data":1,"id":439,"name":"minecraft:granite_stairs"},{"data":2,"id":439,"name":"minecraft:granite_stairs"},{"data":3,"id":439,"name":"minecraft:granite_stairs"},{"data":4,"id":439,"name":"minecraft:granite_stairs"},{"data":5,"id":439,"name":"minecraft:granite_stairs"},{"data":6,"id":439,"name":"minecraft:granite_stairs"},{"data":7,"id":439,"name":"minecraft:granite_stairs"},{"data":0,"id":440,"name":"minecraft:mossy_cobblestone_stairs"},{"data":1,"id":440,"name":"minecraft:mossy_cobblestone_stairs"},{"data":2,"id":440,"name":"minecraft:mossy_cobblestone_stairs"},{"data":3,"id":440,"name":"minecraft:mossy_cobblestone_stairs"},{"data":4,"id":440,"name":"minecraft:mossy_cobblestone_stairs"},{"data":5,"id":440,"name":"minecraft:mossy_cobblestone_stairs"},{"data":6,"id":440,"name":"minecraft:mossy_cobblestone_stairs"},{"data":7,"id":440,"name":"minecraft:mossy_cobblestone_stairs"},{"data":0,"id":441,"name":"minecraft:smooth_sandstone_stairs"},{"data":1,"id":441,"name":"minecraft:smooth_sandstone_stairs"},{"data":2,"id":441,"name":"minecraft:smooth_sandstone_stairs"},{"data":3,"id":441,"name":"minecraft:smooth_sandstone_stairs"},{"data":4,"id":441,"name":"minecraft:smooth_sandstone_stairs"},{"data":5,"id":441,"name":"minecraft:smooth_sandstone_stairs"},{"data":6,"id":441,"name":"minecraft:smooth_sandstone_stairs"},{"data":7,"id":441,"name":"minecraft:smooth_sandstone_stairs"},{"data":0,"id":442,"name":"minecraft:smooth_quartz_stairs"},{"data":1,"id":442,"name":"minecraft:smooth_quartz_stairs"},{"data":2,"id":442,"name":"minecraft:smooth_quartz_stairs"},{"data":3,"id":442,"name":"minecraft:smooth_quartz_stairs"},{"data":4,"id":442,"name":"minecraft:smooth_quartz_stairs"},{"data":5,"id":442,"name":"minecraft:smooth_quartz_stairs"},{"data":6,"id":442,"name":"minecraft:smooth_quartz_stairs"},{"data":7,"id":442,"name":"minecraft:smooth_quartz_stairs"},{"data":0,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":1,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":2,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":3,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":4,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":5,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":6,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":7,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":8,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":9,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":10,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":11,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":12,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":13,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":14,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":15,"id":443,"name":"minecraft:jungle_standing_sign"},{"data":0,"id":444,"name":"minecraft:darkoak_wall_sign"},{"data":1,"id":444,"name":"minecraft:darkoak_wall_sign"},{"data":2,"id":444,"name":"minecraft:darkoak_wall_sign"},{"data":3,"id":444,"name":"minecraft:darkoak_wall_sign"},{"data":4,"id":444,"name":"minecraft:darkoak_wall_sign"},{"data":5,"id":444,"name":"minecraft:darkoak_wall_sign"},{"data":6,"id":444,"name":"minecraft:darkoak_wall_sign"},{"data":7,"id":444,"name":"minecraft:darkoak_wall_sign"},{"data":0,"id":445,"name":"minecraft:jungle_wall_sign"},{"data":1,"id":445,"name":"minecraft:jungle_wall_sign"},{"data":2,"id":445,"name":"minecraft:jungle_wall_sign"},{"data":3,"id":445,"name":"minecraft:jungle_wall_sign"},{"data":4,"id":445,"name":"minecraft:jungle_wall_sign"},{"data":5,"id":445,"name":"minecraft:jungle_wall_sign"},{"data":6,"id":445,"name":"minecraft:jungle_wall_sign"},{"data":7,"id":445,"name":"minecraft:jungle_wall_sign"},{"data":0,"id":446,"name":"minecraft:andesite_stairs"},{"data":1,"id":446,"name":"minecraft:andesite_stairs"},{"data":2,"id":446,"name":"minecraft:andesite_stairs"},{"data":3,"id":446,"name":"minecraft:andesite_stairs"},{"data":4,"id":446,"name":"minecraft:andesite_stairs"},{"data":5,"id":446,"name":"minecraft:andesite_stairs"},{"data":6,"id":446,"name":"minecraft:andesite_stairs"},{"data":7,"id":446,"name":"minecraft:andesite_stairs"},{"data":0,"id":447,"name":"minecraft:smooth_red_sandstone_stairs"},{"data":1,"id":447,"name":"minecraft:smooth_red_sandstone_stairs"},{"data":2,"id":447,"name":"minecraft:smooth_red_sandstone_stairs"},{"data":3,"id":447,"name":"minecraft:smooth_red_sandstone_stairs"},{"data":4,"id":447,"name":"minecraft:smooth_red_sandstone_stairs"},{"data":5,"id":447,"name":"minecraft:smooth_red_sandstone_stairs"},{"data":6,"id":447,"name":"minecraft:smooth_red_sandstone_stairs"},{"data":7,"id":447,"name":"minecraft:smooth_red_sandstone_stairs"},{"data":0,"id":448,"name":"minecraft:spruce_wall_sign"},{"data":1,"id":448,"name":"minecraft:spruce_wall_sign"},{"data":2,"id":448,"name":"minecraft:spruce_wall_sign"},{"data":3,"id":448,"name":"minecraft:spruce_wall_sign"},{"data":4,"id":448,"name":"minecraft:spruce_wall_sign"},{"data":5,"id":448,"name":"minecraft:spruce_wall_sign"},{"data":6,"id":448,"name":"minecraft:spruce_wall_sign"},{"data":7,"id":448,"name":"minecraft:spruce_wall_sign"},{"data":0,"id":449,"name":"minecraft:lava_cauldron"},{"data":1,"id":449,"name":"minecraft:lava_cauldron"},{"data":2,"id":449,"name":"minecraft:lava_cauldron"},{"data":3,"id":449,"name":"minecraft:lava_cauldron"},{"data":4,"id":449,"name":"minecraft:lava_cauldron"},{"data":5,"id":449,"name":"minecraft:lava_cauldron"},{"data":6,"id":449,"name":"minecraft:lava_cauldron"},{"data":7,"id":449,"name":"minecraft:lava_cauldron"},{"data":8,"id":449,"name":"minecraft:lava_cauldron"},{"data":9,"id":449,"name":"minecraft:lava_cauldron"},{"data":10,"id":449,"name":"minecraft:lava_cauldron"},{"data":11,"id":449,"name":"minecraft:lava_cauldron"},{"data":12,"id":449,"name":"minecraft:lava_cauldron"},{"data":13,"id":449,"name":"minecraft:lava_cauldron"},{"data":14,"id":449,"name":"minecraft:lava_cauldron"},{"data":15,"id":449,"name":"minecraft:lava_cauldron"},{"data":0,"id":450,"name":"minecraft:smoker"},{"data":1,"id":450,"name":"minecraft:smoker"},{"data":2,"id":450,"name":"minecraft:smoker"},{"data":3,"id":450,"name":"minecraft:smoker"},{"data":4,"id":450,"name":"minecraft:smoker"},{"data":5,"id":450,"name":"minecraft:smoker"},{"data":6,"id":450,"name":"minecraft:smoker"},{"data":7,"id":450,"name":"minecraft:smoker"},{"data":0,"id":451,"name":"minecraft:blast_furnace"},{"data":1,"id":451,"name":"minecraft:blast_furnace"},{"data":2,"id":451,"name":"minecraft:blast_furnace"},{"data":3,"id":451,"name":"minecraft:blast_furnace"},{"data":4,"id":451,"name":"minecraft:blast_furnace"},{"data":5,"id":451,"name":"minecraft:blast_furnace"},{"data":6,"id":451,"name":"minecraft:blast_furnace"},{"data":7,"id":451,"name":"minecraft:blast_furnace"},{"data":0,"id":452,"name":"minecraft:fletching_table"},{"data":0,"id":453,"name":"minecraft:barrel"},{"data":1,"id":453,"name":"minecraft:barrel"},{"data":2,"id":453,"name":"minecraft:barrel"},{"data":3,"id":453,"name":"minecraft:barrel"},{"data":4,"id":453,"name":"minecraft:barrel"},{"data":5,"id":453,"name":"minecraft:barrel"},{"data":6,"id":453,"name":"minecraft:barrel"},{"data":7,"id":453,"name":"minecraft:barrel"},{"data":0,"id":454,"name":"minecraft:grindstone"},{"data":1,"id":454,"name":"minecraft:grindstone"},{"data":2,"id":454,"name":"minecraft:grindstone"},{"data":3,"id":454,"name":"minecraft:grindstone"},{"data":0,"id":455,"name":"minecraft:lantern"},{"data":1,"id":455,"name":"minecraft:lantern"},{"data":0,"id":456,"name":"minecraft:bell"},{"data":1,"id":456,"name":"minecraft:bell"},{"data":2,"id":456,"name":"minecraft:bell"},{"data":3,"id":456,"name":"minecraft:bell"},{"data":0,"id":457,"name":"minecraft:cartography_table"},{"data":0,"id":458,"name":"minecraft:smithing_table"}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_340.json b/src/main/resources/runtimeid_table_340.json deleted file mode 100644 index 98379f322..000000000 --- a/src/main/resources/runtimeid_table_340.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"minecraft:air","id":0,"data":0},{"name":"minecraft:stone","id":1,"data":0},{"name":"minecraft:stone","id":1,"data":1},{"name":"minecraft:stone","id":1,"data":2},{"name":"minecraft:stone","id":1,"data":3},{"name":"minecraft:stone","id":1,"data":4},{"name":"minecraft:stone","id":1,"data":5},{"name":"minecraft:stone","id":1,"data":6},{"name":"minecraft:stone","id":1,"data":7},{"name":"minecraft:grass","id":2,"data":0},{"name":"minecraft:dirt","id":3,"data":0},{"name":"minecraft:dirt","id":3,"data":1},{"name":"minecraft:cobblestone","id":4,"data":0},{"name":"minecraft:planks","id":5,"data":0},{"name":"minecraft:planks","id":5,"data":1},{"name":"minecraft:planks","id":5,"data":2},{"name":"minecraft:planks","id":5,"data":3},{"name":"minecraft:planks","id":5,"data":4},{"name":"minecraft:planks","id":5,"data":5},{"name":"minecraft:planks","id":5,"data":6},{"name":"minecraft:planks","id":5,"data":7},{"name":"minecraft:sapling","id":6,"data":0},{"name":"minecraft:sapling","id":6,"data":1},{"name":"minecraft:sapling","id":6,"data":2},{"name":"minecraft:sapling","id":6,"data":3},{"name":"minecraft:sapling","id":6,"data":4},{"name":"minecraft:sapling","id":6,"data":5},{"name":"minecraft:sapling","id":6,"data":6},{"name":"minecraft:sapling","id":6,"data":7},{"name":"minecraft:sapling","id":6,"data":8},{"name":"minecraft:sapling","id":6,"data":9},{"name":"minecraft:sapling","id":6,"data":10},{"name":"minecraft:sapling","id":6,"data":11},{"name":"minecraft:sapling","id":6,"data":12},{"name":"minecraft:sapling","id":6,"data":13},{"name":"minecraft:sapling","id":6,"data":14},{"name":"minecraft:sapling","id":6,"data":15},{"name":"minecraft:bedrock","id":7,"data":0},{"name":"minecraft:bedrock","id":7,"data":1},{"name":"minecraft:flowing_water","id":8,"data":0},{"name":"minecraft:flowing_water","id":8,"data":1},{"name":"minecraft:flowing_water","id":8,"data":2},{"name":"minecraft:flowing_water","id":8,"data":3},{"name":"minecraft:flowing_water","id":8,"data":4},{"name":"minecraft:flowing_water","id":8,"data":5},{"name":"minecraft:flowing_water","id":8,"data":6},{"name":"minecraft:flowing_water","id":8,"data":7},{"name":"minecraft:flowing_water","id":8,"data":8},{"name":"minecraft:flowing_water","id":8,"data":9},{"name":"minecraft:flowing_water","id":8,"data":10},{"name":"minecraft:flowing_water","id":8,"data":11},{"name":"minecraft:flowing_water","id":8,"data":12},{"name":"minecraft:flowing_water","id":8,"data":13},{"name":"minecraft:flowing_water","id":8,"data":14},{"name":"minecraft:flowing_water","id":8,"data":15},{"name":"minecraft:water","id":9,"data":0},{"name":"minecraft:water","id":9,"data":1},{"name":"minecraft:water","id":9,"data":2},{"name":"minecraft:water","id":9,"data":3},{"name":"minecraft:water","id":9,"data":4},{"name":"minecraft:water","id":9,"data":5},{"name":"minecraft:water","id":9,"data":6},{"name":"minecraft:water","id":9,"data":7},{"name":"minecraft:water","id":9,"data":8},{"name":"minecraft:water","id":9,"data":9},{"name":"minecraft:water","id":9,"data":10},{"name":"minecraft:water","id":9,"data":11},{"name":"minecraft:water","id":9,"data":12},{"name":"minecraft:water","id":9,"data":13},{"name":"minecraft:water","id":9,"data":14},{"name":"minecraft:water","id":9,"data":15},{"name":"minecraft:flowing_lava","id":10,"data":0},{"name":"minecraft:flowing_lava","id":10,"data":1},{"name":"minecraft:flowing_lava","id":10,"data":2},{"name":"minecraft:flowing_lava","id":10,"data":3},{"name":"minecraft:flowing_lava","id":10,"data":4},{"name":"minecraft:flowing_lava","id":10,"data":5},{"name":"minecraft:flowing_lava","id":10,"data":6},{"name":"minecraft:flowing_lava","id":10,"data":7},{"name":"minecraft:flowing_lava","id":10,"data":8},{"name":"minecraft:flowing_lava","id":10,"data":9},{"name":"minecraft:flowing_lava","id":10,"data":10},{"name":"minecraft:flowing_lava","id":10,"data":11},{"name":"minecraft:flowing_lava","id":10,"data":12},{"name":"minecraft:flowing_lava","id":10,"data":13},{"name":"minecraft:flowing_lava","id":10,"data":14},{"name":"minecraft:flowing_lava","id":10,"data":15},{"name":"minecraft:lava","id":11,"data":0},{"name":"minecraft:lava","id":11,"data":1},{"name":"minecraft:lava","id":11,"data":2},{"name":"minecraft:lava","id":11,"data":3},{"name":"minecraft:lava","id":11,"data":4},{"name":"minecraft:lava","id":11,"data":5},{"name":"minecraft:lava","id":11,"data":6},{"name":"minecraft:lava","id":11,"data":7},{"name":"minecraft:lava","id":11,"data":8},{"name":"minecraft:lava","id":11,"data":9},{"name":"minecraft:lava","id":11,"data":10},{"name":"minecraft:lava","id":11,"data":11},{"name":"minecraft:lava","id":11,"data":12},{"name":"minecraft:lava","id":11,"data":13},{"name":"minecraft:lava","id":11,"data":14},{"name":"minecraft:lava","id":11,"data":15},{"name":"minecraft:sand","id":12,"data":0},{"name":"minecraft:sand","id":12,"data":1},{"name":"minecraft:gravel","id":13,"data":0},{"name":"minecraft:gold_ore","id":14,"data":0},{"name":"minecraft:iron_ore","id":15,"data":0},{"name":"minecraft:coal_ore","id":16,"data":0},{"name":"minecraft:log","id":17,"data":0},{"name":"minecraft:log","id":17,"data":1},{"name":"minecraft:log","id":17,"data":2},{"name":"minecraft:log","id":17,"data":3},{"name":"minecraft:log","id":17,"data":4},{"name":"minecraft:log","id":17,"data":5},{"name":"minecraft:log","id":17,"data":6},{"name":"minecraft:log","id":17,"data":7},{"name":"minecraft:log","id":17,"data":8},{"name":"minecraft:log","id":17,"data":9},{"name":"minecraft:log","id":17,"data":10},{"name":"minecraft:log","id":17,"data":11},{"name":"minecraft:log","id":17,"data":12},{"name":"minecraft:log","id":17,"data":13},{"name":"minecraft:log","id":17,"data":14},{"name":"minecraft:log","id":17,"data":15},{"name":"minecraft:leaves","id":18,"data":0},{"name":"minecraft:leaves","id":18,"data":1},{"name":"minecraft:leaves","id":18,"data":2},{"name":"minecraft:leaves","id":18,"data":3},{"name":"minecraft:leaves","id":18,"data":4},{"name":"minecraft:leaves","id":18,"data":5},{"name":"minecraft:leaves","id":18,"data":6},{"name":"minecraft:leaves","id":18,"data":7},{"name":"minecraft:leaves","id":18,"data":8},{"name":"minecraft:leaves","id":18,"data":9},{"name":"minecraft:leaves","id":18,"data":10},{"name":"minecraft:leaves","id":18,"data":11},{"name":"minecraft:leaves","id":18,"data":12},{"name":"minecraft:leaves","id":18,"data":13},{"name":"minecraft:leaves","id":18,"data":14},{"name":"minecraft:leaves","id":18,"data":15},{"name":"minecraft:sponge","id":19,"data":0},{"name":"minecraft:sponge","id":19,"data":1},{"name":"minecraft:glass","id":20,"data":0},{"name":"minecraft:lapis_ore","id":21,"data":0},{"name":"minecraft:lapis_block","id":22,"data":0},{"name":"minecraft:dispenser","id":23,"data":0},{"name":"minecraft:dispenser","id":23,"data":1},{"name":"minecraft:dispenser","id":23,"data":2},{"name":"minecraft:dispenser","id":23,"data":3},{"name":"minecraft:dispenser","id":23,"data":4},{"name":"minecraft:dispenser","id":23,"data":5},{"name":"minecraft:dispenser","id":23,"data":6},{"name":"minecraft:dispenser","id":23,"data":7},{"name":"minecraft:dispenser","id":23,"data":8},{"name":"minecraft:dispenser","id":23,"data":9},{"name":"minecraft:dispenser","id":23,"data":10},{"name":"minecraft:dispenser","id":23,"data":11},{"name":"minecraft:dispenser","id":23,"data":12},{"name":"minecraft:dispenser","id":23,"data":13},{"name":"minecraft:dispenser","id":23,"data":14},{"name":"minecraft:dispenser","id":23,"data":15},{"name":"minecraft:sandstone","id":24,"data":0},{"name":"minecraft:sandstone","id":24,"data":1},{"name":"minecraft:sandstone","id":24,"data":2},{"name":"minecraft:sandstone","id":24,"data":3},{"name":"minecraft:noteblock","id":25,"data":0},{"name":"minecraft:bed","id":26,"data":0},{"name":"minecraft:bed","id":26,"data":1},{"name":"minecraft:bed","id":26,"data":2},{"name":"minecraft:bed","id":26,"data":3},{"name":"minecraft:bed","id":26,"data":4},{"name":"minecraft:bed","id":26,"data":5},{"name":"minecraft:bed","id":26,"data":6},{"name":"minecraft:bed","id":26,"data":7},{"name":"minecraft:bed","id":26,"data":8},{"name":"minecraft:bed","id":26,"data":9},{"name":"minecraft:bed","id":26,"data":10},{"name":"minecraft:bed","id":26,"data":11},{"name":"minecraft:bed","id":26,"data":12},{"name":"minecraft:bed","id":26,"data":13},{"name":"minecraft:bed","id":26,"data":14},{"name":"minecraft:bed","id":26,"data":15},{"name":"minecraft:golden_rail","id":27,"data":0},{"name":"minecraft:golden_rail","id":27,"data":1},{"name":"minecraft:golden_rail","id":27,"data":2},{"name":"minecraft:golden_rail","id":27,"data":3},{"name":"minecraft:golden_rail","id":27,"data":4},{"name":"minecraft:golden_rail","id":27,"data":5},{"name":"minecraft:golden_rail","id":27,"data":6},{"name":"minecraft:golden_rail","id":27,"data":7},{"name":"minecraft:golden_rail","id":27,"data":8},{"name":"minecraft:golden_rail","id":27,"data":9},{"name":"minecraft:golden_rail","id":27,"data":10},{"name":"minecraft:golden_rail","id":27,"data":11},{"name":"minecraft:golden_rail","id":27,"data":12},{"name":"minecraft:golden_rail","id":27,"data":13},{"name":"minecraft:golden_rail","id":27,"data":14},{"name":"minecraft:golden_rail","id":27,"data":15},{"name":"minecraft:detector_rail","id":28,"data":0},{"name":"minecraft:detector_rail","id":28,"data":1},{"name":"minecraft:detector_rail","id":28,"data":2},{"name":"minecraft:detector_rail","id":28,"data":3},{"name":"minecraft:detector_rail","id":28,"data":4},{"name":"minecraft:detector_rail","id":28,"data":5},{"name":"minecraft:detector_rail","id":28,"data":6},{"name":"minecraft:detector_rail","id":28,"data":7},{"name":"minecraft:detector_rail","id":28,"data":8},{"name":"minecraft:detector_rail","id":28,"data":9},{"name":"minecraft:detector_rail","id":28,"data":10},{"name":"minecraft:detector_rail","id":28,"data":11},{"name":"minecraft:detector_rail","id":28,"data":12},{"name":"minecraft:detector_rail","id":28,"data":13},{"name":"minecraft:detector_rail","id":28,"data":14},{"name":"minecraft:detector_rail","id":28,"data":15},{"name":"minecraft:sticky_piston","id":29,"data":0},{"name":"minecraft:sticky_piston","id":29,"data":1},{"name":"minecraft:sticky_piston","id":29,"data":2},{"name":"minecraft:sticky_piston","id":29,"data":3},{"name":"minecraft:sticky_piston","id":29,"data":4},{"name":"minecraft:sticky_piston","id":29,"data":5},{"name":"minecraft:sticky_piston","id":29,"data":6},{"name":"minecraft:sticky_piston","id":29,"data":7},{"name":"minecraft:web","id":30,"data":0},{"name":"minecraft:tallgrass","id":31,"data":0},{"name":"minecraft:tallgrass","id":31,"data":1},{"name":"minecraft:tallgrass","id":31,"data":2},{"name":"minecraft:tallgrass","id":31,"data":3},{"name":"minecraft:deadbush","id":32,"data":0},{"name":"minecraft:piston","id":33,"data":0},{"name":"minecraft:piston","id":33,"data":1},{"name":"minecraft:piston","id":33,"data":2},{"name":"minecraft:piston","id":33,"data":3},{"name":"minecraft:piston","id":33,"data":4},{"name":"minecraft:piston","id":33,"data":5},{"name":"minecraft:piston","id":33,"data":6},{"name":"minecraft:piston","id":33,"data":7},{"name":"minecraft:pistonArmCollision","id":34,"data":0},{"name":"minecraft:pistonArmCollision","id":34,"data":1},{"name":"minecraft:pistonArmCollision","id":34,"data":2},{"name":"minecraft:pistonArmCollision","id":34,"data":3},{"name":"minecraft:pistonArmCollision","id":34,"data":4},{"name":"minecraft:pistonArmCollision","id":34,"data":5},{"name":"minecraft:pistonArmCollision","id":34,"data":6},{"name":"minecraft:pistonArmCollision","id":34,"data":7},{"name":"minecraft:wool","id":35,"data":0},{"name":"minecraft:wool","id":35,"data":1},{"name":"minecraft:wool","id":35,"data":2},{"name":"minecraft:wool","id":35,"data":3},{"name":"minecraft:wool","id":35,"data":4},{"name":"minecraft:wool","id":35,"data":5},{"name":"minecraft:wool","id":35,"data":6},{"name":"minecraft:wool","id":35,"data":7},{"name":"minecraft:wool","id":35,"data":8},{"name":"minecraft:wool","id":35,"data":9},{"name":"minecraft:wool","id":35,"data":10},{"name":"minecraft:wool","id":35,"data":11},{"name":"minecraft:wool","id":35,"data":12},{"name":"minecraft:wool","id":35,"data":13},{"name":"minecraft:wool","id":35,"data":14},{"name":"minecraft:wool","id":35,"data":15},{"name":"minecraft:element_0","id":36,"data":0},{"name":"minecraft:yellow_flower","id":37,"data":0},{"name":"minecraft:red_flower","id":38,"data":0},{"name":"minecraft:red_flower","id":38,"data":1},{"name":"minecraft:red_flower","id":38,"data":2},{"name":"minecraft:red_flower","id":38,"data":3},{"name":"minecraft:red_flower","id":38,"data":4},{"name":"minecraft:red_flower","id":38,"data":5},{"name":"minecraft:red_flower","id":38,"data":6},{"name":"minecraft:red_flower","id":38,"data":7},{"name":"minecraft:red_flower","id":38,"data":8},{"name":"minecraft:red_flower","id":38,"data":9},{"name":"minecraft:red_flower","id":38,"data":10},{"name":"minecraft:red_flower","id":38,"data":11},{"name":"minecraft:red_flower","id":38,"data":12},{"name":"minecraft:red_flower","id":38,"data":13},{"name":"minecraft:red_flower","id":38,"data":14},{"name":"minecraft:red_flower","id":38,"data":15},{"name":"minecraft:brown_mushroom","id":39,"data":0},{"name":"minecraft:red_mushroom","id":40,"data":0},{"name":"minecraft:gold_block","id":41,"data":0},{"name":"minecraft:iron_block","id":42,"data":0},{"name":"minecraft:double_stone_slab","id":43,"data":0},{"name":"minecraft:double_stone_slab","id":43,"data":1},{"name":"minecraft:double_stone_slab","id":43,"data":2},{"name":"minecraft:double_stone_slab","id":43,"data":3},{"name":"minecraft:double_stone_slab","id":43,"data":4},{"name":"minecraft:double_stone_slab","id":43,"data":5},{"name":"minecraft:double_stone_slab","id":43,"data":6},{"name":"minecraft:double_stone_slab","id":43,"data":7},{"name":"minecraft:double_stone_slab","id":43,"data":8},{"name":"minecraft:double_stone_slab","id":43,"data":9},{"name":"minecraft:double_stone_slab","id":43,"data":10},{"name":"minecraft:double_stone_slab","id":43,"data":11},{"name":"minecraft:double_stone_slab","id":43,"data":12},{"name":"minecraft:double_stone_slab","id":43,"data":13},{"name":"minecraft:double_stone_slab","id":43,"data":14},{"name":"minecraft:double_stone_slab","id":43,"data":15},{"name":"minecraft:stone_slab","id":44,"data":0},{"name":"minecraft:stone_slab","id":44,"data":1},{"name":"minecraft:stone_slab","id":44,"data":2},{"name":"minecraft:stone_slab","id":44,"data":3},{"name":"minecraft:stone_slab","id":44,"data":4},{"name":"minecraft:stone_slab","id":44,"data":5},{"name":"minecraft:stone_slab","id":44,"data":6},{"name":"minecraft:stone_slab","id":44,"data":7},{"name":"minecraft:stone_slab","id":44,"data":8},{"name":"minecraft:stone_slab","id":44,"data":9},{"name":"minecraft:stone_slab","id":44,"data":10},{"name":"minecraft:stone_slab","id":44,"data":11},{"name":"minecraft:stone_slab","id":44,"data":12},{"name":"minecraft:stone_slab","id":44,"data":13},{"name":"minecraft:stone_slab","id":44,"data":14},{"name":"minecraft:stone_slab","id":44,"data":15},{"name":"minecraft:brick_block","id":45,"data":0},{"name":"minecraft:tnt","id":46,"data":0},{"name":"minecraft:tnt","id":46,"data":1},{"name":"minecraft:tnt","id":46,"data":2},{"name":"minecraft:tnt","id":46,"data":3},{"name":"minecraft:bookshelf","id":47,"data":0},{"name":"minecraft:mossy_cobblestone","id":48,"data":0},{"name":"minecraft:obsidian","id":49,"data":0},{"name":"minecraft:torch","id":50,"data":0},{"name":"minecraft:torch","id":50,"data":1},{"name":"minecraft:torch","id":50,"data":2},{"name":"minecraft:torch","id":50,"data":3},{"name":"minecraft:torch","id":50,"data":4},{"name":"minecraft:torch","id":50,"data":5},{"name":"minecraft:torch","id":50,"data":6},{"name":"minecraft:torch","id":50,"data":7},{"name":"minecraft:fire","id":51,"data":0},{"name":"minecraft:fire","id":51,"data":1},{"name":"minecraft:fire","id":51,"data":2},{"name":"minecraft:fire","id":51,"data":3},{"name":"minecraft:fire","id":51,"data":4},{"name":"minecraft:fire","id":51,"data":5},{"name":"minecraft:fire","id":51,"data":6},{"name":"minecraft:fire","id":51,"data":7},{"name":"minecraft:fire","id":51,"data":8},{"name":"minecraft:fire","id":51,"data":9},{"name":"minecraft:fire","id":51,"data":10},{"name":"minecraft:fire","id":51,"data":11},{"name":"minecraft:fire","id":51,"data":12},{"name":"minecraft:fire","id":51,"data":13},{"name":"minecraft:fire","id":51,"data":14},{"name":"minecraft:fire","id":51,"data":15},{"name":"minecraft:mob_spawner","id":52,"data":0},{"name":"minecraft:oak_stairs","id":53,"data":0},{"name":"minecraft:oak_stairs","id":53,"data":1},{"name":"minecraft:oak_stairs","id":53,"data":2},{"name":"minecraft:oak_stairs","id":53,"data":3},{"name":"minecraft:oak_stairs","id":53,"data":4},{"name":"minecraft:oak_stairs","id":53,"data":5},{"name":"minecraft:oak_stairs","id":53,"data":6},{"name":"minecraft:oak_stairs","id":53,"data":7},{"name":"minecraft:chest","id":54,"data":0},{"name":"minecraft:chest","id":54,"data":1},{"name":"minecraft:chest","id":54,"data":2},{"name":"minecraft:chest","id":54,"data":3},{"name":"minecraft:chest","id":54,"data":4},{"name":"minecraft:chest","id":54,"data":5},{"name":"minecraft:chest","id":54,"data":6},{"name":"minecraft:chest","id":54,"data":7},{"name":"minecraft:redstone_wire","id":55,"data":0},{"name":"minecraft:redstone_wire","id":55,"data":1},{"name":"minecraft:redstone_wire","id":55,"data":2},{"name":"minecraft:redstone_wire","id":55,"data":3},{"name":"minecraft:redstone_wire","id":55,"data":4},{"name":"minecraft:redstone_wire","id":55,"data":5},{"name":"minecraft:redstone_wire","id":55,"data":6},{"name":"minecraft:redstone_wire","id":55,"data":7},{"name":"minecraft:redstone_wire","id":55,"data":8},{"name":"minecraft:redstone_wire","id":55,"data":9},{"name":"minecraft:redstone_wire","id":55,"data":10},{"name":"minecraft:redstone_wire","id":55,"data":11},{"name":"minecraft:redstone_wire","id":55,"data":12},{"name":"minecraft:redstone_wire","id":55,"data":13},{"name":"minecraft:redstone_wire","id":55,"data":14},{"name":"minecraft:redstone_wire","id":55,"data":15},{"name":"minecraft:diamond_ore","id":56,"data":0},{"name":"minecraft:diamond_block","id":57,"data":0},{"name":"minecraft:crafting_table","id":58,"data":0},{"name":"minecraft:wheat","id":59,"data":0},{"name":"minecraft:wheat","id":59,"data":1},{"name":"minecraft:wheat","id":59,"data":2},{"name":"minecraft:wheat","id":59,"data":3},{"name":"minecraft:wheat","id":59,"data":4},{"name":"minecraft:wheat","id":59,"data":5},{"name":"minecraft:wheat","id":59,"data":6},{"name":"minecraft:wheat","id":59,"data":7},{"name":"minecraft:farmland","id":60,"data":0},{"name":"minecraft:farmland","id":60,"data":1},{"name":"minecraft:farmland","id":60,"data":2},{"name":"minecraft:farmland","id":60,"data":3},{"name":"minecraft:farmland","id":60,"data":4},{"name":"minecraft:farmland","id":60,"data":5},{"name":"minecraft:farmland","id":60,"data":6},{"name":"minecraft:farmland","id":60,"data":7},{"name":"minecraft:furnace","id":61,"data":0},{"name":"minecraft:furnace","id":61,"data":1},{"name":"minecraft:furnace","id":61,"data":2},{"name":"minecraft:furnace","id":61,"data":3},{"name":"minecraft:furnace","id":61,"data":4},{"name":"minecraft:furnace","id":61,"data":5},{"name":"minecraft:furnace","id":61,"data":6},{"name":"minecraft:furnace","id":61,"data":7},{"name":"minecraft:lit_furnace","id":62,"data":0},{"name":"minecraft:lit_furnace","id":62,"data":1},{"name":"minecraft:lit_furnace","id":62,"data":2},{"name":"minecraft:lit_furnace","id":62,"data":3},{"name":"minecraft:lit_furnace","id":62,"data":4},{"name":"minecraft:lit_furnace","id":62,"data":5},{"name":"minecraft:lit_furnace","id":62,"data":6},{"name":"minecraft:lit_furnace","id":62,"data":7},{"name":"minecraft:standing_sign","id":63,"data":0},{"name":"minecraft:standing_sign","id":63,"data":1},{"name":"minecraft:standing_sign","id":63,"data":2},{"name":"minecraft:standing_sign","id":63,"data":3},{"name":"minecraft:standing_sign","id":63,"data":4},{"name":"minecraft:standing_sign","id":63,"data":5},{"name":"minecraft:standing_sign","id":63,"data":6},{"name":"minecraft:standing_sign","id":63,"data":7},{"name":"minecraft:standing_sign","id":63,"data":8},{"name":"minecraft:standing_sign","id":63,"data":9},{"name":"minecraft:standing_sign","id":63,"data":10},{"name":"minecraft:standing_sign","id":63,"data":11},{"name":"minecraft:standing_sign","id":63,"data":12},{"name":"minecraft:standing_sign","id":63,"data":13},{"name":"minecraft:standing_sign","id":63,"data":14},{"name":"minecraft:standing_sign","id":63,"data":15},{"name":"minecraft:wooden_door","id":64,"data":0},{"name":"minecraft:wooden_door","id":64,"data":1},{"name":"minecraft:wooden_door","id":64,"data":2},{"name":"minecraft:wooden_door","id":64,"data":3},{"name":"minecraft:wooden_door","id":64,"data":4},{"name":"minecraft:wooden_door","id":64,"data":5},{"name":"minecraft:wooden_door","id":64,"data":6},{"name":"minecraft:wooden_door","id":64,"data":7},{"name":"minecraft:wooden_door","id":64,"data":8},{"name":"minecraft:wooden_door","id":64,"data":9},{"name":"minecraft:wooden_door","id":64,"data":10},{"name":"minecraft:wooden_door","id":64,"data":11},{"name":"minecraft:wooden_door","id":64,"data":12},{"name":"minecraft:wooden_door","id":64,"data":13},{"name":"minecraft:wooden_door","id":64,"data":14},{"name":"minecraft:wooden_door","id":64,"data":15},{"name":"minecraft:ladder","id":65,"data":0},{"name":"minecraft:ladder","id":65,"data":1},{"name":"minecraft:ladder","id":65,"data":2},{"name":"minecraft:ladder","id":65,"data":3},{"name":"minecraft:ladder","id":65,"data":4},{"name":"minecraft:ladder","id":65,"data":5},{"name":"minecraft:ladder","id":65,"data":6},{"name":"minecraft:ladder","id":65,"data":7},{"name":"minecraft:rail","id":66,"data":0},{"name":"minecraft:rail","id":66,"data":1},{"name":"minecraft:rail","id":66,"data":2},{"name":"minecraft:rail","id":66,"data":3},{"name":"minecraft:rail","id":66,"data":4},{"name":"minecraft:rail","id":66,"data":5},{"name":"minecraft:rail","id":66,"data":6},{"name":"minecraft:rail","id":66,"data":7},{"name":"minecraft:rail","id":66,"data":8},{"name":"minecraft:rail","id":66,"data":9},{"name":"minecraft:rail","id":66,"data":10},{"name":"minecraft:rail","id":66,"data":11},{"name":"minecraft:rail","id":66,"data":12},{"name":"minecraft:rail","id":66,"data":13},{"name":"minecraft:rail","id":66,"data":14},{"name":"minecraft:rail","id":66,"data":15},{"name":"minecraft:stone_stairs","id":67,"data":0},{"name":"minecraft:stone_stairs","id":67,"data":1},{"name":"minecraft:stone_stairs","id":67,"data":2},{"name":"minecraft:stone_stairs","id":67,"data":3},{"name":"minecraft:stone_stairs","id":67,"data":4},{"name":"minecraft:stone_stairs","id":67,"data":5},{"name":"minecraft:stone_stairs","id":67,"data":6},{"name":"minecraft:stone_stairs","id":67,"data":7},{"name":"minecraft:wall_sign","id":68,"data":0},{"name":"minecraft:wall_sign","id":68,"data":1},{"name":"minecraft:wall_sign","id":68,"data":2},{"name":"minecraft:wall_sign","id":68,"data":3},{"name":"minecraft:wall_sign","id":68,"data":4},{"name":"minecraft:wall_sign","id":68,"data":5},{"name":"minecraft:wall_sign","id":68,"data":6},{"name":"minecraft:wall_sign","id":68,"data":7},{"name":"minecraft:lever","id":69,"data":0},{"name":"minecraft:lever","id":69,"data":1},{"name":"minecraft:lever","id":69,"data":2},{"name":"minecraft:lever","id":69,"data":3},{"name":"minecraft:lever","id":69,"data":4},{"name":"minecraft:lever","id":69,"data":5},{"name":"minecraft:lever","id":69,"data":6},{"name":"minecraft:lever","id":69,"data":7},{"name":"minecraft:lever","id":69,"data":8},{"name":"minecraft:lever","id":69,"data":9},{"name":"minecraft:lever","id":69,"data":10},{"name":"minecraft:lever","id":69,"data":11},{"name":"minecraft:lever","id":69,"data":12},{"name":"minecraft:lever","id":69,"data":13},{"name":"minecraft:lever","id":69,"data":14},{"name":"minecraft:lever","id":69,"data":15},{"name":"minecraft:stone_pressure_plate","id":70,"data":0},{"name":"minecraft:stone_pressure_plate","id":70,"data":1},{"name":"minecraft:stone_pressure_plate","id":70,"data":2},{"name":"minecraft:stone_pressure_plate","id":70,"data":3},{"name":"minecraft:stone_pressure_plate","id":70,"data":4},{"name":"minecraft:stone_pressure_plate","id":70,"data":5},{"name":"minecraft:stone_pressure_plate","id":70,"data":6},{"name":"minecraft:stone_pressure_plate","id":70,"data":7},{"name":"minecraft:stone_pressure_plate","id":70,"data":8},{"name":"minecraft:stone_pressure_plate","id":70,"data":9},{"name":"minecraft:stone_pressure_plate","id":70,"data":10},{"name":"minecraft:stone_pressure_plate","id":70,"data":11},{"name":"minecraft:stone_pressure_plate","id":70,"data":12},{"name":"minecraft:stone_pressure_plate","id":70,"data":13},{"name":"minecraft:stone_pressure_plate","id":70,"data":14},{"name":"minecraft:stone_pressure_plate","id":70,"data":15},{"name":"minecraft:iron_door","id":71,"data":0},{"name":"minecraft:iron_door","id":71,"data":1},{"name":"minecraft:iron_door","id":71,"data":2},{"name":"minecraft:iron_door","id":71,"data":3},{"name":"minecraft:iron_door","id":71,"data":4},{"name":"minecraft:iron_door","id":71,"data":5},{"name":"minecraft:iron_door","id":71,"data":6},{"name":"minecraft:iron_door","id":71,"data":7},{"name":"minecraft:iron_door","id":71,"data":8},{"name":"minecraft:iron_door","id":71,"data":9},{"name":"minecraft:iron_door","id":71,"data":10},{"name":"minecraft:iron_door","id":71,"data":11},{"name":"minecraft:iron_door","id":71,"data":12},{"name":"minecraft:iron_door","id":71,"data":13},{"name":"minecraft:iron_door","id":71,"data":14},{"name":"minecraft:iron_door","id":71,"data":15},{"name":"minecraft:wooden_pressure_plate","id":72,"data":0},{"name":"minecraft:wooden_pressure_plate","id":72,"data":1},{"name":"minecraft:wooden_pressure_plate","id":72,"data":2},{"name":"minecraft:wooden_pressure_plate","id":72,"data":3},{"name":"minecraft:wooden_pressure_plate","id":72,"data":4},{"name":"minecraft:wooden_pressure_plate","id":72,"data":5},{"name":"minecraft:wooden_pressure_plate","id":72,"data":6},{"name":"minecraft:wooden_pressure_plate","id":72,"data":7},{"name":"minecraft:wooden_pressure_plate","id":72,"data":8},{"name":"minecraft:wooden_pressure_plate","id":72,"data":9},{"name":"minecraft:wooden_pressure_plate","id":72,"data":10},{"name":"minecraft:wooden_pressure_plate","id":72,"data":11},{"name":"minecraft:wooden_pressure_plate","id":72,"data":12},{"name":"minecraft:wooden_pressure_plate","id":72,"data":13},{"name":"minecraft:wooden_pressure_plate","id":72,"data":14},{"name":"minecraft:wooden_pressure_plate","id":72,"data":15},{"name":"minecraft:redstone_ore","id":73,"data":0},{"name":"minecraft:lit_redstone_ore","id":74,"data":0},{"name":"minecraft:unlit_redstone_torch","id":75,"data":0},{"name":"minecraft:unlit_redstone_torch","id":75,"data":1},{"name":"minecraft:unlit_redstone_torch","id":75,"data":2},{"name":"minecraft:unlit_redstone_torch","id":75,"data":3},{"name":"minecraft:unlit_redstone_torch","id":75,"data":4},{"name":"minecraft:unlit_redstone_torch","id":75,"data":5},{"name":"minecraft:unlit_redstone_torch","id":75,"data":6},{"name":"minecraft:unlit_redstone_torch","id":75,"data":7},{"name":"minecraft:redstone_torch","id":76,"data":0},{"name":"minecraft:redstone_torch","id":76,"data":1},{"name":"minecraft:redstone_torch","id":76,"data":2},{"name":"minecraft:redstone_torch","id":76,"data":3},{"name":"minecraft:redstone_torch","id":76,"data":4},{"name":"minecraft:redstone_torch","id":76,"data":5},{"name":"minecraft:redstone_torch","id":76,"data":6},{"name":"minecraft:redstone_torch","id":76,"data":7},{"name":"minecraft:stone_button","id":77,"data":0},{"name":"minecraft:stone_button","id":77,"data":1},{"name":"minecraft:stone_button","id":77,"data":2},{"name":"minecraft:stone_button","id":77,"data":3},{"name":"minecraft:stone_button","id":77,"data":4},{"name":"minecraft:stone_button","id":77,"data":5},{"name":"minecraft:stone_button","id":77,"data":6},{"name":"minecraft:stone_button","id":77,"data":7},{"name":"minecraft:stone_button","id":77,"data":8},{"name":"minecraft:stone_button","id":77,"data":9},{"name":"minecraft:stone_button","id":77,"data":10},{"name":"minecraft:stone_button","id":77,"data":11},{"name":"minecraft:stone_button","id":77,"data":12},{"name":"minecraft:stone_button","id":77,"data":13},{"name":"minecraft:stone_button","id":77,"data":14},{"name":"minecraft:stone_button","id":77,"data":15},{"name":"minecraft:snow_layer","id":78,"data":0},{"name":"minecraft:snow_layer","id":78,"data":1},{"name":"minecraft:snow_layer","id":78,"data":2},{"name":"minecraft:snow_layer","id":78,"data":3},{"name":"minecraft:snow_layer","id":78,"data":4},{"name":"minecraft:snow_layer","id":78,"data":5},{"name":"minecraft:snow_layer","id":78,"data":6},{"name":"minecraft:snow_layer","id":78,"data":7},{"name":"minecraft:snow_layer","id":78,"data":8},{"name":"minecraft:snow_layer","id":78,"data":9},{"name":"minecraft:snow_layer","id":78,"data":10},{"name":"minecraft:snow_layer","id":78,"data":11},{"name":"minecraft:snow_layer","id":78,"data":12},{"name":"minecraft:snow_layer","id":78,"data":13},{"name":"minecraft:snow_layer","id":78,"data":14},{"name":"minecraft:snow_layer","id":78,"data":15},{"name":"minecraft:ice","id":79,"data":0},{"name":"minecraft:snow","id":80,"data":0},{"name":"minecraft:cactus","id":81,"data":0},{"name":"minecraft:cactus","id":81,"data":1},{"name":"minecraft:cactus","id":81,"data":2},{"name":"minecraft:cactus","id":81,"data":3},{"name":"minecraft:cactus","id":81,"data":4},{"name":"minecraft:cactus","id":81,"data":5},{"name":"minecraft:cactus","id":81,"data":6},{"name":"minecraft:cactus","id":81,"data":7},{"name":"minecraft:cactus","id":81,"data":8},{"name":"minecraft:cactus","id":81,"data":9},{"name":"minecraft:cactus","id":81,"data":10},{"name":"minecraft:cactus","id":81,"data":11},{"name":"minecraft:cactus","id":81,"data":12},{"name":"minecraft:cactus","id":81,"data":13},{"name":"minecraft:cactus","id":81,"data":14},{"name":"minecraft:cactus","id":81,"data":15},{"name":"minecraft:clay","id":82,"data":0},{"name":"minecraft:reeds","id":83,"data":0},{"name":"minecraft:reeds","id":83,"data":1},{"name":"minecraft:reeds","id":83,"data":2},{"name":"minecraft:reeds","id":83,"data":3},{"name":"minecraft:reeds","id":83,"data":4},{"name":"minecraft:reeds","id":83,"data":5},{"name":"minecraft:reeds","id":83,"data":6},{"name":"minecraft:reeds","id":83,"data":7},{"name":"minecraft:reeds","id":83,"data":8},{"name":"minecraft:reeds","id":83,"data":9},{"name":"minecraft:reeds","id":83,"data":10},{"name":"minecraft:reeds","id":83,"data":11},{"name":"minecraft:reeds","id":83,"data":12},{"name":"minecraft:reeds","id":83,"data":13},{"name":"minecraft:reeds","id":83,"data":14},{"name":"minecraft:reeds","id":83,"data":15},{"name":"minecraft:jukebox","id":84,"data":0},{"name":"minecraft:fence","id":85,"data":0},{"name":"minecraft:fence","id":85,"data":1},{"name":"minecraft:fence","id":85,"data":2},{"name":"minecraft:fence","id":85,"data":3},{"name":"minecraft:fence","id":85,"data":4},{"name":"minecraft:fence","id":85,"data":5},{"name":"minecraft:fence","id":85,"data":6},{"name":"minecraft:fence","id":85,"data":7},{"name":"minecraft:pumpkin","id":86,"data":0},{"name":"minecraft:pumpkin","id":86,"data":1},{"name":"minecraft:pumpkin","id":86,"data":2},{"name":"minecraft:pumpkin","id":86,"data":3},{"name":"minecraft:netherrack","id":87,"data":0},{"name":"minecraft:soul_sand","id":88,"data":0},{"name":"minecraft:glowstone","id":89,"data":0},{"name":"minecraft:portal","id":90,"data":0},{"name":"minecraft:portal","id":90,"data":1},{"name":"minecraft:portal","id":90,"data":2},{"name":"minecraft:portal","id":90,"data":3},{"name":"minecraft:lit_pumpkin","id":91,"data":0},{"name":"minecraft:lit_pumpkin","id":91,"data":1},{"name":"minecraft:lit_pumpkin","id":91,"data":2},{"name":"minecraft:lit_pumpkin","id":91,"data":3},{"name":"minecraft:cake","id":92,"data":0},{"name":"minecraft:cake","id":92,"data":1},{"name":"minecraft:cake","id":92,"data":2},{"name":"minecraft:cake","id":92,"data":3},{"name":"minecraft:cake","id":92,"data":4},{"name":"minecraft:cake","id":92,"data":5},{"name":"minecraft:cake","id":92,"data":6},{"name":"minecraft:cake","id":92,"data":7},{"name":"minecraft:unpowered_repeater","id":93,"data":0},{"name":"minecraft:unpowered_repeater","id":93,"data":1},{"name":"minecraft:unpowered_repeater","id":93,"data":2},{"name":"minecraft:unpowered_repeater","id":93,"data":3},{"name":"minecraft:unpowered_repeater","id":93,"data":4},{"name":"minecraft:unpowered_repeater","id":93,"data":5},{"name":"minecraft:unpowered_repeater","id":93,"data":6},{"name":"minecraft:unpowered_repeater","id":93,"data":7},{"name":"minecraft:unpowered_repeater","id":93,"data":8},{"name":"minecraft:unpowered_repeater","id":93,"data":9},{"name":"minecraft:unpowered_repeater","id":93,"data":10},{"name":"minecraft:unpowered_repeater","id":93,"data":11},{"name":"minecraft:unpowered_repeater","id":93,"data":12},{"name":"minecraft:unpowered_repeater","id":93,"data":13},{"name":"minecraft:unpowered_repeater","id":93,"data":14},{"name":"minecraft:unpowered_repeater","id":93,"data":15},{"name":"minecraft:powered_repeater","id":94,"data":0},{"name":"minecraft:powered_repeater","id":94,"data":1},{"name":"minecraft:powered_repeater","id":94,"data":2},{"name":"minecraft:powered_repeater","id":94,"data":3},{"name":"minecraft:powered_repeater","id":94,"data":4},{"name":"minecraft:powered_repeater","id":94,"data":5},{"name":"minecraft:powered_repeater","id":94,"data":6},{"name":"minecraft:powered_repeater","id":94,"data":7},{"name":"minecraft:powered_repeater","id":94,"data":8},{"name":"minecraft:powered_repeater","id":94,"data":9},{"name":"minecraft:powered_repeater","id":94,"data":10},{"name":"minecraft:powered_repeater","id":94,"data":11},{"name":"minecraft:powered_repeater","id":94,"data":12},{"name":"minecraft:powered_repeater","id":94,"data":13},{"name":"minecraft:powered_repeater","id":94,"data":14},{"name":"minecraft:powered_repeater","id":94,"data":15},{"name":"minecraft:invisibleBedrock","id":95,"data":0},{"name":"minecraft:trapdoor","id":96,"data":0},{"name":"minecraft:trapdoor","id":96,"data":1},{"name":"minecraft:trapdoor","id":96,"data":2},{"name":"minecraft:trapdoor","id":96,"data":3},{"name":"minecraft:trapdoor","id":96,"data":4},{"name":"minecraft:trapdoor","id":96,"data":5},{"name":"minecraft:trapdoor","id":96,"data":6},{"name":"minecraft:trapdoor","id":96,"data":7},{"name":"minecraft:trapdoor","id":96,"data":8},{"name":"minecraft:trapdoor","id":96,"data":9},{"name":"minecraft:trapdoor","id":96,"data":10},{"name":"minecraft:trapdoor","id":96,"data":11},{"name":"minecraft:trapdoor","id":96,"data":12},{"name":"minecraft:trapdoor","id":96,"data":13},{"name":"minecraft:trapdoor","id":96,"data":14},{"name":"minecraft:trapdoor","id":96,"data":15},{"name":"minecraft:monster_egg","id":97,"data":0},{"name":"minecraft:monster_egg","id":97,"data":1},{"name":"minecraft:monster_egg","id":97,"data":2},{"name":"minecraft:monster_egg","id":97,"data":3},{"name":"minecraft:monster_egg","id":97,"data":4},{"name":"minecraft:monster_egg","id":97,"data":5},{"name":"minecraft:monster_egg","id":97,"data":6},{"name":"minecraft:monster_egg","id":97,"data":7},{"name":"minecraft:stonebrick","id":98,"data":0},{"name":"minecraft:stonebrick","id":98,"data":1},{"name":"minecraft:stonebrick","id":98,"data":2},{"name":"minecraft:stonebrick","id":98,"data":3},{"name":"minecraft:stonebrick","id":98,"data":4},{"name":"minecraft:stonebrick","id":98,"data":5},{"name":"minecraft:stonebrick","id":98,"data":6},{"name":"minecraft:stonebrick","id":98,"data":7},{"name":"minecraft:brown_mushroom_block","id":99,"data":0},{"name":"minecraft:brown_mushroom_block","id":99,"data":1},{"name":"minecraft:brown_mushroom_block","id":99,"data":2},{"name":"minecraft:brown_mushroom_block","id":99,"data":3},{"name":"minecraft:brown_mushroom_block","id":99,"data":4},{"name":"minecraft:brown_mushroom_block","id":99,"data":5},{"name":"minecraft:brown_mushroom_block","id":99,"data":6},{"name":"minecraft:brown_mushroom_block","id":99,"data":7},{"name":"minecraft:brown_mushroom_block","id":99,"data":8},{"name":"minecraft:brown_mushroom_block","id":99,"data":9},{"name":"minecraft:brown_mushroom_block","id":99,"data":10},{"name":"minecraft:brown_mushroom_block","id":99,"data":11},{"name":"minecraft:brown_mushroom_block","id":99,"data":12},{"name":"minecraft:brown_mushroom_block","id":99,"data":13},{"name":"minecraft:brown_mushroom_block","id":99,"data":14},{"name":"minecraft:brown_mushroom_block","id":99,"data":15},{"name":"minecraft:red_mushroom_block","id":100,"data":0},{"name":"minecraft:red_mushroom_block","id":100,"data":1},{"name":"minecraft:red_mushroom_block","id":100,"data":2},{"name":"minecraft:red_mushroom_block","id":100,"data":3},{"name":"minecraft:red_mushroom_block","id":100,"data":4},{"name":"minecraft:red_mushroom_block","id":100,"data":5},{"name":"minecraft:red_mushroom_block","id":100,"data":6},{"name":"minecraft:red_mushroom_block","id":100,"data":7},{"name":"minecraft:red_mushroom_block","id":100,"data":8},{"name":"minecraft:red_mushroom_block","id":100,"data":9},{"name":"minecraft:red_mushroom_block","id":100,"data":10},{"name":"minecraft:red_mushroom_block","id":100,"data":11},{"name":"minecraft:red_mushroom_block","id":100,"data":12},{"name":"minecraft:red_mushroom_block","id":100,"data":13},{"name":"minecraft:red_mushroom_block","id":100,"data":14},{"name":"minecraft:red_mushroom_block","id":100,"data":15},{"name":"minecraft:iron_bars","id":101,"data":0},{"name":"minecraft:glass_pane","id":102,"data":0},{"name":"minecraft:melon_block","id":103,"data":0},{"name":"minecraft:pumpkin_stem","id":104,"data":0},{"name":"minecraft:pumpkin_stem","id":104,"data":1},{"name":"minecraft:pumpkin_stem","id":104,"data":2},{"name":"minecraft:pumpkin_stem","id":104,"data":3},{"name":"minecraft:pumpkin_stem","id":104,"data":4},{"name":"minecraft:pumpkin_stem","id":104,"data":5},{"name":"minecraft:pumpkin_stem","id":104,"data":6},{"name":"minecraft:pumpkin_stem","id":104,"data":7},{"name":"minecraft:melon_stem","id":105,"data":0},{"name":"minecraft:melon_stem","id":105,"data":1},{"name":"minecraft:melon_stem","id":105,"data":2},{"name":"minecraft:melon_stem","id":105,"data":3},{"name":"minecraft:melon_stem","id":105,"data":4},{"name":"minecraft:melon_stem","id":105,"data":5},{"name":"minecraft:melon_stem","id":105,"data":6},{"name":"minecraft:melon_stem","id":105,"data":7},{"name":"minecraft:vine","id":106,"data":0},{"name":"minecraft:vine","id":106,"data":1},{"name":"minecraft:vine","id":106,"data":2},{"name":"minecraft:vine","id":106,"data":3},{"name":"minecraft:vine","id":106,"data":4},{"name":"minecraft:vine","id":106,"data":5},{"name":"minecraft:vine","id":106,"data":6},{"name":"minecraft:vine","id":106,"data":7},{"name":"minecraft:vine","id":106,"data":8},{"name":"minecraft:vine","id":106,"data":9},{"name":"minecraft:vine","id":106,"data":10},{"name":"minecraft:vine","id":106,"data":11},{"name":"minecraft:vine","id":106,"data":12},{"name":"minecraft:vine","id":106,"data":13},{"name":"minecraft:vine","id":106,"data":14},{"name":"minecraft:vine","id":106,"data":15},{"name":"minecraft:fence_gate","id":107,"data":0},{"name":"minecraft:fence_gate","id":107,"data":1},{"name":"minecraft:fence_gate","id":107,"data":2},{"name":"minecraft:fence_gate","id":107,"data":3},{"name":"minecraft:fence_gate","id":107,"data":4},{"name":"minecraft:fence_gate","id":107,"data":5},{"name":"minecraft:fence_gate","id":107,"data":6},{"name":"minecraft:fence_gate","id":107,"data":7},{"name":"minecraft:fence_gate","id":107,"data":8},{"name":"minecraft:fence_gate","id":107,"data":9},{"name":"minecraft:fence_gate","id":107,"data":10},{"name":"minecraft:fence_gate","id":107,"data":11},{"name":"minecraft:fence_gate","id":107,"data":12},{"name":"minecraft:fence_gate","id":107,"data":13},{"name":"minecraft:fence_gate","id":107,"data":14},{"name":"minecraft:fence_gate","id":107,"data":15},{"name":"minecraft:brick_stairs","id":108,"data":0},{"name":"minecraft:brick_stairs","id":108,"data":1},{"name":"minecraft:brick_stairs","id":108,"data":2},{"name":"minecraft:brick_stairs","id":108,"data":3},{"name":"minecraft:brick_stairs","id":108,"data":4},{"name":"minecraft:brick_stairs","id":108,"data":5},{"name":"minecraft:brick_stairs","id":108,"data":6},{"name":"minecraft:brick_stairs","id":108,"data":7},{"name":"minecraft:stone_brick_stairs","id":109,"data":0},{"name":"minecraft:stone_brick_stairs","id":109,"data":1},{"name":"minecraft:stone_brick_stairs","id":109,"data":2},{"name":"minecraft:stone_brick_stairs","id":109,"data":3},{"name":"minecraft:stone_brick_stairs","id":109,"data":4},{"name":"minecraft:stone_brick_stairs","id":109,"data":5},{"name":"minecraft:stone_brick_stairs","id":109,"data":6},{"name":"minecraft:stone_brick_stairs","id":109,"data":7},{"name":"minecraft:mycelium","id":110,"data":0},{"name":"minecraft:waterlily","id":111,"data":0},{"name":"minecraft:nether_brick","id":112,"data":0},{"name":"minecraft:nether_brick_fence","id":113,"data":0},{"name":"minecraft:nether_brick_stairs","id":114,"data":0},{"name":"minecraft:nether_brick_stairs","id":114,"data":1},{"name":"minecraft:nether_brick_stairs","id":114,"data":2},{"name":"minecraft:nether_brick_stairs","id":114,"data":3},{"name":"minecraft:nether_brick_stairs","id":114,"data":4},{"name":"minecraft:nether_brick_stairs","id":114,"data":5},{"name":"minecraft:nether_brick_stairs","id":114,"data":6},{"name":"minecraft:nether_brick_stairs","id":114,"data":7},{"name":"minecraft:nether_wart","id":115,"data":0},{"name":"minecraft:nether_wart","id":115,"data":1},{"name":"minecraft:nether_wart","id":115,"data":2},{"name":"minecraft:nether_wart","id":115,"data":3},{"name":"minecraft:enchanting_table","id":116,"data":0},{"name":"minecraft:brewing_stand","id":117,"data":0},{"name":"minecraft:brewing_stand","id":117,"data":1},{"name":"minecraft:brewing_stand","id":117,"data":2},{"name":"minecraft:brewing_stand","id":117,"data":3},{"name":"minecraft:brewing_stand","id":117,"data":4},{"name":"minecraft:brewing_stand","id":117,"data":5},{"name":"minecraft:brewing_stand","id":117,"data":6},{"name":"minecraft:brewing_stand","id":117,"data":7},{"name":"minecraft:cauldron","id":118,"data":0},{"name":"minecraft:cauldron","id":118,"data":1},{"name":"minecraft:cauldron","id":118,"data":2},{"name":"minecraft:cauldron","id":118,"data":3},{"name":"minecraft:cauldron","id":118,"data":4},{"name":"minecraft:cauldron","id":118,"data":5},{"name":"minecraft:cauldron","id":118,"data":6},{"name":"minecraft:cauldron","id":118,"data":7},{"name":"minecraft:cauldron","id":118,"data":8},{"name":"minecraft:cauldron","id":118,"data":9},{"name":"minecraft:cauldron","id":118,"data":10},{"name":"minecraft:cauldron","id":118,"data":11},{"name":"minecraft:cauldron","id":118,"data":12},{"name":"minecraft:cauldron","id":118,"data":13},{"name":"minecraft:cauldron","id":118,"data":14},{"name":"minecraft:cauldron","id":118,"data":15},{"name":"minecraft:end_portal","id":119,"data":0},{"name":"minecraft:end_portal_frame","id":120,"data":0},{"name":"minecraft:end_portal_frame","id":120,"data":1},{"name":"minecraft:end_portal_frame","id":120,"data":2},{"name":"minecraft:end_portal_frame","id":120,"data":3},{"name":"minecraft:end_portal_frame","id":120,"data":4},{"name":"minecraft:end_portal_frame","id":120,"data":5},{"name":"minecraft:end_portal_frame","id":120,"data":6},{"name":"minecraft:end_portal_frame","id":120,"data":7},{"name":"minecraft:end_stone","id":121,"data":0},{"name":"minecraft:dragon_egg","id":122,"data":0},{"name":"minecraft:redstone_lamp","id":123,"data":0},{"name":"minecraft:lit_redstone_lamp","id":124,"data":0},{"name":"minecraft:dropper","id":125,"data":0},{"name":"minecraft:dropper","id":125,"data":1},{"name":"minecraft:dropper","id":125,"data":2},{"name":"minecraft:dropper","id":125,"data":3},{"name":"minecraft:dropper","id":125,"data":4},{"name":"minecraft:dropper","id":125,"data":5},{"name":"minecraft:dropper","id":125,"data":6},{"name":"minecraft:dropper","id":125,"data":7},{"name":"minecraft:dropper","id":125,"data":8},{"name":"minecraft:dropper","id":125,"data":9},{"name":"minecraft:dropper","id":125,"data":10},{"name":"minecraft:dropper","id":125,"data":11},{"name":"minecraft:dropper","id":125,"data":12},{"name":"minecraft:dropper","id":125,"data":13},{"name":"minecraft:dropper","id":125,"data":14},{"name":"minecraft:dropper","id":125,"data":15},{"name":"minecraft:activator_rail","id":126,"data":0},{"name":"minecraft:activator_rail","id":126,"data":1},{"name":"minecraft:activator_rail","id":126,"data":2},{"name":"minecraft:activator_rail","id":126,"data":3},{"name":"minecraft:activator_rail","id":126,"data":4},{"name":"minecraft:activator_rail","id":126,"data":5},{"name":"minecraft:activator_rail","id":126,"data":6},{"name":"minecraft:activator_rail","id":126,"data":7},{"name":"minecraft:activator_rail","id":126,"data":8},{"name":"minecraft:activator_rail","id":126,"data":9},{"name":"minecraft:activator_rail","id":126,"data":10},{"name":"minecraft:activator_rail","id":126,"data":11},{"name":"minecraft:activator_rail","id":126,"data":12},{"name":"minecraft:activator_rail","id":126,"data":13},{"name":"minecraft:activator_rail","id":126,"data":14},{"name":"minecraft:activator_rail","id":126,"data":15},{"name":"minecraft:cocoa","id":127,"data":0},{"name":"minecraft:cocoa","id":127,"data":1},{"name":"minecraft:cocoa","id":127,"data":2},{"name":"minecraft:cocoa","id":127,"data":3},{"name":"minecraft:cocoa","id":127,"data":4},{"name":"minecraft:cocoa","id":127,"data":5},{"name":"minecraft:cocoa","id":127,"data":6},{"name":"minecraft:cocoa","id":127,"data":7},{"name":"minecraft:cocoa","id":127,"data":8},{"name":"minecraft:cocoa","id":127,"data":9},{"name":"minecraft:cocoa","id":127,"data":10},{"name":"minecraft:cocoa","id":127,"data":11},{"name":"minecraft:cocoa","id":127,"data":12},{"name":"minecraft:cocoa","id":127,"data":13},{"name":"minecraft:cocoa","id":127,"data":14},{"name":"minecraft:cocoa","id":127,"data":15},{"name":"minecraft:sandstone_stairs","id":128,"data":0},{"name":"minecraft:sandstone_stairs","id":128,"data":1},{"name":"minecraft:sandstone_stairs","id":128,"data":2},{"name":"minecraft:sandstone_stairs","id":128,"data":3},{"name":"minecraft:sandstone_stairs","id":128,"data":4},{"name":"minecraft:sandstone_stairs","id":128,"data":5},{"name":"minecraft:sandstone_stairs","id":128,"data":6},{"name":"minecraft:sandstone_stairs","id":128,"data":7},{"name":"minecraft:emerald_ore","id":129,"data":0},{"name":"minecraft:ender_chest","id":130,"data":0},{"name":"minecraft:ender_chest","id":130,"data":1},{"name":"minecraft:ender_chest","id":130,"data":2},{"name":"minecraft:ender_chest","id":130,"data":3},{"name":"minecraft:ender_chest","id":130,"data":4},{"name":"minecraft:ender_chest","id":130,"data":5},{"name":"minecraft:ender_chest","id":130,"data":6},{"name":"minecraft:ender_chest","id":130,"data":7},{"name":"minecraft:tripwire_hook","id":131,"data":0},{"name":"minecraft:tripwire_hook","id":131,"data":1},{"name":"minecraft:tripwire_hook","id":131,"data":2},{"name":"minecraft:tripwire_hook","id":131,"data":3},{"name":"minecraft:tripwire_hook","id":131,"data":4},{"name":"minecraft:tripwire_hook","id":131,"data":5},{"name":"minecraft:tripwire_hook","id":131,"data":6},{"name":"minecraft:tripwire_hook","id":131,"data":7},{"name":"minecraft:tripwire_hook","id":131,"data":8},{"name":"minecraft:tripwire_hook","id":131,"data":9},{"name":"minecraft:tripwire_hook","id":131,"data":10},{"name":"minecraft:tripwire_hook","id":131,"data":11},{"name":"minecraft:tripwire_hook","id":131,"data":12},{"name":"minecraft:tripwire_hook","id":131,"data":13},{"name":"minecraft:tripwire_hook","id":131,"data":14},{"name":"minecraft:tripwire_hook","id":131,"data":15},{"name":"minecraft:tripWire","id":132,"data":0},{"name":"minecraft:tripWire","id":132,"data":1},{"name":"minecraft:tripWire","id":132,"data":2},{"name":"minecraft:tripWire","id":132,"data":3},{"name":"minecraft:tripWire","id":132,"data":4},{"name":"minecraft:tripWire","id":132,"data":5},{"name":"minecraft:tripWire","id":132,"data":6},{"name":"minecraft:tripWire","id":132,"data":7},{"name":"minecraft:tripWire","id":132,"data":8},{"name":"minecraft:tripWire","id":132,"data":9},{"name":"minecraft:tripWire","id":132,"data":10},{"name":"minecraft:tripWire","id":132,"data":11},{"name":"minecraft:tripWire","id":132,"data":12},{"name":"minecraft:tripWire","id":132,"data":13},{"name":"minecraft:tripWire","id":132,"data":14},{"name":"minecraft:tripWire","id":132,"data":15},{"name":"minecraft:emerald_block","id":133,"data":0},{"name":"minecraft:spruce_stairs","id":134,"data":0},{"name":"minecraft:spruce_stairs","id":134,"data":1},{"name":"minecraft:spruce_stairs","id":134,"data":2},{"name":"minecraft:spruce_stairs","id":134,"data":3},{"name":"minecraft:spruce_stairs","id":134,"data":4},{"name":"minecraft:spruce_stairs","id":134,"data":5},{"name":"minecraft:spruce_stairs","id":134,"data":6},{"name":"minecraft:spruce_stairs","id":134,"data":7},{"name":"minecraft:birch_stairs","id":135,"data":0},{"name":"minecraft:birch_stairs","id":135,"data":1},{"name":"minecraft:birch_stairs","id":135,"data":2},{"name":"minecraft:birch_stairs","id":135,"data":3},{"name":"minecraft:birch_stairs","id":135,"data":4},{"name":"minecraft:birch_stairs","id":135,"data":5},{"name":"minecraft:birch_stairs","id":135,"data":6},{"name":"minecraft:birch_stairs","id":135,"data":7},{"name":"minecraft:jungle_stairs","id":136,"data":0},{"name":"minecraft:jungle_stairs","id":136,"data":1},{"name":"minecraft:jungle_stairs","id":136,"data":2},{"name":"minecraft:jungle_stairs","id":136,"data":3},{"name":"minecraft:jungle_stairs","id":136,"data":4},{"name":"minecraft:jungle_stairs","id":136,"data":5},{"name":"minecraft:jungle_stairs","id":136,"data":6},{"name":"minecraft:jungle_stairs","id":136,"data":7},{"name":"minecraft:command_block","id":137,"data":0},{"name":"minecraft:command_block","id":137,"data":1},{"name":"minecraft:command_block","id":137,"data":2},{"name":"minecraft:command_block","id":137,"data":3},{"name":"minecraft:command_block","id":137,"data":4},{"name":"minecraft:command_block","id":137,"data":5},{"name":"minecraft:command_block","id":137,"data":6},{"name":"minecraft:command_block","id":137,"data":7},{"name":"minecraft:command_block","id":137,"data":8},{"name":"minecraft:command_block","id":137,"data":9},{"name":"minecraft:command_block","id":137,"data":10},{"name":"minecraft:command_block","id":137,"data":11},{"name":"minecraft:command_block","id":137,"data":12},{"name":"minecraft:command_block","id":137,"data":13},{"name":"minecraft:command_block","id":137,"data":14},{"name":"minecraft:command_block","id":137,"data":15},{"name":"minecraft:beacon","id":138,"data":0},{"name":"minecraft:cobblestone_wall","id":139,"data":0},{"name":"minecraft:cobblestone_wall","id":139,"data":1},{"name":"minecraft:cobblestone_wall","id":139,"data":2},{"name":"minecraft:cobblestone_wall","id":139,"data":3},{"name":"minecraft:cobblestone_wall","id":139,"data":4},{"name":"minecraft:cobblestone_wall","id":139,"data":5},{"name":"minecraft:cobblestone_wall","id":139,"data":6},{"name":"minecraft:cobblestone_wall","id":139,"data":7},{"name":"minecraft:cobblestone_wall","id":139,"data":8},{"name":"minecraft:cobblestone_wall","id":139,"data":9},{"name":"minecraft:cobblestone_wall","id":139,"data":10},{"name":"minecraft:cobblestone_wall","id":139,"data":11},{"name":"minecraft:cobblestone_wall","id":139,"data":12},{"name":"minecraft:cobblestone_wall","id":139,"data":13},{"name":"minecraft:cobblestone_wall","id":139,"data":14},{"name":"minecraft:cobblestone_wall","id":139,"data":15},{"name":"minecraft:flower_pot","id":140,"data":0},{"name":"minecraft:flower_pot","id":140,"data":1},{"name":"minecraft:carrots","id":141,"data":0},{"name":"minecraft:carrots","id":141,"data":1},{"name":"minecraft:carrots","id":141,"data":2},{"name":"minecraft:carrots","id":141,"data":3},{"name":"minecraft:carrots","id":141,"data":4},{"name":"minecraft:carrots","id":141,"data":5},{"name":"minecraft:carrots","id":141,"data":6},{"name":"minecraft:carrots","id":141,"data":7},{"name":"minecraft:potatoes","id":142,"data":0},{"name":"minecraft:potatoes","id":142,"data":1},{"name":"minecraft:potatoes","id":142,"data":2},{"name":"minecraft:potatoes","id":142,"data":3},{"name":"minecraft:potatoes","id":142,"data":4},{"name":"minecraft:potatoes","id":142,"data":5},{"name":"minecraft:potatoes","id":142,"data":6},{"name":"minecraft:potatoes","id":142,"data":7},{"name":"minecraft:wooden_button","id":143,"data":0},{"name":"minecraft:wooden_button","id":143,"data":1},{"name":"minecraft:wooden_button","id":143,"data":2},{"name":"minecraft:wooden_button","id":143,"data":3},{"name":"minecraft:wooden_button","id":143,"data":4},{"name":"minecraft:wooden_button","id":143,"data":5},{"name":"minecraft:wooden_button","id":143,"data":6},{"name":"minecraft:wooden_button","id":143,"data":7},{"name":"minecraft:wooden_button","id":143,"data":8},{"name":"minecraft:wooden_button","id":143,"data":9},{"name":"minecraft:wooden_button","id":143,"data":10},{"name":"minecraft:wooden_button","id":143,"data":11},{"name":"minecraft:wooden_button","id":143,"data":12},{"name":"minecraft:wooden_button","id":143,"data":13},{"name":"minecraft:wooden_button","id":143,"data":14},{"name":"minecraft:wooden_button","id":143,"data":15},{"name":"minecraft:skull","id":144,"data":0},{"name":"minecraft:skull","id":144,"data":1},{"name":"minecraft:skull","id":144,"data":2},{"name":"minecraft:skull","id":144,"data":3},{"name":"minecraft:skull","id":144,"data":4},{"name":"minecraft:skull","id":144,"data":5},{"name":"minecraft:skull","id":144,"data":6},{"name":"minecraft:skull","id":144,"data":7},{"name":"minecraft:skull","id":144,"data":8},{"name":"minecraft:skull","id":144,"data":9},{"name":"minecraft:skull","id":144,"data":10},{"name":"minecraft:skull","id":144,"data":11},{"name":"minecraft:skull","id":144,"data":12},{"name":"minecraft:skull","id":144,"data":13},{"name":"minecraft:skull","id":144,"data":14},{"name":"minecraft:skull","id":144,"data":15},{"name":"minecraft:anvil","id":145,"data":0},{"name":"minecraft:anvil","id":145,"data":1},{"name":"minecraft:anvil","id":145,"data":2},{"name":"minecraft:anvil","id":145,"data":3},{"name":"minecraft:anvil","id":145,"data":4},{"name":"minecraft:anvil","id":145,"data":5},{"name":"minecraft:anvil","id":145,"data":6},{"name":"minecraft:anvil","id":145,"data":7},{"name":"minecraft:anvil","id":145,"data":8},{"name":"minecraft:anvil","id":145,"data":9},{"name":"minecraft:anvil","id":145,"data":10},{"name":"minecraft:anvil","id":145,"data":11},{"name":"minecraft:anvil","id":145,"data":12},{"name":"minecraft:anvil","id":145,"data":13},{"name":"minecraft:anvil","id":145,"data":14},{"name":"minecraft:anvil","id":145,"data":15},{"name":"minecraft:trapped_chest","id":146,"data":0},{"name":"minecraft:trapped_chest","id":146,"data":1},{"name":"minecraft:trapped_chest","id":146,"data":2},{"name":"minecraft:trapped_chest","id":146,"data":3},{"name":"minecraft:trapped_chest","id":146,"data":4},{"name":"minecraft:trapped_chest","id":146,"data":5},{"name":"minecraft:trapped_chest","id":146,"data":6},{"name":"minecraft:trapped_chest","id":146,"data":7},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":0},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":1},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":2},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":3},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":4},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":5},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":6},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":7},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":8},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":9},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":10},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":11},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":12},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":13},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":14},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":15},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":0},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":1},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":2},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":3},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":4},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":5},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":6},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":7},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":8},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":9},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":10},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":11},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":12},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":13},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":14},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":15},{"name":"minecraft:unpowered_comparator","id":149,"data":0},{"name":"minecraft:unpowered_comparator","id":149,"data":1},{"name":"minecraft:unpowered_comparator","id":149,"data":2},{"name":"minecraft:unpowered_comparator","id":149,"data":3},{"name":"minecraft:unpowered_comparator","id":149,"data":4},{"name":"minecraft:unpowered_comparator","id":149,"data":5},{"name":"minecraft:unpowered_comparator","id":149,"data":6},{"name":"minecraft:unpowered_comparator","id":149,"data":7},{"name":"minecraft:unpowered_comparator","id":149,"data":8},{"name":"minecraft:unpowered_comparator","id":149,"data":9},{"name":"minecraft:unpowered_comparator","id":149,"data":10},{"name":"minecraft:unpowered_comparator","id":149,"data":11},{"name":"minecraft:unpowered_comparator","id":149,"data":12},{"name":"minecraft:unpowered_comparator","id":149,"data":13},{"name":"minecraft:unpowered_comparator","id":149,"data":14},{"name":"minecraft:unpowered_comparator","id":149,"data":15},{"name":"minecraft:powered_comparator","id":150,"data":0},{"name":"minecraft:powered_comparator","id":150,"data":1},{"name":"minecraft:powered_comparator","id":150,"data":2},{"name":"minecraft:powered_comparator","id":150,"data":3},{"name":"minecraft:powered_comparator","id":150,"data":4},{"name":"minecraft:powered_comparator","id":150,"data":5},{"name":"minecraft:powered_comparator","id":150,"data":6},{"name":"minecraft:powered_comparator","id":150,"data":7},{"name":"minecraft:powered_comparator","id":150,"data":8},{"name":"minecraft:powered_comparator","id":150,"data":9},{"name":"minecraft:powered_comparator","id":150,"data":10},{"name":"minecraft:powered_comparator","id":150,"data":11},{"name":"minecraft:powered_comparator","id":150,"data":12},{"name":"minecraft:powered_comparator","id":150,"data":13},{"name":"minecraft:powered_comparator","id":150,"data":14},{"name":"minecraft:powered_comparator","id":150,"data":15},{"name":"minecraft:daylight_detector","id":151,"data":0},{"name":"minecraft:daylight_detector","id":151,"data":1},{"name":"minecraft:daylight_detector","id":151,"data":2},{"name":"minecraft:daylight_detector","id":151,"data":3},{"name":"minecraft:daylight_detector","id":151,"data":4},{"name":"minecraft:daylight_detector","id":151,"data":5},{"name":"minecraft:daylight_detector","id":151,"data":6},{"name":"minecraft:daylight_detector","id":151,"data":7},{"name":"minecraft:daylight_detector","id":151,"data":8},{"name":"minecraft:daylight_detector","id":151,"data":9},{"name":"minecraft:daylight_detector","id":151,"data":10},{"name":"minecraft:daylight_detector","id":151,"data":11},{"name":"minecraft:daylight_detector","id":151,"data":12},{"name":"minecraft:daylight_detector","id":151,"data":13},{"name":"minecraft:daylight_detector","id":151,"data":14},{"name":"minecraft:daylight_detector","id":151,"data":15},{"name":"minecraft:redstone_block","id":152,"data":0},{"name":"minecraft:quartz_ore","id":153,"data":0},{"name":"minecraft:hopper","id":154,"data":0},{"name":"minecraft:hopper","id":154,"data":1},{"name":"minecraft:hopper","id":154,"data":2},{"name":"minecraft:hopper","id":154,"data":3},{"name":"minecraft:hopper","id":154,"data":4},{"name":"minecraft:hopper","id":154,"data":5},{"name":"minecraft:hopper","id":154,"data":6},{"name":"minecraft:hopper","id":154,"data":7},{"name":"minecraft:hopper","id":154,"data":8},{"name":"minecraft:hopper","id":154,"data":9},{"name":"minecraft:hopper","id":154,"data":10},{"name":"minecraft:hopper","id":154,"data":11},{"name":"minecraft:hopper","id":154,"data":12},{"name":"minecraft:hopper","id":154,"data":13},{"name":"minecraft:hopper","id":154,"data":14},{"name":"minecraft:hopper","id":154,"data":15},{"name":"minecraft:quartz_block","id":155,"data":0},{"name":"minecraft:quartz_block","id":155,"data":1},{"name":"minecraft:quartz_block","id":155,"data":2},{"name":"minecraft:quartz_block","id":155,"data":3},{"name":"minecraft:quartz_block","id":155,"data":4},{"name":"minecraft:quartz_block","id":155,"data":5},{"name":"minecraft:quartz_block","id":155,"data":6},{"name":"minecraft:quartz_block","id":155,"data":7},{"name":"minecraft:quartz_block","id":155,"data":8},{"name":"minecraft:quartz_block","id":155,"data":9},{"name":"minecraft:quartz_block","id":155,"data":10},{"name":"minecraft:quartz_block","id":155,"data":11},{"name":"minecraft:quartz_block","id":155,"data":12},{"name":"minecraft:quartz_block","id":155,"data":13},{"name":"minecraft:quartz_block","id":155,"data":14},{"name":"minecraft:quartz_block","id":155,"data":15},{"name":"minecraft:quartz_stairs","id":156,"data":0},{"name":"minecraft:quartz_stairs","id":156,"data":1},{"name":"minecraft:quartz_stairs","id":156,"data":2},{"name":"minecraft:quartz_stairs","id":156,"data":3},{"name":"minecraft:quartz_stairs","id":156,"data":4},{"name":"minecraft:quartz_stairs","id":156,"data":5},{"name":"minecraft:quartz_stairs","id":156,"data":6},{"name":"minecraft:quartz_stairs","id":156,"data":7},{"name":"minecraft:double_wooden_slab","id":157,"data":0},{"name":"minecraft:double_wooden_slab","id":157,"data":1},{"name":"minecraft:double_wooden_slab","id":157,"data":2},{"name":"minecraft:double_wooden_slab","id":157,"data":3},{"name":"minecraft:double_wooden_slab","id":157,"data":4},{"name":"minecraft:double_wooden_slab","id":157,"data":5},{"name":"minecraft:double_wooden_slab","id":157,"data":6},{"name":"minecraft:double_wooden_slab","id":157,"data":7},{"name":"minecraft:double_wooden_slab","id":157,"data":8},{"name":"minecraft:double_wooden_slab","id":157,"data":9},{"name":"minecraft:double_wooden_slab","id":157,"data":10},{"name":"minecraft:double_wooden_slab","id":157,"data":11},{"name":"minecraft:double_wooden_slab","id":157,"data":12},{"name":"minecraft:double_wooden_slab","id":157,"data":13},{"name":"minecraft:double_wooden_slab","id":157,"data":14},{"name":"minecraft:double_wooden_slab","id":157,"data":15},{"name":"minecraft:wooden_slab","id":158,"data":0},{"name":"minecraft:wooden_slab","id":158,"data":1},{"name":"minecraft:wooden_slab","id":158,"data":2},{"name":"minecraft:wooden_slab","id":158,"data":3},{"name":"minecraft:wooden_slab","id":158,"data":4},{"name":"minecraft:wooden_slab","id":158,"data":5},{"name":"minecraft:wooden_slab","id":158,"data":6},{"name":"minecraft:wooden_slab","id":158,"data":7},{"name":"minecraft:wooden_slab","id":158,"data":8},{"name":"minecraft:wooden_slab","id":158,"data":9},{"name":"minecraft:wooden_slab","id":158,"data":10},{"name":"minecraft:wooden_slab","id":158,"data":11},{"name":"minecraft:wooden_slab","id":158,"data":12},{"name":"minecraft:wooden_slab","id":158,"data":13},{"name":"minecraft:wooden_slab","id":158,"data":14},{"name":"minecraft:wooden_slab","id":158,"data":15},{"name":"minecraft:stained_hardened_clay","id":159,"data":0},{"name":"minecraft:stained_hardened_clay","id":159,"data":1},{"name":"minecraft:stained_hardened_clay","id":159,"data":2},{"name":"minecraft:stained_hardened_clay","id":159,"data":3},{"name":"minecraft:stained_hardened_clay","id":159,"data":4},{"name":"minecraft:stained_hardened_clay","id":159,"data":5},{"name":"minecraft:stained_hardened_clay","id":159,"data":6},{"name":"minecraft:stained_hardened_clay","id":159,"data":7},{"name":"minecraft:stained_hardened_clay","id":159,"data":8},{"name":"minecraft:stained_hardened_clay","id":159,"data":9},{"name":"minecraft:stained_hardened_clay","id":159,"data":10},{"name":"minecraft:stained_hardened_clay","id":159,"data":11},{"name":"minecraft:stained_hardened_clay","id":159,"data":12},{"name":"minecraft:stained_hardened_clay","id":159,"data":13},{"name":"minecraft:stained_hardened_clay","id":159,"data":14},{"name":"minecraft:stained_hardened_clay","id":159,"data":15},{"name":"minecraft:stained_glass_pane","id":160,"data":0},{"name":"minecraft:stained_glass_pane","id":160,"data":1},{"name":"minecraft:stained_glass_pane","id":160,"data":2},{"name":"minecraft:stained_glass_pane","id":160,"data":3},{"name":"minecraft:stained_glass_pane","id":160,"data":4},{"name":"minecraft:stained_glass_pane","id":160,"data":5},{"name":"minecraft:stained_glass_pane","id":160,"data":6},{"name":"minecraft:stained_glass_pane","id":160,"data":7},{"name":"minecraft:stained_glass_pane","id":160,"data":8},{"name":"minecraft:stained_glass_pane","id":160,"data":9},{"name":"minecraft:stained_glass_pane","id":160,"data":10},{"name":"minecraft:stained_glass_pane","id":160,"data":11},{"name":"minecraft:stained_glass_pane","id":160,"data":12},{"name":"minecraft:stained_glass_pane","id":160,"data":13},{"name":"minecraft:stained_glass_pane","id":160,"data":14},{"name":"minecraft:stained_glass_pane","id":160,"data":15},{"name":"minecraft:leaves2","id":161,"data":0},{"name":"minecraft:leaves2","id":161,"data":1},{"name":"minecraft:leaves2","id":161,"data":2},{"name":"minecraft:leaves2","id":161,"data":3},{"name":"minecraft:leaves2","id":161,"data":4},{"name":"minecraft:leaves2","id":161,"data":5},{"name":"minecraft:leaves2","id":161,"data":6},{"name":"minecraft:leaves2","id":161,"data":7},{"name":"minecraft:leaves2","id":161,"data":8},{"name":"minecraft:leaves2","id":161,"data":9},{"name":"minecraft:leaves2","id":161,"data":10},{"name":"minecraft:leaves2","id":161,"data":11},{"name":"minecraft:leaves2","id":161,"data":12},{"name":"minecraft:leaves2","id":161,"data":13},{"name":"minecraft:leaves2","id":161,"data":14},{"name":"minecraft:leaves2","id":161,"data":15},{"name":"minecraft:log2","id":162,"data":0},{"name":"minecraft:log2","id":162,"data":1},{"name":"minecraft:log2","id":162,"data":2},{"name":"minecraft:log2","id":162,"data":3},{"name":"minecraft:log2","id":162,"data":4},{"name":"minecraft:log2","id":162,"data":5},{"name":"minecraft:log2","id":162,"data":6},{"name":"minecraft:log2","id":162,"data":7},{"name":"minecraft:log2","id":162,"data":8},{"name":"minecraft:log2","id":162,"data":9},{"name":"minecraft:log2","id":162,"data":10},{"name":"minecraft:log2","id":162,"data":11},{"name":"minecraft:log2","id":162,"data":12},{"name":"minecraft:log2","id":162,"data":13},{"name":"minecraft:log2","id":162,"data":14},{"name":"minecraft:log2","id":162,"data":15},{"name":"minecraft:acacia_stairs","id":163,"data":0},{"name":"minecraft:acacia_stairs","id":163,"data":1},{"name":"minecraft:acacia_stairs","id":163,"data":2},{"name":"minecraft:acacia_stairs","id":163,"data":3},{"name":"minecraft:acacia_stairs","id":163,"data":4},{"name":"minecraft:acacia_stairs","id":163,"data":5},{"name":"minecraft:acacia_stairs","id":163,"data":6},{"name":"minecraft:acacia_stairs","id":163,"data":7},{"name":"minecraft:dark_oak_stairs","id":164,"data":0},{"name":"minecraft:dark_oak_stairs","id":164,"data":1},{"name":"minecraft:dark_oak_stairs","id":164,"data":2},{"name":"minecraft:dark_oak_stairs","id":164,"data":3},{"name":"minecraft:dark_oak_stairs","id":164,"data":4},{"name":"minecraft:dark_oak_stairs","id":164,"data":5},{"name":"minecraft:dark_oak_stairs","id":164,"data":6},{"name":"minecraft:dark_oak_stairs","id":164,"data":7},{"name":"minecraft:slime","id":165,"data":0},{"name":"minecraft:iron_trapdoor","id":167,"data":0},{"name":"minecraft:iron_trapdoor","id":167,"data":1},{"name":"minecraft:iron_trapdoor","id":167,"data":2},{"name":"minecraft:iron_trapdoor","id":167,"data":3},{"name":"minecraft:iron_trapdoor","id":167,"data":4},{"name":"minecraft:iron_trapdoor","id":167,"data":5},{"name":"minecraft:iron_trapdoor","id":167,"data":6},{"name":"minecraft:iron_trapdoor","id":167,"data":7},{"name":"minecraft:iron_trapdoor","id":167,"data":8},{"name":"minecraft:iron_trapdoor","id":167,"data":9},{"name":"minecraft:iron_trapdoor","id":167,"data":10},{"name":"minecraft:iron_trapdoor","id":167,"data":11},{"name":"minecraft:iron_trapdoor","id":167,"data":12},{"name":"minecraft:iron_trapdoor","id":167,"data":13},{"name":"minecraft:iron_trapdoor","id":167,"data":14},{"name":"minecraft:iron_trapdoor","id":167,"data":15},{"name":"minecraft:prismarine","id":168,"data":0},{"name":"minecraft:prismarine","id":168,"data":1},{"name":"minecraft:prismarine","id":168,"data":2},{"name":"minecraft:prismarine","id":168,"data":3},{"name":"minecraft:seaLantern","id":169,"data":0},{"name":"minecraft:hay_block","id":170,"data":0},{"name":"minecraft:hay_block","id":170,"data":1},{"name":"minecraft:hay_block","id":170,"data":2},{"name":"minecraft:hay_block","id":170,"data":3},{"name":"minecraft:hay_block","id":170,"data":4},{"name":"minecraft:hay_block","id":170,"data":5},{"name":"minecraft:hay_block","id":170,"data":6},{"name":"minecraft:hay_block","id":170,"data":7},{"name":"minecraft:hay_block","id":170,"data":8},{"name":"minecraft:hay_block","id":170,"data":9},{"name":"minecraft:hay_block","id":170,"data":10},{"name":"minecraft:hay_block","id":170,"data":11},{"name":"minecraft:hay_block","id":170,"data":12},{"name":"minecraft:hay_block","id":170,"data":13},{"name":"minecraft:hay_block","id":170,"data":14},{"name":"minecraft:hay_block","id":170,"data":15},{"name":"minecraft:carpet","id":171,"data":0},{"name":"minecraft:carpet","id":171,"data":1},{"name":"minecraft:carpet","id":171,"data":2},{"name":"minecraft:carpet","id":171,"data":3},{"name":"minecraft:carpet","id":171,"data":4},{"name":"minecraft:carpet","id":171,"data":5},{"name":"minecraft:carpet","id":171,"data":6},{"name":"minecraft:carpet","id":171,"data":7},{"name":"minecraft:carpet","id":171,"data":8},{"name":"minecraft:carpet","id":171,"data":9},{"name":"minecraft:carpet","id":171,"data":10},{"name":"minecraft:carpet","id":171,"data":11},{"name":"minecraft:carpet","id":171,"data":12},{"name":"minecraft:carpet","id":171,"data":13},{"name":"minecraft:carpet","id":171,"data":14},{"name":"minecraft:carpet","id":171,"data":15},{"name":"minecraft:hardened_clay","id":172,"data":0},{"name":"minecraft:coal_block","id":173,"data":0},{"name":"minecraft:packed_ice","id":174,"data":0},{"name":"minecraft:double_plant","id":175,"data":0},{"name":"minecraft:double_plant","id":175,"data":1},{"name":"minecraft:double_plant","id":175,"data":2},{"name":"minecraft:double_plant","id":175,"data":3},{"name":"minecraft:double_plant","id":175,"data":4},{"name":"minecraft:double_plant","id":175,"data":5},{"name":"minecraft:double_plant","id":175,"data":6},{"name":"minecraft:double_plant","id":175,"data":7},{"name":"minecraft:double_plant","id":175,"data":8},{"name":"minecraft:double_plant","id":175,"data":9},{"name":"minecraft:double_plant","id":175,"data":10},{"name":"minecraft:double_plant","id":175,"data":11},{"name":"minecraft:double_plant","id":175,"data":12},{"name":"minecraft:double_plant","id":175,"data":13},{"name":"minecraft:double_plant","id":175,"data":14},{"name":"minecraft:double_plant","id":175,"data":15},{"name":"minecraft:standing_banner","id":176,"data":0},{"name":"minecraft:standing_banner","id":176,"data":1},{"name":"minecraft:standing_banner","id":176,"data":2},{"name":"minecraft:standing_banner","id":176,"data":3},{"name":"minecraft:standing_banner","id":176,"data":4},{"name":"minecraft:standing_banner","id":176,"data":5},{"name":"minecraft:standing_banner","id":176,"data":6},{"name":"minecraft:standing_banner","id":176,"data":7},{"name":"minecraft:standing_banner","id":176,"data":8},{"name":"minecraft:standing_banner","id":176,"data":9},{"name":"minecraft:standing_banner","id":176,"data":10},{"name":"minecraft:standing_banner","id":176,"data":11},{"name":"minecraft:standing_banner","id":176,"data":12},{"name":"minecraft:standing_banner","id":176,"data":13},{"name":"minecraft:standing_banner","id":176,"data":14},{"name":"minecraft:standing_banner","id":176,"data":15},{"name":"minecraft:wall_banner","id":177,"data":0},{"name":"minecraft:wall_banner","id":177,"data":1},{"name":"minecraft:wall_banner","id":177,"data":2},{"name":"minecraft:wall_banner","id":177,"data":3},{"name":"minecraft:wall_banner","id":177,"data":4},{"name":"minecraft:wall_banner","id":177,"data":5},{"name":"minecraft:wall_banner","id":177,"data":6},{"name":"minecraft:wall_banner","id":177,"data":7},{"name":"minecraft:daylight_detector_inverted","id":178,"data":0},{"name":"minecraft:daylight_detector_inverted","id":178,"data":1},{"name":"minecraft:daylight_detector_inverted","id":178,"data":2},{"name":"minecraft:daylight_detector_inverted","id":178,"data":3},{"name":"minecraft:daylight_detector_inverted","id":178,"data":4},{"name":"minecraft:daylight_detector_inverted","id":178,"data":5},{"name":"minecraft:daylight_detector_inverted","id":178,"data":6},{"name":"minecraft:daylight_detector_inverted","id":178,"data":7},{"name":"minecraft:daylight_detector_inverted","id":178,"data":8},{"name":"minecraft:daylight_detector_inverted","id":178,"data":9},{"name":"minecraft:daylight_detector_inverted","id":178,"data":10},{"name":"minecraft:daylight_detector_inverted","id":178,"data":11},{"name":"minecraft:daylight_detector_inverted","id":178,"data":12},{"name":"minecraft:daylight_detector_inverted","id":178,"data":13},{"name":"minecraft:daylight_detector_inverted","id":178,"data":14},{"name":"minecraft:daylight_detector_inverted","id":178,"data":15},{"name":"minecraft:red_sandstone","id":179,"data":0},{"name":"minecraft:red_sandstone","id":179,"data":1},{"name":"minecraft:red_sandstone","id":179,"data":2},{"name":"minecraft:red_sandstone","id":179,"data":3},{"name":"minecraft:red_sandstone_stairs","id":180,"data":0},{"name":"minecraft:red_sandstone_stairs","id":180,"data":1},{"name":"minecraft:red_sandstone_stairs","id":180,"data":2},{"name":"minecraft:red_sandstone_stairs","id":180,"data":3},{"name":"minecraft:red_sandstone_stairs","id":180,"data":4},{"name":"minecraft:red_sandstone_stairs","id":180,"data":5},{"name":"minecraft:red_sandstone_stairs","id":180,"data":6},{"name":"minecraft:red_sandstone_stairs","id":180,"data":7},{"name":"minecraft:double_stone_slab2","id":181,"data":0},{"name":"minecraft:double_stone_slab2","id":181,"data":1},{"name":"minecraft:double_stone_slab2","id":181,"data":2},{"name":"minecraft:double_stone_slab2","id":181,"data":3},{"name":"minecraft:double_stone_slab2","id":181,"data":4},{"name":"minecraft:double_stone_slab2","id":181,"data":5},{"name":"minecraft:double_stone_slab2","id":181,"data":6},{"name":"minecraft:double_stone_slab2","id":181,"data":7},{"name":"minecraft:double_stone_slab2","id":181,"data":8},{"name":"minecraft:double_stone_slab2","id":181,"data":9},{"name":"minecraft:double_stone_slab2","id":181,"data":10},{"name":"minecraft:double_stone_slab2","id":181,"data":11},{"name":"minecraft:double_stone_slab2","id":181,"data":12},{"name":"minecraft:double_stone_slab2","id":181,"data":13},{"name":"minecraft:double_stone_slab2","id":181,"data":14},{"name":"minecraft:double_stone_slab2","id":181,"data":15},{"name":"minecraft:stone_slab2","id":182,"data":0},{"name":"minecraft:stone_slab2","id":182,"data":1},{"name":"minecraft:stone_slab2","id":182,"data":2},{"name":"minecraft:stone_slab2","id":182,"data":3},{"name":"minecraft:stone_slab2","id":182,"data":4},{"name":"minecraft:stone_slab2","id":182,"data":5},{"name":"minecraft:stone_slab2","id":182,"data":6},{"name":"minecraft:stone_slab2","id":182,"data":7},{"name":"minecraft:stone_slab2","id":182,"data":8},{"name":"minecraft:stone_slab2","id":182,"data":9},{"name":"minecraft:stone_slab2","id":182,"data":10},{"name":"minecraft:stone_slab2","id":182,"data":11},{"name":"minecraft:stone_slab2","id":182,"data":12},{"name":"minecraft:stone_slab2","id":182,"data":13},{"name":"minecraft:stone_slab2","id":182,"data":14},{"name":"minecraft:stone_slab2","id":182,"data":15},{"name":"minecraft:spruce_fence_gate","id":183,"data":0},{"name":"minecraft:spruce_fence_gate","id":183,"data":1},{"name":"minecraft:spruce_fence_gate","id":183,"data":2},{"name":"minecraft:spruce_fence_gate","id":183,"data":3},{"name":"minecraft:spruce_fence_gate","id":183,"data":4},{"name":"minecraft:spruce_fence_gate","id":183,"data":5},{"name":"minecraft:spruce_fence_gate","id":183,"data":6},{"name":"minecraft:spruce_fence_gate","id":183,"data":7},{"name":"minecraft:spruce_fence_gate","id":183,"data":8},{"name":"minecraft:spruce_fence_gate","id":183,"data":9},{"name":"minecraft:spruce_fence_gate","id":183,"data":10},{"name":"minecraft:spruce_fence_gate","id":183,"data":11},{"name":"minecraft:spruce_fence_gate","id":183,"data":12},{"name":"minecraft:spruce_fence_gate","id":183,"data":13},{"name":"minecraft:spruce_fence_gate","id":183,"data":14},{"name":"minecraft:spruce_fence_gate","id":183,"data":15},{"name":"minecraft:birch_fence_gate","id":184,"data":0},{"name":"minecraft:birch_fence_gate","id":184,"data":1},{"name":"minecraft:birch_fence_gate","id":184,"data":2},{"name":"minecraft:birch_fence_gate","id":184,"data":3},{"name":"minecraft:birch_fence_gate","id":184,"data":4},{"name":"minecraft:birch_fence_gate","id":184,"data":5},{"name":"minecraft:birch_fence_gate","id":184,"data":6},{"name":"minecraft:birch_fence_gate","id":184,"data":7},{"name":"minecraft:birch_fence_gate","id":184,"data":8},{"name":"minecraft:birch_fence_gate","id":184,"data":9},{"name":"minecraft:birch_fence_gate","id":184,"data":10},{"name":"minecraft:birch_fence_gate","id":184,"data":11},{"name":"minecraft:birch_fence_gate","id":184,"data":12},{"name":"minecraft:birch_fence_gate","id":184,"data":13},{"name":"minecraft:birch_fence_gate","id":184,"data":14},{"name":"minecraft:birch_fence_gate","id":184,"data":15},{"name":"minecraft:jungle_fence_gate","id":185,"data":0},{"name":"minecraft:jungle_fence_gate","id":185,"data":1},{"name":"minecraft:jungle_fence_gate","id":185,"data":2},{"name":"minecraft:jungle_fence_gate","id":185,"data":3},{"name":"minecraft:jungle_fence_gate","id":185,"data":4},{"name":"minecraft:jungle_fence_gate","id":185,"data":5},{"name":"minecraft:jungle_fence_gate","id":185,"data":6},{"name":"minecraft:jungle_fence_gate","id":185,"data":7},{"name":"minecraft:jungle_fence_gate","id":185,"data":8},{"name":"minecraft:jungle_fence_gate","id":185,"data":9},{"name":"minecraft:jungle_fence_gate","id":185,"data":10},{"name":"minecraft:jungle_fence_gate","id":185,"data":11},{"name":"minecraft:jungle_fence_gate","id":185,"data":12},{"name":"minecraft:jungle_fence_gate","id":185,"data":13},{"name":"minecraft:jungle_fence_gate","id":185,"data":14},{"name":"minecraft:jungle_fence_gate","id":185,"data":15},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":0},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":1},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":2},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":3},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":4},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":5},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":6},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":7},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":8},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":9},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":10},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":11},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":12},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":13},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":14},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":15},{"name":"minecraft:acacia_fence_gate","id":187,"data":0},{"name":"minecraft:acacia_fence_gate","id":187,"data":1},{"name":"minecraft:acacia_fence_gate","id":187,"data":2},{"name":"minecraft:acacia_fence_gate","id":187,"data":3},{"name":"minecraft:acacia_fence_gate","id":187,"data":4},{"name":"minecraft:acacia_fence_gate","id":187,"data":5},{"name":"minecraft:acacia_fence_gate","id":187,"data":6},{"name":"minecraft:acacia_fence_gate","id":187,"data":7},{"name":"minecraft:acacia_fence_gate","id":187,"data":8},{"name":"minecraft:acacia_fence_gate","id":187,"data":9},{"name":"minecraft:acacia_fence_gate","id":187,"data":10},{"name":"minecraft:acacia_fence_gate","id":187,"data":11},{"name":"minecraft:acacia_fence_gate","id":187,"data":12},{"name":"minecraft:acacia_fence_gate","id":187,"data":13},{"name":"minecraft:acacia_fence_gate","id":187,"data":14},{"name":"minecraft:acacia_fence_gate","id":187,"data":15},{"name":"minecraft:repeating_command_block","id":188,"data":0},{"name":"minecraft:repeating_command_block","id":188,"data":1},{"name":"minecraft:repeating_command_block","id":188,"data":2},{"name":"minecraft:repeating_command_block","id":188,"data":3},{"name":"minecraft:repeating_command_block","id":188,"data":4},{"name":"minecraft:repeating_command_block","id":188,"data":5},{"name":"minecraft:repeating_command_block","id":188,"data":6},{"name":"minecraft:repeating_command_block","id":188,"data":7},{"name":"minecraft:repeating_command_block","id":188,"data":8},{"name":"minecraft:repeating_command_block","id":188,"data":9},{"name":"minecraft:repeating_command_block","id":188,"data":10},{"name":"minecraft:repeating_command_block","id":188,"data":11},{"name":"minecraft:repeating_command_block","id":188,"data":12},{"name":"minecraft:repeating_command_block","id":188,"data":13},{"name":"minecraft:repeating_command_block","id":188,"data":14},{"name":"minecraft:repeating_command_block","id":188,"data":15},{"name":"minecraft:chain_command_block","id":189,"data":0},{"name":"minecraft:chain_command_block","id":189,"data":1},{"name":"minecraft:chain_command_block","id":189,"data":2},{"name":"minecraft:chain_command_block","id":189,"data":3},{"name":"minecraft:chain_command_block","id":189,"data":4},{"name":"minecraft:chain_command_block","id":189,"data":5},{"name":"minecraft:chain_command_block","id":189,"data":6},{"name":"minecraft:chain_command_block","id":189,"data":7},{"name":"minecraft:chain_command_block","id":189,"data":8},{"name":"minecraft:chain_command_block","id":189,"data":9},{"name":"minecraft:chain_command_block","id":189,"data":10},{"name":"minecraft:chain_command_block","id":189,"data":11},{"name":"minecraft:chain_command_block","id":189,"data":12},{"name":"minecraft:chain_command_block","id":189,"data":13},{"name":"minecraft:chain_command_block","id":189,"data":14},{"name":"minecraft:chain_command_block","id":189,"data":15},{"name":"minecraft:hard_glass_pane","id":190,"data":0},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":0},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":1},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":2},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":3},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":4},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":5},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":6},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":7},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":8},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":9},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":10},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":11},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":12},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":13},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":14},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":15},{"name":"minecraft:chemical_heat","id":192,"data":0},{"name":"minecraft:spruce_door","id":193,"data":0},{"name":"minecraft:spruce_door","id":193,"data":1},{"name":"minecraft:spruce_door","id":193,"data":2},{"name":"minecraft:spruce_door","id":193,"data":3},{"name":"minecraft:spruce_door","id":193,"data":4},{"name":"minecraft:spruce_door","id":193,"data":5},{"name":"minecraft:spruce_door","id":193,"data":6},{"name":"minecraft:spruce_door","id":193,"data":7},{"name":"minecraft:spruce_door","id":193,"data":8},{"name":"minecraft:spruce_door","id":193,"data":9},{"name":"minecraft:spruce_door","id":193,"data":10},{"name":"minecraft:spruce_door","id":193,"data":11},{"name":"minecraft:spruce_door","id":193,"data":12},{"name":"minecraft:spruce_door","id":193,"data":13},{"name":"minecraft:spruce_door","id":193,"data":14},{"name":"minecraft:spruce_door","id":193,"data":15},{"name":"minecraft:birch_door","id":194,"data":0},{"name":"minecraft:birch_door","id":194,"data":1},{"name":"minecraft:birch_door","id":194,"data":2},{"name":"minecraft:birch_door","id":194,"data":3},{"name":"minecraft:birch_door","id":194,"data":4},{"name":"minecraft:birch_door","id":194,"data":5},{"name":"minecraft:birch_door","id":194,"data":6},{"name":"minecraft:birch_door","id":194,"data":7},{"name":"minecraft:birch_door","id":194,"data":8},{"name":"minecraft:birch_door","id":194,"data":9},{"name":"minecraft:birch_door","id":194,"data":10},{"name":"minecraft:birch_door","id":194,"data":11},{"name":"minecraft:birch_door","id":194,"data":12},{"name":"minecraft:birch_door","id":194,"data":13},{"name":"minecraft:birch_door","id":194,"data":14},{"name":"minecraft:birch_door","id":194,"data":15},{"name":"minecraft:jungle_door","id":195,"data":0},{"name":"minecraft:jungle_door","id":195,"data":1},{"name":"minecraft:jungle_door","id":195,"data":2},{"name":"minecraft:jungle_door","id":195,"data":3},{"name":"minecraft:jungle_door","id":195,"data":4},{"name":"minecraft:jungle_door","id":195,"data":5},{"name":"minecraft:jungle_door","id":195,"data":6},{"name":"minecraft:jungle_door","id":195,"data":7},{"name":"minecraft:jungle_door","id":195,"data":8},{"name":"minecraft:jungle_door","id":195,"data":9},{"name":"minecraft:jungle_door","id":195,"data":10},{"name":"minecraft:jungle_door","id":195,"data":11},{"name":"minecraft:jungle_door","id":195,"data":12},{"name":"minecraft:jungle_door","id":195,"data":13},{"name":"minecraft:jungle_door","id":195,"data":14},{"name":"minecraft:jungle_door","id":195,"data":15},{"name":"minecraft:acacia_door","id":196,"data":0},{"name":"minecraft:acacia_door","id":196,"data":1},{"name":"minecraft:acacia_door","id":196,"data":2},{"name":"minecraft:acacia_door","id":196,"data":3},{"name":"minecraft:acacia_door","id":196,"data":4},{"name":"minecraft:acacia_door","id":196,"data":5},{"name":"minecraft:acacia_door","id":196,"data":6},{"name":"minecraft:acacia_door","id":196,"data":7},{"name":"minecraft:acacia_door","id":196,"data":8},{"name":"minecraft:acacia_door","id":196,"data":9},{"name":"minecraft:acacia_door","id":196,"data":10},{"name":"minecraft:acacia_door","id":196,"data":11},{"name":"minecraft:acacia_door","id":196,"data":12},{"name":"minecraft:acacia_door","id":196,"data":13},{"name":"minecraft:acacia_door","id":196,"data":14},{"name":"minecraft:acacia_door","id":196,"data":15},{"name":"minecraft:dark_oak_door","id":197,"data":0},{"name":"minecraft:dark_oak_door","id":197,"data":1},{"name":"minecraft:dark_oak_door","id":197,"data":2},{"name":"minecraft:dark_oak_door","id":197,"data":3},{"name":"minecraft:dark_oak_door","id":197,"data":4},{"name":"minecraft:dark_oak_door","id":197,"data":5},{"name":"minecraft:dark_oak_door","id":197,"data":6},{"name":"minecraft:dark_oak_door","id":197,"data":7},{"name":"minecraft:dark_oak_door","id":197,"data":8},{"name":"minecraft:dark_oak_door","id":197,"data":9},{"name":"minecraft:dark_oak_door","id":197,"data":10},{"name":"minecraft:dark_oak_door","id":197,"data":11},{"name":"minecraft:dark_oak_door","id":197,"data":12},{"name":"minecraft:dark_oak_door","id":197,"data":13},{"name":"minecraft:dark_oak_door","id":197,"data":14},{"name":"minecraft:dark_oak_door","id":197,"data":15},{"name":"minecraft:grass_path","id":198,"data":0},{"name":"minecraft:frame","id":199,"data":0},{"name":"minecraft:frame","id":199,"data":1},{"name":"minecraft:frame","id":199,"data":2},{"name":"minecraft:frame","id":199,"data":3},{"name":"minecraft:frame","id":199,"data":4},{"name":"minecraft:frame","id":199,"data":5},{"name":"minecraft:frame","id":199,"data":6},{"name":"minecraft:frame","id":199,"data":7},{"name":"minecraft:chorus_flower","id":200,"data":0},{"name":"minecraft:chorus_flower","id":200,"data":1},{"name":"minecraft:chorus_flower","id":200,"data":2},{"name":"minecraft:chorus_flower","id":200,"data":3},{"name":"minecraft:chorus_flower","id":200,"data":4},{"name":"minecraft:chorus_flower","id":200,"data":5},{"name":"minecraft:chorus_flower","id":200,"data":6},{"name":"minecraft:chorus_flower","id":200,"data":7},{"name":"minecraft:purpur_block","id":201,"data":0},{"name":"minecraft:purpur_block","id":201,"data":1},{"name":"minecraft:purpur_block","id":201,"data":2},{"name":"minecraft:purpur_block","id":201,"data":3},{"name":"minecraft:purpur_block","id":201,"data":4},{"name":"minecraft:purpur_block","id":201,"data":5},{"name":"minecraft:purpur_block","id":201,"data":6},{"name":"minecraft:purpur_block","id":201,"data":7},{"name":"minecraft:purpur_block","id":201,"data":8},{"name":"minecraft:purpur_block","id":201,"data":9},{"name":"minecraft:purpur_block","id":201,"data":10},{"name":"minecraft:purpur_block","id":201,"data":11},{"name":"minecraft:purpur_block","id":201,"data":12},{"name":"minecraft:purpur_block","id":201,"data":13},{"name":"minecraft:purpur_block","id":201,"data":14},{"name":"minecraft:purpur_block","id":201,"data":15},{"name":"minecraft:colored_torch_rg","id":202,"data":0},{"name":"minecraft:colored_torch_rg","id":202,"data":1},{"name":"minecraft:colored_torch_rg","id":202,"data":2},{"name":"minecraft:colored_torch_rg","id":202,"data":3},{"name":"minecraft:colored_torch_rg","id":202,"data":4},{"name":"minecraft:colored_torch_rg","id":202,"data":5},{"name":"minecraft:colored_torch_rg","id":202,"data":6},{"name":"minecraft:colored_torch_rg","id":202,"data":7},{"name":"minecraft:colored_torch_rg","id":202,"data":8},{"name":"minecraft:colored_torch_rg","id":202,"data":9},{"name":"minecraft:colored_torch_rg","id":202,"data":10},{"name":"minecraft:colored_torch_rg","id":202,"data":11},{"name":"minecraft:colored_torch_rg","id":202,"data":12},{"name":"minecraft:colored_torch_rg","id":202,"data":13},{"name":"minecraft:colored_torch_rg","id":202,"data":14},{"name":"minecraft:colored_torch_rg","id":202,"data":15},{"name":"minecraft:purpur_stairs","id":203,"data":0},{"name":"minecraft:purpur_stairs","id":203,"data":1},{"name":"minecraft:purpur_stairs","id":203,"data":2},{"name":"minecraft:purpur_stairs","id":203,"data":3},{"name":"minecraft:purpur_stairs","id":203,"data":4},{"name":"minecraft:purpur_stairs","id":203,"data":5},{"name":"minecraft:purpur_stairs","id":203,"data":6},{"name":"minecraft:purpur_stairs","id":203,"data":7},{"name":"minecraft:colored_torch_bp","id":204,"data":0},{"name":"minecraft:colored_torch_bp","id":204,"data":1},{"name":"minecraft:colored_torch_bp","id":204,"data":2},{"name":"minecraft:colored_torch_bp","id":204,"data":3},{"name":"minecraft:colored_torch_bp","id":204,"data":4},{"name":"minecraft:colored_torch_bp","id":204,"data":5},{"name":"minecraft:colored_torch_bp","id":204,"data":6},{"name":"minecraft:colored_torch_bp","id":204,"data":7},{"name":"minecraft:colored_torch_bp","id":204,"data":8},{"name":"minecraft:colored_torch_bp","id":204,"data":9},{"name":"minecraft:colored_torch_bp","id":204,"data":10},{"name":"minecraft:colored_torch_bp","id":204,"data":11},{"name":"minecraft:colored_torch_bp","id":204,"data":12},{"name":"minecraft:colored_torch_bp","id":204,"data":13},{"name":"minecraft:colored_torch_bp","id":204,"data":14},{"name":"minecraft:colored_torch_bp","id":204,"data":15},{"name":"minecraft:undyed_shulker_box","id":205,"data":0},{"name":"minecraft:end_bricks","id":206,"data":0},{"name":"minecraft:frosted_ice","id":207,"data":0},{"name":"minecraft:frosted_ice","id":207,"data":1},{"name":"minecraft:frosted_ice","id":207,"data":2},{"name":"minecraft:frosted_ice","id":207,"data":3},{"name":"minecraft:end_rod","id":208,"data":0},{"name":"minecraft:end_rod","id":208,"data":1},{"name":"minecraft:end_rod","id":208,"data":2},{"name":"minecraft:end_rod","id":208,"data":3},{"name":"minecraft:end_rod","id":208,"data":4},{"name":"minecraft:end_rod","id":208,"data":5},{"name":"minecraft:end_rod","id":208,"data":6},{"name":"minecraft:end_rod","id":208,"data":7},{"name":"minecraft:end_gateway","id":209,"data":0},{"name":"minecraft:magma","id":213,"data":0},{"name":"minecraft:nether_wart_block","id":214,"data":0},{"name":"minecraft:red_nether_brick","id":215,"data":0},{"name":"minecraft:bone_block","id":216,"data":0},{"name":"minecraft:bone_block","id":216,"data":1},{"name":"minecraft:bone_block","id":216,"data":2},{"name":"minecraft:bone_block","id":216,"data":3},{"name":"minecraft:bone_block","id":216,"data":4},{"name":"minecraft:bone_block","id":216,"data":5},{"name":"minecraft:bone_block","id":216,"data":6},{"name":"minecraft:bone_block","id":216,"data":7},{"name":"minecraft:bone_block","id":216,"data":8},{"name":"minecraft:bone_block","id":216,"data":9},{"name":"minecraft:bone_block","id":216,"data":10},{"name":"minecraft:bone_block","id":216,"data":11},{"name":"minecraft:bone_block","id":216,"data":12},{"name":"minecraft:bone_block","id":216,"data":13},{"name":"minecraft:bone_block","id":216,"data":14},{"name":"minecraft:bone_block","id":216,"data":15},{"name":"minecraft:shulker_box","id":218,"data":0},{"name":"minecraft:shulker_box","id":218,"data":1},{"name":"minecraft:shulker_box","id":218,"data":2},{"name":"minecraft:shulker_box","id":218,"data":3},{"name":"minecraft:shulker_box","id":218,"data":4},{"name":"minecraft:shulker_box","id":218,"data":5},{"name":"minecraft:shulker_box","id":218,"data":6},{"name":"minecraft:shulker_box","id":218,"data":7},{"name":"minecraft:shulker_box","id":218,"data":8},{"name":"minecraft:shulker_box","id":218,"data":9},{"name":"minecraft:shulker_box","id":218,"data":10},{"name":"minecraft:shulker_box","id":218,"data":11},{"name":"minecraft:shulker_box","id":218,"data":12},{"name":"minecraft:shulker_box","id":218,"data":13},{"name":"minecraft:shulker_box","id":218,"data":14},{"name":"minecraft:shulker_box","id":218,"data":15},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":0},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":1},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":2},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":3},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":4},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":5},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":6},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":7},{"name":"minecraft:white_glazed_terracotta","id":220,"data":0},{"name":"minecraft:white_glazed_terracotta","id":220,"data":1},{"name":"minecraft:white_glazed_terracotta","id":220,"data":2},{"name":"minecraft:white_glazed_terracotta","id":220,"data":3},{"name":"minecraft:white_glazed_terracotta","id":220,"data":4},{"name":"minecraft:white_glazed_terracotta","id":220,"data":5},{"name":"minecraft:white_glazed_terracotta","id":220,"data":6},{"name":"minecraft:white_glazed_terracotta","id":220,"data":7},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":0},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":1},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":2},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":3},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":4},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":5},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":6},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":7},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":0},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":1},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":2},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":3},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":4},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":5},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":6},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":7},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":0},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":1},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":2},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":3},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":4},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":5},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":6},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":7},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":0},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":1},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":2},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":3},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":4},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":5},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":6},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":7},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":0},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":1},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":2},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":3},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":4},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":5},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":6},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":7},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":0},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":1},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":2},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":3},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":4},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":5},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":6},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":7},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":0},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":1},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":2},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":3},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":4},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":5},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":6},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":7},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":0},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":1},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":2},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":3},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":4},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":5},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":6},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":7},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":0},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":1},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":2},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":3},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":4},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":5},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":6},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":7},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":0},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":1},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":2},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":3},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":4},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":5},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":6},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":7},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":0},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":1},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":2},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":3},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":4},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":5},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":6},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":7},{"name":"minecraft:green_glazed_terracotta","id":233,"data":0},{"name":"minecraft:green_glazed_terracotta","id":233,"data":1},{"name":"minecraft:green_glazed_terracotta","id":233,"data":2},{"name":"minecraft:green_glazed_terracotta","id":233,"data":3},{"name":"minecraft:green_glazed_terracotta","id":233,"data":4},{"name":"minecraft:green_glazed_terracotta","id":233,"data":5},{"name":"minecraft:green_glazed_terracotta","id":233,"data":6},{"name":"minecraft:green_glazed_terracotta","id":233,"data":7},{"name":"minecraft:red_glazed_terracotta","id":234,"data":0},{"name":"minecraft:red_glazed_terracotta","id":234,"data":1},{"name":"minecraft:red_glazed_terracotta","id":234,"data":2},{"name":"minecraft:red_glazed_terracotta","id":234,"data":3},{"name":"minecraft:red_glazed_terracotta","id":234,"data":4},{"name":"minecraft:red_glazed_terracotta","id":234,"data":5},{"name":"minecraft:red_glazed_terracotta","id":234,"data":6},{"name":"minecraft:red_glazed_terracotta","id":234,"data":7},{"name":"minecraft:black_glazed_terracotta","id":235,"data":0},{"name":"minecraft:black_glazed_terracotta","id":235,"data":1},{"name":"minecraft:black_glazed_terracotta","id":235,"data":2},{"name":"minecraft:black_glazed_terracotta","id":235,"data":3},{"name":"minecraft:black_glazed_terracotta","id":235,"data":4},{"name":"minecraft:black_glazed_terracotta","id":235,"data":5},{"name":"minecraft:black_glazed_terracotta","id":235,"data":6},{"name":"minecraft:black_glazed_terracotta","id":235,"data":7},{"name":"minecraft:concrete","id":236,"data":0},{"name":"minecraft:concrete","id":236,"data":1},{"name":"minecraft:concrete","id":236,"data":2},{"name":"minecraft:concrete","id":236,"data":3},{"name":"minecraft:concrete","id":236,"data":4},{"name":"minecraft:concrete","id":236,"data":5},{"name":"minecraft:concrete","id":236,"data":6},{"name":"minecraft:concrete","id":236,"data":7},{"name":"minecraft:concrete","id":236,"data":8},{"name":"minecraft:concrete","id":236,"data":9},{"name":"minecraft:concrete","id":236,"data":10},{"name":"minecraft:concrete","id":236,"data":11},{"name":"minecraft:concrete","id":236,"data":12},{"name":"minecraft:concrete","id":236,"data":13},{"name":"minecraft:concrete","id":236,"data":14},{"name":"minecraft:concrete","id":236,"data":15},{"name":"minecraft:concretePowder","id":237,"data":0},{"name":"minecraft:concretePowder","id":237,"data":1},{"name":"minecraft:concretePowder","id":237,"data":2},{"name":"minecraft:concretePowder","id":237,"data":3},{"name":"minecraft:concretePowder","id":237,"data":4},{"name":"minecraft:concretePowder","id":237,"data":5},{"name":"minecraft:concretePowder","id":237,"data":6},{"name":"minecraft:concretePowder","id":237,"data":7},{"name":"minecraft:concretePowder","id":237,"data":8},{"name":"minecraft:concretePowder","id":237,"data":9},{"name":"minecraft:concretePowder","id":237,"data":10},{"name":"minecraft:concretePowder","id":237,"data":11},{"name":"minecraft:concretePowder","id":237,"data":12},{"name":"minecraft:concretePowder","id":237,"data":13},{"name":"minecraft:concretePowder","id":237,"data":14},{"name":"minecraft:concretePowder","id":237,"data":15},{"name":"minecraft:chemistry_table","id":238,"data":0},{"name":"minecraft:chemistry_table","id":238,"data":1},{"name":"minecraft:chemistry_table","id":238,"data":2},{"name":"minecraft:chemistry_table","id":238,"data":3},{"name":"minecraft:chemistry_table","id":238,"data":4},{"name":"minecraft:chemistry_table","id":238,"data":5},{"name":"minecraft:chemistry_table","id":238,"data":6},{"name":"minecraft:chemistry_table","id":238,"data":7},{"name":"minecraft:chemistry_table","id":238,"data":8},{"name":"minecraft:chemistry_table","id":238,"data":9},{"name":"minecraft:chemistry_table","id":238,"data":10},{"name":"minecraft:chemistry_table","id":238,"data":11},{"name":"minecraft:chemistry_table","id":238,"data":12},{"name":"minecraft:chemistry_table","id":238,"data":13},{"name":"minecraft:chemistry_table","id":238,"data":14},{"name":"minecraft:chemistry_table","id":238,"data":15},{"name":"minecraft:underwater_torch","id":239,"data":0},{"name":"minecraft:underwater_torch","id":239,"data":1},{"name":"minecraft:underwater_torch","id":239,"data":2},{"name":"minecraft:underwater_torch","id":239,"data":3},{"name":"minecraft:underwater_torch","id":239,"data":4},{"name":"minecraft:underwater_torch","id":239,"data":5},{"name":"minecraft:underwater_torch","id":239,"data":6},{"name":"minecraft:underwater_torch","id":239,"data":7},{"name":"minecraft:chorus_plant","id":240,"data":0},{"name":"minecraft:stained_glass","id":241,"data":0},{"name":"minecraft:stained_glass","id":241,"data":1},{"name":"minecraft:stained_glass","id":241,"data":2},{"name":"minecraft:stained_glass","id":241,"data":3},{"name":"minecraft:stained_glass","id":241,"data":4},{"name":"minecraft:stained_glass","id":241,"data":5},{"name":"minecraft:stained_glass","id":241,"data":6},{"name":"minecraft:stained_glass","id":241,"data":7},{"name":"minecraft:stained_glass","id":241,"data":8},{"name":"minecraft:stained_glass","id":241,"data":9},{"name":"minecraft:stained_glass","id":241,"data":10},{"name":"minecraft:stained_glass","id":241,"data":11},{"name":"minecraft:stained_glass","id":241,"data":12},{"name":"minecraft:stained_glass","id":241,"data":13},{"name":"minecraft:stained_glass","id":241,"data":14},{"name":"minecraft:stained_glass","id":241,"data":15},{"name":"minecraft:podzol","id":243,"data":0},{"name":"minecraft:beetroot","id":244,"data":0},{"name":"minecraft:beetroot","id":244,"data":1},{"name":"minecraft:beetroot","id":244,"data":2},{"name":"minecraft:beetroot","id":244,"data":3},{"name":"minecraft:beetroot","id":244,"data":4},{"name":"minecraft:beetroot","id":244,"data":5},{"name":"minecraft:beetroot","id":244,"data":6},{"name":"minecraft:beetroot","id":244,"data":7},{"name":"minecraft:stonecutter","id":245,"data":0},{"name":"minecraft:glowingobsidian","id":246,"data":0},{"name":"minecraft:netherreactor","id":247,"data":0},{"name":"minecraft:info_update","id":248,"data":0},{"name":"minecraft:info_update2","id":249,"data":0},{"name":"minecraft:movingBlock","id":250,"data":0},{"name":"minecraft:observer","id":251,"data":0},{"name":"minecraft:observer","id":251,"data":1},{"name":"minecraft:observer","id":251,"data":2},{"name":"minecraft:observer","id":251,"data":3},{"name":"minecraft:observer","id":251,"data":4},{"name":"minecraft:observer","id":251,"data":5},{"name":"minecraft:observer","id":251,"data":6},{"name":"minecraft:observer","id":251,"data":7},{"name":"minecraft:observer","id":251,"data":8},{"name":"minecraft:observer","id":251,"data":9},{"name":"minecraft:observer","id":251,"data":10},{"name":"minecraft:observer","id":251,"data":11},{"name":"minecraft:observer","id":251,"data":12},{"name":"minecraft:observer","id":251,"data":13},{"name":"minecraft:observer","id":251,"data":14},{"name":"minecraft:observer","id":251,"data":15},{"name":"minecraft:structure_block","id":252,"data":0},{"name":"minecraft:structure_block","id":252,"data":1},{"name":"minecraft:structure_block","id":252,"data":2},{"name":"minecraft:structure_block","id":252,"data":3},{"name":"minecraft:structure_block","id":252,"data":4},{"name":"minecraft:structure_block","id":252,"data":5},{"name":"minecraft:structure_block","id":252,"data":6},{"name":"minecraft:structure_block","id":252,"data":7},{"name":"minecraft:hard_glass","id":253,"data":0},{"name":"minecraft:hard_stained_glass","id":254,"data":0},{"name":"minecraft:hard_stained_glass","id":254,"data":1},{"name":"minecraft:hard_stained_glass","id":254,"data":2},{"name":"minecraft:hard_stained_glass","id":254,"data":3},{"name":"minecraft:hard_stained_glass","id":254,"data":4},{"name":"minecraft:hard_stained_glass","id":254,"data":5},{"name":"minecraft:hard_stained_glass","id":254,"data":6},{"name":"minecraft:hard_stained_glass","id":254,"data":7},{"name":"minecraft:hard_stained_glass","id":254,"data":8},{"name":"minecraft:hard_stained_glass","id":254,"data":9},{"name":"minecraft:hard_stained_glass","id":254,"data":10},{"name":"minecraft:hard_stained_glass","id":254,"data":11},{"name":"minecraft:hard_stained_glass","id":254,"data":12},{"name":"minecraft:hard_stained_glass","id":254,"data":13},{"name":"minecraft:hard_stained_glass","id":254,"data":14},{"name":"minecraft:hard_stained_glass","id":254,"data":15},{"name":"minecraft:reserved6","id":255,"data":0},{"name":"minecraft:prismarine_stairs","id":257,"data":0},{"name":"minecraft:prismarine_stairs","id":257,"data":1},{"name":"minecraft:prismarine_stairs","id":257,"data":2},{"name":"minecraft:prismarine_stairs","id":257,"data":3},{"name":"minecraft:prismarine_stairs","id":257,"data":4},{"name":"minecraft:prismarine_stairs","id":257,"data":5},{"name":"minecraft:prismarine_stairs","id":257,"data":6},{"name":"minecraft:prismarine_stairs","id":257,"data":7},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":0},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":1},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":2},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":3},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":4},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":5},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":6},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":7},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":0},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":1},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":2},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":3},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":4},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":5},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":6},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":7},{"name":"minecraft:stripped_spruce_log","id":260,"data":0},{"name":"minecraft:stripped_spruce_log","id":260,"data":1},{"name":"minecraft:stripped_spruce_log","id":260,"data":2},{"name":"minecraft:stripped_spruce_log","id":260,"data":3},{"name":"minecraft:stripped_birch_log","id":261,"data":0},{"name":"minecraft:stripped_birch_log","id":261,"data":1},{"name":"minecraft:stripped_birch_log","id":261,"data":2},{"name":"minecraft:stripped_birch_log","id":261,"data":3},{"name":"minecraft:stripped_jungle_log","id":262,"data":0},{"name":"minecraft:stripped_jungle_log","id":262,"data":1},{"name":"minecraft:stripped_jungle_log","id":262,"data":2},{"name":"minecraft:stripped_jungle_log","id":262,"data":3},{"name":"minecraft:stripped_acacia_log","id":263,"data":0},{"name":"minecraft:stripped_acacia_log","id":263,"data":1},{"name":"minecraft:stripped_acacia_log","id":263,"data":2},{"name":"minecraft:stripped_acacia_log","id":263,"data":3},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":0},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":1},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":2},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":3},{"name":"minecraft:stripped_oak_log","id":265,"data":0},{"name":"minecraft:stripped_oak_log","id":265,"data":1},{"name":"minecraft:stripped_oak_log","id":265,"data":2},{"name":"minecraft:stripped_oak_log","id":265,"data":3},{"name":"minecraft:blue_ice","id":266,"data":0},{"name":"minecraft:element_1","id":267,"data":0},{"name":"minecraft:element_2","id":268,"data":0},{"name":"minecraft:element_3","id":269,"data":0},{"name":"minecraft:element_4","id":270,"data":0},{"name":"minecraft:element_5","id":271,"data":0},{"name":"minecraft:element_6","id":272,"data":0},{"name":"minecraft:element_7","id":273,"data":0},{"name":"minecraft:element_8","id":274,"data":0},{"name":"minecraft:element_9","id":275,"data":0},{"name":"minecraft:element_10","id":276,"data":0},{"name":"minecraft:element_11","id":277,"data":0},{"name":"minecraft:element_12","id":278,"data":0},{"name":"minecraft:element_13","id":279,"data":0},{"name":"minecraft:element_14","id":280,"data":0},{"name":"minecraft:element_15","id":281,"data":0},{"name":"minecraft:element_16","id":282,"data":0},{"name":"minecraft:element_17","id":283,"data":0},{"name":"minecraft:element_18","id":284,"data":0},{"name":"minecraft:element_19","id":285,"data":0},{"name":"minecraft:element_20","id":286,"data":0},{"name":"minecraft:element_21","id":287,"data":0},{"name":"minecraft:element_22","id":288,"data":0},{"name":"minecraft:element_23","id":289,"data":0},{"name":"minecraft:element_24","id":290,"data":0},{"name":"minecraft:element_25","id":291,"data":0},{"name":"minecraft:element_26","id":292,"data":0},{"name":"minecraft:element_27","id":293,"data":0},{"name":"minecraft:element_28","id":294,"data":0},{"name":"minecraft:element_29","id":295,"data":0},{"name":"minecraft:element_30","id":296,"data":0},{"name":"minecraft:element_31","id":297,"data":0},{"name":"minecraft:element_32","id":298,"data":0},{"name":"minecraft:element_33","id":299,"data":0},{"name":"minecraft:element_34","id":300,"data":0},{"name":"minecraft:element_35","id":301,"data":0},{"name":"minecraft:element_36","id":302,"data":0},{"name":"minecraft:element_37","id":303,"data":0},{"name":"minecraft:element_38","id":304,"data":0},{"name":"minecraft:element_39","id":305,"data":0},{"name":"minecraft:element_40","id":306,"data":0},{"name":"minecraft:element_41","id":307,"data":0},{"name":"minecraft:element_42","id":308,"data":0},{"name":"minecraft:element_43","id":309,"data":0},{"name":"minecraft:element_44","id":310,"data":0},{"name":"minecraft:element_45","id":311,"data":0},{"name":"minecraft:element_46","id":312,"data":0},{"name":"minecraft:element_47","id":313,"data":0},{"name":"minecraft:element_48","id":314,"data":0},{"name":"minecraft:element_49","id":315,"data":0},{"name":"minecraft:element_50","id":316,"data":0},{"name":"minecraft:element_51","id":317,"data":0},{"name":"minecraft:element_52","id":318,"data":0},{"name":"minecraft:element_53","id":319,"data":0},{"name":"minecraft:element_54","id":320,"data":0},{"name":"minecraft:element_55","id":321,"data":0},{"name":"minecraft:element_56","id":322,"data":0},{"name":"minecraft:element_57","id":323,"data":0},{"name":"minecraft:element_58","id":324,"data":0},{"name":"minecraft:element_59","id":325,"data":0},{"name":"minecraft:element_60","id":326,"data":0},{"name":"minecraft:element_61","id":327,"data":0},{"name":"minecraft:element_62","id":328,"data":0},{"name":"minecraft:element_63","id":329,"data":0},{"name":"minecraft:element_64","id":330,"data":0},{"name":"minecraft:element_65","id":331,"data":0},{"name":"minecraft:element_66","id":332,"data":0},{"name":"minecraft:element_67","id":333,"data":0},{"name":"minecraft:element_68","id":334,"data":0},{"name":"minecraft:element_69","id":335,"data":0},{"name":"minecraft:element_70","id":336,"data":0},{"name":"minecraft:element_71","id":337,"data":0},{"name":"minecraft:element_72","id":338,"data":0},{"name":"minecraft:element_73","id":339,"data":0},{"name":"minecraft:element_74","id":340,"data":0},{"name":"minecraft:element_75","id":341,"data":0},{"name":"minecraft:element_76","id":342,"data":0},{"name":"minecraft:element_77","id":343,"data":0},{"name":"minecraft:element_78","id":344,"data":0},{"name":"minecraft:element_79","id":345,"data":0},{"name":"minecraft:element_80","id":346,"data":0},{"name":"minecraft:element_81","id":347,"data":0},{"name":"minecraft:element_82","id":348,"data":0},{"name":"minecraft:element_83","id":349,"data":0},{"name":"minecraft:element_84","id":350,"data":0},{"name":"minecraft:element_85","id":351,"data":0},{"name":"minecraft:element_86","id":352,"data":0},{"name":"minecraft:element_87","id":353,"data":0},{"name":"minecraft:element_88","id":354,"data":0},{"name":"minecraft:element_89","id":355,"data":0},{"name":"minecraft:element_90","id":356,"data":0},{"name":"minecraft:element_91","id":357,"data":0},{"name":"minecraft:element_92","id":358,"data":0},{"name":"minecraft:element_93","id":359,"data":0},{"name":"minecraft:element_94","id":360,"data":0},{"name":"minecraft:element_95","id":361,"data":0},{"name":"minecraft:element_96","id":362,"data":0},{"name":"minecraft:element_97","id":363,"data":0},{"name":"minecraft:element_98","id":364,"data":0},{"name":"minecraft:element_99","id":365,"data":0},{"name":"minecraft:element_100","id":366,"data":0},{"name":"minecraft:element_101","id":367,"data":0},{"name":"minecraft:element_102","id":368,"data":0},{"name":"minecraft:element_103","id":369,"data":0},{"name":"minecraft:element_104","id":370,"data":0},{"name":"minecraft:element_105","id":371,"data":0},{"name":"minecraft:element_106","id":372,"data":0},{"name":"minecraft:element_107","id":373,"data":0},{"name":"minecraft:element_108","id":374,"data":0},{"name":"minecraft:element_109","id":375,"data":0},{"name":"minecraft:element_110","id":376,"data":0},{"name":"minecraft:element_111","id":377,"data":0},{"name":"minecraft:element_112","id":378,"data":0},{"name":"minecraft:element_113","id":379,"data":0},{"name":"minecraft:element_114","id":380,"data":0},{"name":"minecraft:element_115","id":381,"data":0},{"name":"minecraft:element_116","id":382,"data":0},{"name":"minecraft:element_117","id":383,"data":0},{"name":"minecraft:element_118","id":384,"data":0},{"name":"minecraft:seagrass","id":385,"data":0},{"name":"minecraft:seagrass","id":385,"data":1},{"name":"minecraft:seagrass","id":385,"data":2},{"name":"minecraft:seagrass","id":385,"data":3},{"name":"minecraft:coral","id":386,"data":0},{"name":"minecraft:coral","id":386,"data":1},{"name":"minecraft:coral","id":386,"data":2},{"name":"minecraft:coral","id":386,"data":3},{"name":"minecraft:coral","id":386,"data":4},{"name":"minecraft:coral","id":386,"data":5},{"name":"minecraft:coral","id":386,"data":6},{"name":"minecraft:coral","id":386,"data":7},{"name":"minecraft:coral_block","id":387,"data":0},{"name":"minecraft:coral_block","id":387,"data":1},{"name":"minecraft:coral_block","id":387,"data":2},{"name":"minecraft:coral_block","id":387,"data":3},{"name":"minecraft:coral_block","id":387,"data":4},{"name":"minecraft:coral_block","id":387,"data":5},{"name":"minecraft:coral_block","id":387,"data":6},{"name":"minecraft:coral_block","id":387,"data":7},{"name":"minecraft:coral_block","id":387,"data":8},{"name":"minecraft:coral_block","id":387,"data":9},{"name":"minecraft:coral_block","id":387,"data":10},{"name":"minecraft:coral_block","id":387,"data":11},{"name":"minecraft:coral_block","id":387,"data":12},{"name":"minecraft:coral_block","id":387,"data":13},{"name":"minecraft:coral_block","id":387,"data":14},{"name":"minecraft:coral_block","id":387,"data":15},{"name":"minecraft:coral_fan","id":388,"data":0},{"name":"minecraft:coral_fan","id":388,"data":1},{"name":"minecraft:coral_fan","id":388,"data":2},{"name":"minecraft:coral_fan","id":388,"data":3},{"name":"minecraft:coral_fan","id":388,"data":4},{"name":"minecraft:coral_fan","id":388,"data":5},{"name":"minecraft:coral_fan","id":388,"data":6},{"name":"minecraft:coral_fan","id":388,"data":7},{"name":"minecraft:coral_fan","id":388,"data":8},{"name":"minecraft:coral_fan","id":388,"data":9},{"name":"minecraft:coral_fan","id":388,"data":10},{"name":"minecraft:coral_fan","id":388,"data":11},{"name":"minecraft:coral_fan","id":388,"data":12},{"name":"minecraft:coral_fan","id":388,"data":13},{"name":"minecraft:coral_fan","id":388,"data":14},{"name":"minecraft:coral_fan","id":388,"data":15},{"name":"minecraft:coral_fan_dead","id":389,"data":0},{"name":"minecraft:coral_fan_dead","id":389,"data":1},{"name":"minecraft:coral_fan_dead","id":389,"data":2},{"name":"minecraft:coral_fan_dead","id":389,"data":3},{"name":"minecraft:coral_fan_dead","id":389,"data":4},{"name":"minecraft:coral_fan_dead","id":389,"data":5},{"name":"minecraft:coral_fan_dead","id":389,"data":6},{"name":"minecraft:coral_fan_dead","id":389,"data":7},{"name":"minecraft:coral_fan_dead","id":389,"data":8},{"name":"minecraft:coral_fan_dead","id":389,"data":9},{"name":"minecraft:coral_fan_dead","id":389,"data":10},{"name":"minecraft:coral_fan_dead","id":389,"data":11},{"name":"minecraft:coral_fan_dead","id":389,"data":12},{"name":"minecraft:coral_fan_dead","id":389,"data":13},{"name":"minecraft:coral_fan_dead","id":389,"data":14},{"name":"minecraft:coral_fan_dead","id":389,"data":15},{"name":"minecraft:coral_fan_hang","id":390,"data":0},{"name":"minecraft:coral_fan_hang","id":390,"data":1},{"name":"minecraft:coral_fan_hang","id":390,"data":2},{"name":"minecraft:coral_fan_hang","id":390,"data":3},{"name":"minecraft:coral_fan_hang","id":390,"data":4},{"name":"minecraft:coral_fan_hang","id":390,"data":5},{"name":"minecraft:coral_fan_hang","id":390,"data":6},{"name":"minecraft:coral_fan_hang","id":390,"data":7},{"name":"minecraft:coral_fan_hang","id":390,"data":8},{"name":"minecraft:coral_fan_hang","id":390,"data":9},{"name":"minecraft:coral_fan_hang","id":390,"data":10},{"name":"minecraft:coral_fan_hang","id":390,"data":11},{"name":"minecraft:coral_fan_hang","id":390,"data":12},{"name":"minecraft:coral_fan_hang","id":390,"data":13},{"name":"minecraft:coral_fan_hang","id":390,"data":14},{"name":"minecraft:coral_fan_hang","id":390,"data":15},{"name":"minecraft:coral_fan_hang2","id":391,"data":0},{"name":"minecraft:coral_fan_hang2","id":391,"data":1},{"name":"minecraft:coral_fan_hang2","id":391,"data":2},{"name":"minecraft:coral_fan_hang2","id":391,"data":3},{"name":"minecraft:coral_fan_hang2","id":391,"data":4},{"name":"minecraft:coral_fan_hang2","id":391,"data":5},{"name":"minecraft:coral_fan_hang2","id":391,"data":6},{"name":"minecraft:coral_fan_hang2","id":391,"data":7},{"name":"minecraft:coral_fan_hang2","id":391,"data":8},{"name":"minecraft:coral_fan_hang2","id":391,"data":9},{"name":"minecraft:coral_fan_hang2","id":391,"data":10},{"name":"minecraft:coral_fan_hang2","id":391,"data":11},{"name":"minecraft:coral_fan_hang2","id":391,"data":12},{"name":"minecraft:coral_fan_hang2","id":391,"data":13},{"name":"minecraft:coral_fan_hang2","id":391,"data":14},{"name":"minecraft:coral_fan_hang2","id":391,"data":15},{"name":"minecraft:coral_fan_hang3","id":392,"data":0},{"name":"minecraft:coral_fan_hang3","id":392,"data":1},{"name":"minecraft:coral_fan_hang3","id":392,"data":2},{"name":"minecraft:coral_fan_hang3","id":392,"data":3},{"name":"minecraft:coral_fan_hang3","id":392,"data":4},{"name":"minecraft:coral_fan_hang3","id":392,"data":5},{"name":"minecraft:coral_fan_hang3","id":392,"data":6},{"name":"minecraft:coral_fan_hang3","id":392,"data":7},{"name":"minecraft:coral_fan_hang3","id":392,"data":8},{"name":"minecraft:coral_fan_hang3","id":392,"data":9},{"name":"minecraft:coral_fan_hang3","id":392,"data":10},{"name":"minecraft:coral_fan_hang3","id":392,"data":11},{"name":"minecraft:coral_fan_hang3","id":392,"data":12},{"name":"minecraft:coral_fan_hang3","id":392,"data":13},{"name":"minecraft:coral_fan_hang3","id":392,"data":14},{"name":"minecraft:coral_fan_hang3","id":392,"data":15},{"name":"minecraft:kelp","id":393,"data":0},{"name":"minecraft:kelp","id":393,"data":1},{"name":"minecraft:kelp","id":393,"data":2},{"name":"minecraft:kelp","id":393,"data":3},{"name":"minecraft:kelp","id":393,"data":4},{"name":"minecraft:kelp","id":393,"data":5},{"name":"minecraft:kelp","id":393,"data":6},{"name":"minecraft:kelp","id":393,"data":7},{"name":"minecraft:kelp","id":393,"data":8},{"name":"minecraft:kelp","id":393,"data":9},{"name":"minecraft:kelp","id":393,"data":10},{"name":"minecraft:kelp","id":393,"data":11},{"name":"minecraft:kelp","id":393,"data":12},{"name":"minecraft:kelp","id":393,"data":13},{"name":"minecraft:kelp","id":393,"data":14},{"name":"minecraft:kelp","id":393,"data":15},{"name":"minecraft:dried_kelp_block","id":394,"data":0},{"name":"minecraft:acacia_button","id":395,"data":0},{"name":"minecraft:acacia_button","id":395,"data":1},{"name":"minecraft:acacia_button","id":395,"data":2},{"name":"minecraft:acacia_button","id":395,"data":3},{"name":"minecraft:acacia_button","id":395,"data":4},{"name":"minecraft:acacia_button","id":395,"data":5},{"name":"minecraft:acacia_button","id":395,"data":6},{"name":"minecraft:acacia_button","id":395,"data":7},{"name":"minecraft:acacia_button","id":395,"data":8},{"name":"minecraft:acacia_button","id":395,"data":9},{"name":"minecraft:acacia_button","id":395,"data":10},{"name":"minecraft:acacia_button","id":395,"data":11},{"name":"minecraft:acacia_button","id":395,"data":12},{"name":"minecraft:acacia_button","id":395,"data":13},{"name":"minecraft:acacia_button","id":395,"data":14},{"name":"minecraft:acacia_button","id":395,"data":15},{"name":"minecraft:birch_button","id":396,"data":0},{"name":"minecraft:birch_button","id":396,"data":1},{"name":"minecraft:birch_button","id":396,"data":2},{"name":"minecraft:birch_button","id":396,"data":3},{"name":"minecraft:birch_button","id":396,"data":4},{"name":"minecraft:birch_button","id":396,"data":5},{"name":"minecraft:birch_button","id":396,"data":6},{"name":"minecraft:birch_button","id":396,"data":7},{"name":"minecraft:birch_button","id":396,"data":8},{"name":"minecraft:birch_button","id":396,"data":9},{"name":"minecraft:birch_button","id":396,"data":10},{"name":"minecraft:birch_button","id":396,"data":11},{"name":"minecraft:birch_button","id":396,"data":12},{"name":"minecraft:birch_button","id":396,"data":13},{"name":"minecraft:birch_button","id":396,"data":14},{"name":"minecraft:birch_button","id":396,"data":15},{"name":"minecraft:dark_oak_button","id":397,"data":0},{"name":"minecraft:dark_oak_button","id":397,"data":1},{"name":"minecraft:dark_oak_button","id":397,"data":2},{"name":"minecraft:dark_oak_button","id":397,"data":3},{"name":"minecraft:dark_oak_button","id":397,"data":4},{"name":"minecraft:dark_oak_button","id":397,"data":5},{"name":"minecraft:dark_oak_button","id":397,"data":6},{"name":"minecraft:dark_oak_button","id":397,"data":7},{"name":"minecraft:dark_oak_button","id":397,"data":8},{"name":"minecraft:dark_oak_button","id":397,"data":9},{"name":"minecraft:dark_oak_button","id":397,"data":10},{"name":"minecraft:dark_oak_button","id":397,"data":11},{"name":"minecraft:dark_oak_button","id":397,"data":12},{"name":"minecraft:dark_oak_button","id":397,"data":13},{"name":"minecraft:dark_oak_button","id":397,"data":14},{"name":"minecraft:dark_oak_button","id":397,"data":15},{"name":"minecraft:jungle_button","id":398,"data":0},{"name":"minecraft:jungle_button","id":398,"data":1},{"name":"minecraft:jungle_button","id":398,"data":2},{"name":"minecraft:jungle_button","id":398,"data":3},{"name":"minecraft:jungle_button","id":398,"data":4},{"name":"minecraft:jungle_button","id":398,"data":5},{"name":"minecraft:jungle_button","id":398,"data":6},{"name":"minecraft:jungle_button","id":398,"data":7},{"name":"minecraft:jungle_button","id":398,"data":8},{"name":"minecraft:jungle_button","id":398,"data":9},{"name":"minecraft:jungle_button","id":398,"data":10},{"name":"minecraft:jungle_button","id":398,"data":11},{"name":"minecraft:jungle_button","id":398,"data":12},{"name":"minecraft:jungle_button","id":398,"data":13},{"name":"minecraft:jungle_button","id":398,"data":14},{"name":"minecraft:jungle_button","id":398,"data":15},{"name":"minecraft:spruce_button","id":399,"data":0},{"name":"minecraft:spruce_button","id":399,"data":1},{"name":"minecraft:spruce_button","id":399,"data":2},{"name":"minecraft:spruce_button","id":399,"data":3},{"name":"minecraft:spruce_button","id":399,"data":4},{"name":"minecraft:spruce_button","id":399,"data":5},{"name":"minecraft:spruce_button","id":399,"data":6},{"name":"minecraft:spruce_button","id":399,"data":7},{"name":"minecraft:spruce_button","id":399,"data":8},{"name":"minecraft:spruce_button","id":399,"data":9},{"name":"minecraft:spruce_button","id":399,"data":10},{"name":"minecraft:spruce_button","id":399,"data":11},{"name":"minecraft:spruce_button","id":399,"data":12},{"name":"minecraft:spruce_button","id":399,"data":13},{"name":"minecraft:spruce_button","id":399,"data":14},{"name":"minecraft:spruce_button","id":399,"data":15},{"name":"minecraft:acacia_trapdoor","id":400,"data":0},{"name":"minecraft:acacia_trapdoor","id":400,"data":1},{"name":"minecraft:acacia_trapdoor","id":400,"data":2},{"name":"minecraft:acacia_trapdoor","id":400,"data":3},{"name":"minecraft:acacia_trapdoor","id":400,"data":4},{"name":"minecraft:acacia_trapdoor","id":400,"data":5},{"name":"minecraft:acacia_trapdoor","id":400,"data":6},{"name":"minecraft:acacia_trapdoor","id":400,"data":7},{"name":"minecraft:acacia_trapdoor","id":400,"data":8},{"name":"minecraft:acacia_trapdoor","id":400,"data":9},{"name":"minecraft:acacia_trapdoor","id":400,"data":10},{"name":"minecraft:acacia_trapdoor","id":400,"data":11},{"name":"minecraft:acacia_trapdoor","id":400,"data":12},{"name":"minecraft:acacia_trapdoor","id":400,"data":13},{"name":"minecraft:acacia_trapdoor","id":400,"data":14},{"name":"minecraft:acacia_trapdoor","id":400,"data":15},{"name":"minecraft:birch_trapdoor","id":401,"data":0},{"name":"minecraft:birch_trapdoor","id":401,"data":1},{"name":"minecraft:birch_trapdoor","id":401,"data":2},{"name":"minecraft:birch_trapdoor","id":401,"data":3},{"name":"minecraft:birch_trapdoor","id":401,"data":4},{"name":"minecraft:birch_trapdoor","id":401,"data":5},{"name":"minecraft:birch_trapdoor","id":401,"data":6},{"name":"minecraft:birch_trapdoor","id":401,"data":7},{"name":"minecraft:birch_trapdoor","id":401,"data":8},{"name":"minecraft:birch_trapdoor","id":401,"data":9},{"name":"minecraft:birch_trapdoor","id":401,"data":10},{"name":"minecraft:birch_trapdoor","id":401,"data":11},{"name":"minecraft:birch_trapdoor","id":401,"data":12},{"name":"minecraft:birch_trapdoor","id":401,"data":13},{"name":"minecraft:birch_trapdoor","id":401,"data":14},{"name":"minecraft:birch_trapdoor","id":401,"data":15},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":0},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":1},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":2},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":3},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":4},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":5},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":6},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":7},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":8},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":9},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":10},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":11},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":12},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":13},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":14},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":15},{"name":"minecraft:jungle_trapdoor","id":403,"data":0},{"name":"minecraft:jungle_trapdoor","id":403,"data":1},{"name":"minecraft:jungle_trapdoor","id":403,"data":2},{"name":"minecraft:jungle_trapdoor","id":403,"data":3},{"name":"minecraft:jungle_trapdoor","id":403,"data":4},{"name":"minecraft:jungle_trapdoor","id":403,"data":5},{"name":"minecraft:jungle_trapdoor","id":403,"data":6},{"name":"minecraft:jungle_trapdoor","id":403,"data":7},{"name":"minecraft:jungle_trapdoor","id":403,"data":8},{"name":"minecraft:jungle_trapdoor","id":403,"data":9},{"name":"minecraft:jungle_trapdoor","id":403,"data":10},{"name":"minecraft:jungle_trapdoor","id":403,"data":11},{"name":"minecraft:jungle_trapdoor","id":403,"data":12},{"name":"minecraft:jungle_trapdoor","id":403,"data":13},{"name":"minecraft:jungle_trapdoor","id":403,"data":14},{"name":"minecraft:jungle_trapdoor","id":403,"data":15},{"name":"minecraft:spruce_trapdoor","id":404,"data":0},{"name":"minecraft:spruce_trapdoor","id":404,"data":1},{"name":"minecraft:spruce_trapdoor","id":404,"data":2},{"name":"minecraft:spruce_trapdoor","id":404,"data":3},{"name":"minecraft:spruce_trapdoor","id":404,"data":4},{"name":"minecraft:spruce_trapdoor","id":404,"data":5},{"name":"minecraft:spruce_trapdoor","id":404,"data":6},{"name":"minecraft:spruce_trapdoor","id":404,"data":7},{"name":"minecraft:spruce_trapdoor","id":404,"data":8},{"name":"minecraft:spruce_trapdoor","id":404,"data":9},{"name":"minecraft:spruce_trapdoor","id":404,"data":10},{"name":"minecraft:spruce_trapdoor","id":404,"data":11},{"name":"minecraft:spruce_trapdoor","id":404,"data":12},{"name":"minecraft:spruce_trapdoor","id":404,"data":13},{"name":"minecraft:spruce_trapdoor","id":404,"data":14},{"name":"minecraft:spruce_trapdoor","id":404,"data":15},{"name":"minecraft:acacia_pressure_plate","id":405,"data":0},{"name":"minecraft:acacia_pressure_plate","id":405,"data":1},{"name":"minecraft:acacia_pressure_plate","id":405,"data":2},{"name":"minecraft:acacia_pressure_plate","id":405,"data":3},{"name":"minecraft:acacia_pressure_plate","id":405,"data":4},{"name":"minecraft:acacia_pressure_plate","id":405,"data":5},{"name":"minecraft:acacia_pressure_plate","id":405,"data":6},{"name":"minecraft:acacia_pressure_plate","id":405,"data":7},{"name":"minecraft:acacia_pressure_plate","id":405,"data":8},{"name":"minecraft:acacia_pressure_plate","id":405,"data":9},{"name":"minecraft:acacia_pressure_plate","id":405,"data":10},{"name":"minecraft:acacia_pressure_plate","id":405,"data":11},{"name":"minecraft:acacia_pressure_plate","id":405,"data":12},{"name":"minecraft:acacia_pressure_plate","id":405,"data":13},{"name":"minecraft:acacia_pressure_plate","id":405,"data":14},{"name":"minecraft:acacia_pressure_plate","id":405,"data":15},{"name":"minecraft:birch_pressure_plate","id":406,"data":0},{"name":"minecraft:birch_pressure_plate","id":406,"data":1},{"name":"minecraft:birch_pressure_plate","id":406,"data":2},{"name":"minecraft:birch_pressure_plate","id":406,"data":3},{"name":"minecraft:birch_pressure_plate","id":406,"data":4},{"name":"minecraft:birch_pressure_plate","id":406,"data":5},{"name":"minecraft:birch_pressure_plate","id":406,"data":6},{"name":"minecraft:birch_pressure_plate","id":406,"data":7},{"name":"minecraft:birch_pressure_plate","id":406,"data":8},{"name":"minecraft:birch_pressure_plate","id":406,"data":9},{"name":"minecraft:birch_pressure_plate","id":406,"data":10},{"name":"minecraft:birch_pressure_plate","id":406,"data":11},{"name":"minecraft:birch_pressure_plate","id":406,"data":12},{"name":"minecraft:birch_pressure_plate","id":406,"data":13},{"name":"minecraft:birch_pressure_plate","id":406,"data":14},{"name":"minecraft:birch_pressure_plate","id":406,"data":15},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":0},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":1},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":2},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":3},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":4},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":5},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":6},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":7},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":8},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":9},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":10},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":11},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":12},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":13},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":14},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":15},{"name":"minecraft:jungle_pressure_plate","id":408,"data":0},{"name":"minecraft:jungle_pressure_plate","id":408,"data":1},{"name":"minecraft:jungle_pressure_plate","id":408,"data":2},{"name":"minecraft:jungle_pressure_plate","id":408,"data":3},{"name":"minecraft:jungle_pressure_plate","id":408,"data":4},{"name":"minecraft:jungle_pressure_plate","id":408,"data":5},{"name":"minecraft:jungle_pressure_plate","id":408,"data":6},{"name":"minecraft:jungle_pressure_plate","id":408,"data":7},{"name":"minecraft:jungle_pressure_plate","id":408,"data":8},{"name":"minecraft:jungle_pressure_plate","id":408,"data":9},{"name":"minecraft:jungle_pressure_plate","id":408,"data":10},{"name":"minecraft:jungle_pressure_plate","id":408,"data":11},{"name":"minecraft:jungle_pressure_plate","id":408,"data":12},{"name":"minecraft:jungle_pressure_plate","id":408,"data":13},{"name":"minecraft:jungle_pressure_plate","id":408,"data":14},{"name":"minecraft:jungle_pressure_plate","id":408,"data":15},{"name":"minecraft:spruce_pressure_plate","id":409,"data":0},{"name":"minecraft:spruce_pressure_plate","id":409,"data":1},{"name":"minecraft:spruce_pressure_plate","id":409,"data":2},{"name":"minecraft:spruce_pressure_plate","id":409,"data":3},{"name":"minecraft:spruce_pressure_plate","id":409,"data":4},{"name":"minecraft:spruce_pressure_plate","id":409,"data":5},{"name":"minecraft:spruce_pressure_plate","id":409,"data":6},{"name":"minecraft:spruce_pressure_plate","id":409,"data":7},{"name":"minecraft:spruce_pressure_plate","id":409,"data":8},{"name":"minecraft:spruce_pressure_plate","id":409,"data":9},{"name":"minecraft:spruce_pressure_plate","id":409,"data":10},{"name":"minecraft:spruce_pressure_plate","id":409,"data":11},{"name":"minecraft:spruce_pressure_plate","id":409,"data":12},{"name":"minecraft:spruce_pressure_plate","id":409,"data":13},{"name":"minecraft:spruce_pressure_plate","id":409,"data":14},{"name":"minecraft:spruce_pressure_plate","id":409,"data":15},{"name":"minecraft:carved_pumpkin","id":410,"data":0},{"name":"minecraft:carved_pumpkin","id":410,"data":1},{"name":"minecraft:carved_pumpkin","id":410,"data":2},{"name":"minecraft:carved_pumpkin","id":410,"data":3},{"name":"minecraft:sea_pickle","id":411,"data":0},{"name":"minecraft:sea_pickle","id":411,"data":1},{"name":"minecraft:sea_pickle","id":411,"data":2},{"name":"minecraft:sea_pickle","id":411,"data":3},{"name":"minecraft:sea_pickle","id":411,"data":4},{"name":"minecraft:sea_pickle","id":411,"data":5},{"name":"minecraft:sea_pickle","id":411,"data":6},{"name":"minecraft:sea_pickle","id":411,"data":7},{"name":"minecraft:conduit","id":412,"data":0},{"name":"minecraft:turtle_egg","id":414,"data":0},{"name":"minecraft:turtle_egg","id":414,"data":1},{"name":"minecraft:turtle_egg","id":414,"data":2},{"name":"minecraft:turtle_egg","id":414,"data":3},{"name":"minecraft:turtle_egg","id":414,"data":4},{"name":"minecraft:turtle_egg","id":414,"data":5},{"name":"minecraft:turtle_egg","id":414,"data":6},{"name":"minecraft:turtle_egg","id":414,"data":7},{"name":"minecraft:turtle_egg","id":414,"data":8},{"name":"minecraft:turtle_egg","id":414,"data":9},{"name":"minecraft:turtle_egg","id":414,"data":10},{"name":"minecraft:turtle_egg","id":414,"data":11},{"name":"minecraft:turtle_egg","id":414,"data":12},{"name":"minecraft:turtle_egg","id":414,"data":13},{"name":"minecraft:turtle_egg","id":414,"data":14},{"name":"minecraft:turtle_egg","id":414,"data":15},{"name":"minecraft:bubble_column","id":415,"data":0},{"name":"minecraft:bubble_column","id":415,"data":1},{"name":"minecraft:barrier","id":416,"data":0},{"name":"minecraft:stone_slab3","id":417,"data":0},{"name":"minecraft:stone_slab3","id":417,"data":1},{"name":"minecraft:stone_slab3","id":417,"data":2},{"name":"minecraft:stone_slab3","id":417,"data":3},{"name":"minecraft:stone_slab3","id":417,"data":4},{"name":"minecraft:stone_slab3","id":417,"data":5},{"name":"minecraft:stone_slab3","id":417,"data":6},{"name":"minecraft:stone_slab3","id":417,"data":7},{"name":"minecraft:stone_slab3","id":417,"data":8},{"name":"minecraft:stone_slab3","id":417,"data":9},{"name":"minecraft:stone_slab3","id":417,"data":10},{"name":"minecraft:stone_slab3","id":417,"data":11},{"name":"minecraft:stone_slab3","id":417,"data":12},{"name":"minecraft:stone_slab3","id":417,"data":13},{"name":"minecraft:stone_slab3","id":417,"data":14},{"name":"minecraft:stone_slab3","id":417,"data":15},{"name":"minecraft:bamboo","id":418,"data":0},{"name":"minecraft:bamboo","id":418,"data":1},{"name":"minecraft:bamboo","id":418,"data":2},{"name":"minecraft:bamboo","id":418,"data":3},{"name":"minecraft:bamboo","id":418,"data":4},{"name":"minecraft:bamboo","id":418,"data":5},{"name":"minecraft:bamboo","id":418,"data":6},{"name":"minecraft:bamboo","id":418,"data":7},{"name":"minecraft:bamboo","id":418,"data":8},{"name":"minecraft:bamboo","id":418,"data":9},{"name":"minecraft:bamboo","id":418,"data":10},{"name":"minecraft:bamboo","id":418,"data":11},{"name":"minecraft:bamboo","id":418,"data":12},{"name":"minecraft:bamboo","id":418,"data":13},{"name":"minecraft:bamboo","id":418,"data":14},{"name":"minecraft:bamboo","id":418,"data":15},{"name":"minecraft:bamboo_sapling","id":419,"data":0},{"name":"minecraft:bamboo_sapling","id":419,"data":1},{"name":"minecraft:bamboo_sapling","id":419,"data":2},{"name":"minecraft:bamboo_sapling","id":419,"data":3},{"name":"minecraft:bamboo_sapling","id":419,"data":4},{"name":"minecraft:bamboo_sapling","id":419,"data":5},{"name":"minecraft:bamboo_sapling","id":419,"data":6},{"name":"minecraft:bamboo_sapling","id":419,"data":7},{"name":"minecraft:bamboo_sapling","id":419,"data":8},{"name":"minecraft:bamboo_sapling","id":419,"data":9},{"name":"minecraft:bamboo_sapling","id":419,"data":10},{"name":"minecraft:bamboo_sapling","id":419,"data":11},{"name":"minecraft:bamboo_sapling","id":419,"data":12},{"name":"minecraft:bamboo_sapling","id":419,"data":13},{"name":"minecraft:bamboo_sapling","id":419,"data":14},{"name":"minecraft:bamboo_sapling","id":419,"data":15},{"name":"minecraft:scaffolding","id":420,"data":0},{"name":"minecraft:scaffolding","id":420,"data":1},{"name":"minecraft:scaffolding","id":420,"data":2},{"name":"minecraft:scaffolding","id":420,"data":3},{"name":"minecraft:scaffolding","id":420,"data":4},{"name":"minecraft:scaffolding","id":420,"data":5},{"name":"minecraft:scaffolding","id":420,"data":6},{"name":"minecraft:scaffolding","id":420,"data":7},{"name":"minecraft:scaffolding","id":420,"data":8},{"name":"minecraft:scaffolding","id":420,"data":9},{"name":"minecraft:scaffolding","id":420,"data":10},{"name":"minecraft:scaffolding","id":420,"data":11},{"name":"minecraft:scaffolding","id":420,"data":12},{"name":"minecraft:scaffolding","id":420,"data":13},{"name":"minecraft:scaffolding","id":420,"data":14},{"name":"minecraft:scaffolding","id":420,"data":15},{"name":"minecraft:stone_slab4","id":421,"data":0},{"name":"minecraft:stone_slab4","id":421,"data":1},{"name":"minecraft:stone_slab4","id":421,"data":2},{"name":"minecraft:stone_slab4","id":421,"data":3},{"name":"minecraft:stone_slab4","id":421,"data":4},{"name":"minecraft:stone_slab4","id":421,"data":5},{"name":"minecraft:stone_slab4","id":421,"data":6},{"name":"minecraft:stone_slab4","id":421,"data":7},{"name":"minecraft:stone_slab4","id":421,"data":8},{"name":"minecraft:stone_slab4","id":421,"data":9},{"name":"minecraft:stone_slab4","id":421,"data":10},{"name":"minecraft:stone_slab4","id":421,"data":11},{"name":"minecraft:stone_slab4","id":421,"data":12},{"name":"minecraft:stone_slab4","id":421,"data":13},{"name":"minecraft:stone_slab4","id":421,"data":14},{"name":"minecraft:stone_slab4","id":421,"data":15},{"name":"minecraft:double_stone_slab3","id":422,"data":0},{"name":"minecraft:double_stone_slab3","id":422,"data":1},{"name":"minecraft:double_stone_slab3","id":422,"data":2},{"name":"minecraft:double_stone_slab3","id":422,"data":3},{"name":"minecraft:double_stone_slab3","id":422,"data":4},{"name":"minecraft:double_stone_slab3","id":422,"data":5},{"name":"minecraft:double_stone_slab3","id":422,"data":6},{"name":"minecraft:double_stone_slab3","id":422,"data":7},{"name":"minecraft:double_stone_slab3","id":422,"data":8},{"name":"minecraft:double_stone_slab3","id":422,"data":9},{"name":"minecraft:double_stone_slab3","id":422,"data":10},{"name":"minecraft:double_stone_slab3","id":422,"data":11},{"name":"minecraft:double_stone_slab3","id":422,"data":12},{"name":"minecraft:double_stone_slab3","id":422,"data":13},{"name":"minecraft:double_stone_slab3","id":422,"data":14},{"name":"minecraft:double_stone_slab3","id":422,"data":15},{"name":"minecraft:double_stone_slab4","id":423,"data":0},{"name":"minecraft:double_stone_slab4","id":423,"data":1},{"name":"minecraft:double_stone_slab4","id":423,"data":2},{"name":"minecraft:double_stone_slab4","id":423,"data":3},{"name":"minecraft:double_stone_slab4","id":423,"data":4},{"name":"minecraft:double_stone_slab4","id":423,"data":5},{"name":"minecraft:double_stone_slab4","id":423,"data":6},{"name":"minecraft:double_stone_slab4","id":423,"data":7},{"name":"minecraft:double_stone_slab4","id":423,"data":8},{"name":"minecraft:double_stone_slab4","id":423,"data":9},{"name":"minecraft:double_stone_slab4","id":423,"data":10},{"name":"minecraft:double_stone_slab4","id":423,"data":11},{"name":"minecraft:double_stone_slab4","id":423,"data":12},{"name":"minecraft:double_stone_slab4","id":423,"data":13},{"name":"minecraft:double_stone_slab4","id":423,"data":14},{"name":"minecraft:double_stone_slab4","id":423,"data":15},{"name":"minecraft:granite_stairs","id":424,"data":0},{"name":"minecraft:granite_stairs","id":424,"data":1},{"name":"minecraft:granite_stairs","id":424,"data":2},{"name":"minecraft:granite_stairs","id":424,"data":3},{"name":"minecraft:granite_stairs","id":424,"data":4},{"name":"minecraft:granite_stairs","id":424,"data":5},{"name":"minecraft:granite_stairs","id":424,"data":6},{"name":"minecraft:granite_stairs","id":424,"data":7},{"name":"minecraft:diorite_stairs","id":425,"data":0},{"name":"minecraft:diorite_stairs","id":425,"data":1},{"name":"minecraft:diorite_stairs","id":425,"data":2},{"name":"minecraft:diorite_stairs","id":425,"data":3},{"name":"minecraft:diorite_stairs","id":425,"data":4},{"name":"minecraft:diorite_stairs","id":425,"data":5},{"name":"minecraft:diorite_stairs","id":425,"data":6},{"name":"minecraft:diorite_stairs","id":425,"data":7},{"name":"minecraft:andesite_stairs","id":426,"data":0},{"name":"minecraft:andesite_stairs","id":426,"data":1},{"name":"minecraft:andesite_stairs","id":426,"data":2},{"name":"minecraft:andesite_stairs","id":426,"data":3},{"name":"minecraft:andesite_stairs","id":426,"data":4},{"name":"minecraft:andesite_stairs","id":426,"data":5},{"name":"minecraft:andesite_stairs","id":426,"data":6},{"name":"minecraft:andesite_stairs","id":426,"data":7},{"name":"minecraft:polished_granite_stairs","id":427,"data":0},{"name":"minecraft:polished_granite_stairs","id":427,"data":1},{"name":"minecraft:polished_granite_stairs","id":427,"data":2},{"name":"minecraft:polished_granite_stairs","id":427,"data":3},{"name":"minecraft:polished_granite_stairs","id":427,"data":4},{"name":"minecraft:polished_granite_stairs","id":427,"data":5},{"name":"minecraft:polished_granite_stairs","id":427,"data":6},{"name":"minecraft:polished_granite_stairs","id":427,"data":7},{"name":"minecraft:polished_diorite_stairs","id":428,"data":0},{"name":"minecraft:polished_diorite_stairs","id":428,"data":1},{"name":"minecraft:polished_diorite_stairs","id":428,"data":2},{"name":"minecraft:polished_diorite_stairs","id":428,"data":3},{"name":"minecraft:polished_diorite_stairs","id":428,"data":4},{"name":"minecraft:polished_diorite_stairs","id":428,"data":5},{"name":"minecraft:polished_diorite_stairs","id":428,"data":6},{"name":"minecraft:polished_diorite_stairs","id":428,"data":7},{"name":"minecraft:polished_andesite_stairs","id":429,"data":0},{"name":"minecraft:polished_andesite_stairs","id":429,"data":1},{"name":"minecraft:polished_andesite_stairs","id":429,"data":2},{"name":"minecraft:polished_andesite_stairs","id":429,"data":3},{"name":"minecraft:polished_andesite_stairs","id":429,"data":4},{"name":"minecraft:polished_andesite_stairs","id":429,"data":5},{"name":"minecraft:polished_andesite_stairs","id":429,"data":6},{"name":"minecraft:polished_andesite_stairs","id":429,"data":7},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":0},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":1},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":2},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":3},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":4},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":5},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":6},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":7},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":0},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":1},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":2},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":3},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":4},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":5},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":6},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":7},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":0},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":1},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":2},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":3},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":4},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":5},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":6},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":7},{"name":"minecraft:end_brick_stairs","id":433,"data":0},{"name":"minecraft:end_brick_stairs","id":433,"data":1},{"name":"minecraft:end_brick_stairs","id":433,"data":2},{"name":"minecraft:end_brick_stairs","id":433,"data":3},{"name":"minecraft:end_brick_stairs","id":433,"data":4},{"name":"minecraft:end_brick_stairs","id":433,"data":5},{"name":"minecraft:end_brick_stairs","id":433,"data":6},{"name":"minecraft:end_brick_stairs","id":433,"data":7},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":0},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":1},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":2},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":3},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":4},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":5},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":6},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":7},{"name":"minecraft:normal_stone_stairs","id":435,"data":0},{"name":"minecraft:normal_stone_stairs","id":435,"data":1},{"name":"minecraft:normal_stone_stairs","id":435,"data":2},{"name":"minecraft:normal_stone_stairs","id":435,"data":3},{"name":"minecraft:normal_stone_stairs","id":435,"data":4},{"name":"minecraft:normal_stone_stairs","id":435,"data":5},{"name":"minecraft:normal_stone_stairs","id":435,"data":6},{"name":"minecraft:normal_stone_stairs","id":435,"data":7},{"name":"minecraft:spruce_standing_sign","id":436,"data":0},{"name":"minecraft:spruce_standing_sign","id":436,"data":1},{"name":"minecraft:spruce_standing_sign","id":436,"data":2},{"name":"minecraft:spruce_standing_sign","id":436,"data":3},{"name":"minecraft:spruce_standing_sign","id":436,"data":4},{"name":"minecraft:spruce_standing_sign","id":436,"data":5},{"name":"minecraft:spruce_standing_sign","id":436,"data":6},{"name":"minecraft:spruce_standing_sign","id":436,"data":7},{"name":"minecraft:spruce_standing_sign","id":436,"data":8},{"name":"minecraft:spruce_standing_sign","id":436,"data":9},{"name":"minecraft:spruce_standing_sign","id":436,"data":10},{"name":"minecraft:spruce_standing_sign","id":436,"data":11},{"name":"minecraft:spruce_standing_sign","id":436,"data":12},{"name":"minecraft:spruce_standing_sign","id":436,"data":13},{"name":"minecraft:spruce_standing_sign","id":436,"data":14},{"name":"minecraft:spruce_standing_sign","id":436,"data":15},{"name":"minecraft:spruce_wall_sign","id":437,"data":0},{"name":"minecraft:spruce_wall_sign","id":437,"data":1},{"name":"minecraft:spruce_wall_sign","id":437,"data":2},{"name":"minecraft:spruce_wall_sign","id":437,"data":3},{"name":"minecraft:spruce_wall_sign","id":437,"data":4},{"name":"minecraft:spruce_wall_sign","id":437,"data":5},{"name":"minecraft:spruce_wall_sign","id":437,"data":6},{"name":"minecraft:spruce_wall_sign","id":437,"data":7},{"name":"minecraft:smooth_stone","id":438,"data":0},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":0},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":1},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":2},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":3},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":4},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":5},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":6},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":7},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":0},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":1},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":2},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":3},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":4},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":5},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":6},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":7},{"name":"minecraft:birch_standing_sign","id":441,"data":0},{"name":"minecraft:birch_standing_sign","id":441,"data":1},{"name":"minecraft:birch_standing_sign","id":441,"data":2},{"name":"minecraft:birch_standing_sign","id":441,"data":3},{"name":"minecraft:birch_standing_sign","id":441,"data":4},{"name":"minecraft:birch_standing_sign","id":441,"data":5},{"name":"minecraft:birch_standing_sign","id":441,"data":6},{"name":"minecraft:birch_standing_sign","id":441,"data":7},{"name":"minecraft:birch_standing_sign","id":441,"data":8},{"name":"minecraft:birch_standing_sign","id":441,"data":9},{"name":"minecraft:birch_standing_sign","id":441,"data":10},{"name":"minecraft:birch_standing_sign","id":441,"data":11},{"name":"minecraft:birch_standing_sign","id":441,"data":12},{"name":"minecraft:birch_standing_sign","id":441,"data":13},{"name":"minecraft:birch_standing_sign","id":441,"data":14},{"name":"minecraft:birch_standing_sign","id":441,"data":15},{"name":"minecraft:birch_wall_sign","id":442,"data":0},{"name":"minecraft:birch_wall_sign","id":442,"data":1},{"name":"minecraft:birch_wall_sign","id":442,"data":2},{"name":"minecraft:birch_wall_sign","id":442,"data":3},{"name":"minecraft:birch_wall_sign","id":442,"data":4},{"name":"minecraft:birch_wall_sign","id":442,"data":5},{"name":"minecraft:birch_wall_sign","id":442,"data":6},{"name":"minecraft:birch_wall_sign","id":442,"data":7},{"name":"minecraft:jungle_standing_sign","id":443,"data":0},{"name":"minecraft:jungle_standing_sign","id":443,"data":1},{"name":"minecraft:jungle_standing_sign","id":443,"data":2},{"name":"minecraft:jungle_standing_sign","id":443,"data":3},{"name":"minecraft:jungle_standing_sign","id":443,"data":4},{"name":"minecraft:jungle_standing_sign","id":443,"data":5},{"name":"minecraft:jungle_standing_sign","id":443,"data":6},{"name":"minecraft:jungle_standing_sign","id":443,"data":7},{"name":"minecraft:jungle_standing_sign","id":443,"data":8},{"name":"minecraft:jungle_standing_sign","id":443,"data":9},{"name":"minecraft:jungle_standing_sign","id":443,"data":10},{"name":"minecraft:jungle_standing_sign","id":443,"data":11},{"name":"minecraft:jungle_standing_sign","id":443,"data":12},{"name":"minecraft:jungle_standing_sign","id":443,"data":13},{"name":"minecraft:jungle_standing_sign","id":443,"data":14},{"name":"minecraft:jungle_standing_sign","id":443,"data":15},{"name":"minecraft:jungle_wall_sign","id":444,"data":0},{"name":"minecraft:jungle_wall_sign","id":444,"data":1},{"name":"minecraft:jungle_wall_sign","id":444,"data":2},{"name":"minecraft:jungle_wall_sign","id":444,"data":3},{"name":"minecraft:jungle_wall_sign","id":444,"data":4},{"name":"minecraft:jungle_wall_sign","id":444,"data":5},{"name":"minecraft:jungle_wall_sign","id":444,"data":6},{"name":"minecraft:jungle_wall_sign","id":444,"data":7},{"name":"minecraft:acacia_standing_sign","id":445,"data":0},{"name":"minecraft:acacia_standing_sign","id":445,"data":1},{"name":"minecraft:acacia_standing_sign","id":445,"data":2},{"name":"minecraft:acacia_standing_sign","id":445,"data":3},{"name":"minecraft:acacia_standing_sign","id":445,"data":4},{"name":"minecraft:acacia_standing_sign","id":445,"data":5},{"name":"minecraft:acacia_standing_sign","id":445,"data":6},{"name":"minecraft:acacia_standing_sign","id":445,"data":7},{"name":"minecraft:acacia_standing_sign","id":445,"data":8},{"name":"minecraft:acacia_standing_sign","id":445,"data":9},{"name":"minecraft:acacia_standing_sign","id":445,"data":10},{"name":"minecraft:acacia_standing_sign","id":445,"data":11},{"name":"minecraft:acacia_standing_sign","id":445,"data":12},{"name":"minecraft:acacia_standing_sign","id":445,"data":13},{"name":"minecraft:acacia_standing_sign","id":445,"data":14},{"name":"minecraft:acacia_standing_sign","id":445,"data":15},{"name":"minecraft:acacia_wall_sign","id":446,"data":0},{"name":"minecraft:acacia_wall_sign","id":446,"data":1},{"name":"minecraft:acacia_wall_sign","id":446,"data":2},{"name":"minecraft:acacia_wall_sign","id":446,"data":3},{"name":"minecraft:acacia_wall_sign","id":446,"data":4},{"name":"minecraft:acacia_wall_sign","id":446,"data":5},{"name":"minecraft:acacia_wall_sign","id":446,"data":6},{"name":"minecraft:acacia_wall_sign","id":446,"data":7},{"name":"minecraft:darkoak_standing_sign","id":447,"data":0},{"name":"minecraft:darkoak_standing_sign","id":447,"data":1},{"name":"minecraft:darkoak_standing_sign","id":447,"data":2},{"name":"minecraft:darkoak_standing_sign","id":447,"data":3},{"name":"minecraft:darkoak_standing_sign","id":447,"data":4},{"name":"minecraft:darkoak_standing_sign","id":447,"data":5},{"name":"minecraft:darkoak_standing_sign","id":447,"data":6},{"name":"minecraft:darkoak_standing_sign","id":447,"data":7},{"name":"minecraft:darkoak_standing_sign","id":447,"data":8},{"name":"minecraft:darkoak_standing_sign","id":447,"data":9},{"name":"minecraft:darkoak_standing_sign","id":447,"data":10},{"name":"minecraft:darkoak_standing_sign","id":447,"data":11},{"name":"minecraft:darkoak_standing_sign","id":447,"data":12},{"name":"minecraft:darkoak_standing_sign","id":447,"data":13},{"name":"minecraft:darkoak_standing_sign","id":447,"data":14},{"name":"minecraft:darkoak_standing_sign","id":447,"data":15},{"name":"minecraft:darkoak_wall_sign","id":448,"data":0},{"name":"minecraft:darkoak_wall_sign","id":448,"data":1},{"name":"minecraft:darkoak_wall_sign","id":448,"data":2},{"name":"minecraft:darkoak_wall_sign","id":448,"data":3},{"name":"minecraft:darkoak_wall_sign","id":448,"data":4},{"name":"minecraft:darkoak_wall_sign","id":448,"data":5},{"name":"minecraft:darkoak_wall_sign","id":448,"data":6},{"name":"minecraft:darkoak_wall_sign","id":448,"data":7},{"name":"minecraft:lectern","id":449,"data":0},{"name":"minecraft:lectern","id":449,"data":1},{"name":"minecraft:lectern","id":449,"data":2},{"name":"minecraft:lectern","id":449,"data":3},{"name":"minecraft:grindstone","id":450,"data":0},{"name":"minecraft:grindstone","id":450,"data":1},{"name":"minecraft:grindstone","id":450,"data":2},{"name":"minecraft:grindstone","id":450,"data":3},{"name":"minecraft:grindstone","id":450,"data":4},{"name":"minecraft:grindstone","id":450,"data":5},{"name":"minecraft:grindstone","id":450,"data":6},{"name":"minecraft:grindstone","id":450,"data":7},{"name":"minecraft:grindstone","id":450,"data":8},{"name":"minecraft:grindstone","id":450,"data":9},{"name":"minecraft:grindstone","id":450,"data":10},{"name":"minecraft:grindstone","id":450,"data":11},{"name":"minecraft:grindstone","id":450,"data":12},{"name":"minecraft:grindstone","id":450,"data":13},{"name":"minecraft:grindstone","id":450,"data":14},{"name":"minecraft:grindstone","id":450,"data":15},{"name":"minecraft:blast_furnace","id":451,"data":0},{"name":"minecraft:blast_furnace","id":451,"data":1},{"name":"minecraft:blast_furnace","id":451,"data":2},{"name":"minecraft:blast_furnace","id":451,"data":3},{"name":"minecraft:stonecutter_block","id":452,"data":0},{"name":"minecraft:stonecutter_block","id":452,"data":1},{"name":"minecraft:stonecutter_block","id":452,"data":2},{"name":"minecraft:stonecutter_block","id":452,"data":3},{"name":"minecraft:stonecutter_block","id":452,"data":4},{"name":"minecraft:stonecutter_block","id":452,"data":5},{"name":"minecraft:stonecutter_block","id":452,"data":6},{"name":"minecraft:stonecutter_block","id":452,"data":7},{"name":"minecraft:smoker","id":453,"data":0},{"name":"minecraft:smoker","id":453,"data":1},{"name":"minecraft:smoker","id":453,"data":2},{"name":"minecraft:smoker","id":453,"data":3},{"name":"minecraft:cartography_table","id":455,"data":0},{"name":"minecraft:fletching_table","id":456,"data":0},{"name":"minecraft:smithing_table","id":457,"data":0},{"name":"minecraft:barrel","id":458,"data":0},{"name":"minecraft:barrel","id":458,"data":1},{"name":"minecraft:barrel","id":458,"data":2},{"name":"minecraft:barrel","id":458,"data":3},{"name":"minecraft:barrel","id":458,"data":4},{"name":"minecraft:barrel","id":458,"data":5},{"name":"minecraft:barrel","id":458,"data":6},{"name":"minecraft:barrel","id":458,"data":7},{"name":"minecraft:loom","id":459,"data":0},{"name":"minecraft:loom","id":459,"data":1},{"name":"minecraft:loom","id":459,"data":2},{"name":"minecraft:loom","id":459,"data":3},{"name":"minecraft:bell","id":461,"data":0},{"name":"minecraft:bell","id":461,"data":1},{"name":"minecraft:bell","id":461,"data":2},{"name":"minecraft:bell","id":461,"data":3},{"name":"minecraft:bell","id":461,"data":4},{"name":"minecraft:bell","id":461,"data":5},{"name":"minecraft:bell","id":461,"data":6},{"name":"minecraft:bell","id":461,"data":7},{"name":"minecraft:bell","id":461,"data":8},{"name":"minecraft:bell","id":461,"data":9},{"name":"minecraft:bell","id":461,"data":10},{"name":"minecraft:bell","id":461,"data":11},{"name":"minecraft:bell","id":461,"data":12},{"name":"minecraft:bell","id":461,"data":13},{"name":"minecraft:bell","id":461,"data":14},{"name":"minecraft:bell","id":461,"data":15},{"name":"minecraft:sweet_berry_bush","id":462,"data":0},{"name":"minecraft:sweet_berry_bush","id":462,"data":1},{"name":"minecraft:sweet_berry_bush","id":462,"data":2},{"name":"minecraft:sweet_berry_bush","id":462,"data":3},{"name":"minecraft:sweet_berry_bush","id":462,"data":4},{"name":"minecraft:sweet_berry_bush","id":462,"data":5},{"name":"minecraft:sweet_berry_bush","id":462,"data":6},{"name":"minecraft:sweet_berry_bush","id":462,"data":7},{"name":"minecraft:lantern","id":463,"data":0},{"name":"minecraft:lantern","id":463,"data":1},{"name":"minecraft:campfire","id":464,"data":0},{"name":"minecraft:lava_cauldron","id":465,"data":0},{"name":"minecraft:lava_cauldron","id":465,"data":1},{"name":"minecraft:lava_cauldron","id":465,"data":2},{"name":"minecraft:lava_cauldron","id":465,"data":3},{"name":"minecraft:lava_cauldron","id":465,"data":4},{"name":"minecraft:lava_cauldron","id":465,"data":5},{"name":"minecraft:lava_cauldron","id":465,"data":6},{"name":"minecraft:lava_cauldron","id":465,"data":7},{"name":"minecraft:lava_cauldron","id":465,"data":8},{"name":"minecraft:lava_cauldron","id":465,"data":9},{"name":"minecraft:lava_cauldron","id":465,"data":10},{"name":"minecraft:lava_cauldron","id":465,"data":11},{"name":"minecraft:lava_cauldron","id":465,"data":12},{"name":"minecraft:lava_cauldron","id":465,"data":13},{"name":"minecraft:lava_cauldron","id":465,"data":14},{"name":"minecraft:lava_cauldron","id":465,"data":15},{"name":"minecraft:jigsaw","id":466,"data":0},{"name":"minecraft:jigsaw","id":466,"data":1},{"name":"minecraft:jigsaw","id":466,"data":2},{"name":"minecraft:jigsaw","id":466,"data":3},{"name":"minecraft:jigsaw","id":466,"data":4},{"name":"minecraft:jigsaw","id":466,"data":5},{"name":"minecraft:jigsaw","id":466,"data":6},{"name":"minecraft:jigsaw","id":466,"data":7},{"name":"minecraft:wood","id":467,"data":0},{"name":"minecraft:wood","id":467,"data":1},{"name":"minecraft:wood","id":467,"data":2},{"name":"minecraft:wood","id":467,"data":3},{"name":"minecraft:wood","id":467,"data":4},{"name":"minecraft:wood","id":467,"data":5},{"name":"minecraft:wood","id":467,"data":6},{"name":"minecraft:wood","id":467,"data":7},{"name":"minecraft:wood","id":467,"data":8},{"name":"minecraft:wood","id":467,"data":9},{"name":"minecraft:wood","id":467,"data":10},{"name":"minecraft:wood","id":467,"data":11},{"name":"minecraft:wood","id":467,"data":12},{"name":"minecraft:wood","id":467,"data":13},{"name":"minecraft:wood","id":467,"data":14},{"name":"minecraft:wood","id":467,"data":15},{"name":"minecraft:composter","id":468,"data":0},{"name":"minecraft:composter","id":468,"data":1},{"name":"minecraft:composter","id":468,"data":2},{"name":"minecraft:composter","id":468,"data":3},{"name":"minecraft:composter","id":468,"data":4},{"name":"minecraft:composter","id":468,"data":5},{"name":"minecraft:composter","id":468,"data":6},{"name":"minecraft:composter","id":468,"data":7}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_354.json b/src/main/resources/runtimeid_table_354.json deleted file mode 100644 index f2ca6b522..000000000 --- a/src/main/resources/runtimeid_table_354.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"minecraft:air","id":0,"data":0},{"name":"minecraft:stone","id":1,"data":0},{"name":"minecraft:stone","id":1,"data":1},{"name":"minecraft:stone","id":1,"data":2},{"name":"minecraft:stone","id":1,"data":3},{"name":"minecraft:stone","id":1,"data":4},{"name":"minecraft:stone","id":1,"data":5},{"name":"minecraft:stone","id":1,"data":6},{"name":"minecraft:stone","id":1,"data":7},{"name":"minecraft:grass","id":2,"data":0},{"name":"minecraft:dirt","id":3,"data":0},{"name":"minecraft:dirt","id":3,"data":1},{"name":"minecraft:cobblestone","id":4,"data":0},{"name":"minecraft:planks","id":5,"data":0},{"name":"minecraft:planks","id":5,"data":1},{"name":"minecraft:planks","id":5,"data":2},{"name":"minecraft:planks","id":5,"data":3},{"name":"minecraft:planks","id":5,"data":4},{"name":"minecraft:planks","id":5,"data":5},{"name":"minecraft:planks","id":5,"data":6},{"name":"minecraft:planks","id":5,"data":7},{"name":"minecraft:sapling","id":6,"data":0},{"name":"minecraft:sapling","id":6,"data":1},{"name":"minecraft:sapling","id":6,"data":2},{"name":"minecraft:sapling","id":6,"data":3},{"name":"minecraft:sapling","id":6,"data":4},{"name":"minecraft:sapling","id":6,"data":5},{"name":"minecraft:sapling","id":6,"data":6},{"name":"minecraft:sapling","id":6,"data":7},{"name":"minecraft:sapling","id":6,"data":8},{"name":"minecraft:sapling","id":6,"data":9},{"name":"minecraft:sapling","id":6,"data":10},{"name":"minecraft:sapling","id":6,"data":11},{"name":"minecraft:sapling","id":6,"data":12},{"name":"minecraft:sapling","id":6,"data":13},{"name":"minecraft:sapling","id":6,"data":14},{"name":"minecraft:sapling","id":6,"data":15},{"name":"minecraft:bedrock","id":7,"data":0},{"name":"minecraft:bedrock","id":7,"data":1},{"name":"minecraft:flowing_water","id":8,"data":0},{"name":"minecraft:flowing_water","id":8,"data":1},{"name":"minecraft:flowing_water","id":8,"data":2},{"name":"minecraft:flowing_water","id":8,"data":3},{"name":"minecraft:flowing_water","id":8,"data":4},{"name":"minecraft:flowing_water","id":8,"data":5},{"name":"minecraft:flowing_water","id":8,"data":6},{"name":"minecraft:flowing_water","id":8,"data":7},{"name":"minecraft:flowing_water","id":8,"data":8},{"name":"minecraft:flowing_water","id":8,"data":9},{"name":"minecraft:flowing_water","id":8,"data":10},{"name":"minecraft:flowing_water","id":8,"data":11},{"name":"minecraft:flowing_water","id":8,"data":12},{"name":"minecraft:flowing_water","id":8,"data":13},{"name":"minecraft:flowing_water","id":8,"data":14},{"name":"minecraft:flowing_water","id":8,"data":15},{"name":"minecraft:water","id":9,"data":0},{"name":"minecraft:water","id":9,"data":1},{"name":"minecraft:water","id":9,"data":2},{"name":"minecraft:water","id":9,"data":3},{"name":"minecraft:water","id":9,"data":4},{"name":"minecraft:water","id":9,"data":5},{"name":"minecraft:water","id":9,"data":6},{"name":"minecraft:water","id":9,"data":7},{"name":"minecraft:water","id":9,"data":8},{"name":"minecraft:water","id":9,"data":9},{"name":"minecraft:water","id":9,"data":10},{"name":"minecraft:water","id":9,"data":11},{"name":"minecraft:water","id":9,"data":12},{"name":"minecraft:water","id":9,"data":13},{"name":"minecraft:water","id":9,"data":14},{"name":"minecraft:water","id":9,"data":15},{"name":"minecraft:flowing_lava","id":10,"data":0},{"name":"minecraft:flowing_lava","id":10,"data":1},{"name":"minecraft:flowing_lava","id":10,"data":2},{"name":"minecraft:flowing_lava","id":10,"data":3},{"name":"minecraft:flowing_lava","id":10,"data":4},{"name":"minecraft:flowing_lava","id":10,"data":5},{"name":"minecraft:flowing_lava","id":10,"data":6},{"name":"minecraft:flowing_lava","id":10,"data":7},{"name":"minecraft:flowing_lava","id":10,"data":8},{"name":"minecraft:flowing_lava","id":10,"data":9},{"name":"minecraft:flowing_lava","id":10,"data":10},{"name":"minecraft:flowing_lava","id":10,"data":11},{"name":"minecraft:flowing_lava","id":10,"data":12},{"name":"minecraft:flowing_lava","id":10,"data":13},{"name":"minecraft:flowing_lava","id":10,"data":14},{"name":"minecraft:flowing_lava","id":10,"data":15},{"name":"minecraft:lava","id":11,"data":0},{"name":"minecraft:lava","id":11,"data":1},{"name":"minecraft:lava","id":11,"data":2},{"name":"minecraft:lava","id":11,"data":3},{"name":"minecraft:lava","id":11,"data":4},{"name":"minecraft:lava","id":11,"data":5},{"name":"minecraft:lava","id":11,"data":6},{"name":"minecraft:lava","id":11,"data":7},{"name":"minecraft:lava","id":11,"data":8},{"name":"minecraft:lava","id":11,"data":9},{"name":"minecraft:lava","id":11,"data":10},{"name":"minecraft:lava","id":11,"data":11},{"name":"minecraft:lava","id":11,"data":12},{"name":"minecraft:lava","id":11,"data":13},{"name":"minecraft:lava","id":11,"data":14},{"name":"minecraft:lava","id":11,"data":15},{"name":"minecraft:sand","id":12,"data":0},{"name":"minecraft:sand","id":12,"data":1},{"name":"minecraft:gravel","id":13,"data":0},{"name":"minecraft:gold_ore","id":14,"data":0},{"name":"minecraft:iron_ore","id":15,"data":0},{"name":"minecraft:coal_ore","id":16,"data":0},{"name":"minecraft:log","id":17,"data":0},{"name":"minecraft:log","id":17,"data":1},{"name":"minecraft:log","id":17,"data":2},{"name":"minecraft:log","id":17,"data":3},{"name":"minecraft:log","id":17,"data":4},{"name":"minecraft:log","id":17,"data":5},{"name":"minecraft:log","id":17,"data":6},{"name":"minecraft:log","id":17,"data":7},{"name":"minecraft:log","id":17,"data":8},{"name":"minecraft:log","id":17,"data":9},{"name":"minecraft:log","id":17,"data":10},{"name":"minecraft:log","id":17,"data":11},{"name":"minecraft:log","id":17,"data":12},{"name":"minecraft:log","id":17,"data":13},{"name":"minecraft:log","id":17,"data":14},{"name":"minecraft:log","id":17,"data":15},{"name":"minecraft:leaves","id":18,"data":0},{"name":"minecraft:leaves","id":18,"data":1},{"name":"minecraft:leaves","id":18,"data":2},{"name":"minecraft:leaves","id":18,"data":3},{"name":"minecraft:leaves","id":18,"data":4},{"name":"minecraft:leaves","id":18,"data":5},{"name":"minecraft:leaves","id":18,"data":6},{"name":"minecraft:leaves","id":18,"data":7},{"name":"minecraft:leaves","id":18,"data":8},{"name":"minecraft:leaves","id":18,"data":9},{"name":"minecraft:leaves","id":18,"data":10},{"name":"minecraft:leaves","id":18,"data":11},{"name":"minecraft:leaves","id":18,"data":12},{"name":"minecraft:leaves","id":18,"data":13},{"name":"minecraft:leaves","id":18,"data":14},{"name":"minecraft:leaves","id":18,"data":15},{"name":"minecraft:sponge","id":19,"data":0},{"name":"minecraft:sponge","id":19,"data":1},{"name":"minecraft:glass","id":20,"data":0},{"name":"minecraft:lapis_ore","id":21,"data":0},{"name":"minecraft:lapis_block","id":22,"data":0},{"name":"minecraft:dispenser","id":23,"data":0},{"name":"minecraft:dispenser","id":23,"data":1},{"name":"minecraft:dispenser","id":23,"data":2},{"name":"minecraft:dispenser","id":23,"data":3},{"name":"minecraft:dispenser","id":23,"data":4},{"name":"minecraft:dispenser","id":23,"data":5},{"name":"minecraft:dispenser","id":23,"data":6},{"name":"minecraft:dispenser","id":23,"data":7},{"name":"minecraft:dispenser","id":23,"data":8},{"name":"minecraft:dispenser","id":23,"data":9},{"name":"minecraft:dispenser","id":23,"data":10},{"name":"minecraft:dispenser","id":23,"data":11},{"name":"minecraft:dispenser","id":23,"data":12},{"name":"minecraft:dispenser","id":23,"data":13},{"name":"minecraft:dispenser","id":23,"data":14},{"name":"minecraft:dispenser","id":23,"data":15},{"name":"minecraft:sandstone","id":24,"data":0},{"name":"minecraft:sandstone","id":24,"data":1},{"name":"minecraft:sandstone","id":24,"data":2},{"name":"minecraft:sandstone","id":24,"data":3},{"name":"minecraft:noteblock","id":25,"data":0},{"name":"minecraft:bed","id":26,"data":0},{"name":"minecraft:bed","id":26,"data":1},{"name":"minecraft:bed","id":26,"data":2},{"name":"minecraft:bed","id":26,"data":3},{"name":"minecraft:bed","id":26,"data":4},{"name":"minecraft:bed","id":26,"data":5},{"name":"minecraft:bed","id":26,"data":6},{"name":"minecraft:bed","id":26,"data":7},{"name":"minecraft:bed","id":26,"data":8},{"name":"minecraft:bed","id":26,"data":9},{"name":"minecraft:bed","id":26,"data":10},{"name":"minecraft:bed","id":26,"data":11},{"name":"minecraft:bed","id":26,"data":12},{"name":"minecraft:bed","id":26,"data":13},{"name":"minecraft:bed","id":26,"data":14},{"name":"minecraft:bed","id":26,"data":15},{"name":"minecraft:golden_rail","id":27,"data":0},{"name":"minecraft:golden_rail","id":27,"data":1},{"name":"minecraft:golden_rail","id":27,"data":2},{"name":"minecraft:golden_rail","id":27,"data":3},{"name":"minecraft:golden_rail","id":27,"data":4},{"name":"minecraft:golden_rail","id":27,"data":5},{"name":"minecraft:golden_rail","id":27,"data":6},{"name":"minecraft:golden_rail","id":27,"data":7},{"name":"minecraft:golden_rail","id":27,"data":8},{"name":"minecraft:golden_rail","id":27,"data":9},{"name":"minecraft:golden_rail","id":27,"data":10},{"name":"minecraft:golden_rail","id":27,"data":11},{"name":"minecraft:golden_rail","id":27,"data":12},{"name":"minecraft:golden_rail","id":27,"data":13},{"name":"minecraft:golden_rail","id":27,"data":14},{"name":"minecraft:golden_rail","id":27,"data":15},{"name":"minecraft:detector_rail","id":28,"data":0},{"name":"minecraft:detector_rail","id":28,"data":1},{"name":"minecraft:detector_rail","id":28,"data":2},{"name":"minecraft:detector_rail","id":28,"data":3},{"name":"minecraft:detector_rail","id":28,"data":4},{"name":"minecraft:detector_rail","id":28,"data":5},{"name":"minecraft:detector_rail","id":28,"data":6},{"name":"minecraft:detector_rail","id":28,"data":7},{"name":"minecraft:detector_rail","id":28,"data":8},{"name":"minecraft:detector_rail","id":28,"data":9},{"name":"minecraft:detector_rail","id":28,"data":10},{"name":"minecraft:detector_rail","id":28,"data":11},{"name":"minecraft:detector_rail","id":28,"data":12},{"name":"minecraft:detector_rail","id":28,"data":13},{"name":"minecraft:detector_rail","id":28,"data":14},{"name":"minecraft:detector_rail","id":28,"data":15},{"name":"minecraft:sticky_piston","id":29,"data":0},{"name":"minecraft:sticky_piston","id":29,"data":1},{"name":"minecraft:sticky_piston","id":29,"data":2},{"name":"minecraft:sticky_piston","id":29,"data":3},{"name":"minecraft:sticky_piston","id":29,"data":4},{"name":"minecraft:sticky_piston","id":29,"data":5},{"name":"minecraft:sticky_piston","id":29,"data":6},{"name":"minecraft:sticky_piston","id":29,"data":7},{"name":"minecraft:web","id":30,"data":0},{"name":"minecraft:tallgrass","id":31,"data":0},{"name":"minecraft:tallgrass","id":31,"data":1},{"name":"minecraft:tallgrass","id":31,"data":2},{"name":"minecraft:tallgrass","id":31,"data":3},{"name":"minecraft:deadbush","id":32,"data":0},{"name":"minecraft:piston","id":33,"data":0},{"name":"minecraft:piston","id":33,"data":1},{"name":"minecraft:piston","id":33,"data":2},{"name":"minecraft:piston","id":33,"data":3},{"name":"minecraft:piston","id":33,"data":4},{"name":"minecraft:piston","id":33,"data":5},{"name":"minecraft:piston","id":33,"data":6},{"name":"minecraft:piston","id":33,"data":7},{"name":"minecraft:pistonArmCollision","id":34,"data":0},{"name":"minecraft:pistonArmCollision","id":34,"data":1},{"name":"minecraft:pistonArmCollision","id":34,"data":2},{"name":"minecraft:pistonArmCollision","id":34,"data":3},{"name":"minecraft:pistonArmCollision","id":34,"data":4},{"name":"minecraft:pistonArmCollision","id":34,"data":5},{"name":"minecraft:pistonArmCollision","id":34,"data":6},{"name":"minecraft:pistonArmCollision","id":34,"data":7},{"name":"minecraft:wool","id":35,"data":0},{"name":"minecraft:wool","id":35,"data":1},{"name":"minecraft:wool","id":35,"data":2},{"name":"minecraft:wool","id":35,"data":3},{"name":"minecraft:wool","id":35,"data":4},{"name":"minecraft:wool","id":35,"data":5},{"name":"minecraft:wool","id":35,"data":6},{"name":"minecraft:wool","id":35,"data":7},{"name":"minecraft:wool","id":35,"data":8},{"name":"minecraft:wool","id":35,"data":9},{"name":"minecraft:wool","id":35,"data":10},{"name":"minecraft:wool","id":35,"data":11},{"name":"minecraft:wool","id":35,"data":12},{"name":"minecraft:wool","id":35,"data":13},{"name":"minecraft:wool","id":35,"data":14},{"name":"minecraft:wool","id":35,"data":15},{"name":"minecraft:element_0","id":36,"data":0},{"name":"minecraft:yellow_flower","id":37,"data":0},{"name":"minecraft:red_flower","id":38,"data":0},{"name":"minecraft:red_flower","id":38,"data":1},{"name":"minecraft:red_flower","id":38,"data":2},{"name":"minecraft:red_flower","id":38,"data":3},{"name":"minecraft:red_flower","id":38,"data":4},{"name":"minecraft:red_flower","id":38,"data":5},{"name":"minecraft:red_flower","id":38,"data":6},{"name":"minecraft:red_flower","id":38,"data":7},{"name":"minecraft:red_flower","id":38,"data":8},{"name":"minecraft:red_flower","id":38,"data":9},{"name":"minecraft:red_flower","id":38,"data":10},{"name":"minecraft:red_flower","id":38,"data":11},{"name":"minecraft:red_flower","id":38,"data":12},{"name":"minecraft:red_flower","id":38,"data":13},{"name":"minecraft:red_flower","id":38,"data":14},{"name":"minecraft:red_flower","id":38,"data":15},{"name":"minecraft:brown_mushroom","id":39,"data":0},{"name":"minecraft:red_mushroom","id":40,"data":0},{"name":"minecraft:gold_block","id":41,"data":0},{"name":"minecraft:iron_block","id":42,"data":0},{"name":"minecraft:double_stone_slab","id":43,"data":0},{"name":"minecraft:double_stone_slab","id":43,"data":1},{"name":"minecraft:double_stone_slab","id":43,"data":2},{"name":"minecraft:double_stone_slab","id":43,"data":3},{"name":"minecraft:double_stone_slab","id":43,"data":4},{"name":"minecraft:double_stone_slab","id":43,"data":5},{"name":"minecraft:double_stone_slab","id":43,"data":6},{"name":"minecraft:double_stone_slab","id":43,"data":7},{"name":"minecraft:double_stone_slab","id":43,"data":8},{"name":"minecraft:double_stone_slab","id":43,"data":9},{"name":"minecraft:double_stone_slab","id":43,"data":10},{"name":"minecraft:double_stone_slab","id":43,"data":11},{"name":"minecraft:double_stone_slab","id":43,"data":12},{"name":"minecraft:double_stone_slab","id":43,"data":13},{"name":"minecraft:double_stone_slab","id":43,"data":14},{"name":"minecraft:double_stone_slab","id":43,"data":15},{"name":"minecraft:stone_slab","id":44,"data":0},{"name":"minecraft:stone_slab","id":44,"data":1},{"name":"minecraft:stone_slab","id":44,"data":2},{"name":"minecraft:stone_slab","id":44,"data":3},{"name":"minecraft:stone_slab","id":44,"data":4},{"name":"minecraft:stone_slab","id":44,"data":5},{"name":"minecraft:stone_slab","id":44,"data":6},{"name":"minecraft:stone_slab","id":44,"data":7},{"name":"minecraft:stone_slab","id":44,"data":8},{"name":"minecraft:stone_slab","id":44,"data":9},{"name":"minecraft:stone_slab","id":44,"data":10},{"name":"minecraft:stone_slab","id":44,"data":11},{"name":"minecraft:stone_slab","id":44,"data":12},{"name":"minecraft:stone_slab","id":44,"data":13},{"name":"minecraft:stone_slab","id":44,"data":14},{"name":"minecraft:stone_slab","id":44,"data":15},{"name":"minecraft:brick_block","id":45,"data":0},{"name":"minecraft:tnt","id":46,"data":0},{"name":"minecraft:tnt","id":46,"data":1},{"name":"minecraft:tnt","id":46,"data":2},{"name":"minecraft:tnt","id":46,"data":3},{"name":"minecraft:bookshelf","id":47,"data":0},{"name":"minecraft:mossy_cobblestone","id":48,"data":0},{"name":"minecraft:obsidian","id":49,"data":0},{"name":"minecraft:torch","id":50,"data":0},{"name":"minecraft:torch","id":50,"data":1},{"name":"minecraft:torch","id":50,"data":2},{"name":"minecraft:torch","id":50,"data":3},{"name":"minecraft:torch","id":50,"data":4},{"name":"minecraft:torch","id":50,"data":5},{"name":"minecraft:torch","id":50,"data":6},{"name":"minecraft:torch","id":50,"data":7},{"name":"minecraft:fire","id":51,"data":0},{"name":"minecraft:fire","id":51,"data":1},{"name":"minecraft:fire","id":51,"data":2},{"name":"minecraft:fire","id":51,"data":3},{"name":"minecraft:fire","id":51,"data":4},{"name":"minecraft:fire","id":51,"data":5},{"name":"minecraft:fire","id":51,"data":6},{"name":"minecraft:fire","id":51,"data":7},{"name":"minecraft:fire","id":51,"data":8},{"name":"minecraft:fire","id":51,"data":9},{"name":"minecraft:fire","id":51,"data":10},{"name":"minecraft:fire","id":51,"data":11},{"name":"minecraft:fire","id":51,"data":12},{"name":"minecraft:fire","id":51,"data":13},{"name":"minecraft:fire","id":51,"data":14},{"name":"minecraft:fire","id":51,"data":15},{"name":"minecraft:mob_spawner","id":52,"data":0},{"name":"minecraft:oak_stairs","id":53,"data":0},{"name":"minecraft:oak_stairs","id":53,"data":1},{"name":"minecraft:oak_stairs","id":53,"data":2},{"name":"minecraft:oak_stairs","id":53,"data":3},{"name":"minecraft:oak_stairs","id":53,"data":4},{"name":"minecraft:oak_stairs","id":53,"data":5},{"name":"minecraft:oak_stairs","id":53,"data":6},{"name":"minecraft:oak_stairs","id":53,"data":7},{"name":"minecraft:chest","id":54,"data":0},{"name":"minecraft:chest","id":54,"data":1},{"name":"minecraft:chest","id":54,"data":2},{"name":"minecraft:chest","id":54,"data":3},{"name":"minecraft:chest","id":54,"data":4},{"name":"minecraft:chest","id":54,"data":5},{"name":"minecraft:chest","id":54,"data":6},{"name":"minecraft:chest","id":54,"data":7},{"name":"minecraft:redstone_wire","id":55,"data":0},{"name":"minecraft:redstone_wire","id":55,"data":1},{"name":"minecraft:redstone_wire","id":55,"data":2},{"name":"minecraft:redstone_wire","id":55,"data":3},{"name":"minecraft:redstone_wire","id":55,"data":4},{"name":"minecraft:redstone_wire","id":55,"data":5},{"name":"minecraft:redstone_wire","id":55,"data":6},{"name":"minecraft:redstone_wire","id":55,"data":7},{"name":"minecraft:redstone_wire","id":55,"data":8},{"name":"minecraft:redstone_wire","id":55,"data":9},{"name":"minecraft:redstone_wire","id":55,"data":10},{"name":"minecraft:redstone_wire","id":55,"data":11},{"name":"minecraft:redstone_wire","id":55,"data":12},{"name":"minecraft:redstone_wire","id":55,"data":13},{"name":"minecraft:redstone_wire","id":55,"data":14},{"name":"minecraft:redstone_wire","id":55,"data":15},{"name":"minecraft:diamond_ore","id":56,"data":0},{"name":"minecraft:diamond_block","id":57,"data":0},{"name":"minecraft:crafting_table","id":58,"data":0},{"name":"minecraft:wheat","id":59,"data":0},{"name":"minecraft:wheat","id":59,"data":1},{"name":"minecraft:wheat","id":59,"data":2},{"name":"minecraft:wheat","id":59,"data":3},{"name":"minecraft:wheat","id":59,"data":4},{"name":"minecraft:wheat","id":59,"data":5},{"name":"minecraft:wheat","id":59,"data":6},{"name":"minecraft:wheat","id":59,"data":7},{"name":"minecraft:farmland","id":60,"data":0},{"name":"minecraft:farmland","id":60,"data":1},{"name":"minecraft:farmland","id":60,"data":2},{"name":"minecraft:farmland","id":60,"data":3},{"name":"minecraft:farmland","id":60,"data":4},{"name":"minecraft:farmland","id":60,"data":5},{"name":"minecraft:farmland","id":60,"data":6},{"name":"minecraft:farmland","id":60,"data":7},{"name":"minecraft:furnace","id":61,"data":0},{"name":"minecraft:furnace","id":61,"data":1},{"name":"minecraft:furnace","id":61,"data":2},{"name":"minecraft:furnace","id":61,"data":3},{"name":"minecraft:furnace","id":61,"data":4},{"name":"minecraft:furnace","id":61,"data":5},{"name":"minecraft:furnace","id":61,"data":6},{"name":"minecraft:furnace","id":61,"data":7},{"name":"minecraft:lit_furnace","id":62,"data":0},{"name":"minecraft:lit_furnace","id":62,"data":1},{"name":"minecraft:lit_furnace","id":62,"data":2},{"name":"minecraft:lit_furnace","id":62,"data":3},{"name":"minecraft:lit_furnace","id":62,"data":4},{"name":"minecraft:lit_furnace","id":62,"data":5},{"name":"minecraft:lit_furnace","id":62,"data":6},{"name":"minecraft:lit_furnace","id":62,"data":7},{"name":"minecraft:standing_sign","id":63,"data":0},{"name":"minecraft:standing_sign","id":63,"data":1},{"name":"minecraft:standing_sign","id":63,"data":2},{"name":"minecraft:standing_sign","id":63,"data":3},{"name":"minecraft:standing_sign","id":63,"data":4},{"name":"minecraft:standing_sign","id":63,"data":5},{"name":"minecraft:standing_sign","id":63,"data":6},{"name":"minecraft:standing_sign","id":63,"data":7},{"name":"minecraft:standing_sign","id":63,"data":8},{"name":"minecraft:standing_sign","id":63,"data":9},{"name":"minecraft:standing_sign","id":63,"data":10},{"name":"minecraft:standing_sign","id":63,"data":11},{"name":"minecraft:standing_sign","id":63,"data":12},{"name":"minecraft:standing_sign","id":63,"data":13},{"name":"minecraft:standing_sign","id":63,"data":14},{"name":"minecraft:standing_sign","id":63,"data":15},{"name":"minecraft:wooden_door","id":64,"data":0},{"name":"minecraft:wooden_door","id":64,"data":1},{"name":"minecraft:wooden_door","id":64,"data":2},{"name":"minecraft:wooden_door","id":64,"data":3},{"name":"minecraft:wooden_door","id":64,"data":4},{"name":"minecraft:wooden_door","id":64,"data":5},{"name":"minecraft:wooden_door","id":64,"data":6},{"name":"minecraft:wooden_door","id":64,"data":7},{"name":"minecraft:wooden_door","id":64,"data":8},{"name":"minecraft:wooden_door","id":64,"data":9},{"name":"minecraft:wooden_door","id":64,"data":10},{"name":"minecraft:wooden_door","id":64,"data":11},{"name":"minecraft:wooden_door","id":64,"data":12},{"name":"minecraft:wooden_door","id":64,"data":13},{"name":"minecraft:wooden_door","id":64,"data":14},{"name":"minecraft:wooden_door","id":64,"data":15},{"name":"minecraft:ladder","id":65,"data":0},{"name":"minecraft:ladder","id":65,"data":1},{"name":"minecraft:ladder","id":65,"data":2},{"name":"minecraft:ladder","id":65,"data":3},{"name":"minecraft:ladder","id":65,"data":4},{"name":"minecraft:ladder","id":65,"data":5},{"name":"minecraft:ladder","id":65,"data":6},{"name":"minecraft:ladder","id":65,"data":7},{"name":"minecraft:rail","id":66,"data":0},{"name":"minecraft:rail","id":66,"data":1},{"name":"minecraft:rail","id":66,"data":2},{"name":"minecraft:rail","id":66,"data":3},{"name":"minecraft:rail","id":66,"data":4},{"name":"minecraft:rail","id":66,"data":5},{"name":"minecraft:rail","id":66,"data":6},{"name":"minecraft:rail","id":66,"data":7},{"name":"minecraft:rail","id":66,"data":8},{"name":"minecraft:rail","id":66,"data":9},{"name":"minecraft:rail","id":66,"data":10},{"name":"minecraft:rail","id":66,"data":11},{"name":"minecraft:rail","id":66,"data":12},{"name":"minecraft:rail","id":66,"data":13},{"name":"minecraft:rail","id":66,"data":14},{"name":"minecraft:rail","id":66,"data":15},{"name":"minecraft:stone_stairs","id":67,"data":0},{"name":"minecraft:stone_stairs","id":67,"data":1},{"name":"minecraft:stone_stairs","id":67,"data":2},{"name":"minecraft:stone_stairs","id":67,"data":3},{"name":"minecraft:stone_stairs","id":67,"data":4},{"name":"minecraft:stone_stairs","id":67,"data":5},{"name":"minecraft:stone_stairs","id":67,"data":6},{"name":"minecraft:stone_stairs","id":67,"data":7},{"name":"minecraft:wall_sign","id":68,"data":0},{"name":"minecraft:wall_sign","id":68,"data":1},{"name":"minecraft:wall_sign","id":68,"data":2},{"name":"minecraft:wall_sign","id":68,"data":3},{"name":"minecraft:wall_sign","id":68,"data":4},{"name":"minecraft:wall_sign","id":68,"data":5},{"name":"minecraft:wall_sign","id":68,"data":6},{"name":"minecraft:wall_sign","id":68,"data":7},{"name":"minecraft:lever","id":69,"data":0},{"name":"minecraft:lever","id":69,"data":1},{"name":"minecraft:lever","id":69,"data":2},{"name":"minecraft:lever","id":69,"data":3},{"name":"minecraft:lever","id":69,"data":4},{"name":"minecraft:lever","id":69,"data":5},{"name":"minecraft:lever","id":69,"data":6},{"name":"minecraft:lever","id":69,"data":7},{"name":"minecraft:lever","id":69,"data":8},{"name":"minecraft:lever","id":69,"data":9},{"name":"minecraft:lever","id":69,"data":10},{"name":"minecraft:lever","id":69,"data":11},{"name":"minecraft:lever","id":69,"data":12},{"name":"minecraft:lever","id":69,"data":13},{"name":"minecraft:lever","id":69,"data":14},{"name":"minecraft:lever","id":69,"data":15},{"name":"minecraft:stone_pressure_plate","id":70,"data":0},{"name":"minecraft:stone_pressure_plate","id":70,"data":1},{"name":"minecraft:stone_pressure_plate","id":70,"data":2},{"name":"minecraft:stone_pressure_plate","id":70,"data":3},{"name":"minecraft:stone_pressure_plate","id":70,"data":4},{"name":"minecraft:stone_pressure_plate","id":70,"data":5},{"name":"minecraft:stone_pressure_plate","id":70,"data":6},{"name":"minecraft:stone_pressure_plate","id":70,"data":7},{"name":"minecraft:stone_pressure_plate","id":70,"data":8},{"name":"minecraft:stone_pressure_plate","id":70,"data":9},{"name":"minecraft:stone_pressure_plate","id":70,"data":10},{"name":"minecraft:stone_pressure_plate","id":70,"data":11},{"name":"minecraft:stone_pressure_plate","id":70,"data":12},{"name":"minecraft:stone_pressure_plate","id":70,"data":13},{"name":"minecraft:stone_pressure_plate","id":70,"data":14},{"name":"minecraft:stone_pressure_plate","id":70,"data":15},{"name":"minecraft:iron_door","id":71,"data":0},{"name":"minecraft:iron_door","id":71,"data":1},{"name":"minecraft:iron_door","id":71,"data":2},{"name":"minecraft:iron_door","id":71,"data":3},{"name":"minecraft:iron_door","id":71,"data":4},{"name":"minecraft:iron_door","id":71,"data":5},{"name":"minecraft:iron_door","id":71,"data":6},{"name":"minecraft:iron_door","id":71,"data":7},{"name":"minecraft:iron_door","id":71,"data":8},{"name":"minecraft:iron_door","id":71,"data":9},{"name":"minecraft:iron_door","id":71,"data":10},{"name":"minecraft:iron_door","id":71,"data":11},{"name":"minecraft:iron_door","id":71,"data":12},{"name":"minecraft:iron_door","id":71,"data":13},{"name":"minecraft:iron_door","id":71,"data":14},{"name":"minecraft:iron_door","id":71,"data":15},{"name":"minecraft:wooden_pressure_plate","id":72,"data":0},{"name":"minecraft:wooden_pressure_plate","id":72,"data":1},{"name":"minecraft:wooden_pressure_plate","id":72,"data":2},{"name":"minecraft:wooden_pressure_plate","id":72,"data":3},{"name":"minecraft:wooden_pressure_plate","id":72,"data":4},{"name":"minecraft:wooden_pressure_plate","id":72,"data":5},{"name":"minecraft:wooden_pressure_plate","id":72,"data":6},{"name":"minecraft:wooden_pressure_plate","id":72,"data":7},{"name":"minecraft:wooden_pressure_plate","id":72,"data":8},{"name":"minecraft:wooden_pressure_plate","id":72,"data":9},{"name":"minecraft:wooden_pressure_plate","id":72,"data":10},{"name":"minecraft:wooden_pressure_plate","id":72,"data":11},{"name":"minecraft:wooden_pressure_plate","id":72,"data":12},{"name":"minecraft:wooden_pressure_plate","id":72,"data":13},{"name":"minecraft:wooden_pressure_plate","id":72,"data":14},{"name":"minecraft:wooden_pressure_plate","id":72,"data":15},{"name":"minecraft:redstone_ore","id":73,"data":0},{"name":"minecraft:lit_redstone_ore","id":74,"data":0},{"name":"minecraft:unlit_redstone_torch","id":75,"data":0},{"name":"minecraft:unlit_redstone_torch","id":75,"data":1},{"name":"minecraft:unlit_redstone_torch","id":75,"data":2},{"name":"minecraft:unlit_redstone_torch","id":75,"data":3},{"name":"minecraft:unlit_redstone_torch","id":75,"data":4},{"name":"minecraft:unlit_redstone_torch","id":75,"data":5},{"name":"minecraft:unlit_redstone_torch","id":75,"data":6},{"name":"minecraft:unlit_redstone_torch","id":75,"data":7},{"name":"minecraft:redstone_torch","id":76,"data":0},{"name":"minecraft:redstone_torch","id":76,"data":1},{"name":"minecraft:redstone_torch","id":76,"data":2},{"name":"minecraft:redstone_torch","id":76,"data":3},{"name":"minecraft:redstone_torch","id":76,"data":4},{"name":"minecraft:redstone_torch","id":76,"data":5},{"name":"minecraft:redstone_torch","id":76,"data":6},{"name":"minecraft:redstone_torch","id":76,"data":7},{"name":"minecraft:stone_button","id":77,"data":0},{"name":"minecraft:stone_button","id":77,"data":1},{"name":"minecraft:stone_button","id":77,"data":2},{"name":"minecraft:stone_button","id":77,"data":3},{"name":"minecraft:stone_button","id":77,"data":4},{"name":"minecraft:stone_button","id":77,"data":5},{"name":"minecraft:stone_button","id":77,"data":6},{"name":"minecraft:stone_button","id":77,"data":7},{"name":"minecraft:stone_button","id":77,"data":8},{"name":"minecraft:stone_button","id":77,"data":9},{"name":"minecraft:stone_button","id":77,"data":10},{"name":"minecraft:stone_button","id":77,"data":11},{"name":"minecraft:stone_button","id":77,"data":12},{"name":"minecraft:stone_button","id":77,"data":13},{"name":"minecraft:stone_button","id":77,"data":14},{"name":"minecraft:stone_button","id":77,"data":15},{"name":"minecraft:snow_layer","id":78,"data":0},{"name":"minecraft:snow_layer","id":78,"data":1},{"name":"minecraft:snow_layer","id":78,"data":2},{"name":"minecraft:snow_layer","id":78,"data":3},{"name":"minecraft:snow_layer","id":78,"data":4},{"name":"minecraft:snow_layer","id":78,"data":5},{"name":"minecraft:snow_layer","id":78,"data":6},{"name":"minecraft:snow_layer","id":78,"data":7},{"name":"minecraft:snow_layer","id":78,"data":8},{"name":"minecraft:snow_layer","id":78,"data":9},{"name":"minecraft:snow_layer","id":78,"data":10},{"name":"minecraft:snow_layer","id":78,"data":11},{"name":"minecraft:snow_layer","id":78,"data":12},{"name":"minecraft:snow_layer","id":78,"data":13},{"name":"minecraft:snow_layer","id":78,"data":14},{"name":"minecraft:snow_layer","id":78,"data":15},{"name":"minecraft:ice","id":79,"data":0},{"name":"minecraft:snow","id":80,"data":0},{"name":"minecraft:cactus","id":81,"data":0},{"name":"minecraft:cactus","id":81,"data":1},{"name":"minecraft:cactus","id":81,"data":2},{"name":"minecraft:cactus","id":81,"data":3},{"name":"minecraft:cactus","id":81,"data":4},{"name":"minecraft:cactus","id":81,"data":5},{"name":"minecraft:cactus","id":81,"data":6},{"name":"minecraft:cactus","id":81,"data":7},{"name":"minecraft:cactus","id":81,"data":8},{"name":"minecraft:cactus","id":81,"data":9},{"name":"minecraft:cactus","id":81,"data":10},{"name":"minecraft:cactus","id":81,"data":11},{"name":"minecraft:cactus","id":81,"data":12},{"name":"minecraft:cactus","id":81,"data":13},{"name":"minecraft:cactus","id":81,"data":14},{"name":"minecraft:cactus","id":81,"data":15},{"name":"minecraft:clay","id":82,"data":0},{"name":"minecraft:reeds","id":83,"data":0},{"name":"minecraft:reeds","id":83,"data":1},{"name":"minecraft:reeds","id":83,"data":2},{"name":"minecraft:reeds","id":83,"data":3},{"name":"minecraft:reeds","id":83,"data":4},{"name":"minecraft:reeds","id":83,"data":5},{"name":"minecraft:reeds","id":83,"data":6},{"name":"minecraft:reeds","id":83,"data":7},{"name":"minecraft:reeds","id":83,"data":8},{"name":"minecraft:reeds","id":83,"data":9},{"name":"minecraft:reeds","id":83,"data":10},{"name":"minecraft:reeds","id":83,"data":11},{"name":"minecraft:reeds","id":83,"data":12},{"name":"minecraft:reeds","id":83,"data":13},{"name":"minecraft:reeds","id":83,"data":14},{"name":"minecraft:reeds","id":83,"data":15},{"name":"minecraft:jukebox","id":84,"data":0},{"name":"minecraft:fence","id":85,"data":0},{"name":"minecraft:fence","id":85,"data":1},{"name":"minecraft:fence","id":85,"data":2},{"name":"minecraft:fence","id":85,"data":3},{"name":"minecraft:fence","id":85,"data":4},{"name":"minecraft:fence","id":85,"data":5},{"name":"minecraft:fence","id":85,"data":6},{"name":"minecraft:fence","id":85,"data":7},{"name":"minecraft:pumpkin","id":86,"data":0},{"name":"minecraft:pumpkin","id":86,"data":1},{"name":"minecraft:pumpkin","id":86,"data":2},{"name":"minecraft:pumpkin","id":86,"data":3},{"name":"minecraft:netherrack","id":87,"data":0},{"name":"minecraft:soul_sand","id":88,"data":0},{"name":"minecraft:glowstone","id":89,"data":0},{"name":"minecraft:portal","id":90,"data":0},{"name":"minecraft:portal","id":90,"data":1},{"name":"minecraft:portal","id":90,"data":2},{"name":"minecraft:portal","id":90,"data":3},{"name":"minecraft:lit_pumpkin","id":91,"data":0},{"name":"minecraft:lit_pumpkin","id":91,"data":1},{"name":"minecraft:lit_pumpkin","id":91,"data":2},{"name":"minecraft:lit_pumpkin","id":91,"data":3},{"name":"minecraft:cake","id":92,"data":0},{"name":"minecraft:cake","id":92,"data":1},{"name":"minecraft:cake","id":92,"data":2},{"name":"minecraft:cake","id":92,"data":3},{"name":"minecraft:cake","id":92,"data":4},{"name":"minecraft:cake","id":92,"data":5},{"name":"minecraft:cake","id":92,"data":6},{"name":"minecraft:cake","id":92,"data":7},{"name":"minecraft:unpowered_repeater","id":93,"data":0},{"name":"minecraft:unpowered_repeater","id":93,"data":1},{"name":"minecraft:unpowered_repeater","id":93,"data":2},{"name":"minecraft:unpowered_repeater","id":93,"data":3},{"name":"minecraft:unpowered_repeater","id":93,"data":4},{"name":"minecraft:unpowered_repeater","id":93,"data":5},{"name":"minecraft:unpowered_repeater","id":93,"data":6},{"name":"minecraft:unpowered_repeater","id":93,"data":7},{"name":"minecraft:unpowered_repeater","id":93,"data":8},{"name":"minecraft:unpowered_repeater","id":93,"data":9},{"name":"minecraft:unpowered_repeater","id":93,"data":10},{"name":"minecraft:unpowered_repeater","id":93,"data":11},{"name":"minecraft:unpowered_repeater","id":93,"data":12},{"name":"minecraft:unpowered_repeater","id":93,"data":13},{"name":"minecraft:unpowered_repeater","id":93,"data":14},{"name":"minecraft:unpowered_repeater","id":93,"data":15},{"name":"minecraft:powered_repeater","id":94,"data":0},{"name":"minecraft:powered_repeater","id":94,"data":1},{"name":"minecraft:powered_repeater","id":94,"data":2},{"name":"minecraft:powered_repeater","id":94,"data":3},{"name":"minecraft:powered_repeater","id":94,"data":4},{"name":"minecraft:powered_repeater","id":94,"data":5},{"name":"minecraft:powered_repeater","id":94,"data":6},{"name":"minecraft:powered_repeater","id":94,"data":7},{"name":"minecraft:powered_repeater","id":94,"data":8},{"name":"minecraft:powered_repeater","id":94,"data":9},{"name":"minecraft:powered_repeater","id":94,"data":10},{"name":"minecraft:powered_repeater","id":94,"data":11},{"name":"minecraft:powered_repeater","id":94,"data":12},{"name":"minecraft:powered_repeater","id":94,"data":13},{"name":"minecraft:powered_repeater","id":94,"data":14},{"name":"minecraft:powered_repeater","id":94,"data":15},{"name":"minecraft:invisibleBedrock","id":95,"data":0},{"name":"minecraft:trapdoor","id":96,"data":0},{"name":"minecraft:trapdoor","id":96,"data":1},{"name":"minecraft:trapdoor","id":96,"data":2},{"name":"minecraft:trapdoor","id":96,"data":3},{"name":"minecraft:trapdoor","id":96,"data":4},{"name":"minecraft:trapdoor","id":96,"data":5},{"name":"minecraft:trapdoor","id":96,"data":6},{"name":"minecraft:trapdoor","id":96,"data":7},{"name":"minecraft:trapdoor","id":96,"data":8},{"name":"minecraft:trapdoor","id":96,"data":9},{"name":"minecraft:trapdoor","id":96,"data":10},{"name":"minecraft:trapdoor","id":96,"data":11},{"name":"minecraft:trapdoor","id":96,"data":12},{"name":"minecraft:trapdoor","id":96,"data":13},{"name":"minecraft:trapdoor","id":96,"data":14},{"name":"minecraft:trapdoor","id":96,"data":15},{"name":"minecraft:monster_egg","id":97,"data":0},{"name":"minecraft:monster_egg","id":97,"data":1},{"name":"minecraft:monster_egg","id":97,"data":2},{"name":"minecraft:monster_egg","id":97,"data":3},{"name":"minecraft:monster_egg","id":97,"data":4},{"name":"minecraft:monster_egg","id":97,"data":5},{"name":"minecraft:monster_egg","id":97,"data":6},{"name":"minecraft:monster_egg","id":97,"data":7},{"name":"minecraft:stonebrick","id":98,"data":0},{"name":"minecraft:stonebrick","id":98,"data":1},{"name":"minecraft:stonebrick","id":98,"data":2},{"name":"minecraft:stonebrick","id":98,"data":3},{"name":"minecraft:stonebrick","id":98,"data":4},{"name":"minecraft:stonebrick","id":98,"data":5},{"name":"minecraft:stonebrick","id":98,"data":6},{"name":"minecraft:stonebrick","id":98,"data":7},{"name":"minecraft:brown_mushroom_block","id":99,"data":0},{"name":"minecraft:brown_mushroom_block","id":99,"data":1},{"name":"minecraft:brown_mushroom_block","id":99,"data":2},{"name":"minecraft:brown_mushroom_block","id":99,"data":3},{"name":"minecraft:brown_mushroom_block","id":99,"data":4},{"name":"minecraft:brown_mushroom_block","id":99,"data":5},{"name":"minecraft:brown_mushroom_block","id":99,"data":6},{"name":"minecraft:brown_mushroom_block","id":99,"data":7},{"name":"minecraft:brown_mushroom_block","id":99,"data":8},{"name":"minecraft:brown_mushroom_block","id":99,"data":9},{"name":"minecraft:brown_mushroom_block","id":99,"data":10},{"name":"minecraft:brown_mushroom_block","id":99,"data":11},{"name":"minecraft:brown_mushroom_block","id":99,"data":12},{"name":"minecraft:brown_mushroom_block","id":99,"data":13},{"name":"minecraft:brown_mushroom_block","id":99,"data":14},{"name":"minecraft:brown_mushroom_block","id":99,"data":15},{"name":"minecraft:red_mushroom_block","id":100,"data":0},{"name":"minecraft:red_mushroom_block","id":100,"data":1},{"name":"minecraft:red_mushroom_block","id":100,"data":2},{"name":"minecraft:red_mushroom_block","id":100,"data":3},{"name":"minecraft:red_mushroom_block","id":100,"data":4},{"name":"minecraft:red_mushroom_block","id":100,"data":5},{"name":"minecraft:red_mushroom_block","id":100,"data":6},{"name":"minecraft:red_mushroom_block","id":100,"data":7},{"name":"minecraft:red_mushroom_block","id":100,"data":8},{"name":"minecraft:red_mushroom_block","id":100,"data":9},{"name":"minecraft:red_mushroom_block","id":100,"data":10},{"name":"minecraft:red_mushroom_block","id":100,"data":11},{"name":"minecraft:red_mushroom_block","id":100,"data":12},{"name":"minecraft:red_mushroom_block","id":100,"data":13},{"name":"minecraft:red_mushroom_block","id":100,"data":14},{"name":"minecraft:red_mushroom_block","id":100,"data":15},{"name":"minecraft:iron_bars","id":101,"data":0},{"name":"minecraft:glass_pane","id":102,"data":0},{"name":"minecraft:melon_block","id":103,"data":0},{"name":"minecraft:pumpkin_stem","id":104,"data":0},{"name":"minecraft:pumpkin_stem","id":104,"data":1},{"name":"minecraft:pumpkin_stem","id":104,"data":2},{"name":"minecraft:pumpkin_stem","id":104,"data":3},{"name":"minecraft:pumpkin_stem","id":104,"data":4},{"name":"minecraft:pumpkin_stem","id":104,"data":5},{"name":"minecraft:pumpkin_stem","id":104,"data":6},{"name":"minecraft:pumpkin_stem","id":104,"data":7},{"name":"minecraft:melon_stem","id":105,"data":0},{"name":"minecraft:melon_stem","id":105,"data":1},{"name":"minecraft:melon_stem","id":105,"data":2},{"name":"minecraft:melon_stem","id":105,"data":3},{"name":"minecraft:melon_stem","id":105,"data":4},{"name":"minecraft:melon_stem","id":105,"data":5},{"name":"minecraft:melon_stem","id":105,"data":6},{"name":"minecraft:melon_stem","id":105,"data":7},{"name":"minecraft:vine","id":106,"data":0},{"name":"minecraft:vine","id":106,"data":1},{"name":"minecraft:vine","id":106,"data":2},{"name":"minecraft:vine","id":106,"data":3},{"name":"minecraft:vine","id":106,"data":4},{"name":"minecraft:vine","id":106,"data":5},{"name":"minecraft:vine","id":106,"data":6},{"name":"minecraft:vine","id":106,"data":7},{"name":"minecraft:vine","id":106,"data":8},{"name":"minecraft:vine","id":106,"data":9},{"name":"minecraft:vine","id":106,"data":10},{"name":"minecraft:vine","id":106,"data":11},{"name":"minecraft:vine","id":106,"data":12},{"name":"minecraft:vine","id":106,"data":13},{"name":"minecraft:vine","id":106,"data":14},{"name":"minecraft:vine","id":106,"data":15},{"name":"minecraft:fence_gate","id":107,"data":0},{"name":"minecraft:fence_gate","id":107,"data":1},{"name":"minecraft:fence_gate","id":107,"data":2},{"name":"minecraft:fence_gate","id":107,"data":3},{"name":"minecraft:fence_gate","id":107,"data":4},{"name":"minecraft:fence_gate","id":107,"data":5},{"name":"minecraft:fence_gate","id":107,"data":6},{"name":"minecraft:fence_gate","id":107,"data":7},{"name":"minecraft:fence_gate","id":107,"data":8},{"name":"minecraft:fence_gate","id":107,"data":9},{"name":"minecraft:fence_gate","id":107,"data":10},{"name":"minecraft:fence_gate","id":107,"data":11},{"name":"minecraft:fence_gate","id":107,"data":12},{"name":"minecraft:fence_gate","id":107,"data":13},{"name":"minecraft:fence_gate","id":107,"data":14},{"name":"minecraft:fence_gate","id":107,"data":15},{"name":"minecraft:brick_stairs","id":108,"data":0},{"name":"minecraft:brick_stairs","id":108,"data":1},{"name":"minecraft:brick_stairs","id":108,"data":2},{"name":"minecraft:brick_stairs","id":108,"data":3},{"name":"minecraft:brick_stairs","id":108,"data":4},{"name":"minecraft:brick_stairs","id":108,"data":5},{"name":"minecraft:brick_stairs","id":108,"data":6},{"name":"minecraft:brick_stairs","id":108,"data":7},{"name":"minecraft:stone_brick_stairs","id":109,"data":0},{"name":"minecraft:stone_brick_stairs","id":109,"data":1},{"name":"minecraft:stone_brick_stairs","id":109,"data":2},{"name":"minecraft:stone_brick_stairs","id":109,"data":3},{"name":"minecraft:stone_brick_stairs","id":109,"data":4},{"name":"minecraft:stone_brick_stairs","id":109,"data":5},{"name":"minecraft:stone_brick_stairs","id":109,"data":6},{"name":"minecraft:stone_brick_stairs","id":109,"data":7},{"name":"minecraft:mycelium","id":110,"data":0},{"name":"minecraft:waterlily","id":111,"data":0},{"name":"minecraft:nether_brick","id":112,"data":0},{"name":"minecraft:nether_brick_fence","id":113,"data":0},{"name":"minecraft:nether_brick_stairs","id":114,"data":0},{"name":"minecraft:nether_brick_stairs","id":114,"data":1},{"name":"minecraft:nether_brick_stairs","id":114,"data":2},{"name":"minecraft:nether_brick_stairs","id":114,"data":3},{"name":"minecraft:nether_brick_stairs","id":114,"data":4},{"name":"minecraft:nether_brick_stairs","id":114,"data":5},{"name":"minecraft:nether_brick_stairs","id":114,"data":6},{"name":"minecraft:nether_brick_stairs","id":114,"data":7},{"name":"minecraft:nether_wart","id":115,"data":0},{"name":"minecraft:nether_wart","id":115,"data":1},{"name":"minecraft:nether_wart","id":115,"data":2},{"name":"minecraft:nether_wart","id":115,"data":3},{"name":"minecraft:enchanting_table","id":116,"data":0},{"name":"minecraft:brewing_stand","id":117,"data":0},{"name":"minecraft:brewing_stand","id":117,"data":1},{"name":"minecraft:brewing_stand","id":117,"data":2},{"name":"minecraft:brewing_stand","id":117,"data":3},{"name":"minecraft:brewing_stand","id":117,"data":4},{"name":"minecraft:brewing_stand","id":117,"data":5},{"name":"minecraft:brewing_stand","id":117,"data":6},{"name":"minecraft:brewing_stand","id":117,"data":7},{"name":"minecraft:cauldron","id":118,"data":0},{"name":"minecraft:cauldron","id":118,"data":1},{"name":"minecraft:cauldron","id":118,"data":2},{"name":"minecraft:cauldron","id":118,"data":3},{"name":"minecraft:cauldron","id":118,"data":4},{"name":"minecraft:cauldron","id":118,"data":5},{"name":"minecraft:cauldron","id":118,"data":6},{"name":"minecraft:cauldron","id":118,"data":7},{"name":"minecraft:cauldron","id":118,"data":8},{"name":"minecraft:cauldron","id":118,"data":9},{"name":"minecraft:cauldron","id":118,"data":10},{"name":"minecraft:cauldron","id":118,"data":11},{"name":"minecraft:cauldron","id":118,"data":12},{"name":"minecraft:cauldron","id":118,"data":13},{"name":"minecraft:cauldron","id":118,"data":14},{"name":"minecraft:cauldron","id":118,"data":15},{"name":"minecraft:end_portal","id":119,"data":0},{"name":"minecraft:end_portal_frame","id":120,"data":0},{"name":"minecraft:end_portal_frame","id":120,"data":1},{"name":"minecraft:end_portal_frame","id":120,"data":2},{"name":"minecraft:end_portal_frame","id":120,"data":3},{"name":"minecraft:end_portal_frame","id":120,"data":4},{"name":"minecraft:end_portal_frame","id":120,"data":5},{"name":"minecraft:end_portal_frame","id":120,"data":6},{"name":"minecraft:end_portal_frame","id":120,"data":7},{"name":"minecraft:end_stone","id":121,"data":0},{"name":"minecraft:dragon_egg","id":122,"data":0},{"name":"minecraft:redstone_lamp","id":123,"data":0},{"name":"minecraft:lit_redstone_lamp","id":124,"data":0},{"name":"minecraft:dropper","id":125,"data":0},{"name":"minecraft:dropper","id":125,"data":1},{"name":"minecraft:dropper","id":125,"data":2},{"name":"minecraft:dropper","id":125,"data":3},{"name":"minecraft:dropper","id":125,"data":4},{"name":"minecraft:dropper","id":125,"data":5},{"name":"minecraft:dropper","id":125,"data":6},{"name":"minecraft:dropper","id":125,"data":7},{"name":"minecraft:dropper","id":125,"data":8},{"name":"minecraft:dropper","id":125,"data":9},{"name":"minecraft:dropper","id":125,"data":10},{"name":"minecraft:dropper","id":125,"data":11},{"name":"minecraft:dropper","id":125,"data":12},{"name":"minecraft:dropper","id":125,"data":13},{"name":"minecraft:dropper","id":125,"data":14},{"name":"minecraft:dropper","id":125,"data":15},{"name":"minecraft:activator_rail","id":126,"data":0},{"name":"minecraft:activator_rail","id":126,"data":1},{"name":"minecraft:activator_rail","id":126,"data":2},{"name":"minecraft:activator_rail","id":126,"data":3},{"name":"minecraft:activator_rail","id":126,"data":4},{"name":"minecraft:activator_rail","id":126,"data":5},{"name":"minecraft:activator_rail","id":126,"data":6},{"name":"minecraft:activator_rail","id":126,"data":7},{"name":"minecraft:activator_rail","id":126,"data":8},{"name":"minecraft:activator_rail","id":126,"data":9},{"name":"minecraft:activator_rail","id":126,"data":10},{"name":"minecraft:activator_rail","id":126,"data":11},{"name":"minecraft:activator_rail","id":126,"data":12},{"name":"minecraft:activator_rail","id":126,"data":13},{"name":"minecraft:activator_rail","id":126,"data":14},{"name":"minecraft:activator_rail","id":126,"data":15},{"name":"minecraft:cocoa","id":127,"data":0},{"name":"minecraft:cocoa","id":127,"data":1},{"name":"minecraft:cocoa","id":127,"data":2},{"name":"minecraft:cocoa","id":127,"data":3},{"name":"minecraft:cocoa","id":127,"data":4},{"name":"minecraft:cocoa","id":127,"data":5},{"name":"minecraft:cocoa","id":127,"data":6},{"name":"minecraft:cocoa","id":127,"data":7},{"name":"minecraft:cocoa","id":127,"data":8},{"name":"minecraft:cocoa","id":127,"data":9},{"name":"minecraft:cocoa","id":127,"data":10},{"name":"minecraft:cocoa","id":127,"data":11},{"name":"minecraft:cocoa","id":127,"data":12},{"name":"minecraft:cocoa","id":127,"data":13},{"name":"minecraft:cocoa","id":127,"data":14},{"name":"minecraft:cocoa","id":127,"data":15},{"name":"minecraft:sandstone_stairs","id":128,"data":0},{"name":"minecraft:sandstone_stairs","id":128,"data":1},{"name":"minecraft:sandstone_stairs","id":128,"data":2},{"name":"minecraft:sandstone_stairs","id":128,"data":3},{"name":"minecraft:sandstone_stairs","id":128,"data":4},{"name":"minecraft:sandstone_stairs","id":128,"data":5},{"name":"minecraft:sandstone_stairs","id":128,"data":6},{"name":"minecraft:sandstone_stairs","id":128,"data":7},{"name":"minecraft:emerald_ore","id":129,"data":0},{"name":"minecraft:ender_chest","id":130,"data":0},{"name":"minecraft:ender_chest","id":130,"data":1},{"name":"minecraft:ender_chest","id":130,"data":2},{"name":"minecraft:ender_chest","id":130,"data":3},{"name":"minecraft:ender_chest","id":130,"data":4},{"name":"minecraft:ender_chest","id":130,"data":5},{"name":"minecraft:ender_chest","id":130,"data":6},{"name":"minecraft:ender_chest","id":130,"data":7},{"name":"minecraft:tripwire_hook","id":131,"data":0},{"name":"minecraft:tripwire_hook","id":131,"data":1},{"name":"minecraft:tripwire_hook","id":131,"data":2},{"name":"minecraft:tripwire_hook","id":131,"data":3},{"name":"minecraft:tripwire_hook","id":131,"data":4},{"name":"minecraft:tripwire_hook","id":131,"data":5},{"name":"minecraft:tripwire_hook","id":131,"data":6},{"name":"minecraft:tripwire_hook","id":131,"data":7},{"name":"minecraft:tripwire_hook","id":131,"data":8},{"name":"minecraft:tripwire_hook","id":131,"data":9},{"name":"minecraft:tripwire_hook","id":131,"data":10},{"name":"minecraft:tripwire_hook","id":131,"data":11},{"name":"minecraft:tripwire_hook","id":131,"data":12},{"name":"minecraft:tripwire_hook","id":131,"data":13},{"name":"minecraft:tripwire_hook","id":131,"data":14},{"name":"minecraft:tripwire_hook","id":131,"data":15},{"name":"minecraft:tripWire","id":132,"data":0},{"name":"minecraft:tripWire","id":132,"data":1},{"name":"minecraft:tripWire","id":132,"data":2},{"name":"minecraft:tripWire","id":132,"data":3},{"name":"minecraft:tripWire","id":132,"data":4},{"name":"minecraft:tripWire","id":132,"data":5},{"name":"minecraft:tripWire","id":132,"data":6},{"name":"minecraft:tripWire","id":132,"data":7},{"name":"minecraft:tripWire","id":132,"data":8},{"name":"minecraft:tripWire","id":132,"data":9},{"name":"minecraft:tripWire","id":132,"data":10},{"name":"minecraft:tripWire","id":132,"data":11},{"name":"minecraft:tripWire","id":132,"data":12},{"name":"minecraft:tripWire","id":132,"data":13},{"name":"minecraft:tripWire","id":132,"data":14},{"name":"minecraft:tripWire","id":132,"data":15},{"name":"minecraft:emerald_block","id":133,"data":0},{"name":"minecraft:spruce_stairs","id":134,"data":0},{"name":"minecraft:spruce_stairs","id":134,"data":1},{"name":"minecraft:spruce_stairs","id":134,"data":2},{"name":"minecraft:spruce_stairs","id":134,"data":3},{"name":"minecraft:spruce_stairs","id":134,"data":4},{"name":"minecraft:spruce_stairs","id":134,"data":5},{"name":"minecraft:spruce_stairs","id":134,"data":6},{"name":"minecraft:spruce_stairs","id":134,"data":7},{"name":"minecraft:birch_stairs","id":135,"data":0},{"name":"minecraft:birch_stairs","id":135,"data":1},{"name":"minecraft:birch_stairs","id":135,"data":2},{"name":"minecraft:birch_stairs","id":135,"data":3},{"name":"minecraft:birch_stairs","id":135,"data":4},{"name":"minecraft:birch_stairs","id":135,"data":5},{"name":"minecraft:birch_stairs","id":135,"data":6},{"name":"minecraft:birch_stairs","id":135,"data":7},{"name":"minecraft:jungle_stairs","id":136,"data":0},{"name":"minecraft:jungle_stairs","id":136,"data":1},{"name":"minecraft:jungle_stairs","id":136,"data":2},{"name":"minecraft:jungle_stairs","id":136,"data":3},{"name":"minecraft:jungle_stairs","id":136,"data":4},{"name":"minecraft:jungle_stairs","id":136,"data":5},{"name":"minecraft:jungle_stairs","id":136,"data":6},{"name":"minecraft:jungle_stairs","id":136,"data":7},{"name":"minecraft:command_block","id":137,"data":0},{"name":"minecraft:command_block","id":137,"data":1},{"name":"minecraft:command_block","id":137,"data":2},{"name":"minecraft:command_block","id":137,"data":3},{"name":"minecraft:command_block","id":137,"data":4},{"name":"minecraft:command_block","id":137,"data":5},{"name":"minecraft:command_block","id":137,"data":6},{"name":"minecraft:command_block","id":137,"data":7},{"name":"minecraft:command_block","id":137,"data":8},{"name":"minecraft:command_block","id":137,"data":9},{"name":"minecraft:command_block","id":137,"data":10},{"name":"minecraft:command_block","id":137,"data":11},{"name":"minecraft:command_block","id":137,"data":12},{"name":"minecraft:command_block","id":137,"data":13},{"name":"minecraft:command_block","id":137,"data":14},{"name":"minecraft:command_block","id":137,"data":15},{"name":"minecraft:beacon","id":138,"data":0},{"name":"minecraft:cobblestone_wall","id":139,"data":0},{"name":"minecraft:cobblestone_wall","id":139,"data":1},{"name":"minecraft:cobblestone_wall","id":139,"data":2},{"name":"minecraft:cobblestone_wall","id":139,"data":3},{"name":"minecraft:cobblestone_wall","id":139,"data":4},{"name":"minecraft:cobblestone_wall","id":139,"data":5},{"name":"minecraft:cobblestone_wall","id":139,"data":6},{"name":"minecraft:cobblestone_wall","id":139,"data":7},{"name":"minecraft:cobblestone_wall","id":139,"data":8},{"name":"minecraft:cobblestone_wall","id":139,"data":9},{"name":"minecraft:cobblestone_wall","id":139,"data":10},{"name":"minecraft:cobblestone_wall","id":139,"data":11},{"name":"minecraft:cobblestone_wall","id":139,"data":12},{"name":"minecraft:cobblestone_wall","id":139,"data":13},{"name":"minecraft:cobblestone_wall","id":139,"data":14},{"name":"minecraft:cobblestone_wall","id":139,"data":15},{"name":"minecraft:flower_pot","id":140,"data":0},{"name":"minecraft:flower_pot","id":140,"data":1},{"name":"minecraft:carrots","id":141,"data":0},{"name":"minecraft:carrots","id":141,"data":1},{"name":"minecraft:carrots","id":141,"data":2},{"name":"minecraft:carrots","id":141,"data":3},{"name":"minecraft:carrots","id":141,"data":4},{"name":"minecraft:carrots","id":141,"data":5},{"name":"minecraft:carrots","id":141,"data":6},{"name":"minecraft:carrots","id":141,"data":7},{"name":"minecraft:potatoes","id":142,"data":0},{"name":"minecraft:potatoes","id":142,"data":1},{"name":"minecraft:potatoes","id":142,"data":2},{"name":"minecraft:potatoes","id":142,"data":3},{"name":"minecraft:potatoes","id":142,"data":4},{"name":"minecraft:potatoes","id":142,"data":5},{"name":"minecraft:potatoes","id":142,"data":6},{"name":"minecraft:potatoes","id":142,"data":7},{"name":"minecraft:wooden_button","id":143,"data":0},{"name":"minecraft:wooden_button","id":143,"data":1},{"name":"minecraft:wooden_button","id":143,"data":2},{"name":"minecraft:wooden_button","id":143,"data":3},{"name":"minecraft:wooden_button","id":143,"data":4},{"name":"minecraft:wooden_button","id":143,"data":5},{"name":"minecraft:wooden_button","id":143,"data":6},{"name":"minecraft:wooden_button","id":143,"data":7},{"name":"minecraft:wooden_button","id":143,"data":8},{"name":"minecraft:wooden_button","id":143,"data":9},{"name":"minecraft:wooden_button","id":143,"data":10},{"name":"minecraft:wooden_button","id":143,"data":11},{"name":"minecraft:wooden_button","id":143,"data":12},{"name":"minecraft:wooden_button","id":143,"data":13},{"name":"minecraft:wooden_button","id":143,"data":14},{"name":"minecraft:wooden_button","id":143,"data":15},{"name":"minecraft:skull","id":144,"data":0},{"name":"minecraft:skull","id":144,"data":1},{"name":"minecraft:skull","id":144,"data":2},{"name":"minecraft:skull","id":144,"data":3},{"name":"minecraft:skull","id":144,"data":4},{"name":"minecraft:skull","id":144,"data":5},{"name":"minecraft:skull","id":144,"data":6},{"name":"minecraft:skull","id":144,"data":7},{"name":"minecraft:skull","id":144,"data":8},{"name":"minecraft:skull","id":144,"data":9},{"name":"minecraft:skull","id":144,"data":10},{"name":"minecraft:skull","id":144,"data":11},{"name":"minecraft:skull","id":144,"data":12},{"name":"minecraft:skull","id":144,"data":13},{"name":"minecraft:skull","id":144,"data":14},{"name":"minecraft:skull","id":144,"data":15},{"name":"minecraft:anvil","id":145,"data":0},{"name":"minecraft:anvil","id":145,"data":1},{"name":"minecraft:anvil","id":145,"data":2},{"name":"minecraft:anvil","id":145,"data":3},{"name":"minecraft:anvil","id":145,"data":4},{"name":"minecraft:anvil","id":145,"data":5},{"name":"minecraft:anvil","id":145,"data":6},{"name":"minecraft:anvil","id":145,"data":7},{"name":"minecraft:anvil","id":145,"data":8},{"name":"minecraft:anvil","id":145,"data":9},{"name":"minecraft:anvil","id":145,"data":10},{"name":"minecraft:anvil","id":145,"data":11},{"name":"minecraft:anvil","id":145,"data":12},{"name":"minecraft:anvil","id":145,"data":13},{"name":"minecraft:anvil","id":145,"data":14},{"name":"minecraft:anvil","id":145,"data":15},{"name":"minecraft:trapped_chest","id":146,"data":0},{"name":"minecraft:trapped_chest","id":146,"data":1},{"name":"minecraft:trapped_chest","id":146,"data":2},{"name":"minecraft:trapped_chest","id":146,"data":3},{"name":"minecraft:trapped_chest","id":146,"data":4},{"name":"minecraft:trapped_chest","id":146,"data":5},{"name":"minecraft:trapped_chest","id":146,"data":6},{"name":"minecraft:trapped_chest","id":146,"data":7},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":0},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":1},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":2},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":3},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":4},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":5},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":6},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":7},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":8},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":9},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":10},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":11},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":12},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":13},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":14},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":15},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":0},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":1},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":2},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":3},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":4},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":5},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":6},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":7},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":8},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":9},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":10},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":11},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":12},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":13},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":14},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":15},{"name":"minecraft:unpowered_comparator","id":149,"data":0},{"name":"minecraft:unpowered_comparator","id":149,"data":1},{"name":"minecraft:unpowered_comparator","id":149,"data":2},{"name":"minecraft:unpowered_comparator","id":149,"data":3},{"name":"minecraft:unpowered_comparator","id":149,"data":4},{"name":"minecraft:unpowered_comparator","id":149,"data":5},{"name":"minecraft:unpowered_comparator","id":149,"data":6},{"name":"minecraft:unpowered_comparator","id":149,"data":7},{"name":"minecraft:unpowered_comparator","id":149,"data":8},{"name":"minecraft:unpowered_comparator","id":149,"data":9},{"name":"minecraft:unpowered_comparator","id":149,"data":10},{"name":"minecraft:unpowered_comparator","id":149,"data":11},{"name":"minecraft:unpowered_comparator","id":149,"data":12},{"name":"minecraft:unpowered_comparator","id":149,"data":13},{"name":"minecraft:unpowered_comparator","id":149,"data":14},{"name":"minecraft:unpowered_comparator","id":149,"data":15},{"name":"minecraft:powered_comparator","id":150,"data":0},{"name":"minecraft:powered_comparator","id":150,"data":1},{"name":"minecraft:powered_comparator","id":150,"data":2},{"name":"minecraft:powered_comparator","id":150,"data":3},{"name":"minecraft:powered_comparator","id":150,"data":4},{"name":"minecraft:powered_comparator","id":150,"data":5},{"name":"minecraft:powered_comparator","id":150,"data":6},{"name":"minecraft:powered_comparator","id":150,"data":7},{"name":"minecraft:powered_comparator","id":150,"data":8},{"name":"minecraft:powered_comparator","id":150,"data":9},{"name":"minecraft:powered_comparator","id":150,"data":10},{"name":"minecraft:powered_comparator","id":150,"data":11},{"name":"minecraft:powered_comparator","id":150,"data":12},{"name":"minecraft:powered_comparator","id":150,"data":13},{"name":"minecraft:powered_comparator","id":150,"data":14},{"name":"minecraft:powered_comparator","id":150,"data":15},{"name":"minecraft:daylight_detector","id":151,"data":0},{"name":"minecraft:daylight_detector","id":151,"data":1},{"name":"minecraft:daylight_detector","id":151,"data":2},{"name":"minecraft:daylight_detector","id":151,"data":3},{"name":"minecraft:daylight_detector","id":151,"data":4},{"name":"minecraft:daylight_detector","id":151,"data":5},{"name":"minecraft:daylight_detector","id":151,"data":6},{"name":"minecraft:daylight_detector","id":151,"data":7},{"name":"minecraft:daylight_detector","id":151,"data":8},{"name":"minecraft:daylight_detector","id":151,"data":9},{"name":"minecraft:daylight_detector","id":151,"data":10},{"name":"minecraft:daylight_detector","id":151,"data":11},{"name":"minecraft:daylight_detector","id":151,"data":12},{"name":"minecraft:daylight_detector","id":151,"data":13},{"name":"minecraft:daylight_detector","id":151,"data":14},{"name":"minecraft:daylight_detector","id":151,"data":15},{"name":"minecraft:redstone_block","id":152,"data":0},{"name":"minecraft:quartz_ore","id":153,"data":0},{"name":"minecraft:hopper","id":154,"data":0},{"name":"minecraft:hopper","id":154,"data":1},{"name":"minecraft:hopper","id":154,"data":2},{"name":"minecraft:hopper","id":154,"data":3},{"name":"minecraft:hopper","id":154,"data":4},{"name":"minecraft:hopper","id":154,"data":5},{"name":"minecraft:hopper","id":154,"data":6},{"name":"minecraft:hopper","id":154,"data":7},{"name":"minecraft:hopper","id":154,"data":8},{"name":"minecraft:hopper","id":154,"data":9},{"name":"minecraft:hopper","id":154,"data":10},{"name":"minecraft:hopper","id":154,"data":11},{"name":"minecraft:hopper","id":154,"data":12},{"name":"minecraft:hopper","id":154,"data":13},{"name":"minecraft:hopper","id":154,"data":14},{"name":"minecraft:hopper","id":154,"data":15},{"name":"minecraft:quartz_block","id":155,"data":0},{"name":"minecraft:quartz_block","id":155,"data":1},{"name":"minecraft:quartz_block","id":155,"data":2},{"name":"minecraft:quartz_block","id":155,"data":3},{"name":"minecraft:quartz_block","id":155,"data":4},{"name":"minecraft:quartz_block","id":155,"data":5},{"name":"minecraft:quartz_block","id":155,"data":6},{"name":"minecraft:quartz_block","id":155,"data":7},{"name":"minecraft:quartz_block","id":155,"data":8},{"name":"minecraft:quartz_block","id":155,"data":9},{"name":"minecraft:quartz_block","id":155,"data":10},{"name":"minecraft:quartz_block","id":155,"data":11},{"name":"minecraft:quartz_block","id":155,"data":12},{"name":"minecraft:quartz_block","id":155,"data":13},{"name":"minecraft:quartz_block","id":155,"data":14},{"name":"minecraft:quartz_block","id":155,"data":15},{"name":"minecraft:quartz_stairs","id":156,"data":0},{"name":"minecraft:quartz_stairs","id":156,"data":1},{"name":"minecraft:quartz_stairs","id":156,"data":2},{"name":"minecraft:quartz_stairs","id":156,"data":3},{"name":"minecraft:quartz_stairs","id":156,"data":4},{"name":"minecraft:quartz_stairs","id":156,"data":5},{"name":"minecraft:quartz_stairs","id":156,"data":6},{"name":"minecraft:quartz_stairs","id":156,"data":7},{"name":"minecraft:double_wooden_slab","id":157,"data":0},{"name":"minecraft:double_wooden_slab","id":157,"data":1},{"name":"minecraft:double_wooden_slab","id":157,"data":2},{"name":"minecraft:double_wooden_slab","id":157,"data":3},{"name":"minecraft:double_wooden_slab","id":157,"data":4},{"name":"minecraft:double_wooden_slab","id":157,"data":5},{"name":"minecraft:double_wooden_slab","id":157,"data":6},{"name":"minecraft:double_wooden_slab","id":157,"data":7},{"name":"minecraft:double_wooden_slab","id":157,"data":8},{"name":"minecraft:double_wooden_slab","id":157,"data":9},{"name":"minecraft:double_wooden_slab","id":157,"data":10},{"name":"minecraft:double_wooden_slab","id":157,"data":11},{"name":"minecraft:double_wooden_slab","id":157,"data":12},{"name":"minecraft:double_wooden_slab","id":157,"data":13},{"name":"minecraft:double_wooden_slab","id":157,"data":14},{"name":"minecraft:double_wooden_slab","id":157,"data":15},{"name":"minecraft:wooden_slab","id":158,"data":0},{"name":"minecraft:wooden_slab","id":158,"data":1},{"name":"minecraft:wooden_slab","id":158,"data":2},{"name":"minecraft:wooden_slab","id":158,"data":3},{"name":"minecraft:wooden_slab","id":158,"data":4},{"name":"minecraft:wooden_slab","id":158,"data":5},{"name":"minecraft:wooden_slab","id":158,"data":6},{"name":"minecraft:wooden_slab","id":158,"data":7},{"name":"minecraft:wooden_slab","id":158,"data":8},{"name":"minecraft:wooden_slab","id":158,"data":9},{"name":"minecraft:wooden_slab","id":158,"data":10},{"name":"minecraft:wooden_slab","id":158,"data":11},{"name":"minecraft:wooden_slab","id":158,"data":12},{"name":"minecraft:wooden_slab","id":158,"data":13},{"name":"minecraft:wooden_slab","id":158,"data":14},{"name":"minecraft:wooden_slab","id":158,"data":15},{"name":"minecraft:stained_hardened_clay","id":159,"data":0},{"name":"minecraft:stained_hardened_clay","id":159,"data":1},{"name":"minecraft:stained_hardened_clay","id":159,"data":2},{"name":"minecraft:stained_hardened_clay","id":159,"data":3},{"name":"minecraft:stained_hardened_clay","id":159,"data":4},{"name":"minecraft:stained_hardened_clay","id":159,"data":5},{"name":"minecraft:stained_hardened_clay","id":159,"data":6},{"name":"minecraft:stained_hardened_clay","id":159,"data":7},{"name":"minecraft:stained_hardened_clay","id":159,"data":8},{"name":"minecraft:stained_hardened_clay","id":159,"data":9},{"name":"minecraft:stained_hardened_clay","id":159,"data":10},{"name":"minecraft:stained_hardened_clay","id":159,"data":11},{"name":"minecraft:stained_hardened_clay","id":159,"data":12},{"name":"minecraft:stained_hardened_clay","id":159,"data":13},{"name":"minecraft:stained_hardened_clay","id":159,"data":14},{"name":"minecraft:stained_hardened_clay","id":159,"data":15},{"name":"minecraft:stained_glass_pane","id":160,"data":0},{"name":"minecraft:stained_glass_pane","id":160,"data":1},{"name":"minecraft:stained_glass_pane","id":160,"data":2},{"name":"minecraft:stained_glass_pane","id":160,"data":3},{"name":"minecraft:stained_glass_pane","id":160,"data":4},{"name":"minecraft:stained_glass_pane","id":160,"data":5},{"name":"minecraft:stained_glass_pane","id":160,"data":6},{"name":"minecraft:stained_glass_pane","id":160,"data":7},{"name":"minecraft:stained_glass_pane","id":160,"data":8},{"name":"minecraft:stained_glass_pane","id":160,"data":9},{"name":"minecraft:stained_glass_pane","id":160,"data":10},{"name":"minecraft:stained_glass_pane","id":160,"data":11},{"name":"minecraft:stained_glass_pane","id":160,"data":12},{"name":"minecraft:stained_glass_pane","id":160,"data":13},{"name":"minecraft:stained_glass_pane","id":160,"data":14},{"name":"minecraft:stained_glass_pane","id":160,"data":15},{"name":"minecraft:leaves2","id":161,"data":0},{"name":"minecraft:leaves2","id":161,"data":1},{"name":"minecraft:leaves2","id":161,"data":2},{"name":"minecraft:leaves2","id":161,"data":3},{"name":"minecraft:leaves2","id":161,"data":4},{"name":"minecraft:leaves2","id":161,"data":5},{"name":"minecraft:leaves2","id":161,"data":6},{"name":"minecraft:leaves2","id":161,"data":7},{"name":"minecraft:leaves2","id":161,"data":8},{"name":"minecraft:leaves2","id":161,"data":9},{"name":"minecraft:leaves2","id":161,"data":10},{"name":"minecraft:leaves2","id":161,"data":11},{"name":"minecraft:leaves2","id":161,"data":12},{"name":"minecraft:leaves2","id":161,"data":13},{"name":"minecraft:leaves2","id":161,"data":14},{"name":"minecraft:leaves2","id":161,"data":15},{"name":"minecraft:log2","id":162,"data":0},{"name":"minecraft:log2","id":162,"data":1},{"name":"minecraft:log2","id":162,"data":2},{"name":"minecraft:log2","id":162,"data":3},{"name":"minecraft:log2","id":162,"data":4},{"name":"minecraft:log2","id":162,"data":5},{"name":"minecraft:log2","id":162,"data":6},{"name":"minecraft:log2","id":162,"data":7},{"name":"minecraft:log2","id":162,"data":8},{"name":"minecraft:log2","id":162,"data":9},{"name":"minecraft:log2","id":162,"data":10},{"name":"minecraft:log2","id":162,"data":11},{"name":"minecraft:log2","id":162,"data":12},{"name":"minecraft:log2","id":162,"data":13},{"name":"minecraft:log2","id":162,"data":14},{"name":"minecraft:log2","id":162,"data":15},{"name":"minecraft:acacia_stairs","id":163,"data":0},{"name":"minecraft:acacia_stairs","id":163,"data":1},{"name":"minecraft:acacia_stairs","id":163,"data":2},{"name":"minecraft:acacia_stairs","id":163,"data":3},{"name":"minecraft:acacia_stairs","id":163,"data":4},{"name":"minecraft:acacia_stairs","id":163,"data":5},{"name":"minecraft:acacia_stairs","id":163,"data":6},{"name":"minecraft:acacia_stairs","id":163,"data":7},{"name":"minecraft:dark_oak_stairs","id":164,"data":0},{"name":"minecraft:dark_oak_stairs","id":164,"data":1},{"name":"minecraft:dark_oak_stairs","id":164,"data":2},{"name":"minecraft:dark_oak_stairs","id":164,"data":3},{"name":"minecraft:dark_oak_stairs","id":164,"data":4},{"name":"minecraft:dark_oak_stairs","id":164,"data":5},{"name":"minecraft:dark_oak_stairs","id":164,"data":6},{"name":"minecraft:dark_oak_stairs","id":164,"data":7},{"name":"minecraft:slime","id":165,"data":0},{"name":"minecraft:iron_trapdoor","id":167,"data":0},{"name":"minecraft:iron_trapdoor","id":167,"data":1},{"name":"minecraft:iron_trapdoor","id":167,"data":2},{"name":"minecraft:iron_trapdoor","id":167,"data":3},{"name":"minecraft:iron_trapdoor","id":167,"data":4},{"name":"minecraft:iron_trapdoor","id":167,"data":5},{"name":"minecraft:iron_trapdoor","id":167,"data":6},{"name":"minecraft:iron_trapdoor","id":167,"data":7},{"name":"minecraft:iron_trapdoor","id":167,"data":8},{"name":"minecraft:iron_trapdoor","id":167,"data":9},{"name":"minecraft:iron_trapdoor","id":167,"data":10},{"name":"minecraft:iron_trapdoor","id":167,"data":11},{"name":"minecraft:iron_trapdoor","id":167,"data":12},{"name":"minecraft:iron_trapdoor","id":167,"data":13},{"name":"minecraft:iron_trapdoor","id":167,"data":14},{"name":"minecraft:iron_trapdoor","id":167,"data":15},{"name":"minecraft:prismarine","id":168,"data":0},{"name":"minecraft:prismarine","id":168,"data":1},{"name":"minecraft:prismarine","id":168,"data":2},{"name":"minecraft:prismarine","id":168,"data":3},{"name":"minecraft:seaLantern","id":169,"data":0},{"name":"minecraft:hay_block","id":170,"data":0},{"name":"minecraft:hay_block","id":170,"data":1},{"name":"minecraft:hay_block","id":170,"data":2},{"name":"minecraft:hay_block","id":170,"data":3},{"name":"minecraft:hay_block","id":170,"data":4},{"name":"minecraft:hay_block","id":170,"data":5},{"name":"minecraft:hay_block","id":170,"data":6},{"name":"minecraft:hay_block","id":170,"data":7},{"name":"minecraft:hay_block","id":170,"data":8},{"name":"minecraft:hay_block","id":170,"data":9},{"name":"minecraft:hay_block","id":170,"data":10},{"name":"minecraft:hay_block","id":170,"data":11},{"name":"minecraft:hay_block","id":170,"data":12},{"name":"minecraft:hay_block","id":170,"data":13},{"name":"minecraft:hay_block","id":170,"data":14},{"name":"minecraft:hay_block","id":170,"data":15},{"name":"minecraft:carpet","id":171,"data":0},{"name":"minecraft:carpet","id":171,"data":1},{"name":"minecraft:carpet","id":171,"data":2},{"name":"minecraft:carpet","id":171,"data":3},{"name":"minecraft:carpet","id":171,"data":4},{"name":"minecraft:carpet","id":171,"data":5},{"name":"minecraft:carpet","id":171,"data":6},{"name":"minecraft:carpet","id":171,"data":7},{"name":"minecraft:carpet","id":171,"data":8},{"name":"minecraft:carpet","id":171,"data":9},{"name":"minecraft:carpet","id":171,"data":10},{"name":"minecraft:carpet","id":171,"data":11},{"name":"minecraft:carpet","id":171,"data":12},{"name":"minecraft:carpet","id":171,"data":13},{"name":"minecraft:carpet","id":171,"data":14},{"name":"minecraft:carpet","id":171,"data":15},{"name":"minecraft:hardened_clay","id":172,"data":0},{"name":"minecraft:coal_block","id":173,"data":0},{"name":"minecraft:packed_ice","id":174,"data":0},{"name":"minecraft:double_plant","id":175,"data":0},{"name":"minecraft:double_plant","id":175,"data":1},{"name":"minecraft:double_plant","id":175,"data":2},{"name":"minecraft:double_plant","id":175,"data":3},{"name":"minecraft:double_plant","id":175,"data":4},{"name":"minecraft:double_plant","id":175,"data":5},{"name":"minecraft:double_plant","id":175,"data":6},{"name":"minecraft:double_plant","id":175,"data":7},{"name":"minecraft:double_plant","id":175,"data":8},{"name":"minecraft:double_plant","id":175,"data":9},{"name":"minecraft:double_plant","id":175,"data":10},{"name":"minecraft:double_plant","id":175,"data":11},{"name":"minecraft:double_plant","id":175,"data":12},{"name":"minecraft:double_plant","id":175,"data":13},{"name":"minecraft:double_plant","id":175,"data":14},{"name":"minecraft:double_plant","id":175,"data":15},{"name":"minecraft:standing_banner","id":176,"data":0},{"name":"minecraft:standing_banner","id":176,"data":1},{"name":"minecraft:standing_banner","id":176,"data":2},{"name":"minecraft:standing_banner","id":176,"data":3},{"name":"minecraft:standing_banner","id":176,"data":4},{"name":"minecraft:standing_banner","id":176,"data":5},{"name":"minecraft:standing_banner","id":176,"data":6},{"name":"minecraft:standing_banner","id":176,"data":7},{"name":"minecraft:standing_banner","id":176,"data":8},{"name":"minecraft:standing_banner","id":176,"data":9},{"name":"minecraft:standing_banner","id":176,"data":10},{"name":"minecraft:standing_banner","id":176,"data":11},{"name":"minecraft:standing_banner","id":176,"data":12},{"name":"minecraft:standing_banner","id":176,"data":13},{"name":"minecraft:standing_banner","id":176,"data":14},{"name":"minecraft:standing_banner","id":176,"data":15},{"name":"minecraft:wall_banner","id":177,"data":0},{"name":"minecraft:wall_banner","id":177,"data":1},{"name":"minecraft:wall_banner","id":177,"data":2},{"name":"minecraft:wall_banner","id":177,"data":3},{"name":"minecraft:wall_banner","id":177,"data":4},{"name":"minecraft:wall_banner","id":177,"data":5},{"name":"minecraft:wall_banner","id":177,"data":6},{"name":"minecraft:wall_banner","id":177,"data":7},{"name":"minecraft:daylight_detector_inverted","id":178,"data":0},{"name":"minecraft:daylight_detector_inverted","id":178,"data":1},{"name":"minecraft:daylight_detector_inverted","id":178,"data":2},{"name":"minecraft:daylight_detector_inverted","id":178,"data":3},{"name":"minecraft:daylight_detector_inverted","id":178,"data":4},{"name":"minecraft:daylight_detector_inverted","id":178,"data":5},{"name":"minecraft:daylight_detector_inverted","id":178,"data":6},{"name":"minecraft:daylight_detector_inverted","id":178,"data":7},{"name":"minecraft:daylight_detector_inverted","id":178,"data":8},{"name":"minecraft:daylight_detector_inverted","id":178,"data":9},{"name":"minecraft:daylight_detector_inverted","id":178,"data":10},{"name":"minecraft:daylight_detector_inverted","id":178,"data":11},{"name":"minecraft:daylight_detector_inverted","id":178,"data":12},{"name":"minecraft:daylight_detector_inverted","id":178,"data":13},{"name":"minecraft:daylight_detector_inverted","id":178,"data":14},{"name":"minecraft:daylight_detector_inverted","id":178,"data":15},{"name":"minecraft:red_sandstone","id":179,"data":0},{"name":"minecraft:red_sandstone","id":179,"data":1},{"name":"minecraft:red_sandstone","id":179,"data":2},{"name":"minecraft:red_sandstone","id":179,"data":3},{"name":"minecraft:red_sandstone_stairs","id":180,"data":0},{"name":"minecraft:red_sandstone_stairs","id":180,"data":1},{"name":"minecraft:red_sandstone_stairs","id":180,"data":2},{"name":"minecraft:red_sandstone_stairs","id":180,"data":3},{"name":"minecraft:red_sandstone_stairs","id":180,"data":4},{"name":"minecraft:red_sandstone_stairs","id":180,"data":5},{"name":"minecraft:red_sandstone_stairs","id":180,"data":6},{"name":"minecraft:red_sandstone_stairs","id":180,"data":7},{"name":"minecraft:double_stone_slab2","id":181,"data":0},{"name":"minecraft:double_stone_slab2","id":181,"data":1},{"name":"minecraft:double_stone_slab2","id":181,"data":2},{"name":"minecraft:double_stone_slab2","id":181,"data":3},{"name":"minecraft:double_stone_slab2","id":181,"data":4},{"name":"minecraft:double_stone_slab2","id":181,"data":5},{"name":"minecraft:double_stone_slab2","id":181,"data":6},{"name":"minecraft:double_stone_slab2","id":181,"data":7},{"name":"minecraft:double_stone_slab2","id":181,"data":8},{"name":"minecraft:double_stone_slab2","id":181,"data":9},{"name":"minecraft:double_stone_slab2","id":181,"data":10},{"name":"minecraft:double_stone_slab2","id":181,"data":11},{"name":"minecraft:double_stone_slab2","id":181,"data":12},{"name":"minecraft:double_stone_slab2","id":181,"data":13},{"name":"minecraft:double_stone_slab2","id":181,"data":14},{"name":"minecraft:double_stone_slab2","id":181,"data":15},{"name":"minecraft:stone_slab2","id":182,"data":0},{"name":"minecraft:stone_slab2","id":182,"data":1},{"name":"minecraft:stone_slab2","id":182,"data":2},{"name":"minecraft:stone_slab2","id":182,"data":3},{"name":"minecraft:stone_slab2","id":182,"data":4},{"name":"minecraft:stone_slab2","id":182,"data":5},{"name":"minecraft:stone_slab2","id":182,"data":6},{"name":"minecraft:stone_slab2","id":182,"data":7},{"name":"minecraft:stone_slab2","id":182,"data":8},{"name":"minecraft:stone_slab2","id":182,"data":9},{"name":"minecraft:stone_slab2","id":182,"data":10},{"name":"minecraft:stone_slab2","id":182,"data":11},{"name":"minecraft:stone_slab2","id":182,"data":12},{"name":"minecraft:stone_slab2","id":182,"data":13},{"name":"minecraft:stone_slab2","id":182,"data":14},{"name":"minecraft:stone_slab2","id":182,"data":15},{"name":"minecraft:spruce_fence_gate","id":183,"data":0},{"name":"minecraft:spruce_fence_gate","id":183,"data":1},{"name":"minecraft:spruce_fence_gate","id":183,"data":2},{"name":"minecraft:spruce_fence_gate","id":183,"data":3},{"name":"minecraft:spruce_fence_gate","id":183,"data":4},{"name":"minecraft:spruce_fence_gate","id":183,"data":5},{"name":"minecraft:spruce_fence_gate","id":183,"data":6},{"name":"minecraft:spruce_fence_gate","id":183,"data":7},{"name":"minecraft:spruce_fence_gate","id":183,"data":8},{"name":"minecraft:spruce_fence_gate","id":183,"data":9},{"name":"minecraft:spruce_fence_gate","id":183,"data":10},{"name":"minecraft:spruce_fence_gate","id":183,"data":11},{"name":"minecraft:spruce_fence_gate","id":183,"data":12},{"name":"minecraft:spruce_fence_gate","id":183,"data":13},{"name":"minecraft:spruce_fence_gate","id":183,"data":14},{"name":"minecraft:spruce_fence_gate","id":183,"data":15},{"name":"minecraft:birch_fence_gate","id":184,"data":0},{"name":"minecraft:birch_fence_gate","id":184,"data":1},{"name":"minecraft:birch_fence_gate","id":184,"data":2},{"name":"minecraft:birch_fence_gate","id":184,"data":3},{"name":"minecraft:birch_fence_gate","id":184,"data":4},{"name":"minecraft:birch_fence_gate","id":184,"data":5},{"name":"minecraft:birch_fence_gate","id":184,"data":6},{"name":"minecraft:birch_fence_gate","id":184,"data":7},{"name":"minecraft:birch_fence_gate","id":184,"data":8},{"name":"minecraft:birch_fence_gate","id":184,"data":9},{"name":"minecraft:birch_fence_gate","id":184,"data":10},{"name":"minecraft:birch_fence_gate","id":184,"data":11},{"name":"minecraft:birch_fence_gate","id":184,"data":12},{"name":"minecraft:birch_fence_gate","id":184,"data":13},{"name":"minecraft:birch_fence_gate","id":184,"data":14},{"name":"minecraft:birch_fence_gate","id":184,"data":15},{"name":"minecraft:jungle_fence_gate","id":185,"data":0},{"name":"minecraft:jungle_fence_gate","id":185,"data":1},{"name":"minecraft:jungle_fence_gate","id":185,"data":2},{"name":"minecraft:jungle_fence_gate","id":185,"data":3},{"name":"minecraft:jungle_fence_gate","id":185,"data":4},{"name":"minecraft:jungle_fence_gate","id":185,"data":5},{"name":"minecraft:jungle_fence_gate","id":185,"data":6},{"name":"minecraft:jungle_fence_gate","id":185,"data":7},{"name":"minecraft:jungle_fence_gate","id":185,"data":8},{"name":"minecraft:jungle_fence_gate","id":185,"data":9},{"name":"minecraft:jungle_fence_gate","id":185,"data":10},{"name":"minecraft:jungle_fence_gate","id":185,"data":11},{"name":"minecraft:jungle_fence_gate","id":185,"data":12},{"name":"minecraft:jungle_fence_gate","id":185,"data":13},{"name":"minecraft:jungle_fence_gate","id":185,"data":14},{"name":"minecraft:jungle_fence_gate","id":185,"data":15},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":0},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":1},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":2},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":3},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":4},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":5},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":6},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":7},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":8},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":9},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":10},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":11},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":12},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":13},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":14},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":15},{"name":"minecraft:acacia_fence_gate","id":187,"data":0},{"name":"minecraft:acacia_fence_gate","id":187,"data":1},{"name":"minecraft:acacia_fence_gate","id":187,"data":2},{"name":"minecraft:acacia_fence_gate","id":187,"data":3},{"name":"minecraft:acacia_fence_gate","id":187,"data":4},{"name":"minecraft:acacia_fence_gate","id":187,"data":5},{"name":"minecraft:acacia_fence_gate","id":187,"data":6},{"name":"minecraft:acacia_fence_gate","id":187,"data":7},{"name":"minecraft:acacia_fence_gate","id":187,"data":8},{"name":"minecraft:acacia_fence_gate","id":187,"data":9},{"name":"minecraft:acacia_fence_gate","id":187,"data":10},{"name":"minecraft:acacia_fence_gate","id":187,"data":11},{"name":"minecraft:acacia_fence_gate","id":187,"data":12},{"name":"minecraft:acacia_fence_gate","id":187,"data":13},{"name":"minecraft:acacia_fence_gate","id":187,"data":14},{"name":"minecraft:acacia_fence_gate","id":187,"data":15},{"name":"minecraft:repeating_command_block","id":188,"data":0},{"name":"minecraft:repeating_command_block","id":188,"data":1},{"name":"minecraft:repeating_command_block","id":188,"data":2},{"name":"minecraft:repeating_command_block","id":188,"data":3},{"name":"minecraft:repeating_command_block","id":188,"data":4},{"name":"minecraft:repeating_command_block","id":188,"data":5},{"name":"minecraft:repeating_command_block","id":188,"data":6},{"name":"minecraft:repeating_command_block","id":188,"data":7},{"name":"minecraft:repeating_command_block","id":188,"data":8},{"name":"minecraft:repeating_command_block","id":188,"data":9},{"name":"minecraft:repeating_command_block","id":188,"data":10},{"name":"minecraft:repeating_command_block","id":188,"data":11},{"name":"minecraft:repeating_command_block","id":188,"data":12},{"name":"minecraft:repeating_command_block","id":188,"data":13},{"name":"minecraft:repeating_command_block","id":188,"data":14},{"name":"minecraft:repeating_command_block","id":188,"data":15},{"name":"minecraft:chain_command_block","id":189,"data":0},{"name":"minecraft:chain_command_block","id":189,"data":1},{"name":"minecraft:chain_command_block","id":189,"data":2},{"name":"minecraft:chain_command_block","id":189,"data":3},{"name":"minecraft:chain_command_block","id":189,"data":4},{"name":"minecraft:chain_command_block","id":189,"data":5},{"name":"minecraft:chain_command_block","id":189,"data":6},{"name":"minecraft:chain_command_block","id":189,"data":7},{"name":"minecraft:chain_command_block","id":189,"data":8},{"name":"minecraft:chain_command_block","id":189,"data":9},{"name":"minecraft:chain_command_block","id":189,"data":10},{"name":"minecraft:chain_command_block","id":189,"data":11},{"name":"minecraft:chain_command_block","id":189,"data":12},{"name":"minecraft:chain_command_block","id":189,"data":13},{"name":"minecraft:chain_command_block","id":189,"data":14},{"name":"minecraft:chain_command_block","id":189,"data":15},{"name":"minecraft:hard_glass_pane","id":190,"data":0},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":0},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":1},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":2},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":3},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":4},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":5},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":6},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":7},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":8},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":9},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":10},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":11},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":12},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":13},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":14},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":15},{"name":"minecraft:chemical_heat","id":192,"data":0},{"name":"minecraft:spruce_door","id":193,"data":0},{"name":"minecraft:spruce_door","id":193,"data":1},{"name":"minecraft:spruce_door","id":193,"data":2},{"name":"minecraft:spruce_door","id":193,"data":3},{"name":"minecraft:spruce_door","id":193,"data":4},{"name":"minecraft:spruce_door","id":193,"data":5},{"name":"minecraft:spruce_door","id":193,"data":6},{"name":"minecraft:spruce_door","id":193,"data":7},{"name":"minecraft:spruce_door","id":193,"data":8},{"name":"minecraft:spruce_door","id":193,"data":9},{"name":"minecraft:spruce_door","id":193,"data":10},{"name":"minecraft:spruce_door","id":193,"data":11},{"name":"minecraft:spruce_door","id":193,"data":12},{"name":"minecraft:spruce_door","id":193,"data":13},{"name":"minecraft:spruce_door","id":193,"data":14},{"name":"minecraft:spruce_door","id":193,"data":15},{"name":"minecraft:birch_door","id":194,"data":0},{"name":"minecraft:birch_door","id":194,"data":1},{"name":"minecraft:birch_door","id":194,"data":2},{"name":"minecraft:birch_door","id":194,"data":3},{"name":"minecraft:birch_door","id":194,"data":4},{"name":"minecraft:birch_door","id":194,"data":5},{"name":"minecraft:birch_door","id":194,"data":6},{"name":"minecraft:birch_door","id":194,"data":7},{"name":"minecraft:birch_door","id":194,"data":8},{"name":"minecraft:birch_door","id":194,"data":9},{"name":"minecraft:birch_door","id":194,"data":10},{"name":"minecraft:birch_door","id":194,"data":11},{"name":"minecraft:birch_door","id":194,"data":12},{"name":"minecraft:birch_door","id":194,"data":13},{"name":"minecraft:birch_door","id":194,"data":14},{"name":"minecraft:birch_door","id":194,"data":15},{"name":"minecraft:jungle_door","id":195,"data":0},{"name":"minecraft:jungle_door","id":195,"data":1},{"name":"minecraft:jungle_door","id":195,"data":2},{"name":"minecraft:jungle_door","id":195,"data":3},{"name":"minecraft:jungle_door","id":195,"data":4},{"name":"minecraft:jungle_door","id":195,"data":5},{"name":"minecraft:jungle_door","id":195,"data":6},{"name":"minecraft:jungle_door","id":195,"data":7},{"name":"minecraft:jungle_door","id":195,"data":8},{"name":"minecraft:jungle_door","id":195,"data":9},{"name":"minecraft:jungle_door","id":195,"data":10},{"name":"minecraft:jungle_door","id":195,"data":11},{"name":"minecraft:jungle_door","id":195,"data":12},{"name":"minecraft:jungle_door","id":195,"data":13},{"name":"minecraft:jungle_door","id":195,"data":14},{"name":"minecraft:jungle_door","id":195,"data":15},{"name":"minecraft:acacia_door","id":196,"data":0},{"name":"minecraft:acacia_door","id":196,"data":1},{"name":"minecraft:acacia_door","id":196,"data":2},{"name":"minecraft:acacia_door","id":196,"data":3},{"name":"minecraft:acacia_door","id":196,"data":4},{"name":"minecraft:acacia_door","id":196,"data":5},{"name":"minecraft:acacia_door","id":196,"data":6},{"name":"minecraft:acacia_door","id":196,"data":7},{"name":"minecraft:acacia_door","id":196,"data":8},{"name":"minecraft:acacia_door","id":196,"data":9},{"name":"minecraft:acacia_door","id":196,"data":10},{"name":"minecraft:acacia_door","id":196,"data":11},{"name":"minecraft:acacia_door","id":196,"data":12},{"name":"minecraft:acacia_door","id":196,"data":13},{"name":"minecraft:acacia_door","id":196,"data":14},{"name":"minecraft:acacia_door","id":196,"data":15},{"name":"minecraft:dark_oak_door","id":197,"data":0},{"name":"minecraft:dark_oak_door","id":197,"data":1},{"name":"minecraft:dark_oak_door","id":197,"data":2},{"name":"minecraft:dark_oak_door","id":197,"data":3},{"name":"minecraft:dark_oak_door","id":197,"data":4},{"name":"minecraft:dark_oak_door","id":197,"data":5},{"name":"minecraft:dark_oak_door","id":197,"data":6},{"name":"minecraft:dark_oak_door","id":197,"data":7},{"name":"minecraft:dark_oak_door","id":197,"data":8},{"name":"minecraft:dark_oak_door","id":197,"data":9},{"name":"minecraft:dark_oak_door","id":197,"data":10},{"name":"minecraft:dark_oak_door","id":197,"data":11},{"name":"minecraft:dark_oak_door","id":197,"data":12},{"name":"minecraft:dark_oak_door","id":197,"data":13},{"name":"minecraft:dark_oak_door","id":197,"data":14},{"name":"minecraft:dark_oak_door","id":197,"data":15},{"name":"minecraft:grass_path","id":198,"data":0},{"name":"minecraft:frame","id":199,"data":0},{"name":"minecraft:frame","id":199,"data":1},{"name":"minecraft:frame","id":199,"data":2},{"name":"minecraft:frame","id":199,"data":3},{"name":"minecraft:frame","id":199,"data":4},{"name":"minecraft:frame","id":199,"data":5},{"name":"minecraft:frame","id":199,"data":6},{"name":"minecraft:frame","id":199,"data":7},{"name":"minecraft:chorus_flower","id":200,"data":0},{"name":"minecraft:chorus_flower","id":200,"data":1},{"name":"minecraft:chorus_flower","id":200,"data":2},{"name":"minecraft:chorus_flower","id":200,"data":3},{"name":"minecraft:chorus_flower","id":200,"data":4},{"name":"minecraft:chorus_flower","id":200,"data":5},{"name":"minecraft:chorus_flower","id":200,"data":6},{"name":"minecraft:chorus_flower","id":200,"data":7},{"name":"minecraft:purpur_block","id":201,"data":0},{"name":"minecraft:purpur_block","id":201,"data":1},{"name":"minecraft:purpur_block","id":201,"data":2},{"name":"minecraft:purpur_block","id":201,"data":3},{"name":"minecraft:purpur_block","id":201,"data":4},{"name":"minecraft:purpur_block","id":201,"data":5},{"name":"minecraft:purpur_block","id":201,"data":6},{"name":"minecraft:purpur_block","id":201,"data":7},{"name":"minecraft:purpur_block","id":201,"data":8},{"name":"minecraft:purpur_block","id":201,"data":9},{"name":"minecraft:purpur_block","id":201,"data":10},{"name":"minecraft:purpur_block","id":201,"data":11},{"name":"minecraft:purpur_block","id":201,"data":12},{"name":"minecraft:purpur_block","id":201,"data":13},{"name":"minecraft:purpur_block","id":201,"data":14},{"name":"minecraft:purpur_block","id":201,"data":15},{"name":"minecraft:colored_torch_rg","id":202,"data":0},{"name":"minecraft:colored_torch_rg","id":202,"data":1},{"name":"minecraft:colored_torch_rg","id":202,"data":2},{"name":"minecraft:colored_torch_rg","id":202,"data":3},{"name":"minecraft:colored_torch_rg","id":202,"data":4},{"name":"minecraft:colored_torch_rg","id":202,"data":5},{"name":"minecraft:colored_torch_rg","id":202,"data":6},{"name":"minecraft:colored_torch_rg","id":202,"data":7},{"name":"minecraft:colored_torch_rg","id":202,"data":8},{"name":"minecraft:colored_torch_rg","id":202,"data":9},{"name":"minecraft:colored_torch_rg","id":202,"data":10},{"name":"minecraft:colored_torch_rg","id":202,"data":11},{"name":"minecraft:colored_torch_rg","id":202,"data":12},{"name":"minecraft:colored_torch_rg","id":202,"data":13},{"name":"minecraft:colored_torch_rg","id":202,"data":14},{"name":"minecraft:colored_torch_rg","id":202,"data":15},{"name":"minecraft:purpur_stairs","id":203,"data":0},{"name":"minecraft:purpur_stairs","id":203,"data":1},{"name":"minecraft:purpur_stairs","id":203,"data":2},{"name":"minecraft:purpur_stairs","id":203,"data":3},{"name":"minecraft:purpur_stairs","id":203,"data":4},{"name":"minecraft:purpur_stairs","id":203,"data":5},{"name":"minecraft:purpur_stairs","id":203,"data":6},{"name":"minecraft:purpur_stairs","id":203,"data":7},{"name":"minecraft:colored_torch_bp","id":204,"data":0},{"name":"minecraft:colored_torch_bp","id":204,"data":1},{"name":"minecraft:colored_torch_bp","id":204,"data":2},{"name":"minecraft:colored_torch_bp","id":204,"data":3},{"name":"minecraft:colored_torch_bp","id":204,"data":4},{"name":"minecraft:colored_torch_bp","id":204,"data":5},{"name":"minecraft:colored_torch_bp","id":204,"data":6},{"name":"minecraft:colored_torch_bp","id":204,"data":7},{"name":"minecraft:colored_torch_bp","id":204,"data":8},{"name":"minecraft:colored_torch_bp","id":204,"data":9},{"name":"minecraft:colored_torch_bp","id":204,"data":10},{"name":"minecraft:colored_torch_bp","id":204,"data":11},{"name":"minecraft:colored_torch_bp","id":204,"data":12},{"name":"minecraft:colored_torch_bp","id":204,"data":13},{"name":"minecraft:colored_torch_bp","id":204,"data":14},{"name":"minecraft:colored_torch_bp","id":204,"data":15},{"name":"minecraft:undyed_shulker_box","id":205,"data":0},{"name":"minecraft:end_bricks","id":206,"data":0},{"name":"minecraft:frosted_ice","id":207,"data":0},{"name":"minecraft:frosted_ice","id":207,"data":1},{"name":"minecraft:frosted_ice","id":207,"data":2},{"name":"minecraft:frosted_ice","id":207,"data":3},{"name":"minecraft:end_rod","id":208,"data":0},{"name":"minecraft:end_rod","id":208,"data":1},{"name":"minecraft:end_rod","id":208,"data":2},{"name":"minecraft:end_rod","id":208,"data":3},{"name":"minecraft:end_rod","id":208,"data":4},{"name":"minecraft:end_rod","id":208,"data":5},{"name":"minecraft:end_rod","id":208,"data":6},{"name":"minecraft:end_rod","id":208,"data":7},{"name":"minecraft:end_gateway","id":209,"data":0},{"name":"minecraft:magma","id":213,"data":0},{"name":"minecraft:nether_wart_block","id":214,"data":0},{"name":"minecraft:red_nether_brick","id":215,"data":0},{"name":"minecraft:bone_block","id":216,"data":0},{"name":"minecraft:bone_block","id":216,"data":1},{"name":"minecraft:bone_block","id":216,"data":2},{"name":"minecraft:bone_block","id":216,"data":3},{"name":"minecraft:bone_block","id":216,"data":4},{"name":"minecraft:bone_block","id":216,"data":5},{"name":"minecraft:bone_block","id":216,"data":6},{"name":"minecraft:bone_block","id":216,"data":7},{"name":"minecraft:bone_block","id":216,"data":8},{"name":"minecraft:bone_block","id":216,"data":9},{"name":"minecraft:bone_block","id":216,"data":10},{"name":"minecraft:bone_block","id":216,"data":11},{"name":"minecraft:bone_block","id":216,"data":12},{"name":"minecraft:bone_block","id":216,"data":13},{"name":"minecraft:bone_block","id":216,"data":14},{"name":"minecraft:bone_block","id":216,"data":15},{"name":"minecraft:shulker_box","id":218,"data":0},{"name":"minecraft:shulker_box","id":218,"data":1},{"name":"minecraft:shulker_box","id":218,"data":2},{"name":"minecraft:shulker_box","id":218,"data":3},{"name":"minecraft:shulker_box","id":218,"data":4},{"name":"minecraft:shulker_box","id":218,"data":5},{"name":"minecraft:shulker_box","id":218,"data":6},{"name":"minecraft:shulker_box","id":218,"data":7},{"name":"minecraft:shulker_box","id":218,"data":8},{"name":"minecraft:shulker_box","id":218,"data":9},{"name":"minecraft:shulker_box","id":218,"data":10},{"name":"minecraft:shulker_box","id":218,"data":11},{"name":"minecraft:shulker_box","id":218,"data":12},{"name":"minecraft:shulker_box","id":218,"data":13},{"name":"minecraft:shulker_box","id":218,"data":14},{"name":"minecraft:shulker_box","id":218,"data":15},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":0},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":1},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":2},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":3},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":4},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":5},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":6},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":7},{"name":"minecraft:white_glazed_terracotta","id":220,"data":0},{"name":"minecraft:white_glazed_terracotta","id":220,"data":1},{"name":"minecraft:white_glazed_terracotta","id":220,"data":2},{"name":"minecraft:white_glazed_terracotta","id":220,"data":3},{"name":"minecraft:white_glazed_terracotta","id":220,"data":4},{"name":"minecraft:white_glazed_terracotta","id":220,"data":5},{"name":"minecraft:white_glazed_terracotta","id":220,"data":6},{"name":"minecraft:white_glazed_terracotta","id":220,"data":7},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":0},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":1},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":2},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":3},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":4},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":5},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":6},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":7},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":0},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":1},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":2},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":3},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":4},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":5},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":6},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":7},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":0},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":1},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":2},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":3},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":4},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":5},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":6},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":7},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":0},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":1},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":2},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":3},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":4},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":5},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":6},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":7},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":0},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":1},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":2},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":3},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":4},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":5},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":6},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":7},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":0},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":1},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":2},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":3},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":4},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":5},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":6},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":7},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":0},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":1},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":2},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":3},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":4},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":5},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":6},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":7},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":0},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":1},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":2},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":3},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":4},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":5},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":6},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":7},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":0},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":1},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":2},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":3},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":4},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":5},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":6},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":7},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":0},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":1},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":2},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":3},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":4},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":5},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":6},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":7},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":0},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":1},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":2},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":3},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":4},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":5},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":6},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":7},{"name":"minecraft:green_glazed_terracotta","id":233,"data":0},{"name":"minecraft:green_glazed_terracotta","id":233,"data":1},{"name":"minecraft:green_glazed_terracotta","id":233,"data":2},{"name":"minecraft:green_glazed_terracotta","id":233,"data":3},{"name":"minecraft:green_glazed_terracotta","id":233,"data":4},{"name":"minecraft:green_glazed_terracotta","id":233,"data":5},{"name":"minecraft:green_glazed_terracotta","id":233,"data":6},{"name":"minecraft:green_glazed_terracotta","id":233,"data":7},{"name":"minecraft:red_glazed_terracotta","id":234,"data":0},{"name":"minecraft:red_glazed_terracotta","id":234,"data":1},{"name":"minecraft:red_glazed_terracotta","id":234,"data":2},{"name":"minecraft:red_glazed_terracotta","id":234,"data":3},{"name":"minecraft:red_glazed_terracotta","id":234,"data":4},{"name":"minecraft:red_glazed_terracotta","id":234,"data":5},{"name":"minecraft:red_glazed_terracotta","id":234,"data":6},{"name":"minecraft:red_glazed_terracotta","id":234,"data":7},{"name":"minecraft:black_glazed_terracotta","id":235,"data":0},{"name":"minecraft:black_glazed_terracotta","id":235,"data":1},{"name":"minecraft:black_glazed_terracotta","id":235,"data":2},{"name":"minecraft:black_glazed_terracotta","id":235,"data":3},{"name":"minecraft:black_glazed_terracotta","id":235,"data":4},{"name":"minecraft:black_glazed_terracotta","id":235,"data":5},{"name":"minecraft:black_glazed_terracotta","id":235,"data":6},{"name":"minecraft:black_glazed_terracotta","id":235,"data":7},{"name":"minecraft:concrete","id":236,"data":0},{"name":"minecraft:concrete","id":236,"data":1},{"name":"minecraft:concrete","id":236,"data":2},{"name":"minecraft:concrete","id":236,"data":3},{"name":"minecraft:concrete","id":236,"data":4},{"name":"minecraft:concrete","id":236,"data":5},{"name":"minecraft:concrete","id":236,"data":6},{"name":"minecraft:concrete","id":236,"data":7},{"name":"minecraft:concrete","id":236,"data":8},{"name":"minecraft:concrete","id":236,"data":9},{"name":"minecraft:concrete","id":236,"data":10},{"name":"minecraft:concrete","id":236,"data":11},{"name":"minecraft:concrete","id":236,"data":12},{"name":"minecraft:concrete","id":236,"data":13},{"name":"minecraft:concrete","id":236,"data":14},{"name":"minecraft:concrete","id":236,"data":15},{"name":"minecraft:concretePowder","id":237,"data":0},{"name":"minecraft:concretePowder","id":237,"data":1},{"name":"minecraft:concretePowder","id":237,"data":2},{"name":"minecraft:concretePowder","id":237,"data":3},{"name":"minecraft:concretePowder","id":237,"data":4},{"name":"minecraft:concretePowder","id":237,"data":5},{"name":"minecraft:concretePowder","id":237,"data":6},{"name":"minecraft:concretePowder","id":237,"data":7},{"name":"minecraft:concretePowder","id":237,"data":8},{"name":"minecraft:concretePowder","id":237,"data":9},{"name":"minecraft:concretePowder","id":237,"data":10},{"name":"minecraft:concretePowder","id":237,"data":11},{"name":"minecraft:concretePowder","id":237,"data":12},{"name":"minecraft:concretePowder","id":237,"data":13},{"name":"minecraft:concretePowder","id":237,"data":14},{"name":"minecraft:concretePowder","id":237,"data":15},{"name":"minecraft:chemistry_table","id":238,"data":0},{"name":"minecraft:chemistry_table","id":238,"data":1},{"name":"minecraft:chemistry_table","id":238,"data":2},{"name":"minecraft:chemistry_table","id":238,"data":3},{"name":"minecraft:chemistry_table","id":238,"data":4},{"name":"minecraft:chemistry_table","id":238,"data":5},{"name":"minecraft:chemistry_table","id":238,"data":6},{"name":"minecraft:chemistry_table","id":238,"data":7},{"name":"minecraft:chemistry_table","id":238,"data":8},{"name":"minecraft:chemistry_table","id":238,"data":9},{"name":"minecraft:chemistry_table","id":238,"data":10},{"name":"minecraft:chemistry_table","id":238,"data":11},{"name":"minecraft:chemistry_table","id":238,"data":12},{"name":"minecraft:chemistry_table","id":238,"data":13},{"name":"minecraft:chemistry_table","id":238,"data":14},{"name":"minecraft:chemistry_table","id":238,"data":15},{"name":"minecraft:underwater_torch","id":239,"data":0},{"name":"minecraft:underwater_torch","id":239,"data":1},{"name":"minecraft:underwater_torch","id":239,"data":2},{"name":"minecraft:underwater_torch","id":239,"data":3},{"name":"minecraft:underwater_torch","id":239,"data":4},{"name":"minecraft:underwater_torch","id":239,"data":5},{"name":"minecraft:underwater_torch","id":239,"data":6},{"name":"minecraft:underwater_torch","id":239,"data":7},{"name":"minecraft:chorus_plant","id":240,"data":0},{"name":"minecraft:stained_glass","id":241,"data":0},{"name":"minecraft:stained_glass","id":241,"data":1},{"name":"minecraft:stained_glass","id":241,"data":2},{"name":"minecraft:stained_glass","id":241,"data":3},{"name":"minecraft:stained_glass","id":241,"data":4},{"name":"minecraft:stained_glass","id":241,"data":5},{"name":"minecraft:stained_glass","id":241,"data":6},{"name":"minecraft:stained_glass","id":241,"data":7},{"name":"minecraft:stained_glass","id":241,"data":8},{"name":"minecraft:stained_glass","id":241,"data":9},{"name":"minecraft:stained_glass","id":241,"data":10},{"name":"minecraft:stained_glass","id":241,"data":11},{"name":"minecraft:stained_glass","id":241,"data":12},{"name":"minecraft:stained_glass","id":241,"data":13},{"name":"minecraft:stained_glass","id":241,"data":14},{"name":"minecraft:stained_glass","id":241,"data":15},{"name":"minecraft:podzol","id":243,"data":0},{"name":"minecraft:beetroot","id":244,"data":0},{"name":"minecraft:beetroot","id":244,"data":1},{"name":"minecraft:beetroot","id":244,"data":2},{"name":"minecraft:beetroot","id":244,"data":3},{"name":"minecraft:beetroot","id":244,"data":4},{"name":"minecraft:beetroot","id":244,"data":5},{"name":"minecraft:beetroot","id":244,"data":6},{"name":"minecraft:beetroot","id":244,"data":7},{"name":"minecraft:stonecutter","id":245,"data":0},{"name":"minecraft:glowingobsidian","id":246,"data":0},{"name":"minecraft:netherreactor","id":247,"data":0},{"name":"minecraft:info_update","id":248,"data":0},{"name":"minecraft:info_update2","id":249,"data":0},{"name":"minecraft:movingBlock","id":250,"data":0},{"name":"minecraft:observer","id":251,"data":0},{"name":"minecraft:observer","id":251,"data":1},{"name":"minecraft:observer","id":251,"data":2},{"name":"minecraft:observer","id":251,"data":3},{"name":"minecraft:observer","id":251,"data":4},{"name":"minecraft:observer","id":251,"data":5},{"name":"minecraft:observer","id":251,"data":6},{"name":"minecraft:observer","id":251,"data":7},{"name":"minecraft:observer","id":251,"data":8},{"name":"minecraft:observer","id":251,"data":9},{"name":"minecraft:observer","id":251,"data":10},{"name":"minecraft:observer","id":251,"data":11},{"name":"minecraft:observer","id":251,"data":12},{"name":"minecraft:observer","id":251,"data":13},{"name":"minecraft:observer","id":251,"data":14},{"name":"minecraft:observer","id":251,"data":15},{"name":"minecraft:structure_block","id":252,"data":0},{"name":"minecraft:structure_block","id":252,"data":1},{"name":"minecraft:structure_block","id":252,"data":2},{"name":"minecraft:structure_block","id":252,"data":3},{"name":"minecraft:structure_block","id":252,"data":4},{"name":"minecraft:structure_block","id":252,"data":5},{"name":"minecraft:structure_block","id":252,"data":6},{"name":"minecraft:structure_block","id":252,"data":7},{"name":"minecraft:hard_glass","id":253,"data":0},{"name":"minecraft:hard_stained_glass","id":254,"data":0},{"name":"minecraft:hard_stained_glass","id":254,"data":1},{"name":"minecraft:hard_stained_glass","id":254,"data":2},{"name":"minecraft:hard_stained_glass","id":254,"data":3},{"name":"minecraft:hard_stained_glass","id":254,"data":4},{"name":"minecraft:hard_stained_glass","id":254,"data":5},{"name":"minecraft:hard_stained_glass","id":254,"data":6},{"name":"minecraft:hard_stained_glass","id":254,"data":7},{"name":"minecraft:hard_stained_glass","id":254,"data":8},{"name":"minecraft:hard_stained_glass","id":254,"data":9},{"name":"minecraft:hard_stained_glass","id":254,"data":10},{"name":"minecraft:hard_stained_glass","id":254,"data":11},{"name":"minecraft:hard_stained_glass","id":254,"data":12},{"name":"minecraft:hard_stained_glass","id":254,"data":13},{"name":"minecraft:hard_stained_glass","id":254,"data":14},{"name":"minecraft:hard_stained_glass","id":254,"data":15},{"name":"minecraft:reserved6","id":255,"data":0},{"name":"minecraft:prismarine_stairs","id":257,"data":0},{"name":"minecraft:prismarine_stairs","id":257,"data":1},{"name":"minecraft:prismarine_stairs","id":257,"data":2},{"name":"minecraft:prismarine_stairs","id":257,"data":3},{"name":"minecraft:prismarine_stairs","id":257,"data":4},{"name":"minecraft:prismarine_stairs","id":257,"data":5},{"name":"minecraft:prismarine_stairs","id":257,"data":6},{"name":"minecraft:prismarine_stairs","id":257,"data":7},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":0},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":1},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":2},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":3},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":4},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":5},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":6},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":7},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":0},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":1},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":2},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":3},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":4},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":5},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":6},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":7},{"name":"minecraft:stripped_spruce_log","id":260,"data":0},{"name":"minecraft:stripped_spruce_log","id":260,"data":1},{"name":"minecraft:stripped_spruce_log","id":260,"data":2},{"name":"minecraft:stripped_spruce_log","id":260,"data":3},{"name":"minecraft:stripped_birch_log","id":261,"data":0},{"name":"minecraft:stripped_birch_log","id":261,"data":1},{"name":"minecraft:stripped_birch_log","id":261,"data":2},{"name":"minecraft:stripped_birch_log","id":261,"data":3},{"name":"minecraft:stripped_jungle_log","id":262,"data":0},{"name":"minecraft:stripped_jungle_log","id":262,"data":1},{"name":"minecraft:stripped_jungle_log","id":262,"data":2},{"name":"minecraft:stripped_jungle_log","id":262,"data":3},{"name":"minecraft:stripped_acacia_log","id":263,"data":0},{"name":"minecraft:stripped_acacia_log","id":263,"data":1},{"name":"minecraft:stripped_acacia_log","id":263,"data":2},{"name":"minecraft:stripped_acacia_log","id":263,"data":3},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":0},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":1},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":2},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":3},{"name":"minecraft:stripped_oak_log","id":265,"data":0},{"name":"minecraft:stripped_oak_log","id":265,"data":1},{"name":"minecraft:stripped_oak_log","id":265,"data":2},{"name":"minecraft:stripped_oak_log","id":265,"data":3},{"name":"minecraft:blue_ice","id":266,"data":0},{"name":"minecraft:element_1","id":267,"data":0},{"name":"minecraft:element_2","id":268,"data":0},{"name":"minecraft:element_3","id":269,"data":0},{"name":"minecraft:element_4","id":270,"data":0},{"name":"minecraft:element_5","id":271,"data":0},{"name":"minecraft:element_6","id":272,"data":0},{"name":"minecraft:element_7","id":273,"data":0},{"name":"minecraft:element_8","id":274,"data":0},{"name":"minecraft:element_9","id":275,"data":0},{"name":"minecraft:element_10","id":276,"data":0},{"name":"minecraft:element_11","id":277,"data":0},{"name":"minecraft:element_12","id":278,"data":0},{"name":"minecraft:element_13","id":279,"data":0},{"name":"minecraft:element_14","id":280,"data":0},{"name":"minecraft:element_15","id":281,"data":0},{"name":"minecraft:element_16","id":282,"data":0},{"name":"minecraft:element_17","id":283,"data":0},{"name":"minecraft:element_18","id":284,"data":0},{"name":"minecraft:element_19","id":285,"data":0},{"name":"minecraft:element_20","id":286,"data":0},{"name":"minecraft:element_21","id":287,"data":0},{"name":"minecraft:element_22","id":288,"data":0},{"name":"minecraft:element_23","id":289,"data":0},{"name":"minecraft:element_24","id":290,"data":0},{"name":"minecraft:element_25","id":291,"data":0},{"name":"minecraft:element_26","id":292,"data":0},{"name":"minecraft:element_27","id":293,"data":0},{"name":"minecraft:element_28","id":294,"data":0},{"name":"minecraft:element_29","id":295,"data":0},{"name":"minecraft:element_30","id":296,"data":0},{"name":"minecraft:element_31","id":297,"data":0},{"name":"minecraft:element_32","id":298,"data":0},{"name":"minecraft:element_33","id":299,"data":0},{"name":"minecraft:element_34","id":300,"data":0},{"name":"minecraft:element_35","id":301,"data":0},{"name":"minecraft:element_36","id":302,"data":0},{"name":"minecraft:element_37","id":303,"data":0},{"name":"minecraft:element_38","id":304,"data":0},{"name":"minecraft:element_39","id":305,"data":0},{"name":"minecraft:element_40","id":306,"data":0},{"name":"minecraft:element_41","id":307,"data":0},{"name":"minecraft:element_42","id":308,"data":0},{"name":"minecraft:element_43","id":309,"data":0},{"name":"minecraft:element_44","id":310,"data":0},{"name":"minecraft:element_45","id":311,"data":0},{"name":"minecraft:element_46","id":312,"data":0},{"name":"minecraft:element_47","id":313,"data":0},{"name":"minecraft:element_48","id":314,"data":0},{"name":"minecraft:element_49","id":315,"data":0},{"name":"minecraft:element_50","id":316,"data":0},{"name":"minecraft:element_51","id":317,"data":0},{"name":"minecraft:element_52","id":318,"data":0},{"name":"minecraft:element_53","id":319,"data":0},{"name":"minecraft:element_54","id":320,"data":0},{"name":"minecraft:element_55","id":321,"data":0},{"name":"minecraft:element_56","id":322,"data":0},{"name":"minecraft:element_57","id":323,"data":0},{"name":"minecraft:element_58","id":324,"data":0},{"name":"minecraft:element_59","id":325,"data":0},{"name":"minecraft:element_60","id":326,"data":0},{"name":"minecraft:element_61","id":327,"data":0},{"name":"minecraft:element_62","id":328,"data":0},{"name":"minecraft:element_63","id":329,"data":0},{"name":"minecraft:element_64","id":330,"data":0},{"name":"minecraft:element_65","id":331,"data":0},{"name":"minecraft:element_66","id":332,"data":0},{"name":"minecraft:element_67","id":333,"data":0},{"name":"minecraft:element_68","id":334,"data":0},{"name":"minecraft:element_69","id":335,"data":0},{"name":"minecraft:element_70","id":336,"data":0},{"name":"minecraft:element_71","id":337,"data":0},{"name":"minecraft:element_72","id":338,"data":0},{"name":"minecraft:element_73","id":339,"data":0},{"name":"minecraft:element_74","id":340,"data":0},{"name":"minecraft:element_75","id":341,"data":0},{"name":"minecraft:element_76","id":342,"data":0},{"name":"minecraft:element_77","id":343,"data":0},{"name":"minecraft:element_78","id":344,"data":0},{"name":"minecraft:element_79","id":345,"data":0},{"name":"minecraft:element_80","id":346,"data":0},{"name":"minecraft:element_81","id":347,"data":0},{"name":"minecraft:element_82","id":348,"data":0},{"name":"minecraft:element_83","id":349,"data":0},{"name":"minecraft:element_84","id":350,"data":0},{"name":"minecraft:element_85","id":351,"data":0},{"name":"minecraft:element_86","id":352,"data":0},{"name":"minecraft:element_87","id":353,"data":0},{"name":"minecraft:element_88","id":354,"data":0},{"name":"minecraft:element_89","id":355,"data":0},{"name":"minecraft:element_90","id":356,"data":0},{"name":"minecraft:element_91","id":357,"data":0},{"name":"minecraft:element_92","id":358,"data":0},{"name":"minecraft:element_93","id":359,"data":0},{"name":"minecraft:element_94","id":360,"data":0},{"name":"minecraft:element_95","id":361,"data":0},{"name":"minecraft:element_96","id":362,"data":0},{"name":"minecraft:element_97","id":363,"data":0},{"name":"minecraft:element_98","id":364,"data":0},{"name":"minecraft:element_99","id":365,"data":0},{"name":"minecraft:element_100","id":366,"data":0},{"name":"minecraft:element_101","id":367,"data":0},{"name":"minecraft:element_102","id":368,"data":0},{"name":"minecraft:element_103","id":369,"data":0},{"name":"minecraft:element_104","id":370,"data":0},{"name":"minecraft:element_105","id":371,"data":0},{"name":"minecraft:element_106","id":372,"data":0},{"name":"minecraft:element_107","id":373,"data":0},{"name":"minecraft:element_108","id":374,"data":0},{"name":"minecraft:element_109","id":375,"data":0},{"name":"minecraft:element_110","id":376,"data":0},{"name":"minecraft:element_111","id":377,"data":0},{"name":"minecraft:element_112","id":378,"data":0},{"name":"minecraft:element_113","id":379,"data":0},{"name":"minecraft:element_114","id":380,"data":0},{"name":"minecraft:element_115","id":381,"data":0},{"name":"minecraft:element_116","id":382,"data":0},{"name":"minecraft:element_117","id":383,"data":0},{"name":"minecraft:element_118","id":384,"data":0},{"name":"minecraft:seagrass","id":385,"data":0},{"name":"minecraft:seagrass","id":385,"data":1},{"name":"minecraft:seagrass","id":385,"data":2},{"name":"minecraft:seagrass","id":385,"data":3},{"name":"minecraft:coral","id":386,"data":0},{"name":"minecraft:coral","id":386,"data":1},{"name":"minecraft:coral","id":386,"data":2},{"name":"minecraft:coral","id":386,"data":3},{"name":"minecraft:coral","id":386,"data":4},{"name":"minecraft:coral","id":386,"data":5},{"name":"minecraft:coral","id":386,"data":6},{"name":"minecraft:coral","id":386,"data":7},{"name":"minecraft:coral_block","id":387,"data":0},{"name":"minecraft:coral_block","id":387,"data":1},{"name":"minecraft:coral_block","id":387,"data":2},{"name":"minecraft:coral_block","id":387,"data":3},{"name":"minecraft:coral_block","id":387,"data":4},{"name":"minecraft:coral_block","id":387,"data":5},{"name":"minecraft:coral_block","id":387,"data":6},{"name":"minecraft:coral_block","id":387,"data":7},{"name":"minecraft:coral_block","id":387,"data":8},{"name":"minecraft:coral_block","id":387,"data":9},{"name":"minecraft:coral_block","id":387,"data":10},{"name":"minecraft:coral_block","id":387,"data":11},{"name":"minecraft:coral_block","id":387,"data":12},{"name":"minecraft:coral_block","id":387,"data":13},{"name":"minecraft:coral_block","id":387,"data":14},{"name":"minecraft:coral_block","id":387,"data":15},{"name":"minecraft:coral_fan","id":388,"data":0},{"name":"minecraft:coral_fan","id":388,"data":1},{"name":"minecraft:coral_fan","id":388,"data":2},{"name":"minecraft:coral_fan","id":388,"data":3},{"name":"minecraft:coral_fan","id":388,"data":4},{"name":"minecraft:coral_fan","id":388,"data":5},{"name":"minecraft:coral_fan","id":388,"data":6},{"name":"minecraft:coral_fan","id":388,"data":7},{"name":"minecraft:coral_fan","id":388,"data":8},{"name":"minecraft:coral_fan","id":388,"data":9},{"name":"minecraft:coral_fan","id":388,"data":10},{"name":"minecraft:coral_fan","id":388,"data":11},{"name":"minecraft:coral_fan","id":388,"data":12},{"name":"minecraft:coral_fan","id":388,"data":13},{"name":"minecraft:coral_fan","id":388,"data":14},{"name":"minecraft:coral_fan","id":388,"data":15},{"name":"minecraft:coral_fan_dead","id":389,"data":0},{"name":"minecraft:coral_fan_dead","id":389,"data":1},{"name":"minecraft:coral_fan_dead","id":389,"data":2},{"name":"minecraft:coral_fan_dead","id":389,"data":3},{"name":"minecraft:coral_fan_dead","id":389,"data":4},{"name":"minecraft:coral_fan_dead","id":389,"data":5},{"name":"minecraft:coral_fan_dead","id":389,"data":6},{"name":"minecraft:coral_fan_dead","id":389,"data":7},{"name":"minecraft:coral_fan_dead","id":389,"data":8},{"name":"minecraft:coral_fan_dead","id":389,"data":9},{"name":"minecraft:coral_fan_dead","id":389,"data":10},{"name":"minecraft:coral_fan_dead","id":389,"data":11},{"name":"minecraft:coral_fan_dead","id":389,"data":12},{"name":"minecraft:coral_fan_dead","id":389,"data":13},{"name":"minecraft:coral_fan_dead","id":389,"data":14},{"name":"minecraft:coral_fan_dead","id":389,"data":15},{"name":"minecraft:coral_fan_hang","id":390,"data":0},{"name":"minecraft:coral_fan_hang","id":390,"data":1},{"name":"minecraft:coral_fan_hang","id":390,"data":2},{"name":"minecraft:coral_fan_hang","id":390,"data":3},{"name":"minecraft:coral_fan_hang","id":390,"data":4},{"name":"minecraft:coral_fan_hang","id":390,"data":5},{"name":"minecraft:coral_fan_hang","id":390,"data":6},{"name":"minecraft:coral_fan_hang","id":390,"data":7},{"name":"minecraft:coral_fan_hang","id":390,"data":8},{"name":"minecraft:coral_fan_hang","id":390,"data":9},{"name":"minecraft:coral_fan_hang","id":390,"data":10},{"name":"minecraft:coral_fan_hang","id":390,"data":11},{"name":"minecraft:coral_fan_hang","id":390,"data":12},{"name":"minecraft:coral_fan_hang","id":390,"data":13},{"name":"minecraft:coral_fan_hang","id":390,"data":14},{"name":"minecraft:coral_fan_hang","id":390,"data":15},{"name":"minecraft:coral_fan_hang2","id":391,"data":0},{"name":"minecraft:coral_fan_hang2","id":391,"data":1},{"name":"minecraft:coral_fan_hang2","id":391,"data":2},{"name":"minecraft:coral_fan_hang2","id":391,"data":3},{"name":"minecraft:coral_fan_hang2","id":391,"data":4},{"name":"minecraft:coral_fan_hang2","id":391,"data":5},{"name":"minecraft:coral_fan_hang2","id":391,"data":6},{"name":"minecraft:coral_fan_hang2","id":391,"data":7},{"name":"minecraft:coral_fan_hang2","id":391,"data":8},{"name":"minecraft:coral_fan_hang2","id":391,"data":9},{"name":"minecraft:coral_fan_hang2","id":391,"data":10},{"name":"minecraft:coral_fan_hang2","id":391,"data":11},{"name":"minecraft:coral_fan_hang2","id":391,"data":12},{"name":"minecraft:coral_fan_hang2","id":391,"data":13},{"name":"minecraft:coral_fan_hang2","id":391,"data":14},{"name":"minecraft:coral_fan_hang2","id":391,"data":15},{"name":"minecraft:coral_fan_hang3","id":392,"data":0},{"name":"minecraft:coral_fan_hang3","id":392,"data":1},{"name":"minecraft:coral_fan_hang3","id":392,"data":2},{"name":"minecraft:coral_fan_hang3","id":392,"data":3},{"name":"minecraft:coral_fan_hang3","id":392,"data":4},{"name":"minecraft:coral_fan_hang3","id":392,"data":5},{"name":"minecraft:coral_fan_hang3","id":392,"data":6},{"name":"minecraft:coral_fan_hang3","id":392,"data":7},{"name":"minecraft:coral_fan_hang3","id":392,"data":8},{"name":"minecraft:coral_fan_hang3","id":392,"data":9},{"name":"minecraft:coral_fan_hang3","id":392,"data":10},{"name":"minecraft:coral_fan_hang3","id":392,"data":11},{"name":"minecraft:coral_fan_hang3","id":392,"data":12},{"name":"minecraft:coral_fan_hang3","id":392,"data":13},{"name":"minecraft:coral_fan_hang3","id":392,"data":14},{"name":"minecraft:coral_fan_hang3","id":392,"data":15},{"name":"minecraft:kelp","id":393,"data":0},{"name":"minecraft:kelp","id":393,"data":1},{"name":"minecraft:kelp","id":393,"data":2},{"name":"minecraft:kelp","id":393,"data":3},{"name":"minecraft:kelp","id":393,"data":4},{"name":"minecraft:kelp","id":393,"data":5},{"name":"minecraft:kelp","id":393,"data":6},{"name":"minecraft:kelp","id":393,"data":7},{"name":"minecraft:kelp","id":393,"data":8},{"name":"minecraft:kelp","id":393,"data":9},{"name":"minecraft:kelp","id":393,"data":10},{"name":"minecraft:kelp","id":393,"data":11},{"name":"minecraft:kelp","id":393,"data":12},{"name":"minecraft:kelp","id":393,"data":13},{"name":"minecraft:kelp","id":393,"data":14},{"name":"minecraft:kelp","id":393,"data":15},{"name":"minecraft:dried_kelp_block","id":394,"data":0},{"name":"minecraft:acacia_button","id":395,"data":0},{"name":"minecraft:acacia_button","id":395,"data":1},{"name":"minecraft:acacia_button","id":395,"data":2},{"name":"minecraft:acacia_button","id":395,"data":3},{"name":"minecraft:acacia_button","id":395,"data":4},{"name":"minecraft:acacia_button","id":395,"data":5},{"name":"minecraft:acacia_button","id":395,"data":6},{"name":"minecraft:acacia_button","id":395,"data":7},{"name":"minecraft:acacia_button","id":395,"data":8},{"name":"minecraft:acacia_button","id":395,"data":9},{"name":"minecraft:acacia_button","id":395,"data":10},{"name":"minecraft:acacia_button","id":395,"data":11},{"name":"minecraft:acacia_button","id":395,"data":12},{"name":"minecraft:acacia_button","id":395,"data":13},{"name":"minecraft:acacia_button","id":395,"data":14},{"name":"minecraft:acacia_button","id":395,"data":15},{"name":"minecraft:birch_button","id":396,"data":0},{"name":"minecraft:birch_button","id":396,"data":1},{"name":"minecraft:birch_button","id":396,"data":2},{"name":"minecraft:birch_button","id":396,"data":3},{"name":"minecraft:birch_button","id":396,"data":4},{"name":"minecraft:birch_button","id":396,"data":5},{"name":"minecraft:birch_button","id":396,"data":6},{"name":"minecraft:birch_button","id":396,"data":7},{"name":"minecraft:birch_button","id":396,"data":8},{"name":"minecraft:birch_button","id":396,"data":9},{"name":"minecraft:birch_button","id":396,"data":10},{"name":"minecraft:birch_button","id":396,"data":11},{"name":"minecraft:birch_button","id":396,"data":12},{"name":"minecraft:birch_button","id":396,"data":13},{"name":"minecraft:birch_button","id":396,"data":14},{"name":"minecraft:birch_button","id":396,"data":15},{"name":"minecraft:dark_oak_button","id":397,"data":0},{"name":"minecraft:dark_oak_button","id":397,"data":1},{"name":"minecraft:dark_oak_button","id":397,"data":2},{"name":"minecraft:dark_oak_button","id":397,"data":3},{"name":"minecraft:dark_oak_button","id":397,"data":4},{"name":"minecraft:dark_oak_button","id":397,"data":5},{"name":"minecraft:dark_oak_button","id":397,"data":6},{"name":"minecraft:dark_oak_button","id":397,"data":7},{"name":"minecraft:dark_oak_button","id":397,"data":8},{"name":"minecraft:dark_oak_button","id":397,"data":9},{"name":"minecraft:dark_oak_button","id":397,"data":10},{"name":"minecraft:dark_oak_button","id":397,"data":11},{"name":"minecraft:dark_oak_button","id":397,"data":12},{"name":"minecraft:dark_oak_button","id":397,"data":13},{"name":"minecraft:dark_oak_button","id":397,"data":14},{"name":"minecraft:dark_oak_button","id":397,"data":15},{"name":"minecraft:jungle_button","id":398,"data":0},{"name":"minecraft:jungle_button","id":398,"data":1},{"name":"minecraft:jungle_button","id":398,"data":2},{"name":"minecraft:jungle_button","id":398,"data":3},{"name":"minecraft:jungle_button","id":398,"data":4},{"name":"minecraft:jungle_button","id":398,"data":5},{"name":"minecraft:jungle_button","id":398,"data":6},{"name":"minecraft:jungle_button","id":398,"data":7},{"name":"minecraft:jungle_button","id":398,"data":8},{"name":"minecraft:jungle_button","id":398,"data":9},{"name":"minecraft:jungle_button","id":398,"data":10},{"name":"minecraft:jungle_button","id":398,"data":11},{"name":"minecraft:jungle_button","id":398,"data":12},{"name":"minecraft:jungle_button","id":398,"data":13},{"name":"minecraft:jungle_button","id":398,"data":14},{"name":"minecraft:jungle_button","id":398,"data":15},{"name":"minecraft:spruce_button","id":399,"data":0},{"name":"minecraft:spruce_button","id":399,"data":1},{"name":"minecraft:spruce_button","id":399,"data":2},{"name":"minecraft:spruce_button","id":399,"data":3},{"name":"minecraft:spruce_button","id":399,"data":4},{"name":"minecraft:spruce_button","id":399,"data":5},{"name":"minecraft:spruce_button","id":399,"data":6},{"name":"minecraft:spruce_button","id":399,"data":7},{"name":"minecraft:spruce_button","id":399,"data":8},{"name":"minecraft:spruce_button","id":399,"data":9},{"name":"minecraft:spruce_button","id":399,"data":10},{"name":"minecraft:spruce_button","id":399,"data":11},{"name":"minecraft:spruce_button","id":399,"data":12},{"name":"minecraft:spruce_button","id":399,"data":13},{"name":"minecraft:spruce_button","id":399,"data":14},{"name":"minecraft:spruce_button","id":399,"data":15},{"name":"minecraft:acacia_trapdoor","id":400,"data":0},{"name":"minecraft:acacia_trapdoor","id":400,"data":1},{"name":"minecraft:acacia_trapdoor","id":400,"data":2},{"name":"minecraft:acacia_trapdoor","id":400,"data":3},{"name":"minecraft:acacia_trapdoor","id":400,"data":4},{"name":"minecraft:acacia_trapdoor","id":400,"data":5},{"name":"minecraft:acacia_trapdoor","id":400,"data":6},{"name":"minecraft:acacia_trapdoor","id":400,"data":7},{"name":"minecraft:acacia_trapdoor","id":400,"data":8},{"name":"minecraft:acacia_trapdoor","id":400,"data":9},{"name":"minecraft:acacia_trapdoor","id":400,"data":10},{"name":"minecraft:acacia_trapdoor","id":400,"data":11},{"name":"minecraft:acacia_trapdoor","id":400,"data":12},{"name":"minecraft:acacia_trapdoor","id":400,"data":13},{"name":"minecraft:acacia_trapdoor","id":400,"data":14},{"name":"minecraft:acacia_trapdoor","id":400,"data":15},{"name":"minecraft:birch_trapdoor","id":401,"data":0},{"name":"minecraft:birch_trapdoor","id":401,"data":1},{"name":"minecraft:birch_trapdoor","id":401,"data":2},{"name":"minecraft:birch_trapdoor","id":401,"data":3},{"name":"minecraft:birch_trapdoor","id":401,"data":4},{"name":"minecraft:birch_trapdoor","id":401,"data":5},{"name":"minecraft:birch_trapdoor","id":401,"data":6},{"name":"minecraft:birch_trapdoor","id":401,"data":7},{"name":"minecraft:birch_trapdoor","id":401,"data":8},{"name":"minecraft:birch_trapdoor","id":401,"data":9},{"name":"minecraft:birch_trapdoor","id":401,"data":10},{"name":"minecraft:birch_trapdoor","id":401,"data":11},{"name":"minecraft:birch_trapdoor","id":401,"data":12},{"name":"minecraft:birch_trapdoor","id":401,"data":13},{"name":"minecraft:birch_trapdoor","id":401,"data":14},{"name":"minecraft:birch_trapdoor","id":401,"data":15},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":0},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":1},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":2},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":3},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":4},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":5},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":6},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":7},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":8},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":9},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":10},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":11},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":12},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":13},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":14},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":15},{"name":"minecraft:jungle_trapdoor","id":403,"data":0},{"name":"minecraft:jungle_trapdoor","id":403,"data":1},{"name":"minecraft:jungle_trapdoor","id":403,"data":2},{"name":"minecraft:jungle_trapdoor","id":403,"data":3},{"name":"minecraft:jungle_trapdoor","id":403,"data":4},{"name":"minecraft:jungle_trapdoor","id":403,"data":5},{"name":"minecraft:jungle_trapdoor","id":403,"data":6},{"name":"minecraft:jungle_trapdoor","id":403,"data":7},{"name":"minecraft:jungle_trapdoor","id":403,"data":8},{"name":"minecraft:jungle_trapdoor","id":403,"data":9},{"name":"minecraft:jungle_trapdoor","id":403,"data":10},{"name":"minecraft:jungle_trapdoor","id":403,"data":11},{"name":"minecraft:jungle_trapdoor","id":403,"data":12},{"name":"minecraft:jungle_trapdoor","id":403,"data":13},{"name":"minecraft:jungle_trapdoor","id":403,"data":14},{"name":"minecraft:jungle_trapdoor","id":403,"data":15},{"name":"minecraft:spruce_trapdoor","id":404,"data":0},{"name":"minecraft:spruce_trapdoor","id":404,"data":1},{"name":"minecraft:spruce_trapdoor","id":404,"data":2},{"name":"minecraft:spruce_trapdoor","id":404,"data":3},{"name":"minecraft:spruce_trapdoor","id":404,"data":4},{"name":"minecraft:spruce_trapdoor","id":404,"data":5},{"name":"minecraft:spruce_trapdoor","id":404,"data":6},{"name":"minecraft:spruce_trapdoor","id":404,"data":7},{"name":"minecraft:spruce_trapdoor","id":404,"data":8},{"name":"minecraft:spruce_trapdoor","id":404,"data":9},{"name":"minecraft:spruce_trapdoor","id":404,"data":10},{"name":"minecraft:spruce_trapdoor","id":404,"data":11},{"name":"minecraft:spruce_trapdoor","id":404,"data":12},{"name":"minecraft:spruce_trapdoor","id":404,"data":13},{"name":"minecraft:spruce_trapdoor","id":404,"data":14},{"name":"minecraft:spruce_trapdoor","id":404,"data":15},{"name":"minecraft:acacia_pressure_plate","id":405,"data":0},{"name":"minecraft:acacia_pressure_plate","id":405,"data":1},{"name":"minecraft:acacia_pressure_plate","id":405,"data":2},{"name":"minecraft:acacia_pressure_plate","id":405,"data":3},{"name":"minecraft:acacia_pressure_plate","id":405,"data":4},{"name":"minecraft:acacia_pressure_plate","id":405,"data":5},{"name":"minecraft:acacia_pressure_plate","id":405,"data":6},{"name":"minecraft:acacia_pressure_plate","id":405,"data":7},{"name":"minecraft:acacia_pressure_plate","id":405,"data":8},{"name":"minecraft:acacia_pressure_plate","id":405,"data":9},{"name":"minecraft:acacia_pressure_plate","id":405,"data":10},{"name":"minecraft:acacia_pressure_plate","id":405,"data":11},{"name":"minecraft:acacia_pressure_plate","id":405,"data":12},{"name":"minecraft:acacia_pressure_plate","id":405,"data":13},{"name":"minecraft:acacia_pressure_plate","id":405,"data":14},{"name":"minecraft:acacia_pressure_plate","id":405,"data":15},{"name":"minecraft:birch_pressure_plate","id":406,"data":0},{"name":"minecraft:birch_pressure_plate","id":406,"data":1},{"name":"minecraft:birch_pressure_plate","id":406,"data":2},{"name":"minecraft:birch_pressure_plate","id":406,"data":3},{"name":"minecraft:birch_pressure_plate","id":406,"data":4},{"name":"minecraft:birch_pressure_plate","id":406,"data":5},{"name":"minecraft:birch_pressure_plate","id":406,"data":6},{"name":"minecraft:birch_pressure_plate","id":406,"data":7},{"name":"minecraft:birch_pressure_plate","id":406,"data":8},{"name":"minecraft:birch_pressure_plate","id":406,"data":9},{"name":"minecraft:birch_pressure_plate","id":406,"data":10},{"name":"minecraft:birch_pressure_plate","id":406,"data":11},{"name":"minecraft:birch_pressure_plate","id":406,"data":12},{"name":"minecraft:birch_pressure_plate","id":406,"data":13},{"name":"minecraft:birch_pressure_plate","id":406,"data":14},{"name":"minecraft:birch_pressure_plate","id":406,"data":15},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":0},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":1},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":2},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":3},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":4},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":5},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":6},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":7},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":8},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":9},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":10},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":11},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":12},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":13},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":14},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":15},{"name":"minecraft:jungle_pressure_plate","id":408,"data":0},{"name":"minecraft:jungle_pressure_plate","id":408,"data":1},{"name":"minecraft:jungle_pressure_plate","id":408,"data":2},{"name":"minecraft:jungle_pressure_plate","id":408,"data":3},{"name":"minecraft:jungle_pressure_plate","id":408,"data":4},{"name":"minecraft:jungle_pressure_plate","id":408,"data":5},{"name":"minecraft:jungle_pressure_plate","id":408,"data":6},{"name":"minecraft:jungle_pressure_plate","id":408,"data":7},{"name":"minecraft:jungle_pressure_plate","id":408,"data":8},{"name":"minecraft:jungle_pressure_plate","id":408,"data":9},{"name":"minecraft:jungle_pressure_plate","id":408,"data":10},{"name":"minecraft:jungle_pressure_plate","id":408,"data":11},{"name":"minecraft:jungle_pressure_plate","id":408,"data":12},{"name":"minecraft:jungle_pressure_plate","id":408,"data":13},{"name":"minecraft:jungle_pressure_plate","id":408,"data":14},{"name":"minecraft:jungle_pressure_plate","id":408,"data":15},{"name":"minecraft:spruce_pressure_plate","id":409,"data":0},{"name":"minecraft:spruce_pressure_plate","id":409,"data":1},{"name":"minecraft:spruce_pressure_plate","id":409,"data":2},{"name":"minecraft:spruce_pressure_plate","id":409,"data":3},{"name":"minecraft:spruce_pressure_plate","id":409,"data":4},{"name":"minecraft:spruce_pressure_plate","id":409,"data":5},{"name":"minecraft:spruce_pressure_plate","id":409,"data":6},{"name":"minecraft:spruce_pressure_plate","id":409,"data":7},{"name":"minecraft:spruce_pressure_plate","id":409,"data":8},{"name":"minecraft:spruce_pressure_plate","id":409,"data":9},{"name":"minecraft:spruce_pressure_plate","id":409,"data":10},{"name":"minecraft:spruce_pressure_plate","id":409,"data":11},{"name":"minecraft:spruce_pressure_plate","id":409,"data":12},{"name":"minecraft:spruce_pressure_plate","id":409,"data":13},{"name":"minecraft:spruce_pressure_plate","id":409,"data":14},{"name":"minecraft:spruce_pressure_plate","id":409,"data":15},{"name":"minecraft:carved_pumpkin","id":410,"data":0},{"name":"minecraft:carved_pumpkin","id":410,"data":1},{"name":"minecraft:carved_pumpkin","id":410,"data":2},{"name":"minecraft:carved_pumpkin","id":410,"data":3},{"name":"minecraft:sea_pickle","id":411,"data":0},{"name":"minecraft:sea_pickle","id":411,"data":1},{"name":"minecraft:sea_pickle","id":411,"data":2},{"name":"minecraft:sea_pickle","id":411,"data":3},{"name":"minecraft:sea_pickle","id":411,"data":4},{"name":"minecraft:sea_pickle","id":411,"data":5},{"name":"minecraft:sea_pickle","id":411,"data":6},{"name":"minecraft:sea_pickle","id":411,"data":7},{"name":"minecraft:conduit","id":412,"data":0},{"name":"minecraft:turtle_egg","id":414,"data":0},{"name":"minecraft:turtle_egg","id":414,"data":1},{"name":"minecraft:turtle_egg","id":414,"data":2},{"name":"minecraft:turtle_egg","id":414,"data":3},{"name":"minecraft:turtle_egg","id":414,"data":4},{"name":"minecraft:turtle_egg","id":414,"data":5},{"name":"minecraft:turtle_egg","id":414,"data":6},{"name":"minecraft:turtle_egg","id":414,"data":7},{"name":"minecraft:turtle_egg","id":414,"data":8},{"name":"minecraft:turtle_egg","id":414,"data":9},{"name":"minecraft:turtle_egg","id":414,"data":10},{"name":"minecraft:turtle_egg","id":414,"data":11},{"name":"minecraft:turtle_egg","id":414,"data":12},{"name":"minecraft:turtle_egg","id":414,"data":13},{"name":"minecraft:turtle_egg","id":414,"data":14},{"name":"minecraft:turtle_egg","id":414,"data":15},{"name":"minecraft:bubble_column","id":415,"data":0},{"name":"minecraft:bubble_column","id":415,"data":1},{"name":"minecraft:barrier","id":416,"data":0},{"name":"minecraft:stone_slab3","id":417,"data":0},{"name":"minecraft:stone_slab3","id":417,"data":1},{"name":"minecraft:stone_slab3","id":417,"data":2},{"name":"minecraft:stone_slab3","id":417,"data":3},{"name":"minecraft:stone_slab3","id":417,"data":4},{"name":"minecraft:stone_slab3","id":417,"data":5},{"name":"minecraft:stone_slab3","id":417,"data":6},{"name":"minecraft:stone_slab3","id":417,"data":7},{"name":"minecraft:stone_slab3","id":417,"data":8},{"name":"minecraft:stone_slab3","id":417,"data":9},{"name":"minecraft:stone_slab3","id":417,"data":10},{"name":"minecraft:stone_slab3","id":417,"data":11},{"name":"minecraft:stone_slab3","id":417,"data":12},{"name":"minecraft:stone_slab3","id":417,"data":13},{"name":"minecraft:stone_slab3","id":417,"data":14},{"name":"minecraft:stone_slab3","id":417,"data":15},{"name":"minecraft:bamboo","id":418,"data":0},{"name":"minecraft:bamboo","id":418,"data":1},{"name":"minecraft:bamboo","id":418,"data":2},{"name":"minecraft:bamboo","id":418,"data":3},{"name":"minecraft:bamboo","id":418,"data":4},{"name":"minecraft:bamboo","id":418,"data":5},{"name":"minecraft:bamboo","id":418,"data":6},{"name":"minecraft:bamboo","id":418,"data":7},{"name":"minecraft:bamboo","id":418,"data":8},{"name":"minecraft:bamboo","id":418,"data":9},{"name":"minecraft:bamboo","id":418,"data":10},{"name":"minecraft:bamboo","id":418,"data":11},{"name":"minecraft:bamboo","id":418,"data":12},{"name":"minecraft:bamboo","id":418,"data":13},{"name":"minecraft:bamboo","id":418,"data":14},{"name":"minecraft:bamboo","id":418,"data":15},{"name":"minecraft:bamboo_sapling","id":419,"data":0},{"name":"minecraft:bamboo_sapling","id":419,"data":1},{"name":"minecraft:bamboo_sapling","id":419,"data":2},{"name":"minecraft:bamboo_sapling","id":419,"data":3},{"name":"minecraft:bamboo_sapling","id":419,"data":4},{"name":"minecraft:bamboo_sapling","id":419,"data":5},{"name":"minecraft:bamboo_sapling","id":419,"data":6},{"name":"minecraft:bamboo_sapling","id":419,"data":7},{"name":"minecraft:bamboo_sapling","id":419,"data":8},{"name":"minecraft:bamboo_sapling","id":419,"data":9},{"name":"minecraft:bamboo_sapling","id":419,"data":10},{"name":"minecraft:bamboo_sapling","id":419,"data":11},{"name":"minecraft:bamboo_sapling","id":419,"data":12},{"name":"minecraft:bamboo_sapling","id":419,"data":13},{"name":"minecraft:bamboo_sapling","id":419,"data":14},{"name":"minecraft:bamboo_sapling","id":419,"data":15},{"name":"minecraft:scaffolding","id":420,"data":0},{"name":"minecraft:scaffolding","id":420,"data":1},{"name":"minecraft:scaffolding","id":420,"data":2},{"name":"minecraft:scaffolding","id":420,"data":3},{"name":"minecraft:scaffolding","id":420,"data":4},{"name":"minecraft:scaffolding","id":420,"data":5},{"name":"minecraft:scaffolding","id":420,"data":6},{"name":"minecraft:scaffolding","id":420,"data":7},{"name":"minecraft:scaffolding","id":420,"data":8},{"name":"minecraft:scaffolding","id":420,"data":9},{"name":"minecraft:scaffolding","id":420,"data":10},{"name":"minecraft:scaffolding","id":420,"data":11},{"name":"minecraft:scaffolding","id":420,"data":12},{"name":"minecraft:scaffolding","id":420,"data":13},{"name":"minecraft:scaffolding","id":420,"data":14},{"name":"minecraft:scaffolding","id":420,"data":15},{"name":"minecraft:stone_slab4","id":421,"data":0},{"name":"minecraft:stone_slab4","id":421,"data":1},{"name":"minecraft:stone_slab4","id":421,"data":2},{"name":"minecraft:stone_slab4","id":421,"data":3},{"name":"minecraft:stone_slab4","id":421,"data":4},{"name":"minecraft:stone_slab4","id":421,"data":5},{"name":"minecraft:stone_slab4","id":421,"data":6},{"name":"minecraft:stone_slab4","id":421,"data":7},{"name":"minecraft:stone_slab4","id":421,"data":8},{"name":"minecraft:stone_slab4","id":421,"data":9},{"name":"minecraft:stone_slab4","id":421,"data":10},{"name":"minecraft:stone_slab4","id":421,"data":11},{"name":"minecraft:stone_slab4","id":421,"data":12},{"name":"minecraft:stone_slab4","id":421,"data":13},{"name":"minecraft:stone_slab4","id":421,"data":14},{"name":"minecraft:stone_slab4","id":421,"data":15},{"name":"minecraft:double_stone_slab3","id":422,"data":0},{"name":"minecraft:double_stone_slab3","id":422,"data":1},{"name":"minecraft:double_stone_slab3","id":422,"data":2},{"name":"minecraft:double_stone_slab3","id":422,"data":3},{"name":"minecraft:double_stone_slab3","id":422,"data":4},{"name":"minecraft:double_stone_slab3","id":422,"data":5},{"name":"minecraft:double_stone_slab3","id":422,"data":6},{"name":"minecraft:double_stone_slab3","id":422,"data":7},{"name":"minecraft:double_stone_slab3","id":422,"data":8},{"name":"minecraft:double_stone_slab3","id":422,"data":9},{"name":"minecraft:double_stone_slab3","id":422,"data":10},{"name":"minecraft:double_stone_slab3","id":422,"data":11},{"name":"minecraft:double_stone_slab3","id":422,"data":12},{"name":"minecraft:double_stone_slab3","id":422,"data":13},{"name":"minecraft:double_stone_slab3","id":422,"data":14},{"name":"minecraft:double_stone_slab3","id":422,"data":15},{"name":"minecraft:double_stone_slab4","id":423,"data":0},{"name":"minecraft:double_stone_slab4","id":423,"data":1},{"name":"minecraft:double_stone_slab4","id":423,"data":2},{"name":"minecraft:double_stone_slab4","id":423,"data":3},{"name":"minecraft:double_stone_slab4","id":423,"data":4},{"name":"minecraft:double_stone_slab4","id":423,"data":5},{"name":"minecraft:double_stone_slab4","id":423,"data":6},{"name":"minecraft:double_stone_slab4","id":423,"data":7},{"name":"minecraft:double_stone_slab4","id":423,"data":8},{"name":"minecraft:double_stone_slab4","id":423,"data":9},{"name":"minecraft:double_stone_slab4","id":423,"data":10},{"name":"minecraft:double_stone_slab4","id":423,"data":11},{"name":"minecraft:double_stone_slab4","id":423,"data":12},{"name":"minecraft:double_stone_slab4","id":423,"data":13},{"name":"minecraft:double_stone_slab4","id":423,"data":14},{"name":"minecraft:double_stone_slab4","id":423,"data":15},{"name":"minecraft:granite_stairs","id":424,"data":0},{"name":"minecraft:granite_stairs","id":424,"data":1},{"name":"minecraft:granite_stairs","id":424,"data":2},{"name":"minecraft:granite_stairs","id":424,"data":3},{"name":"minecraft:granite_stairs","id":424,"data":4},{"name":"minecraft:granite_stairs","id":424,"data":5},{"name":"minecraft:granite_stairs","id":424,"data":6},{"name":"minecraft:granite_stairs","id":424,"data":7},{"name":"minecraft:diorite_stairs","id":425,"data":0},{"name":"minecraft:diorite_stairs","id":425,"data":1},{"name":"minecraft:diorite_stairs","id":425,"data":2},{"name":"minecraft:diorite_stairs","id":425,"data":3},{"name":"minecraft:diorite_stairs","id":425,"data":4},{"name":"minecraft:diorite_stairs","id":425,"data":5},{"name":"minecraft:diorite_stairs","id":425,"data":6},{"name":"minecraft:diorite_stairs","id":425,"data":7},{"name":"minecraft:andesite_stairs","id":426,"data":0},{"name":"minecraft:andesite_stairs","id":426,"data":1},{"name":"minecraft:andesite_stairs","id":426,"data":2},{"name":"minecraft:andesite_stairs","id":426,"data":3},{"name":"minecraft:andesite_stairs","id":426,"data":4},{"name":"minecraft:andesite_stairs","id":426,"data":5},{"name":"minecraft:andesite_stairs","id":426,"data":6},{"name":"minecraft:andesite_stairs","id":426,"data":7},{"name":"minecraft:polished_granite_stairs","id":427,"data":0},{"name":"minecraft:polished_granite_stairs","id":427,"data":1},{"name":"minecraft:polished_granite_stairs","id":427,"data":2},{"name":"minecraft:polished_granite_stairs","id":427,"data":3},{"name":"minecraft:polished_granite_stairs","id":427,"data":4},{"name":"minecraft:polished_granite_stairs","id":427,"data":5},{"name":"minecraft:polished_granite_stairs","id":427,"data":6},{"name":"minecraft:polished_granite_stairs","id":427,"data":7},{"name":"minecraft:polished_diorite_stairs","id":428,"data":0},{"name":"minecraft:polished_diorite_stairs","id":428,"data":1},{"name":"minecraft:polished_diorite_stairs","id":428,"data":2},{"name":"minecraft:polished_diorite_stairs","id":428,"data":3},{"name":"minecraft:polished_diorite_stairs","id":428,"data":4},{"name":"minecraft:polished_diorite_stairs","id":428,"data":5},{"name":"minecraft:polished_diorite_stairs","id":428,"data":6},{"name":"minecraft:polished_diorite_stairs","id":428,"data":7},{"name":"minecraft:polished_andesite_stairs","id":429,"data":0},{"name":"minecraft:polished_andesite_stairs","id":429,"data":1},{"name":"minecraft:polished_andesite_stairs","id":429,"data":2},{"name":"minecraft:polished_andesite_stairs","id":429,"data":3},{"name":"minecraft:polished_andesite_stairs","id":429,"data":4},{"name":"minecraft:polished_andesite_stairs","id":429,"data":5},{"name":"minecraft:polished_andesite_stairs","id":429,"data":6},{"name":"minecraft:polished_andesite_stairs","id":429,"data":7},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":0},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":1},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":2},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":3},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":4},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":5},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":6},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":7},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":0},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":1},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":2},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":3},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":4},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":5},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":6},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":7},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":0},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":1},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":2},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":3},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":4},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":5},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":6},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":7},{"name":"minecraft:end_brick_stairs","id":433,"data":0},{"name":"minecraft:end_brick_stairs","id":433,"data":1},{"name":"minecraft:end_brick_stairs","id":433,"data":2},{"name":"minecraft:end_brick_stairs","id":433,"data":3},{"name":"minecraft:end_brick_stairs","id":433,"data":4},{"name":"minecraft:end_brick_stairs","id":433,"data":5},{"name":"minecraft:end_brick_stairs","id":433,"data":6},{"name":"minecraft:end_brick_stairs","id":433,"data":7},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":0},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":1},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":2},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":3},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":4},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":5},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":6},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":7},{"name":"minecraft:normal_stone_stairs","id":435,"data":0},{"name":"minecraft:normal_stone_stairs","id":435,"data":1},{"name":"minecraft:normal_stone_stairs","id":435,"data":2},{"name":"minecraft:normal_stone_stairs","id":435,"data":3},{"name":"minecraft:normal_stone_stairs","id":435,"data":4},{"name":"minecraft:normal_stone_stairs","id":435,"data":5},{"name":"minecraft:normal_stone_stairs","id":435,"data":6},{"name":"minecraft:normal_stone_stairs","id":435,"data":7},{"name":"minecraft:spruce_standing_sign","id":436,"data":0},{"name":"minecraft:spruce_standing_sign","id":436,"data":1},{"name":"minecraft:spruce_standing_sign","id":436,"data":2},{"name":"minecraft:spruce_standing_sign","id":436,"data":3},{"name":"minecraft:spruce_standing_sign","id":436,"data":4},{"name":"minecraft:spruce_standing_sign","id":436,"data":5},{"name":"minecraft:spruce_standing_sign","id":436,"data":6},{"name":"minecraft:spruce_standing_sign","id":436,"data":7},{"name":"minecraft:spruce_standing_sign","id":436,"data":8},{"name":"minecraft:spruce_standing_sign","id":436,"data":9},{"name":"minecraft:spruce_standing_sign","id":436,"data":10},{"name":"minecraft:spruce_standing_sign","id":436,"data":11},{"name":"minecraft:spruce_standing_sign","id":436,"data":12},{"name":"minecraft:spruce_standing_sign","id":436,"data":13},{"name":"minecraft:spruce_standing_sign","id":436,"data":14},{"name":"minecraft:spruce_standing_sign","id":436,"data":15},{"name":"minecraft:spruce_wall_sign","id":437,"data":0},{"name":"minecraft:spruce_wall_sign","id":437,"data":1},{"name":"minecraft:spruce_wall_sign","id":437,"data":2},{"name":"minecraft:spruce_wall_sign","id":437,"data":3},{"name":"minecraft:spruce_wall_sign","id":437,"data":4},{"name":"minecraft:spruce_wall_sign","id":437,"data":5},{"name":"minecraft:spruce_wall_sign","id":437,"data":6},{"name":"minecraft:spruce_wall_sign","id":437,"data":7},{"name":"minecraft:smooth_stone","id":438,"data":0},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":0},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":1},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":2},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":3},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":4},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":5},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":6},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":7},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":0},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":1},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":2},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":3},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":4},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":5},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":6},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":7},{"name":"minecraft:birch_standing_sign","id":441,"data":0},{"name":"minecraft:birch_standing_sign","id":441,"data":1},{"name":"minecraft:birch_standing_sign","id":441,"data":2},{"name":"minecraft:birch_standing_sign","id":441,"data":3},{"name":"minecraft:birch_standing_sign","id":441,"data":4},{"name":"minecraft:birch_standing_sign","id":441,"data":5},{"name":"minecraft:birch_standing_sign","id":441,"data":6},{"name":"minecraft:birch_standing_sign","id":441,"data":7},{"name":"minecraft:birch_standing_sign","id":441,"data":8},{"name":"minecraft:birch_standing_sign","id":441,"data":9},{"name":"minecraft:birch_standing_sign","id":441,"data":10},{"name":"minecraft:birch_standing_sign","id":441,"data":11},{"name":"minecraft:birch_standing_sign","id":441,"data":12},{"name":"minecraft:birch_standing_sign","id":441,"data":13},{"name":"minecraft:birch_standing_sign","id":441,"data":14},{"name":"minecraft:birch_standing_sign","id":441,"data":15},{"name":"minecraft:birch_wall_sign","id":442,"data":0},{"name":"minecraft:birch_wall_sign","id":442,"data":1},{"name":"minecraft:birch_wall_sign","id":442,"data":2},{"name":"minecraft:birch_wall_sign","id":442,"data":3},{"name":"minecraft:birch_wall_sign","id":442,"data":4},{"name":"minecraft:birch_wall_sign","id":442,"data":5},{"name":"minecraft:birch_wall_sign","id":442,"data":6},{"name":"minecraft:birch_wall_sign","id":442,"data":7},{"name":"minecraft:jungle_standing_sign","id":443,"data":0},{"name":"minecraft:jungle_standing_sign","id":443,"data":1},{"name":"minecraft:jungle_standing_sign","id":443,"data":2},{"name":"minecraft:jungle_standing_sign","id":443,"data":3},{"name":"minecraft:jungle_standing_sign","id":443,"data":4},{"name":"minecraft:jungle_standing_sign","id":443,"data":5},{"name":"minecraft:jungle_standing_sign","id":443,"data":6},{"name":"minecraft:jungle_standing_sign","id":443,"data":7},{"name":"minecraft:jungle_standing_sign","id":443,"data":8},{"name":"minecraft:jungle_standing_sign","id":443,"data":9},{"name":"minecraft:jungle_standing_sign","id":443,"data":10},{"name":"minecraft:jungle_standing_sign","id":443,"data":11},{"name":"minecraft:jungle_standing_sign","id":443,"data":12},{"name":"minecraft:jungle_standing_sign","id":443,"data":13},{"name":"minecraft:jungle_standing_sign","id":443,"data":14},{"name":"minecraft:jungle_standing_sign","id":443,"data":15},{"name":"minecraft:jungle_wall_sign","id":444,"data":0},{"name":"minecraft:jungle_wall_sign","id":444,"data":1},{"name":"minecraft:jungle_wall_sign","id":444,"data":2},{"name":"minecraft:jungle_wall_sign","id":444,"data":3},{"name":"minecraft:jungle_wall_sign","id":444,"data":4},{"name":"minecraft:jungle_wall_sign","id":444,"data":5},{"name":"minecraft:jungle_wall_sign","id":444,"data":6},{"name":"minecraft:jungle_wall_sign","id":444,"data":7},{"name":"minecraft:acacia_standing_sign","id":445,"data":0},{"name":"minecraft:acacia_standing_sign","id":445,"data":1},{"name":"minecraft:acacia_standing_sign","id":445,"data":2},{"name":"minecraft:acacia_standing_sign","id":445,"data":3},{"name":"minecraft:acacia_standing_sign","id":445,"data":4},{"name":"minecraft:acacia_standing_sign","id":445,"data":5},{"name":"minecraft:acacia_standing_sign","id":445,"data":6},{"name":"minecraft:acacia_standing_sign","id":445,"data":7},{"name":"minecraft:acacia_standing_sign","id":445,"data":8},{"name":"minecraft:acacia_standing_sign","id":445,"data":9},{"name":"minecraft:acacia_standing_sign","id":445,"data":10},{"name":"minecraft:acacia_standing_sign","id":445,"data":11},{"name":"minecraft:acacia_standing_sign","id":445,"data":12},{"name":"minecraft:acacia_standing_sign","id":445,"data":13},{"name":"minecraft:acacia_standing_sign","id":445,"data":14},{"name":"minecraft:acacia_standing_sign","id":445,"data":15},{"name":"minecraft:acacia_wall_sign","id":446,"data":0},{"name":"minecraft:acacia_wall_sign","id":446,"data":1},{"name":"minecraft:acacia_wall_sign","id":446,"data":2},{"name":"minecraft:acacia_wall_sign","id":446,"data":3},{"name":"minecraft:acacia_wall_sign","id":446,"data":4},{"name":"minecraft:acacia_wall_sign","id":446,"data":5},{"name":"minecraft:acacia_wall_sign","id":446,"data":6},{"name":"minecraft:acacia_wall_sign","id":446,"data":7},{"name":"minecraft:darkoak_standing_sign","id":447,"data":0},{"name":"minecraft:darkoak_standing_sign","id":447,"data":1},{"name":"minecraft:darkoak_standing_sign","id":447,"data":2},{"name":"minecraft:darkoak_standing_sign","id":447,"data":3},{"name":"minecraft:darkoak_standing_sign","id":447,"data":4},{"name":"minecraft:darkoak_standing_sign","id":447,"data":5},{"name":"minecraft:darkoak_standing_sign","id":447,"data":6},{"name":"minecraft:darkoak_standing_sign","id":447,"data":7},{"name":"minecraft:darkoak_standing_sign","id":447,"data":8},{"name":"minecraft:darkoak_standing_sign","id":447,"data":9},{"name":"minecraft:darkoak_standing_sign","id":447,"data":10},{"name":"minecraft:darkoak_standing_sign","id":447,"data":11},{"name":"minecraft:darkoak_standing_sign","id":447,"data":12},{"name":"minecraft:darkoak_standing_sign","id":447,"data":13},{"name":"minecraft:darkoak_standing_sign","id":447,"data":14},{"name":"minecraft:darkoak_standing_sign","id":447,"data":15},{"name":"minecraft:darkoak_wall_sign","id":448,"data":0},{"name":"minecraft:darkoak_wall_sign","id":448,"data":1},{"name":"minecraft:darkoak_wall_sign","id":448,"data":2},{"name":"minecraft:darkoak_wall_sign","id":448,"data":3},{"name":"minecraft:darkoak_wall_sign","id":448,"data":4},{"name":"minecraft:darkoak_wall_sign","id":448,"data":5},{"name":"minecraft:darkoak_wall_sign","id":448,"data":6},{"name":"minecraft:darkoak_wall_sign","id":448,"data":7},{"name":"minecraft:lectern","id":449,"data":0},{"name":"minecraft:lectern","id":449,"data":1},{"name":"minecraft:lectern","id":449,"data":2},{"name":"minecraft:lectern","id":449,"data":3},{"name":"minecraft:lectern","id":449,"data":4},{"name":"minecraft:lectern","id":449,"data":5},{"name":"minecraft:lectern","id":449,"data":6},{"name":"minecraft:lectern","id":449,"data":7},{"name":"minecraft:grindstone","id":450,"data":0},{"name":"minecraft:grindstone","id":450,"data":1},{"name":"minecraft:grindstone","id":450,"data":2},{"name":"minecraft:grindstone","id":450,"data":3},{"name":"minecraft:grindstone","id":450,"data":4},{"name":"minecraft:grindstone","id":450,"data":5},{"name":"minecraft:grindstone","id":450,"data":6},{"name":"minecraft:grindstone","id":450,"data":7},{"name":"minecraft:grindstone","id":450,"data":8},{"name":"minecraft:grindstone","id":450,"data":9},{"name":"minecraft:grindstone","id":450,"data":10},{"name":"minecraft:grindstone","id":450,"data":11},{"name":"minecraft:grindstone","id":450,"data":12},{"name":"minecraft:grindstone","id":450,"data":13},{"name":"minecraft:grindstone","id":450,"data":14},{"name":"minecraft:grindstone","id":450,"data":15},{"name":"minecraft:blast_furnace","id":451,"data":0},{"name":"minecraft:blast_furnace","id":451,"data":1},{"name":"minecraft:blast_furnace","id":451,"data":2},{"name":"minecraft:blast_furnace","id":451,"data":3},{"name":"minecraft:blast_furnace","id":451,"data":4},{"name":"minecraft:blast_furnace","id":451,"data":5},{"name":"minecraft:blast_furnace","id":451,"data":6},{"name":"minecraft:blast_furnace","id":451,"data":7},{"name":"minecraft:stonecutter_block","id":452,"data":0},{"name":"minecraft:stonecutter_block","id":452,"data":1},{"name":"minecraft:stonecutter_block","id":452,"data":2},{"name":"minecraft:stonecutter_block","id":452,"data":3},{"name":"minecraft:stonecutter_block","id":452,"data":4},{"name":"minecraft:stonecutter_block","id":452,"data":5},{"name":"minecraft:stonecutter_block","id":452,"data":6},{"name":"minecraft:stonecutter_block","id":452,"data":7},{"name":"minecraft:smoker","id":453,"data":0},{"name":"minecraft:smoker","id":453,"data":1},{"name":"minecraft:smoker","id":453,"data":2},{"name":"minecraft:smoker","id":453,"data":3},{"name":"minecraft:smoker","id":453,"data":4},{"name":"minecraft:smoker","id":453,"data":5},{"name":"minecraft:smoker","id":453,"data":6},{"name":"minecraft:smoker","id":453,"data":7},{"name":"minecraft:lit_smoker","id":454,"data":0},{"name":"minecraft:lit_smoker","id":454,"data":1},{"name":"minecraft:lit_smoker","id":454,"data":2},{"name":"minecraft:lit_smoker","id":454,"data":3},{"name":"minecraft:lit_smoker","id":454,"data":4},{"name":"minecraft:lit_smoker","id":454,"data":5},{"name":"minecraft:lit_smoker","id":454,"data":6},{"name":"minecraft:lit_smoker","id":454,"data":7},{"name":"minecraft:cartography_table","id":455,"data":0},{"name":"minecraft:fletching_table","id":456,"data":0},{"name":"minecraft:smithing_table","id":457,"data":0},{"name":"minecraft:barrel","id":458,"data":0},{"name":"minecraft:barrel","id":458,"data":1},{"name":"minecraft:barrel","id":458,"data":2},{"name":"minecraft:barrel","id":458,"data":3},{"name":"minecraft:barrel","id":458,"data":4},{"name":"minecraft:barrel","id":458,"data":5},{"name":"minecraft:barrel","id":458,"data":6},{"name":"minecraft:barrel","id":458,"data":7},{"name":"minecraft:barrel","id":458,"data":8},{"name":"minecraft:barrel","id":458,"data":9},{"name":"minecraft:barrel","id":458,"data":10},{"name":"minecraft:barrel","id":458,"data":11},{"name":"minecraft:barrel","id":458,"data":12},{"name":"minecraft:barrel","id":458,"data":13},{"name":"minecraft:barrel","id":458,"data":14},{"name":"minecraft:barrel","id":458,"data":15},{"name":"minecraft:loom","id":459,"data":0},{"name":"minecraft:loom","id":459,"data":1},{"name":"minecraft:loom","id":459,"data":2},{"name":"minecraft:loom","id":459,"data":3},{"name":"minecraft:bell","id":461,"data":0},{"name":"minecraft:bell","id":461,"data":1},{"name":"minecraft:bell","id":461,"data":2},{"name":"minecraft:bell","id":461,"data":3},{"name":"minecraft:bell","id":461,"data":4},{"name":"minecraft:bell","id":461,"data":5},{"name":"minecraft:bell","id":461,"data":6},{"name":"minecraft:bell","id":461,"data":7},{"name":"minecraft:bell","id":461,"data":8},{"name":"minecraft:bell","id":461,"data":9},{"name":"minecraft:bell","id":461,"data":10},{"name":"minecraft:bell","id":461,"data":11},{"name":"minecraft:bell","id":461,"data":12},{"name":"minecraft:bell","id":461,"data":13},{"name":"minecraft:bell","id":461,"data":14},{"name":"minecraft:bell","id":461,"data":15},{"name":"minecraft:sweet_berry_bush","id":462,"data":0},{"name":"minecraft:sweet_berry_bush","id":462,"data":1},{"name":"minecraft:sweet_berry_bush","id":462,"data":2},{"name":"minecraft:sweet_berry_bush","id":462,"data":3},{"name":"minecraft:sweet_berry_bush","id":462,"data":4},{"name":"minecraft:sweet_berry_bush","id":462,"data":5},{"name":"minecraft:sweet_berry_bush","id":462,"data":6},{"name":"minecraft:sweet_berry_bush","id":462,"data":7},{"name":"minecraft:lantern","id":463,"data":0},{"name":"minecraft:lantern","id":463,"data":1},{"name":"minecraft:campfire","id":464,"data":0},{"name":"minecraft:campfire","id":464,"data":1},{"name":"minecraft:campfire","id":464,"data":2},{"name":"minecraft:campfire","id":464,"data":3},{"name":"minecraft:campfire","id":464,"data":4},{"name":"minecraft:campfire","id":464,"data":5},{"name":"minecraft:campfire","id":464,"data":6},{"name":"minecraft:campfire","id":464,"data":7},{"name":"minecraft:lava_cauldron","id":465,"data":0},{"name":"minecraft:lava_cauldron","id":465,"data":1},{"name":"minecraft:lava_cauldron","id":465,"data":2},{"name":"minecraft:lava_cauldron","id":465,"data":3},{"name":"minecraft:lava_cauldron","id":465,"data":4},{"name":"minecraft:lava_cauldron","id":465,"data":5},{"name":"minecraft:lava_cauldron","id":465,"data":6},{"name":"minecraft:lava_cauldron","id":465,"data":7},{"name":"minecraft:lava_cauldron","id":465,"data":8},{"name":"minecraft:lava_cauldron","id":465,"data":9},{"name":"minecraft:lava_cauldron","id":465,"data":10},{"name":"minecraft:lava_cauldron","id":465,"data":11},{"name":"minecraft:lava_cauldron","id":465,"data":12},{"name":"minecraft:lava_cauldron","id":465,"data":13},{"name":"minecraft:lava_cauldron","id":465,"data":14},{"name":"minecraft:lava_cauldron","id":465,"data":15},{"name":"minecraft:jigsaw","id":466,"data":0},{"name":"minecraft:jigsaw","id":466,"data":1},{"name":"minecraft:jigsaw","id":466,"data":2},{"name":"minecraft:jigsaw","id":466,"data":3},{"name":"minecraft:jigsaw","id":466,"data":4},{"name":"minecraft:jigsaw","id":466,"data":5},{"name":"minecraft:jigsaw","id":466,"data":6},{"name":"minecraft:jigsaw","id":466,"data":7},{"name":"minecraft:wood","id":467,"data":0},{"name":"minecraft:wood","id":467,"data":1},{"name":"minecraft:wood","id":467,"data":2},{"name":"minecraft:wood","id":467,"data":3},{"name":"minecraft:wood","id":467,"data":4},{"name":"minecraft:wood","id":467,"data":5},{"name":"minecraft:wood","id":467,"data":6},{"name":"minecraft:wood","id":467,"data":7},{"name":"minecraft:wood","id":467,"data":8},{"name":"minecraft:wood","id":467,"data":9},{"name":"minecraft:wood","id":467,"data":10},{"name":"minecraft:wood","id":467,"data":11},{"name":"minecraft:wood","id":467,"data":12},{"name":"minecraft:wood","id":467,"data":13},{"name":"minecraft:wood","id":467,"data":14},{"name":"minecraft:wood","id":467,"data":15},{"name":"minecraft:composter","id":468,"data":0},{"name":"minecraft:composter","id":468,"data":1},{"name":"minecraft:composter","id":468,"data":2},{"name":"minecraft:composter","id":468,"data":3},{"name":"minecraft:composter","id":468,"data":4},{"name":"minecraft:composter","id":468,"data":5},{"name":"minecraft:composter","id":468,"data":6},{"name":"minecraft:composter","id":468,"data":7},{"name":"minecraft:composter","id":468,"data":8},{"name":"minecraft:composter","id":468,"data":9},{"name":"minecraft:composter","id":468,"data":10},{"name":"minecraft:composter","id":468,"data":11},{"name":"minecraft:composter","id":468,"data":12},{"name":"minecraft:composter","id":468,"data":13},{"name":"minecraft:composter","id":468,"data":14},{"name":"minecraft:composter","id":468,"data":15},{"name":"minecraft:lit_blast_furnace","id":469,"data":0},{"name":"minecraft:lit_blast_furnace","id":469,"data":1},{"name":"minecraft:lit_blast_furnace","id":469,"data":2},{"name":"minecraft:lit_blast_furnace","id":469,"data":3},{"name":"minecraft:lit_blast_furnace","id":469,"data":4},{"name":"minecraft:lit_blast_furnace","id":469,"data":5},{"name":"minecraft:lit_blast_furnace","id":469,"data":6},{"name":"minecraft:lit_blast_furnace","id":469,"data":7}] \ No newline at end of file diff --git a/src/main/resources/runtimeid_table_361.json b/src/main/resources/runtimeid_table_361.json deleted file mode 100644 index 5b3cfca83..000000000 --- a/src/main/resources/runtimeid_table_361.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"minecraft:air","id":0,"data":0},{"name":"minecraft:stone","id":1,"data":0},{"name":"minecraft:stone","id":1,"data":1},{"name":"minecraft:stone","id":1,"data":2},{"name":"minecraft:stone","id":1,"data":3},{"name":"minecraft:stone","id":1,"data":4},{"name":"minecraft:stone","id":1,"data":5},{"name":"minecraft:stone","id":1,"data":6},{"name":"minecraft:stone","id":1,"data":7},{"name":"minecraft:grass","id":2,"data":0},{"name":"minecraft:dirt","id":3,"data":0},{"name":"minecraft:dirt","id":3,"data":1},{"name":"minecraft:cobblestone","id":4,"data":0},{"name":"minecraft:planks","id":5,"data":0},{"name":"minecraft:planks","id":5,"data":1},{"name":"minecraft:planks","id":5,"data":2},{"name":"minecraft:planks","id":5,"data":3},{"name":"minecraft:planks","id":5,"data":4},{"name":"minecraft:planks","id":5,"data":5},{"name":"minecraft:planks","id":5,"data":6},{"name":"minecraft:planks","id":5,"data":7},{"name":"minecraft:sapling","id":6,"data":0},{"name":"minecraft:sapling","id":6,"data":1},{"name":"minecraft:sapling","id":6,"data":2},{"name":"minecraft:sapling","id":6,"data":3},{"name":"minecraft:sapling","id":6,"data":4},{"name":"minecraft:sapling","id":6,"data":5},{"name":"minecraft:sapling","id":6,"data":6},{"name":"minecraft:sapling","id":6,"data":7},{"name":"minecraft:sapling","id":6,"data":8},{"name":"minecraft:sapling","id":6,"data":9},{"name":"minecraft:sapling","id":6,"data":10},{"name":"minecraft:sapling","id":6,"data":11},{"name":"minecraft:sapling","id":6,"data":12},{"name":"minecraft:sapling","id":6,"data":13},{"name":"minecraft:sapling","id":6,"data":14},{"name":"minecraft:sapling","id":6,"data":15},{"name":"minecraft:bedrock","id":7,"data":0},{"name":"minecraft:bedrock","id":7,"data":1},{"name":"minecraft:flowing_water","id":8,"data":0},{"name":"minecraft:flowing_water","id":8,"data":1},{"name":"minecraft:flowing_water","id":8,"data":2},{"name":"minecraft:flowing_water","id":8,"data":3},{"name":"minecraft:flowing_water","id":8,"data":4},{"name":"minecraft:flowing_water","id":8,"data":5},{"name":"minecraft:flowing_water","id":8,"data":6},{"name":"minecraft:flowing_water","id":8,"data":7},{"name":"minecraft:flowing_water","id":8,"data":8},{"name":"minecraft:flowing_water","id":8,"data":9},{"name":"minecraft:flowing_water","id":8,"data":10},{"name":"minecraft:flowing_water","id":8,"data":11},{"name":"minecraft:flowing_water","id":8,"data":12},{"name":"minecraft:flowing_water","id":8,"data":13},{"name":"minecraft:flowing_water","id":8,"data":14},{"name":"minecraft:flowing_water","id":8,"data":15},{"name":"minecraft:water","id":9,"data":0},{"name":"minecraft:water","id":9,"data":1},{"name":"minecraft:water","id":9,"data":2},{"name":"minecraft:water","id":9,"data":3},{"name":"minecraft:water","id":9,"data":4},{"name":"minecraft:water","id":9,"data":5},{"name":"minecraft:water","id":9,"data":6},{"name":"minecraft:water","id":9,"data":7},{"name":"minecraft:water","id":9,"data":8},{"name":"minecraft:water","id":9,"data":9},{"name":"minecraft:water","id":9,"data":10},{"name":"minecraft:water","id":9,"data":11},{"name":"minecraft:water","id":9,"data":12},{"name":"minecraft:water","id":9,"data":13},{"name":"minecraft:water","id":9,"data":14},{"name":"minecraft:water","id":9,"data":15},{"name":"minecraft:flowing_lava","id":10,"data":0},{"name":"minecraft:flowing_lava","id":10,"data":1},{"name":"minecraft:flowing_lava","id":10,"data":2},{"name":"minecraft:flowing_lava","id":10,"data":3},{"name":"minecraft:flowing_lava","id":10,"data":4},{"name":"minecraft:flowing_lava","id":10,"data":5},{"name":"minecraft:flowing_lava","id":10,"data":6},{"name":"minecraft:flowing_lava","id":10,"data":7},{"name":"minecraft:flowing_lava","id":10,"data":8},{"name":"minecraft:flowing_lava","id":10,"data":9},{"name":"minecraft:flowing_lava","id":10,"data":10},{"name":"minecraft:flowing_lava","id":10,"data":11},{"name":"minecraft:flowing_lava","id":10,"data":12},{"name":"minecraft:flowing_lava","id":10,"data":13},{"name":"minecraft:flowing_lava","id":10,"data":14},{"name":"minecraft:flowing_lava","id":10,"data":15},{"name":"minecraft:lava","id":11,"data":0},{"name":"minecraft:lava","id":11,"data":1},{"name":"minecraft:lava","id":11,"data":2},{"name":"minecraft:lava","id":11,"data":3},{"name":"minecraft:lava","id":11,"data":4},{"name":"minecraft:lava","id":11,"data":5},{"name":"minecraft:lava","id":11,"data":6},{"name":"minecraft:lava","id":11,"data":7},{"name":"minecraft:lava","id":11,"data":8},{"name":"minecraft:lava","id":11,"data":9},{"name":"minecraft:lava","id":11,"data":10},{"name":"minecraft:lava","id":11,"data":11},{"name":"minecraft:lava","id":11,"data":12},{"name":"minecraft:lava","id":11,"data":13},{"name":"minecraft:lava","id":11,"data":14},{"name":"minecraft:lava","id":11,"data":15},{"name":"minecraft:sand","id":12,"data":0},{"name":"minecraft:sand","id":12,"data":1},{"name":"minecraft:gravel","id":13,"data":0},{"name":"minecraft:gold_ore","id":14,"data":0},{"name":"minecraft:iron_ore","id":15,"data":0},{"name":"minecraft:coal_ore","id":16,"data":0},{"name":"minecraft:log","id":17,"data":0},{"name":"minecraft:log","id":17,"data":1},{"name":"minecraft:log","id":17,"data":2},{"name":"minecraft:log","id":17,"data":3},{"name":"minecraft:log","id":17,"data":4},{"name":"minecraft:log","id":17,"data":5},{"name":"minecraft:log","id":17,"data":6},{"name":"minecraft:log","id":17,"data":7},{"name":"minecraft:log","id":17,"data":8},{"name":"minecraft:log","id":17,"data":9},{"name":"minecraft:log","id":17,"data":10},{"name":"minecraft:log","id":17,"data":11},{"name":"minecraft:log","id":17,"data":12},{"name":"minecraft:log","id":17,"data":13},{"name":"minecraft:log","id":17,"data":14},{"name":"minecraft:log","id":17,"data":15},{"name":"minecraft:leaves","id":18,"data":0},{"name":"minecraft:leaves","id":18,"data":1},{"name":"minecraft:leaves","id":18,"data":2},{"name":"minecraft:leaves","id":18,"data":3},{"name":"minecraft:leaves","id":18,"data":4},{"name":"minecraft:leaves","id":18,"data":5},{"name":"minecraft:leaves","id":18,"data":6},{"name":"minecraft:leaves","id":18,"data":7},{"name":"minecraft:leaves","id":18,"data":8},{"name":"minecraft:leaves","id":18,"data":9},{"name":"minecraft:leaves","id":18,"data":10},{"name":"minecraft:leaves","id":18,"data":11},{"name":"minecraft:leaves","id":18,"data":12},{"name":"minecraft:leaves","id":18,"data":13},{"name":"minecraft:leaves","id":18,"data":14},{"name":"minecraft:leaves","id":18,"data":15},{"name":"minecraft:sponge","id":19,"data":0},{"name":"minecraft:sponge","id":19,"data":1},{"name":"minecraft:glass","id":20,"data":0},{"name":"minecraft:lapis_ore","id":21,"data":0},{"name":"minecraft:lapis_block","id":22,"data":0},{"name":"minecraft:dispenser","id":23,"data":0},{"name":"minecraft:dispenser","id":23,"data":1},{"name":"minecraft:dispenser","id":23,"data":2},{"name":"minecraft:dispenser","id":23,"data":3},{"name":"minecraft:dispenser","id":23,"data":4},{"name":"minecraft:dispenser","id":23,"data":5},{"name":"minecraft:dispenser","id":23,"data":6},{"name":"minecraft:dispenser","id":23,"data":7},{"name":"minecraft:dispenser","id":23,"data":8},{"name":"minecraft:dispenser","id":23,"data":9},{"name":"minecraft:dispenser","id":23,"data":10},{"name":"minecraft:dispenser","id":23,"data":11},{"name":"minecraft:dispenser","id":23,"data":12},{"name":"minecraft:dispenser","id":23,"data":13},{"name":"minecraft:dispenser","id":23,"data":14},{"name":"minecraft:dispenser","id":23,"data":15},{"name":"minecraft:sandstone","id":24,"data":0},{"name":"minecraft:sandstone","id":24,"data":1},{"name":"minecraft:sandstone","id":24,"data":2},{"name":"minecraft:sandstone","id":24,"data":3},{"name":"minecraft:noteblock","id":25,"data":0},{"name":"minecraft:bed","id":26,"data":0},{"name":"minecraft:bed","id":26,"data":1},{"name":"minecraft:bed","id":26,"data":2},{"name":"minecraft:bed","id":26,"data":3},{"name":"minecraft:bed","id":26,"data":4},{"name":"minecraft:bed","id":26,"data":5},{"name":"minecraft:bed","id":26,"data":6},{"name":"minecraft:bed","id":26,"data":7},{"name":"minecraft:bed","id":26,"data":8},{"name":"minecraft:bed","id":26,"data":9},{"name":"minecraft:bed","id":26,"data":10},{"name":"minecraft:bed","id":26,"data":11},{"name":"minecraft:bed","id":26,"data":12},{"name":"minecraft:bed","id":26,"data":13},{"name":"minecraft:bed","id":26,"data":14},{"name":"minecraft:bed","id":26,"data":15},{"name":"minecraft:golden_rail","id":27,"data":0},{"name":"minecraft:golden_rail","id":27,"data":1},{"name":"minecraft:golden_rail","id":27,"data":2},{"name":"minecraft:golden_rail","id":27,"data":3},{"name":"minecraft:golden_rail","id":27,"data":4},{"name":"minecraft:golden_rail","id":27,"data":5},{"name":"minecraft:golden_rail","id":27,"data":6},{"name":"minecraft:golden_rail","id":27,"data":7},{"name":"minecraft:golden_rail","id":27,"data":8},{"name":"minecraft:golden_rail","id":27,"data":9},{"name":"minecraft:golden_rail","id":27,"data":10},{"name":"minecraft:golden_rail","id":27,"data":11},{"name":"minecraft:golden_rail","id":27,"data":12},{"name":"minecraft:golden_rail","id":27,"data":13},{"name":"minecraft:golden_rail","id":27,"data":14},{"name":"minecraft:golden_rail","id":27,"data":15},{"name":"minecraft:detector_rail","id":28,"data":0},{"name":"minecraft:detector_rail","id":28,"data":1},{"name":"minecraft:detector_rail","id":28,"data":2},{"name":"minecraft:detector_rail","id":28,"data":3},{"name":"minecraft:detector_rail","id":28,"data":4},{"name":"minecraft:detector_rail","id":28,"data":5},{"name":"minecraft:detector_rail","id":28,"data":6},{"name":"minecraft:detector_rail","id":28,"data":7},{"name":"minecraft:detector_rail","id":28,"data":8},{"name":"minecraft:detector_rail","id":28,"data":9},{"name":"minecraft:detector_rail","id":28,"data":10},{"name":"minecraft:detector_rail","id":28,"data":11},{"name":"minecraft:detector_rail","id":28,"data":12},{"name":"minecraft:detector_rail","id":28,"data":13},{"name":"minecraft:detector_rail","id":28,"data":14},{"name":"minecraft:detector_rail","id":28,"data":15},{"name":"minecraft:sticky_piston","id":29,"data":0},{"name":"minecraft:sticky_piston","id":29,"data":1},{"name":"minecraft:sticky_piston","id":29,"data":2},{"name":"minecraft:sticky_piston","id":29,"data":3},{"name":"minecraft:sticky_piston","id":29,"data":4},{"name":"minecraft:sticky_piston","id":29,"data":5},{"name":"minecraft:sticky_piston","id":29,"data":6},{"name":"minecraft:sticky_piston","id":29,"data":7},{"name":"minecraft:web","id":30,"data":0},{"name":"minecraft:tallgrass","id":31,"data":0},{"name":"minecraft:tallgrass","id":31,"data":1},{"name":"minecraft:tallgrass","id":31,"data":2},{"name":"minecraft:tallgrass","id":31,"data":3},{"name":"minecraft:deadbush","id":32,"data":0},{"name":"minecraft:piston","id":33,"data":0},{"name":"minecraft:piston","id":33,"data":1},{"name":"minecraft:piston","id":33,"data":2},{"name":"minecraft:piston","id":33,"data":3},{"name":"minecraft:piston","id":33,"data":4},{"name":"minecraft:piston","id":33,"data":5},{"name":"minecraft:piston","id":33,"data":6},{"name":"minecraft:piston","id":33,"data":7},{"name":"minecraft:pistonArmCollision","id":34,"data":0},{"name":"minecraft:pistonArmCollision","id":34,"data":1},{"name":"minecraft:pistonArmCollision","id":34,"data":2},{"name":"minecraft:pistonArmCollision","id":34,"data":3},{"name":"minecraft:pistonArmCollision","id":34,"data":4},{"name":"minecraft:pistonArmCollision","id":34,"data":5},{"name":"minecraft:pistonArmCollision","id":34,"data":6},{"name":"minecraft:pistonArmCollision","id":34,"data":7},{"name":"minecraft:wool","id":35,"data":0},{"name":"minecraft:wool","id":35,"data":1},{"name":"minecraft:wool","id":35,"data":2},{"name":"minecraft:wool","id":35,"data":3},{"name":"minecraft:wool","id":35,"data":4},{"name":"minecraft:wool","id":35,"data":5},{"name":"minecraft:wool","id":35,"data":6},{"name":"minecraft:wool","id":35,"data":7},{"name":"minecraft:wool","id":35,"data":8},{"name":"minecraft:wool","id":35,"data":9},{"name":"minecraft:wool","id":35,"data":10},{"name":"minecraft:wool","id":35,"data":11},{"name":"minecraft:wool","id":35,"data":12},{"name":"minecraft:wool","id":35,"data":13},{"name":"minecraft:wool","id":35,"data":14},{"name":"minecraft:wool","id":35,"data":15},{"name":"minecraft:element_0","id":36,"data":0},{"name":"minecraft:yellow_flower","id":37,"data":0},{"name":"minecraft:red_flower","id":38,"data":0},{"name":"minecraft:red_flower","id":38,"data":1},{"name":"minecraft:red_flower","id":38,"data":2},{"name":"minecraft:red_flower","id":38,"data":3},{"name":"minecraft:red_flower","id":38,"data":4},{"name":"minecraft:red_flower","id":38,"data":5},{"name":"minecraft:red_flower","id":38,"data":6},{"name":"minecraft:red_flower","id":38,"data":7},{"name":"minecraft:red_flower","id":38,"data":8},{"name":"minecraft:red_flower","id":38,"data":9},{"name":"minecraft:red_flower","id":38,"data":10},{"name":"minecraft:red_flower","id":38,"data":11},{"name":"minecraft:red_flower","id":38,"data":12},{"name":"minecraft:red_flower","id":38,"data":13},{"name":"minecraft:red_flower","id":38,"data":14},{"name":"minecraft:red_flower","id":38,"data":15},{"name":"minecraft:brown_mushroom","id":39,"data":0},{"name":"minecraft:red_mushroom","id":40,"data":0},{"name":"minecraft:gold_block","id":41,"data":0},{"name":"minecraft:iron_block","id":42,"data":0},{"name":"minecraft:double_stone_slab","id":43,"data":0},{"name":"minecraft:double_stone_slab","id":43,"data":1},{"name":"minecraft:double_stone_slab","id":43,"data":2},{"name":"minecraft:double_stone_slab","id":43,"data":3},{"name":"minecraft:double_stone_slab","id":43,"data":4},{"name":"minecraft:double_stone_slab","id":43,"data":5},{"name":"minecraft:double_stone_slab","id":43,"data":6},{"name":"minecraft:double_stone_slab","id":43,"data":7},{"name":"minecraft:double_stone_slab","id":43,"data":8},{"name":"minecraft:double_stone_slab","id":43,"data":9},{"name":"minecraft:double_stone_slab","id":43,"data":10},{"name":"minecraft:double_stone_slab","id":43,"data":11},{"name":"minecraft:double_stone_slab","id":43,"data":12},{"name":"minecraft:double_stone_slab","id":43,"data":13},{"name":"minecraft:double_stone_slab","id":43,"data":14},{"name":"minecraft:double_stone_slab","id":43,"data":15},{"name":"minecraft:stone_slab","id":44,"data":0},{"name":"minecraft:stone_slab","id":44,"data":1},{"name":"minecraft:stone_slab","id":44,"data":2},{"name":"minecraft:stone_slab","id":44,"data":3},{"name":"minecraft:stone_slab","id":44,"data":4},{"name":"minecraft:stone_slab","id":44,"data":5},{"name":"minecraft:stone_slab","id":44,"data":6},{"name":"minecraft:stone_slab","id":44,"data":7},{"name":"minecraft:stone_slab","id":44,"data":8},{"name":"minecraft:stone_slab","id":44,"data":9},{"name":"minecraft:stone_slab","id":44,"data":10},{"name":"minecraft:stone_slab","id":44,"data":11},{"name":"minecraft:stone_slab","id":44,"data":12},{"name":"minecraft:stone_slab","id":44,"data":13},{"name":"minecraft:stone_slab","id":44,"data":14},{"name":"minecraft:stone_slab","id":44,"data":15},{"name":"minecraft:brick_block","id":45,"data":0},{"name":"minecraft:tnt","id":46,"data":0},{"name":"minecraft:tnt","id":46,"data":1},{"name":"minecraft:tnt","id":46,"data":2},{"name":"minecraft:tnt","id":46,"data":3},{"name":"minecraft:bookshelf","id":47,"data":0},{"name":"minecraft:mossy_cobblestone","id":48,"data":0},{"name":"minecraft:obsidian","id":49,"data":0},{"name":"minecraft:torch","id":50,"data":0},{"name":"minecraft:torch","id":50,"data":1},{"name":"minecraft:torch","id":50,"data":2},{"name":"minecraft:torch","id":50,"data":3},{"name":"minecraft:torch","id":50,"data":4},{"name":"minecraft:torch","id":50,"data":5},{"name":"minecraft:torch","id":50,"data":6},{"name":"minecraft:torch","id":50,"data":7},{"name":"minecraft:fire","id":51,"data":0},{"name":"minecraft:fire","id":51,"data":1},{"name":"minecraft:fire","id":51,"data":2},{"name":"minecraft:fire","id":51,"data":3},{"name":"minecraft:fire","id":51,"data":4},{"name":"minecraft:fire","id":51,"data":5},{"name":"minecraft:fire","id":51,"data":6},{"name":"minecraft:fire","id":51,"data":7},{"name":"minecraft:fire","id":51,"data":8},{"name":"minecraft:fire","id":51,"data":9},{"name":"minecraft:fire","id":51,"data":10},{"name":"minecraft:fire","id":51,"data":11},{"name":"minecraft:fire","id":51,"data":12},{"name":"minecraft:fire","id":51,"data":13},{"name":"minecraft:fire","id":51,"data":14},{"name":"minecraft:fire","id":51,"data":15},{"name":"minecraft:mob_spawner","id":52,"data":0},{"name":"minecraft:oak_stairs","id":53,"data":0},{"name":"minecraft:oak_stairs","id":53,"data":1},{"name":"minecraft:oak_stairs","id":53,"data":2},{"name":"minecraft:oak_stairs","id":53,"data":3},{"name":"minecraft:oak_stairs","id":53,"data":4},{"name":"minecraft:oak_stairs","id":53,"data":5},{"name":"minecraft:oak_stairs","id":53,"data":6},{"name":"minecraft:oak_stairs","id":53,"data":7},{"name":"minecraft:chest","id":54,"data":0},{"name":"minecraft:chest","id":54,"data":1},{"name":"minecraft:chest","id":54,"data":2},{"name":"minecraft:chest","id":54,"data":3},{"name":"minecraft:chest","id":54,"data":4},{"name":"minecraft:chest","id":54,"data":5},{"name":"minecraft:chest","id":54,"data":6},{"name":"minecraft:chest","id":54,"data":7},{"name":"minecraft:redstone_wire","id":55,"data":0},{"name":"minecraft:redstone_wire","id":55,"data":1},{"name":"minecraft:redstone_wire","id":55,"data":2},{"name":"minecraft:redstone_wire","id":55,"data":3},{"name":"minecraft:redstone_wire","id":55,"data":4},{"name":"minecraft:redstone_wire","id":55,"data":5},{"name":"minecraft:redstone_wire","id":55,"data":6},{"name":"minecraft:redstone_wire","id":55,"data":7},{"name":"minecraft:redstone_wire","id":55,"data":8},{"name":"minecraft:redstone_wire","id":55,"data":9},{"name":"minecraft:redstone_wire","id":55,"data":10},{"name":"minecraft:redstone_wire","id":55,"data":11},{"name":"minecraft:redstone_wire","id":55,"data":12},{"name":"minecraft:redstone_wire","id":55,"data":13},{"name":"minecraft:redstone_wire","id":55,"data":14},{"name":"minecraft:redstone_wire","id":55,"data":15},{"name":"minecraft:diamond_ore","id":56,"data":0},{"name":"minecraft:diamond_block","id":57,"data":0},{"name":"minecraft:crafting_table","id":58,"data":0},{"name":"minecraft:wheat","id":59,"data":0},{"name":"minecraft:wheat","id":59,"data":1},{"name":"minecraft:wheat","id":59,"data":2},{"name":"minecraft:wheat","id":59,"data":3},{"name":"minecraft:wheat","id":59,"data":4},{"name":"minecraft:wheat","id":59,"data":5},{"name":"minecraft:wheat","id":59,"data":6},{"name":"minecraft:wheat","id":59,"data":7},{"name":"minecraft:farmland","id":60,"data":0},{"name":"minecraft:farmland","id":60,"data":1},{"name":"minecraft:farmland","id":60,"data":2},{"name":"minecraft:farmland","id":60,"data":3},{"name":"minecraft:farmland","id":60,"data":4},{"name":"minecraft:farmland","id":60,"data":5},{"name":"minecraft:farmland","id":60,"data":6},{"name":"minecraft:farmland","id":60,"data":7},{"name":"minecraft:furnace","id":61,"data":0},{"name":"minecraft:furnace","id":61,"data":1},{"name":"minecraft:furnace","id":61,"data":2},{"name":"minecraft:furnace","id":61,"data":3},{"name":"minecraft:furnace","id":61,"data":4},{"name":"minecraft:furnace","id":61,"data":5},{"name":"minecraft:furnace","id":61,"data":6},{"name":"minecraft:furnace","id":61,"data":7},{"name":"minecraft:lit_furnace","id":62,"data":0},{"name":"minecraft:lit_furnace","id":62,"data":1},{"name":"minecraft:lit_furnace","id":62,"data":2},{"name":"minecraft:lit_furnace","id":62,"data":3},{"name":"minecraft:lit_furnace","id":62,"data":4},{"name":"minecraft:lit_furnace","id":62,"data":5},{"name":"minecraft:lit_furnace","id":62,"data":6},{"name":"minecraft:lit_furnace","id":62,"data":7},{"name":"minecraft:standing_sign","id":63,"data":0},{"name":"minecraft:standing_sign","id":63,"data":1},{"name":"minecraft:standing_sign","id":63,"data":2},{"name":"minecraft:standing_sign","id":63,"data":3},{"name":"minecraft:standing_sign","id":63,"data":4},{"name":"minecraft:standing_sign","id":63,"data":5},{"name":"minecraft:standing_sign","id":63,"data":6},{"name":"minecraft:standing_sign","id":63,"data":7},{"name":"minecraft:standing_sign","id":63,"data":8},{"name":"minecraft:standing_sign","id":63,"data":9},{"name":"minecraft:standing_sign","id":63,"data":10},{"name":"minecraft:standing_sign","id":63,"data":11},{"name":"minecraft:standing_sign","id":63,"data":12},{"name":"minecraft:standing_sign","id":63,"data":13},{"name":"minecraft:standing_sign","id":63,"data":14},{"name":"minecraft:standing_sign","id":63,"data":15},{"name":"minecraft:wooden_door","id":64,"data":0},{"name":"minecraft:wooden_door","id":64,"data":1},{"name":"minecraft:wooden_door","id":64,"data":2},{"name":"minecraft:wooden_door","id":64,"data":3},{"name":"minecraft:wooden_door","id":64,"data":4},{"name":"minecraft:wooden_door","id":64,"data":5},{"name":"minecraft:wooden_door","id":64,"data":6},{"name":"minecraft:wooden_door","id":64,"data":7},{"name":"minecraft:wooden_door","id":64,"data":8},{"name":"minecraft:wooden_door","id":64,"data":9},{"name":"minecraft:wooden_door","id":64,"data":10},{"name":"minecraft:wooden_door","id":64,"data":11},{"name":"minecraft:wooden_door","id":64,"data":12},{"name":"minecraft:wooden_door","id":64,"data":13},{"name":"minecraft:wooden_door","id":64,"data":14},{"name":"minecraft:wooden_door","id":64,"data":15},{"name":"minecraft:wooden_door","id":64,"data":16},{"name":"minecraft:wooden_door","id":64,"data":17},{"name":"minecraft:wooden_door","id":64,"data":18},{"name":"minecraft:wooden_door","id":64,"data":19},{"name":"minecraft:wooden_door","id":64,"data":20},{"name":"minecraft:wooden_door","id":64,"data":21},{"name":"minecraft:wooden_door","id":64,"data":22},{"name":"minecraft:wooden_door","id":64,"data":23},{"name":"minecraft:wooden_door","id":64,"data":24},{"name":"minecraft:wooden_door","id":64,"data":25},{"name":"minecraft:wooden_door","id":64,"data":26},{"name":"minecraft:wooden_door","id":64,"data":27},{"name":"minecraft:wooden_door","id":64,"data":28},{"name":"minecraft:wooden_door","id":64,"data":29},{"name":"minecraft:wooden_door","id":64,"data":30},{"name":"minecraft:wooden_door","id":64,"data":31},{"name":"minecraft:ladder","id":65,"data":0},{"name":"minecraft:ladder","id":65,"data":1},{"name":"minecraft:ladder","id":65,"data":2},{"name":"minecraft:ladder","id":65,"data":3},{"name":"minecraft:ladder","id":65,"data":4},{"name":"minecraft:ladder","id":65,"data":5},{"name":"minecraft:ladder","id":65,"data":6},{"name":"minecraft:ladder","id":65,"data":7},{"name":"minecraft:rail","id":66,"data":0},{"name":"minecraft:rail","id":66,"data":1},{"name":"minecraft:rail","id":66,"data":2},{"name":"minecraft:rail","id":66,"data":3},{"name":"minecraft:rail","id":66,"data":4},{"name":"minecraft:rail","id":66,"data":5},{"name":"minecraft:rail","id":66,"data":6},{"name":"minecraft:rail","id":66,"data":7},{"name":"minecraft:rail","id":66,"data":8},{"name":"minecraft:rail","id":66,"data":9},{"name":"minecraft:rail","id":66,"data":10},{"name":"minecraft:rail","id":66,"data":11},{"name":"minecraft:rail","id":66,"data":12},{"name":"minecraft:rail","id":66,"data":13},{"name":"minecraft:rail","id":66,"data":14},{"name":"minecraft:rail","id":66,"data":15},{"name":"minecraft:stone_stairs","id":67,"data":0},{"name":"minecraft:stone_stairs","id":67,"data":1},{"name":"minecraft:stone_stairs","id":67,"data":2},{"name":"minecraft:stone_stairs","id":67,"data":3},{"name":"minecraft:stone_stairs","id":67,"data":4},{"name":"minecraft:stone_stairs","id":67,"data":5},{"name":"minecraft:stone_stairs","id":67,"data":6},{"name":"minecraft:stone_stairs","id":67,"data":7},{"name":"minecraft:wall_sign","id":68,"data":0},{"name":"minecraft:wall_sign","id":68,"data":1},{"name":"minecraft:wall_sign","id":68,"data":2},{"name":"minecraft:wall_sign","id":68,"data":3},{"name":"minecraft:wall_sign","id":68,"data":4},{"name":"minecraft:wall_sign","id":68,"data":5},{"name":"minecraft:wall_sign","id":68,"data":6},{"name":"minecraft:wall_sign","id":68,"data":7},{"name":"minecraft:lever","id":69,"data":0},{"name":"minecraft:lever","id":69,"data":1},{"name":"minecraft:lever","id":69,"data":2},{"name":"minecraft:lever","id":69,"data":3},{"name":"minecraft:lever","id":69,"data":4},{"name":"minecraft:lever","id":69,"data":5},{"name":"minecraft:lever","id":69,"data":6},{"name":"minecraft:lever","id":69,"data":7},{"name":"minecraft:lever","id":69,"data":8},{"name":"minecraft:lever","id":69,"data":9},{"name":"minecraft:lever","id":69,"data":10},{"name":"minecraft:lever","id":69,"data":11},{"name":"minecraft:lever","id":69,"data":12},{"name":"minecraft:lever","id":69,"data":13},{"name":"minecraft:lever","id":69,"data":14},{"name":"minecraft:lever","id":69,"data":15},{"name":"minecraft:stone_pressure_plate","id":70,"data":0},{"name":"minecraft:stone_pressure_plate","id":70,"data":1},{"name":"minecraft:stone_pressure_plate","id":70,"data":2},{"name":"minecraft:stone_pressure_plate","id":70,"data":3},{"name":"minecraft:stone_pressure_plate","id":70,"data":4},{"name":"minecraft:stone_pressure_plate","id":70,"data":5},{"name":"minecraft:stone_pressure_plate","id":70,"data":6},{"name":"minecraft:stone_pressure_plate","id":70,"data":7},{"name":"minecraft:stone_pressure_plate","id":70,"data":8},{"name":"minecraft:stone_pressure_plate","id":70,"data":9},{"name":"minecraft:stone_pressure_plate","id":70,"data":10},{"name":"minecraft:stone_pressure_plate","id":70,"data":11},{"name":"minecraft:stone_pressure_plate","id":70,"data":12},{"name":"minecraft:stone_pressure_plate","id":70,"data":13},{"name":"minecraft:stone_pressure_plate","id":70,"data":14},{"name":"minecraft:stone_pressure_plate","id":70,"data":15},{"name":"minecraft:iron_door","id":71,"data":0},{"name":"minecraft:iron_door","id":71,"data":1},{"name":"minecraft:iron_door","id":71,"data":2},{"name":"minecraft:iron_door","id":71,"data":3},{"name":"minecraft:iron_door","id":71,"data":4},{"name":"minecraft:iron_door","id":71,"data":5},{"name":"minecraft:iron_door","id":71,"data":6},{"name":"minecraft:iron_door","id":71,"data":7},{"name":"minecraft:iron_door","id":71,"data":8},{"name":"minecraft:iron_door","id":71,"data":9},{"name":"minecraft:iron_door","id":71,"data":10},{"name":"minecraft:iron_door","id":71,"data":11},{"name":"minecraft:iron_door","id":71,"data":12},{"name":"minecraft:iron_door","id":71,"data":13},{"name":"minecraft:iron_door","id":71,"data":14},{"name":"minecraft:iron_door","id":71,"data":15},{"name":"minecraft:iron_door","id":71,"data":16},{"name":"minecraft:iron_door","id":71,"data":17},{"name":"minecraft:iron_door","id":71,"data":18},{"name":"minecraft:iron_door","id":71,"data":19},{"name":"minecraft:iron_door","id":71,"data":20},{"name":"minecraft:iron_door","id":71,"data":21},{"name":"minecraft:iron_door","id":71,"data":22},{"name":"minecraft:iron_door","id":71,"data":23},{"name":"minecraft:iron_door","id":71,"data":24},{"name":"minecraft:iron_door","id":71,"data":25},{"name":"minecraft:iron_door","id":71,"data":26},{"name":"minecraft:iron_door","id":71,"data":27},{"name":"minecraft:iron_door","id":71,"data":28},{"name":"minecraft:iron_door","id":71,"data":29},{"name":"minecraft:iron_door","id":71,"data":30},{"name":"minecraft:iron_door","id":71,"data":31},{"name":"minecraft:wooden_pressure_plate","id":72,"data":0},{"name":"minecraft:wooden_pressure_plate","id":72,"data":1},{"name":"minecraft:wooden_pressure_plate","id":72,"data":2},{"name":"minecraft:wooden_pressure_plate","id":72,"data":3},{"name":"minecraft:wooden_pressure_plate","id":72,"data":4},{"name":"minecraft:wooden_pressure_plate","id":72,"data":5},{"name":"minecraft:wooden_pressure_plate","id":72,"data":6},{"name":"minecraft:wooden_pressure_plate","id":72,"data":7},{"name":"minecraft:wooden_pressure_plate","id":72,"data":8},{"name":"minecraft:wooden_pressure_plate","id":72,"data":9},{"name":"minecraft:wooden_pressure_plate","id":72,"data":10},{"name":"minecraft:wooden_pressure_plate","id":72,"data":11},{"name":"minecraft:wooden_pressure_plate","id":72,"data":12},{"name":"minecraft:wooden_pressure_plate","id":72,"data":13},{"name":"minecraft:wooden_pressure_plate","id":72,"data":14},{"name":"minecraft:wooden_pressure_plate","id":72,"data":15},{"name":"minecraft:redstone_ore","id":73,"data":0},{"name":"minecraft:lit_redstone_ore","id":74,"data":0},{"name":"minecraft:unlit_redstone_torch","id":75,"data":0},{"name":"minecraft:unlit_redstone_torch","id":75,"data":1},{"name":"minecraft:unlit_redstone_torch","id":75,"data":2},{"name":"minecraft:unlit_redstone_torch","id":75,"data":3},{"name":"minecraft:unlit_redstone_torch","id":75,"data":4},{"name":"minecraft:unlit_redstone_torch","id":75,"data":5},{"name":"minecraft:unlit_redstone_torch","id":75,"data":6},{"name":"minecraft:unlit_redstone_torch","id":75,"data":7},{"name":"minecraft:redstone_torch","id":76,"data":0},{"name":"minecraft:redstone_torch","id":76,"data":1},{"name":"minecraft:redstone_torch","id":76,"data":2},{"name":"minecraft:redstone_torch","id":76,"data":3},{"name":"minecraft:redstone_torch","id":76,"data":4},{"name":"minecraft:redstone_torch","id":76,"data":5},{"name":"minecraft:redstone_torch","id":76,"data":6},{"name":"minecraft:redstone_torch","id":76,"data":7},{"name":"minecraft:stone_button","id":77,"data":0},{"name":"minecraft:stone_button","id":77,"data":1},{"name":"minecraft:stone_button","id":77,"data":2},{"name":"minecraft:stone_button","id":77,"data":3},{"name":"minecraft:stone_button","id":77,"data":4},{"name":"minecraft:stone_button","id":77,"data":5},{"name":"minecraft:stone_button","id":77,"data":6},{"name":"minecraft:stone_button","id":77,"data":7},{"name":"minecraft:stone_button","id":77,"data":8},{"name":"minecraft:stone_button","id":77,"data":9},{"name":"minecraft:stone_button","id":77,"data":10},{"name":"minecraft:stone_button","id":77,"data":11},{"name":"minecraft:stone_button","id":77,"data":12},{"name":"minecraft:stone_button","id":77,"data":13},{"name":"minecraft:stone_button","id":77,"data":14},{"name":"minecraft:stone_button","id":77,"data":15},{"name":"minecraft:snow_layer","id":78,"data":0},{"name":"minecraft:snow_layer","id":78,"data":1},{"name":"minecraft:snow_layer","id":78,"data":2},{"name":"minecraft:snow_layer","id":78,"data":3},{"name":"minecraft:snow_layer","id":78,"data":4},{"name":"minecraft:snow_layer","id":78,"data":5},{"name":"minecraft:snow_layer","id":78,"data":6},{"name":"minecraft:snow_layer","id":78,"data":7},{"name":"minecraft:snow_layer","id":78,"data":8},{"name":"minecraft:snow_layer","id":78,"data":9},{"name":"minecraft:snow_layer","id":78,"data":10},{"name":"minecraft:snow_layer","id":78,"data":11},{"name":"minecraft:snow_layer","id":78,"data":12},{"name":"minecraft:snow_layer","id":78,"data":13},{"name":"minecraft:snow_layer","id":78,"data":14},{"name":"minecraft:snow_layer","id":78,"data":15},{"name":"minecraft:ice","id":79,"data":0},{"name":"minecraft:snow","id":80,"data":0},{"name":"minecraft:cactus","id":81,"data":0},{"name":"minecraft:cactus","id":81,"data":1},{"name":"minecraft:cactus","id":81,"data":2},{"name":"minecraft:cactus","id":81,"data":3},{"name":"minecraft:cactus","id":81,"data":4},{"name":"minecraft:cactus","id":81,"data":5},{"name":"minecraft:cactus","id":81,"data":6},{"name":"minecraft:cactus","id":81,"data":7},{"name":"minecraft:cactus","id":81,"data":8},{"name":"minecraft:cactus","id":81,"data":9},{"name":"minecraft:cactus","id":81,"data":10},{"name":"minecraft:cactus","id":81,"data":11},{"name":"minecraft:cactus","id":81,"data":12},{"name":"minecraft:cactus","id":81,"data":13},{"name":"minecraft:cactus","id":81,"data":14},{"name":"minecraft:cactus","id":81,"data":15},{"name":"minecraft:clay","id":82,"data":0},{"name":"minecraft:reeds","id":83,"data":0},{"name":"minecraft:reeds","id":83,"data":1},{"name":"minecraft:reeds","id":83,"data":2},{"name":"minecraft:reeds","id":83,"data":3},{"name":"minecraft:reeds","id":83,"data":4},{"name":"minecraft:reeds","id":83,"data":5},{"name":"minecraft:reeds","id":83,"data":6},{"name":"minecraft:reeds","id":83,"data":7},{"name":"minecraft:reeds","id":83,"data":8},{"name":"minecraft:reeds","id":83,"data":9},{"name":"minecraft:reeds","id":83,"data":10},{"name":"minecraft:reeds","id":83,"data":11},{"name":"minecraft:reeds","id":83,"data":12},{"name":"minecraft:reeds","id":83,"data":13},{"name":"minecraft:reeds","id":83,"data":14},{"name":"minecraft:reeds","id":83,"data":15},{"name":"minecraft:jukebox","id":84,"data":0},{"name":"minecraft:fence","id":85,"data":0},{"name":"minecraft:fence","id":85,"data":1},{"name":"minecraft:fence","id":85,"data":2},{"name":"minecraft:fence","id":85,"data":3},{"name":"minecraft:fence","id":85,"data":4},{"name":"minecraft:fence","id":85,"data":5},{"name":"minecraft:fence","id":85,"data":6},{"name":"minecraft:fence","id":85,"data":7},{"name":"minecraft:pumpkin","id":86,"data":0},{"name":"minecraft:pumpkin","id":86,"data":1},{"name":"minecraft:pumpkin","id":86,"data":2},{"name":"minecraft:pumpkin","id":86,"data":3},{"name":"minecraft:netherrack","id":87,"data":0},{"name":"minecraft:soul_sand","id":88,"data":0},{"name":"minecraft:glowstone","id":89,"data":0},{"name":"minecraft:portal","id":90,"data":0},{"name":"minecraft:portal","id":90,"data":1},{"name":"minecraft:portal","id":90,"data":2},{"name":"minecraft:portal","id":90,"data":3},{"name":"minecraft:lit_pumpkin","id":91,"data":0},{"name":"minecraft:lit_pumpkin","id":91,"data":1},{"name":"minecraft:lit_pumpkin","id":91,"data":2},{"name":"minecraft:lit_pumpkin","id":91,"data":3},{"name":"minecraft:cake","id":92,"data":0},{"name":"minecraft:cake","id":92,"data":1},{"name":"minecraft:cake","id":92,"data":2},{"name":"minecraft:cake","id":92,"data":3},{"name":"minecraft:cake","id":92,"data":4},{"name":"minecraft:cake","id":92,"data":5},{"name":"minecraft:cake","id":92,"data":6},{"name":"minecraft:cake","id":92,"data":7},{"name":"minecraft:unpowered_repeater","id":93,"data":0},{"name":"minecraft:unpowered_repeater","id":93,"data":1},{"name":"minecraft:unpowered_repeater","id":93,"data":2},{"name":"minecraft:unpowered_repeater","id":93,"data":3},{"name":"minecraft:unpowered_repeater","id":93,"data":4},{"name":"minecraft:unpowered_repeater","id":93,"data":5},{"name":"minecraft:unpowered_repeater","id":93,"data":6},{"name":"minecraft:unpowered_repeater","id":93,"data":7},{"name":"minecraft:unpowered_repeater","id":93,"data":8},{"name":"minecraft:unpowered_repeater","id":93,"data":9},{"name":"minecraft:unpowered_repeater","id":93,"data":10},{"name":"minecraft:unpowered_repeater","id":93,"data":11},{"name":"minecraft:unpowered_repeater","id":93,"data":12},{"name":"minecraft:unpowered_repeater","id":93,"data":13},{"name":"minecraft:unpowered_repeater","id":93,"data":14},{"name":"minecraft:unpowered_repeater","id":93,"data":15},{"name":"minecraft:powered_repeater","id":94,"data":0},{"name":"minecraft:powered_repeater","id":94,"data":1},{"name":"minecraft:powered_repeater","id":94,"data":2},{"name":"minecraft:powered_repeater","id":94,"data":3},{"name":"minecraft:powered_repeater","id":94,"data":4},{"name":"minecraft:powered_repeater","id":94,"data":5},{"name":"minecraft:powered_repeater","id":94,"data":6},{"name":"minecraft:powered_repeater","id":94,"data":7},{"name":"minecraft:powered_repeater","id":94,"data":8},{"name":"minecraft:powered_repeater","id":94,"data":9},{"name":"minecraft:powered_repeater","id":94,"data":10},{"name":"minecraft:powered_repeater","id":94,"data":11},{"name":"minecraft:powered_repeater","id":94,"data":12},{"name":"minecraft:powered_repeater","id":94,"data":13},{"name":"minecraft:powered_repeater","id":94,"data":14},{"name":"minecraft:powered_repeater","id":94,"data":15},{"name":"minecraft:invisibleBedrock","id":95,"data":0},{"name":"minecraft:trapdoor","id":96,"data":0},{"name":"minecraft:trapdoor","id":96,"data":1},{"name":"minecraft:trapdoor","id":96,"data":2},{"name":"minecraft:trapdoor","id":96,"data":3},{"name":"minecraft:trapdoor","id":96,"data":4},{"name":"minecraft:trapdoor","id":96,"data":5},{"name":"minecraft:trapdoor","id":96,"data":6},{"name":"minecraft:trapdoor","id":96,"data":7},{"name":"minecraft:trapdoor","id":96,"data":8},{"name":"minecraft:trapdoor","id":96,"data":9},{"name":"minecraft:trapdoor","id":96,"data":10},{"name":"minecraft:trapdoor","id":96,"data":11},{"name":"minecraft:trapdoor","id":96,"data":12},{"name":"minecraft:trapdoor","id":96,"data":13},{"name":"minecraft:trapdoor","id":96,"data":14},{"name":"minecraft:trapdoor","id":96,"data":15},{"name":"minecraft:monster_egg","id":97,"data":0},{"name":"minecraft:monster_egg","id":97,"data":1},{"name":"minecraft:monster_egg","id":97,"data":2},{"name":"minecraft:monster_egg","id":97,"data":3},{"name":"minecraft:monster_egg","id":97,"data":4},{"name":"minecraft:monster_egg","id":97,"data":5},{"name":"minecraft:monster_egg","id":97,"data":6},{"name":"minecraft:monster_egg","id":97,"data":7},{"name":"minecraft:stonebrick","id":98,"data":0},{"name":"minecraft:stonebrick","id":98,"data":1},{"name":"minecraft:stonebrick","id":98,"data":2},{"name":"minecraft:stonebrick","id":98,"data":3},{"name":"minecraft:stonebrick","id":98,"data":4},{"name":"minecraft:stonebrick","id":98,"data":5},{"name":"minecraft:stonebrick","id":98,"data":6},{"name":"minecraft:stonebrick","id":98,"data":7},{"name":"minecraft:brown_mushroom_block","id":99,"data":0},{"name":"minecraft:brown_mushroom_block","id":99,"data":1},{"name":"minecraft:brown_mushroom_block","id":99,"data":2},{"name":"minecraft:brown_mushroom_block","id":99,"data":3},{"name":"minecraft:brown_mushroom_block","id":99,"data":4},{"name":"minecraft:brown_mushroom_block","id":99,"data":5},{"name":"minecraft:brown_mushroom_block","id":99,"data":6},{"name":"minecraft:brown_mushroom_block","id":99,"data":7},{"name":"minecraft:brown_mushroom_block","id":99,"data":8},{"name":"minecraft:brown_mushroom_block","id":99,"data":9},{"name":"minecraft:brown_mushroom_block","id":99,"data":10},{"name":"minecraft:brown_mushroom_block","id":99,"data":11},{"name":"minecraft:brown_mushroom_block","id":99,"data":12},{"name":"minecraft:brown_mushroom_block","id":99,"data":13},{"name":"minecraft:brown_mushroom_block","id":99,"data":14},{"name":"minecraft:brown_mushroom_block","id":99,"data":15},{"name":"minecraft:red_mushroom_block","id":100,"data":0},{"name":"minecraft:red_mushroom_block","id":100,"data":1},{"name":"minecraft:red_mushroom_block","id":100,"data":2},{"name":"minecraft:red_mushroom_block","id":100,"data":3},{"name":"minecraft:red_mushroom_block","id":100,"data":4},{"name":"minecraft:red_mushroom_block","id":100,"data":5},{"name":"minecraft:red_mushroom_block","id":100,"data":6},{"name":"minecraft:red_mushroom_block","id":100,"data":7},{"name":"minecraft:red_mushroom_block","id":100,"data":8},{"name":"minecraft:red_mushroom_block","id":100,"data":9},{"name":"minecraft:red_mushroom_block","id":100,"data":10},{"name":"minecraft:red_mushroom_block","id":100,"data":11},{"name":"minecraft:red_mushroom_block","id":100,"data":12},{"name":"minecraft:red_mushroom_block","id":100,"data":13},{"name":"minecraft:red_mushroom_block","id":100,"data":14},{"name":"minecraft:red_mushroom_block","id":100,"data":15},{"name":"minecraft:iron_bars","id":101,"data":0},{"name":"minecraft:glass_pane","id":102,"data":0},{"name":"minecraft:melon_block","id":103,"data":0},{"name":"minecraft:pumpkin_stem","id":104,"data":0},{"name":"minecraft:pumpkin_stem","id":104,"data":1},{"name":"minecraft:pumpkin_stem","id":104,"data":2},{"name":"minecraft:pumpkin_stem","id":104,"data":3},{"name":"minecraft:pumpkin_stem","id":104,"data":4},{"name":"minecraft:pumpkin_stem","id":104,"data":5},{"name":"minecraft:pumpkin_stem","id":104,"data":6},{"name":"minecraft:pumpkin_stem","id":104,"data":7},{"name":"minecraft:melon_stem","id":105,"data":0},{"name":"minecraft:melon_stem","id":105,"data":1},{"name":"minecraft:melon_stem","id":105,"data":2},{"name":"minecraft:melon_stem","id":105,"data":3},{"name":"minecraft:melon_stem","id":105,"data":4},{"name":"minecraft:melon_stem","id":105,"data":5},{"name":"minecraft:melon_stem","id":105,"data":6},{"name":"minecraft:melon_stem","id":105,"data":7},{"name":"minecraft:vine","id":106,"data":0},{"name":"minecraft:vine","id":106,"data":1},{"name":"minecraft:vine","id":106,"data":2},{"name":"minecraft:vine","id":106,"data":3},{"name":"minecraft:vine","id":106,"data":4},{"name":"minecraft:vine","id":106,"data":5},{"name":"minecraft:vine","id":106,"data":6},{"name":"minecraft:vine","id":106,"data":7},{"name":"minecraft:vine","id":106,"data":8},{"name":"minecraft:vine","id":106,"data":9},{"name":"minecraft:vine","id":106,"data":10},{"name":"minecraft:vine","id":106,"data":11},{"name":"minecraft:vine","id":106,"data":12},{"name":"minecraft:vine","id":106,"data":13},{"name":"minecraft:vine","id":106,"data":14},{"name":"minecraft:vine","id":106,"data":15},{"name":"minecraft:fence_gate","id":107,"data":0},{"name":"minecraft:fence_gate","id":107,"data":1},{"name":"minecraft:fence_gate","id":107,"data":2},{"name":"minecraft:fence_gate","id":107,"data":3},{"name":"minecraft:fence_gate","id":107,"data":4},{"name":"minecraft:fence_gate","id":107,"data":5},{"name":"minecraft:fence_gate","id":107,"data":6},{"name":"minecraft:fence_gate","id":107,"data":7},{"name":"minecraft:fence_gate","id":107,"data":8},{"name":"minecraft:fence_gate","id":107,"data":9},{"name":"minecraft:fence_gate","id":107,"data":10},{"name":"minecraft:fence_gate","id":107,"data":11},{"name":"minecraft:fence_gate","id":107,"data":12},{"name":"minecraft:fence_gate","id":107,"data":13},{"name":"minecraft:fence_gate","id":107,"data":14},{"name":"minecraft:fence_gate","id":107,"data":15},{"name":"minecraft:brick_stairs","id":108,"data":0},{"name":"minecraft:brick_stairs","id":108,"data":1},{"name":"minecraft:brick_stairs","id":108,"data":2},{"name":"minecraft:brick_stairs","id":108,"data":3},{"name":"minecraft:brick_stairs","id":108,"data":4},{"name":"minecraft:brick_stairs","id":108,"data":5},{"name":"minecraft:brick_stairs","id":108,"data":6},{"name":"minecraft:brick_stairs","id":108,"data":7},{"name":"minecraft:stone_brick_stairs","id":109,"data":0},{"name":"minecraft:stone_brick_stairs","id":109,"data":1},{"name":"minecraft:stone_brick_stairs","id":109,"data":2},{"name":"minecraft:stone_brick_stairs","id":109,"data":3},{"name":"minecraft:stone_brick_stairs","id":109,"data":4},{"name":"minecraft:stone_brick_stairs","id":109,"data":5},{"name":"minecraft:stone_brick_stairs","id":109,"data":6},{"name":"minecraft:stone_brick_stairs","id":109,"data":7},{"name":"minecraft:mycelium","id":110,"data":0},{"name":"minecraft:waterlily","id":111,"data":0},{"name":"minecraft:nether_brick","id":112,"data":0},{"name":"minecraft:nether_brick_fence","id":113,"data":0},{"name":"minecraft:nether_brick_stairs","id":114,"data":0},{"name":"minecraft:nether_brick_stairs","id":114,"data":1},{"name":"minecraft:nether_brick_stairs","id":114,"data":2},{"name":"minecraft:nether_brick_stairs","id":114,"data":3},{"name":"minecraft:nether_brick_stairs","id":114,"data":4},{"name":"minecraft:nether_brick_stairs","id":114,"data":5},{"name":"minecraft:nether_brick_stairs","id":114,"data":6},{"name":"minecraft:nether_brick_stairs","id":114,"data":7},{"name":"minecraft:nether_wart","id":115,"data":0},{"name":"minecraft:nether_wart","id":115,"data":1},{"name":"minecraft:nether_wart","id":115,"data":2},{"name":"minecraft:nether_wart","id":115,"data":3},{"name":"minecraft:enchanting_table","id":116,"data":0},{"name":"minecraft:brewing_stand","id":117,"data":0},{"name":"minecraft:brewing_stand","id":117,"data":1},{"name":"minecraft:brewing_stand","id":117,"data":2},{"name":"minecraft:brewing_stand","id":117,"data":3},{"name":"minecraft:brewing_stand","id":117,"data":4},{"name":"minecraft:brewing_stand","id":117,"data":5},{"name":"minecraft:brewing_stand","id":117,"data":6},{"name":"minecraft:brewing_stand","id":117,"data":7},{"name":"minecraft:cauldron","id":118,"data":0},{"name":"minecraft:cauldron","id":118,"data":1},{"name":"minecraft:cauldron","id":118,"data":2},{"name":"minecraft:cauldron","id":118,"data":3},{"name":"minecraft:cauldron","id":118,"data":4},{"name":"minecraft:cauldron","id":118,"data":5},{"name":"minecraft:cauldron","id":118,"data":6},{"name":"minecraft:cauldron","id":118,"data":7},{"name":"minecraft:cauldron","id":118,"data":8},{"name":"minecraft:cauldron","id":118,"data":9},{"name":"minecraft:cauldron","id":118,"data":10},{"name":"minecraft:cauldron","id":118,"data":11},{"name":"minecraft:cauldron","id":118,"data":12},{"name":"minecraft:cauldron","id":118,"data":13},{"name":"minecraft:cauldron","id":118,"data":14},{"name":"minecraft:cauldron","id":118,"data":15},{"name":"minecraft:end_portal","id":119,"data":0},{"name":"minecraft:end_portal_frame","id":120,"data":0},{"name":"minecraft:end_portal_frame","id":120,"data":1},{"name":"minecraft:end_portal_frame","id":120,"data":2},{"name":"minecraft:end_portal_frame","id":120,"data":3},{"name":"minecraft:end_portal_frame","id":120,"data":4},{"name":"minecraft:end_portal_frame","id":120,"data":5},{"name":"minecraft:end_portal_frame","id":120,"data":6},{"name":"minecraft:end_portal_frame","id":120,"data":7},{"name":"minecraft:end_stone","id":121,"data":0},{"name":"minecraft:dragon_egg","id":122,"data":0},{"name":"minecraft:redstone_lamp","id":123,"data":0},{"name":"minecraft:lit_redstone_lamp","id":124,"data":0},{"name":"minecraft:dropper","id":125,"data":0},{"name":"minecraft:dropper","id":125,"data":1},{"name":"minecraft:dropper","id":125,"data":2},{"name":"minecraft:dropper","id":125,"data":3},{"name":"minecraft:dropper","id":125,"data":4},{"name":"minecraft:dropper","id":125,"data":5},{"name":"minecraft:dropper","id":125,"data":6},{"name":"minecraft:dropper","id":125,"data":7},{"name":"minecraft:dropper","id":125,"data":8},{"name":"minecraft:dropper","id":125,"data":9},{"name":"minecraft:dropper","id":125,"data":10},{"name":"minecraft:dropper","id":125,"data":11},{"name":"minecraft:dropper","id":125,"data":12},{"name":"minecraft:dropper","id":125,"data":13},{"name":"minecraft:dropper","id":125,"data":14},{"name":"minecraft:dropper","id":125,"data":15},{"name":"minecraft:activator_rail","id":126,"data":0},{"name":"minecraft:activator_rail","id":126,"data":1},{"name":"minecraft:activator_rail","id":126,"data":2},{"name":"minecraft:activator_rail","id":126,"data":3},{"name":"minecraft:activator_rail","id":126,"data":4},{"name":"minecraft:activator_rail","id":126,"data":5},{"name":"minecraft:activator_rail","id":126,"data":6},{"name":"minecraft:activator_rail","id":126,"data":7},{"name":"minecraft:activator_rail","id":126,"data":8},{"name":"minecraft:activator_rail","id":126,"data":9},{"name":"minecraft:activator_rail","id":126,"data":10},{"name":"minecraft:activator_rail","id":126,"data":11},{"name":"minecraft:activator_rail","id":126,"data":12},{"name":"minecraft:activator_rail","id":126,"data":13},{"name":"minecraft:activator_rail","id":126,"data":14},{"name":"minecraft:activator_rail","id":126,"data":15},{"name":"minecraft:cocoa","id":127,"data":0},{"name":"minecraft:cocoa","id":127,"data":1},{"name":"minecraft:cocoa","id":127,"data":2},{"name":"minecraft:cocoa","id":127,"data":3},{"name":"minecraft:cocoa","id":127,"data":4},{"name":"minecraft:cocoa","id":127,"data":5},{"name":"minecraft:cocoa","id":127,"data":6},{"name":"minecraft:cocoa","id":127,"data":7},{"name":"minecraft:cocoa","id":127,"data":8},{"name":"minecraft:cocoa","id":127,"data":9},{"name":"minecraft:cocoa","id":127,"data":10},{"name":"minecraft:cocoa","id":127,"data":11},{"name":"minecraft:cocoa","id":127,"data":12},{"name":"minecraft:cocoa","id":127,"data":13},{"name":"minecraft:cocoa","id":127,"data":14},{"name":"minecraft:cocoa","id":127,"data":15},{"name":"minecraft:sandstone_stairs","id":128,"data":0},{"name":"minecraft:sandstone_stairs","id":128,"data":1},{"name":"minecraft:sandstone_stairs","id":128,"data":2},{"name":"minecraft:sandstone_stairs","id":128,"data":3},{"name":"minecraft:sandstone_stairs","id":128,"data":4},{"name":"minecraft:sandstone_stairs","id":128,"data":5},{"name":"minecraft:sandstone_stairs","id":128,"data":6},{"name":"minecraft:sandstone_stairs","id":128,"data":7},{"name":"minecraft:emerald_ore","id":129,"data":0},{"name":"minecraft:ender_chest","id":130,"data":0},{"name":"minecraft:ender_chest","id":130,"data":1},{"name":"minecraft:ender_chest","id":130,"data":2},{"name":"minecraft:ender_chest","id":130,"data":3},{"name":"minecraft:ender_chest","id":130,"data":4},{"name":"minecraft:ender_chest","id":130,"data":5},{"name":"minecraft:ender_chest","id":130,"data":6},{"name":"minecraft:ender_chest","id":130,"data":7},{"name":"minecraft:tripwire_hook","id":131,"data":0},{"name":"minecraft:tripwire_hook","id":131,"data":1},{"name":"minecraft:tripwire_hook","id":131,"data":2},{"name":"minecraft:tripwire_hook","id":131,"data":3},{"name":"minecraft:tripwire_hook","id":131,"data":4},{"name":"minecraft:tripwire_hook","id":131,"data":5},{"name":"minecraft:tripwire_hook","id":131,"data":6},{"name":"minecraft:tripwire_hook","id":131,"data":7},{"name":"minecraft:tripwire_hook","id":131,"data":8},{"name":"minecraft:tripwire_hook","id":131,"data":9},{"name":"minecraft:tripwire_hook","id":131,"data":10},{"name":"minecraft:tripwire_hook","id":131,"data":11},{"name":"minecraft:tripwire_hook","id":131,"data":12},{"name":"minecraft:tripwire_hook","id":131,"data":13},{"name":"minecraft:tripwire_hook","id":131,"data":14},{"name":"minecraft:tripwire_hook","id":131,"data":15},{"name":"minecraft:tripWire","id":132,"data":0},{"name":"minecraft:tripWire","id":132,"data":1},{"name":"minecraft:tripWire","id":132,"data":2},{"name":"minecraft:tripWire","id":132,"data":3},{"name":"minecraft:tripWire","id":132,"data":4},{"name":"minecraft:tripWire","id":132,"data":5},{"name":"minecraft:tripWire","id":132,"data":6},{"name":"minecraft:tripWire","id":132,"data":7},{"name":"minecraft:tripWire","id":132,"data":8},{"name":"minecraft:tripWire","id":132,"data":9},{"name":"minecraft:tripWire","id":132,"data":10},{"name":"minecraft:tripWire","id":132,"data":11},{"name":"minecraft:tripWire","id":132,"data":12},{"name":"minecraft:tripWire","id":132,"data":13},{"name":"minecraft:tripWire","id":132,"data":14},{"name":"minecraft:tripWire","id":132,"data":15},{"name":"minecraft:emerald_block","id":133,"data":0},{"name":"minecraft:spruce_stairs","id":134,"data":0},{"name":"minecraft:spruce_stairs","id":134,"data":1},{"name":"minecraft:spruce_stairs","id":134,"data":2},{"name":"minecraft:spruce_stairs","id":134,"data":3},{"name":"minecraft:spruce_stairs","id":134,"data":4},{"name":"minecraft:spruce_stairs","id":134,"data":5},{"name":"minecraft:spruce_stairs","id":134,"data":6},{"name":"minecraft:spruce_stairs","id":134,"data":7},{"name":"minecraft:birch_stairs","id":135,"data":0},{"name":"minecraft:birch_stairs","id":135,"data":1},{"name":"minecraft:birch_stairs","id":135,"data":2},{"name":"minecraft:birch_stairs","id":135,"data":3},{"name":"minecraft:birch_stairs","id":135,"data":4},{"name":"minecraft:birch_stairs","id":135,"data":5},{"name":"minecraft:birch_stairs","id":135,"data":6},{"name":"minecraft:birch_stairs","id":135,"data":7},{"name":"minecraft:jungle_stairs","id":136,"data":0},{"name":"minecraft:jungle_stairs","id":136,"data":1},{"name":"minecraft:jungle_stairs","id":136,"data":2},{"name":"minecraft:jungle_stairs","id":136,"data":3},{"name":"minecraft:jungle_stairs","id":136,"data":4},{"name":"minecraft:jungle_stairs","id":136,"data":5},{"name":"minecraft:jungle_stairs","id":136,"data":6},{"name":"minecraft:jungle_stairs","id":136,"data":7},{"name":"minecraft:command_block","id":137,"data":0},{"name":"minecraft:command_block","id":137,"data":1},{"name":"minecraft:command_block","id":137,"data":2},{"name":"minecraft:command_block","id":137,"data":3},{"name":"minecraft:command_block","id":137,"data":4},{"name":"minecraft:command_block","id":137,"data":5},{"name":"minecraft:command_block","id":137,"data":6},{"name":"minecraft:command_block","id":137,"data":7},{"name":"minecraft:command_block","id":137,"data":8},{"name":"minecraft:command_block","id":137,"data":9},{"name":"minecraft:command_block","id":137,"data":10},{"name":"minecraft:command_block","id":137,"data":11},{"name":"minecraft:command_block","id":137,"data":12},{"name":"minecraft:command_block","id":137,"data":13},{"name":"minecraft:command_block","id":137,"data":14},{"name":"minecraft:command_block","id":137,"data":15},{"name":"minecraft:beacon","id":138,"data":0},{"name":"minecraft:cobblestone_wall","id":139,"data":0},{"name":"minecraft:cobblestone_wall","id":139,"data":1},{"name":"minecraft:cobblestone_wall","id":139,"data":2},{"name":"minecraft:cobblestone_wall","id":139,"data":3},{"name":"minecraft:cobblestone_wall","id":139,"data":4},{"name":"minecraft:cobblestone_wall","id":139,"data":5},{"name":"minecraft:cobblestone_wall","id":139,"data":6},{"name":"minecraft:cobblestone_wall","id":139,"data":7},{"name":"minecraft:cobblestone_wall","id":139,"data":8},{"name":"minecraft:cobblestone_wall","id":139,"data":9},{"name":"minecraft:cobblestone_wall","id":139,"data":10},{"name":"minecraft:cobblestone_wall","id":139,"data":11},{"name":"minecraft:cobblestone_wall","id":139,"data":12},{"name":"minecraft:cobblestone_wall","id":139,"data":13},{"name":"minecraft:cobblestone_wall","id":139,"data":14},{"name":"minecraft:cobblestone_wall","id":139,"data":15},{"name":"minecraft:flower_pot","id":140,"data":0},{"name":"minecraft:flower_pot","id":140,"data":1},{"name":"minecraft:carrots","id":141,"data":0},{"name":"minecraft:carrots","id":141,"data":1},{"name":"minecraft:carrots","id":141,"data":2},{"name":"minecraft:carrots","id":141,"data":3},{"name":"minecraft:carrots","id":141,"data":4},{"name":"minecraft:carrots","id":141,"data":5},{"name":"minecraft:carrots","id":141,"data":6},{"name":"minecraft:carrots","id":141,"data":7},{"name":"minecraft:potatoes","id":142,"data":0},{"name":"minecraft:potatoes","id":142,"data":1},{"name":"minecraft:potatoes","id":142,"data":2},{"name":"minecraft:potatoes","id":142,"data":3},{"name":"minecraft:potatoes","id":142,"data":4},{"name":"minecraft:potatoes","id":142,"data":5},{"name":"minecraft:potatoes","id":142,"data":6},{"name":"minecraft:potatoes","id":142,"data":7},{"name":"minecraft:wooden_button","id":143,"data":0},{"name":"minecraft:wooden_button","id":143,"data":1},{"name":"minecraft:wooden_button","id":143,"data":2},{"name":"minecraft:wooden_button","id":143,"data":3},{"name":"minecraft:wooden_button","id":143,"data":4},{"name":"minecraft:wooden_button","id":143,"data":5},{"name":"minecraft:wooden_button","id":143,"data":6},{"name":"minecraft:wooden_button","id":143,"data":7},{"name":"minecraft:wooden_button","id":143,"data":8},{"name":"minecraft:wooden_button","id":143,"data":9},{"name":"minecraft:wooden_button","id":143,"data":10},{"name":"minecraft:wooden_button","id":143,"data":11},{"name":"minecraft:wooden_button","id":143,"data":12},{"name":"minecraft:wooden_button","id":143,"data":13},{"name":"minecraft:wooden_button","id":143,"data":14},{"name":"minecraft:wooden_button","id":143,"data":15},{"name":"minecraft:skull","id":144,"data":0},{"name":"minecraft:skull","id":144,"data":1},{"name":"minecraft:skull","id":144,"data":2},{"name":"minecraft:skull","id":144,"data":3},{"name":"minecraft:skull","id":144,"data":4},{"name":"minecraft:skull","id":144,"data":5},{"name":"minecraft:skull","id":144,"data":6},{"name":"minecraft:skull","id":144,"data":7},{"name":"minecraft:skull","id":144,"data":8},{"name":"minecraft:skull","id":144,"data":9},{"name":"minecraft:skull","id":144,"data":10},{"name":"minecraft:skull","id":144,"data":11},{"name":"minecraft:skull","id":144,"data":12},{"name":"minecraft:skull","id":144,"data":13},{"name":"minecraft:skull","id":144,"data":14},{"name":"minecraft:skull","id":144,"data":15},{"name":"minecraft:anvil","id":145,"data":0},{"name":"minecraft:anvil","id":145,"data":1},{"name":"minecraft:anvil","id":145,"data":2},{"name":"minecraft:anvil","id":145,"data":3},{"name":"minecraft:anvil","id":145,"data":4},{"name":"minecraft:anvil","id":145,"data":5},{"name":"minecraft:anvil","id":145,"data":6},{"name":"minecraft:anvil","id":145,"data":7},{"name":"minecraft:anvil","id":145,"data":8},{"name":"minecraft:anvil","id":145,"data":9},{"name":"minecraft:anvil","id":145,"data":10},{"name":"minecraft:anvil","id":145,"data":11},{"name":"minecraft:anvil","id":145,"data":12},{"name":"minecraft:anvil","id":145,"data":13},{"name":"minecraft:anvil","id":145,"data":14},{"name":"minecraft:anvil","id":145,"data":15},{"name":"minecraft:trapped_chest","id":146,"data":0},{"name":"minecraft:trapped_chest","id":146,"data":1},{"name":"minecraft:trapped_chest","id":146,"data":2},{"name":"minecraft:trapped_chest","id":146,"data":3},{"name":"minecraft:trapped_chest","id":146,"data":4},{"name":"minecraft:trapped_chest","id":146,"data":5},{"name":"minecraft:trapped_chest","id":146,"data":6},{"name":"minecraft:trapped_chest","id":146,"data":7},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":0},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":1},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":2},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":3},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":4},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":5},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":6},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":7},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":8},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":9},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":10},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":11},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":12},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":13},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":14},{"name":"minecraft:light_weighted_pressure_plate","id":147,"data":15},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":0},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":1},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":2},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":3},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":4},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":5},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":6},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":7},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":8},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":9},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":10},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":11},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":12},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":13},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":14},{"name":"minecraft:heavy_weighted_pressure_plate","id":148,"data":15},{"name":"minecraft:unpowered_comparator","id":149,"data":0},{"name":"minecraft:unpowered_comparator","id":149,"data":1},{"name":"minecraft:unpowered_comparator","id":149,"data":2},{"name":"minecraft:unpowered_comparator","id":149,"data":3},{"name":"minecraft:unpowered_comparator","id":149,"data":4},{"name":"minecraft:unpowered_comparator","id":149,"data":5},{"name":"minecraft:unpowered_comparator","id":149,"data":6},{"name":"minecraft:unpowered_comparator","id":149,"data":7},{"name":"minecraft:unpowered_comparator","id":149,"data":8},{"name":"minecraft:unpowered_comparator","id":149,"data":9},{"name":"minecraft:unpowered_comparator","id":149,"data":10},{"name":"minecraft:unpowered_comparator","id":149,"data":11},{"name":"minecraft:unpowered_comparator","id":149,"data":12},{"name":"minecraft:unpowered_comparator","id":149,"data":13},{"name":"minecraft:unpowered_comparator","id":149,"data":14},{"name":"minecraft:unpowered_comparator","id":149,"data":15},{"name":"minecraft:powered_comparator","id":150,"data":0},{"name":"minecraft:powered_comparator","id":150,"data":1},{"name":"minecraft:powered_comparator","id":150,"data":2},{"name":"minecraft:powered_comparator","id":150,"data":3},{"name":"minecraft:powered_comparator","id":150,"data":4},{"name":"minecraft:powered_comparator","id":150,"data":5},{"name":"minecraft:powered_comparator","id":150,"data":6},{"name":"minecraft:powered_comparator","id":150,"data":7},{"name":"minecraft:powered_comparator","id":150,"data":8},{"name":"minecraft:powered_comparator","id":150,"data":9},{"name":"minecraft:powered_comparator","id":150,"data":10},{"name":"minecraft:powered_comparator","id":150,"data":11},{"name":"minecraft:powered_comparator","id":150,"data":12},{"name":"minecraft:powered_comparator","id":150,"data":13},{"name":"minecraft:powered_comparator","id":150,"data":14},{"name":"minecraft:powered_comparator","id":150,"data":15},{"name":"minecraft:daylight_detector","id":151,"data":0},{"name":"minecraft:daylight_detector","id":151,"data":1},{"name":"minecraft:daylight_detector","id":151,"data":2},{"name":"minecraft:daylight_detector","id":151,"data":3},{"name":"minecraft:daylight_detector","id":151,"data":4},{"name":"minecraft:daylight_detector","id":151,"data":5},{"name":"minecraft:daylight_detector","id":151,"data":6},{"name":"minecraft:daylight_detector","id":151,"data":7},{"name":"minecraft:daylight_detector","id":151,"data":8},{"name":"minecraft:daylight_detector","id":151,"data":9},{"name":"minecraft:daylight_detector","id":151,"data":10},{"name":"minecraft:daylight_detector","id":151,"data":11},{"name":"minecraft:daylight_detector","id":151,"data":12},{"name":"minecraft:daylight_detector","id":151,"data":13},{"name":"minecraft:daylight_detector","id":151,"data":14},{"name":"minecraft:daylight_detector","id":151,"data":15},{"name":"minecraft:redstone_block","id":152,"data":0},{"name":"minecraft:quartz_ore","id":153,"data":0},{"name":"minecraft:hopper","id":154,"data":0},{"name":"minecraft:hopper","id":154,"data":1},{"name":"minecraft:hopper","id":154,"data":2},{"name":"minecraft:hopper","id":154,"data":3},{"name":"minecraft:hopper","id":154,"data":4},{"name":"minecraft:hopper","id":154,"data":5},{"name":"minecraft:hopper","id":154,"data":6},{"name":"minecraft:hopper","id":154,"data":7},{"name":"minecraft:hopper","id":154,"data":8},{"name":"minecraft:hopper","id":154,"data":9},{"name":"minecraft:hopper","id":154,"data":10},{"name":"minecraft:hopper","id":154,"data":11},{"name":"minecraft:hopper","id":154,"data":12},{"name":"minecraft:hopper","id":154,"data":13},{"name":"minecraft:hopper","id":154,"data":14},{"name":"minecraft:hopper","id":154,"data":15},{"name":"minecraft:quartz_block","id":155,"data":0},{"name":"minecraft:quartz_block","id":155,"data":1},{"name":"minecraft:quartz_block","id":155,"data":2},{"name":"minecraft:quartz_block","id":155,"data":3},{"name":"minecraft:quartz_block","id":155,"data":4},{"name":"minecraft:quartz_block","id":155,"data":5},{"name":"minecraft:quartz_block","id":155,"data":6},{"name":"minecraft:quartz_block","id":155,"data":7},{"name":"minecraft:quartz_block","id":155,"data":8},{"name":"minecraft:quartz_block","id":155,"data":9},{"name":"minecraft:quartz_block","id":155,"data":10},{"name":"minecraft:quartz_block","id":155,"data":11},{"name":"minecraft:quartz_block","id":155,"data":12},{"name":"minecraft:quartz_block","id":155,"data":13},{"name":"minecraft:quartz_block","id":155,"data":14},{"name":"minecraft:quartz_block","id":155,"data":15},{"name":"minecraft:quartz_stairs","id":156,"data":0},{"name":"minecraft:quartz_stairs","id":156,"data":1},{"name":"minecraft:quartz_stairs","id":156,"data":2},{"name":"minecraft:quartz_stairs","id":156,"data":3},{"name":"minecraft:quartz_stairs","id":156,"data":4},{"name":"minecraft:quartz_stairs","id":156,"data":5},{"name":"minecraft:quartz_stairs","id":156,"data":6},{"name":"minecraft:quartz_stairs","id":156,"data":7},{"name":"minecraft:double_wooden_slab","id":157,"data":0},{"name":"minecraft:double_wooden_slab","id":157,"data":1},{"name":"minecraft:double_wooden_slab","id":157,"data":2},{"name":"minecraft:double_wooden_slab","id":157,"data":3},{"name":"minecraft:double_wooden_slab","id":157,"data":4},{"name":"minecraft:double_wooden_slab","id":157,"data":5},{"name":"minecraft:double_wooden_slab","id":157,"data":6},{"name":"minecraft:double_wooden_slab","id":157,"data":7},{"name":"minecraft:double_wooden_slab","id":157,"data":8},{"name":"minecraft:double_wooden_slab","id":157,"data":9},{"name":"minecraft:double_wooden_slab","id":157,"data":10},{"name":"minecraft:double_wooden_slab","id":157,"data":11},{"name":"minecraft:double_wooden_slab","id":157,"data":12},{"name":"minecraft:double_wooden_slab","id":157,"data":13},{"name":"minecraft:double_wooden_slab","id":157,"data":14},{"name":"minecraft:double_wooden_slab","id":157,"data":15},{"name":"minecraft:wooden_slab","id":158,"data":0},{"name":"minecraft:wooden_slab","id":158,"data":1},{"name":"minecraft:wooden_slab","id":158,"data":2},{"name":"minecraft:wooden_slab","id":158,"data":3},{"name":"minecraft:wooden_slab","id":158,"data":4},{"name":"minecraft:wooden_slab","id":158,"data":5},{"name":"minecraft:wooden_slab","id":158,"data":6},{"name":"minecraft:wooden_slab","id":158,"data":7},{"name":"minecraft:wooden_slab","id":158,"data":8},{"name":"minecraft:wooden_slab","id":158,"data":9},{"name":"minecraft:wooden_slab","id":158,"data":10},{"name":"minecraft:wooden_slab","id":158,"data":11},{"name":"minecraft:wooden_slab","id":158,"data":12},{"name":"minecraft:wooden_slab","id":158,"data":13},{"name":"minecraft:wooden_slab","id":158,"data":14},{"name":"minecraft:wooden_slab","id":158,"data":15},{"name":"minecraft:stained_hardened_clay","id":159,"data":0},{"name":"minecraft:stained_hardened_clay","id":159,"data":1},{"name":"minecraft:stained_hardened_clay","id":159,"data":2},{"name":"minecraft:stained_hardened_clay","id":159,"data":3},{"name":"minecraft:stained_hardened_clay","id":159,"data":4},{"name":"minecraft:stained_hardened_clay","id":159,"data":5},{"name":"minecraft:stained_hardened_clay","id":159,"data":6},{"name":"minecraft:stained_hardened_clay","id":159,"data":7},{"name":"minecraft:stained_hardened_clay","id":159,"data":8},{"name":"minecraft:stained_hardened_clay","id":159,"data":9},{"name":"minecraft:stained_hardened_clay","id":159,"data":10},{"name":"minecraft:stained_hardened_clay","id":159,"data":11},{"name":"minecraft:stained_hardened_clay","id":159,"data":12},{"name":"minecraft:stained_hardened_clay","id":159,"data":13},{"name":"minecraft:stained_hardened_clay","id":159,"data":14},{"name":"minecraft:stained_hardened_clay","id":159,"data":15},{"name":"minecraft:stained_glass_pane","id":160,"data":0},{"name":"minecraft:stained_glass_pane","id":160,"data":1},{"name":"minecraft:stained_glass_pane","id":160,"data":2},{"name":"minecraft:stained_glass_pane","id":160,"data":3},{"name":"minecraft:stained_glass_pane","id":160,"data":4},{"name":"minecraft:stained_glass_pane","id":160,"data":5},{"name":"minecraft:stained_glass_pane","id":160,"data":6},{"name":"minecraft:stained_glass_pane","id":160,"data":7},{"name":"minecraft:stained_glass_pane","id":160,"data":8},{"name":"minecraft:stained_glass_pane","id":160,"data":9},{"name":"minecraft:stained_glass_pane","id":160,"data":10},{"name":"minecraft:stained_glass_pane","id":160,"data":11},{"name":"minecraft:stained_glass_pane","id":160,"data":12},{"name":"minecraft:stained_glass_pane","id":160,"data":13},{"name":"minecraft:stained_glass_pane","id":160,"data":14},{"name":"minecraft:stained_glass_pane","id":160,"data":15},{"name":"minecraft:leaves2","id":161,"data":0},{"name":"minecraft:leaves2","id":161,"data":1},{"name":"minecraft:leaves2","id":161,"data":2},{"name":"minecraft:leaves2","id":161,"data":3},{"name":"minecraft:leaves2","id":161,"data":4},{"name":"minecraft:leaves2","id":161,"data":5},{"name":"minecraft:leaves2","id":161,"data":6},{"name":"minecraft:leaves2","id":161,"data":7},{"name":"minecraft:leaves2","id":161,"data":8},{"name":"minecraft:leaves2","id":161,"data":9},{"name":"minecraft:leaves2","id":161,"data":10},{"name":"minecraft:leaves2","id":161,"data":11},{"name":"minecraft:leaves2","id":161,"data":12},{"name":"minecraft:leaves2","id":161,"data":13},{"name":"minecraft:leaves2","id":161,"data":14},{"name":"minecraft:leaves2","id":161,"data":15},{"name":"minecraft:log2","id":162,"data":0},{"name":"minecraft:log2","id":162,"data":1},{"name":"minecraft:log2","id":162,"data":2},{"name":"minecraft:log2","id":162,"data":3},{"name":"minecraft:log2","id":162,"data":4},{"name":"minecraft:log2","id":162,"data":5},{"name":"minecraft:log2","id":162,"data":6},{"name":"minecraft:log2","id":162,"data":7},{"name":"minecraft:log2","id":162,"data":8},{"name":"minecraft:log2","id":162,"data":9},{"name":"minecraft:log2","id":162,"data":10},{"name":"minecraft:log2","id":162,"data":11},{"name":"minecraft:log2","id":162,"data":12},{"name":"minecraft:log2","id":162,"data":13},{"name":"minecraft:log2","id":162,"data":14},{"name":"minecraft:log2","id":162,"data":15},{"name":"minecraft:acacia_stairs","id":163,"data":0},{"name":"minecraft:acacia_stairs","id":163,"data":1},{"name":"minecraft:acacia_stairs","id":163,"data":2},{"name":"minecraft:acacia_stairs","id":163,"data":3},{"name":"minecraft:acacia_stairs","id":163,"data":4},{"name":"minecraft:acacia_stairs","id":163,"data":5},{"name":"minecraft:acacia_stairs","id":163,"data":6},{"name":"minecraft:acacia_stairs","id":163,"data":7},{"name":"minecraft:dark_oak_stairs","id":164,"data":0},{"name":"minecraft:dark_oak_stairs","id":164,"data":1},{"name":"minecraft:dark_oak_stairs","id":164,"data":2},{"name":"minecraft:dark_oak_stairs","id":164,"data":3},{"name":"minecraft:dark_oak_stairs","id":164,"data":4},{"name":"minecraft:dark_oak_stairs","id":164,"data":5},{"name":"minecraft:dark_oak_stairs","id":164,"data":6},{"name":"minecraft:dark_oak_stairs","id":164,"data":7},{"name":"minecraft:slime","id":165,"data":0},{"name":"minecraft:iron_trapdoor","id":167,"data":0},{"name":"minecraft:iron_trapdoor","id":167,"data":1},{"name":"minecraft:iron_trapdoor","id":167,"data":2},{"name":"minecraft:iron_trapdoor","id":167,"data":3},{"name":"minecraft:iron_trapdoor","id":167,"data":4},{"name":"minecraft:iron_trapdoor","id":167,"data":5},{"name":"minecraft:iron_trapdoor","id":167,"data":6},{"name":"minecraft:iron_trapdoor","id":167,"data":7},{"name":"minecraft:iron_trapdoor","id":167,"data":8},{"name":"minecraft:iron_trapdoor","id":167,"data":9},{"name":"minecraft:iron_trapdoor","id":167,"data":10},{"name":"minecraft:iron_trapdoor","id":167,"data":11},{"name":"minecraft:iron_trapdoor","id":167,"data":12},{"name":"minecraft:iron_trapdoor","id":167,"data":13},{"name":"minecraft:iron_trapdoor","id":167,"data":14},{"name":"minecraft:iron_trapdoor","id":167,"data":15},{"name":"minecraft:prismarine","id":168,"data":0},{"name":"minecraft:prismarine","id":168,"data":1},{"name":"minecraft:prismarine","id":168,"data":2},{"name":"minecraft:prismarine","id":168,"data":3},{"name":"minecraft:seaLantern","id":169,"data":0},{"name":"minecraft:hay_block","id":170,"data":0},{"name":"minecraft:hay_block","id":170,"data":1},{"name":"minecraft:hay_block","id":170,"data":2},{"name":"minecraft:hay_block","id":170,"data":3},{"name":"minecraft:hay_block","id":170,"data":4},{"name":"minecraft:hay_block","id":170,"data":5},{"name":"minecraft:hay_block","id":170,"data":6},{"name":"minecraft:hay_block","id":170,"data":7},{"name":"minecraft:hay_block","id":170,"data":8},{"name":"minecraft:hay_block","id":170,"data":9},{"name":"minecraft:hay_block","id":170,"data":10},{"name":"minecraft:hay_block","id":170,"data":11},{"name":"minecraft:hay_block","id":170,"data":12},{"name":"minecraft:hay_block","id":170,"data":13},{"name":"minecraft:hay_block","id":170,"data":14},{"name":"minecraft:hay_block","id":170,"data":15},{"name":"minecraft:carpet","id":171,"data":0},{"name":"minecraft:carpet","id":171,"data":1},{"name":"minecraft:carpet","id":171,"data":2},{"name":"minecraft:carpet","id":171,"data":3},{"name":"minecraft:carpet","id":171,"data":4},{"name":"minecraft:carpet","id":171,"data":5},{"name":"minecraft:carpet","id":171,"data":6},{"name":"minecraft:carpet","id":171,"data":7},{"name":"minecraft:carpet","id":171,"data":8},{"name":"minecraft:carpet","id":171,"data":9},{"name":"minecraft:carpet","id":171,"data":10},{"name":"minecraft:carpet","id":171,"data":11},{"name":"minecraft:carpet","id":171,"data":12},{"name":"minecraft:carpet","id":171,"data":13},{"name":"minecraft:carpet","id":171,"data":14},{"name":"minecraft:carpet","id":171,"data":15},{"name":"minecraft:hardened_clay","id":172,"data":0},{"name":"minecraft:coal_block","id":173,"data":0},{"name":"minecraft:packed_ice","id":174,"data":0},{"name":"minecraft:double_plant","id":175,"data":0},{"name":"minecraft:double_plant","id":175,"data":1},{"name":"minecraft:double_plant","id":175,"data":2},{"name":"minecraft:double_plant","id":175,"data":3},{"name":"minecraft:double_plant","id":175,"data":4},{"name":"minecraft:double_plant","id":175,"data":5},{"name":"minecraft:double_plant","id":175,"data":6},{"name":"minecraft:double_plant","id":175,"data":7},{"name":"minecraft:double_plant","id":175,"data":8},{"name":"minecraft:double_plant","id":175,"data":9},{"name":"minecraft:double_plant","id":175,"data":10},{"name":"minecraft:double_plant","id":175,"data":11},{"name":"minecraft:double_plant","id":175,"data":12},{"name":"minecraft:double_plant","id":175,"data":13},{"name":"minecraft:double_plant","id":175,"data":14},{"name":"minecraft:double_plant","id":175,"data":15},{"name":"minecraft:standing_banner","id":176,"data":0},{"name":"minecraft:standing_banner","id":176,"data":1},{"name":"minecraft:standing_banner","id":176,"data":2},{"name":"minecraft:standing_banner","id":176,"data":3},{"name":"minecraft:standing_banner","id":176,"data":4},{"name":"minecraft:standing_banner","id":176,"data":5},{"name":"minecraft:standing_banner","id":176,"data":6},{"name":"minecraft:standing_banner","id":176,"data":7},{"name":"minecraft:standing_banner","id":176,"data":8},{"name":"minecraft:standing_banner","id":176,"data":9},{"name":"minecraft:standing_banner","id":176,"data":10},{"name":"minecraft:standing_banner","id":176,"data":11},{"name":"minecraft:standing_banner","id":176,"data":12},{"name":"minecraft:standing_banner","id":176,"data":13},{"name":"minecraft:standing_banner","id":176,"data":14},{"name":"minecraft:standing_banner","id":176,"data":15},{"name":"minecraft:wall_banner","id":177,"data":0},{"name":"minecraft:wall_banner","id":177,"data":1},{"name":"minecraft:wall_banner","id":177,"data":2},{"name":"minecraft:wall_banner","id":177,"data":3},{"name":"minecraft:wall_banner","id":177,"data":4},{"name":"minecraft:wall_banner","id":177,"data":5},{"name":"minecraft:wall_banner","id":177,"data":6},{"name":"minecraft:wall_banner","id":177,"data":7},{"name":"minecraft:daylight_detector_inverted","id":178,"data":0},{"name":"minecraft:daylight_detector_inverted","id":178,"data":1},{"name":"minecraft:daylight_detector_inverted","id":178,"data":2},{"name":"minecraft:daylight_detector_inverted","id":178,"data":3},{"name":"minecraft:daylight_detector_inverted","id":178,"data":4},{"name":"minecraft:daylight_detector_inverted","id":178,"data":5},{"name":"minecraft:daylight_detector_inverted","id":178,"data":6},{"name":"minecraft:daylight_detector_inverted","id":178,"data":7},{"name":"minecraft:daylight_detector_inverted","id":178,"data":8},{"name":"minecraft:daylight_detector_inverted","id":178,"data":9},{"name":"minecraft:daylight_detector_inverted","id":178,"data":10},{"name":"minecraft:daylight_detector_inverted","id":178,"data":11},{"name":"minecraft:daylight_detector_inverted","id":178,"data":12},{"name":"minecraft:daylight_detector_inverted","id":178,"data":13},{"name":"minecraft:daylight_detector_inverted","id":178,"data":14},{"name":"minecraft:daylight_detector_inverted","id":178,"data":15},{"name":"minecraft:red_sandstone","id":179,"data":0},{"name":"minecraft:red_sandstone","id":179,"data":1},{"name":"minecraft:red_sandstone","id":179,"data":2},{"name":"minecraft:red_sandstone","id":179,"data":3},{"name":"minecraft:red_sandstone_stairs","id":180,"data":0},{"name":"minecraft:red_sandstone_stairs","id":180,"data":1},{"name":"minecraft:red_sandstone_stairs","id":180,"data":2},{"name":"minecraft:red_sandstone_stairs","id":180,"data":3},{"name":"minecraft:red_sandstone_stairs","id":180,"data":4},{"name":"minecraft:red_sandstone_stairs","id":180,"data":5},{"name":"minecraft:red_sandstone_stairs","id":180,"data":6},{"name":"minecraft:red_sandstone_stairs","id":180,"data":7},{"name":"minecraft:double_stone_slab2","id":181,"data":0},{"name":"minecraft:double_stone_slab2","id":181,"data":1},{"name":"minecraft:double_stone_slab2","id":181,"data":2},{"name":"minecraft:double_stone_slab2","id":181,"data":3},{"name":"minecraft:double_stone_slab2","id":181,"data":4},{"name":"minecraft:double_stone_slab2","id":181,"data":5},{"name":"minecraft:double_stone_slab2","id":181,"data":6},{"name":"minecraft:double_stone_slab2","id":181,"data":7},{"name":"minecraft:double_stone_slab2","id":181,"data":8},{"name":"minecraft:double_stone_slab2","id":181,"data":9},{"name":"minecraft:double_stone_slab2","id":181,"data":10},{"name":"minecraft:double_stone_slab2","id":181,"data":11},{"name":"minecraft:double_stone_slab2","id":181,"data":12},{"name":"minecraft:double_stone_slab2","id":181,"data":13},{"name":"minecraft:double_stone_slab2","id":181,"data":14},{"name":"minecraft:double_stone_slab2","id":181,"data":15},{"name":"minecraft:stone_slab2","id":182,"data":0},{"name":"minecraft:stone_slab2","id":182,"data":1},{"name":"minecraft:stone_slab2","id":182,"data":2},{"name":"minecraft:stone_slab2","id":182,"data":3},{"name":"minecraft:stone_slab2","id":182,"data":4},{"name":"minecraft:stone_slab2","id":182,"data":5},{"name":"minecraft:stone_slab2","id":182,"data":6},{"name":"minecraft:stone_slab2","id":182,"data":7},{"name":"minecraft:stone_slab2","id":182,"data":8},{"name":"minecraft:stone_slab2","id":182,"data":9},{"name":"minecraft:stone_slab2","id":182,"data":10},{"name":"minecraft:stone_slab2","id":182,"data":11},{"name":"minecraft:stone_slab2","id":182,"data":12},{"name":"minecraft:stone_slab2","id":182,"data":13},{"name":"minecraft:stone_slab2","id":182,"data":14},{"name":"minecraft:stone_slab2","id":182,"data":15},{"name":"minecraft:spruce_fence_gate","id":183,"data":0},{"name":"minecraft:spruce_fence_gate","id":183,"data":1},{"name":"minecraft:spruce_fence_gate","id":183,"data":2},{"name":"minecraft:spruce_fence_gate","id":183,"data":3},{"name":"minecraft:spruce_fence_gate","id":183,"data":4},{"name":"minecraft:spruce_fence_gate","id":183,"data":5},{"name":"minecraft:spruce_fence_gate","id":183,"data":6},{"name":"minecraft:spruce_fence_gate","id":183,"data":7},{"name":"minecraft:spruce_fence_gate","id":183,"data":8},{"name":"minecraft:spruce_fence_gate","id":183,"data":9},{"name":"minecraft:spruce_fence_gate","id":183,"data":10},{"name":"minecraft:spruce_fence_gate","id":183,"data":11},{"name":"minecraft:spruce_fence_gate","id":183,"data":12},{"name":"minecraft:spruce_fence_gate","id":183,"data":13},{"name":"minecraft:spruce_fence_gate","id":183,"data":14},{"name":"minecraft:spruce_fence_gate","id":183,"data":15},{"name":"minecraft:birch_fence_gate","id":184,"data":0},{"name":"minecraft:birch_fence_gate","id":184,"data":1},{"name":"minecraft:birch_fence_gate","id":184,"data":2},{"name":"minecraft:birch_fence_gate","id":184,"data":3},{"name":"minecraft:birch_fence_gate","id":184,"data":4},{"name":"minecraft:birch_fence_gate","id":184,"data":5},{"name":"minecraft:birch_fence_gate","id":184,"data":6},{"name":"minecraft:birch_fence_gate","id":184,"data":7},{"name":"minecraft:birch_fence_gate","id":184,"data":8},{"name":"minecraft:birch_fence_gate","id":184,"data":9},{"name":"minecraft:birch_fence_gate","id":184,"data":10},{"name":"minecraft:birch_fence_gate","id":184,"data":11},{"name":"minecraft:birch_fence_gate","id":184,"data":12},{"name":"minecraft:birch_fence_gate","id":184,"data":13},{"name":"minecraft:birch_fence_gate","id":184,"data":14},{"name":"minecraft:birch_fence_gate","id":184,"data":15},{"name":"minecraft:jungle_fence_gate","id":185,"data":0},{"name":"minecraft:jungle_fence_gate","id":185,"data":1},{"name":"minecraft:jungle_fence_gate","id":185,"data":2},{"name":"minecraft:jungle_fence_gate","id":185,"data":3},{"name":"minecraft:jungle_fence_gate","id":185,"data":4},{"name":"minecraft:jungle_fence_gate","id":185,"data":5},{"name":"minecraft:jungle_fence_gate","id":185,"data":6},{"name":"minecraft:jungle_fence_gate","id":185,"data":7},{"name":"minecraft:jungle_fence_gate","id":185,"data":8},{"name":"minecraft:jungle_fence_gate","id":185,"data":9},{"name":"minecraft:jungle_fence_gate","id":185,"data":10},{"name":"minecraft:jungle_fence_gate","id":185,"data":11},{"name":"minecraft:jungle_fence_gate","id":185,"data":12},{"name":"minecraft:jungle_fence_gate","id":185,"data":13},{"name":"minecraft:jungle_fence_gate","id":185,"data":14},{"name":"minecraft:jungle_fence_gate","id":185,"data":15},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":0},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":1},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":2},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":3},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":4},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":5},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":6},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":7},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":8},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":9},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":10},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":11},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":12},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":13},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":14},{"name":"minecraft:dark_oak_fence_gate","id":186,"data":15},{"name":"minecraft:acacia_fence_gate","id":187,"data":0},{"name":"minecraft:acacia_fence_gate","id":187,"data":1},{"name":"minecraft:acacia_fence_gate","id":187,"data":2},{"name":"minecraft:acacia_fence_gate","id":187,"data":3},{"name":"minecraft:acacia_fence_gate","id":187,"data":4},{"name":"minecraft:acacia_fence_gate","id":187,"data":5},{"name":"minecraft:acacia_fence_gate","id":187,"data":6},{"name":"minecraft:acacia_fence_gate","id":187,"data":7},{"name":"minecraft:acacia_fence_gate","id":187,"data":8},{"name":"minecraft:acacia_fence_gate","id":187,"data":9},{"name":"minecraft:acacia_fence_gate","id":187,"data":10},{"name":"minecraft:acacia_fence_gate","id":187,"data":11},{"name":"minecraft:acacia_fence_gate","id":187,"data":12},{"name":"minecraft:acacia_fence_gate","id":187,"data":13},{"name":"minecraft:acacia_fence_gate","id":187,"data":14},{"name":"minecraft:acacia_fence_gate","id":187,"data":15},{"name":"minecraft:repeating_command_block","id":188,"data":0},{"name":"minecraft:repeating_command_block","id":188,"data":1},{"name":"minecraft:repeating_command_block","id":188,"data":2},{"name":"minecraft:repeating_command_block","id":188,"data":3},{"name":"minecraft:repeating_command_block","id":188,"data":4},{"name":"minecraft:repeating_command_block","id":188,"data":5},{"name":"minecraft:repeating_command_block","id":188,"data":6},{"name":"minecraft:repeating_command_block","id":188,"data":7},{"name":"minecraft:repeating_command_block","id":188,"data":8},{"name":"minecraft:repeating_command_block","id":188,"data":9},{"name":"minecraft:repeating_command_block","id":188,"data":10},{"name":"minecraft:repeating_command_block","id":188,"data":11},{"name":"minecraft:repeating_command_block","id":188,"data":12},{"name":"minecraft:repeating_command_block","id":188,"data":13},{"name":"minecraft:repeating_command_block","id":188,"data":14},{"name":"minecraft:repeating_command_block","id":188,"data":15},{"name":"minecraft:chain_command_block","id":189,"data":0},{"name":"minecraft:chain_command_block","id":189,"data":1},{"name":"minecraft:chain_command_block","id":189,"data":2},{"name":"minecraft:chain_command_block","id":189,"data":3},{"name":"minecraft:chain_command_block","id":189,"data":4},{"name":"minecraft:chain_command_block","id":189,"data":5},{"name":"minecraft:chain_command_block","id":189,"data":6},{"name":"minecraft:chain_command_block","id":189,"data":7},{"name":"minecraft:chain_command_block","id":189,"data":8},{"name":"minecraft:chain_command_block","id":189,"data":9},{"name":"minecraft:chain_command_block","id":189,"data":10},{"name":"minecraft:chain_command_block","id":189,"data":11},{"name":"minecraft:chain_command_block","id":189,"data":12},{"name":"minecraft:chain_command_block","id":189,"data":13},{"name":"minecraft:chain_command_block","id":189,"data":14},{"name":"minecraft:chain_command_block","id":189,"data":15},{"name":"minecraft:hard_glass_pane","id":190,"data":0},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":0},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":1},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":2},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":3},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":4},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":5},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":6},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":7},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":8},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":9},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":10},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":11},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":12},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":13},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":14},{"name":"minecraft:hard_stained_glass_pane","id":191,"data":15},{"name":"minecraft:chemical_heat","id":192,"data":0},{"name":"minecraft:spruce_door","id":193,"data":0},{"name":"minecraft:spruce_door","id":193,"data":1},{"name":"minecraft:spruce_door","id":193,"data":2},{"name":"minecraft:spruce_door","id":193,"data":3},{"name":"minecraft:spruce_door","id":193,"data":4},{"name":"minecraft:spruce_door","id":193,"data":5},{"name":"minecraft:spruce_door","id":193,"data":6},{"name":"minecraft:spruce_door","id":193,"data":7},{"name":"minecraft:spruce_door","id":193,"data":8},{"name":"minecraft:spruce_door","id":193,"data":9},{"name":"minecraft:spruce_door","id":193,"data":10},{"name":"minecraft:spruce_door","id":193,"data":11},{"name":"minecraft:spruce_door","id":193,"data":12},{"name":"minecraft:spruce_door","id":193,"data":13},{"name":"minecraft:spruce_door","id":193,"data":14},{"name":"minecraft:spruce_door","id":193,"data":15},{"name":"minecraft:spruce_door","id":193,"data":16},{"name":"minecraft:spruce_door","id":193,"data":17},{"name":"minecraft:spruce_door","id":193,"data":18},{"name":"minecraft:spruce_door","id":193,"data":19},{"name":"minecraft:spruce_door","id":193,"data":20},{"name":"minecraft:spruce_door","id":193,"data":21},{"name":"minecraft:spruce_door","id":193,"data":22},{"name":"minecraft:spruce_door","id":193,"data":23},{"name":"minecraft:spruce_door","id":193,"data":24},{"name":"minecraft:spruce_door","id":193,"data":25},{"name":"minecraft:spruce_door","id":193,"data":26},{"name":"minecraft:spruce_door","id":193,"data":27},{"name":"minecraft:spruce_door","id":193,"data":28},{"name":"minecraft:spruce_door","id":193,"data":29},{"name":"minecraft:spruce_door","id":193,"data":30},{"name":"minecraft:spruce_door","id":193,"data":31},{"name":"minecraft:birch_door","id":194,"data":0},{"name":"minecraft:birch_door","id":194,"data":1},{"name":"minecraft:birch_door","id":194,"data":2},{"name":"minecraft:birch_door","id":194,"data":3},{"name":"minecraft:birch_door","id":194,"data":4},{"name":"minecraft:birch_door","id":194,"data":5},{"name":"minecraft:birch_door","id":194,"data":6},{"name":"minecraft:birch_door","id":194,"data":7},{"name":"minecraft:birch_door","id":194,"data":8},{"name":"minecraft:birch_door","id":194,"data":9},{"name":"minecraft:birch_door","id":194,"data":10},{"name":"minecraft:birch_door","id":194,"data":11},{"name":"minecraft:birch_door","id":194,"data":12},{"name":"minecraft:birch_door","id":194,"data":13},{"name":"minecraft:birch_door","id":194,"data":14},{"name":"minecraft:birch_door","id":194,"data":15},{"name":"minecraft:birch_door","id":194,"data":16},{"name":"minecraft:birch_door","id":194,"data":17},{"name":"minecraft:birch_door","id":194,"data":18},{"name":"minecraft:birch_door","id":194,"data":19},{"name":"minecraft:birch_door","id":194,"data":20},{"name":"minecraft:birch_door","id":194,"data":21},{"name":"minecraft:birch_door","id":194,"data":22},{"name":"minecraft:birch_door","id":194,"data":23},{"name":"minecraft:birch_door","id":194,"data":24},{"name":"minecraft:birch_door","id":194,"data":25},{"name":"minecraft:birch_door","id":194,"data":26},{"name":"minecraft:birch_door","id":194,"data":27},{"name":"minecraft:birch_door","id":194,"data":28},{"name":"minecraft:birch_door","id":194,"data":29},{"name":"minecraft:birch_door","id":194,"data":30},{"name":"minecraft:birch_door","id":194,"data":31},{"name":"minecraft:jungle_door","id":195,"data":0},{"name":"minecraft:jungle_door","id":195,"data":1},{"name":"minecraft:jungle_door","id":195,"data":2},{"name":"minecraft:jungle_door","id":195,"data":3},{"name":"minecraft:jungle_door","id":195,"data":4},{"name":"minecraft:jungle_door","id":195,"data":5},{"name":"minecraft:jungle_door","id":195,"data":6},{"name":"minecraft:jungle_door","id":195,"data":7},{"name":"minecraft:jungle_door","id":195,"data":8},{"name":"minecraft:jungle_door","id":195,"data":9},{"name":"minecraft:jungle_door","id":195,"data":10},{"name":"minecraft:jungle_door","id":195,"data":11},{"name":"minecraft:jungle_door","id":195,"data":12},{"name":"minecraft:jungle_door","id":195,"data":13},{"name":"minecraft:jungle_door","id":195,"data":14},{"name":"minecraft:jungle_door","id":195,"data":15},{"name":"minecraft:jungle_door","id":195,"data":16},{"name":"minecraft:jungle_door","id":195,"data":17},{"name":"minecraft:jungle_door","id":195,"data":18},{"name":"minecraft:jungle_door","id":195,"data":19},{"name":"minecraft:jungle_door","id":195,"data":20},{"name":"minecraft:jungle_door","id":195,"data":21},{"name":"minecraft:jungle_door","id":195,"data":22},{"name":"minecraft:jungle_door","id":195,"data":23},{"name":"minecraft:jungle_door","id":195,"data":24},{"name":"minecraft:jungle_door","id":195,"data":25},{"name":"minecraft:jungle_door","id":195,"data":26},{"name":"minecraft:jungle_door","id":195,"data":27},{"name":"minecraft:jungle_door","id":195,"data":28},{"name":"minecraft:jungle_door","id":195,"data":29},{"name":"minecraft:jungle_door","id":195,"data":30},{"name":"minecraft:jungle_door","id":195,"data":31},{"name":"minecraft:acacia_door","id":196,"data":0},{"name":"minecraft:acacia_door","id":196,"data":1},{"name":"minecraft:acacia_door","id":196,"data":2},{"name":"minecraft:acacia_door","id":196,"data":3},{"name":"minecraft:acacia_door","id":196,"data":4},{"name":"minecraft:acacia_door","id":196,"data":5},{"name":"minecraft:acacia_door","id":196,"data":6},{"name":"minecraft:acacia_door","id":196,"data":7},{"name":"minecraft:acacia_door","id":196,"data":8},{"name":"minecraft:acacia_door","id":196,"data":9},{"name":"minecraft:acacia_door","id":196,"data":10},{"name":"minecraft:acacia_door","id":196,"data":11},{"name":"minecraft:acacia_door","id":196,"data":12},{"name":"minecraft:acacia_door","id":196,"data":13},{"name":"minecraft:acacia_door","id":196,"data":14},{"name":"minecraft:acacia_door","id":196,"data":15},{"name":"minecraft:acacia_door","id":196,"data":16},{"name":"minecraft:acacia_door","id":196,"data":17},{"name":"minecraft:acacia_door","id":196,"data":18},{"name":"minecraft:acacia_door","id":196,"data":19},{"name":"minecraft:acacia_door","id":196,"data":20},{"name":"minecraft:acacia_door","id":196,"data":21},{"name":"minecraft:acacia_door","id":196,"data":22},{"name":"minecraft:acacia_door","id":196,"data":23},{"name":"minecraft:acacia_door","id":196,"data":24},{"name":"minecraft:acacia_door","id":196,"data":25},{"name":"minecraft:acacia_door","id":196,"data":26},{"name":"minecraft:acacia_door","id":196,"data":27},{"name":"minecraft:acacia_door","id":196,"data":28},{"name":"minecraft:acacia_door","id":196,"data":29},{"name":"minecraft:acacia_door","id":196,"data":30},{"name":"minecraft:acacia_door","id":196,"data":31},{"name":"minecraft:dark_oak_door","id":197,"data":0},{"name":"minecraft:dark_oak_door","id":197,"data":1},{"name":"minecraft:dark_oak_door","id":197,"data":2},{"name":"minecraft:dark_oak_door","id":197,"data":3},{"name":"minecraft:dark_oak_door","id":197,"data":4},{"name":"minecraft:dark_oak_door","id":197,"data":5},{"name":"minecraft:dark_oak_door","id":197,"data":6},{"name":"minecraft:dark_oak_door","id":197,"data":7},{"name":"minecraft:dark_oak_door","id":197,"data":8},{"name":"minecraft:dark_oak_door","id":197,"data":9},{"name":"minecraft:dark_oak_door","id":197,"data":10},{"name":"minecraft:dark_oak_door","id":197,"data":11},{"name":"minecraft:dark_oak_door","id":197,"data":12},{"name":"minecraft:dark_oak_door","id":197,"data":13},{"name":"minecraft:dark_oak_door","id":197,"data":14},{"name":"minecraft:dark_oak_door","id":197,"data":15},{"name":"minecraft:dark_oak_door","id":197,"data":16},{"name":"minecraft:dark_oak_door","id":197,"data":17},{"name":"minecraft:dark_oak_door","id":197,"data":18},{"name":"minecraft:dark_oak_door","id":197,"data":19},{"name":"minecraft:dark_oak_door","id":197,"data":20},{"name":"minecraft:dark_oak_door","id":197,"data":21},{"name":"minecraft:dark_oak_door","id":197,"data":22},{"name":"minecraft:dark_oak_door","id":197,"data":23},{"name":"minecraft:dark_oak_door","id":197,"data":24},{"name":"minecraft:dark_oak_door","id":197,"data":25},{"name":"minecraft:dark_oak_door","id":197,"data":26},{"name":"minecraft:dark_oak_door","id":197,"data":27},{"name":"minecraft:dark_oak_door","id":197,"data":28},{"name":"minecraft:dark_oak_door","id":197,"data":29},{"name":"minecraft:dark_oak_door","id":197,"data":30},{"name":"minecraft:dark_oak_door","id":197,"data":31},{"name":"minecraft:grass_path","id":198,"data":0},{"name":"minecraft:frame","id":199,"data":0},{"name":"minecraft:frame","id":199,"data":1},{"name":"minecraft:frame","id":199,"data":2},{"name":"minecraft:frame","id":199,"data":3},{"name":"minecraft:frame","id":199,"data":4},{"name":"minecraft:frame","id":199,"data":5},{"name":"minecraft:frame","id":199,"data":6},{"name":"minecraft:frame","id":199,"data":7},{"name":"minecraft:chorus_flower","id":200,"data":0},{"name":"minecraft:chorus_flower","id":200,"data":1},{"name":"minecraft:chorus_flower","id":200,"data":2},{"name":"minecraft:chorus_flower","id":200,"data":3},{"name":"minecraft:chorus_flower","id":200,"data":4},{"name":"minecraft:chorus_flower","id":200,"data":5},{"name":"minecraft:chorus_flower","id":200,"data":6},{"name":"minecraft:chorus_flower","id":200,"data":7},{"name":"minecraft:purpur_block","id":201,"data":0},{"name":"minecraft:purpur_block","id":201,"data":1},{"name":"minecraft:purpur_block","id":201,"data":2},{"name":"minecraft:purpur_block","id":201,"data":3},{"name":"minecraft:purpur_block","id":201,"data":4},{"name":"minecraft:purpur_block","id":201,"data":5},{"name":"minecraft:purpur_block","id":201,"data":6},{"name":"minecraft:purpur_block","id":201,"data":7},{"name":"minecraft:purpur_block","id":201,"data":8},{"name":"minecraft:purpur_block","id":201,"data":9},{"name":"minecraft:purpur_block","id":201,"data":10},{"name":"minecraft:purpur_block","id":201,"data":11},{"name":"minecraft:purpur_block","id":201,"data":12},{"name":"minecraft:purpur_block","id":201,"data":13},{"name":"minecraft:purpur_block","id":201,"data":14},{"name":"minecraft:purpur_block","id":201,"data":15},{"name":"minecraft:colored_torch_rg","id":202,"data":0},{"name":"minecraft:colored_torch_rg","id":202,"data":1},{"name":"minecraft:colored_torch_rg","id":202,"data":2},{"name":"minecraft:colored_torch_rg","id":202,"data":3},{"name":"minecraft:colored_torch_rg","id":202,"data":4},{"name":"minecraft:colored_torch_rg","id":202,"data":5},{"name":"minecraft:colored_torch_rg","id":202,"data":6},{"name":"minecraft:colored_torch_rg","id":202,"data":7},{"name":"minecraft:colored_torch_rg","id":202,"data":8},{"name":"minecraft:colored_torch_rg","id":202,"data":9},{"name":"minecraft:colored_torch_rg","id":202,"data":10},{"name":"minecraft:colored_torch_rg","id":202,"data":11},{"name":"minecraft:colored_torch_rg","id":202,"data":12},{"name":"minecraft:colored_torch_rg","id":202,"data":13},{"name":"minecraft:colored_torch_rg","id":202,"data":14},{"name":"minecraft:colored_torch_rg","id":202,"data":15},{"name":"minecraft:purpur_stairs","id":203,"data":0},{"name":"minecraft:purpur_stairs","id":203,"data":1},{"name":"minecraft:purpur_stairs","id":203,"data":2},{"name":"minecraft:purpur_stairs","id":203,"data":3},{"name":"minecraft:purpur_stairs","id":203,"data":4},{"name":"minecraft:purpur_stairs","id":203,"data":5},{"name":"minecraft:purpur_stairs","id":203,"data":6},{"name":"minecraft:purpur_stairs","id":203,"data":7},{"name":"minecraft:colored_torch_bp","id":204,"data":0},{"name":"minecraft:colored_torch_bp","id":204,"data":1},{"name":"minecraft:colored_torch_bp","id":204,"data":2},{"name":"minecraft:colored_torch_bp","id":204,"data":3},{"name":"minecraft:colored_torch_bp","id":204,"data":4},{"name":"minecraft:colored_torch_bp","id":204,"data":5},{"name":"minecraft:colored_torch_bp","id":204,"data":6},{"name":"minecraft:colored_torch_bp","id":204,"data":7},{"name":"minecraft:colored_torch_bp","id":204,"data":8},{"name":"minecraft:colored_torch_bp","id":204,"data":9},{"name":"minecraft:colored_torch_bp","id":204,"data":10},{"name":"minecraft:colored_torch_bp","id":204,"data":11},{"name":"minecraft:colored_torch_bp","id":204,"data":12},{"name":"minecraft:colored_torch_bp","id":204,"data":13},{"name":"minecraft:colored_torch_bp","id":204,"data":14},{"name":"minecraft:colored_torch_bp","id":204,"data":15},{"name":"minecraft:undyed_shulker_box","id":205,"data":0},{"name":"minecraft:end_bricks","id":206,"data":0},{"name":"minecraft:frosted_ice","id":207,"data":0},{"name":"minecraft:frosted_ice","id":207,"data":1},{"name":"minecraft:frosted_ice","id":207,"data":2},{"name":"minecraft:frosted_ice","id":207,"data":3},{"name":"minecraft:end_rod","id":208,"data":0},{"name":"minecraft:end_rod","id":208,"data":1},{"name":"minecraft:end_rod","id":208,"data":2},{"name":"minecraft:end_rod","id":208,"data":3},{"name":"minecraft:end_rod","id":208,"data":4},{"name":"minecraft:end_rod","id":208,"data":5},{"name":"minecraft:end_rod","id":208,"data":6},{"name":"minecraft:end_rod","id":208,"data":7},{"name":"minecraft:end_gateway","id":209,"data":0},{"name":"minecraft:magma","id":213,"data":0},{"name":"minecraft:nether_wart_block","id":214,"data":0},{"name":"minecraft:red_nether_brick","id":215,"data":0},{"name":"minecraft:bone_block","id":216,"data":0},{"name":"minecraft:bone_block","id":216,"data":1},{"name":"minecraft:bone_block","id":216,"data":2},{"name":"minecraft:bone_block","id":216,"data":3},{"name":"minecraft:bone_block","id":216,"data":4},{"name":"minecraft:bone_block","id":216,"data":5},{"name":"minecraft:bone_block","id":216,"data":6},{"name":"minecraft:bone_block","id":216,"data":7},{"name":"minecraft:bone_block","id":216,"data":8},{"name":"minecraft:bone_block","id":216,"data":9},{"name":"minecraft:bone_block","id":216,"data":10},{"name":"minecraft:bone_block","id":216,"data":11},{"name":"minecraft:bone_block","id":216,"data":12},{"name":"minecraft:bone_block","id":216,"data":13},{"name":"minecraft:bone_block","id":216,"data":14},{"name":"minecraft:bone_block","id":216,"data":15},{"name":"minecraft:shulker_box","id":218,"data":0},{"name":"minecraft:shulker_box","id":218,"data":1},{"name":"minecraft:shulker_box","id":218,"data":2},{"name":"minecraft:shulker_box","id":218,"data":3},{"name":"minecraft:shulker_box","id":218,"data":4},{"name":"minecraft:shulker_box","id":218,"data":5},{"name":"minecraft:shulker_box","id":218,"data":6},{"name":"minecraft:shulker_box","id":218,"data":7},{"name":"minecraft:shulker_box","id":218,"data":8},{"name":"minecraft:shulker_box","id":218,"data":9},{"name":"minecraft:shulker_box","id":218,"data":10},{"name":"minecraft:shulker_box","id":218,"data":11},{"name":"minecraft:shulker_box","id":218,"data":12},{"name":"minecraft:shulker_box","id":218,"data":13},{"name":"minecraft:shulker_box","id":218,"data":14},{"name":"minecraft:shulker_box","id":218,"data":15},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":0},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":1},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":2},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":3},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":4},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":5},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":6},{"name":"minecraft:purple_glazed_terracotta","id":219,"data":7},{"name":"minecraft:white_glazed_terracotta","id":220,"data":0},{"name":"minecraft:white_glazed_terracotta","id":220,"data":1},{"name":"minecraft:white_glazed_terracotta","id":220,"data":2},{"name":"minecraft:white_glazed_terracotta","id":220,"data":3},{"name":"minecraft:white_glazed_terracotta","id":220,"data":4},{"name":"minecraft:white_glazed_terracotta","id":220,"data":5},{"name":"minecraft:white_glazed_terracotta","id":220,"data":6},{"name":"minecraft:white_glazed_terracotta","id":220,"data":7},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":0},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":1},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":2},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":3},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":4},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":5},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":6},{"name":"minecraft:orange_glazed_terracotta","id":221,"data":7},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":0},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":1},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":2},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":3},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":4},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":5},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":6},{"name":"minecraft:magenta_glazed_terracotta","id":222,"data":7},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":0},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":1},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":2},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":3},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":4},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":5},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":6},{"name":"minecraft:light_blue_glazed_terracotta","id":223,"data":7},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":0},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":1},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":2},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":3},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":4},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":5},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":6},{"name":"minecraft:yellow_glazed_terracotta","id":224,"data":7},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":0},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":1},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":2},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":3},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":4},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":5},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":6},{"name":"minecraft:lime_glazed_terracotta","id":225,"data":7},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":0},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":1},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":2},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":3},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":4},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":5},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":6},{"name":"minecraft:pink_glazed_terracotta","id":226,"data":7},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":0},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":1},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":2},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":3},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":4},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":5},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":6},{"name":"minecraft:gray_glazed_terracotta","id":227,"data":7},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":0},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":1},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":2},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":3},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":4},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":5},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":6},{"name":"minecraft:silver_glazed_terracotta","id":228,"data":7},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":0},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":1},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":2},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":3},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":4},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":5},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":6},{"name":"minecraft:cyan_glazed_terracotta","id":229,"data":7},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":0},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":1},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":2},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":3},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":4},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":5},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":6},{"name":"minecraft:blue_glazed_terracotta","id":231,"data":7},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":0},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":1},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":2},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":3},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":4},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":5},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":6},{"name":"minecraft:brown_glazed_terracotta","id":232,"data":7},{"name":"minecraft:green_glazed_terracotta","id":233,"data":0},{"name":"minecraft:green_glazed_terracotta","id":233,"data":1},{"name":"minecraft:green_glazed_terracotta","id":233,"data":2},{"name":"minecraft:green_glazed_terracotta","id":233,"data":3},{"name":"minecraft:green_glazed_terracotta","id":233,"data":4},{"name":"minecraft:green_glazed_terracotta","id":233,"data":5},{"name":"minecraft:green_glazed_terracotta","id":233,"data":6},{"name":"minecraft:green_glazed_terracotta","id":233,"data":7},{"name":"minecraft:red_glazed_terracotta","id":234,"data":0},{"name":"minecraft:red_glazed_terracotta","id":234,"data":1},{"name":"minecraft:red_glazed_terracotta","id":234,"data":2},{"name":"minecraft:red_glazed_terracotta","id":234,"data":3},{"name":"minecraft:red_glazed_terracotta","id":234,"data":4},{"name":"minecraft:red_glazed_terracotta","id":234,"data":5},{"name":"minecraft:red_glazed_terracotta","id":234,"data":6},{"name":"minecraft:red_glazed_terracotta","id":234,"data":7},{"name":"minecraft:black_glazed_terracotta","id":235,"data":0},{"name":"minecraft:black_glazed_terracotta","id":235,"data":1},{"name":"minecraft:black_glazed_terracotta","id":235,"data":2},{"name":"minecraft:black_glazed_terracotta","id":235,"data":3},{"name":"minecraft:black_glazed_terracotta","id":235,"data":4},{"name":"minecraft:black_glazed_terracotta","id":235,"data":5},{"name":"minecraft:black_glazed_terracotta","id":235,"data":6},{"name":"minecraft:black_glazed_terracotta","id":235,"data":7},{"name":"minecraft:concrete","id":236,"data":0},{"name":"minecraft:concrete","id":236,"data":1},{"name":"minecraft:concrete","id":236,"data":2},{"name":"minecraft:concrete","id":236,"data":3},{"name":"minecraft:concrete","id":236,"data":4},{"name":"minecraft:concrete","id":236,"data":5},{"name":"minecraft:concrete","id":236,"data":6},{"name":"minecraft:concrete","id":236,"data":7},{"name":"minecraft:concrete","id":236,"data":8},{"name":"minecraft:concrete","id":236,"data":9},{"name":"minecraft:concrete","id":236,"data":10},{"name":"minecraft:concrete","id":236,"data":11},{"name":"minecraft:concrete","id":236,"data":12},{"name":"minecraft:concrete","id":236,"data":13},{"name":"minecraft:concrete","id":236,"data":14},{"name":"minecraft:concrete","id":236,"data":15},{"name":"minecraft:concretePowder","id":237,"data":0},{"name":"minecraft:concretePowder","id":237,"data":1},{"name":"minecraft:concretePowder","id":237,"data":2},{"name":"minecraft:concretePowder","id":237,"data":3},{"name":"minecraft:concretePowder","id":237,"data":4},{"name":"minecraft:concretePowder","id":237,"data":5},{"name":"minecraft:concretePowder","id":237,"data":6},{"name":"minecraft:concretePowder","id":237,"data":7},{"name":"minecraft:concretePowder","id":237,"data":8},{"name":"minecraft:concretePowder","id":237,"data":9},{"name":"minecraft:concretePowder","id":237,"data":10},{"name":"minecraft:concretePowder","id":237,"data":11},{"name":"minecraft:concretePowder","id":237,"data":12},{"name":"minecraft:concretePowder","id":237,"data":13},{"name":"minecraft:concretePowder","id":237,"data":14},{"name":"minecraft:concretePowder","id":237,"data":15},{"name":"minecraft:chemistry_table","id":238,"data":0},{"name":"minecraft:chemistry_table","id":238,"data":1},{"name":"minecraft:chemistry_table","id":238,"data":2},{"name":"minecraft:chemistry_table","id":238,"data":3},{"name":"minecraft:chemistry_table","id":238,"data":4},{"name":"minecraft:chemistry_table","id":238,"data":5},{"name":"minecraft:chemistry_table","id":238,"data":6},{"name":"minecraft:chemistry_table","id":238,"data":7},{"name":"minecraft:chemistry_table","id":238,"data":8},{"name":"minecraft:chemistry_table","id":238,"data":9},{"name":"minecraft:chemistry_table","id":238,"data":10},{"name":"minecraft:chemistry_table","id":238,"data":11},{"name":"minecraft:chemistry_table","id":238,"data":12},{"name":"minecraft:chemistry_table","id":238,"data":13},{"name":"minecraft:chemistry_table","id":238,"data":14},{"name":"minecraft:chemistry_table","id":238,"data":15},{"name":"minecraft:underwater_torch","id":239,"data":0},{"name":"minecraft:underwater_torch","id":239,"data":1},{"name":"minecraft:underwater_torch","id":239,"data":2},{"name":"minecraft:underwater_torch","id":239,"data":3},{"name":"minecraft:underwater_torch","id":239,"data":4},{"name":"minecraft:underwater_torch","id":239,"data":5},{"name":"minecraft:underwater_torch","id":239,"data":6},{"name":"minecraft:underwater_torch","id":239,"data":7},{"name":"minecraft:chorus_plant","id":240,"data":0},{"name":"minecraft:stained_glass","id":241,"data":0},{"name":"minecraft:stained_glass","id":241,"data":1},{"name":"minecraft:stained_glass","id":241,"data":2},{"name":"minecraft:stained_glass","id":241,"data":3},{"name":"minecraft:stained_glass","id":241,"data":4},{"name":"minecraft:stained_glass","id":241,"data":5},{"name":"minecraft:stained_glass","id":241,"data":6},{"name":"minecraft:stained_glass","id":241,"data":7},{"name":"minecraft:stained_glass","id":241,"data":8},{"name":"minecraft:stained_glass","id":241,"data":9},{"name":"minecraft:stained_glass","id":241,"data":10},{"name":"minecraft:stained_glass","id":241,"data":11},{"name":"minecraft:stained_glass","id":241,"data":12},{"name":"minecraft:stained_glass","id":241,"data":13},{"name":"minecraft:stained_glass","id":241,"data":14},{"name":"minecraft:stained_glass","id":241,"data":15},{"name":"minecraft:podzol","id":243,"data":0},{"name":"minecraft:beetroot","id":244,"data":0},{"name":"minecraft:beetroot","id":244,"data":1},{"name":"minecraft:beetroot","id":244,"data":2},{"name":"minecraft:beetroot","id":244,"data":3},{"name":"minecraft:beetroot","id":244,"data":4},{"name":"minecraft:beetroot","id":244,"data":5},{"name":"minecraft:beetroot","id":244,"data":6},{"name":"minecraft:beetroot","id":244,"data":7},{"name":"minecraft:stonecutter","id":245,"data":0},{"name":"minecraft:glowingobsidian","id":246,"data":0},{"name":"minecraft:netherreactor","id":247,"data":0},{"name":"minecraft:info_update","id":248,"data":0},{"name":"minecraft:info_update2","id":249,"data":0},{"name":"minecraft:movingBlock","id":250,"data":0},{"name":"minecraft:observer","id":251,"data":0},{"name":"minecraft:observer","id":251,"data":1},{"name":"minecraft:observer","id":251,"data":2},{"name":"minecraft:observer","id":251,"data":3},{"name":"minecraft:observer","id":251,"data":4},{"name":"minecraft:observer","id":251,"data":5},{"name":"minecraft:observer","id":251,"data":6},{"name":"minecraft:observer","id":251,"data":7},{"name":"minecraft:observer","id":251,"data":8},{"name":"minecraft:observer","id":251,"data":9},{"name":"minecraft:observer","id":251,"data":10},{"name":"minecraft:observer","id":251,"data":11},{"name":"minecraft:observer","id":251,"data":12},{"name":"minecraft:observer","id":251,"data":13},{"name":"minecraft:observer","id":251,"data":14},{"name":"minecraft:observer","id":251,"data":15},{"name":"minecraft:structure_block","id":252,"data":0},{"name":"minecraft:structure_block","id":252,"data":1},{"name":"minecraft:structure_block","id":252,"data":2},{"name":"minecraft:structure_block","id":252,"data":3},{"name":"minecraft:structure_block","id":252,"data":4},{"name":"minecraft:structure_block","id":252,"data":5},{"name":"minecraft:structure_block","id":252,"data":6},{"name":"minecraft:structure_block","id":252,"data":7},{"name":"minecraft:hard_glass","id":253,"data":0},{"name":"minecraft:hard_stained_glass","id":254,"data":0},{"name":"minecraft:hard_stained_glass","id":254,"data":1},{"name":"minecraft:hard_stained_glass","id":254,"data":2},{"name":"minecraft:hard_stained_glass","id":254,"data":3},{"name":"minecraft:hard_stained_glass","id":254,"data":4},{"name":"minecraft:hard_stained_glass","id":254,"data":5},{"name":"minecraft:hard_stained_glass","id":254,"data":6},{"name":"minecraft:hard_stained_glass","id":254,"data":7},{"name":"minecraft:hard_stained_glass","id":254,"data":8},{"name":"minecraft:hard_stained_glass","id":254,"data":9},{"name":"minecraft:hard_stained_glass","id":254,"data":10},{"name":"minecraft:hard_stained_glass","id":254,"data":11},{"name":"minecraft:hard_stained_glass","id":254,"data":12},{"name":"minecraft:hard_stained_glass","id":254,"data":13},{"name":"minecraft:hard_stained_glass","id":254,"data":14},{"name":"minecraft:hard_stained_glass","id":254,"data":15},{"name":"minecraft:reserved6","id":255,"data":0},{"name":"minecraft:prismarine_stairs","id":257,"data":0},{"name":"minecraft:prismarine_stairs","id":257,"data":1},{"name":"minecraft:prismarine_stairs","id":257,"data":2},{"name":"minecraft:prismarine_stairs","id":257,"data":3},{"name":"minecraft:prismarine_stairs","id":257,"data":4},{"name":"minecraft:prismarine_stairs","id":257,"data":5},{"name":"minecraft:prismarine_stairs","id":257,"data":6},{"name":"minecraft:prismarine_stairs","id":257,"data":7},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":0},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":1},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":2},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":3},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":4},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":5},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":6},{"name":"minecraft:dark_prismarine_stairs","id":258,"data":7},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":0},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":1},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":2},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":3},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":4},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":5},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":6},{"name":"minecraft:prismarine_bricks_stairs","id":259,"data":7},{"name":"minecraft:stripped_spruce_log","id":260,"data":0},{"name":"minecraft:stripped_spruce_log","id":260,"data":1},{"name":"minecraft:stripped_spruce_log","id":260,"data":2},{"name":"minecraft:stripped_spruce_log","id":260,"data":3},{"name":"minecraft:stripped_birch_log","id":261,"data":0},{"name":"minecraft:stripped_birch_log","id":261,"data":1},{"name":"minecraft:stripped_birch_log","id":261,"data":2},{"name":"minecraft:stripped_birch_log","id":261,"data":3},{"name":"minecraft:stripped_jungle_log","id":262,"data":0},{"name":"minecraft:stripped_jungle_log","id":262,"data":1},{"name":"minecraft:stripped_jungle_log","id":262,"data":2},{"name":"minecraft:stripped_jungle_log","id":262,"data":3},{"name":"minecraft:stripped_acacia_log","id":263,"data":0},{"name":"minecraft:stripped_acacia_log","id":263,"data":1},{"name":"minecraft:stripped_acacia_log","id":263,"data":2},{"name":"minecraft:stripped_acacia_log","id":263,"data":3},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":0},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":1},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":2},{"name":"minecraft:stripped_dark_oak_log","id":264,"data":3},{"name":"minecraft:stripped_oak_log","id":265,"data":0},{"name":"minecraft:stripped_oak_log","id":265,"data":1},{"name":"minecraft:stripped_oak_log","id":265,"data":2},{"name":"minecraft:stripped_oak_log","id":265,"data":3},{"name":"minecraft:blue_ice","id":266,"data":0},{"name":"minecraft:element_1","id":267,"data":0},{"name":"minecraft:element_2","id":268,"data":0},{"name":"minecraft:element_3","id":269,"data":0},{"name":"minecraft:element_4","id":270,"data":0},{"name":"minecraft:element_5","id":271,"data":0},{"name":"minecraft:element_6","id":272,"data":0},{"name":"minecraft:element_7","id":273,"data":0},{"name":"minecraft:element_8","id":274,"data":0},{"name":"minecraft:element_9","id":275,"data":0},{"name":"minecraft:element_10","id":276,"data":0},{"name":"minecraft:element_11","id":277,"data":0},{"name":"minecraft:element_12","id":278,"data":0},{"name":"minecraft:element_13","id":279,"data":0},{"name":"minecraft:element_14","id":280,"data":0},{"name":"minecraft:element_15","id":281,"data":0},{"name":"minecraft:element_16","id":282,"data":0},{"name":"minecraft:element_17","id":283,"data":0},{"name":"minecraft:element_18","id":284,"data":0},{"name":"minecraft:element_19","id":285,"data":0},{"name":"minecraft:element_20","id":286,"data":0},{"name":"minecraft:element_21","id":287,"data":0},{"name":"minecraft:element_22","id":288,"data":0},{"name":"minecraft:element_23","id":289,"data":0},{"name":"minecraft:element_24","id":290,"data":0},{"name":"minecraft:element_25","id":291,"data":0},{"name":"minecraft:element_26","id":292,"data":0},{"name":"minecraft:element_27","id":293,"data":0},{"name":"minecraft:element_28","id":294,"data":0},{"name":"minecraft:element_29","id":295,"data":0},{"name":"minecraft:element_30","id":296,"data":0},{"name":"minecraft:element_31","id":297,"data":0},{"name":"minecraft:element_32","id":298,"data":0},{"name":"minecraft:element_33","id":299,"data":0},{"name":"minecraft:element_34","id":300,"data":0},{"name":"minecraft:element_35","id":301,"data":0},{"name":"minecraft:element_36","id":302,"data":0},{"name":"minecraft:element_37","id":303,"data":0},{"name":"minecraft:element_38","id":304,"data":0},{"name":"minecraft:element_39","id":305,"data":0},{"name":"minecraft:element_40","id":306,"data":0},{"name":"minecraft:element_41","id":307,"data":0},{"name":"minecraft:element_42","id":308,"data":0},{"name":"minecraft:element_43","id":309,"data":0},{"name":"minecraft:element_44","id":310,"data":0},{"name":"minecraft:element_45","id":311,"data":0},{"name":"minecraft:element_46","id":312,"data":0},{"name":"minecraft:element_47","id":313,"data":0},{"name":"minecraft:element_48","id":314,"data":0},{"name":"minecraft:element_49","id":315,"data":0},{"name":"minecraft:element_50","id":316,"data":0},{"name":"minecraft:element_51","id":317,"data":0},{"name":"minecraft:element_52","id":318,"data":0},{"name":"minecraft:element_53","id":319,"data":0},{"name":"minecraft:element_54","id":320,"data":0},{"name":"minecraft:element_55","id":321,"data":0},{"name":"minecraft:element_56","id":322,"data":0},{"name":"minecraft:element_57","id":323,"data":0},{"name":"minecraft:element_58","id":324,"data":0},{"name":"minecraft:element_59","id":325,"data":0},{"name":"minecraft:element_60","id":326,"data":0},{"name":"minecraft:element_61","id":327,"data":0},{"name":"minecraft:element_62","id":328,"data":0},{"name":"minecraft:element_63","id":329,"data":0},{"name":"minecraft:element_64","id":330,"data":0},{"name":"minecraft:element_65","id":331,"data":0},{"name":"minecraft:element_66","id":332,"data":0},{"name":"minecraft:element_67","id":333,"data":0},{"name":"minecraft:element_68","id":334,"data":0},{"name":"minecraft:element_69","id":335,"data":0},{"name":"minecraft:element_70","id":336,"data":0},{"name":"minecraft:element_71","id":337,"data":0},{"name":"minecraft:element_72","id":338,"data":0},{"name":"minecraft:element_73","id":339,"data":0},{"name":"minecraft:element_74","id":340,"data":0},{"name":"minecraft:element_75","id":341,"data":0},{"name":"minecraft:element_76","id":342,"data":0},{"name":"minecraft:element_77","id":343,"data":0},{"name":"minecraft:element_78","id":344,"data":0},{"name":"minecraft:element_79","id":345,"data":0},{"name":"minecraft:element_80","id":346,"data":0},{"name":"minecraft:element_81","id":347,"data":0},{"name":"minecraft:element_82","id":348,"data":0},{"name":"minecraft:element_83","id":349,"data":0},{"name":"minecraft:element_84","id":350,"data":0},{"name":"minecraft:element_85","id":351,"data":0},{"name":"minecraft:element_86","id":352,"data":0},{"name":"minecraft:element_87","id":353,"data":0},{"name":"minecraft:element_88","id":354,"data":0},{"name":"minecraft:element_89","id":355,"data":0},{"name":"minecraft:element_90","id":356,"data":0},{"name":"minecraft:element_91","id":357,"data":0},{"name":"minecraft:element_92","id":358,"data":0},{"name":"minecraft:element_93","id":359,"data":0},{"name":"minecraft:element_94","id":360,"data":0},{"name":"minecraft:element_95","id":361,"data":0},{"name":"minecraft:element_96","id":362,"data":0},{"name":"minecraft:element_97","id":363,"data":0},{"name":"minecraft:element_98","id":364,"data":0},{"name":"minecraft:element_99","id":365,"data":0},{"name":"minecraft:element_100","id":366,"data":0},{"name":"minecraft:element_101","id":367,"data":0},{"name":"minecraft:element_102","id":368,"data":0},{"name":"minecraft:element_103","id":369,"data":0},{"name":"minecraft:element_104","id":370,"data":0},{"name":"minecraft:element_105","id":371,"data":0},{"name":"minecraft:element_106","id":372,"data":0},{"name":"minecraft:element_107","id":373,"data":0},{"name":"minecraft:element_108","id":374,"data":0},{"name":"minecraft:element_109","id":375,"data":0},{"name":"minecraft:element_110","id":376,"data":0},{"name":"minecraft:element_111","id":377,"data":0},{"name":"minecraft:element_112","id":378,"data":0},{"name":"minecraft:element_113","id":379,"data":0},{"name":"minecraft:element_114","id":380,"data":0},{"name":"minecraft:element_115","id":381,"data":0},{"name":"minecraft:element_116","id":382,"data":0},{"name":"minecraft:element_117","id":383,"data":0},{"name":"minecraft:element_118","id":384,"data":0},{"name":"minecraft:seagrass","id":385,"data":0},{"name":"minecraft:seagrass","id":385,"data":1},{"name":"minecraft:seagrass","id":385,"data":2},{"name":"minecraft:seagrass","id":385,"data":3},{"name":"minecraft:coral","id":386,"data":0},{"name":"minecraft:coral","id":386,"data":1},{"name":"minecraft:coral","id":386,"data":2},{"name":"minecraft:coral","id":386,"data":3},{"name":"minecraft:coral","id":386,"data":4},{"name":"minecraft:coral","id":386,"data":5},{"name":"minecraft:coral","id":386,"data":6},{"name":"minecraft:coral","id":386,"data":7},{"name":"minecraft:coral_block","id":387,"data":0},{"name":"minecraft:coral_block","id":387,"data":1},{"name":"minecraft:coral_block","id":387,"data":2},{"name":"minecraft:coral_block","id":387,"data":3},{"name":"minecraft:coral_block","id":387,"data":4},{"name":"minecraft:coral_block","id":387,"data":5},{"name":"minecraft:coral_block","id":387,"data":6},{"name":"minecraft:coral_block","id":387,"data":7},{"name":"minecraft:coral_block","id":387,"data":8},{"name":"minecraft:coral_block","id":387,"data":9},{"name":"minecraft:coral_block","id":387,"data":10},{"name":"minecraft:coral_block","id":387,"data":11},{"name":"minecraft:coral_block","id":387,"data":12},{"name":"minecraft:coral_block","id":387,"data":13},{"name":"minecraft:coral_block","id":387,"data":14},{"name":"minecraft:coral_block","id":387,"data":15},{"name":"minecraft:coral_fan","id":388,"data":0},{"name":"minecraft:coral_fan","id":388,"data":1},{"name":"minecraft:coral_fan","id":388,"data":2},{"name":"minecraft:coral_fan","id":388,"data":3},{"name":"minecraft:coral_fan","id":388,"data":4},{"name":"minecraft:coral_fan","id":388,"data":5},{"name":"minecraft:coral_fan","id":388,"data":6},{"name":"minecraft:coral_fan","id":388,"data":7},{"name":"minecraft:coral_fan","id":388,"data":8},{"name":"minecraft:coral_fan","id":388,"data":9},{"name":"minecraft:coral_fan","id":388,"data":10},{"name":"minecraft:coral_fan","id":388,"data":11},{"name":"minecraft:coral_fan","id":388,"data":12},{"name":"minecraft:coral_fan","id":388,"data":13},{"name":"minecraft:coral_fan","id":388,"data":14},{"name":"minecraft:coral_fan","id":388,"data":15},{"name":"minecraft:coral_fan_dead","id":389,"data":0},{"name":"minecraft:coral_fan_dead","id":389,"data":1},{"name":"minecraft:coral_fan_dead","id":389,"data":2},{"name":"minecraft:coral_fan_dead","id":389,"data":3},{"name":"minecraft:coral_fan_dead","id":389,"data":4},{"name":"minecraft:coral_fan_dead","id":389,"data":5},{"name":"minecraft:coral_fan_dead","id":389,"data":6},{"name":"minecraft:coral_fan_dead","id":389,"data":7},{"name":"minecraft:coral_fan_dead","id":389,"data":8},{"name":"minecraft:coral_fan_dead","id":389,"data":9},{"name":"minecraft:coral_fan_dead","id":389,"data":10},{"name":"minecraft:coral_fan_dead","id":389,"data":11},{"name":"minecraft:coral_fan_dead","id":389,"data":12},{"name":"minecraft:coral_fan_dead","id":389,"data":13},{"name":"minecraft:coral_fan_dead","id":389,"data":14},{"name":"minecraft:coral_fan_dead","id":389,"data":15},{"name":"minecraft:coral_fan_hang","id":390,"data":0},{"name":"minecraft:coral_fan_hang","id":390,"data":1},{"name":"minecraft:coral_fan_hang","id":390,"data":2},{"name":"minecraft:coral_fan_hang","id":390,"data":3},{"name":"minecraft:coral_fan_hang","id":390,"data":4},{"name":"minecraft:coral_fan_hang","id":390,"data":5},{"name":"minecraft:coral_fan_hang","id":390,"data":6},{"name":"minecraft:coral_fan_hang","id":390,"data":7},{"name":"minecraft:coral_fan_hang","id":390,"data":8},{"name":"minecraft:coral_fan_hang","id":390,"data":9},{"name":"minecraft:coral_fan_hang","id":390,"data":10},{"name":"minecraft:coral_fan_hang","id":390,"data":11},{"name":"minecraft:coral_fan_hang","id":390,"data":12},{"name":"minecraft:coral_fan_hang","id":390,"data":13},{"name":"minecraft:coral_fan_hang","id":390,"data":14},{"name":"minecraft:coral_fan_hang","id":390,"data":15},{"name":"minecraft:coral_fan_hang2","id":391,"data":0},{"name":"minecraft:coral_fan_hang2","id":391,"data":1},{"name":"minecraft:coral_fan_hang2","id":391,"data":2},{"name":"minecraft:coral_fan_hang2","id":391,"data":3},{"name":"minecraft:coral_fan_hang2","id":391,"data":4},{"name":"minecraft:coral_fan_hang2","id":391,"data":5},{"name":"minecraft:coral_fan_hang2","id":391,"data":6},{"name":"minecraft:coral_fan_hang2","id":391,"data":7},{"name":"minecraft:coral_fan_hang2","id":391,"data":8},{"name":"minecraft:coral_fan_hang2","id":391,"data":9},{"name":"minecraft:coral_fan_hang2","id":391,"data":10},{"name":"minecraft:coral_fan_hang2","id":391,"data":11},{"name":"minecraft:coral_fan_hang2","id":391,"data":12},{"name":"minecraft:coral_fan_hang2","id":391,"data":13},{"name":"minecraft:coral_fan_hang2","id":391,"data":14},{"name":"minecraft:coral_fan_hang2","id":391,"data":15},{"name":"minecraft:coral_fan_hang3","id":392,"data":0},{"name":"minecraft:coral_fan_hang3","id":392,"data":1},{"name":"minecraft:coral_fan_hang3","id":392,"data":2},{"name":"minecraft:coral_fan_hang3","id":392,"data":3},{"name":"minecraft:coral_fan_hang3","id":392,"data":4},{"name":"minecraft:coral_fan_hang3","id":392,"data":5},{"name":"minecraft:coral_fan_hang3","id":392,"data":6},{"name":"minecraft:coral_fan_hang3","id":392,"data":7},{"name":"minecraft:coral_fan_hang3","id":392,"data":8},{"name":"minecraft:coral_fan_hang3","id":392,"data":9},{"name":"minecraft:coral_fan_hang3","id":392,"data":10},{"name":"minecraft:coral_fan_hang3","id":392,"data":11},{"name":"minecraft:coral_fan_hang3","id":392,"data":12},{"name":"minecraft:coral_fan_hang3","id":392,"data":13},{"name":"minecraft:coral_fan_hang3","id":392,"data":14},{"name":"minecraft:coral_fan_hang3","id":392,"data":15},{"name":"minecraft:kelp","id":393,"data":0},{"name":"minecraft:kelp","id":393,"data":1},{"name":"minecraft:kelp","id":393,"data":2},{"name":"minecraft:kelp","id":393,"data":3},{"name":"minecraft:kelp","id":393,"data":4},{"name":"minecraft:kelp","id":393,"data":5},{"name":"minecraft:kelp","id":393,"data":6},{"name":"minecraft:kelp","id":393,"data":7},{"name":"minecraft:kelp","id":393,"data":8},{"name":"minecraft:kelp","id":393,"data":9},{"name":"minecraft:kelp","id":393,"data":10},{"name":"minecraft:kelp","id":393,"data":11},{"name":"minecraft:kelp","id":393,"data":12},{"name":"minecraft:kelp","id":393,"data":13},{"name":"minecraft:kelp","id":393,"data":14},{"name":"minecraft:kelp","id":393,"data":15},{"name":"minecraft:dried_kelp_block","id":394,"data":0},{"name":"minecraft:acacia_button","id":395,"data":0},{"name":"minecraft:acacia_button","id":395,"data":1},{"name":"minecraft:acacia_button","id":395,"data":2},{"name":"minecraft:acacia_button","id":395,"data":3},{"name":"minecraft:acacia_button","id":395,"data":4},{"name":"minecraft:acacia_button","id":395,"data":5},{"name":"minecraft:acacia_button","id":395,"data":6},{"name":"minecraft:acacia_button","id":395,"data":7},{"name":"minecraft:acacia_button","id":395,"data":8},{"name":"minecraft:acacia_button","id":395,"data":9},{"name":"minecraft:acacia_button","id":395,"data":10},{"name":"minecraft:acacia_button","id":395,"data":11},{"name":"minecraft:acacia_button","id":395,"data":12},{"name":"minecraft:acacia_button","id":395,"data":13},{"name":"minecraft:acacia_button","id":395,"data":14},{"name":"minecraft:acacia_button","id":395,"data":15},{"name":"minecraft:birch_button","id":396,"data":0},{"name":"minecraft:birch_button","id":396,"data":1},{"name":"minecraft:birch_button","id":396,"data":2},{"name":"minecraft:birch_button","id":396,"data":3},{"name":"minecraft:birch_button","id":396,"data":4},{"name":"minecraft:birch_button","id":396,"data":5},{"name":"minecraft:birch_button","id":396,"data":6},{"name":"minecraft:birch_button","id":396,"data":7},{"name":"minecraft:birch_button","id":396,"data":8},{"name":"minecraft:birch_button","id":396,"data":9},{"name":"minecraft:birch_button","id":396,"data":10},{"name":"minecraft:birch_button","id":396,"data":11},{"name":"minecraft:birch_button","id":396,"data":12},{"name":"minecraft:birch_button","id":396,"data":13},{"name":"minecraft:birch_button","id":396,"data":14},{"name":"minecraft:birch_button","id":396,"data":15},{"name":"minecraft:dark_oak_button","id":397,"data":0},{"name":"minecraft:dark_oak_button","id":397,"data":1},{"name":"minecraft:dark_oak_button","id":397,"data":2},{"name":"minecraft:dark_oak_button","id":397,"data":3},{"name":"minecraft:dark_oak_button","id":397,"data":4},{"name":"minecraft:dark_oak_button","id":397,"data":5},{"name":"minecraft:dark_oak_button","id":397,"data":6},{"name":"minecraft:dark_oak_button","id":397,"data":7},{"name":"minecraft:dark_oak_button","id":397,"data":8},{"name":"minecraft:dark_oak_button","id":397,"data":9},{"name":"minecraft:dark_oak_button","id":397,"data":10},{"name":"minecraft:dark_oak_button","id":397,"data":11},{"name":"minecraft:dark_oak_button","id":397,"data":12},{"name":"minecraft:dark_oak_button","id":397,"data":13},{"name":"minecraft:dark_oak_button","id":397,"data":14},{"name":"minecraft:dark_oak_button","id":397,"data":15},{"name":"minecraft:jungle_button","id":398,"data":0},{"name":"minecraft:jungle_button","id":398,"data":1},{"name":"minecraft:jungle_button","id":398,"data":2},{"name":"minecraft:jungle_button","id":398,"data":3},{"name":"minecraft:jungle_button","id":398,"data":4},{"name":"minecraft:jungle_button","id":398,"data":5},{"name":"minecraft:jungle_button","id":398,"data":6},{"name":"minecraft:jungle_button","id":398,"data":7},{"name":"minecraft:jungle_button","id":398,"data":8},{"name":"minecraft:jungle_button","id":398,"data":9},{"name":"minecraft:jungle_button","id":398,"data":10},{"name":"minecraft:jungle_button","id":398,"data":11},{"name":"minecraft:jungle_button","id":398,"data":12},{"name":"minecraft:jungle_button","id":398,"data":13},{"name":"minecraft:jungle_button","id":398,"data":14},{"name":"minecraft:jungle_button","id":398,"data":15},{"name":"minecraft:spruce_button","id":399,"data":0},{"name":"minecraft:spruce_button","id":399,"data":1},{"name":"minecraft:spruce_button","id":399,"data":2},{"name":"minecraft:spruce_button","id":399,"data":3},{"name":"minecraft:spruce_button","id":399,"data":4},{"name":"minecraft:spruce_button","id":399,"data":5},{"name":"minecraft:spruce_button","id":399,"data":6},{"name":"minecraft:spruce_button","id":399,"data":7},{"name":"minecraft:spruce_button","id":399,"data":8},{"name":"minecraft:spruce_button","id":399,"data":9},{"name":"minecraft:spruce_button","id":399,"data":10},{"name":"minecraft:spruce_button","id":399,"data":11},{"name":"minecraft:spruce_button","id":399,"data":12},{"name":"minecraft:spruce_button","id":399,"data":13},{"name":"minecraft:spruce_button","id":399,"data":14},{"name":"minecraft:spruce_button","id":399,"data":15},{"name":"minecraft:acacia_trapdoor","id":400,"data":0},{"name":"minecraft:acacia_trapdoor","id":400,"data":1},{"name":"minecraft:acacia_trapdoor","id":400,"data":2},{"name":"minecraft:acacia_trapdoor","id":400,"data":3},{"name":"minecraft:acacia_trapdoor","id":400,"data":4},{"name":"minecraft:acacia_trapdoor","id":400,"data":5},{"name":"minecraft:acacia_trapdoor","id":400,"data":6},{"name":"minecraft:acacia_trapdoor","id":400,"data":7},{"name":"minecraft:acacia_trapdoor","id":400,"data":8},{"name":"minecraft:acacia_trapdoor","id":400,"data":9},{"name":"minecraft:acacia_trapdoor","id":400,"data":10},{"name":"minecraft:acacia_trapdoor","id":400,"data":11},{"name":"minecraft:acacia_trapdoor","id":400,"data":12},{"name":"minecraft:acacia_trapdoor","id":400,"data":13},{"name":"minecraft:acacia_trapdoor","id":400,"data":14},{"name":"minecraft:acacia_trapdoor","id":400,"data":15},{"name":"minecraft:birch_trapdoor","id":401,"data":0},{"name":"minecraft:birch_trapdoor","id":401,"data":1},{"name":"minecraft:birch_trapdoor","id":401,"data":2},{"name":"minecraft:birch_trapdoor","id":401,"data":3},{"name":"minecraft:birch_trapdoor","id":401,"data":4},{"name":"minecraft:birch_trapdoor","id":401,"data":5},{"name":"minecraft:birch_trapdoor","id":401,"data":6},{"name":"minecraft:birch_trapdoor","id":401,"data":7},{"name":"minecraft:birch_trapdoor","id":401,"data":8},{"name":"minecraft:birch_trapdoor","id":401,"data":9},{"name":"minecraft:birch_trapdoor","id":401,"data":10},{"name":"minecraft:birch_trapdoor","id":401,"data":11},{"name":"minecraft:birch_trapdoor","id":401,"data":12},{"name":"minecraft:birch_trapdoor","id":401,"data":13},{"name":"minecraft:birch_trapdoor","id":401,"data":14},{"name":"minecraft:birch_trapdoor","id":401,"data":15},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":0},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":1},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":2},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":3},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":4},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":5},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":6},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":7},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":8},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":9},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":10},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":11},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":12},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":13},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":14},{"name":"minecraft:dark_oak_trapdoor","id":402,"data":15},{"name":"minecraft:jungle_trapdoor","id":403,"data":0},{"name":"minecraft:jungle_trapdoor","id":403,"data":1},{"name":"minecraft:jungle_trapdoor","id":403,"data":2},{"name":"minecraft:jungle_trapdoor","id":403,"data":3},{"name":"minecraft:jungle_trapdoor","id":403,"data":4},{"name":"minecraft:jungle_trapdoor","id":403,"data":5},{"name":"minecraft:jungle_trapdoor","id":403,"data":6},{"name":"minecraft:jungle_trapdoor","id":403,"data":7},{"name":"minecraft:jungle_trapdoor","id":403,"data":8},{"name":"minecraft:jungle_trapdoor","id":403,"data":9},{"name":"minecraft:jungle_trapdoor","id":403,"data":10},{"name":"minecraft:jungle_trapdoor","id":403,"data":11},{"name":"minecraft:jungle_trapdoor","id":403,"data":12},{"name":"minecraft:jungle_trapdoor","id":403,"data":13},{"name":"minecraft:jungle_trapdoor","id":403,"data":14},{"name":"minecraft:jungle_trapdoor","id":403,"data":15},{"name":"minecraft:spruce_trapdoor","id":404,"data":0},{"name":"minecraft:spruce_trapdoor","id":404,"data":1},{"name":"minecraft:spruce_trapdoor","id":404,"data":2},{"name":"minecraft:spruce_trapdoor","id":404,"data":3},{"name":"minecraft:spruce_trapdoor","id":404,"data":4},{"name":"minecraft:spruce_trapdoor","id":404,"data":5},{"name":"minecraft:spruce_trapdoor","id":404,"data":6},{"name":"minecraft:spruce_trapdoor","id":404,"data":7},{"name":"minecraft:spruce_trapdoor","id":404,"data":8},{"name":"minecraft:spruce_trapdoor","id":404,"data":9},{"name":"minecraft:spruce_trapdoor","id":404,"data":10},{"name":"minecraft:spruce_trapdoor","id":404,"data":11},{"name":"minecraft:spruce_trapdoor","id":404,"data":12},{"name":"minecraft:spruce_trapdoor","id":404,"data":13},{"name":"minecraft:spruce_trapdoor","id":404,"data":14},{"name":"minecraft:spruce_trapdoor","id":404,"data":15},{"name":"minecraft:acacia_pressure_plate","id":405,"data":0},{"name":"minecraft:acacia_pressure_plate","id":405,"data":1},{"name":"minecraft:acacia_pressure_plate","id":405,"data":2},{"name":"minecraft:acacia_pressure_plate","id":405,"data":3},{"name":"minecraft:acacia_pressure_plate","id":405,"data":4},{"name":"minecraft:acacia_pressure_plate","id":405,"data":5},{"name":"minecraft:acacia_pressure_plate","id":405,"data":6},{"name":"minecraft:acacia_pressure_plate","id":405,"data":7},{"name":"minecraft:acacia_pressure_plate","id":405,"data":8},{"name":"minecraft:acacia_pressure_plate","id":405,"data":9},{"name":"minecraft:acacia_pressure_plate","id":405,"data":10},{"name":"minecraft:acacia_pressure_plate","id":405,"data":11},{"name":"minecraft:acacia_pressure_plate","id":405,"data":12},{"name":"minecraft:acacia_pressure_plate","id":405,"data":13},{"name":"minecraft:acacia_pressure_plate","id":405,"data":14},{"name":"minecraft:acacia_pressure_plate","id":405,"data":15},{"name":"minecraft:birch_pressure_plate","id":406,"data":0},{"name":"minecraft:birch_pressure_plate","id":406,"data":1},{"name":"minecraft:birch_pressure_plate","id":406,"data":2},{"name":"minecraft:birch_pressure_plate","id":406,"data":3},{"name":"minecraft:birch_pressure_plate","id":406,"data":4},{"name":"minecraft:birch_pressure_plate","id":406,"data":5},{"name":"minecraft:birch_pressure_plate","id":406,"data":6},{"name":"minecraft:birch_pressure_plate","id":406,"data":7},{"name":"minecraft:birch_pressure_plate","id":406,"data":8},{"name":"minecraft:birch_pressure_plate","id":406,"data":9},{"name":"minecraft:birch_pressure_plate","id":406,"data":10},{"name":"minecraft:birch_pressure_plate","id":406,"data":11},{"name":"minecraft:birch_pressure_plate","id":406,"data":12},{"name":"minecraft:birch_pressure_plate","id":406,"data":13},{"name":"minecraft:birch_pressure_plate","id":406,"data":14},{"name":"minecraft:birch_pressure_plate","id":406,"data":15},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":0},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":1},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":2},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":3},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":4},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":5},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":6},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":7},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":8},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":9},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":10},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":11},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":12},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":13},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":14},{"name":"minecraft:dark_oak_pressure_plate","id":407,"data":15},{"name":"minecraft:jungle_pressure_plate","id":408,"data":0},{"name":"minecraft:jungle_pressure_plate","id":408,"data":1},{"name":"minecraft:jungle_pressure_plate","id":408,"data":2},{"name":"minecraft:jungle_pressure_plate","id":408,"data":3},{"name":"minecraft:jungle_pressure_plate","id":408,"data":4},{"name":"minecraft:jungle_pressure_plate","id":408,"data":5},{"name":"minecraft:jungle_pressure_plate","id":408,"data":6},{"name":"minecraft:jungle_pressure_plate","id":408,"data":7},{"name":"minecraft:jungle_pressure_plate","id":408,"data":8},{"name":"minecraft:jungle_pressure_plate","id":408,"data":9},{"name":"minecraft:jungle_pressure_plate","id":408,"data":10},{"name":"minecraft:jungle_pressure_plate","id":408,"data":11},{"name":"minecraft:jungle_pressure_plate","id":408,"data":12},{"name":"minecraft:jungle_pressure_plate","id":408,"data":13},{"name":"minecraft:jungle_pressure_plate","id":408,"data":14},{"name":"minecraft:jungle_pressure_plate","id":408,"data":15},{"name":"minecraft:spruce_pressure_plate","id":409,"data":0},{"name":"minecraft:spruce_pressure_plate","id":409,"data":1},{"name":"minecraft:spruce_pressure_plate","id":409,"data":2},{"name":"minecraft:spruce_pressure_plate","id":409,"data":3},{"name":"minecraft:spruce_pressure_plate","id":409,"data":4},{"name":"minecraft:spruce_pressure_plate","id":409,"data":5},{"name":"minecraft:spruce_pressure_plate","id":409,"data":6},{"name":"minecraft:spruce_pressure_plate","id":409,"data":7},{"name":"minecraft:spruce_pressure_plate","id":409,"data":8},{"name":"minecraft:spruce_pressure_plate","id":409,"data":9},{"name":"minecraft:spruce_pressure_plate","id":409,"data":10},{"name":"minecraft:spruce_pressure_plate","id":409,"data":11},{"name":"minecraft:spruce_pressure_plate","id":409,"data":12},{"name":"minecraft:spruce_pressure_plate","id":409,"data":13},{"name":"minecraft:spruce_pressure_plate","id":409,"data":14},{"name":"minecraft:spruce_pressure_plate","id":409,"data":15},{"name":"minecraft:carved_pumpkin","id":410,"data":0},{"name":"minecraft:carved_pumpkin","id":410,"data":1},{"name":"minecraft:carved_pumpkin","id":410,"data":2},{"name":"minecraft:carved_pumpkin","id":410,"data":3},{"name":"minecraft:sea_pickle","id":411,"data":0},{"name":"minecraft:sea_pickle","id":411,"data":1},{"name":"minecraft:sea_pickle","id":411,"data":2},{"name":"minecraft:sea_pickle","id":411,"data":3},{"name":"minecraft:sea_pickle","id":411,"data":4},{"name":"minecraft:sea_pickle","id":411,"data":5},{"name":"minecraft:sea_pickle","id":411,"data":6},{"name":"minecraft:sea_pickle","id":411,"data":7},{"name":"minecraft:conduit","id":412,"data":0},{"name":"minecraft:turtle_egg","id":414,"data":0},{"name":"minecraft:turtle_egg","id":414,"data":1},{"name":"minecraft:turtle_egg","id":414,"data":2},{"name":"minecraft:turtle_egg","id":414,"data":3},{"name":"minecraft:turtle_egg","id":414,"data":4},{"name":"minecraft:turtle_egg","id":414,"data":5},{"name":"minecraft:turtle_egg","id":414,"data":6},{"name":"minecraft:turtle_egg","id":414,"data":7},{"name":"minecraft:turtle_egg","id":414,"data":8},{"name":"minecraft:turtle_egg","id":414,"data":9},{"name":"minecraft:turtle_egg","id":414,"data":10},{"name":"minecraft:turtle_egg","id":414,"data":11},{"name":"minecraft:turtle_egg","id":414,"data":12},{"name":"minecraft:turtle_egg","id":414,"data":13},{"name":"minecraft:turtle_egg","id":414,"data":14},{"name":"minecraft:turtle_egg","id":414,"data":15},{"name":"minecraft:bubble_column","id":415,"data":0},{"name":"minecraft:bubble_column","id":415,"data":1},{"name":"minecraft:barrier","id":416,"data":0},{"name":"minecraft:stone_slab3","id":417,"data":0},{"name":"minecraft:stone_slab3","id":417,"data":1},{"name":"minecraft:stone_slab3","id":417,"data":2},{"name":"minecraft:stone_slab3","id":417,"data":3},{"name":"minecraft:stone_slab3","id":417,"data":4},{"name":"minecraft:stone_slab3","id":417,"data":5},{"name":"minecraft:stone_slab3","id":417,"data":6},{"name":"minecraft:stone_slab3","id":417,"data":7},{"name":"minecraft:stone_slab3","id":417,"data":8},{"name":"minecraft:stone_slab3","id":417,"data":9},{"name":"minecraft:stone_slab3","id":417,"data":10},{"name":"minecraft:stone_slab3","id":417,"data":11},{"name":"minecraft:stone_slab3","id":417,"data":12},{"name":"minecraft:stone_slab3","id":417,"data":13},{"name":"minecraft:stone_slab3","id":417,"data":14},{"name":"minecraft:stone_slab3","id":417,"data":15},{"name":"minecraft:bamboo","id":418,"data":0},{"name":"minecraft:bamboo","id":418,"data":1},{"name":"minecraft:bamboo","id":418,"data":2},{"name":"minecraft:bamboo","id":418,"data":3},{"name":"minecraft:bamboo","id":418,"data":4},{"name":"minecraft:bamboo","id":418,"data":5},{"name":"minecraft:bamboo","id":418,"data":6},{"name":"minecraft:bamboo","id":418,"data":7},{"name":"minecraft:bamboo","id":418,"data":8},{"name":"minecraft:bamboo","id":418,"data":9},{"name":"minecraft:bamboo","id":418,"data":10},{"name":"minecraft:bamboo","id":418,"data":11},{"name":"minecraft:bamboo","id":418,"data":12},{"name":"minecraft:bamboo","id":418,"data":13},{"name":"minecraft:bamboo","id":418,"data":14},{"name":"minecraft:bamboo","id":418,"data":15},{"name":"minecraft:bamboo_sapling","id":419,"data":0},{"name":"minecraft:bamboo_sapling","id":419,"data":1},{"name":"minecraft:bamboo_sapling","id":419,"data":2},{"name":"minecraft:bamboo_sapling","id":419,"data":3},{"name":"minecraft:bamboo_sapling","id":419,"data":4},{"name":"minecraft:bamboo_sapling","id":419,"data":5},{"name":"minecraft:bamboo_sapling","id":419,"data":6},{"name":"minecraft:bamboo_sapling","id":419,"data":7},{"name":"minecraft:bamboo_sapling","id":419,"data":8},{"name":"minecraft:bamboo_sapling","id":419,"data":9},{"name":"minecraft:bamboo_sapling","id":419,"data":10},{"name":"minecraft:bamboo_sapling","id":419,"data":11},{"name":"minecraft:bamboo_sapling","id":419,"data":12},{"name":"minecraft:bamboo_sapling","id":419,"data":13},{"name":"minecraft:bamboo_sapling","id":419,"data":14},{"name":"minecraft:bamboo_sapling","id":419,"data":15},{"name":"minecraft:scaffolding","id":420,"data":0},{"name":"minecraft:scaffolding","id":420,"data":1},{"name":"minecraft:scaffolding","id":420,"data":2},{"name":"minecraft:scaffolding","id":420,"data":3},{"name":"minecraft:scaffolding","id":420,"data":4},{"name":"minecraft:scaffolding","id":420,"data":5},{"name":"minecraft:scaffolding","id":420,"data":6},{"name":"minecraft:scaffolding","id":420,"data":7},{"name":"minecraft:scaffolding","id":420,"data":8},{"name":"minecraft:scaffolding","id":420,"data":9},{"name":"minecraft:scaffolding","id":420,"data":10},{"name":"minecraft:scaffolding","id":420,"data":11},{"name":"minecraft:scaffolding","id":420,"data":12},{"name":"minecraft:scaffolding","id":420,"data":13},{"name":"minecraft:scaffolding","id":420,"data":14},{"name":"minecraft:scaffolding","id":420,"data":15},{"name":"minecraft:stone_slab4","id":421,"data":0},{"name":"minecraft:stone_slab4","id":421,"data":1},{"name":"minecraft:stone_slab4","id":421,"data":2},{"name":"minecraft:stone_slab4","id":421,"data":3},{"name":"minecraft:stone_slab4","id":421,"data":4},{"name":"minecraft:stone_slab4","id":421,"data":5},{"name":"minecraft:stone_slab4","id":421,"data":6},{"name":"minecraft:stone_slab4","id":421,"data":7},{"name":"minecraft:stone_slab4","id":421,"data":8},{"name":"minecraft:stone_slab4","id":421,"data":9},{"name":"minecraft:stone_slab4","id":421,"data":10},{"name":"minecraft:stone_slab4","id":421,"data":11},{"name":"minecraft:stone_slab4","id":421,"data":12},{"name":"minecraft:stone_slab4","id":421,"data":13},{"name":"minecraft:stone_slab4","id":421,"data":14},{"name":"minecraft:stone_slab4","id":421,"data":15},{"name":"minecraft:double_stone_slab3","id":422,"data":0},{"name":"minecraft:double_stone_slab3","id":422,"data":1},{"name":"minecraft:double_stone_slab3","id":422,"data":2},{"name":"minecraft:double_stone_slab3","id":422,"data":3},{"name":"minecraft:double_stone_slab3","id":422,"data":4},{"name":"minecraft:double_stone_slab3","id":422,"data":5},{"name":"minecraft:double_stone_slab3","id":422,"data":6},{"name":"minecraft:double_stone_slab3","id":422,"data":7},{"name":"minecraft:double_stone_slab3","id":422,"data":8},{"name":"minecraft:double_stone_slab3","id":422,"data":9},{"name":"minecraft:double_stone_slab3","id":422,"data":10},{"name":"minecraft:double_stone_slab3","id":422,"data":11},{"name":"minecraft:double_stone_slab3","id":422,"data":12},{"name":"minecraft:double_stone_slab3","id":422,"data":13},{"name":"minecraft:double_stone_slab3","id":422,"data":14},{"name":"minecraft:double_stone_slab3","id":422,"data":15},{"name":"minecraft:double_stone_slab4","id":423,"data":0},{"name":"minecraft:double_stone_slab4","id":423,"data":1},{"name":"minecraft:double_stone_slab4","id":423,"data":2},{"name":"minecraft:double_stone_slab4","id":423,"data":3},{"name":"minecraft:double_stone_slab4","id":423,"data":4},{"name":"minecraft:double_stone_slab4","id":423,"data":5},{"name":"minecraft:double_stone_slab4","id":423,"data":6},{"name":"minecraft:double_stone_slab4","id":423,"data":7},{"name":"minecraft:double_stone_slab4","id":423,"data":8},{"name":"minecraft:double_stone_slab4","id":423,"data":9},{"name":"minecraft:double_stone_slab4","id":423,"data":10},{"name":"minecraft:double_stone_slab4","id":423,"data":11},{"name":"minecraft:double_stone_slab4","id":423,"data":12},{"name":"minecraft:double_stone_slab4","id":423,"data":13},{"name":"minecraft:double_stone_slab4","id":423,"data":14},{"name":"minecraft:double_stone_slab4","id":423,"data":15},{"name":"minecraft:granite_stairs","id":424,"data":0},{"name":"minecraft:granite_stairs","id":424,"data":1},{"name":"minecraft:granite_stairs","id":424,"data":2},{"name":"minecraft:granite_stairs","id":424,"data":3},{"name":"minecraft:granite_stairs","id":424,"data":4},{"name":"minecraft:granite_stairs","id":424,"data":5},{"name":"minecraft:granite_stairs","id":424,"data":6},{"name":"minecraft:granite_stairs","id":424,"data":7},{"name":"minecraft:diorite_stairs","id":425,"data":0},{"name":"minecraft:diorite_stairs","id":425,"data":1},{"name":"minecraft:diorite_stairs","id":425,"data":2},{"name":"minecraft:diorite_stairs","id":425,"data":3},{"name":"minecraft:diorite_stairs","id":425,"data":4},{"name":"minecraft:diorite_stairs","id":425,"data":5},{"name":"minecraft:diorite_stairs","id":425,"data":6},{"name":"minecraft:diorite_stairs","id":425,"data":7},{"name":"minecraft:andesite_stairs","id":426,"data":0},{"name":"minecraft:andesite_stairs","id":426,"data":1},{"name":"minecraft:andesite_stairs","id":426,"data":2},{"name":"minecraft:andesite_stairs","id":426,"data":3},{"name":"minecraft:andesite_stairs","id":426,"data":4},{"name":"minecraft:andesite_stairs","id":426,"data":5},{"name":"minecraft:andesite_stairs","id":426,"data":6},{"name":"minecraft:andesite_stairs","id":426,"data":7},{"name":"minecraft:polished_granite_stairs","id":427,"data":0},{"name":"minecraft:polished_granite_stairs","id":427,"data":1},{"name":"minecraft:polished_granite_stairs","id":427,"data":2},{"name":"minecraft:polished_granite_stairs","id":427,"data":3},{"name":"minecraft:polished_granite_stairs","id":427,"data":4},{"name":"minecraft:polished_granite_stairs","id":427,"data":5},{"name":"minecraft:polished_granite_stairs","id":427,"data":6},{"name":"minecraft:polished_granite_stairs","id":427,"data":7},{"name":"minecraft:polished_diorite_stairs","id":428,"data":0},{"name":"minecraft:polished_diorite_stairs","id":428,"data":1},{"name":"minecraft:polished_diorite_stairs","id":428,"data":2},{"name":"minecraft:polished_diorite_stairs","id":428,"data":3},{"name":"minecraft:polished_diorite_stairs","id":428,"data":4},{"name":"minecraft:polished_diorite_stairs","id":428,"data":5},{"name":"minecraft:polished_diorite_stairs","id":428,"data":6},{"name":"minecraft:polished_diorite_stairs","id":428,"data":7},{"name":"minecraft:polished_andesite_stairs","id":429,"data":0},{"name":"minecraft:polished_andesite_stairs","id":429,"data":1},{"name":"minecraft:polished_andesite_stairs","id":429,"data":2},{"name":"minecraft:polished_andesite_stairs","id":429,"data":3},{"name":"minecraft:polished_andesite_stairs","id":429,"data":4},{"name":"minecraft:polished_andesite_stairs","id":429,"data":5},{"name":"minecraft:polished_andesite_stairs","id":429,"data":6},{"name":"minecraft:polished_andesite_stairs","id":429,"data":7},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":0},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":1},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":2},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":3},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":4},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":5},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":6},{"name":"minecraft:mossy_stone_brick_stairs","id":430,"data":7},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":0},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":1},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":2},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":3},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":4},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":5},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":6},{"name":"minecraft:smooth_red_sandstone_stairs","id":431,"data":7},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":0},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":1},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":2},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":3},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":4},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":5},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":6},{"name":"minecraft:smooth_sandstone_stairs","id":432,"data":7},{"name":"minecraft:end_brick_stairs","id":433,"data":0},{"name":"minecraft:end_brick_stairs","id":433,"data":1},{"name":"minecraft:end_brick_stairs","id":433,"data":2},{"name":"minecraft:end_brick_stairs","id":433,"data":3},{"name":"minecraft:end_brick_stairs","id":433,"data":4},{"name":"minecraft:end_brick_stairs","id":433,"data":5},{"name":"minecraft:end_brick_stairs","id":433,"data":6},{"name":"minecraft:end_brick_stairs","id":433,"data":7},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":0},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":1},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":2},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":3},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":4},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":5},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":6},{"name":"minecraft:mossy_cobblestone_stairs","id":434,"data":7},{"name":"minecraft:normal_stone_stairs","id":435,"data":0},{"name":"minecraft:normal_stone_stairs","id":435,"data":1},{"name":"minecraft:normal_stone_stairs","id":435,"data":2},{"name":"minecraft:normal_stone_stairs","id":435,"data":3},{"name":"minecraft:normal_stone_stairs","id":435,"data":4},{"name":"minecraft:normal_stone_stairs","id":435,"data":5},{"name":"minecraft:normal_stone_stairs","id":435,"data":6},{"name":"minecraft:normal_stone_stairs","id":435,"data":7},{"name":"minecraft:spruce_standing_sign","id":436,"data":0},{"name":"minecraft:spruce_standing_sign","id":436,"data":1},{"name":"minecraft:spruce_standing_sign","id":436,"data":2},{"name":"minecraft:spruce_standing_sign","id":436,"data":3},{"name":"minecraft:spruce_standing_sign","id":436,"data":4},{"name":"minecraft:spruce_standing_sign","id":436,"data":5},{"name":"minecraft:spruce_standing_sign","id":436,"data":6},{"name":"minecraft:spruce_standing_sign","id":436,"data":7},{"name":"minecraft:spruce_standing_sign","id":436,"data":8},{"name":"minecraft:spruce_standing_sign","id":436,"data":9},{"name":"minecraft:spruce_standing_sign","id":436,"data":10},{"name":"minecraft:spruce_standing_sign","id":436,"data":11},{"name":"minecraft:spruce_standing_sign","id":436,"data":12},{"name":"minecraft:spruce_standing_sign","id":436,"data":13},{"name":"minecraft:spruce_standing_sign","id":436,"data":14},{"name":"minecraft:spruce_standing_sign","id":436,"data":15},{"name":"minecraft:spruce_wall_sign","id":437,"data":0},{"name":"minecraft:spruce_wall_sign","id":437,"data":1},{"name":"minecraft:spruce_wall_sign","id":437,"data":2},{"name":"minecraft:spruce_wall_sign","id":437,"data":3},{"name":"minecraft:spruce_wall_sign","id":437,"data":4},{"name":"minecraft:spruce_wall_sign","id":437,"data":5},{"name":"minecraft:spruce_wall_sign","id":437,"data":6},{"name":"minecraft:spruce_wall_sign","id":437,"data":7},{"name":"minecraft:smooth_stone","id":438,"data":0},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":0},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":1},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":2},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":3},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":4},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":5},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":6},{"name":"minecraft:red_nether_brick_stairs","id":439,"data":7},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":0},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":1},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":2},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":3},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":4},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":5},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":6},{"name":"minecraft:smooth_quartz_stairs","id":440,"data":7},{"name":"minecraft:birch_standing_sign","id":441,"data":0},{"name":"minecraft:birch_standing_sign","id":441,"data":1},{"name":"minecraft:birch_standing_sign","id":441,"data":2},{"name":"minecraft:birch_standing_sign","id":441,"data":3},{"name":"minecraft:birch_standing_sign","id":441,"data":4},{"name":"minecraft:birch_standing_sign","id":441,"data":5},{"name":"minecraft:birch_standing_sign","id":441,"data":6},{"name":"minecraft:birch_standing_sign","id":441,"data":7},{"name":"minecraft:birch_standing_sign","id":441,"data":8},{"name":"minecraft:birch_standing_sign","id":441,"data":9},{"name":"minecraft:birch_standing_sign","id":441,"data":10},{"name":"minecraft:birch_standing_sign","id":441,"data":11},{"name":"minecraft:birch_standing_sign","id":441,"data":12},{"name":"minecraft:birch_standing_sign","id":441,"data":13},{"name":"minecraft:birch_standing_sign","id":441,"data":14},{"name":"minecraft:birch_standing_sign","id":441,"data":15},{"name":"minecraft:birch_wall_sign","id":442,"data":0},{"name":"minecraft:birch_wall_sign","id":442,"data":1},{"name":"minecraft:birch_wall_sign","id":442,"data":2},{"name":"minecraft:birch_wall_sign","id":442,"data":3},{"name":"minecraft:birch_wall_sign","id":442,"data":4},{"name":"minecraft:birch_wall_sign","id":442,"data":5},{"name":"minecraft:birch_wall_sign","id":442,"data":6},{"name":"minecraft:birch_wall_sign","id":442,"data":7},{"name":"minecraft:jungle_standing_sign","id":443,"data":0},{"name":"minecraft:jungle_standing_sign","id":443,"data":1},{"name":"minecraft:jungle_standing_sign","id":443,"data":2},{"name":"minecraft:jungle_standing_sign","id":443,"data":3},{"name":"minecraft:jungle_standing_sign","id":443,"data":4},{"name":"minecraft:jungle_standing_sign","id":443,"data":5},{"name":"minecraft:jungle_standing_sign","id":443,"data":6},{"name":"minecraft:jungle_standing_sign","id":443,"data":7},{"name":"minecraft:jungle_standing_sign","id":443,"data":8},{"name":"minecraft:jungle_standing_sign","id":443,"data":9},{"name":"minecraft:jungle_standing_sign","id":443,"data":10},{"name":"minecraft:jungle_standing_sign","id":443,"data":11},{"name":"minecraft:jungle_standing_sign","id":443,"data":12},{"name":"minecraft:jungle_standing_sign","id":443,"data":13},{"name":"minecraft:jungle_standing_sign","id":443,"data":14},{"name":"minecraft:jungle_standing_sign","id":443,"data":15},{"name":"minecraft:jungle_wall_sign","id":444,"data":0},{"name":"minecraft:jungle_wall_sign","id":444,"data":1},{"name":"minecraft:jungle_wall_sign","id":444,"data":2},{"name":"minecraft:jungle_wall_sign","id":444,"data":3},{"name":"minecraft:jungle_wall_sign","id":444,"data":4},{"name":"minecraft:jungle_wall_sign","id":444,"data":5},{"name":"minecraft:jungle_wall_sign","id":444,"data":6},{"name":"minecraft:jungle_wall_sign","id":444,"data":7},{"name":"minecraft:acacia_standing_sign","id":445,"data":0},{"name":"minecraft:acacia_standing_sign","id":445,"data":1},{"name":"minecraft:acacia_standing_sign","id":445,"data":2},{"name":"minecraft:acacia_standing_sign","id":445,"data":3},{"name":"minecraft:acacia_standing_sign","id":445,"data":4},{"name":"minecraft:acacia_standing_sign","id":445,"data":5},{"name":"minecraft:acacia_standing_sign","id":445,"data":6},{"name":"minecraft:acacia_standing_sign","id":445,"data":7},{"name":"minecraft:acacia_standing_sign","id":445,"data":8},{"name":"minecraft:acacia_standing_sign","id":445,"data":9},{"name":"minecraft:acacia_standing_sign","id":445,"data":10},{"name":"minecraft:acacia_standing_sign","id":445,"data":11},{"name":"minecraft:acacia_standing_sign","id":445,"data":12},{"name":"minecraft:acacia_standing_sign","id":445,"data":13},{"name":"minecraft:acacia_standing_sign","id":445,"data":14},{"name":"minecraft:acacia_standing_sign","id":445,"data":15},{"name":"minecraft:acacia_wall_sign","id":446,"data":0},{"name":"minecraft:acacia_wall_sign","id":446,"data":1},{"name":"minecraft:acacia_wall_sign","id":446,"data":2},{"name":"minecraft:acacia_wall_sign","id":446,"data":3},{"name":"minecraft:acacia_wall_sign","id":446,"data":4},{"name":"minecraft:acacia_wall_sign","id":446,"data":5},{"name":"minecraft:acacia_wall_sign","id":446,"data":6},{"name":"minecraft:acacia_wall_sign","id":446,"data":7},{"name":"minecraft:darkoak_standing_sign","id":447,"data":0},{"name":"minecraft:darkoak_standing_sign","id":447,"data":1},{"name":"minecraft:darkoak_standing_sign","id":447,"data":2},{"name":"minecraft:darkoak_standing_sign","id":447,"data":3},{"name":"minecraft:darkoak_standing_sign","id":447,"data":4},{"name":"minecraft:darkoak_standing_sign","id":447,"data":5},{"name":"minecraft:darkoak_standing_sign","id":447,"data":6},{"name":"minecraft:darkoak_standing_sign","id":447,"data":7},{"name":"minecraft:darkoak_standing_sign","id":447,"data":8},{"name":"minecraft:darkoak_standing_sign","id":447,"data":9},{"name":"minecraft:darkoak_standing_sign","id":447,"data":10},{"name":"minecraft:darkoak_standing_sign","id":447,"data":11},{"name":"minecraft:darkoak_standing_sign","id":447,"data":12},{"name":"minecraft:darkoak_standing_sign","id":447,"data":13},{"name":"minecraft:darkoak_standing_sign","id":447,"data":14},{"name":"minecraft:darkoak_standing_sign","id":447,"data":15},{"name":"minecraft:darkoak_wall_sign","id":448,"data":0},{"name":"minecraft:darkoak_wall_sign","id":448,"data":1},{"name":"minecraft:darkoak_wall_sign","id":448,"data":2},{"name":"minecraft:darkoak_wall_sign","id":448,"data":3},{"name":"minecraft:darkoak_wall_sign","id":448,"data":4},{"name":"minecraft:darkoak_wall_sign","id":448,"data":5},{"name":"minecraft:darkoak_wall_sign","id":448,"data":6},{"name":"minecraft:darkoak_wall_sign","id":448,"data":7},{"name":"minecraft:lectern","id":449,"data":0},{"name":"minecraft:lectern","id":449,"data":1},{"name":"minecraft:lectern","id":449,"data":2},{"name":"minecraft:lectern","id":449,"data":3},{"name":"minecraft:lectern","id":449,"data":4},{"name":"minecraft:lectern","id":449,"data":5},{"name":"minecraft:lectern","id":449,"data":6},{"name":"minecraft:lectern","id":449,"data":7},{"name":"minecraft:grindstone","id":450,"data":0},{"name":"minecraft:grindstone","id":450,"data":1},{"name":"minecraft:grindstone","id":450,"data":2},{"name":"minecraft:grindstone","id":450,"data":3},{"name":"minecraft:grindstone","id":450,"data":4},{"name":"minecraft:grindstone","id":450,"data":5},{"name":"minecraft:grindstone","id":450,"data":6},{"name":"minecraft:grindstone","id":450,"data":7},{"name":"minecraft:grindstone","id":450,"data":8},{"name":"minecraft:grindstone","id":450,"data":9},{"name":"minecraft:grindstone","id":450,"data":10},{"name":"minecraft:grindstone","id":450,"data":11},{"name":"minecraft:grindstone","id":450,"data":12},{"name":"minecraft:grindstone","id":450,"data":13},{"name":"minecraft:grindstone","id":450,"data":14},{"name":"minecraft:grindstone","id":450,"data":15},{"name":"minecraft:blast_furnace","id":451,"data":0},{"name":"minecraft:blast_furnace","id":451,"data":1},{"name":"minecraft:blast_furnace","id":451,"data":2},{"name":"minecraft:blast_furnace","id":451,"data":3},{"name":"minecraft:blast_furnace","id":451,"data":4},{"name":"minecraft:blast_furnace","id":451,"data":5},{"name":"minecraft:blast_furnace","id":451,"data":6},{"name":"minecraft:blast_furnace","id":451,"data":7},{"name":"minecraft:stonecutter_block","id":452,"data":0},{"name":"minecraft:stonecutter_block","id":452,"data":1},{"name":"minecraft:stonecutter_block","id":452,"data":2},{"name":"minecraft:stonecutter_block","id":452,"data":3},{"name":"minecraft:stonecutter_block","id":452,"data":4},{"name":"minecraft:stonecutter_block","id":452,"data":5},{"name":"minecraft:stonecutter_block","id":452,"data":6},{"name":"minecraft:stonecutter_block","id":452,"data":7},{"name":"minecraft:smoker","id":453,"data":0},{"name":"minecraft:smoker","id":453,"data":1},{"name":"minecraft:smoker","id":453,"data":2},{"name":"minecraft:smoker","id":453,"data":3},{"name":"minecraft:smoker","id":453,"data":4},{"name":"minecraft:smoker","id":453,"data":5},{"name":"minecraft:smoker","id":453,"data":6},{"name":"minecraft:smoker","id":453,"data":7},{"name":"minecraft:lit_smoker","id":454,"data":0},{"name":"minecraft:lit_smoker","id":454,"data":1},{"name":"minecraft:lit_smoker","id":454,"data":2},{"name":"minecraft:lit_smoker","id":454,"data":3},{"name":"minecraft:lit_smoker","id":454,"data":4},{"name":"minecraft:lit_smoker","id":454,"data":5},{"name":"minecraft:lit_smoker","id":454,"data":6},{"name":"minecraft:lit_smoker","id":454,"data":7},{"name":"minecraft:cartography_table","id":455,"data":0},{"name":"minecraft:fletching_table","id":456,"data":0},{"name":"minecraft:smithing_table","id":457,"data":0},{"name":"minecraft:barrel","id":458,"data":0},{"name":"minecraft:barrel","id":458,"data":1},{"name":"minecraft:barrel","id":458,"data":2},{"name":"minecraft:barrel","id":458,"data":3},{"name":"minecraft:barrel","id":458,"data":4},{"name":"minecraft:barrel","id":458,"data":5},{"name":"minecraft:barrel","id":458,"data":6},{"name":"minecraft:barrel","id":458,"data":7},{"name":"minecraft:barrel","id":458,"data":8},{"name":"minecraft:barrel","id":458,"data":9},{"name":"minecraft:barrel","id":458,"data":10},{"name":"minecraft:barrel","id":458,"data":11},{"name":"minecraft:barrel","id":458,"data":12},{"name":"minecraft:barrel","id":458,"data":13},{"name":"minecraft:barrel","id":458,"data":14},{"name":"minecraft:barrel","id":458,"data":15},{"name":"minecraft:loom","id":459,"data":0},{"name":"minecraft:loom","id":459,"data":1},{"name":"minecraft:loom","id":459,"data":2},{"name":"minecraft:loom","id":459,"data":3},{"name":"minecraft:bell","id":461,"data":0},{"name":"minecraft:bell","id":461,"data":1},{"name":"minecraft:bell","id":461,"data":2},{"name":"minecraft:bell","id":461,"data":3},{"name":"minecraft:bell","id":461,"data":4},{"name":"minecraft:bell","id":461,"data":5},{"name":"minecraft:bell","id":461,"data":6},{"name":"minecraft:bell","id":461,"data":7},{"name":"minecraft:bell","id":461,"data":8},{"name":"minecraft:bell","id":461,"data":9},{"name":"minecraft:bell","id":461,"data":10},{"name":"minecraft:bell","id":461,"data":11},{"name":"minecraft:bell","id":461,"data":12},{"name":"minecraft:bell","id":461,"data":13},{"name":"minecraft:bell","id":461,"data":14},{"name":"minecraft:bell","id":461,"data":15},{"name":"minecraft:bell","id":461,"data":16},{"name":"minecraft:bell","id":461,"data":17},{"name":"minecraft:bell","id":461,"data":18},{"name":"minecraft:bell","id":461,"data":19},{"name":"minecraft:bell","id":461,"data":20},{"name":"minecraft:bell","id":461,"data":21},{"name":"minecraft:bell","id":461,"data":22},{"name":"minecraft:bell","id":461,"data":23},{"name":"minecraft:bell","id":461,"data":24},{"name":"minecraft:bell","id":461,"data":25},{"name":"minecraft:bell","id":461,"data":26},{"name":"minecraft:bell","id":461,"data":27},{"name":"minecraft:bell","id":461,"data":28},{"name":"minecraft:bell","id":461,"data":29},{"name":"minecraft:bell","id":461,"data":30},{"name":"minecraft:bell","id":461,"data":31},{"name":"minecraft:sweet_berry_bush","id":462,"data":0},{"name":"minecraft:sweet_berry_bush","id":462,"data":1},{"name":"minecraft:sweet_berry_bush","id":462,"data":2},{"name":"minecraft:sweet_berry_bush","id":462,"data":3},{"name":"minecraft:sweet_berry_bush","id":462,"data":4},{"name":"minecraft:sweet_berry_bush","id":462,"data":5},{"name":"minecraft:sweet_berry_bush","id":462,"data":6},{"name":"minecraft:sweet_berry_bush","id":462,"data":7},{"name":"minecraft:lantern","id":463,"data":0},{"name":"minecraft:lantern","id":463,"data":1},{"name":"minecraft:campfire","id":464,"data":0},{"name":"minecraft:campfire","id":464,"data":1},{"name":"minecraft:campfire","id":464,"data":2},{"name":"minecraft:campfire","id":464,"data":3},{"name":"minecraft:campfire","id":464,"data":4},{"name":"minecraft:campfire","id":464,"data":5},{"name":"minecraft:campfire","id":464,"data":6},{"name":"minecraft:campfire","id":464,"data":7},{"name":"minecraft:lava_cauldron","id":465,"data":0},{"name":"minecraft:lava_cauldron","id":465,"data":1},{"name":"minecraft:lava_cauldron","id":465,"data":2},{"name":"minecraft:lava_cauldron","id":465,"data":3},{"name":"minecraft:lava_cauldron","id":465,"data":4},{"name":"minecraft:lava_cauldron","id":465,"data":5},{"name":"minecraft:lava_cauldron","id":465,"data":6},{"name":"minecraft:lava_cauldron","id":465,"data":7},{"name":"minecraft:lava_cauldron","id":465,"data":8},{"name":"minecraft:lava_cauldron","id":465,"data":9},{"name":"minecraft:lava_cauldron","id":465,"data":10},{"name":"minecraft:lava_cauldron","id":465,"data":11},{"name":"minecraft:lava_cauldron","id":465,"data":12},{"name":"minecraft:lava_cauldron","id":465,"data":13},{"name":"minecraft:lava_cauldron","id":465,"data":14},{"name":"minecraft:lava_cauldron","id":465,"data":15},{"name":"minecraft:jigsaw","id":466,"data":0},{"name":"minecraft:jigsaw","id":466,"data":1},{"name":"minecraft:jigsaw","id":466,"data":2},{"name":"minecraft:jigsaw","id":466,"data":3},{"name":"minecraft:jigsaw","id":466,"data":4},{"name":"minecraft:jigsaw","id":466,"data":5},{"name":"minecraft:jigsaw","id":466,"data":6},{"name":"minecraft:jigsaw","id":466,"data":7},{"name":"minecraft:wood","id":467,"data":0},{"name":"minecraft:wood","id":467,"data":1},{"name":"minecraft:wood","id":467,"data":2},{"name":"minecraft:wood","id":467,"data":3},{"name":"minecraft:wood","id":467,"data":4},{"name":"minecraft:wood","id":467,"data":5},{"name":"minecraft:wood","id":467,"data":6},{"name":"minecraft:wood","id":467,"data":7},{"name":"minecraft:wood","id":467,"data":8},{"name":"minecraft:wood","id":467,"data":9},{"name":"minecraft:wood","id":467,"data":10},{"name":"minecraft:wood","id":467,"data":11},{"name":"minecraft:wood","id":467,"data":12},{"name":"minecraft:wood","id":467,"data":13},{"name":"minecraft:wood","id":467,"data":14},{"name":"minecraft:wood","id":467,"data":15},{"name":"minecraft:composter","id":468,"data":0},{"name":"minecraft:composter","id":468,"data":1},{"name":"minecraft:composter","id":468,"data":2},{"name":"minecraft:composter","id":468,"data":3},{"name":"minecraft:composter","id":468,"data":4},{"name":"minecraft:composter","id":468,"data":5},{"name":"minecraft:composter","id":468,"data":6},{"name":"minecraft:composter","id":468,"data":7},{"name":"minecraft:composter","id":468,"data":8},{"name":"minecraft:composter","id":468,"data":9},{"name":"minecraft:composter","id":468,"data":10},{"name":"minecraft:composter","id":468,"data":11},{"name":"minecraft:composter","id":468,"data":12},{"name":"minecraft:composter","id":468,"data":13},{"name":"minecraft:composter","id":468,"data":14},{"name":"minecraft:composter","id":468,"data":15},{"name":"minecraft:lit_blast_furnace","id":469,"data":0},{"name":"minecraft:lit_blast_furnace","id":469,"data":1},{"name":"minecraft:lit_blast_furnace","id":469,"data":2},{"name":"minecraft:lit_blast_furnace","id":469,"data":3},{"name":"minecraft:lit_blast_furnace","id":469,"data":4},{"name":"minecraft:lit_blast_furnace","id":469,"data":5},{"name":"minecraft:lit_blast_furnace","id":469,"data":6},{"name":"minecraft:lit_blast_furnace","id":469,"data":7}] \ No newline at end of file